Skip to main content

Out of Stock Red Indicator in POS Implementation Guide

This guide shows how to add a visual red indicator for out-of-stock products in the POS product search when "Allow Overselling" is enabled. Instead of disabling out-of-stock products, they will be displayed with light red text to alert users while still allowing selection.

POS Create page

The Problem

In Ultimate POS, when searching for products in the POS screen:

  • If Allow Overselling is disabled and stock is 0 or less: Product is shown as disabled/readonly with "(Out of stock)" text
  • If Allow Overselling is enabled: Products with no stock appear exactly like products with stock - no visual distinction

This can lead to confusion as users cannot easily identify which products are out of stock when overselling is allowed.

The Solution

This implementation adds visual feedback for out-of-stock products when overselling is enabled:

  • Products with stock <= 0 are displayed in light red text
  • An additional "(Out of stock)" indicator is shown
  • Products remain clickable and selectable (since overselling is allowed)
  • Clear visual distinction between in-stock and out-of-stock products

Implementation Tree Structure

your-laravel-project/
└── public/
└── js/
└── pos.js # 📝 MODIFY

Files Overview

FileActionDescription
pos.js📝 ModifyUpdate _renderItem function in autocomplete handler

Features

  • ✅ Light red text color for out-of-stock products when overselling is enabled
  • ✅ "(Out of stock)" indicator displayed alongside stock quantity
  • ✅ Products remain selectable (not disabled)
  • ✅ Works with variable products
  • ✅ Works with quotations and drafts
  • ✅ No impact on products with available stock
  • ✅ Respects existing overselling settings

Prerequisites

  • Ultimate POS with working POS functionality
  • "Allow Overselling" setting accessible in POS settings
  • jQuery and existing POS JavaScript files

Implementation Steps

Step 1: Update the Autocomplete Render Function in pos.js

Update the _renderItem function in public/js/pos.js to add the red indicator for out-of-stock products.

Find this section (around line 288 in the _renderItem function):

} else {
var string = '<div>' + item.name;
if (item.type == 'variable') {
string += '-' + item.variation;
}

var selling_price = item.selling_price;
if (item.variation_group_price) {
selling_price = item.variation_group_price;
}

string += ' (' + item.sub_sku + ')' + '<br> Price: ' + __currency_trans_from_en(selling_price, false, false, __currency_precision, true);
if (item.enable_stock == 1) {
var qty_available = __currency_trans_from_en(item.qty_available, false, false, __currency_precision, true);
string += ' - ' + qty_available + item.unit;
}
string += '</div>';

return $('<li>')
.append(string)
.appendTo(ul);
}

Replace with:

} else {
// Check if out of stock but overselling is allowed - show in light red
var is_out_of_stock = item.enable_stock == 1 && item.qty_available <= 0;
var text_style = (is_out_of_stock && is_overselling_allowed) ? 'color: #e57373;' : '';

var string = '<div style="' + text_style + '">' + item.name;
if (item.type == 'variable') {
string += '-' + item.variation;
}

var selling_price = item.selling_price;
if (item.variation_group_price) {
selling_price = item.variation_group_price;
}

string += ' (' + item.sub_sku + ')' + '<br> Price: ' + __currency_trans_from_en(selling_price, false, false, __currency_precision, true);
if (item.enable_stock == 1) {
var qty_available = __currency_trans_from_en(item.qty_available, false, false, __currency_precision, true);
string += ' - ' + qty_available + item.unit;
// Add out of stock indicator when overselling is allowed
if (is_out_of_stock && is_overselling_allowed) {
string += ' <span style="color: #e57373;">(Out of stock)</span>';
}
}
string += '</div>';

return $('<li>')
.append(string)
.appendTo(ul);
}

Key changes:

  • Added is_out_of_stock variable to check if product has no stock
  • Added text_style variable that applies light red color when out of stock AND overselling is allowed
  • Applied style to the main <div> element
  • Added "(Out of stock)" indicator span with matching red color

How It Works

The implementation leverages the existing is_overselling_allowed variable that is already defined in the _renderItem function:

var is_overselling_allowed = false;
if ($('input#is_overselling_allowed').length) {
is_overselling_allowed = true;
}

Behavior Matrix

Allow OversellingStockBehavior
Disabled≤ 0Product disabled with "(Out of stock)" text
Enabled≤ 0Light red text + "(Out of stock)" (NEW)
Disabled> 0Normal text, selectable
Enabled> 0Normal text, selectable

Color Choice

The color #e57373 is a light red (Material Design Red 300) that:

  • Is clearly visible but not harsh on the eyes
  • Provides sufficient contrast on white backgrounds
  • Indicates warning/attention without being alarming

Verification Steps

After implementation, verify that:

  1. Enable "Allow Overselling" in your POS settings
  2. Search for a product that has 0 or negative stock
  3. Verify red indicator appears - product name and details should be light red
  4. Verify "(Out of stock)" text appears after the stock quantity
  5. Click on the product - it should be selectable (not disabled)
  6. Search for a product with stock - should appear in normal color
  7. Disable "Allow Overselling" - out-of-stock products should appear disabled (existing behavior)

Customization Options

Changing the Color

To use a different shade of red, modify the hex color value:

// Darker red
var text_style = (is_out_of_stock && is_overselling_allowed) ? 'color: #f44336;' : '';

// Lighter red
var text_style = (is_out_of_stock && is_overselling_allowed) ? 'color: #ef9a9a;' : '';

// Orange warning
var text_style = (is_out_of_stock && is_overselling_allowed) ? 'color: #ff9800;' : '';

Adding Bold Text

To make the text bold as well:

var text_style = (is_out_of_stock && is_overselling_allowed) ? 'color: #e57373; font-weight: bold;' : '';

Custom Out of Stock Message

To use a translation key instead of hardcoded text:

if (is_out_of_stock && is_overselling_allowed) {
string += ' <span style="color: #e57373;">(' + LANG.out_of_stock + ')</span>';
}

Troubleshooting

Issue: Red color not appearing

Solutions:

  • Verify "Allow Overselling" is enabled in POS settings
  • Check that the product actually has stock <= 0
  • Clear browser cache and reload the POS page
  • Check browser console for JavaScript errors

Issue: All products appearing in red

Solutions:

  • Verify the condition checks both is_out_of_stock AND is_overselling_allowed
  • Check that item.qty_available is being returned correctly from the API

Issue: Color appears too bright/dark

Solution: Adjust the hex color value. Common alternatives:

  • #e57373 - Light red (default)
  • #ef5350 - Medium red
  • #f44336 - Standard red
  • #ffcdd2 - Very light red/pink

Browser Compatibility

This implementation uses standard CSS inline styles and is compatible with:

  • Chrome (all versions)
  • Firefox (all versions)
  • Safari (all versions)
  • Edge (all versions)
  • Internet Explorer 11+

Performance Notes

  • Minimal performance impact - only adds a simple condition check
  • No additional API calls required
  • Uses existing is_overselling_allowed variable
  • Styling applied via inline styles (no CSS file changes needed)

Conclusion

This implementation provides clear visual feedback for out-of-stock products when overselling is enabled, helping POS users quickly identify products with no available stock while still allowing them to complete sales when business rules permit overselling.

💬 Discussion & Questions

Please sign in to join the discussion.

Loading comments...

💛 Support this project

Premium Login