diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml
index ce3efbf89..4f26ae665 100644
--- a/.github/workflows/linter.yml
+++ b/.github/workflows/linter.yml
@@ -64,4 +64,14 @@ jobs:
pip install "erpnext @ git+https://github.com/frappe/erpnext.git@version-15"
cd ${GITHUB_WORKSPACE}
pip install --no-deps .
- pip-audit --desc on
+ # The pyjwt advisories below live in PyJWT 2.12.1, which frappe
+ # version-15 hard-pins (PyJWT~=2.12.1, i.e. <2.13). They are fixed in
+ # 2.13.0 but pos_next cannot upgrade a dependency frappe constrains —
+ # this is an upstream-frappe issue, not a pos_next one. Ignore the
+ # specific IDs (NOT the package) so the gate still fails on any NEW
+ # vulnerability; revisit when frappe relaxes its PyJWT pin.
+ pip-audit --desc on \
+ --ignore-vuln PYSEC-2026-175 \
+ --ignore-vuln PYSEC-2026-177 \
+ --ignore-vuln PYSEC-2026-178 \
+ --ignore-vuln PYSEC-2026-179
diff --git a/pos_next/install.py b/pos_next/install.py
index 2bb559265..0a67dc12d 100644
--- a/pos_next/install.py
+++ b/pos_next/install.py
@@ -43,6 +43,7 @@ def after_install():
def after_migrate():
"""Hook that runs after bench migrate"""
try:
+
# Reclaim POS Settings if ERPNext re-imported its Single on top of ours.
# Must run in after_migrate (not as a one-shot patch) because ERPNext's
# doctype sync runs after pos_next's and would overwrite anything we did
diff --git a/pos_next/pos_next/doctype/brainwise_branding/brainwise_branding.json b/pos_next/pos_next/doctype/brainwise_branding/brainwise_branding.json
index 3cec7749d..6dabc9673 100644
--- a/pos_next/pos_next/doctype/brainwise_branding/brainwise_branding.json
+++ b/pos_next/pos_next/doctype/brainwise_branding/brainwise_branding.json
@@ -1,6 +1,6 @@
{
"actions": [],
- "creation": "2025-11-05 00:00:00.000000",
+ "creation": "2025-11-05 00:00:00",
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
@@ -29,40 +29,39 @@
"fields": [
{
"default": "1",
+ "description": "Branding is always enabled unless you provide the Master Key to disable it",
"fieldname": "enabled",
"fieldtype": "Check",
"in_list_view": 1,
"label": "Enabled",
- "description": "Branding is always enabled unless you provide the Master Key to disable it",
"read_only": 1
},
{
- "collapsible": 0,
"fieldname": "master_key_section",
"fieldtype": "Section Break",
- "label": "🔐 Master Key Protection"
+ "label": "\ud83d\udd10 Master Key Protection"
},
{
"fieldname": "master_key_help",
"fieldtype": "HTML",
"label": "Master Key Help",
- "options": "
🔒 Protected Configuration:
• To disable branding, uncheck 'Enabled' and provide the Master Key
• To modify branding fields (text, name, URL, interval), provide the Master Key
• Master Key format: {\"key\": \"...\", \"phrase\": \"...\"}
⚠️ The Master Key is not stored in the system and must be kept secure.
📧 Contact BrainWise support if you've lost the key.
"
+ "options": "\ud83d\udd12 Protected Configuration:
\u2022 To disable branding, uncheck 'Enabled' and provide the Master Key
\u2022 To modify branding fields (text, name, URL, interval), provide the Master Key
\u2022 Master Key format: {\"key\": \"...\", \"phrase\": \"...\"}
\u26a0\ufe0f The Master Key is not stored in the system and must be kept secure.
\ud83d\udce7 Contact BrainWise support if you've lost the key.
"
},
{
+ "description": "Required to disable branding OR modify any branding configuration fields. The key will NOT be stored after validation.",
"fieldname": "master_key_provided",
"fieldtype": "Password",
- "label": "Master Key (JSON)",
- "description": "Required to disable branding OR modify any branding configuration fields. The key will NOT be stored after validation."
+ "label": "Master Key (JSON)"
},
{
"fieldname": "section_break_branding",
"fieldtype": "Section Break",
- "label": "🎨 Branding Configuration"
+ "label": "\ud83c\udfa8 Branding Configuration"
},
{
"fieldname": "branding_locked_notice",
"fieldtype": "HTML",
- "options": "🔒 These fields are protected and read-only.
To modify them, provide the Master Key above.
"
+ "options": "\ud83d\udd12 These fields are protected and read-only.
To modify them, provide the Master Key above.
"
},
{
"default": "Powered by",
@@ -70,8 +69,8 @@
"fieldtype": "Data",
"in_list_view": 1,
"label": "Brand Text",
- "reqd": 1,
- "read_only": 1
+ "read_only": 1,
+ "reqd": 1
},
{
"default": "BrainWise",
@@ -79,16 +78,16 @@
"fieldtype": "Data",
"in_list_view": 1,
"label": "Brand Name",
- "reqd": 1,
- "read_only": 1
+ "read_only": 1,
+ "reqd": 1
},
{
"default": "https://nexus.brainwise.me",
"fieldname": "brand_url",
"fieldtype": "Data",
"label": "Brand URL",
- "reqd": 1,
- "read_only": 1
+ "read_only": 1,
+ "reqd": 1
},
{
"fieldname": "column_break_config",
@@ -167,7 +166,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
- "modified": "2025-11-05 12:00:00.000000",
+ "modified": "2026-06-03 15:54:13.334363",
"modified_by": "Administrator",
"module": "POS Next",
"name": "BrainWise Branding",
@@ -186,13 +185,18 @@
"read": 1,
"role": "Sales Manager"
},
+ {
+ "read": 1,
+ "role": "Nexus POS Manager"
+ },
{
"read": 1,
"role": "Sales User"
}
],
+ "row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
-}
+}
\ No newline at end of file
diff --git a/pos_next/pos_next/doctype/pos_closing_shift/pos_closing_shift.json b/pos_next/pos_next/doctype/pos_closing_shift/pos_closing_shift.json
index 0781da2ff..5cac9b946 100644
--- a/pos_next/pos_next/doctype/pos_closing_shift/pos_closing_shift.json
+++ b/pos_next/pos_next/doctype/pos_closing_shift/pos_closing_shift.json
@@ -200,11 +200,11 @@
],
"is_submittable": 1,
"links": [],
- "modified": "2023-06-12 03:01:49.146706",
+ "modified": "2026-06-03 15:54:11.316195",
"modified_by": "Administrator",
"module": "POS Next",
"name": "POS Closing Shift",
- "naming_rule": "Expression (old style)",
+ "naming_rule": "Expression",
"owner": "Administrator",
"permissions": [
{
@@ -234,6 +234,19 @@
"submit": 1,
"write": 1
},
+ {
+ "cancel": 1,
+ "create": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Nexus POS Manager",
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
{
"cancel": 1,
"create": 1,
@@ -261,6 +274,7 @@
"write": 1
}
],
+ "row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
diff --git a/pos_next/pos_next/doctype/pos_coupon/pos_coupon.json b/pos_next/pos_next/doctype/pos_coupon/pos_coupon.json
index 089b0ee1b..bd44f7792 100644
--- a/pos_next/pos_next/doctype/pos_coupon/pos_coupon.json
+++ b/pos_next/pos_next/doctype/pos_coupon/pos_coupon.json
@@ -37,7 +37,8 @@
"used",
"one_use",
"column_break_11",
- "description"
+ "description",
+ "referral_code"
],
"fields": [
{
@@ -110,20 +111,20 @@
"label": "ERPNext Integration"
},
{
+ "description": "Linked ERPNext Coupon Code for accounting integration",
"fieldname": "erpnext_coupon_code",
"fieldtype": "Link",
"label": "ERPNext Coupon Code",
"options": "Coupon Code",
- "read_only": 1,
- "description": "Linked ERPNext Coupon Code for accounting integration"
+ "read_only": 1
},
{
+ "description": "Auto-generated Pricing Rule for discount application",
"fieldname": "pricing_rule",
"fieldtype": "Link",
"label": "Pricing Rule",
"options": "Pricing Rule",
- "read_only": 1,
- "description": "Auto-generated Pricing Rule for discount application"
+ "read_only": 1
},
{
"fieldname": "referral_code",
@@ -173,10 +174,10 @@
"precision": "2"
},
{
+ "description": "Maximum discount that can be applied",
"fieldname": "max_amount",
"fieldtype": "Currency",
"label": "Maximum Discount Amount",
- "description": "Maximum discount that can be applied",
"options": "Company:company:default_currency",
"precision": "2"
},
@@ -263,7 +264,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2021-07-30 00:17:17.711972",
+ "modified": "2026-06-03 15:54:12.732125",
"modified_by": "Administrator",
"module": "POS Next",
"name": "POS Coupon",
@@ -305,6 +306,18 @@
"share": 1,
"write": 1
},
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Nexus POS Manager",
+ "share": 1,
+ "write": 1
+ },
{
"create": 1,
"delete": 1,
@@ -319,8 +332,10 @@
}
],
"quick_entry": 1,
+ "row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"title_field": "coupon_code",
"track_changes": 1
}
\ No newline at end of file
diff --git a/pos_next/pos_next/doctype/pos_offer/pos_offer.json b/pos_next/pos_next/doctype/pos_offer/pos_offer.json
index bfc87770f..08c219e99 100644
--- a/pos_next/pos_next/doctype/pos_offer/pos_offer.json
+++ b/pos_next/pos_next/doctype/pos_offer/pos_offer.json
@@ -308,7 +308,8 @@
}
],
"index_web_pages_for_search": 1,
- "modified": "2021-07-25 17:09:55.634113",
+ "links": [],
+ "modified": "2026-06-03 15:54:12.013952",
"modified_by": "Administrator",
"module": "POS Next",
"name": "POS Offer",
@@ -347,6 +348,18 @@
"share": 1,
"write": 1
},
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Nexus POS Manager",
+ "share": 1,
+ "write": 1
+ },
{
"create": 1,
"delete": 1,
@@ -381,9 +394,11 @@
"write": 1
}
],
+ "row_format": "Dynamic",
"show_name_in_global_search": 1,
"show_preview_popup": 1,
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"track_changes": 1
}
\ No newline at end of file
diff --git a/pos_next/pos_next/doctype/pos_opening_shift/pos_opening_shift.json b/pos_next/pos_next/doctype/pos_opening_shift/pos_opening_shift.json
index f333bb46f..2636fba5f 100644
--- a/pos_next/pos_next/doctype/pos_opening_shift/pos_opening_shift.json
+++ b/pos_next/pos_next/doctype/pos_opening_shift/pos_opening_shift.json
@@ -121,17 +121,16 @@
"read_only": 1
},
{
- "allow_on_submit": 1,
- "fieldname": "pos_closing_shift",
- "fieldtype": "Data",
- "label": "POS Closing Shift",
- "read_only": 0,
- "read_only_depends_on": "eval:doc.docstatus==1"
- }
-],
+ "allow_on_submit": 1,
+ "fieldname": "pos_closing_shift",
+ "fieldtype": "Data",
+ "label": "POS Closing Shift",
+ "read_only_depends_on": "eval:doc.docstatus==1"
+ }
+ ],
"is_submittable": 1,
"links": [],
- "modified": "2022-11-22 15:04:30.555123",
+ "modified": "2026-06-03 15:54:10.799263",
"modified_by": "Administrator",
"module": "POS Next",
"name": "POS Opening Shift",
@@ -164,6 +163,19 @@
"submit": 1,
"write": 1
},
+ {
+ "cancel": 1,
+ "create": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Nexus POS Manager",
+ "share": 1,
+ "submit": 1,
+ "write": 1
+ },
{
"cancel": 1,
"create": 1,
@@ -191,7 +203,9 @@
"write": 1
}
],
+ "row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"track_changes": 1
}
\ No newline at end of file
diff --git a/pos_next/pos_next/doctype/pos_settings/pos_settings.json b/pos_next/pos_next/doctype/pos_settings/pos_settings.json
index c5711a43e..5aa983bbe 100644
--- a/pos_next/pos_next/doctype/pos_settings/pos_settings.json
+++ b/pos_next/pos_next/doctype/pos_settings/pos_settings.json
@@ -231,10 +231,10 @@
},
{
"default": "0",
+ "description": "When enabled, non-cash payments (card, bank transfer) require exact amount. Cash payments can still have change. Cannot be used with Credit Sale or Partial Payment.",
"fieldname": "use_exact_amount",
"fieldtype": "Check",
- "label": "Use Exact Amount for Non-Cash",
- "description": "When enabled, non-cash payments (card, bank transfer) require exact amount. Cash payments can still have change. Cannot be used with Credit Sale or Partial Payment."
+ "label": "Use Exact Amount for Non-Cash"
},
{
"default": "Disabled",
@@ -343,11 +343,11 @@
},
{
"default": "0",
+ "depends_on": "allow_return",
+ "description": "Number of days allowed for invoice returns. Set to 0 for unlimited returns.",
"fieldname": "return_validity_days",
"fieldtype": "Int",
- "label": "Return Validity Days",
- "description": "Number of days allowed for invoice returns. Set to 0 for unlimited returns.",
- "depends_on": "allow_return"
+ "label": "Return Validity Days"
},
{
"default": "0",
@@ -550,7 +550,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2026-01-11 16:52:08.009217",
+ "modified": "2026-06-03 15:54:09.903964",
"modified_by": "Administrator",
"module": "POS Next",
"name": "POS Settings",
@@ -580,6 +580,17 @@
"share": 1,
"write": 1
},
+ {
+ "create": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Nexus POS Manager",
+ "share": 1,
+ "write": 1
+ },
{
"read": 1,
"role": "Sales User"
@@ -596,4 +607,4 @@
"sort_order": "DESC",
"states": [],
"track_changes": 1
-}
+}
\ No newline at end of file
diff --git a/pos_next/pos_next/doctype/referral_code/referral_code.json b/pos_next/pos_next/doctype/referral_code/referral_code.json
index 01f8f5270..399fc9cbb 100644
--- a/pos_next/pos_next/doctype/referral_code/referral_code.json
+++ b/pos_next/pos_next/doctype/referral_code/referral_code.json
@@ -226,7 +226,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2021-07-29 22:28:54.158213",
+ "modified": "2026-06-03 15:54:13.890422",
"modified_by": "Administrator",
"module": "POS Next",
"name": "Referral Code",
@@ -268,6 +268,18 @@
"share": 1,
"write": 1
},
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Nexus POS Manager",
+ "share": 1,
+ "write": 1
+ },
{
"create": 1,
"delete": 1,
@@ -281,8 +293,10 @@
"write": 1
}
],
+ "row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"title_field": "referral_code",
"track_changes": 1
}
\ No newline at end of file
diff --git a/pos_next/pos_next/report/cashier_performance_report/cashier_performance_report.json b/pos_next/pos_next/report/cashier_performance_report/cashier_performance_report.json
index c51a8346b..c0f5e5753 100644
--- a/pos_next/pos_next/report/cashier_performance_report/cashier_performance_report.json
+++ b/pos_next/pos_next/report/cashier_performance_report/cashier_performance_report.json
@@ -1,15 +1,16 @@
{
"add_total_row": 1,
+ "add_translate_data": 0,
"columns": [],
- "creation": "2026-01-27 10:00:00.000000",
- "disable_prepared_report": 0,
+ "creation": "2026-01-27 10:00:00",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"filters": [],
"idx": 0,
"is_standard": "Yes",
- "modified": "2026-01-27 10:00:00.000000",
+ "letter_head": null,
+ "modified": "2026-06-03 15:54:14.781255",
"modified_by": "Administrator",
"module": "POS Next",
"name": "Cashier Performance Report",
@@ -27,6 +28,10 @@
},
{
"role": "System Manager"
+ },
+ {
+ "role": "Nexus POS Manager"
}
- ]
-}
+ ],
+ "timeout": 0
+}
\ No newline at end of file
diff --git a/pos_next/pos_next/report/inventory_impact_and_fast_movers_report/inventory_impact_and_fast_movers_report.json b/pos_next/pos_next/report/inventory_impact_and_fast_movers_report/inventory_impact_and_fast_movers_report.json
index b9ce12e01..1c30d3732 100644
--- a/pos_next/pos_next/report/inventory_impact_and_fast_movers_report/inventory_impact_and_fast_movers_report.json
+++ b/pos_next/pos_next/report/inventory_impact_and_fast_movers_report/inventory_impact_and_fast_movers_report.json
@@ -10,7 +10,7 @@
"idx": 0,
"is_standard": "Yes",
"letter_head": null,
- "modified": "2026-01-27 22:04:37.395507",
+ "modified": "2026-06-03 15:54:14.923464",
"modified_by": "Administrator",
"module": "POS Next",
"name": "Inventory Impact and Fast Movers Report",
@@ -31,6 +31,9 @@
},
{
"role": "System Manager"
+ },
+ {
+ "role": "Nexus POS Manager"
}
],
"timeout": 0
diff --git a/pos_next/pos_next/report/offline_sync_and_system_health_report/offline_sync_and_system_health_report.json b/pos_next/pos_next/report/offline_sync_and_system_health_report/offline_sync_and_system_health_report.json
index b940e0773..fcfc850f6 100644
--- a/pos_next/pos_next/report/offline_sync_and_system_health_report/offline_sync_and_system_health_report.json
+++ b/pos_next/pos_next/report/offline_sync_and_system_health_report/offline_sync_and_system_health_report.json
@@ -1,15 +1,16 @@
{
"add_total_row": 0,
+ "add_translate_data": 0,
"columns": [],
- "creation": "2026-01-27 10:00:00.000000",
- "disable_prepared_report": 0,
+ "creation": "2026-01-27 10:00:00",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"filters": [],
"idx": 0,
"is_standard": "Yes",
- "modified": "2026-01-27 10:00:00.000000",
+ "letter_head": null,
+ "modified": "2026-06-03 15:54:14.987728",
"modified_by": "Administrator",
"module": "POS Next",
"name": "Offline Sync and System Health Report",
@@ -24,6 +25,10 @@
},
{
"role": "Sales Manager"
+ },
+ {
+ "role": "Nexus POS Manager"
}
- ]
-}
+ ],
+ "timeout": 0
+}
\ No newline at end of file
diff --git a/pos_next/pos_next/report/payments_and_cash_control_report/payments_and_cash_control_report.json b/pos_next/pos_next/report/payments_and_cash_control_report/payments_and_cash_control_report.json
index bd91535ee..a8aa80166 100644
--- a/pos_next/pos_next/report/payments_and_cash_control_report/payments_and_cash_control_report.json
+++ b/pos_next/pos_next/report/payments_and_cash_control_report/payments_and_cash_control_report.json
@@ -1,15 +1,16 @@
{
"add_total_row": 1,
+ "add_translate_data": 0,
"columns": [],
- "creation": "2026-01-27 10:00:00.000000",
- "disable_prepared_report": 0,
+ "creation": "2026-01-27 10:00:00",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"filters": [],
"idx": 0,
"is_standard": "Yes",
- "modified": "2026-01-27 10:00:00.000000",
+ "letter_head": null,
+ "modified": "2026-06-03 15:54:14.844782",
"modified_by": "Administrator",
"module": "POS Next",
"name": "Payments and Cash Control Report",
@@ -27,6 +28,10 @@
},
{
"role": "System Manager"
+ },
+ {
+ "role": "Nexus POS Manager"
}
- ]
-}
+ ],
+ "timeout": 0
+}
\ No newline at end of file
diff --git a/pos_next/pos_next/report/sales_vs_shifts_report/sales_vs_shifts_report.json b/pos_next/pos_next/report/sales_vs_shifts_report/sales_vs_shifts_report.json
index 70a4fe446..e748ca099 100644
--- a/pos_next/pos_next/report/sales_vs_shifts_report/sales_vs_shifts_report.json
+++ b/pos_next/pos_next/report/sales_vs_shifts_report/sales_vs_shifts_report.json
@@ -1,15 +1,16 @@
{
"add_total_row": 1,
+ "add_translate_data": 0,
"columns": [],
- "creation": "2026-01-27 10:00:00.000000",
- "disable_prepared_report": 0,
+ "creation": "2026-01-27 10:00:00",
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"filters": [],
"idx": 0,
"is_standard": "Yes",
- "modified": "2026-01-27 10:00:00.000000",
+ "letter_head": null,
+ "modified": "2026-06-03 15:54:14.655588",
"modified_by": "Administrator",
"module": "POS Next",
"name": "Sales vs Shifts Report",
@@ -30,6 +31,10 @@
},
{
"role": "System Manager"
+ },
+ {
+ "role": "Nexus POS Manager"
}
- ]
-}
+ ],
+ "timeout": 0
+}
\ No newline at end of file
diff --git a/pos_next/pos_next/setup/__init__.py b/pos_next/pos_next/setup/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/pos_next/pos_next/workspace/posnext/posnext.json b/pos_next/pos_next/workspace/posnext/posnext.json
index f4000e2e6..e29e564fb 100644
--- a/pos_next/pos_next/workspace/posnext/posnext.json
+++ b/pos_next/pos_next/workspace/posnext/posnext.json
@@ -178,7 +178,7 @@
"type": "Link"
}
],
- "modified": "2026-01-27 21:23:15.819052",
+ "modified": "2026-06-03 15:43:52.445464",
"modified_by": "Administrator",
"module": "POS Next",
"name": "POSNext",