Hello{{ currentUser.name ? ', ' + currentUser.name.split(' ')[0] : '' }}

{{ homeUrgentCount ? (homeUrgentCount + ' thing' + (homeUrgentCount === 1 ? '' : 's') + ' need your attention') : 'You are all caught up β€” pick a job below when you are ready.' }}

{{ healthSummary.healthy ? 'Health check' : 'Needs attention' }}
  • {{ msg }}
Last accept β€” quantity differences
  • {{ d }}
How stock moves
  1. Count your area when stock looks low.
  2. Issue from the stockroom (they pack and send).
  3. Accept when it arrives β€” that books it into your area.

{{ card.count }} {{ card.title }} {{ card.detail }} {{ card.action }} β†’

No daily tasks for your role. Use Menu for reports or settings.

{{ itemsLoadProgress }} {{ itemsTruncatedWarning }}

Suppliers ({{ suppliersCount }})

Items ({{ itemsCount }})

Inventory items
Name Area Unit Supplier Stock Room On Order Actions
{{ item.name }} {{ item.area_names && item.area_names.length ? item.area_names.join(', ') : displayAreaGroup(item.area_group) }} {{ item.unit_measure }} {{ item.supplier_name }} {{ item.stockroom_onhand }} {{ item.on_order_qty }}

Count

Full count of an area, or a quick count of selected items.

Waiting to start


Done

Full count in progress

{{ item.name }}

Waiting to start


Done

Quick count in progress

{{ item.name }}

Factory: {{ item.factory_onhand }} | Min: {{ item.factory_min }}

No items found matching "{{ adhocItemSearch }}"

Type to search for items...

Items to Count:

Item Qty Seen Unit Action
{{ getItemName(itemId) }}
{{ getItemUnit(itemId) }}

No items added yet. Search and add items above.

Stockroom Check

Check stockroom (mother location) inventory. Choose adhoc (select specific items) or full (all items). Creates a PO for discrepancies.

Start New Stockroom Check


Stockroom Check in Progress

{{ item.name }}

Stockroom: {{ item.stockroom_onhand }} | Min: {{ item.stockroom_min }}

No items found matching "{{ stockroomItemSearch }}"

Type to search for items...

Items to Count:

Item Should Be Actually Found Unit Action
{{ getItemName(itemId) }} {{ getStockroomOnhand(itemId) }} {{ getItemUnit(itemId) }}

No items added yet. Search and add items above.

No stockroom items available.

{{ message }}

Audit Log

Timestamp User Action Details
{{ entry.timestamp }} {{ entry.user }} {{ entry.action }} {{ entry.details }}
{{ pendingIssueSheets.length }} sheet(s) waiting to be processed. Open a sheet and enter the issuer name to complete.

Waiting

Issue Sheet #{{ sheet.id }} β€” {{ sheet.location_name || 'Area' }}

Checked by {{ sheet.staff_name }} Β· {{ sheet.created_date }} Β· Pending processing

Create Adhoc Issue Sheet

Select who this issue is going to, then search and add items.

{{ item.name }}

Stock: {{ item.stockroom_onhand }} | Unit: {{ item.unit_measure || '-' }}

No matching items

Items to Issue ({{ selectedItemsForManual.length }}):

No items selected yet. Search and add items above.
ItemQty
{{ sel.name }} {{ sel.unit }}

Issue Sheet #{{ currentIssueSheet.id }} β€” {{ currentIssueSheet.location_name }}

Created: {{ currentIssueSheet.created_date }}

Issued At: {{ currentIssueSheet.issued_at }}


Item Area now Stockroom Required Issue Qty Unit
{{ line.item_name }}
⚠️ {{ line.on_order_qty }} on order with supplier
{{ line.area_onhand != null ? line.area_onhand : 'β€”' }} {{ line.stockroom_onhand }} {{ line.required_qty }}
{{ line.unit_measure }}
{{ message }}

Awaiting Approval

{{ selectedPOsForMerge.length }} PO(s) selected
{{ po.po_number || ('PO #' + po.id) }} - {{ po.supplier_name }} - {{ po.created_date || '' }} Awaiting Approval

No pending purchase orders

Create Purchase Order

Add Items

{{ item.name }}

Stockroom: {{ item.stockroom_onhand }} | Min: {{ item.stockroom_min }}

PO Items

Item Quantity Unit Price Total Action
{{ item.name }} R{{ (item.qty * item.unit_price).toFixed(2) }}
TOTAL: R{{ poTotal.toFixed(2) }}

{{ currentPO.po_number || ('PO #' + currentPO.id) }}

Supplier:

Date: {{ currentPO.created_date }}

Status: {{ currentPO.status === 'pending' ? 'Awaiting Approval' : currentPO.status === 'approved' ? 'Approved' : currentPO.status === 'cancelled' ? 'Cancelled' : currentPO.status === 'rejected' ? 'Rejected' : currentPO.status === 'partial' ? 'Partial' : currentPO.status === 'complete' ? 'Complete' : currentPO.status }}


