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",