ActuaryPOS Hybrid Solution Docs
Login
## Version 8.84.8 **Release Date:** 2026-04-26 ### Module: Products / POS / Sell / Purchases #### Improvements - **F10 Product Search modal much faster.** The product search datatable used by **F10** on POS, the **Sell** screen and the **Purchases** screen now returns rows in a single round-trip instead of running per-row sub-queries. - **F10 modal stops building columns it never displays.** The modal does not show the action dropdown, image, mass-delete checkbox or product-locations cell, but those builders were running for every row anyway. They are now skipped, along with the heavy eager-loads that fed them. - **POS / Sell / Purchase punch — fewer business-detail queries.** Punching a product no longer re-runs the joined `business + tax_rates + currencies` query each time within the same request. #### Technical Updates - `app/Http/Controllers/ProductController.php` → `index()`: - Removed the **N+1 row-class queries**. The previous `setRowClass()` closure ran two `->exists()` queries per displayed row (one for open Sales Orders, one for open Purchase Orders), i.e. up to `2 × pageLength` extra round-trips per page. These were promoted to a pair of `EXISTS(...)` scalar sub-queries (`has_open_so`, `has_open_po`) added to the main `SELECT`, so the work happens in the same query the datatable already runs. - **Eager-load `product_locations`** unconditionally before yajra serialises rows. Three of the four location-filter branches were missing `with('product_locations')`, which made the `addColumn('product_locations', ...)` closure trigger one lazy query per row. - **Conditional eager-load of `variations.group_prices`** — only when the user has the **Show Price Group** column enabled in the F10 settings. The `addColumn('price_group', ...)` closure now short-circuits to an empty string when the column is hidden, preventing lazy loads on every row. - Reads the `product_search` flag once at the top of the request. When it is on: - Skips `Product::with(['media'])` and `with('product_locations')` (the F10 modal renders neither). - `addColumn('action')`, `editColumn('image')`, `addColumn('mass_delete')`, `addColumn('product_locations')` early-return `''`, eliminating dozens of permission checks, URL builds and HTML concatenations per displayed row. - `setRowAttr('data-href')` lifts the `auth()->user()->can('product.view')` permission check out of the per-row closure (it cannot change between rows in the same request) and reuses the cached value. - `app/Utils/BusinessUtil.php` → `getDetails()` adds a per-request memoization cache keyed by `business_id`. `SellPosController::getSellLineRow()` (the per-punch entry point) calls `getDetails` on every product punch; the memoize avoids re-running the joined `business + tax_rates + currencies` query for the same business in the same request. --- **Release Date:** 2026-04-25 ### Module: Documentation Hub #### New Features - **Manufacturing module documentation expanded.** The page at `/documentation/module-manufacturing` now serves the full **Manufacturing User Guide** (previously it auto-generated a thin overview). New sections cover every tab in the module's top navigation, including the previously undocumented **Demand Orders** workflow and **Demand Ingredient Report**. - New section **Importing Recipes from a Spreadsheet** with step-by-step instructions and a download-template tip. - New section **Restoring a Deleted Recipe** for accidental deletions. - New section **Demand Orders** with full status table (Draft / Pending / Approved / In Production / Partially Completed / Completed / Cancelled), priority levels, approval flow, and inline status changes. - New section **Demand Ingredient Report** explaining the shortage column and how to use it as a procurement shopping list. #### Improvements - **Contacts guide** now clarifies that a contact saved with type **Both** is treated as a **Barterer** and appears under **Contacts → Barterer** in the sidebar (in addition to the customer and supplier lists). The contact-types table and the *Add a New Contact* steps both call this out. - **Manufacturing → Getting Started** section rewritten with the correct add-on activation flow (sidebar check → Contact Superadmin → log out / log back in) instead of the previous "ask the Superadmin to enable it in Business Settings" wording. - **Module Overview** table on the Manufacturing page now lists every top-nav feature, including Reverse Production, Manufacturing Report, Recipe Report, Demand Orders and Demand Ingredient Report. - **Permissions** table on the Manufacturing page now includes *Access / Add / Edit / Delete / Approve Demand Order*. - **Quick Reference → Navigation Paths** updated to include all new screens. #### Technical Updates - `app/Http/Controllers/DocumentationController.php` → `getModuleDocMap()` registers `Manufacturing` so the slug `module-manufacturing` now serves `cp-docs/en/MANUFACTURING_GUIDE.md` instead of the generic auto-generated overview. --- ## Version 4.25.26.8 **Release Date:** 2026-04-25 ### Module: Documentation Hub #### Bug Fixes - **Add-on activation instructions corrected.** The auto-generated overview for add-on modules (Accounting, CRM, Manufacturing, Gym, HMS, Repair, Project, FoodPanda, Field Force, Truckmate, Shopify, WooCommerce, Ecommerce, Connector, Spreadsheet, Recruitment, AI Assistance) was wrongly telling users to "tick the box in *Settings → Business Settings → Modules*". Add-ons are not in that tab — that tab only toggles **core base features** (POS, Sale, Products, Purchases, Stock, Expenses, Reports, Notifications, Restaurant tables, Quick Menu, Bookings, etc.). Add-ons are activated by the **Superadmin** as part of the subscription plan. The page now explains the correct flow: check the sidebar → if missing, contact the Superadmin → log out and back in once activated. - Fixed the **Add-on Modules → About Add-on Modules** page (`MODULES_OVERVIEW.md`): replaced the "How to Enable or Disable Modules" section and the related FAQ entries with the correct subscription-based activation flow, plus a clear note distinguishing add-ons from the core feature toggles in Business Settings → Modules. - Fixed the **FoodPanda Troubleshooting** checklist and table: removed the "enable in Business Settings → Modules" instruction and replaced it with a check for the FoodPanda menu in the sidebar plus a request-to-Superadmin step. #### Technical Updates - `app/Http/Controllers/DocumentationController.php` → `generateModuleOverview()` rewritten in English, Urdu and Arabic with the corrected activation flow and an explicit warning not to look in Business Settings → Modules for add-ons. --- **Release Date:** 2026-04-25 ### Module: Documentation Hub #### New Features - The **Documentation** page has been rebuilt as a true end-user manual. The sidebar is now organised into clear, task-based categories that match how a shop user thinks about their day: - **Getting Started**, **Customers & Suppliers**, **Products & Stock**, **Purchases**, **Sales & POS**, **Money & Expenses**, **Tax, Invoices & Barcodes**, **Reports**, **Users & Permissions**, **Notifications**, **Backup & Data Safety**, **Restaurant Features**, **Add-on Modules**, **Superadmin**, **Contact Superadmin**, **Version Log**. - All add-on modules are now grouped under a single **Add-on Modules** tab instead of producing one tab per module, removing visual noise from the sidebar. #### Improvements - Auto-generated module overview pages now show a friendly description and clear "How to turn it on" steps that point to **Settings → Business Settings → Modules** in the UI. - Superadmin overview page now describes the role in plain language and lists current Superadmin accounts as a friendly bullet list. - Search index updated to match the new layman-friendly page titles and keywords. #### Bug Fixes - Internal developer notes stored in `cp-docs/dev/` no longer leak into the public manual. The language-fallback chain now stops at English; developer reference files are never surfaced to end users. #### UI / UX Changes - Removed all references to codebase paths, environment variables, terminal commands and module folder names from user-facing pages. - Removed the green/orange "module enabled / disabled" badges from sidebar tab labels — the sidebar now reads as a clean topic list. - Renamed several pages to action-oriented titles (for example: "Welcome & First Steps", "Set Up Your Business", "Adding & Managing Products", "Selling at the Point of Sale", "Reading Your Reports", "Email & SMS Templates", "What's New"). - FoodPanda section now exposes only the three pages a user actually needs: **Integration Overview**, **Quick Reference**, **Troubleshooting**. #### Technical Updates - `app/Http/Controllers/DocumentationController.php`: - Rewrote `buildTabs()` to produce 13 topic-based end-user tabs plus Superadmin / Contact Admin / Version Log. - Replaced per-module `buildModuleTabs()` and `buildModulesItems()` with a single `buildAddonModuleItems()` that returns a flat, friendly list under one consolidated tab. - Removed `cp-docs/dev/` from `resolveDocFile()` fallback chain. - `generateModuleOverview()` rewritten to drop module directory paths, configuration file listings, route listings, and `php artisan` commands — replaced with friendly step-by-step instructions. - `generateSuperadminOverview()` rewritten to drop PHP version, env-var names, JSON snippets, and terminal commands — replaced with role description plus current admin list. - Removed module status badge (`⚠️`) from sidebar labels. - Legacy `buildBaseSoftwareItems()` retained as a thin shim for backward compatibility. --- **Release Date:** 2026-04-25 ### Module: Reports / POS Reports #### New Features - **Summary Income Report** now supports two print modes: - **Print A4** — prints a centered receipt-style summary card on a standard A4 page. - **Print Thermal (80mm)** — prints a compact monospaced layout sized for 80mm thermal printers (76mm printable, dashed dividers, inverted highlight row for *Receivable Cash*). #### Improvements - Filter row is now responsive: filter inputs collapse to two-per-row on small screens and stack on mobile (`col-md-3 col-sm-6`); action buttons wrap with `flex-wrap` and `gap` for tablet / phone widths. - The summary card itself is responsive (reduced padding and font sizes below 600px). #### Bug Fixes - **Print preview was blank.** The previous implementation used `window.print()` against the live page, which printed the AdminLTE shell and produced an empty sheet because of cascading `.no-print` rules and flex containers in the layout. The Print buttons now build a self-contained HTML document (cloned printable card + dedicated print CSS) in a new window and call `print()` there, so the receipt is always visible in the preview. #### UI / UX Changes - Replaced the single *Print* button with two clearly labeled buttons: **Print A4** (green) and **Print Thermal (80mm)** (blue). #### Technical Updates - `resources/views/report/summary_income_report.blade.php`: - Added `id="sir_printable"` wrapper around the receipt card. - Added `printSir(mode)` helper that opens a new window, writes a self-contained HTML document, applies the appropriate `@page` size (`A4` or `80mm auto`) and mode-specific CSS (Arial for A4, Courier New for thermal), then triggers `window.print()` after a 300ms delay so styles are applied before the dialog opens. - Added pop-up-blocked detection (`alert('Please allow pop-ups…')`). - Removed the old `window.print()` button and `.no-print` print stylesheet (no longer needed since the live page is no longer printed). - Added responsive grid classes (`col-sm-6`) and a mobile media query for the card. --- ## Version 4.25.26.5 **Release Date:** 2026-04-25 ### Module: Reports / POS Reports #### New Features - **Summary Income Report** added under *Reports → POS Reports*. Renders a Closing-Summary style report with three sections: **Sales Summary** (Sale, Sale Return, Gross Sale, Discount, Sales Tax, Service Charges, Net Sales), **Service Sales Analysis** (per `types_of_service` breakdown with percentage and amount), and **Cash Details** (Cash Sale, Credit Card Sale, Credit Sale, Opening Cash, Receivable Cash, Cash Received, Difference). Filters: Business Location, Cashier (User), Date Range. Includes a Print button that prints only the summary card. #### Improvements - None. #### Bug Fixes - None. #### UI / UX Changes - New sidebar menu item *Summary Income Report* placed directly under *Register Report* in the **POS Reports** dropdown (icon: `fa-file-invoice-dollar`). #### Technical Updates - `routes/web.php`: added `GET /reports/summary-income-report` mapped to `ReportController@getSummaryIncomeReport`. - `app/Http/Controllers/ReportController.php`: added `getSummaryIncomeReport()`. Sales aggregates pulled from `transactions` (final sells & sell returns); service-charge total derived from `additional_expense_value_1..4`; service breakdown joins `types_of_services` only when the module is enabled; cash payments aggregated from `transaction_payments` grouped by `method`; credit-sale total derived from `final_total - paid` for `payment_status IN (due, partial)`; opening cash and cash received pulled from `cash_register_transactions` (`transaction_type = 'initial'`) and `cash_registers.closing_amount` respectively, scoped to registers that fall in the selected period / location / cashier and the user's permitted locations. - `app/Http/Middleware/AdminSidebarMenu.php`: added `summary_income_report.view` to the POS Reports gating check and inserted the menu entry. - `resources/views/role/create.blade.php`, `resources/views/role/edit.blade.php`: added `summary_income_report.view` permission checkbox. - `resources/lang/en/report.php`: added `summary_income_report` label. - `resources/lang/en/role.php`: added `summary_income_report.view` label. - `resources/views/report/summary_income_report.blade.php`: new Blade view (server-rendered, no DataTables). --- ## Version 4.25.26 **Release Date:** 2026-04-25 ### Module: POS / Sell #### New Features - F10 Product Search Modal — the text search field now searches across **every column the user has chosen to display** in *Users → Settings → Product tab → Product Search Screen Columns*, not just SKU and Product Name. Newly searchable columns: Other Name, Brand, Category (and Sub-Category), Supplier (name + business name), Rack details (rack / row / position), Custom Field 1–4. Variation name and sub-SKU remain searchable as before. #### Improvements - Significantly faster POS bill / invoice finalization. Email, SMS and WhatsApp customer notifications now run after the HTTP response is flushed, so cashiers no longer wait for SMTP / SMS gateway / Meta WhatsApp Cloud API round-trips before the receipt appears. - FBR submission now short-circuits early when the location has no `fbr_pos_id`, when the transaction already has an FBR invoice number, or when it is a quotation. This skips a 3-second `fsockopen` connectivity probe and a heavy receipt-details build for transactions that would never have been submitted to FBR anyway. - Offline mode (`IS_OFFLINE=true`) is now much faster on POS finalize and across the app. Auto FBR submission, FBR Digital Invoicing, ZATCA instant sync, customer email / SMS auto-notifications and the Meta WhatsApp Cloud API call now exit immediately when the app is in offline mode instead of waiting for connect / read timeouts (previously up to ~3 sec each, more if the gateway hung). Manual sync actions (e.g. "Sync FBR Sales") still work as before. - Faster POS product search (typeahead on the POS screen and the F10 product search modal). The `purchase_lines` join used for serial-number / IMEI search is now only added when the **Enable serial number** business setting is on; previously it ran on every keystroke and contained an `OR pl2.imei_numbers IS NOT NULL` clause that produced a near-cartesian product, making search 5\u201320 \u00d7 slower on stores with many purchase lines. The `JSON_SEARCH(imei_numbers, ...)` filter is also gated behind the same setting. - Faster product "punch" (clicking a product to add it as a POS cart line). The tax-rate dropdown and the warranty dropdown are now cached per business for 5 minutes (with automatic invalidation when an admin edits a tax rate or warranty), so the same lookups don't hit the database on every product click. The customer default-tax lookup now selects only the column it needs instead of fetching the full Contact row. #### Bug Fixes - Hardened the POS product search against SQL injection: the `relevance_rank` `CASE` expression and the `last_sales` derived join in `ProductUtil::filterProduct()` previously interpolated the search term and customer id directly into raw SQL. They now use parameter bindings / integer casting. As a side benefit, MySQL's prepared-statement plan cache can now reuse the search query plan across requests. #### UI / UX Changes - None. #### Technical Updates - `app/Utils/NotificationUtil.php`: `autoSendNotification()` and `sendWhatsAppNotification()` now wrap the outbound email / SMS / WhatsApp HTTP calls in `app()->terminating()` callbacks so they execute after the response is sent to the browser. WhatsApp link generation (which is returned to the UI) remains synchronous. Both methods also early-return when `config('constants.is_offline')` is true. - `app/Http/Controllers/SellPosController.php`: - `submitFbr()`: added an early-return guard before `getReceiptDetails()` and the `fsockopen` probe when FBR cannot run for the current transaction, plus a hard skip when the app is offline. - `submitFbrDI()` and `submitZatca()`: hard skip when `config('constants.is_offline')` is true (they are external HTTPS calls). - `getSellLineRow()`: tax dropdown now resolved via `Cache::remember('pos_tax_dropdown_' . $business_id, 300, ...)`. Customer default-tax lookup uses `Contact::where('id', $customer_id)->value('default_tax_id')` instead of `Contact::find()->default_tax_id`. - `__getwarranties()`: warranty dropdown cached the same way (`pos_warranties_`). - `app/TaxRate.php` and `app/Warranty.php`: added `booted()` model hooks that flush the matching cache entry on `saved` / `deleted`, so admin edits appear immediately. - `app/Utils/ProductUtil.php` `filterProduct()`: - `purchase_lines` join is now only added when `common_settings.enable_serial_number` is true. - `pl2.serial_number` / `pl2.imei_numbers` are only added to the SELECT when the join was added. - The two `relevance_rank` `CASE` expressions and the `last_sales` derived join are now parameterised (`addBinding(..., 'select')` and integer cast respectively). - `app/Http/Controllers/ProductController.php` `index()` (the `/products` datatable endpoint backing the F10 modal): the `$products_datatable->filter(...)` closure now receives `$user_settings` and conditionally extends the per-word `where` group with `orWhere` clauses for `products.other_name`, `brands.name`, `c1.name`, `c2.name`, `sup.name`, `sup.supplier_business_name`, `pro_rack.rack/row/position` and `products.product_custom_field1..4` whenever the matching `ps_show_*` user setting is enabled. Joins for those tables already exist on the base query, so no extra joins were added. ## Version 4.21.26 **Release Date:** 2026-04-21 ### Module: Quotations #### New Features - None. #### Improvements - None. #### Bug Fixes - Fixed the quotations index action menu PDF download so the generated quotation PDF is streamed to the browser instead of opening a blank tab. #### UI / UX Changes - None. #### Technical Updates - Added the version history markdown file expected by the documentation version-history page. ### Module: Product Masters (Brands, Gender, Procurement Source) #### New Features - Added parent-child hierarchy support for Brands, Gender, and Procurement Source, similar to product sub-category behavior. - Added "Add as sub taxonomy" option in create and edit popups for all three modules. #### Improvements - Improved list ordering to show parent items grouped with their sub-items. - Added indented visual display in master lists to make hierarchy easier to read. #### Bug Fixes - Fixed Products Card tab search so the Search SKU or Name field now returns matches by product name and variation name in addition to SKU. #### UI / UX Changes - Updated add/edit forms for Brands, Gender, and Procurement Source with parent selection controls. #### Technical Updates - Added `parent_id` column to `brands`, `genders`, and `procurement_sources` tables. - Added parent/sub relationships and dropdown helper methods in related models. - Updated controllers to validate one-level depth and prevent invalid parent assignment. ### Module: Products #### New Features - Added a new products index tab: Products Card. - Added a dedicated variable-only storefront-style card view to list variable product variations separately from the full product list. #### Improvements - Improved variable-product workflow by applying all existing index filters while forcing product type to variable in the new tab. - Added quick summary cards in the new tab to show filtered variation count and current-page row count. - Enhanced variation display by converting recognized colors into swatches and other variation values into option pills. #### Bug Fixes - None. #### UI / UX Changes - Renamed the variable-product tab to Products Card. - Added a modern storefront-style variable product layout with larger imagery, cleaner action placement, color swatches, and size/option pills. - Added variable-tab search targeting from the product search modal shortcuts. #### Technical Updates - Added new Blade partial for the variable-only card showcase and metrics block. - Added client-side formatting logic to split variation text into color swatches and option pills in the products index view.
Need Help?

If something on your Dashboard doesn't look right, use the Contact Superadmin tab in the Documentation section to get help from your system administrator.