-
-
{{ __('Loading invoices...') }}
+
+
+
+
+ {{ __('Failed to load invoices. Please try again.') }}
+
+
+
+
+
-
-
-
-
+
+
+
+
+ {{ __("Shift History") }}
+
@@ -583,6 +603,13 @@
@return-created="handleReturnCreated"
/>
+
+
+
= %(from_date)s")
+ params["from_date"] = from_date
+
+ if to_date:
+ conditions.append("posting_date <= %(to_date)s")
+ params["to_date"] = to_date
+
+ where_clause = " AND ".join(conditions)
+
+ invoices = frappe.db.sql(f"""
SELECT
name,
customer,
@@ -1517,37 +1546,12 @@ def get_invoices(pos_profile, limit=100):
FROM
`tabSales Invoice`
WHERE
- pos_profile = %(pos_profile)s
- AND docstatus = 1
- AND is_pos = 1
+ {where_clause}
ORDER BY
posting_date DESC,
posting_time DESC
- LIMIT %(limit)s
- """, {
- "pos_profile": pos_profile,
- "limit": limit
- }, as_dict=True)
-
- # Load items for each invoice for filtering purposes
- for invoice in invoices:
- items = frappe.db.sql("""
- SELECT
- item_code,
- item_name,
- qty,
- rate,
- amount
- FROM
- `tabSales Invoice Item`
- WHERE
- parent = %(invoice_name)s
- ORDER BY
- idx
- """, {
- "invoice_name": invoice.name
- }, as_dict=True)
- invoice.items = items
+ LIMIT %(limit)s OFFSET %(offset)s
+ """, params, as_dict=True)
return invoices
diff --git a/pos_next/api/shifts.py b/pos_next/api/shifts.py
index 50f72321..a452d700 100644
--- a/pos_next/api/shifts.py
+++ b/pos_next/api/shifts.py
@@ -6,7 +6,7 @@
import json
import frappe
from frappe import _
-from frappe.utils import nowdate, nowtime, get_datetime
+from frappe.utils import nowdate, nowtime, get_datetime, flt, cint
from pos_next.api.utilities import get_wallet_payment_modes
@@ -182,3 +182,134 @@ def submit_closing_shift(closing_shift):
except Exception as e:
frappe.log_error(frappe.get_traceback(), "Submit Closing Shift Error")
frappe.throw(_("Error submitting closing shift: {0}").format(str(e)))
+
+
+@frappe.whitelist()
+def get_shift_history(filters=None, limit=25, offset=0):
+ """Return paginated shift history for the current session user only.
+
+ Args:
+ filters: JSON string or dict with optional from_date / to_date.
+ limit: Page size (default 25, max 100).
+ offset: Number of records to skip (0-based, for page navigation).
+
+ Returns:
+ {
+ "rows": [...], # Current page rows
+ "totals": { # Aggregates across ALL matching rows (no page cap)
+ "total_shifts": int,
+ "total_sales": float,
+ "total_cash_diff": float,
+ }
+ }
+
+ Security: The session user restriction is always enforced server-side.
+ Clients cannot override it by passing filters.
+ """
+ if not frappe.has_permission("POS Opening Shift", "read"):
+ frappe.throw(_("Insufficient permissions to view shift history"))
+
+ if isinstance(filters, str):
+ filters = json.loads(filters)
+
+ # Clamp page size: minimum 1, maximum 100
+ page_size = max(1, min(cint(limit) or 25, 100))
+ page_offset = max(0, cint(offset) or 0)
+
+ # Mandatory WHERE conditions — user is always enforced server-side
+ conditions = [
+ "os.docstatus = 1",
+ "os.user = %(session_user)s",
+ ]
+ values = {
+ "session_user": frappe.session.user,
+ "limit": page_size,
+ "offset": page_offset,
+ }
+
+ if filters:
+ if filters.get("from_date"):
+ conditions.append("os.posting_date >= %(from_date)s")
+ values["from_date"] = filters["from_date"]
+
+ if filters.get("to_date"):
+ conditions.append("os.posting_date <= %(to_date)s")
+ values["to_date"] = filters["to_date"]
+
+ where_clause = "WHERE " + " AND ".join(conditions)
+
+ # ── Rows query (paginated) ────────────────────────────────────────────────
+ # Pre-aggregated LEFT JOINs replace 3 correlated subqueries per row.
+ rows_query = f"""
+ SELECT
+ os.name AS opening_shift_name,
+ cs.name AS closing_shift_name,
+ os.posting_date AS date,
+ os.pos_profile,
+ os.user AS cashier,
+ os.period_start_date AS open_time,
+ cs.period_end_date AS close_time,
+ COALESCE(osd.opening_amount, 0) AS opening_amount,
+ COALESCE(csd.closing_amount, 0) AS closing_amount,
+ COALESCE(cs.grand_total, 0) AS sales_total,
+ COALESCE(csd.difference, 0) AS difference
+ FROM `tabPOS Opening Shift` os
+ LEFT JOIN `tabPOS Closing Shift` cs
+ ON cs.pos_opening_shift = os.name
+ LEFT JOIN (
+ SELECT parent, SUM(amount) AS opening_amount
+ FROM `tabPOS Opening Shift Detail`
+ GROUP BY parent
+ ) osd ON osd.parent = os.name
+ LEFT JOIN (
+ SELECT
+ parent,
+ SUM(closing_amount) AS closing_amount,
+ SUM(difference) AS difference
+ FROM `tabPOS Closing Shift Detail`
+ GROUP BY parent
+ ) csd ON csd.parent = cs.name
+ {where_clause}
+ ORDER BY os.posting_date DESC, os.period_start_date DESC
+ LIMIT %(limit)s OFFSET %(offset)s
+ """
+
+ data = frappe.db.sql(rows_query, values, as_dict=True)
+
+ for row in data:
+ row.opening_amount = flt(row.opening_amount)
+ row.closing_amount = flt(row.closing_amount)
+ row.sales_total = flt(row.sales_total)
+ row.difference = flt(row.difference)
+
+ # ── Totals query (no LIMIT) ───────────────────────────────────────────────
+ # Runs across the full filter set so summary cards are always accurate
+ # regardless of which page the user is viewing.
+ totals_query = f"""
+ SELECT
+ COUNT(*) AS total_shifts,
+ COALESCE(SUM(cs.grand_total), 0) AS total_sales,
+ COALESCE(SUM(csd_t.difference), 0) AS total_cash_diff
+ FROM `tabPOS Opening Shift` os
+ LEFT JOIN `tabPOS Closing Shift` cs
+ ON cs.pos_opening_shift = os.name
+ LEFT JOIN (
+ SELECT parent, SUM(difference) AS difference
+ FROM `tabPOS Closing Shift Detail`
+ GROUP BY parent
+ ) csd_t ON csd_t.parent = cs.name
+ {where_clause}
+ """
+ # Exclude pagination keys from totals query values
+ totals_values = {k: v for k, v in values.items() if k not in ("limit", "offset")}
+ totals_row = frappe.db.sql(totals_query, totals_values, as_dict=True)
+ totals = totals_row[0] if totals_row else {}
+
+ return {
+ "rows": data,
+ "totals": {
+ "total_shifts": int(totals.get("total_shifts", len(data))),
+ "total_sales": flt(totals.get("total_sales", 0)),
+ "total_cash_diff": flt(totals.get("total_cash_diff", 0)),
+ },
+ }
diff --git a/pos_next/pos_next/workspace/posnext/posnext.json b/pos_next/pos_next/workspace/posnext/posnext.json
index f4000e2e..3b3aa110 100644
--- a/pos_next/pos_next/workspace/posnext/posnext.json
+++ b/pos_next/pos_next/workspace/posnext/posnext.json
@@ -1,257 +1,257 @@
{
- "charts": [],
- "content": "[{\"id\":\"cDBfxZcI12\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"EuDVjJUKSQ\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Start POS\",\"col\":3}},{\"id\":\"uXQ4aBaRfk\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"id\":\"jEFYB2fX3t\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Settings\",\"col\":3}},{\"id\":\"RoWvjX8Ocp\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Profile\",\"col\":3}},{\"id\":\"p4KrSYzInK\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Opening Shift\",\"col\":3}},{\"id\":\"VO-VLNdx_2\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Closing Shift\",\"col\":3}},{\"id\":\"OYrA05uyCG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Offer\",\"col\":3}},{\"id\":\"FUd4_fFBgH\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Coupon\",\"col\":3}},{\"id\":\"spacer1\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"header2\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Configuration\",\"col\":12}},{\"id\":\"reports_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"pos_card\",\"type\":\"card\",\"data\":{\"card_name\":\"POS\",\"col\":4}},{\"id\":\"config_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Configuration\",\"col\":4}},{\"id\":\"shift_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Shift Management\",\"col\":4}},{\"id\":\"offers_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Offers & Coupons\",\"col\":4}},{\"id\":\"items_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Items\",\"col\":4}}]",
- "creation": "2026-01-27 21:23:15.819052",
- "custom_blocks": [],
- "docstatus": 0,
- "doctype": "Workspace",
- "hide_custom": 0,
- "icon": "message",
- "idx": 0,
- "indicator_color": "green",
- "is_hidden": 0,
- "label": "POSNext",
- "links": [
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Reports",
- "link_count": 5,
- "link_type": "DocType",
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 1,
- "label": "Sales vs Shifts Report",
- "link_count": 0,
- "link_to": "Sales vs Shifts Report",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 1,
- "label": "Cashier Performance Report",
- "link_count": 0,
- "link_to": "Cashier Performance Report",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 1,
- "label": "Payments and Cash Control Report",
- "link_count": 0,
- "link_to": "Payments and Cash Control Report",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 1,
- "label": "Inventory Impact and Fast Movers Report",
- "link_count": 0,
- "link_to": "Inventory Impact and Fast Movers Report",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 1,
- "label": "Offline Sync and System Health Report",
- "link_count": 0,
- "link_to": "Offline Sync and System Health Report",
- "link_type": "Report",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Configuration",
- "link_count": 2,
- "link_type": "DocType",
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "POS Settings",
- "link_count": 0,
- "link_to": "POS Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "POS Profile",
- "link_count": 0,
- "link_to": "POS Profile",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Shift Management",
- "link_count": 2,
- "link_type": "DocType",
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "POS Opening Shift",
- "link_count": 0,
- "link_to": "POS Opening Shift",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "POS Closing Shift",
- "link_count": 0,
- "link_to": "POS Closing Shift",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Offers & Coupons",
- "link_count": 2,
- "link_type": "DocType",
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "POS Offer",
- "link_count": 0,
- "link_to": "POS Offer",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "POS Coupon",
- "link_count": 0,
- "link_to": "POS Coupon",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Items",
- "link_count": 1,
- "link_type": "DocType",
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Item",
- "link_count": 0,
- "link_to": "Item",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- }
- ],
- "modified": "2026-01-27 21:23:15.819052",
- "modified_by": "Administrator",
- "module": "POS Next",
- "name": "POSNext",
- "number_cards": [],
- "owner": "Administrator",
- "public": 1,
- "quick_lists": [],
- "roles": [],
- "sequence_id": 0.0,
- "shortcuts": [
- {
- "color": "Grey",
- "doc_view": "",
- "label": "Start POS",
- "type": "URL",
- "url": "/pos/"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Item",
- "link_to": "Item",
- "stats_filter": "[]",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Pos Settings",
- "link_to": "POS Settings",
- "stats_filter": "[]",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Pos Profile",
- "link_to": "POS Profile",
- "stats_filter": "[]",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Pos Opening Shift",
- "link_to": "POS Opening Shift",
- "stats_filter": "[]",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Pos Closing Shift",
- "link_to": "POS Closing Shift",
- "stats_filter": "[]",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Pos Offer",
- "link_to": "POS Offer",
- "stats_filter": "[]",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Pos Coupon",
- "link_to": "POS Coupon",
- "stats_filter": "[]",
- "type": "DocType"
- }
- ],
- "title": "POSNext"
+ "charts": [],
+ "content": "[{\"id\":\"cDBfxZcI12\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"EuDVjJUKSQ\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Start POS\",\"col\":3}},{\"id\":\"uXQ4aBaRfk\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"id\":\"jEFYB2fX3t\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Settings\",\"col\":3}},{\"id\":\"RoWvjX8Ocp\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Profile\",\"col\":3}},{\"id\":\"p4KrSYzInK\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Opening Shift\",\"col\":3}},{\"id\":\"VO-VLNdx_2\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Closing Shift\",\"col\":3}},{\"id\":\"OYrA05uyCG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Offer\",\"col\":3}},{\"id\":\"FUd4_fFBgH\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Pos Coupon\",\"col\":3}},{\"id\":\"spacer1\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"header2\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Configuration\",\"col\":12}},{\"id\":\"reports_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"pos_card\",\"type\":\"card\",\"data\":{\"card_name\":\"POS\",\"col\":4}},{\"id\":\"config_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Configuration\",\"col\":4}},{\"id\":\"shift_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Shift Management\",\"col\":4}},{\"id\":\"offers_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Offers & Coupons\",\"col\":4}},{\"id\":\"items_card\",\"type\":\"card\",\"data\":{\"card_name\":\"Items\",\"col\":4}}]",
+ "creation": "2026-01-27 21:23:15.819052",
+ "custom_blocks": [],
+ "docstatus": 0,
+ "doctype": "Workspace",
+ "hide_custom": 0,
+ "icon": "message",
+ "idx": 0,
+ "indicator_color": "green",
+ "is_hidden": 0,
+ "label": "POSNext",
+ "links": [
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Reports",
+ "link_count": 5,
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 1,
+ "label": "Sales vs Shifts Report",
+ "link_count": 0,
+ "link_to": "Sales vs Shifts Report",
+ "link_type": "Report",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 1,
+ "label": "Cashier Performance Report",
+ "link_count": 0,
+ "link_to": "Cashier Performance Report",
+ "link_type": "Report",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 1,
+ "label": "Payments and Cash Control Report",
+ "link_count": 0,
+ "link_to": "Payments and Cash Control Report",
+ "link_type": "Report",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 1,
+ "label": "Inventory Impact and Fast Movers Report",
+ "link_count": 0,
+ "link_to": "Inventory Impact and Fast Movers Report",
+ "link_type": "Report",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 1,
+ "label": "Offline Sync and System Health Report",
+ "link_count": 0,
+ "link_to": "Offline Sync and System Health Report",
+ "link_type": "Report",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Configuration",
+ "link_count": 2,
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "POS Settings",
+ "link_count": 0,
+ "link_to": "POS Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "POS Profile",
+ "link_count": 0,
+ "link_to": "POS Profile",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Shift Management",
+ "link_count": 2,
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "POS Opening Shift",
+ "link_count": 0,
+ "link_to": "POS Opening Shift",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "POS Closing Shift",
+ "link_count": 0,
+ "link_to": "POS Closing Shift",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Offers & Coupons",
+ "link_count": 2,
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "POS Offer",
+ "link_count": 0,
+ "link_to": "POS Offer",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "POS Coupon",
+ "link_count": 0,
+ "link_to": "POS Coupon",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Items",
+ "link_count": 1,
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Item",
+ "link_count": 0,
+ "link_to": "Item",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ }
+ ],
+ "modified": "2026-01-27 21:23:15.819052",
+ "modified_by": "Administrator",
+ "module": "POS Next",
+ "name": "POSNext",
+ "number_cards": [],
+ "owner": "Administrator",
+ "public": 1,
+ "quick_lists": [],
+ "roles": [],
+ "sequence_id": 0.0,
+ "shortcuts": [
+ {
+ "color": "Grey",
+ "doc_view": "",
+ "label": "Start POS",
+ "type": "URL",
+ "url": "/pos/"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Item",
+ "link_to": "Item",
+ "stats_filter": "[]",
+ "type": "DocType"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Pos Settings",
+ "link_to": "POS Settings",
+ "stats_filter": "[]",
+ "type": "DocType"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Pos Profile",
+ "link_to": "POS Profile",
+ "stats_filter": "[]",
+ "type": "DocType"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Pos Opening Shift",
+ "link_to": "POS Opening Shift",
+ "stats_filter": "[]",
+ "type": "DocType"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Pos Closing Shift",
+ "link_to": "POS Closing Shift",
+ "stats_filter": "[]",
+ "type": "DocType"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Pos Offer",
+ "link_to": "POS Offer",
+ "stats_filter": "[]",
+ "type": "DocType"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Pos Coupon",
+ "link_to": "POS Coupon",
+ "stats_filter": "[]",
+ "type": "DocType"
+ }
+ ],
+ "title": "POSNext"
}
\ No newline at end of file