From 5856d96111f1358320e1933b0230cf91b6fd7dfc Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 7 Jan 2026 11:31:33 +0000 Subject: [PATCH 01/32] creating pos opening entry without a quality review is blocked --- ury/hooks.py | 6 +++++- ury/ury/hooks/ury_pos_opening_entry.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ury/hooks.py b/ury/hooks.py index e75c3fcf..c1f2f263 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -137,7 +137,11 @@ "validate":"ury.ury.hooks.ury_pos_opening_entry.set_cashier_room", "before_save": "ury.ury.hooks.ury_pos_opening_entry.before_save", "before_insert":"ury.ury.api.ury_kot_order_number.set_last_invoice_in_pos_open", - }, + "validate": [ + "ury.ury.hooks.ury_pos_opening_entry.validate_pos_opening_quality_review" + ] + }, + "POS Closing Entry": { "before_save": "ury.ury.hooks.ury_pos_closing_entry.before_save", "validate":"ury.ury.hooks.ury_pos_closing_entry.validate" diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 4c256b1d..5ffcb03a 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -61,3 +61,19 @@ def main_pos_open_check(doc,method): return flag else: pass + +def validate_pos_opening_quality_review(doc, method): + + exists = frappe.db.exists( + "Quality Review", + { + "date": today(), + "goal": "Cashier POS Opening" + } + ) + + if exists: + frappe.throw( + ( "Please complete today's Quality Review"), + title=("Quality Review Required") + ) \ No newline at end of file From 1607ae6f6e00b9021eddb45ee4f0de9e4efcde14 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 7 Jan 2026 13:34:37 +0000 Subject: [PATCH 02/32] taking value for goal from quality goal --- ury/hooks.py | 2 +- ury/ury/hooks/ury_pos_closing_entry.py | 1 - ury/ury/hooks/ury_pos_opening_entry.py | 28 ++++++++++++++++---------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/ury/hooks.py b/ury/hooks.py index c1f2f263..94f74eed 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -144,7 +144,7 @@ "POS Closing Entry": { "before_save": "ury.ury.hooks.ury_pos_closing_entry.before_save", - "validate":"ury.ury.hooks.ury_pos_closing_entry.validate" + "validate":"ury.ury.hooks.ury_pos_closing_entry.validate", }, "URY Menu Course": { "validate": "ury.ury.api.ury_menu_course_validation.validate_priority", diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index 1e588e2b..0a54ef9d 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -70,4 +70,3 @@ def validate_cashier(doc, method): frappe.throw("Sub Cashiers are not allowed to make POS Closing Entries.") else: pass - \ No newline at end of file diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 5ffcb03a..38ff3c76 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -63,17 +63,23 @@ def main_pos_open_check(doc,method): pass def validate_pos_opening_quality_review(doc, method): - - exists = frappe.db.exists( - "Quality Review", - { - "date": today(), - "goal": "Cashier POS Opening" - } + """ + Block POS Opening Entry unless + a Quality Review exists today + for Quality Goal titled 'Cashier POS Opening' + """ + + quality_goal_name = frappe.db.get_value( + "Quality Goal", + {"goal": "Cashier POS Opening"}, + "name" ) - if exists: + # Safety check (misconfiguration) + if not quality_goal_name: frappe.throw( - ( "Please complete today's Quality Review"), - title=("Quality Review Required") - ) \ No newline at end of file + "Quality Goal 'Cashier POS Opening' is not configured.", + title="Configuration Error" + ) + + \ No newline at end of file From a268f0688b671a58fdc5f9124d082673013ce1eb Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 7 Jan 2026 13:36:52 +0000 Subject: [PATCH 03/32] check for goal in quality review --- ury/ury/hooks/ury_pos_opening_entry.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 38ff3c76..82e381ae 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -75,11 +75,18 @@ def validate_pos_opening_quality_review(doc, method): "name" ) - # Safety check (misconfiguration) if not quality_goal_name: frappe.throw( "Quality Goal 'Cashier POS Opening' is not configured.", title="Configuration Error" ) - \ No newline at end of file + exists = frappe.db.exists( + "Quality Review", + { + "date": today(), + "goal": quality_goal_name + } + ) + + \ No newline at end of file From 7c1013b9c1c2607f11da38180bf21e0df21a9558 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 7 Jan 2026 13:38:12 +0000 Subject: [PATCH 04/32] completed blocking of pos opening entry if quality review is not present --- ury/ury/hooks/ury_pos_opening_entry.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 82e381ae..80015066 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -89,4 +89,8 @@ def validate_pos_opening_quality_review(doc, method): } ) - \ No newline at end of file + if not exists: + frappe.throw( + "Please complete today's Quality Review for Cashier POS Opening", + title="Quality Review Required" + ) \ No newline at end of file From 84a2d88897d210d72ce54014b3f561763c4ca3cb Mon Sep 17 00:00:00 2001 From: amnuoo Date: Thu, 8 Jan 2026 05:04:41 +0000 Subject: [PATCH 05/32] fetch quality goal for POS closing entry --- ury/hooks.py | 5 ++++- ury/ury/hooks/ury_pos_closing_entry.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/ury/hooks.py b/ury/hooks.py index 94f74eed..f2f80067 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -145,7 +145,10 @@ "POS Closing Entry": { "before_save": "ury.ury.hooks.ury_pos_closing_entry.before_save", "validate":"ury.ury.hooks.ury_pos_closing_entry.validate", - }, + "validate": [ + "ury.ury.hooks.ury_pos_closing_entry.validate_pos_closing_quality_review" + ] + }, "URY Menu Course": { "validate": "ury.ury.api.ury_menu_course_validation.validate_priority", } diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index 0a54ef9d..924072fc 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -1,4 +1,6 @@ import frappe +from frappe.utils import today + def before_save(doc, method): sub_pos_close_check(doc, method) @@ -70,3 +72,16 @@ def validate_cashier(doc, method): frappe.throw("Sub Cashiers are not allowed to make POS Closing Entries.") else: pass +def validate_pos_closing_quality_review(doc, method): + + quality_goal_name = frappe.db.get_value( + "Quality Goal", + {"goal": "Cashier POS Closing"}, + "name" + ) + + if not quality_goal_name: + frappe.throw( + "Quality Goal 'Cashier POS Closing' is not configured.", + title="Configuration Error" + ) From 87eefcf0ca6d2da4c989026dbeb91482b87fc58c Mon Sep 17 00:00:00 2001 From: amnuoo Date: Thu, 8 Jan 2026 05:06:47 +0000 Subject: [PATCH 06/32] checking Quality review for POS closing entry is present --- ury/ury/hooks/ury_pos_closing_entry.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index 924072fc..b7979dca 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -85,3 +85,17 @@ def validate_pos_closing_quality_review(doc, method): "Quality Goal 'Cashier POS Closing' is not configured.", title="Configuration Error" ) + + exists = frappe.db.exists( + "Quality Review", + { + "date": today(), + "goal": quality_goal_name + } + ) + + if not exists: + frappe.throw( + "Please complete today's Quality Review for Cashier POS Closing ", + title="Quality Review Required" + ) \ No newline at end of file From 43ce7f6118fd8f0806fe72e2b86f34f47e4166fe Mon Sep 17 00:00:00 2001 From: amnuoo Date: Thu, 8 Jan 2026 05:38:36 +0000 Subject: [PATCH 07/32] Print a warning message if the status is Failed --- ury/ury/hooks/ury_pos_opening_entry.py | 32 ++++++++++++++++++-------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 80015066..bcdda2af 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -62,12 +62,12 @@ def main_pos_open_check(doc,method): else: pass + +import frappe +from frappe.utils import today + + def validate_pos_opening_quality_review(doc, method): - """ - Block POS Opening Entry unless - a Quality Review exists today - for Quality Goal titled 'Cashier POS Opening' - """ quality_goal_name = frappe.db.get_value( "Quality Goal", @@ -81,16 +81,30 @@ def validate_pos_opening_quality_review(doc, method): title="Configuration Error" ) - exists = frappe.db.exists( + review_name = frappe.db.get_value( "Quality Review", { "date": today(), "goal": quality_goal_name - } + }, + "name" ) - if not exists: + if not review_name: frappe.throw( "Please complete today's Quality Review for Cashier POS Opening", title="Quality Review Required" - ) \ No newline at end of file + ) + + review_doc = frappe.get_doc("Quality Review", review_name) + + has_failed_objective = any( + row.status == "Failed" + for row in review_doc.reviews + ) + + if has_failed_objective: + frappe.msgprint( + "Please complete the Failed objective", + indicator="orange" + ) From e07eab4696972f2358af9eae68b7e682b84eb9f4 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Thu, 8 Jan 2026 05:57:24 +0000 Subject: [PATCH 08/32] warning message printed for the POS closing entry if the quality review status is failed --- ury/ury/hooks/ury_pos_closing_entry.py | 26 +++++++++++++++++++++----- ury/ury/hooks/ury_pos_opening_entry.py | 9 +++++---- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index b7979dca..b4348f86 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -72,8 +72,10 @@ def validate_cashier(doc, method): frappe.throw("Sub Cashiers are not allowed to make POS Closing Entries.") else: pass + def validate_pos_closing_quality_review(doc, method): - + + quality_goal_name = frappe.db.get_value( "Quality Goal", {"goal": "Cashier POS Closing"}, @@ -86,16 +88,30 @@ def validate_pos_closing_quality_review(doc, method): title="Configuration Error" ) - exists = frappe.db.exists( + review_name = frappe.db.get_value( "Quality Review", { "date": today(), "goal": quality_goal_name - } + }, + "name" ) - if not exists: + if not review_name: frappe.throw( - "Please complete today's Quality Review for Cashier POS Closing ", + "Please complete today's Quality Review for Cashier POS Closing", title="Quality Review Required" + ) + + review_doc = frappe.get_doc("Quality Review", review_name) + + has_failed_objective = any( + row.status == "Failed" + for row in review_doc.reviews + ) + + if has_failed_objective: + frappe.msgprint( + "Please complete the Failed objective", + indicator="orange" ) \ No newline at end of file diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index bcdda2af..3aea952e 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -63,12 +63,9 @@ def main_pos_open_check(doc,method): pass -import frappe -from frappe.utils import today - - def validate_pos_opening_quality_review(doc, method): + # 1️⃣ Resolve Quality Goal NAME quality_goal_name = frappe.db.get_value( "Quality Goal", {"goal": "Cashier POS Opening"}, @@ -81,6 +78,7 @@ def validate_pos_opening_quality_review(doc, method): title="Configuration Error" ) + # 2️⃣ Load full Quality Review document review_name = frappe.db.get_value( "Quality Review", { @@ -90,6 +88,7 @@ def validate_pos_opening_quality_review(doc, method): "name" ) + # 3️⃣ HARD BLOCK if review does not exist if not review_name: frappe.throw( "Please complete today's Quality Review for Cashier POS Opening", @@ -98,11 +97,13 @@ def validate_pos_opening_quality_review(doc, method): review_doc = frappe.get_doc("Quality Review", review_name) + # 4️⃣ CHECK CHILD TABLE FOR FAILED OBJECTIVES has_failed_objective = any( row.status == "Failed" for row in review_doc.reviews ) + # 5️⃣ WARNING ONLY (DO NOT BLOCK) if has_failed_objective: frappe.msgprint( "Please complete the Failed objective", From 1fcf4628f2195e719237c39de1aa6912027cdba0 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Thu, 8 Jan 2026 06:06:31 +0000 Subject: [PATCH 09/32] fixed problem of closing entry --- ury/ury/hooks/ury_pos_opening_entry.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 3aea952e..2b257236 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -65,7 +65,6 @@ def main_pos_open_check(doc,method): def validate_pos_opening_quality_review(doc, method): - # 1️⃣ Resolve Quality Goal NAME quality_goal_name = frappe.db.get_value( "Quality Goal", {"goal": "Cashier POS Opening"}, @@ -78,7 +77,6 @@ def validate_pos_opening_quality_review(doc, method): title="Configuration Error" ) - # 2️⃣ Load full Quality Review document review_name = frappe.db.get_value( "Quality Review", { @@ -88,7 +86,6 @@ def validate_pos_opening_quality_review(doc, method): "name" ) - # 3️⃣ HARD BLOCK if review does not exist if not review_name: frappe.throw( "Please complete today's Quality Review for Cashier POS Opening", @@ -97,13 +94,11 @@ def validate_pos_opening_quality_review(doc, method): review_doc = frappe.get_doc("Quality Review", review_name) - # 4️⃣ CHECK CHILD TABLE FOR FAILED OBJECTIVES has_failed_objective = any( row.status == "Failed" for row in review_doc.reviews ) - # 5️⃣ WARNING ONLY (DO NOT BLOCK) if has_failed_objective: frappe.msgprint( "Please complete the Failed objective", From 63f350971e52572faac37a2a5165d95d4a8c95a1 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Fri, 9 Jan 2026 06:05:31 +0000 Subject: [PATCH 10/32] get roles of current user --- ury/hooks.py | 2 ++ ury/public/js/quality_review.js | 9 +++++++++ ury/ury/api/quality_goal.py | 21 +++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 ury/public/js/quality_review.js create mode 100644 ury/ury/api/quality_goal.py diff --git a/ury/hooks.py b/ury/hooks.py index f2f80067..3913ffbf 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -35,6 +35,8 @@ # include js in page page_js = {"point-of-sale": ["public/js/pos_extend.js"]} + + # include js in doctype views # doctype_js = {"POS Invoive" : "public/js/pos_print.js"} # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} diff --git a/ury/public/js/quality_review.js b/ury/public/js/quality_review.js new file mode 100644 index 00000000..80455faa --- /dev/null +++ b/ury/public/js/quality_review.js @@ -0,0 +1,9 @@ +frappe.ui.form.on("Quality Review", { + setup(frm) { + frm.set_query("goal", function () { + return { + query: "ury.ury.api.quality_goal.quality_goal_for_current_user" + }; + }); + } +}); diff --git a/ury/ury/api/quality_goal.py b/ury/ury/api/quality_goal.py new file mode 100644 index 00000000..9d13dee3 --- /dev/null +++ b/ury/ury/api/quality_goal.py @@ -0,0 +1,21 @@ +import frappe + +@frappe.whitelist() +def quality_goal_for_current_user( + doctype, txt, searchfield, start, page_len, filters +): + user = frappe.session.user + + if user == "Administrator": + return frappe.db.sql(""" + SELECT name + FROM `tabQuality Goal` + WHERE name LIKE %s + ORDER BY modified DESC + LIMIT %s, %s + """, (f"%{txt}%", start, page_len)) + + roles = frappe.get_roles(user) + if not roles: + return [] + From d5c6cf9682291da29ca9fa988f5901183bae55ce Mon Sep 17 00:00:00 2001 From: amnuoo Date: Fri, 9 Jan 2026 06:06:47 +0000 Subject: [PATCH 11/32] check whether link field has elements of the logged in user --- ury/ury/api/quality_goal.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ury/ury/api/quality_goal.py b/ury/ury/api/quality_goal.py index 9d13dee3..71e9ee07 100644 --- a/ury/ury/api/quality_goal.py +++ b/ury/ury/api/quality_goal.py @@ -19,3 +19,14 @@ def quality_goal_for_current_user( if not roles: return [] + placeholders = ", ".join(["%s"] * len(roles)) + + return frappe.db.sql(f""" + SELECT name + FROM `tabQuality Goal` + WHERE + name LIKE %s + AND custom_assigned_role IN ({placeholders}) + ORDER BY modified DESC + LIMIT %s, %s + """, tuple([f"%{txt}%"] + roles + [start, page_len])) From 59a65b9f0a3c34474e55f588ba2ef6aefbb7429c Mon Sep 17 00:00:00 2001 From: amnuoo Date: Fri, 9 Jan 2026 06:07:46 +0000 Subject: [PATCH 12/32] connected with js using set.query method --- ury/public/js/quality_review.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ury/public/js/quality_review.js b/ury/public/js/quality_review.js index 80455faa..72fe4535 100644 --- a/ury/public/js/quality_review.js +++ b/ury/public/js/quality_review.js @@ -7,3 +7,5 @@ frappe.ui.form.on("Quality Review", { }); } }); + + From 417834f017d4520d3b2b27b65df31cdd81f5a144 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Fri, 9 Jan 2026 06:08:27 +0000 Subject: [PATCH 13/32] added hook --- ury/hooks.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ury/hooks.py b/ury/hooks.py index 3913ffbf..24d765ae 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -35,6 +35,9 @@ # include js in page page_js = {"point-of-sale": ["public/js/pos_extend.js"]} +doctype_js = { + "Quality Review": "public/js/quality_review.js" +} # include js in doctype views From 52c13dcde438c4317c17ab721874bd8c35a132d6 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Fri, 9 Jan 2026 09:51:41 +0000 Subject: [PATCH 14/32] final fix for the hooks problem --- ury/hooks.py | 9 ++++----- ury/public/js/quality_review.js | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/ury/hooks.py b/ury/hooks.py index 24d765ae..770b876e 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -35,17 +35,12 @@ # include js in page page_js = {"point-of-sale": ["public/js/pos_extend.js"]} -doctype_js = { - "Quality Review": "public/js/quality_review.js" -} - # include js in doctype views # doctype_js = {"POS Invoive" : "public/js/pos_print.js"} # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} # doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"} # doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"} - # Splash Image in Website Settings website_context = {"splash_image": "/assets/ury/Images/ury-logo.jpg"} @@ -386,3 +381,7 @@ {"dt": "Role", "filters": [["role_name", "like", "URY %"]]}, "Client Script", ] + +doctype_js = { + "Quality Review": "public/js/quality_review.js" +} diff --git a/ury/public/js/quality_review.js b/ury/public/js/quality_review.js index 72fe4535..78a8acc0 100644 --- a/ury/public/js/quality_review.js +++ b/ury/public/js/quality_review.js @@ -1,11 +1,11 @@ frappe.ui.form.on("Quality Review", { setup(frm) { + console.log("QUALITY REVIEW JS LOADED"); frm.set_query("goal", function () { + console.log("SET_QUERY ATTACHED"); return { query: "ury.ury.api.quality_goal.quality_goal_for_current_user" }; }); } }); - - From 65f90f8e55f6108c02f582e5f8a6b7da8629fb72 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Mon, 12 Jan 2026 09:27:10 +0000 Subject: [PATCH 15/32] enable/disable option added --- ury/hooks.py | 44 ++++++++++++++++---------- ury/ury/hooks/ury_pos_closing_entry.py | 13 ++++++-- ury/ury/hooks/ury_pos_opening_entry.py | 9 ++++-- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/ury/hooks.py b/ury/hooks.py index 770b876e..5bec353d 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -121,37 +121,47 @@ "POS Invoice": { "before_insert": "ury.ury.hooks.ury_pos_invoice.before_insert", "validate": "ury.ury.hooks.ury_pos_invoice.validate", - "after_insert":"ury.ury.api.ury_kot_order_number.set_order_number", + "after_insert": "ury.ury.api.ury_kot_order_number.set_order_number", "before_submit": "ury.ury.hooks.ury_pos_invoice.before_submit", "on_cancel": "ury.ury.hooks.ury_pos_invoice.on_trash", "on_trash": "ury.ury.hooks.ury_pos_invoice.on_trash", }, - "POS Profile": {"validate": "ury.ury.hooks.ury_pos_profile.validate"}, + + "POS Profile": { + "validate": "ury.ury.hooks.ury_pos_profile.validate" + }, + "Sales Invoice": { "before_insert": "ury.ury.hooks.ury_sales_invoice.before_insert", - "on_update":"ury.ury.hooks.ury_sales_invoice.on_update", - }, - "Customer": {"before_save": "ury.ury.hooks.ury_customer.before_insert"}, - "Item": {"validate": "ury.ury.hooks.ury_item.validate"}, + "on_update": "ury.ury.hooks.ury_sales_invoice.on_update", + }, + + "Customer": { + "before_save": "ury.ury.hooks.ury_customer.before_insert" + }, + + "Item": { + "validate": "ury.ury.hooks.ury_item.validate" + }, + + # ✅ POS OPENING ENTRY (QUALITY REVIEW MOVED TO before_submit) "POS Opening Entry": { - "validate":"ury.ury.hooks.ury_pos_opening_entry.set_cashier_room", + "validate": "ury.ury.hooks.ury_pos_opening_entry.set_cashier_room", "before_save": "ury.ury.hooks.ury_pos_opening_entry.before_save", - "before_insert":"ury.ury.api.ury_kot_order_number.set_last_invoice_in_pos_open", - "validate": [ - "ury.ury.hooks.ury_pos_opening_entry.validate_pos_opening_quality_review" - ] + "before_insert": "ury.ury.api.ury_kot_order_number.set_last_invoice_in_pos_open", + "before_submit": "ury.ury.hooks.ury_pos_opening_entry.validate_pos_opening_quality_review", }, + # ✅ POS CLOSING ENTRY (QUALITY REVIEW MOVED TO before_submit) "POS Closing Entry": { "before_save": "ury.ury.hooks.ury_pos_closing_entry.before_save", - "validate":"ury.ury.hooks.ury_pos_closing_entry.validate", - "validate": [ - "ury.ury.hooks.ury_pos_closing_entry.validate_pos_closing_quality_review" - ] + "validate": "ury.ury.hooks.ury_pos_closing_entry.validate", + "before_submit": "ury.ury.hooks.ury_pos_closing_entry.validate_pos_closing_quality_review", }, + "URY Menu Course": { - "validate": "ury.ury.api.ury_menu_course_validation.validate_priority", - } + "validate": "ury.ury.api.ury_menu_course_validation.validate_priority", + } } # Scheduled Tasks diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index b4348f86..d3b0fed5 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -73,9 +73,18 @@ def validate_cashier(doc, method): else: pass + def validate_pos_closing_quality_review(doc, method): - + if not frappe.db.get_value( + "POS Profile", + doc.pos_profile, + "custom_daily_quality_check" + ): + return + + # existing logic continues... + # ⬇️ EXISTING QUALITY REVIEW LOGIC (UNCHANGED) quality_goal_name = frappe.db.get_value( "Quality Goal", {"goal": "Cashier POS Closing"}, @@ -114,4 +123,4 @@ def validate_pos_closing_quality_review(doc, method): frappe.msgprint( "Please complete the Failed objective", indicator="orange" - ) \ No newline at end of file + ) diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 2b257236..c341122a 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -62,9 +62,13 @@ def main_pos_open_check(doc,method): else: pass - def validate_pos_opening_quality_review(doc, method): - + if not frappe.db.get_value( + "POS Profile", + doc.pos_profile, + "custom_daily_quality_check" + ): + return quality_goal_name = frappe.db.get_value( "Quality Goal", {"goal": "Cashier POS Opening"}, @@ -104,3 +108,4 @@ def validate_pos_opening_quality_review(doc, method): "Please complete the Failed objective", indicator="orange" ) + From 0ba20b66900e4d4c03c3f4b0d6777ccd8e47637b Mon Sep 17 00:00:00 2001 From: amnuoo Date: Mon, 12 Jan 2026 13:26:39 +0000 Subject: [PATCH 16/32] removed console checks --- ury/hooks.py | 2 -- ury/public/js/quality_review.js | 2 -- 2 files changed, 4 deletions(-) diff --git a/ury/hooks.py b/ury/hooks.py index 5bec353d..a5d8067d 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -144,7 +144,6 @@ "validate": "ury.ury.hooks.ury_item.validate" }, - # ✅ POS OPENING ENTRY (QUALITY REVIEW MOVED TO before_submit) "POS Opening Entry": { "validate": "ury.ury.hooks.ury_pos_opening_entry.set_cashier_room", "before_save": "ury.ury.hooks.ury_pos_opening_entry.before_save", @@ -152,7 +151,6 @@ "before_submit": "ury.ury.hooks.ury_pos_opening_entry.validate_pos_opening_quality_review", }, - # ✅ POS CLOSING ENTRY (QUALITY REVIEW MOVED TO before_submit) "POS Closing Entry": { "before_save": "ury.ury.hooks.ury_pos_closing_entry.before_save", "validate": "ury.ury.hooks.ury_pos_closing_entry.validate", diff --git a/ury/public/js/quality_review.js b/ury/public/js/quality_review.js index 78a8acc0..80455faa 100644 --- a/ury/public/js/quality_review.js +++ b/ury/public/js/quality_review.js @@ -1,8 +1,6 @@ frappe.ui.form.on("Quality Review", { setup(frm) { - console.log("QUALITY REVIEW JS LOADED"); frm.set_query("goal", function () { - console.log("SET_QUERY ATTACHED"); return { query: "ury.ury.api.quality_goal.quality_goal_for_current_user" }; From 999fabbf350ac915ab9ea6dd20177271493997c5 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Mon, 12 Jan 2026 13:48:17 +0000 Subject: [PATCH 17/32] assigning specific goal removed and made it based on role --- ury/ury/hooks/ury_pos_opening_entry.py | 36 ++++++++++++-------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index c341122a..2e7097e2 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -61,7 +61,6 @@ def main_pos_open_check(doc,method): return flag else: pass - def validate_pos_opening_quality_review(doc, method): if not frappe.db.get_value( "POS Profile", @@ -69,43 +68,42 @@ def validate_pos_opening_quality_review(doc, method): "custom_daily_quality_check" ): return - quality_goal_name = frappe.db.get_value( + + user = frappe.session.user + user_roles = frappe.get_roles(user) + + assigned_goals = frappe.get_all( "Quality Goal", - {"goal": "Cashier POS Opening"}, - "name" + filters={"custom_assigned_role": ["in", user_roles]}, + pluck="name" ) - if not quality_goal_name: + if not assigned_goals: frappe.throw( - "Quality Goal 'Cashier POS Opening' is not configured.", - title="Configuration Error" + "No Quality Goals are assigned to your role.", + title="Quality Review Required" ) review_name = frappe.db.get_value( "Quality Review", { + "owner": user, "date": today(), - "goal": quality_goal_name + "goal": ["in", assigned_goals] }, "name" ) if not review_name: frappe.throw( - "Please complete today's Quality Review for Cashier POS Opening", + "Please complete today's Quality Review for your assigned goals.", title="Quality Review Required" ) review_doc = frappe.get_doc("Quality Review", review_name) - has_failed_objective = any( - row.status == "Failed" - for row in review_doc.reviews - ) - - if has_failed_objective: - frappe.msgprint( - "Please complete the Failed objective", - indicator="orange" + if any(row.status == "Failed" for row in review_doc.reviews): + frappe.throw( + "Please resolve failed objectives in your Quality Review.", + title="Quality Review Failed" ) - From 7ce7d2e363a3ec83f787c319efbf28508bf03c03 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Mon, 12 Jan 2026 13:49:20 +0000 Subject: [PATCH 18/32] made same changes for closing also --- ury/ury/hooks/ury_pos_closing_entry.py | 35 +++++++++++--------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index d3b0fed5..f0fc0fe2 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -73,7 +73,6 @@ def validate_cashier(doc, method): else: pass - def validate_pos_closing_quality_review(doc, method): if not frappe.db.get_value( "POS Profile", @@ -82,45 +81,41 @@ def validate_pos_closing_quality_review(doc, method): ): return - # existing logic continues... + user = frappe.session.user + user_roles = frappe.get_roles(user) - # ⬇️ EXISTING QUALITY REVIEW LOGIC (UNCHANGED) - quality_goal_name = frappe.db.get_value( + assigned_goals = frappe.get_all( "Quality Goal", - {"goal": "Cashier POS Closing"}, - "name" + filters={"custom_assigned_role": ["in", user_roles]}, + pluck="name" ) - if not quality_goal_name: + if not assigned_goals: frappe.throw( - "Quality Goal 'Cashier POS Closing' is not configured.", - title="Configuration Error" + "No Quality Goals are assigned to your role.", + title="Quality Review Required" ) review_name = frappe.db.get_value( "Quality Review", { + "owner": user, "date": today(), - "goal": quality_goal_name + "goal": ["in", assigned_goals] }, "name" ) if not review_name: frappe.throw( - "Please complete today's Quality Review for Cashier POS Closing", + "Please complete today's Quality Review for your assigned goals.", title="Quality Review Required" ) review_doc = frappe.get_doc("Quality Review", review_name) - has_failed_objective = any( - row.status == "Failed" - for row in review_doc.reviews - ) - - if has_failed_objective: - frappe.msgprint( - "Please complete the Failed objective", - indicator="orange" + if any(row.status == "Failed" for row in review_doc.reviews): + frappe.throw( + "Please resolve failed objectives in your Quality Review.", + title="Quality Review Failed" ) From b44bed87c9133ad6f23bfdf8e7d3d4fd100c9a80 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Mon, 12 Jan 2026 14:01:55 +0000 Subject: [PATCH 19/32] message corrected --- ury/ury/hooks/ury_pos_closing_entry.py | 2 +- ury/ury/hooks/ury_pos_opening_entry.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index f0fc0fe2..476124bb 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -108,7 +108,7 @@ def validate_pos_closing_quality_review(doc, method): if not review_name: frappe.throw( - "Please complete today's Quality Review for your assigned goals.", + "Please complete today's Quality Review", title="Quality Review Required" ) diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 2e7097e2..de6af584 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -96,7 +96,7 @@ def validate_pos_opening_quality_review(doc, method): if not review_name: frappe.throw( - "Please complete today's Quality Review for your assigned goals.", + "Please complete today's Quality Review", title="Quality Review Required" ) From 04cedfada8292bc03fd4b2a5c14336300bc9a228 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 14 Jan 2026 07:01:30 +0000 Subject: [PATCH 20/32] check box changed to childtable in pos profile for pos opening entry --- .../doctype/daily_quality_check/__init__.py | 0 .../daily_quality_check.json | 43 +++++++++++++++++++ .../daily_quality_check.py | 9 ++++ ury/ury/hooks/ury_pos_opening_entry.py | 34 ++++++--------- 4 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 ury/ury/doctype/daily_quality_check/__init__.py create mode 100644 ury/ury/doctype/daily_quality_check/daily_quality_check.json create mode 100644 ury/ury/doctype/daily_quality_check/daily_quality_check.py diff --git a/ury/ury/doctype/daily_quality_check/__init__.py b/ury/ury/doctype/daily_quality_check/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ury/ury/doctype/daily_quality_check/daily_quality_check.json b/ury/ury/doctype/daily_quality_check/daily_quality_check.json new file mode 100644 index 00000000..7aab7712 --- /dev/null +++ b/ury/ury/doctype/daily_quality_check/daily_quality_check.json @@ -0,0 +1,43 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-14 11:38:19.730898", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "checklist", + "options" + ], + "fields": [ + { + "fieldname": "checklist", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Checklist", + "options": "Quality Goal" + }, + { + "fieldname": "options", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Options", + "options": "Pos Opening Entry\nPos Closing Entry" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-14 12:14:20.709494", + "modified_by": "Administrator", + "module": "URY", + "name": "Daily Quality Check", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/ury/ury/doctype/daily_quality_check/daily_quality_check.py b/ury/ury/doctype/daily_quality_check/daily_quality_check.py new file mode 100644 index 00000000..4663df4f --- /dev/null +++ b/ury/ury/doctype/daily_quality_check/daily_quality_check.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Tridz Technologies Pvt. Ltd and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class DailyQualityCheck(Document): + pass diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index de6af584..97b85ceb 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -62,41 +62,31 @@ def main_pos_open_check(doc,method): else: pass def validate_pos_opening_quality_review(doc, method): - if not frappe.db.get_value( - "POS Profile", - doc.pos_profile, - "custom_daily_quality_check" - ): - return - - user = frappe.session.user - user_roles = frappe.get_roles(user) - - assigned_goals = frappe.get_all( - "Quality Goal", - filters={"custom_assigned_role": ["in", user_roles]}, - pluck="name" + required_goals = frappe.get_all( + "Daily Quality Check", + filters={ + "parent": doc.pos_profile, + "parenttype": "POS Profile", + "options": "POS Opening Entry" + }, + pluck="checklist" ) - if not assigned_goals: - frappe.throw( - "No Quality Goals are assigned to your role.", - title="Quality Review Required" - ) + if not required_goals: + return review_name = frappe.db.get_value( "Quality Review", { - "owner": user, "date": today(), - "goal": ["in", assigned_goals] + "goal": ["in", required_goals] }, "name" ) if not review_name: frappe.throw( - "Please complete today's Quality Review", + "Please complete today's Quality Review for POS Opening.", title="Quality Review Required" ) From bd02d7320fe381933d2dda325df69182f6e01b97 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 14 Jan 2026 07:12:44 +0000 Subject: [PATCH 21/32] throwing error for failed review changed into a warning message --- ury/ury/hooks/ury_pos_opening_entry.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 97b85ceb..7d802dbb 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -93,7 +93,9 @@ def validate_pos_opening_quality_review(doc, method): review_doc = frappe.get_doc("Quality Review", review_name) if any(row.status == "Failed" for row in review_doc.reviews): - frappe.throw( - "Please resolve failed objectives in your Quality Review.", - title="Quality Review Failed" + frappe.msgprint( + "Some objectives in today's Quality Review are marked as Failed. " + "Please review them.", + indicator="red", + alert=True ) From 570c707213b8dda27b41c2d2ac3fba2a2c82c15b Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 14 Jan 2026 07:21:03 +0000 Subject: [PATCH 22/32] childtable for closing entry is done --- ury/ury/hooks/ury_pos_closing_entry.py | 42 +++++++++++--------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index 476124bb..eda24f0c 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -74,48 +74,40 @@ def validate_cashier(doc, method): pass def validate_pos_closing_quality_review(doc, method): - if not frappe.db.get_value( - "POS Profile", - doc.pos_profile, - "custom_daily_quality_check" - ): - return - - user = frappe.session.user - user_roles = frappe.get_roles(user) - - assigned_goals = frappe.get_all( - "Quality Goal", - filters={"custom_assigned_role": ["in", user_roles]}, - pluck="name" + required_goals = frappe.get_all( + "Daily Quality Check", + filters={ + "parent": doc.pos_profile, + "parenttype": "POS Profile", + "options": "POS Closing Entry" + }, + pluck="checklist" ) - if not assigned_goals: - frappe.throw( - "No Quality Goals are assigned to your role.", - title="Quality Review Required" - ) + if not required_goals: + return review_name = frappe.db.get_value( "Quality Review", { - "owner": user, "date": today(), - "goal": ["in", assigned_goals] + "goal": ["in", required_goals] }, "name" ) if not review_name: frappe.throw( - "Please complete today's Quality Review", + "Please complete today's Quality Review for POS Closing.", title="Quality Review Required" ) review_doc = frappe.get_doc("Quality Review", review_name) if any(row.status == "Failed" for row in review_doc.reviews): - frappe.throw( - "Please resolve failed objectives in your Quality Review.", - title="Quality Review Failed" + frappe.msgprint( + "Some objectives in today's Quality Review are marked as Failed. " + "Please review them.", + indicator="red", + alert=True ) From f6fa7e9fc119f1c295ab0d8fa69723f14dbea412 Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 14 Jan 2026 09:03:11 +0000 Subject: [PATCH 23/32] api added for checklist --- ury/ury/api/pos_checklist.py | 74 ++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 ury/ury/api/pos_checklist.py diff --git a/ury/ury/api/pos_checklist.py b/ury/ury/api/pos_checklist.py new file mode 100644 index 00000000..b758d3d0 --- /dev/null +++ b/ury/ury/api/pos_checklist.py @@ -0,0 +1,74 @@ +import frappe +from frappe.utils import flt, get_datetime, today +from ury.ury_pos.api import getBranch + + +@frappe.whitelist() +def checklist(): + today_date = today() + employee = frappe.session.user + date = "" + branchName = getBranch() + + pos_opening_list = frappe.get_all( + "POS Opening Entry", + filters={ + "branch": branchName, + "docstatus": 1, + "status": "Open" + }, + fields=["posting_date"] + ) + + # If POS is not open + if not pos_opening_list: + return { + "pos_open": 0, + } + + pos_open = 1 + pos_posting_date = pos_opening_list[0].posting_date + + user = frappe.get_doc("User", employee) + user_roles = user.roles + + pos_profile_name = frappe.get_value( + "POS Profile", + {"branch": branchName}, + "name" + ) + + pos_profile = frappe.get_doc("POS Profile", pos_profile_name) + dependent_checklist = pos_profile.dependent_checklist + + if not dependent_checklist: + return { + "pos_open": pos_open, + "checklist": 1 + } + + to_submit_checklists = [] + for checklist in dependent_checklist: + for user_role in user_roles: + if checklist.role == user_role.role: + to_submit_checklists.append(checklist) + + if not to_submit_checklists: + return { + "pos_open": pos_open, + "checklist": 1 + } + + is_checklist_submitted = frappe.db.exists({ + "doctype": "Quality Review", + "date": pos_posting_date, + "status": ["in", ["Open", "Passed"]], + "owner": employee + }) + + return { + "pos_open": pos_open, + "checklist": 1 if is_checklist_submitted else 0, + "checklist_doc": to_submit_checklists, + "pos_posting_date": pos_posting_date + } From 5158882486f290063314ccab91f0a4ded263854e Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 14 Jan 2026 10:06:57 +0000 Subject: [PATCH 24/32] update: added quality_review file in app include js --- ury/hooks.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ury/hooks.py b/ury/hooks.py index a5d8067d..37eca739 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -18,7 +18,8 @@ "/assets/ury/js/quick_entry.js", "/assets/ury/js/pos_print.js", "/assets/ury/js/restrict_qty_edit_pos.js", - "/assets/ury/js/ury_pos_kot.js" + "/assets/ury/js/ury_pos_kot.js", + "/assets/ury/js/quality_review.js" ] # include js, css files in header of web template @@ -388,8 +389,4 @@ }, {"dt": "Role", "filters": [["role_name", "like", "URY %"]]}, "Client Script", -] - -doctype_js = { - "Quality Review": "public/js/quality_review.js" -} +] \ No newline at end of file From d24a978f3cdf9e89963f1edd573084d2d002d3fb Mon Sep 17 00:00:00 2001 From: amnuoo Date: Wed, 14 Jan 2026 11:49:26 +0000 Subject: [PATCH 25/32] refactor: custom field has been added to the ury module --- ury/ury/custom/pos_profile.json | 2674 ++++++++++++++++++++++ ury/ury/custom/pos_profile_user.json | 73 + ury/ury/custom/quality_goal.json | 118 + ury/ury/custom/ury_printer_settings.json | 201 ++ 4 files changed, 3066 insertions(+) create mode 100644 ury/ury/custom/pos_profile.json create mode 100644 ury/ury/custom/pos_profile_user.json create mode 100644 ury/ury/custom/quality_goal.json create mode 100644 ury/ury/custom/ury_printer_settings.json diff --git a/ury/ury/custom/pos_profile.json b/ury/ury/custom/pos_profile.json new file mode 100644 index 00000000..23b8039b --- /dev/null +++ b/ury/ury/custom/pos_profile.json @@ -0,0 +1,2674 @@ +{ + "custom_fields": [ + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:42.733560", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": "restaurant.branch", + "fetch_if_empty": 0, + "fieldname": "branch", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 12, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "column_break_c10ag", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Branch", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-14 00:40:58.061259", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-branch", + "no_copy": 0, + "non_negative": 0, + "options": "Branch", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:43.846105", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "column_break_bvzw2", + "fieldtype": "Column Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 22, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "paid_limit", + "is_system_generated": 0, + "is_virtual": 0, + "label": null, + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-01-23 11:14:35.908218", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-column_break_bvzw2", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:42.616161", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "column_break_c10ag", + "fieldtype": "Column Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 11, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "restaurant", + "is_system_generated": 0, + "is_virtual": 0, + "label": null, + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-14 00:40:57.859845", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-column_break_c10ag", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.443045", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_cl", + "fieldtype": "Column Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 36, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_kot_alert_sound", + "is_system_generated": 0, + "is_virtual": 0, + "label": "", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-12-12 12:30:14.254898", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_cl", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:51.244143", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_column_break_wwq3q", + "fieldtype": "Column Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 40, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_recipients", + "is_system_generated": 0, + "is_virtual": 0, + "label": "", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-02-19 12:54:21.578630", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_column_break_wwq3q", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:44.987049", + "default": null, + "depends_on": null, + "description": "Validate that the previous day\u2019s POS is closed before opening a new one.", + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_daily_pos_close", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 27, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "show_image", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Require Daily POS Closing", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-08-28 11:00:16.547440", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_daily_pos_close", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-14 11:45:54.082507", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_daily_quality_checking", + "fieldtype": "Table", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 65, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_section_break_itqal", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Daily Quality Check", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-14 17:15:42.603306", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_daily_quality_checking", + "no_copy": 0, + "non_negative": 0, + "options": "Daily Quality Check", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:49.758520", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_edit_order_type", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 29, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_enable_discount", + "is_system_generated": 0, + "is_virtual": 0, + "label": " Enable Order Type Edit", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-04-11 15:08:20.399135", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_edit_order_type", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:45.090806", + "default": null, + "depends_on": null, + "description": "Enable discount feature in URY POS", + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_enable_discount", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 28, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_daily_pos_close", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Enable Discount", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-12-06 11:00:16.547440", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_enable_discount", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:51.079440", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_enable_kot_reprint", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 41, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_column_break_wwq3q", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Enable KOT Reprint", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-02-19 12:51:46.708745", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_enable_kot_reprint", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:49.426978", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_enable_multiple_cashier", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 31, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_multiple_cashier_configuration", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Enable Multiple Cashier", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-03-24 01:36:56.829981", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_enable_multiple_cashier", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.277921", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_kot_alert", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 34, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_kot_naming_series", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Enable KOT Audio Alert", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-12-09 21:30:41.399221", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_kot_alert", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.364049", + "default": null, + "depends_on": "custom_kot_alert", + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_kot_alert_sound", + "fieldtype": "Attach", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 35, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_kot_alert", + "is_system_generated": 0, + "is_virtual": 0, + "label": "KOT alert sound", + "length": 0, + "link_filters": null, + "mandatory_depends_on": "custom_kot_alert", + "modified": "2023-12-11 09:51:31.430739", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_kot_alert_sound", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.016917", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_kot_settings", + "fieldtype": "Section Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 32, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_enable_multiple_cashier", + "is_system_generated": 0, + "is_virtual": 0, + "label": "KOT Settings", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-10-01 21:07:14.402860", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_kot_settings", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.506108", + "default": null, + "depends_on": "", + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_kot_warning_time", + "fieldtype": "Int", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 37, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_cl", + "is_system_generated": 0, + "is_virtual": 0, + "label": "KOT Warning Time", + "length": 0, + "link_filters": null, + "mandatory_depends_on": "", + "modified": "2023-12-13 11:37:13.317018", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_kot_warning_time", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:49.371212", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_multiple_cashier_configuration", + "fieldtype": "Section Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 30, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_edit_order_type", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Multiple Cashier Configuration", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-03-24 01:35:57.412505", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_multiple_cashier_configuration", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.595123", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_notify_kot_delay", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 38, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_kot_warning_time", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Notify KOT Delay", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-12-12 12:32:02.111078", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_notify_kot_delay", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:51.160365", + "default": null, + "depends_on": "eval:doc.custom_enable_kot_reprint", + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_parcel_order_printer", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 42, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_enable_kot_reprint", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Parcel Order Printer", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-02-19 12:53:18.058825", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_parcel_order_printer", + "no_copy": 0, + "non_negative": 0, + "options": "Network Printer Settings", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.675321", + "default": null, + "depends_on": "custom_notify_kot_delay", + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_recipients", + "fieldtype": "Table", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 39, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_notify_kot_delay", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Recipients", + "length": 0, + "link_filters": null, + "mandatory_depends_on": "custom_notify_kot_delay", + "modified": "2023-12-12 12:38:56.235040", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_recipients", + "no_copy": 0, + "non_negative": 0, + "options": "URY Notification Recipient", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:51.387943", + "default": null, + "depends_on": "eval:doc.custom_enable_kot_reprint", + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_reprint_kot_format", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 44, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_table_order_printer", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Reprint KOT Format", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-02-19 14:34:30.828917", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_reprint_kot_format", + "no_copy": 0, + "non_negative": 0, + "options": "Print Format", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.735577", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_reset_order_number_daily", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 45, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_reprint_kot_format", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Reset Order Number Daily", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-08-23 10:50:44.420498", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_reset_order_number_daily", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-14 11:45:53.963684", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_section_break_itqal", + "fieldtype": "Section Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 64, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "allow_partial_payment", + "is_system_generated": 0, + "is_virtual": 0, + "label": "", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-14 17:15:29.294685", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-custom_section_break_itqal", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:51.305457", + "default": null, + "depends_on": "eval:doc.custom_enable_kot_reprint", + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_table_order_printer", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 43, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_parcel_order_printer", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Table Order Printer", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-02-19 12:59:09.653916", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-custom_table_order_printer", + "no_copy": 0, + "non_negative": 0, + "options": "Network Printer Settings", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:50.200026", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_kot_naming_series", + "fieldtype": "Data", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 33, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_kot_settings", + "is_system_generated": 0, + "is_virtual": 0, + "label": "URY KOT Naming Series", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-10-01 21:08:17.416512", + "modified_by": "Administrator", + "module": "URY", + "name": "POS Profile-kot_naming_series", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:43.769574", + "default": "0", + "depends_on": null, + "description": "Set a limit for the cashier to view a restricted number of recently paid invoices.", + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "paid_limit", + "fieldtype": "Int", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 21, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "table_attention_time", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Show Limited Paid Invoices", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-09-24 14:08:01.442206", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-paid_limit", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:42.852694", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "printer_info", + "fieldtype": "Section Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 13, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "branch", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Printer Info", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-14 11:58:59.185765", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-printer_info", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:42.966665", + "default": null, + "depends_on": "eval:doc.qz_print != 1;", + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "printer_settings", + "fieldtype": "Table", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 14, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "printer_info", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Printer Settings", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-14 11:58:59.658627", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-printer_settings", + "no_copy": 0, + "non_negative": 0, + "options": "URY Printer Settings", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:43.316769", + "default": null, + "depends_on": "qz_print", + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "qz_host", + "fieldtype": "Data", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 16, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "qz_print", + "is_system_generated": 0, + "is_virtual": 0, + "label": "QZ Host", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-14 11:59:00.067091", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-qz_host", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:43.063436", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "qz_print", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 15, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "printer_settings", + "is_system_generated": 0, + "is_virtual": 0, + "label": "QZ Print", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-14 11:58:59.871043", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-qz_print", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:44.447264", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "remove_items", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 25, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "view_all_status", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Allow Cashier To Edit And Remove Table Order Items", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-01-23 13:32:45.884420", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-remove_items", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:42.541213", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "restaurant", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 10, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "restaurant_info", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Restaurant", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-14 00:40:57.650719", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-restaurant", + "no_copy": 0, + "non_negative": 0, + "options": "URY Restaurant", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:42.460605", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "restaurant_info", + "fieldtype": "Section Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 9, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "company_address", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Restaurant Info", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-14 00:40:57.426746", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-restaurant_info", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:49.033978", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "restaurant_prefix", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 61, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "allow_discount_change", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Restaurant Prefix For Sales Invoice", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-12-04 14:06:14.125832", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-restaurant_prefix", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:43.630168", + "default": null, + "depends_on": null, + "description": "Users assigned this role will function as cashiers in URY POS, responsible for managing billing transactions.", + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "role_allowed_for_billing", + "fieldtype": "Table MultiSelect", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 19, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "transfer_role_permissions", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Role Allowed For Billing", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-01-05 17:42:25.673638", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-role_allowed_for_billing", + "no_copy": 0, + "non_negative": 0, + "options": "Role Permitted", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:44.030242", + "default": null, + "depends_on": null, + "description": "Users with this role have restricted access to table order functions.", + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "role_restricted_for_table_order", + "fieldtype": "Table MultiSelect", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 23, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "column_break_bvzw2", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Role Restricted For Table Order", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-01-05 20:16:47.345168", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-role_restricted_for_table_order", + "no_copy": 0, + "non_negative": 0, + "options": "Role Permitted", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:43.501594", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "section_break_tjhrm", + "fieldtype": "Section Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 17, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "qz_host", + "is_system_generated": 0, + "is_virtual": 0, + "label": "URY pos restrictions ", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-01-04 11:03:50.097450", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-section_break_tjhrm", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:44.530314", + "default": "1", + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "show_image", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 26, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "remove_items", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Show Item Image In URY Pos", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-02-09 19:24:46.076630", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-show_image", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:43.691461", + "default": "0", + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "table_attention_time", + "fieldtype": "Int", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 20, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "role_allowed_for_billing", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Table Attention time", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-02-13 16:30:33.325971", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-table_attention_time", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:43.555513", + "default": null, + "depends_on": null, + "description": "This role grants permissions for Captain Transfer with access to all tables\n", + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "transfer_role_permissions", + "fieldtype": "Table MultiSelect", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 18, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "section_break_tjhrm", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Role Permitted For Captain Transfer", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-01-04 11:03:50.911595", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-transfer_role_permissions", + "no_copy": 0, + "non_negative": 0, + "options": "Role Permitted", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:44.227966", + "default": null, + "depends_on": null, + "description": "Enables Cashiers to view all statuses (Paid, Consolidated, Return Invoices) in the recent order.", + "docstatus": 0, + "dt": "POS Profile", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "view_all_status", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 24, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "role_restricted_for_table_order", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Allow Cashier To View All Status", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-01-23 13:30:17.539810", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-view_all_status", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + } + ], + "custom_perms": [], + "doctype": "POS Profile", + "links": [ + { + "creation": "2013-05-24 12:15:51", + "custom": 0, + "docstatus": 0, + "group": "Opening & Closing", + "hidden": 0, + "idx": 4, + "is_child_table": 0, + "link_doctype": "POS Closing Entry", + "link_fieldname": "pos_profile", + "modified": "2026-01-02 11:37:06.436004", + "modified_by": "Administrator", + "name": "hb8hd1ielm", + "owner": "Administrator", + "parent": "POS Profile", + "parent_doctype": null, + "parentfield": "links", + "parenttype": "DocType", + "table_fieldname": null + }, + { + "creation": "2013-05-24 12:15:51", + "custom": 0, + "docstatus": 0, + "group": "Invoices", + "hidden": 0, + "idx": 2, + "is_child_table": 0, + "link_doctype": "POS Invoice", + "link_fieldname": "pos_profile", + "modified": "2026-01-02 11:37:06.436004", + "modified_by": "Administrator", + "name": "hb8jdktq8e", + "owner": "Administrator", + "parent": "POS Profile", + "parent_doctype": null, + "parentfield": "links", + "parenttype": "DocType", + "table_fieldname": null + }, + { + "creation": "2013-05-24 12:15:51", + "custom": 0, + "docstatus": 0, + "group": "Opening & Closing", + "hidden": 0, + "idx": 3, + "is_child_table": 0, + "link_doctype": "POS Opening Entry", + "link_fieldname": "pos_profile", + "modified": "2026-01-02 11:37:06.436004", + "modified_by": "Administrator", + "name": "hb8puvttis", + "owner": "Administrator", + "parent": "POS Profile", + "parent_doctype": null, + "parentfield": "links", + "parenttype": "DocType", + "table_fieldname": null + }, + { + "creation": "2013-05-24 12:15:51", + "custom": 0, + "docstatus": 0, + "group": "Invoices", + "hidden": 0, + "idx": 1, + "is_child_table": 0, + "link_doctype": "Sales Invoice", + "link_fieldname": "pos_profile", + "modified": "2026-01-02 11:37:06.436004", + "modified_by": "Administrator", + "name": "hb8ro440g0", + "owner": "Administrator", + "parent": "POS Profile", + "parent_doctype": null, + "parentfield": "links", + "parenttype": "DocType", + "table_fieldname": null + } + ], + "property_setters": [ + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "creation": "2026-01-14 11:46:03.932785", + "default_value": null, + "doc_type": "POS Profile", + "docstatus": 0, + "doctype_or_field": "DocType", + "field_name": null, + "idx": 0, + "is_system_generated": 0, + "modified": "2026-01-14 11:46:03.932785", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile-main-field_order", + "owner": "Administrator", + "property": "field_order", + "property_type": "Data", + "row_name": null, + "value": "[\"company\", \"customer\", \"country\", \"disabled\", \"column_break_9\", \"warehouse\", \"campaign\", \"company_address\", \"restaurant_info\", \"restaurant\", \"column_break_c10ag\", \"branch\", \"printer_info\", \"printer_settings\", \"qz_print\", \"qz_host\", \"section_break_tjhrm\", \"transfer_role_permissions\", \"role_allowed_for_billing\", \"table_attention_time\", \"paid_limit\", \"column_break_bvzw2\", \"role_restricted_for_table_order\", \"view_all_status\", \"remove_items\", \"show_image\", \"custom_daily_pos_close\", \"custom_enable_discount\", \"custom_edit_order_type\", \"custom_multiple_cashier_configuration\", \"custom_enable_multiple_cashier\", \"custom_kot_settings\", \"custom_kot_naming_series\", \"custom_kot_alert\", \"custom_kot_alert_sound\", \"custom_cl\", \"custom_kot_warning_time\", \"custom_notify_kot_delay\", \"custom_recipients\", \"custom_column_break_wwq3q\", \"custom_enable_kot_reprint\", \"custom_parcel_order_printer\", \"custom_table_order_printer\", \"custom_reprint_kot_format\", \"custom_reset_order_number_daily\", \"section_break_15\", \"applicable_for_users\", \"section_break_11\", \"payments\", \"section_break_14\", \"hide_images\", \"hide_unavailable_items\", \"auto_add_item_to_cart\", \"validate_stock_on_save\", \"print_receipt_on_order_complete\", \"column_break_16\", \"update_stock\", \"ignore_pricing_rule\", \"allow_rate_change\", \"allow_discount_change\", \"restaurant_prefix\", \"disable_grand_total_to_default_mop\", \"allow_partial_payment\", \"custom_section_break_itqal\", \"custom_daily_quality_checking\", \"section_break_23\", \"item_groups\", \"column_break_25\", \"customer_groups\", \"section_break_16\", \"print_format\", \"letter_head\", \"column_break0\", \"tc_name\", \"select_print_heading\", \"section_break_19\", \"selling_price_list\", \"currency\", \"write_off_account\", \"write_off_cost_center\", \"write_off_limit\", \"account_for_change_amount\", \"disable_rounded_total\", \"column_break_23\", \"income_account\", \"expense_account\", \"taxes_and_charges\", \"tax_category\", \"apply_discount_on\", \"accounting_dimensions_section\", \"cost_center\", \"dimension_col_break\", \"project\"]" + } + ], + "sync_on_migrate": 1 +} \ No newline at end of file diff --git a/ury/ury/custom/pos_profile_user.json b/ury/ury/custom/pos_profile_user.json new file mode 100644 index 00000000..43433fda --- /dev/null +++ b/ury/ury/custom/pos_profile_user.json @@ -0,0 +1,73 @@ +{ + "custom_fields": [ + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:49.503435", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "POS Profile User", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_main_cashier", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "default", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Main Cashier", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-03-24 14:33:08.806157", + "modified_by": "Administrator", + "module": null, + "name": "POS Profile User-custom_main_cashier", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": "3" + } + ], + "custom_perms": [], + "doctype": "POS Profile User", + "links": [], + "property_setters": [], + "sync_on_migrate": 1 +} \ No newline at end of file diff --git a/ury/ury/custom/quality_goal.json b/ury/ury/custom/quality_goal.json new file mode 100644 index 00000000..4970cc65 --- /dev/null +++ b/ury/ury/custom/quality_goal.json @@ -0,0 +1,118 @@ +{ + "custom_fields": [ + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-08 12:54:31.583677", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "Quality Goal", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_assigned_role", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 3, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "frequency", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Assigned Role", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-14 17:15:13.338205", + "modified_by": "Administrator", + "module": "URY", + "name": "Quality Goal-custom_assigned_role", + "no_copy": 0, + "non_negative": 0, + "options": "Role", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + } + ], + "custom_perms": [], + "doctype": "Quality Goal", + "links": [ + { + "creation": "2018-10-02 12:17:41.727541", + "custom": 0, + "docstatus": 0, + "group": "Review", + "hidden": 0, + "idx": 1, + "is_child_table": 0, + "link_doctype": "Quality Review", + "link_fieldname": "goal", + "modified": "2026-01-02 11:37:42.923498", + "modified_by": "Administrator", + "name": "hmlso0379r", + "owner": "Administrator", + "parent": "Quality Goal", + "parent_doctype": null, + "parentfield": "links", + "parenttype": "DocType", + "table_fieldname": null + } + ], + "property_setters": [ + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "creation": "2026-01-12 19:38:52.157834", + "default_value": null, + "doc_type": "Quality Goal", + "docstatus": 0, + "doctype_or_field": "DocType", + "field_name": null, + "idx": 0, + "is_system_generated": 0, + "modified": "2026-01-12 19:38:52.157834", + "modified_by": "Administrator", + "module": null, + "name": "Quality Goal-main-field_order", + "owner": "Administrator", + "property": "field_order", + "property_type": "Data", + "row_name": null, + "value": "[\"goal\", \"frequency\", \"custom_assigned_role\", \"cb_00\", \"procedure\", \"weekday\", \"date\", \"sb_01\", \"objectives\"]" + } + ], + "sync_on_migrate": 1 +} \ No newline at end of file diff --git a/ury/ury/custom/ury_printer_settings.json b/ury/ury/custom/ury_printer_settings.json new file mode 100644 index 00000000..5c07bb50 --- /dev/null +++ b/ury/ury/custom/ury_printer_settings.json @@ -0,0 +1,201 @@ +{ + "custom_fields": [ + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:49.832167", + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "dt": "URY Printer Settings", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_kot_print", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_preview": 1, + "in_standard_filter": 0, + "insert_after": "bill", + "is_system_generated": 0, + "is_virtual": 0, + "label": "KOT Print", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2023-09-27 13:23:37.572928", + "modified_by": "Administrator", + "module": "URY", + "name": "Printer Settings-kot", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:49.889827", + "default": null, + "depends_on": "custom_kot_print", + "description": null, + "docstatus": 0, + "dt": "URY Printer Settings", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_kot_print_format", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 3, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "printer", + "is_system_generated": 0, + "is_virtual": 0, + "label": "KOT Print Format", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-01-09 13:03:26.991856", + "modified_by": "Administrator", + "module": "URY", + "name": "Printer Settings-kot_print_format_", + "no_copy": 0, + "non_negative": 0, + "options": "Print Format", + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + }, + { + "_assign": null, + "_comments": null, + "_liked_by": null, + "_user_tags": null, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "creation": "2026-01-02 12:13:49.950357", + "default": null, + "depends_on": "eval:doc.parenttype=='URY Production Unit' && doc.custom_kot_print == 1", + "description": null, + "docstatus": 0, + "dt": "URY Printer Settings", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_block_takeaway_kot", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "idx": 4, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "insert_after": "custom_kot_print_format", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Block Takeaway KOT", + "length": 0, + "link_filters": null, + "mandatory_depends_on": "", + "modified": "2024-01-17 02:00:22.569584", + "modified_by": "Administrator", + "module": null, + "name": "URY Printer Settings-custom_block_takeaway_kot", + "no_copy": 0, + "non_negative": 0, + "options": null, + "owner": "Administrator", + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 0, + "read_only_depends_on": null, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "show_dashboard": 0, + "sort_options": 0, + "translatable": 0, + "unique": 0, + "width": null + } + ], + "custom_perms": [], + "doctype": "URY Printer Settings", + "links": [], + "property_setters": [], + "sync_on_migrate": 1 +} \ No newline at end of file From 023bf1c90457851b6b7ab68561cd0d97e5112d64 Mon Sep 17 00:00:00 2001 From: vyshnav mv Date: Thu, 22 Jan 2026 03:07:04 -0800 Subject: [PATCH 26/32] fix: validate the POS checklist status and redirect the user if it's incomplete. --- urypos/src/stores/Auth.js | 98 ++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/urypos/src/stores/Auth.js b/urypos/src/stores/Auth.js index 8d29b3c8..f4b80358 100644 --- a/urypos/src/stores/Auth.js +++ b/urypos/src/stores/Auth.js @@ -182,28 +182,58 @@ export const useAuthStore = defineStore("auth", { }); }); - } + } else { this.call - .get("ury.ury_pos.api.posOpening") - .then((result) => { - const serverMessages = JSON.parse(result._server_messages); - const innerMessageString = serverMessages[0]; - const innerMessage = JSON.parse(innerMessageString); - const message = innerMessage.message; - // if (this.cashier) { - // this.alert.createAlert("Message", message, "OK").then(() => { - // router.push("/posOpen"); - // }); - // } else { - var currentDomain = window.location.origin; - this.alert.createAlert("Message", message, "OK").then(() => { - window.location.href = currentDomain + "/app/"; - }); - // } + .get("ury.ury.api.pos_checklist.checklist") + .then((checklistRes) => { + if (checklistRes.checklist === 0) { + var currentDomain = window.location.origin; + this.alert.createAlert("Message", checklistRes.message || "Complete the checklist quality review", "OK").then(() => { + router.push("/PosOpen"); + }); + return; + } + + this.call + .get("ury.ury_pos.api.posOpening") + .then((result) => { + const serverMessages = JSON.parse(result._server_messages); + const innerMessageString = serverMessages[0]; + const innerMessage = JSON.parse(innerMessageString); + const message = innerMessage.message; + // if (this.cashier) { + // this.alert.createAlert("Message", message, "OK").then(() => { + // router.push("/posOpen"); + // }); + // } else { + var currentDomain = window.location.origin; + this.alert.createAlert("Message", message, "OK").then(() => { + window.location.href = currentDomain + "/app/"; + }); + // } + }) + .catch((error) => { + // console.error(error) + }); }) .catch((error) => { - // console.error(error) + console.error("Checklist check failed", error); + // Fallback to normal POS opening check if checklist check fails? + // Or fail safe? Proceeding might be safer to avoid blocking if API issue. + this.call + .get("ury.ury_pos.api.posOpening") + .then((result) => { + // ... (same existing logic) + const serverMessages = JSON.parse(result._server_messages); + const innerMessageString = serverMessages[0]; + const innerMessage = JSON.parse(innerMessageString); + const message = innerMessage.message; + var currentDomain = window.location.origin; + this.alert.createAlert("Message", message, "OK").then(() => { + window.location.href = currentDomain + "/app/"; + }); + }) }); } }, @@ -215,11 +245,33 @@ export const useAuthStore = defineStore("auth", { .get("ury.ury_pos.api.validate_pos_close", getPosProfile) .then((result) => { if (result.message === "Failed") { - var currentDomain = window.location.origin; - this.alert - .createAlert("Message", "Please close previous POS Entry", "OK") - .then(() => { - window.location.href = currentDomain + "/app/"; + this.call + .get("ury.ury.api.pos_checklist.checklist") + .then((checklistRes) => { + if (checklistRes.checklist === 0) { + var currentDomain = window.location.origin; + this.alert.createAlert("Message", checklistRes.message || "Complete the checklist quality review", "OK").then(() => { + router.push("/PosClose"); + }); + return; + } else { + var currentDomain = window.location.origin; + this.alert + .createAlert("Message", "Please close previous POS Entry", "OK") + .then(() => { + router.push("/PosClose"); + }); + } + }) + .catch((error) => { + console.error(error) + // Fallback if checklist API fails + var currentDomain = window.location.origin; + this.alert + .createAlert("Message", "Please close previous POS Entry", "OK") + .then(() => { + router.push("/app"); + }); }); } }) From cba4ee59af636a1a1594e58e42e0d64944d253ab Mon Sep 17 00:00:00 2001 From: vyshnav mv Date: Thu, 22 Jan 2026 19:04:13 -0800 Subject: [PATCH 27/32] fix: pos checklist validation --- urypos/src/stores/Auth.js | 60 ++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/urypos/src/stores/Auth.js b/urypos/src/stores/Auth.js index f4b80358..33da45a9 100644 --- a/urypos/src/stores/Auth.js +++ b/urypos/src/stores/Auth.js @@ -195,48 +195,36 @@ export const useAuthStore = defineStore("auth", { return; } - this.call - .get("ury.ury_pos.api.posOpening") - .then((result) => { - const serverMessages = JSON.parse(result._server_messages); - const innerMessageString = serverMessages[0]; - const innerMessage = JSON.parse(innerMessageString); - const message = innerMessage.message; - // if (this.cashier) { - // this.alert.createAlert("Message", message, "OK").then(() => { - // router.push("/posOpen"); - // }); - // } else { - var currentDomain = window.location.origin; - this.alert.createAlert("Message", message, "OK").then(() => { - window.location.href = currentDomain + "/app/"; - }); - // } - }) - .catch((error) => { - // console.error(error) - }); + if (checklistRes.pos_open === 0) { + this.checkPosOpeningEntry(); + return; + } + + this.checkPosOpeningEntry(); }) .catch((error) => { console.error("Checklist check failed", error); - // Fallback to normal POS opening check if checklist check fails? - // Or fail safe? Proceeding might be safer to avoid blocking if API issue. - this.call - .get("ury.ury_pos.api.posOpening") - .then((result) => { - // ... (same existing logic) - const serverMessages = JSON.parse(result._server_messages); - const innerMessageString = serverMessages[0]; - const innerMessage = JSON.parse(innerMessageString); - const message = innerMessage.message; - var currentDomain = window.location.origin; - this.alert.createAlert("Message", message, "OK").then(() => { - window.location.href = currentDomain + "/app/"; - }); - }) + this.checkPosOpeningEntry(); }); } }, + checkPosOpeningEntry() { + this.call + .get("ury.ury_pos.api.posOpening") + .then((result) => { + const serverMessages = JSON.parse(result._server_messages); + const innerMessageString = serverMessages[0]; + const innerMessage = JSON.parse(innerMessageString); + const message = innerMessage.message; + var currentDomain = window.location.origin; + this.alert.createAlert("Message", message, "OK").then(() => { + window.location.href = currentDomain + "/app/"; + }); + }) + .catch((error) => { + // console.error(error) + }); + }, isPosCloseCheck() { const getPosProfile = { pos_profile: this.invoiceData.posProfile, From 87d42093169134879030c40ac672859f3d9ac274 Mon Sep 17 00:00:00 2001 From: vyshnav mv Date: Thu, 22 Jan 2026 19:30:16 -0800 Subject: [PATCH 28/32] fix: checklist validation and alert appears before POS alerts --- ury/ury/api/pos_checklist.py | 101 +++++++++++++++++++++-------------- urypos/src/stores/Auth.js | 88 +++++++++++++----------------- 2 files changed, 100 insertions(+), 89 deletions(-) diff --git a/ury/ury/api/pos_checklist.py b/ury/ury/api/pos_checklist.py index b758d3d0..4c867adc 100644 --- a/ury/ury/api/pos_checklist.py +++ b/ury/ury/api/pos_checklist.py @@ -4,71 +4,94 @@ @frappe.whitelist() -def checklist(): +@frappe.whitelist() +def checklist(checklist_type="Pos Opening Entry"): today_date = today() employee = frappe.session.user - date = "" branchName = getBranch() + # Find open POS entry pos_opening_list = frappe.get_all( "POS Opening Entry", filters={ "branch": branchName, "docstatus": 1, - "status": "Open" + "status": "Open", + "user": employee }, - fields=["posting_date"] + fields=["posting_date", "pos_profile", "name"] ) - # If POS is not open + # Determine POS status and posting date if not pos_opening_list: - return { - "pos_open": 0, - } + pos_open = 0 + pos_posting_date = today_date + # Attempt to find POS Profile from branch if no opening entry + pos_profile_name = frappe.get_value("POS Profile", {"branch": branchName}, "name") + else: + pos_open = 1 + pos_posting_date = pos_opening_list[0].posting_date + pos_profile_name = pos_opening_list[0].pos_profile - pos_open = 1 - pos_posting_date = pos_opening_list[0].posting_date + if not pos_profile_name: + return { + "pos_open": pos_open, + "checklist": 1, + } + # Fetch User Roles user = frappe.get_doc("User", employee) - user_roles = user.roles - - pos_profile_name = frappe.get_value( - "POS Profile", - {"branch": branchName}, - "name" - ) + user_roles = [r.role for r in user.roles] + # Fetch POS Profile and Checklist Configuration pos_profile = frappe.get_doc("POS Profile", pos_profile_name) - dependent_checklist = pos_profile.dependent_checklist - - if not dependent_checklist: - return { - "pos_open": pos_open, - "checklist": 1 - } + daily_quality_check = pos_profile.custom_daily_quality_checking or [] - to_submit_checklists = [] - for checklist in dependent_checklist: - for user_role in user_roles: - if checklist.role == user_role.role: - to_submit_checklists.append(checklist) + # Identify required checklists based on type and user role + to_submit_goals = [] + + for row in daily_quality_check: + if row.options != checklist_type: + continue + + quality_goal_name = row.checklist + if not quality_goal_name: + continue + + # We need the Quality Goal doc to check the assigned role + # Optimization: Could fetch all needed goals in one query if perf is issue + quality_goal = frappe.get_doc("Quality Goal", quality_goal_name) + + if quality_goal.custom_assigned_role in user_roles: + to_submit_goals.append(quality_goal) - if not to_submit_checklists: + if not to_submit_goals: return { "pos_open": pos_open, "checklist": 1 } - is_checklist_submitted = frappe.db.exists({ - "doctype": "Quality Review", - "date": pos_posting_date, - "status": ["in", ["Open", "Passed"]], - "owner": employee - }) + all_checklists_submitted = True + + for goal in to_submit_goals: + # Check if a VALID (Open/Passed) Quality Review exists for this Goal + is_submitted = frappe.db.exists({ + "doctype": "Quality Review", + "goal": goal.name, # The Link field to Quality Goal + "date": pos_posting_date, + "owner": employee, + "docstatus": 1, # Must be submitted + "status": ["in", ["Open", "Passed"]] + }) + + if not is_submitted: + all_checklists_submitted = False + break return { "pos_open": pos_open, - "checklist": 1 if is_checklist_submitted else 0, - "checklist_doc": to_submit_checklists, - "pos_posting_date": pos_posting_date + "checklist": 1 if all_checklists_submitted else 0, + "checklist_doc": [], # Keeping key for frontend safety (though likely unused now) + "pos_posting_date": pos_posting_date, + "message": "Complete the checklist quality review" } diff --git a/urypos/src/stores/Auth.js b/urypos/src/stores/Auth.js index 33da45a9..eed257b8 100644 --- a/urypos/src/stores/Auth.js +++ b/urypos/src/stores/Auth.js @@ -158,7 +158,30 @@ export const useAuthStore = defineStore("auth", { window.location.href = currentDomain + "/app/"; }, - isPosOpenChecking() { + async validateChecklist(redirectPath, checklistType = "Pos Opening Entry") { + try { + const checklistRes = await this.call.get("ury.ury.api.pos_checklist.checklist", { + checklist_type: checklistType + }); + if (checklistRes.message.checklist === 0) { + const currentDomain = window.location.origin; + await this.alert.createAlert("Message", checklistRes.message.message || "Complete the checklist quality review", "OK"); + + if (redirectPath.startsWith("http")) { + window.location.href = redirectPath; + } else { + router.push(redirectPath); + } + return false; + } + return true; + } catch (error) { + console.error("Checklist check failed", error); + return true; + } + }, + + async isPosOpenChecking() { if (this.invoiceData.multipleCashier) { this.call .get("ury.ury.doctype.ury_order.ury_order.pos_opening_check") @@ -184,28 +207,11 @@ export const useAuthStore = defineStore("auth", { }); } else { - this.call - .get("ury.ury.api.pos_checklist.checklist") - .then((checklistRes) => { - if (checklistRes.checklist === 0) { - var currentDomain = window.location.origin; - this.alert.createAlert("Message", checklistRes.message || "Complete the checklist quality review", "OK").then(() => { - router.push("/PosOpen"); - }); - return; - } + // Updated flow as per requirements + const isValid = await this.validateChecklist("/PosOpen", "Pos Opening Entry"); + if (!isValid) return; - if (checklistRes.pos_open === 0) { - this.checkPosOpeningEntry(); - return; - } - - this.checkPosOpeningEntry(); - }) - .catch((error) => { - console.error("Checklist check failed", error); - this.checkPosOpeningEntry(); - }); + this.checkPosOpeningEntry(); } }, checkPosOpeningEntry() { @@ -231,35 +237,17 @@ export const useAuthStore = defineStore("auth", { }; this.call .get("ury.ury_pos.api.validate_pos_close", getPosProfile) - .then((result) => { + .then(async (result) => { if (result.message === "Failed") { - this.call - .get("ury.ury.api.pos_checklist.checklist") - .then((checklistRes) => { - if (checklistRes.checklist === 0) { - var currentDomain = window.location.origin; - this.alert.createAlert("Message", checklistRes.message || "Complete the checklist quality review", "OK").then(() => { - router.push("/PosClose"); - }); - return; - } else { - var currentDomain = window.location.origin; - this.alert - .createAlert("Message", "Please close previous POS Entry", "OK") - .then(() => { - router.push("/PosClose"); - }); - } - }) - .catch((error) => { - console.error(error) - // Fallback if checklist API fails - var currentDomain = window.location.origin; - this.alert - .createAlert("Message", "Please close previous POS Entry", "OK") - .then(() => { - router.push("/app"); - }); + const isValid = await this.validateChecklist("/PosClose", "Pos Closing Entry"); + if (!isValid) return; + + // Checklist valid, but POS still needs closing + var currentDomain = window.location.origin; + this.alert + .createAlert("Message", "Please close previous POS Entry", "OK") + .then(() => { + router.push("/PosClose"); }); } }) From 6dd4e25569095ce0c0aa487c04d0523f9cb562fa Mon Sep 17 00:00:00 2001 From: vyshnav mv Date: Thu, 22 Jan 2026 19:37:45 -0800 Subject: [PATCH 29/32] fix: removed repeat call in hook --- ury/hooks.py | 4 ++-- ury/ury/api/pos_checklist.py | 1 - ury/ury/hooks/ury_pos_closing_entry.py | 1 + ury/ury/hooks/ury_pos_opening_entry.py | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ury/hooks.py b/ury/hooks.py index 37eca739..fc9d41af 100644 --- a/ury/hooks.py +++ b/ury/hooks.py @@ -146,10 +146,10 @@ }, "POS Opening Entry": { - "validate": "ury.ury.hooks.ury_pos_opening_entry.set_cashier_room", + "validate": "ury.ury.hooks.ury_pos_opening_entry.validate", "before_save": "ury.ury.hooks.ury_pos_opening_entry.before_save", "before_insert": "ury.ury.api.ury_kot_order_number.set_last_invoice_in_pos_open", - "before_submit": "ury.ury.hooks.ury_pos_opening_entry.validate_pos_opening_quality_review", + }, "POS Closing Entry": { diff --git a/ury/ury/api/pos_checklist.py b/ury/ury/api/pos_checklist.py index 4c867adc..c9240b65 100644 --- a/ury/ury/api/pos_checklist.py +++ b/ury/ury/api/pos_checklist.py @@ -3,7 +3,6 @@ from ury.ury_pos.api import getBranch -@frappe.whitelist() @frappe.whitelist() def checklist(checklist_type="Pos Opening Entry"): today_date = today() diff --git a/ury/ury/hooks/ury_pos_closing_entry.py b/ury/ury/hooks/ury_pos_closing_entry.py index eda24f0c..213e3f49 100644 --- a/ury/ury/hooks/ury_pos_closing_entry.py +++ b/ury/ury/hooks/ury_pos_closing_entry.py @@ -8,6 +8,7 @@ def before_save(doc, method): def validate(doc, method): calculate_closing_amount(doc, method) validate_cashier(doc, method) + validate_pos_closing_quality_review(doc, method) def sub_pos_close_check(doc,method): diff --git a/ury/ury/hooks/ury_pos_opening_entry.py b/ury/ury/hooks/ury_pos_opening_entry.py index 7d802dbb..a48b86ae 100644 --- a/ury/ury/hooks/ury_pos_opening_entry.py +++ b/ury/ury/hooks/ury_pos_opening_entry.py @@ -4,6 +4,7 @@ def validate(doc,method): set_cashier_room(doc,method) + validate_pos_opening_quality_review(doc, method) def before_save(doc, method): main_pos_open_check(doc, method) From 35df555a51b0624d643e06409a5522d893c0c85e Mon Sep 17 00:00:00 2001 From: amnuoo Date: Fri, 23 Jan 2026 07:02:22 +0000 Subject: [PATCH 30/32] fix:Added role field to the daily quality check childtable --- ury/ury/api/pos_checklist.py | 98 +++++++------------ .../daily_quality_check.json | 13 ++- 2 files changed, 47 insertions(+), 64 deletions(-) diff --git a/ury/ury/api/pos_checklist.py b/ury/ury/api/pos_checklist.py index c9240b65..b5ce2565 100644 --- a/ury/ury/api/pos_checklist.py +++ b/ury/ury/api/pos_checklist.py @@ -4,93 +4,69 @@ @frappe.whitelist() -def checklist(checklist_type="Pos Opening Entry"): +def checklist(): today_date = today() employee = frappe.session.user branchName = getBranch() - # Find open POS entry pos_opening_list = frappe.get_all( "POS Opening Entry", filters={ "branch": branchName, "docstatus": 1, - "status": "Open", - "user": employee + "status": "Open" }, - fields=["posting_date", "pos_profile", "name"] + fields=["posting_date"] ) - # Determine POS status and posting date if not pos_opening_list: - pos_open = 0 - pos_posting_date = today_date - # Attempt to find POS Profile from branch if no opening entry - pos_profile_name = frappe.get_value("POS Profile", {"branch": branchName}, "name") - else: - pos_open = 1 - pos_posting_date = pos_opening_list[0].posting_date - pos_profile_name = pos_opening_list[0].pos_profile - - if not pos_profile_name: - return { - "pos_open": pos_open, - "checklist": 1, + return { + "pos_open": 0 } - # Fetch User Roles + pos_open = 1 + pos_posting_date = pos_opening_list[0].posting_date + user = frappe.get_doc("User", employee) - user_roles = [r.role for r in user.roles] + user_roles = user.roles + + pos_profile_name = frappe.get_value( + "POS Profile", + {"branch": branchName}, + "name" + ) - # Fetch POS Profile and Checklist Configuration pos_profile = frappe.get_doc("POS Profile", pos_profile_name) - daily_quality_check = pos_profile.custom_daily_quality_checking or [] + daily_quality_checklist = pos_profile.custom_daily_quality_checking + + if not daily_quality_checklist: + return { + "pos_open": pos_open, + "checklist": 1 + } - # Identify required checklists based on type and user role - to_submit_goals = [] - - for row in daily_quality_check: - if row.options != checklist_type: - continue - - quality_goal_name = row.checklist - if not quality_goal_name: - continue - - # We need the Quality Goal doc to check the assigned role - # Optimization: Could fetch all needed goals in one query if perf is issue - quality_goal = frappe.get_doc("Quality Goal", quality_goal_name) - - if quality_goal.custom_assigned_role in user_roles: - to_submit_goals.append(quality_goal) + to_submit_checklists = [] + for checklist in daily_quality_checklist: + for user_role in user_roles: + if checklist.role == user_role.role: + to_submit_checklists.append(checklist) - if not to_submit_goals: + if not to_submit_checklists: return { "pos_open": pos_open, "checklist": 1 } - all_checklists_submitted = True - - for goal in to_submit_goals: - # Check if a VALID (Open/Passed) Quality Review exists for this Goal - is_submitted = frappe.db.exists({ - "doctype": "Quality Review", - "goal": goal.name, # The Link field to Quality Goal - "date": pos_posting_date, - "owner": employee, - "docstatus": 1, # Must be submitted - "status": ["in", ["Open", "Passed"]] - }) - - if not is_submitted: - all_checklists_submitted = False - break + is_checklist_submitted = frappe.db.exists({ + "doctype": "Quality Review", + "date": pos_posting_date, + "status": ["in", ["Open", "Passed"]], + "owner": employee + }) return { "pos_open": pos_open, - "checklist": 1 if all_checklists_submitted else 0, - "checklist_doc": [], # Keeping key for frontend safety (though likely unused now) - "pos_posting_date": pos_posting_date, - "message": "Complete the checklist quality review" + "checklist": 1 if is_checklist_submitted else 0, + "checklist_doc": to_submit_checklists, + "pos_posting_date": pos_posting_date } diff --git a/ury/ury/doctype/daily_quality_check/daily_quality_check.json b/ury/ury/doctype/daily_quality_check/daily_quality_check.json index 7aab7712..fb4f04c4 100644 --- a/ury/ury/doctype/daily_quality_check/daily_quality_check.json +++ b/ury/ury/doctype/daily_quality_check/daily_quality_check.json @@ -7,7 +7,8 @@ "engine": "InnoDB", "field_order": [ "checklist", - "options" + "options", + "role" ], "fields": [ { @@ -22,14 +23,20 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Options", - "options": "Pos Opening Entry\nPos Closing Entry" + "options": "POS Opening Entry\nPOS Closing Entry\nOrder Taking\nRM Checklist" + }, + { + "fieldname": "role", + "fieldtype": "Link", + "label": "Role", + "options": "Role" } ], "grid_page_length": 50, "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2026-01-14 12:14:20.709494", + "modified": "2026-01-23 12:29:11.027868", "modified_by": "Administrator", "module": "URY", "name": "Daily Quality Check", From 04a441d8b293b42ccd99b43e24dc02c7fc629d0a Mon Sep 17 00:00:00 2001 From: vyshnav mv Date: Fri, 23 Jan 2026 02:05:11 -0800 Subject: [PATCH 31/32] add checklist_type parameter and Prevented opening checklist from blocking closing (alert showup ) --- ury/ury/api/pos_checklist.py | 23 ++++++++++++++--------- urypos/src/stores/Auth.js | 7 +------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ury/ury/api/pos_checklist.py b/ury/ury/api/pos_checklist.py index b5ce2565..60f4fdc2 100644 --- a/ury/ury/api/pos_checklist.py +++ b/ury/ury/api/pos_checklist.py @@ -4,7 +4,7 @@ @frappe.whitelist() -def checklist(): +def checklist(**kwargs): today_date = today() employee = frappe.session.user branchName = getBranch() @@ -19,13 +19,12 @@ def checklist(): fields=["posting_date"] ) - if not pos_opening_list: - return { - "pos_open": 0 - } - - pos_open = 1 - pos_posting_date = pos_opening_list[0].posting_date + if pos_opening_list: + pos_open = 1 + pos_posting_date = pos_opening_list[0].posting_date + else: + pos_open = 0 + pos_posting_date = today_date user = frappe.get_doc("User", employee) user_roles = user.roles @@ -35,6 +34,12 @@ def checklist(): {"branch": branchName}, "name" ) + + if not pos_profile_name: + return { + "pos_open": pos_open, + "checklist": 1 + } pos_profile = frappe.get_doc("POS Profile", pos_profile_name) daily_quality_checklist = pos_profile.custom_daily_quality_checking @@ -67,6 +72,6 @@ def checklist(): return { "pos_open": pos_open, "checklist": 1 if is_checklist_submitted else 0, - "checklist_doc": to_submit_checklists, + "checklist_name": [check.checklist for check in to_submit_checklists], "pos_posting_date": pos_posting_date } diff --git a/urypos/src/stores/Auth.js b/urypos/src/stores/Auth.js index eed257b8..bbdbc4d1 100644 --- a/urypos/src/stores/Auth.js +++ b/urypos/src/stores/Auth.js @@ -166,12 +166,7 @@ export const useAuthStore = defineStore("auth", { if (checklistRes.message.checklist === 0) { const currentDomain = window.location.origin; await this.alert.createAlert("Message", checklistRes.message.message || "Complete the checklist quality review", "OK"); - - if (redirectPath.startsWith("http")) { - window.location.href = redirectPath; - } else { - router.push(redirectPath); - } + window.location.href = window.location.origin + "/app"; return false; } return true; From 69009db2ffe7e167b1e61da8c73ee28795f978bc Mon Sep 17 00:00:00 2001 From: vyshnav mv Date: Fri, 23 Jan 2026 02:18:19 -0800 Subject: [PATCH 32/32] fix: user role comparison logic and syntax error in backend API. --- ury/ury/api/pos_checklist.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ury/ury/api/pos_checklist.py b/ury/ury/api/pos_checklist.py index 60f4fdc2..a3619f54 100644 --- a/ury/ury/api/pos_checklist.py +++ b/ury/ury/api/pos_checklist.py @@ -26,8 +26,7 @@ def checklist(**kwargs): pos_open = 0 pos_posting_date = today_date - user = frappe.get_doc("User", employee) - user_roles = user.roles + user_roles = frappe.get_roles(employee) pos_profile_name = frappe.get_value( "POS Profile", @@ -53,7 +52,7 @@ def checklist(**kwargs): to_submit_checklists = [] for checklist in daily_quality_checklist: for user_role in user_roles: - if checklist.role == user_role.role: + if checklist.role == user_role: to_submit_checklists.append(checklist) if not to_submit_checklists: