# 360DLM vs. "Lite ERP" Baseline — Gap Analysis (eFlexo-anchored)

_Date: 2026-07-03 (IST) · Method: full 26-nav-item eFlexo capture sweep (SiteCap, `dbt_sitecap.md` rounds 1–9) + cross-reference against the OSS ERP landscape survey (`research_erp_lite_landscape_2026-07-03.md`) + code-grounded verification of 360LM's current stack (this session's checks below, not memory alone)._

> **Objective (user framing, 2026-07-03):** eFlexo bundles print-industry-specific modules alongside a general-purpose "converge everything at one point" layer. The goal here is to isolate that generic layer — the **minimum expectation from any lite-ERP solution**, independent of the print vertical — and measure the gap between it and 360DLM's current PWA suite.

> **Confidence legend:** ✅ code-verified this session (grep/read against `/var/www/360lm/`) · 🔎 verified by a dispatched research agent this session · ◐ from memory/`dbt_pending.md`, not re-verified — treat as a lead, not a fact.

---

## 0. Method note — why this isn't just "eFlexo's feature list"

A module only counts as **generic baseline** (not print-vertical-specific) if it clears two bars:
1. It has nothing to do with print production mechanics (substrate, ink, plates, machines, sq.ft costing).
2. It also appears as a standard module in the OSS ERP survey (ERPNext, Dolibarr) or the landscape doc's own §9 common-module matrix — i.e. it's table-stakes across verticals, not an eFlexo quirk.

Modules that *look* print-specific but are actually generic patterns wearing a print skin are called out explicitly (Jobcard Status, Machine Master, General Item Master, Delivery Challan).

Gap severity axis is **three-valued**, not binary — 360LM is deliberately a suite of separate PWAs, so "missing" and "exists but not unified" are different problems with different fixes:
- **Covered** — exists, reasonably centralized/unified
- **Siloed** — exists, but scattered per-PWA with no cross-cutting view/table
- **Absent** — no equivalent anywhere in the stack

---

## 1. eFlexo's full captured inventory, split by vertical-specificity

### 1.1 Print-industry-specific (not baseline — exclude from gap scoring)
| Module | Why print-specific |
|---|---|
| Flex/Digital/Offset Item Master (3 distinct pricing models) | Area-based sq.ft costing (Flex) vs. quantity-tiered SKU catalog (Digital/Offset) — print production math |
| Job Card + Quotation (shared costing model) | Print job line-item costing (media, size, sq.ft, plates) |
| Digital Machine Counter Report | Impression/usage counters — print-press asset metric, not general asset tracking |
| Out Source (subcontracted print run) | "Printing Run", "Paper Size" fields — print-specific subcontracting |