* All prices shown are excluding VAT

Item Quantity Unit Unit Price (Ex VAT) Total (Ex VAT) Action
{{ line.item_name }} {{ line.unit_measure }} R{{ (parseFloat(line.unit_price) * parseFloat(line.qty)).toFixed(2) }}
Subtotal (Ex VAT): R{{ ((editingPO ? poEditLines : currentPO.items || []).reduce((sum, line) => sum + (parseFloat(line.unit_price) * parseFloat(line.qty)), 0)).toFixed(2) }}
VAT (15%): R{{ (((editingPO ? poEditLines : currentPO.items || []).reduce((sum, line) => sum + (parseFloat(line.unit_price) * parseFloat(line.qty)), 0)) * 0.15).toFixed(2) }}
TOTAL (Inc VAT): R{{ (((editingPO ? poEditLines : currentPO.items || []).reduce((sum, line) => sum + (parseFloat(line.unit_price) * parseFloat(line.qty)), 0)) * 1.15).toFixed(2) }}

Receive Deliveries

Waiting

PO {{ receipt.po_number }} β€” {{ receipt.supplier_name }} β€” {{ receipt.received_date || '' }}

No awaiting deliveries

PO {{ currentReceipt.po_number }}

Supplier: {{ currentReceipt.supplier_name }}

Date: {{ currentReceipt.received_date }}

Status: {{ currentReceipt.status === 'processed' ? 'Delivered' : 'Awaiting' }}

Supplier Invoice: {{ currentReceipt.supplier_invoice_number || 'N/A' }}


Item PO Ordered Received from Supplier Unit
{{ line.item_name }} {{ line.expected_qty }} {{ line.unit_measure }}

Accept Stock

Accept stock that was issued from the stockroom into your area

Waiting

{{ delivery.location_name || 'Area' }} β€” Delivery #{{ delivery.id }}

Issue Sheet #{{ delivery.issue_sheet_id }} Β· {{ delivery.item_count }} item(s) Β· Issued by {{ delivery.issued_by }} Β· {{ delivery.created_date }} Β· Waiting {{ delivery.age_days }}+ days

Nothing waiting β€” when stockroom issues items to your area, they show up here.

{{ currentInternalDelivery.location_name || 'Area' }} β€” Delivery #{{ currentInternalDelivery.id }}

Issue Sheet: #{{ currentInternalDelivery.issue_sheet_id }}

Created: {{ currentInternalDelivery.created_date }}

Issued By: {{ currentInternalDelivery.issued_by || 'β€”' }}

Accepted By: {{ currentInternalDelivery.accepted_by }}


Check quantities:

Item Area now Issued Received Unit
{{ item.name }} {{ item.area_onhand != null ? item.area_onhand : 'β€”' }} {{ item.issued_qty }}
{{ item.unit_measure }}

Signature saved

βš™οΈ Settings & User Management

πŸ‘₯ User Roles

User Login Current Role Actions
{{ user.name }} {{ user.login }} {{ user.role_label }} {{ user.inventoryflow_role }} No role assigned
No users found. Users need a WordPress account first.
πŸ“‹ Role Reference Guide
{{ role.label }} {{ role.description }}
{{ cap.replace('inventoryflow_', '') }}

⚑ Performance status

Hosting checks for InventoryFlow. WP Rocket exclusions are applied automatically when the plugin is active.

  • PHP: {{ perfStatus.php_version }}
  • Object cache (Redis/Memcached): {{ perfStatus.object_cache ? 'Active' : 'Not detected β€” consider Redis for faster lists' }}
  • OPcache: {{ perfStatus.opcache ? 'Enabled' : 'Not detected' }}
  • WP Rocket: {{ perfStatus.wp_rocket ? ('Active v' + perfStatus.wp_rocket_version) : 'Not detected' }}
  • App page excluded from cache: {{ perfStatus.app_path }}

Email Configuration

Configure email addresses for system notifications

πŸ“§ Email Addresses

{{ settingsMessage }}

πŸ§ͺ Test Email System

Send a test email to verify the SMTP configuration is working correctly.

{{ testEmailMessage }}

πŸ“Š Reports

Generate inventory reports and download as PDF

πŸ“¦ All Stocks

Complete inventory list of all items with current stock levels

πŸ“ Stock By Location

View stock levels for a specific area

πŸ“ˆ Item History

Transaction history for a specific item

πŸ’° 6-Month Usage Tracker

Average monthly usage and spending for last 6 months

πŸ“‹ Stockroom Stock Report

Current stock levels for all stockroom items

πŸ’΅ Monthly Spend Report

Total spend for specific month

⏳ Generating report... {{ reportProgress }}

{{ confirmDialog.message }}

Menu

{{ personaMenuHint }}

Successfully! Oops!

close

Select options

close