### 1.2 Generic — looks print-specific but isn't (flagged explicitly per the review above)
| Module | Why it's actually generic |
|---|---|
| **Jobcard Status** | Job No/Owner/**Job Assigned**/Current Status/bulk status update — this is a generic work-order/production-tracking pattern (landscape matrix: "Job/Work order + state machine", verified cross-vertical in Beveren FSM's Service Order state machine) |
| **Machine Master** | Asset/equipment master with serial + maintenance fields — same pattern as Rentman's serialized asset tracking (§4 of landscape doc), just applied to presses instead of AV gear |
| **General Item Master** | Sale Rate + Purchase Rate + Available Stock — plain stocked-inventory master, no print math at all |
| **Delivery Challan** | GST Rule 55 logistics doc (qty, no rate) — generic Indian-compliance logistics document, explicitly named in the landscape matrix's common-module row |

### 1.3 Generic lite-ERP baseline (the actual comparison set)
Dashboard/KPI home · Receipts · Payments · Bank Transactions · Invoice (+GST) · Purchase Invoice · Purchase Order · Expense · Attendance · Employee Master · Client/Customer Master · Tax Master · Customer-wise Rate overrides · Access Control/Permissions · Settings (company + document-numbering config) · Reports suite (24 sub-reports, incl. Invoice Margin/profitability) · Delivery Challan · General Item Master · Jobcard Status (generic work-order layer) · Machine Master (generic asset layer)

Cross-reference: **17 of these 20** also appear as standard modules in ERPNext and/or Dolibarr (party master, invoice, GL/bank rec, tax master, RBAC, reporting are core to both) — this is a solid "table stakes" set, not an eFlexo-only artifact. The 3 weaker-signal items (Customer-wise Rate overrides, Jobcard Status's specific bulk-update UI, 24-report breadth) are eFlexo-specific implementations of a generic underlying need (price lists, work-order tracking, MIS reporting) — still real gaps, just less rigidly specified.

---

## 2. Gap matrix — generic baseline vs. 360LM today

| # | Module | 360LM status | Evidence | Gap severity |
|---|---|---|---|---|
| 1 | **Party/Customer/Client Master** | **Covered** | `sales.customers`, `finance` parties, `custodian.payees` — multiple PWAs each own their party list | Low — works, but no single unified party registry (same shape as the known job-ID fragmentation) |
| 2 | **Invoice + GST** | **Covered** (Sales only) ✅ | `sales/MDD_sales.md` Stage E: `invoices`/`invoice_lines`, FY-aware `next_invoice_no` RPC, auto-mark paid on `balance_due=0` — **live**, not "Build" as an earlier landscape-doc pass assumed. Gap: Stage E.5 (PDF rendering UI) still 🔲, needs `hsn_sac`/`invoice_notes` columns | Low-Medium — engine done, UI finishing touch pending |
| 3 | **Delivery Challan** | **Covered** (Sales only) ✅ | `sales/MDD_sales.md` Stage F: `challans`/`challan_lines`, GST Rule 55 compliant, FY-aware `next_dc_no` RPC — **live** | Low |
| 4 | **Purchase Invoice / Purchase Order** | **Absent** | No `purchase_invoice`/`purchase_order` schema found anywhere in `/var/www/360lm/`. **Confirmed with real structure (2026-07-03, opened Purchase Invoice Report + Supplier Balance Report):** a real Purchase Invoice record needs Invoice No/Job Date/Party/Description/Rate/Qty/Unit/Tax/Amount/Final Bill, rolled up into Total Purchase Entries/Total Purchase per party — plus a mirrored **Supplier Balance Report** (Overall Supplier Balance + Supplier Advance list, same shape as the Customer Balance Report already noted in #13). Confirms this is a full AP-side lifecycle, not just a bill-capture field | Medium — no procurement-side AP tracking exists; expense PWA covers ad-hoc spend, not vendor PO lifecycle |
| 5 | **Receipts / Payments (AR/AP)** | **Covered** ✅ | `custodian.receipts`, `custodian.ledger_entries`, invoice↔receipt soft-link (Stage G) | Low |
| 6 | **Bank Transactions / reconciliation** | **Siloed** 🔎 | Credit Card PWA has a real statement-reconciliation workflow (`statements`, `statement_lines`, auto-match RPC) but it's vehicle-fleet-CC-specific, not a general bank-statement ledger; `custodian.wallets`/`transfers` track fund movement, not bank-statement matching. **Confirmed with real structure (2026-07-03, opened Bank Report):** eFlexo's version is a genuine multi-account ledger — pick any bank from a dropdown, see Bank Name/Account No/Opening Balance/Current Balance + a Deposit/Withdraw/Type transaction list per account. That's a materially bigger scope than 360LM's single-purpose CC-statement matcher | Medium — the *pattern* exists (reconciliation RPC), it's just scoped to one use case instead of a general multi-account ledger |
| 7 | **Expense tracking** | **Covered** ✅ | Expense PWA, live | Low |
| 8 | **Attendance** | **Covered** 🔎 | HR PWA: `hr.attendance` table, calendar UI, GPS check-in/geofence, admin daily dashboard | Low |
| 9 | **Tax Master / GST config (+ TDS, +CGST/SGST/IGST split)** | **Absent** 🔎 | GST hardcoded (`gst_pct: 18` literal in Sales JS), state logic hardcoded (`PMS_STATE_CODE = '03'`), no rate table anywhere. Multi-company v2 (needed for per-company GST) marked 🔲 BLOCKED. **New finding (2026-07-03, Settings → General):** eFlexo's "General Configuration" screen has a standalone **TDS** toggle, distinct from GST — Tax Deducted at Source is a separate Indian tax-compliance concept (deducted by the *payer* on certain payments) that 360LM has no concept of anywhere, not even a stub. **Second new finding (2026-07-03, opened GST Invoice Report):** real GST filing requires splitting collected tax into **CGST + SGST (intra-state) vs IGST (inter-state)** — the report's GST Summary section has separate CGST/SGST/IGST columns per tax rate. Sales' current hardcoded `PMS_STATE_CODE`/single `gst_pct` has no inter-state-vs-intra-state branching logic at all, so it cannot currently produce a correct CGST+SGST vs IGST split even for a single fixed rate — this is a real correctness gap, not just a config-centralization one | **High** — sharpest, cleanest gap: a real Tax Master (GST rate + intra/inter-state CGST-SGST/IGST logic) is exactly what ERPNext's India Compliance app centralizes; TDS is a second, previously-unflagged compliance dimension with zero 360LM equivalent |
| 10 | **Customer-wise rate overrides (+ customer Groups)** | **Absent** | No price-list/customer-rate-override concept found in Sales or Finance schemas. **Confirmed as two distinct concepts (2026-07-03, opened Customer Group Wise Report):** eFlexo separately supports per-customer rate overrides AND a customer **Group** tag (invoices filterable/rollup-able by group) — segmentation and pricing-override are not the same feature. **Mechanism confirmed (2026-07-03, opened Customer/Group Wise Rates screen directly):** it's a real price-list — pick Group or Customer, then every catalog item (Flex/Digital/Offset/General tabs) shows a base **Rate** column alongside an editable **Group Rate** column, i.e. override is per-item-per-group-or-customer, not a single blanket discount | Low-Medium — real feature, narrow scope |
| 11 | **Access Control / Permission matrix** | **Absent** | `dbt_pending.md`: "Role-based permission matrix screen 🔲 Pending" listed under both Hub and Admin PWAs — acknowledged gap, not yet built. Today's access control is per-PWA `empId` allowlists in code, not a data-driven matrix. **Confirmed with real structure (2026-07-03):** eFlexo's User Permission screen is a per-employee matrix of **Module × {View, Add, Edit, Delete}** checkboxes (confirmed straight from the page's HTML skeleton — a `<table>` with those 4 checkbox columns per module row, populated once an employee is selected). Also found a separate "Create Employee Login" screen (Employee Name/Role/User Name — e.g. `Parmod Narang / Owner / Parmod_Owner`) distinct from the permission matrix itself — provisioning a login and granting module permissions are two separate steps. This is a simple, well-proven CRUD-per-module RBAC shape — a reasonable reference model if 360LM builds its own | Medium-High — this is infra-load-bearing (every PWA's access model depends on it) and already flagged internally, just not prioritized |
| 12 | **Settings / document-numbering + notification config** | **Siloed** | FY-aware numbering RPCs exist per-domain (`sales.next_invoice_no`, `sales.next_dc_no`, and the new `print_estimation.config` singleton pattern) — each is well-built, but there's no single "Settings" PWA or unified config registry; `hr.hr_settings` is its own separate key-value store. **New finding (2026-07-03, Settings → Email):** eFlexo also centralizes *document-dispatch notification config* here — SMTP server/port/credentials + a granular per-action toggle grid ("send on creating new invoice", "on updating invoice", "on creating new DC", etc., 8 toggles across invoice/DC/receipt/quotation). 360LM has no equivalent — the `dbt_pending.md` "Push on UPI payment saved"/"Push on new Sales offer created" items are one-off suggestions, not a configurable per-document-action notification layer | Low-Medium — numbering pattern is sound and repeated correctly per-PWA; the missing pieces are (a) one place to see/manage all of it, and (b) a generalized notification-config layer, which is closer to net-new than centralization |
| 13 | **Unified financial reporting** (Income Statement, Party Ledger, aged receivables) | **Absent** 🔎✅ | Only per-PWA KPI views exist (`sales.invoice_kpi`, custodian ledger balances) — no GL account hierarchy, no trial balance, no aged-receivables report anywhere. Tally export itself is blocked pending 9 ledger names from the accountant. **Confirmed with real structure (2026-07-03, opened both reports):** eFlexo's **Income Statement** rolls up Total Sales/Receipts/Payments/Purchase/Expense into one cross-cutting summary, each with its own drill-down list (Invoice/Receipt/Payment/Expense/Purchase) — exactly the single-pane view 360LM lacks across its per-PWA silos. eFlexo's **Party/Customer Ledger Report** tracks per-customer Total Sales/Receipt/**TDS**/Purchase/Payment + Overall Balance, filterable by transaction type — a real aged-receivables-adjacent report, not a hypothetical one. Also opened **Customer Balance Report** (simpler: Overall Customer Balance + Customer Advance list) and **HSN Report** (HSN/Description/Qty/Taxable Value/IGST/CGST/SGST/Cess/Tax Rate per HSN code — directly blocked in 360LM today since Sales has no `hsn_sac` column yet, per `dbt_pending.md`'s "HSN/SAC per line item 🔲 Pending") | **High** — eFlexo's 24-report suite (incl. Invoice Margin/profitability at invoice level) has no 360LM equivalent; this is the most structurally "back-office accounting" gap, consistent with 360LM being built field-ops-first |
| 14 | **Dashboard / KPI home** | **Siloed** | Hub is a navigation launcher, not a KPI dashboard; each PWA has its own internal metrics (e.g. `sales.invoice_kpi`) but nothing aggregates them into one "today's orders/sales/cash/dues" view the way eFlexo's dashboard does. **Full tile-by-tile breakdown (2026-07-03, all 20 KPI tiles + 5 chart widgets from the real dashboard screenshot — see §2.4 below)**: most tiles are a presentation/aggregation gap, not a missing-data gap — but a few are genuinely blocked on other Absent gaps | Medium — mostly a synthesis/aggregation problem for most tiles, but 2 of 20 are blocked on gap #4 (Purchase) and gap #16 (job spine) being Absent first — see §2.4 |
| 15 | **General Item Master (stocked inventory)** | **Absent** | No generic stocked-goods master (Sale Rate/Purchase Rate/Stock) found; printing has substrate masters (print-specific), nothing generalized | Medium — relevant once any PWA needs to sell/track a non-print stocked good |
| 16 | **Jobcard Status (generic work-order layer)** | **Siloed** ◐ | Job/work tracking scattered across recce, dispatch, installation, activity — landscape doc's own §9 matrix already flagged this exact gap ("Job/Work order + state machine... **Adapt**: one job spine") before this analysis | Medium — already identified and tracked (`Cross-PWA — Unified Job ID Registry` in `dbt_pending.md`), not a new finding |
| 17 | **Machine Master (generic asset layer)** | **Absent** for non-vehicle assets ◐ | Vehicle PWA tracks vehicles as assets; no generalized equipment/machine master for other asset classes (matches landscape doc's "Asset/equipment booking: vehicle only → **Build**") | Low-Medium — scoped need, deferred correctly per landscape doc until Events domain launches |

---

### 2.4 Dashboard tile-by-tile breakdown

eFlexo's real Dashboard (captured directly, `dbt_sitecap.md` runs 5/11/21) has 20 numeric KPI
tiles in a 6-column grid plus 5 chart/list widgets. Mapping each against 360LM's actual current
capability (not the generic "Siloed" summary above) — because the honest answer differs a lot
tile-by-tile:

| eFlexo tile | Print-specific? | 360LM today | Note |
|---|---|---|---|
| Today's Orders | No | Siloed | No "orders" concept exists as a countable, date-filterable rollup anywhere; closest is Sales offers/quotations, not surfaced as a today-count |
| Today's Sales | No | Siloed | `sales.invoice_kpi` has issued/paid/outstanding totals but isn't date-sliced to "today" |
| Today's Payment | No | Siloed | Custodian tracks payments; no "today" rollup tile |
| Today's Expense | No | Siloed | Expense PWA has all the raw data; no "today" tile |
| Overall Supplier Balance | No | **Absent** | Blocked on gap #4 — no Purchase Invoice/PO or supplier ledger exists at all, not just missing a tile |
| Overall Customer Balance | No | Siloed | Custodian/Sales have the underlying balance data; not surfaced as one number |
| Today's Received / Cash / Online (×3) | No | Siloed | Custodian receipts likely support mode-splitting; no "today" rollup |
| Cash Balance | No | **Covered**, arguably better | `custodian.wallets` already gives a real running balance per custodian — 360LM's underlying data here is more granular than eFlexo's single number, just not on a home tile |
| Unpaid Invoices / Partially Paid (×2) | No | **Covered** at data layer | `sales.invoice_kpi` already computes exactly this (outstanding/draft counts) — genuinely just a missing tile, not missing data |
| Avg. Invoice Value | No | Siloed | Trivially derivable from `invoice_kpi` (total ÷ count); not pre-computed anywhere |
| Digital Machine Count | Yes | Excluded | Print-press impression counter — not a generic-baseline concept |
| Today's Sq.ft Printing | Yes | Excluded | Print production metric |
| Uninvoiced Jobcards | No (generic concept: unbilled completed work) | **Absent** | Blocked on gap #16 — no cross-PWA job spine exists to even ask "how many completed jobs haven't been billed" |
| This Month's Sale / Monthly Received/Due/Payment/Expense (×5) | No | Siloed | Same data sources as the daily tiles, just monthly-windowed; same verdict |
| Best 5 Customers by Orders / Top 10 Customer Balances (charts) | No | **Absent** as a feature | Would need cross-PWA customer-order-count and balance ranking; no ranking/analytics widget exists today |
| Last 7 Days Jobcard History (chart) | Borderline (generic "recent activity trend" pattern, print-specific data) | Absent | No cross-PWA activity-trend widget |
| Top Ordered Media, Flex/Digital (×2 charts) | Yes | Excluded | Print-specific catalog analytics |

**What this actually shows**: of the 20 KPI tiles, **13 are a pure aggregation/presentation gap**
(the underlying numbers already exist somewhere in 360LM, sometimes in more detail than eFlexo's
version — Cash Balance and the two Invoice tiles are cases where 360LM's data is already *better*,
just not surfaced on a home screen). Only **2 tiles are genuinely blocked** on other gaps being
Absent first (Overall Supplier Balance ← gap #4; Uninvoiced Jobcards ← gap #16) — so a future Hub
dashboard build should sequence those two after their blocking gaps, not before. The 2 ranking
charts (Best 5/Top 10) are a real net-new feature, not a data problem. 5 of 20+5 items are pure
print-specific analytics, correctly out of scope.

---

## 3. Ranked punch list (highest-value gaps first)

1. **Tax Master / GST config table** (#9) — cleanest, most isolated fix: replace the hardcoded `gst_pct`/`PMS_STATE_CODE` literals in Sales with a real rate/state table. Directly unblocks the already-known "multi-company GST logic fix" item in `dbt_pending.md`. Scope question for whoever picks this up: fold TDS in now (a second config toggle, same table) or treat it as a distinct follow-on — TDS wasn't on anyone's radar before this session's Settings capture.
2. **Unified financial reporting layer** (#13) — the single biggest structural absence; no Income Statement/Party Ledger/aged-receivables exists anywhere, and it's the one category eFlexo (and every OSS ERP surveyed) treats as core, not optional.
3. **Access Control / Permission matrix** (#11) — already an acknowledged 🔲 in `dbt_pending.md` for both Hub and Admin; this analysis raises its priority since it's table-stakes in every lite-ERP surveyed, not just a nice-to-have.
4. **Purchase Invoice / Purchase Order** (#4) — no vendor-side AP lifecycle exists at all; Expense PWA covers reimbursable spend but not a PO→GRN→bill flow.
5. **Bank reconciliation, generalized** (#6) — the hard part (statement-matching RPC) is already built for one use case (fleet credit cards); generalizing it to any bank account is mostly a scoping exercise, not new engineering.
6. **Dashboard/KPI home** (#14) is worth calling out separately from the "everything else" bucket below: per the tile-by-tile breakdown in §2.4, 13 of 20 tiles are pure aggregation over data 360LM already has (a few, like Cash Balance, in *better* shape than eFlexo's own number) — genuinely a cheap win once #9 (Tax Master, for GST-correct sales figures) is in place, not a deep build. Only sequence it after #4 (unblocks Overall Supplier Balance) and after #16's job-spine work (unblocks Uninvoiced Jobcards) if those two specific tiles matter for v1.
7. Everything else (#2, #3, #10, #12, #15, #16, #17) is either already live, already tracked elsewhere in `dbt_pending.md`, or a lower-value synthesis/aggregation job on top of data that already exists.

---

## 4. What this corrects vs. the earlier landscape survey

The 2026-07-03 landscape doc's §9 common-module matrix (written before this eFlexo-anchored, code-verified pass) listed **Invoice + GST** and **Delivery Challan** as "**Build**" — that was accurate when written (pre-dating Sales PWA's Stage E/F work) but is now **stale**: both are live in Sales with FY-aware numbering and GST-Rule-55 compliance. This gap analysis supersedes those two rows; the rest of that matrix (party master, job spine, payments/expense, dashboards/reports) still holds and is reproduced/refined above rather than contradicted.

---

## 5. Open items for the user

- Confirm priority order on the ranked punch list (§3) before scoping any build — nothing here has been started.
- Tax Master (#9) and Access Control (#11) are the two gaps this analysis suggests re-ranking upward relative to what `dbt_pending.md` currently shows (both listed there, neither prioritized).
- Everything in this document is additive to, not a replacement for, `dbt_pending.md` — cross-cutting items above should get their own rows there once the user picks what to act on.
