From 991038bc474de6a5fa0c7bf4662e6af5e80a75bd Mon Sep 17 00:00:00 2001 From: Casey Date: Thu, 5 Feb 2026 17:05:56 -0600 Subject: [PATCH] big package update --- custom_ui/api/db/items.py | 80 + custom_ui/events/payments.py | 16 + custom_ui/fixtures/custom_field.json | 2449 +++++++++++------ custom_ui/fixtures/doctype.json | 436 ++- custom_ui/fixtures/property_setter.json | 32 +- custom_ui/models/__init__.py | 3 +- custom_ui/models/item_models.py | 18 + custom_ui/services/__init__.py | 3 +- custom_ui/services/item_service.py | 174 +- custom_ui/services/project_service.py | 12 + frontend/src/api.js | 19 + .../src/components/common/ItemSelector.vue | 42 +- .../src/components/modals/AddItemModal.vue | 197 +- .../components/modals/SavePackageModal.vue | 382 +++ frontend/src/components/pages/Estimate.vue | 667 +++-- 15 files changed, 3282 insertions(+), 1248 deletions(-) create mode 100644 custom_ui/api/db/items.py create mode 100644 custom_ui/events/payments.py create mode 100644 custom_ui/models/item_models.py create mode 100644 custom_ui/services/project_service.py create mode 100644 frontend/src/components/modals/SavePackageModal.vue diff --git a/custom_ui/api/db/items.py b/custom_ui/api/db/items.py new file mode 100644 index 0000000..5bf397b --- /dev/null +++ b/custom_ui/api/db/items.py @@ -0,0 +1,80 @@ +import frappe +import json +from custom_ui.models import PackageCreationData +from custom_ui.services import ProjectService, ItemService +from custom_ui.db_utils import build_error_response, build_success_response + + +@frappe.whitelist() +def get_by_project_template(project_template: str) -> dict: + """Retrieve items associated with a given project template.""" + print(f"DEBUG: Getting items for Project Template {project_template}") + item_groups = ProjectService.get_project_item_groups(project_template) + items = ItemService.get_items_by_groups(item_groups) + print(f"DEBUG: Retrieved {len(items)} items for Project Template {project_template}") + categorized_items = ItemService.build_category_dict(items) + return build_success_response(categorized_items) + +@frappe.whitelist() +def save_as_package_item(data): + """Save a new Package Item based on the provided data.""" + from custom_ui.models import BOMItem + data = json.loads(data) + print(f"DEBUG: Saving Package Item with data: {data}") + # Map 'category' to 'item_group' for the model + data['item_group'] = data.pop('category') + # Convert items dictionaries to BOMItem instances + data['items'] = [ + BOMItem( + item_code=item['item_code'], + qty=item['qty'], + uom=item['uom'] + ) for item in data['items'] + ] + data = PackageCreationData(**data) + item = frappe.get_doc({ + "doctype": "Item", + "item_code": ItemService.build_item_code(data.code_prefix, data.package_name), + "item_name": data.package_name, + "is_stock_item": 0, + "item_group": data.item_group, + "description": data.description, + "standard_rate": data.rate or 0.0, + "company": data.company, + "has_variants": 0, + "stock_uom": "Nos", + "is_sales_item": 1, + "is_purchase_item": 0, + "is_pro_applicable": 0, + "is_fixed_asset": 0, + "is_service_item": 0 + }).insert() + bom = frappe.get_doc({ + "doctype": "BOM", + "item": item.name, + "uom": "Nos", + "is_active": 1, + "is_default": 1, + "items": [{ + "item_code": bom_item.item_code, + "qty": bom_item.qty, + "uom": bom_item.uom + } for bom_item in data.items] + }).insert() + bom.submit() + item.reload() # Refresh to get latest version after BOM submission + item.default_bom = bom.name + item.save() + print(f"DEBUG: Created Package Item with name: {item.name}") + item_dict = item.as_dict() + item_dict["bom"] = ItemService.get_full_bom_dict(item.item_code) # Attach BOM details to the item dict + return build_success_response(item_dict) + +@frappe.whitelist() +def get_item_categories(): + """Retrieve all item groups for categorization.""" + print("DEBUG: Getting item categories") + item_groups = frappe.get_all("Item Group", pluck="name") + print(f"DEBUG: Retrieved item categories: {item_groups}") + return build_success_response(item_groups) + diff --git a/custom_ui/events/payments.py b/custom_ui/events/payments.py new file mode 100644 index 0000000..f603fca --- /dev/null +++ b/custom_ui/events/payments.py @@ -0,0 +1,16 @@ +import frappe + +def on_submit(doc, method): + print("DEBUG: On Submit Triggered for Payment Entry") + is_advance_payment = any(ref.reference_doctype == "Sales Order" for ref in doc.references) + if is_advance_payment: + print("DEBUG: Payment Entry is for an advance payment, checking Sales Order if half down requirement is met.") + so_ref = next((ref for ref in doc.references if ref.reference_doctype == "Sales Order"), None) + if so_ref: + so_doc = frappe.get_doc("Sales Order", so_ref.reference_name) + if so_doc.requires_half_payment: + is_paid = doc.custom_halfdown_amount <= doc.advance_paid or doc.advance_paid >= so_doc.grand_total / 2 + if is_paid and not so_doc.custom_halfdown_is_paid: + print("DEBUG: Sales Order requires half payment and it has not been marked as paid, marking it as paid now.") + so_doc.custom_halfdown_is_paid = 1 + so_doc.save() \ No newline at end of file diff --git a/custom_ui/fixtures/custom_field.json b/custom_ui/fixtures/custom_field.json index f6789da..23060e9 100644 --- a/custom_ui/fixtures/custom_field.json +++ b/custom_ui/fixtures/custom_field.json @@ -1,4 +1,61 @@ [ + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": "0", + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "accept_payment", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "payments", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Accept Payment", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.157124", + "module": null, + "name": "Web Form-accept_payment", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 1, @@ -569,6 +626,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "GoCardless Mandate", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "customer", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "disabled", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Customer", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.542464", + "module": null, + "name": "GoCardless Mandate-customer", + "no_copy": 0, + "non_negative": 0, + "options": "Customer", + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -660,7 +774,7 @@ "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2026-01-26 01:52:42.708762", + "modified": "2026-02-02 09:31:53.016671", "module": null, "name": "Quotation-requires_half_payment", "no_copy": 0, @@ -1652,63 +1766,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Sales Order", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "custom_installation_address", - "fieldtype": "Link", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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_break0", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Installation Address", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2025-02-19 06:31:39.718110", - "module": null, - "name": "Sales Order-custom_installation_address", - "no_copy": 0, - "non_negative": 0, - "options": "Address", - "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 - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -1823,6 +1880,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_installation_address", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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_break0", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Installation Address", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-02-19 06:31:39.718110", + "module": null, + "name": "Sales Order-custom_installation_address", + "no_copy": 0, + "non_negative": 0, + "options": "Address", + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -1857,7 +1971,7 @@ "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2026-01-26 01:52:42.807278", + "modified": "2026-02-02 09:31:53.115073", "module": null, "name": "Sales Order-requires_half_payment", "no_copy": 0, @@ -2450,63 +2564,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Sales Order", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "custom_requires_halfdown", - "fieldtype": "Check", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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_installation_address", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Requires half-down", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2025-04-25 03:31:01.411093", - "module": null, - "name": "Sales Order-custom_requires_halfdown", - "no_copy": 0, - "non_negative": 0, - "options": null, - "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 - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -3533,6 +3590,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_requires_halfdown", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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_project_template", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Requires half-down", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-04-25 03:31:01.411093", + "module": null, + "name": "Sales Order-custom_requires_halfdown", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -6326,6 +6440,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_halfdown_is_paid", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "tax_id", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Half-down is paid", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-28 02:32:48.175435", + "module": null, + "name": "Sales Order-custom_halfdown_is_paid", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -6554,6 +6725,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_halfdown_amount", + "fieldtype": "Currency", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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_halfdown_is_paid", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Half-down amount", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-28 02:32:52.508018", + "module": null, + "name": "Sales Order-custom_halfdown_amount", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 1, @@ -6668,6 +6896,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Address", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "tax_category", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "fax", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Tax Category", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2018-12-28 22:29:21.828090", + "module": null, + "name": "Address-tax_category", + "no_copy": 0, + "non_negative": 0, + "options": "Tax Category", + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -6896,63 +7181,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Sales Order", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "custom_department_type", - "fieldtype": "Select", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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": "delivery_date", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Department Type", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2024-10-25 12:36:40.959573", - "module": null, - "name": "Sales Order-custom_department_type", - "no_copy": 0, - "non_negative": 0, - "options": "\nFencing Install\nWarranty\nSprinkler Service \nLandscape Installation\nLawn Maintenance\n\n", - "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": 1, - "unique": 0, - "width": null - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -7181,63 +7409,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Sales Order", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "custom_project_complete", - "fieldtype": "Check", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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_department_type", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Project Complete", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2025-04-18 10:32:51.404815", - "module": null, - "name": "Sales Order-custom_project_complete", - "no_copy": 0, - "non_negative": 0, - "options": null, - "permlevel": 0, - "placeholder": null, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": null, - "read_only": 1, - "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 - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -7302,15 +7473,15 @@ "collapsible": 0, "collapsible_depends_on": null, "columns": 0, - "default": null, + "default": "0", "depends_on": null, "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Contact", + "dt": "Project", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "is_billing_contact", + "fieldname": "requires_half_payment", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -7322,16 +7493,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "is_primary_contact", - "is_system_generated": 0, + "insert_after": "expected_end_time", + "is_system_generated": 1, "is_virtual": 0, - "label": "Is Billing Contact", + "label": "Requires Half Payment", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2019-12-02 11:00:03.432994", + "modified": "2026-02-02 09:31:53.269923", "module": null, - "name": "Contact-is_billing_contact", + "name": "Project-requires_half_payment", "no_copy": 0, "non_negative": 0, "options": null, @@ -7436,14 +7607,14 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "expected_end_time", + "insert_after": "is_half_down_paid", "is_system_generated": 1, "is_virtual": 0, "label": "Is Scheduled", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2026-01-26 01:52:42.896307", + "modified": "2026-02-02 09:31:53.201855", "module": null, "name": "Project-is_scheduled", "no_copy": 0, @@ -7637,6 +7808,120 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": "0", + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Project", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "is_half_down_paid", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "requires_half_payment", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Is Half Down Paid", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-02-02 09:31:53.356202", + "module": null, + "name": "Project-is_half_down_paid", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_department_type", + "fieldtype": "Select", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "delivery_date", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Department Type", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-10-25 12:36:40.959573", + "module": null, + "name": "Sales Order-custom_department_type", + "no_copy": 0, + "non_negative": 0, + "options": "\nFencing Install\nWarranty\nSprinkler Service \nLandscape Installation\nLawn Maintenance\n\n", + "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": 1, + "unique": 0, + "width": null + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -7751,120 +8036,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": "Not Ready", - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Project", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "invoice_status", - "fieldtype": "Select", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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": "is_scheduled", - "is_system_generated": 1, - "is_virtual": 0, - "label": "Invoice Status", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2026-01-26 01:52:42.399715", - "module": null, - "name": "Project-invoice_status", - "no_copy": 0, - "non_negative": 0, - "options": "Not Ready\nReady to Invoice\nInvoice Created\nInvoice Sent", - "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 - }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": "eval:doc.status == \"Completed\";", - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Project", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "custom_completion_date", - "fieldtype": "Date", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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": "invoice_status", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Completion Date", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2025-08-26 10:24:42.361467", - "module": null, - "name": "Project-custom_completion_date", - "no_copy": 0, - "non_negative": 0, - "options": null, - "permlevel": 0, - "placeholder": null, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": null, - "read_only": 1, - "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 - }, { "allow_in_quick_entry": 1, "allow_on_submit": 0, @@ -7922,6 +8093,120 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": "0", + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Address", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "is_your_company_address", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "linked_with", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Is Your Company Address", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2020-10-14 17:41:40.878179", + "module": null, + "name": "Address-is_your_company_address", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_project_complete", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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_department_type", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Project Complete", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-04-18 10:32:51.404815", + "module": null, + "name": "Sales Order-custom_project_complete", + "no_copy": 0, + "non_negative": 0, + "options": null, + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 1, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 1, @@ -7979,63 +8264,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": "0", - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Address", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "is_your_company_address", - "fieldtype": "Check", - "hidden": 1, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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_subdivision", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Is Your Company Address", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2020-10-14 17:41:40.878179", - "module": null, - "name": "Address-is_your_company_address", - "no_copy": 0, - "non_negative": 0, - "options": null, - "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 - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -8093,6 +8321,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": "Not Ready", + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Project", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "invoice_status", + "fieldtype": "Select", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "is_scheduled", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Invoice Status", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-26 01:52:42.399715", + "module": null, + "name": "Project-invoice_status", + "no_copy": 0, + "non_negative": 0, + "options": "Not Ready\nReady to Invoice\nInvoice Created\nInvoice Sent", + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -8272,15 +8557,15 @@ "collapsible_depends_on": null, "columns": 0, "default": null, - "depends_on": null, + "depends_on": "eval:doc.status == \"Completed\";", "description": null, "docstatus": 0, "doctype": "Custom Field", "dt": "Project", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_foreman", - "fieldtype": "Link", + "fieldname": "custom_completion_date", + "fieldtype": "Date", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -8291,26 +8576,26 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "priority", + "insert_after": "invoice_status", "is_system_generated": 0, "is_virtual": 0, - "label": "Foreman", + "label": "Completion Date", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-06-17 03:36:11.223101", + "modified": "2025-08-26 10:24:42.361467", "module": null, - "name": "Project-custom_foreman", + "name": "Project-custom_completion_date", "no_copy": 0, "non_negative": 0, - "options": "Employee", + "options": null, "permlevel": 0, "placeholder": null, "precision": "", "print_hide": 0, "print_hide_if_no_value": 0, "print_width": null, - "read_only": 0, + "read_only": 1, "read_only_depends_on": null, "report_hide": 0, "reqd": 0, @@ -8450,9 +8735,9 @@ "dt": "Project", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_hidden_fields", - "fieldtype": "Heading", - "hidden": 1, + "fieldname": "custom_foreman", + "fieldtype": "Link", + "hidden": 0, "hide_border": 0, "hide_days": 0, "hide_seconds": 0, @@ -8462,19 +8747,19 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_foreman", + "insert_after": "priority", "is_system_generated": 0, "is_virtual": 0, - "label": "Hidden Fields", + "label": "Foreman", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-06-17 03:37:21.354610", + "modified": "2025-06-17 03:36:11.223101", "module": null, - "name": "Project-custom_hidden_fields", + "name": "Project-custom_foreman", "no_copy": 0, "non_negative": 0, - "options": null, + "options": "Employee", "permlevel": 0, "placeholder": null, "precision": "", @@ -8675,11 +8960,11 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Sales Order", + "dt": "Project", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_section_break_htf05", - "fieldtype": "Section Break", + "fieldname": "custom_hidden_fields", + "fieldtype": "Heading", "hidden": 1, "hide_border": 0, "hide_days": 0, @@ -8690,16 +8975,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "amended_from", + "insert_after": "custom_foreman", "is_system_generated": 0, "is_virtual": 0, - "label": "", + "label": "Hidden Fields", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-02 05:36:39.898012", + "modified": "2025-06-17 03:37:21.354610", "module": null, - "name": "Sales Order-custom_section_break_htf05", + "name": "Project-custom_hidden_fields", "no_copy": 0, "non_negative": 0, "options": null, @@ -8834,63 +9119,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Sales Order", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "custom_workflow_related_custom_fields__landry", - "fieldtype": "Heading", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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_htf05", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Workflow related Custom Fields - Landry", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2024-11-02 05:36:40.282752", - "module": null, - "name": "Sales Order-custom_workflow_related_custom_fields__landry", - "no_copy": 0, - "non_negative": 0, - "options": null, - "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 - }, { "allow_in_quick_entry": 0, "allow_on_submit": 1, @@ -9005,6 +9233,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Contact", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "is_billing_contact", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "is_primary_contact", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Is Billing Contact", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2019-12-02 11:00:03.432994", + "module": null, + "name": "Contact-is_billing_contact", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -9077,9 +9362,9 @@ "dt": "Sales Order", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_coordinator_notification", - "fieldtype": "Check", - "hidden": 0, + "fieldname": "custom_section_break_htf05", + "fieldtype": "Section Break", + "hidden": 1, "hide_border": 0, "hide_days": 0, "hide_seconds": 0, @@ -9089,16 +9374,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_workflow_related_custom_fields__landry", + "insert_after": "amended_from", "is_system_generated": 0, "is_virtual": 0, - "label": "Coordinator Notification", + "label": "", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-02 05:37:13.329626", + "modified": "2024-11-02 05:36:39.898012", "module": null, - "name": "Sales Order-custom_coordinator_notification", + "name": "Sales Order-custom_section_break_htf05", "no_copy": 0, "non_negative": 0, "options": null, @@ -9119,63 +9404,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 1, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Sales Order", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "custom_sales_order_addon", - "fieldtype": "Table", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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_coordinator_notification", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Sales Order Add-On", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2024-11-02 05:54:28.750769", - "module": null, - "name": "Sales Order-custom_sales_order_addon", - "no_copy": 0, - "non_negative": 0, - "options": "Add-On Job Detail", - "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 - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -9245,34 +9473,34 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Project", - "fetch_from": "sales_order.dispatch_address_name", + "dt": "Sales Order", + "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_address", - "fieldtype": "Link", - "hidden": 1, + "fieldname": "custom_workflow_related_custom_fields__landry", + "fieldtype": "Heading", + "hidden": 0, "hide_border": 0, "hide_days": 0, "hide_seconds": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "is_active", + "insert_after": "custom_section_break_htf05", "is_system_generated": 0, "is_virtual": 0, - "label": "Address", + "label": "Workflow related Custom Fields - Landry", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-01-24 11:16:06.559672", + "modified": "2024-11-02 05:36:40.282752", "module": null, - "name": "Project-custom_address", + "name": "Sales Order-custom_workflow_related_custom_fields__landry", "no_copy": 0, "non_negative": 0, - "options": "Address", + "options": null, "permlevel": 0, "placeholder": null, "precision": "", @@ -9324,7 +9552,7 @@ "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2026-01-26 01:52:42.503478", + "modified": "2026-02-02 09:31:52.784947", "module": null, "name": "Address-latitude", "no_copy": 0, @@ -9359,12 +9587,12 @@ "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Project", + "dt": "Sales Order", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_section_break_lgkpd", - "fieldtype": "Section Break", - "hidden": 1, + "fieldname": "custom_coordinator_notification", + "fieldtype": "Check", + "hidden": 0, "hide_border": 0, "hide_days": 0, "hide_seconds": 0, @@ -9374,16 +9602,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_address", + "insert_after": "custom_workflow_related_custom_fields__landry", "is_system_generated": 0, "is_virtual": 0, - "label": "", + "label": "Coordinator Notification", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-02 06:56:14.687381", + "modified": "2024-11-02 05:37:13.329626", "module": null, - "name": "Project-custom_section_break_lgkpd", + "name": "Sales Order-custom_coordinator_notification", "no_copy": 0, "non_negative": 0, "options": null, @@ -9438,7 +9666,7 @@ "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2026-01-26 01:52:42.600227", + "modified": "2026-02-02 09:31:52.905949", "module": null, "name": "Address-longitude", "no_copy": 0, @@ -9518,6 +9746,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_sales_order_addon", + "fieldtype": "Table", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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_coordinator_notification", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Sales Order Add-On", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-11-02 05:54:28.750769", + "module": null, + "name": "Sales Order-custom_sales_order_addon", + "no_copy": 0, + "non_negative": 0, + "options": "Add-On Job Detail", + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -9531,33 +9816,33 @@ "docstatus": 0, "doctype": "Custom Field", "dt": "Project", - "fetch_from": null, + "fetch_from": "sales_order.dispatch_address_name", "fetch_if_empty": 0, - "fieldname": "custom_workflow_related_custom_fields__landry", - "fieldtype": "Heading", - "hidden": 0, + "fieldname": "custom_address", + "fieldtype": "Link", + "hidden": 1, "hide_border": 0, "hide_days": 0, "hide_seconds": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_section_break_lgkpd", + "insert_after": "is_active", "is_system_generated": 0, "is_virtual": 0, - "label": "Workflow related custom fields - Landry", + "label": "Address", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-02 06:56:14.941205", + "modified": "2025-01-24 11:16:06.559672", "module": null, - "name": "Project-custom_workflow_related_custom_fields__landry", + "name": "Project-custom_address", "no_copy": 0, "non_negative": 0, - "options": null, + "options": "Address", "permlevel": 0, "placeholder": null, "precision": "", @@ -9746,63 +10031,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": "Permit Pending", - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Project", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "custom_permit_status", - "fieldtype": "Select", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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": "custom_workflow_related_custom_fields__landry", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Permit Status", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2024-11-02 06:56:15.183277", - "module": null, - "name": "Project-custom_permit_status", - "no_copy": 0, - "non_negative": 0, - "options": "Not necessary\nPermit Pending\nPermit Obtained\nPermit Issue", - "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": 1, - "unique": 0, - "width": null - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -9860,6 +10088,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Project", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_section_break_lgkpd", + "fieldtype": "Section Break", + "hidden": 1, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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_address", + "is_system_generated": 0, + "is_virtual": 0, + "label": "", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-11-02 06:56:14.687381", + "module": null, + "name": "Project-custom_section_break_lgkpd", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -10095,7 +10380,7 @@ "collapsible": 0, "collapsible_depends_on": null, "columns": 0, - "default": "Locate incomplete", + "default": null, "depends_on": null, "description": null, "docstatus": 0, @@ -10103,8 +10388,8 @@ "dt": "Project", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_utlity_locate_status", - "fieldtype": "Select", + "fieldname": "custom_workflow_related_custom_fields__landry", + "fieldtype": "Heading", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -10112,22 +10397,22 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_global_search": 0, - "in_list_view": 1, + "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_permit_status", + "insert_after": "custom_section_break_lgkpd", "is_system_generated": 0, "is_virtual": 0, - "label": "Utlity Locate Status", + "label": "Workflow related custom fields - Landry", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-02 07:07:12.654207", + "modified": "2024-11-02 06:56:14.941205", "module": null, - "name": "Project-custom_utlity_locate_status", + "name": "Project-custom_workflow_related_custom_fields__landry", "no_copy": 0, "non_negative": 0, - "options": "Locate incomplete\nNeed More Information\nLocate Not Necessary\nUtility Locate complete", + "options": null, "permlevel": 0, "placeholder": null, "precision": "", @@ -10141,7 +10426,7 @@ "search_index": 0, "show_dashboard": 0, "sort_options": 0, - "translatable": 1, + "translatable": 0, "unique": 0, "width": null }, @@ -10437,7 +10722,7 @@ "collapsible": 0, "collapsible_depends_on": null, "columns": 0, - "default": null, + "default": "Permit Pending", "depends_on": null, "description": null, "docstatus": 0, @@ -10445,8 +10730,8 @@ "dt": "Project", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "custom_crew_scheduling", - "fieldtype": "Table", + "fieldname": "custom_permit_status", + "fieldtype": "Select", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -10454,22 +10739,22 @@ "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_global_search": 0, - "in_list_view": 0, + "in_list_view": 1, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "custom_utlity_locate_status", + "insert_after": "custom_workflow_related_custom_fields__landry", "is_system_generated": 0, "is_virtual": 0, - "label": "Crew Scheduling", + "label": "Permit Status", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-11-04 11:51:00.400929", + "modified": "2024-11-02 06:56:15.183277", "module": null, - "name": "Project-custom_crew_scheduling", + "name": "Project-custom_permit_status", "no_copy": 0, "non_negative": 0, - "options": "Crew Schedule Detail", + "options": "Not necessary\nPermit Pending\nPermit Obtained\nPermit Issue", "permlevel": 0, "placeholder": null, "precision": "", @@ -10483,7 +10768,7 @@ "search_index": 0, "show_dashboard": 0, "sort_options": 0, - "translatable": 0, + "translatable": 1, "unique": 0, "width": null }, @@ -10601,6 +10886,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": "Locate incomplete", + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Project", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_utlity_locate_status", + "fieldtype": "Select", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "custom_permit_status", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Utlity Locate Status", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-11-02 07:07:12.654207", + "module": null, + "name": "Project-custom_utlity_locate_status", + "no_copy": 0, + "non_negative": 0, + "options": "Locate incomplete\nNeed More Information\nLocate Not Necessary\nUtility Locate complete", + "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": 1, + "unique": 0, + "width": null + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -10715,6 +11057,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Project", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "custom_crew_scheduling", + "fieldtype": "Table", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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_utlity_locate_status", + "is_system_generated": 0, + "is_virtual": 0, + "label": "Crew Scheduling", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-11-04 11:51:00.400929", + "module": null, + "name": "Project-custom_crew_scheduling", + "no_copy": 0, + "non_negative": 0, + "options": "Crew Schedule Detail", + "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 + }, { "allow_in_quick_entry": 1, "allow_on_submit": 0, @@ -11342,63 +11741,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Project", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "actual_start_time", - "fieldtype": "Time", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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": "actual_start_date", - "is_system_generated": 1, - "is_virtual": 0, - "label": "Actual Start Time", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2026-01-19 19:14:45.841411", - "module": null, - "name": "Project-actual_start_time", - "no_copy": 0, - "non_negative": 0, - "options": null, - "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 - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -11699,7 +12041,7 @@ "dt": "Project", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "actual_end_time", + "fieldname": "actual_start_time", "fieldtype": "Time", "hidden": 0, "hide_border": 0, @@ -11711,16 +12053,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "actual_end_date", + "insert_after": "actual_start_date", "is_system_generated": 1, "is_virtual": 0, - "label": "Actual End Time", + "label": "Actual Start Time", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2026-01-19 19:14:45.872272", + "modified": "2026-01-19 19:14:45.841411", "module": null, - "name": "Project-actual_end_time", + "name": "Project-actual_start_time", "no_copy": 0, "non_negative": 0, "options": null, @@ -11969,63 +12311,6 @@ "unique": 0, "width": null }, - { - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": null, - "columns": 0, - "default": null, - "depends_on": null, - "description": null, - "docstatus": 0, - "doctype": "Custom Field", - "dt": "Address", - "fetch_from": null, - "fetch_if_empty": 0, - "fieldname": "tax_category", - "fieldtype": "Link", - "hidden": 0, - "hide_border": 0, - "hide_days": 0, - "hide_seconds": 0, - "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": "fax", - "is_system_generated": 0, - "is_virtual": 0, - "label": "Tax Category", - "length": 0, - "link_filters": null, - "mandatory_depends_on": null, - "modified": "2018-12-28 22:29:21.828090", - "module": null, - "name": "Address-tax_category", - "no_copy": 0, - "non_negative": 0, - "options": "Tax Category", - "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 - }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -12041,8 +12326,8 @@ "dt": "Project", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "total_expense_claim", - "fieldtype": "Currency", + "fieldname": "actual_end_time", + "fieldtype": "Time", "hidden": 0, "hide_border": 0, "hide_days": 0, @@ -12053,16 +12338,16 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "total_costing_amount", + "insert_after": "actual_end_date", "is_system_generated": 1, "is_virtual": 0, - "label": "Total Expense Claim (via Expense Claims)", + "label": "Actual End Time", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2025-01-13 10:13:26.515040", + "modified": "2026-01-19 19:14:45.872272", "module": null, - "name": "Project-total_expense_claim", + "name": "Project-actual_end_time", "no_copy": 0, "non_negative": 0, "options": null, @@ -12072,7 +12357,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "print_width": null, - "read_only": 1, + "read_only": 0, "read_only_depends_on": null, "report_hide": 0, "reqd": 0, @@ -12368,6 +12653,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Project", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "total_expense_claim", + "fieldtype": "Currency", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "total_costing_amount", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Total Expense Claim (via Expense Claims)", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2025-01-13 10:13:26.515040", + "module": null, + "name": "Project-total_expense_claim", + "no_copy": 0, + "non_negative": 0, + "options": null, + "permlevel": 0, + "placeholder": null, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 1, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -12539,6 +12881,63 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "payments_tab", + "fieldtype": "Tab Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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_css", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Payments", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.079502", + "module": null, + "name": "Web Form-payments_tab", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -12653,6 +13052,234 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": "accept_payment", + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "payment_gateway", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "accept_payment", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Payment Gateway", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.189265", + "module": null, + "name": "Web Form-payment_gateway", + "no_copy": 0, + "non_negative": 0, + "options": "Payment Gateway", + "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 + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": "Buy Now", + "depends_on": "accept_payment", + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "payment_button_label", + "fieldtype": "Data", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "payment_gateway", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Button Label", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.223314", + "module": null, + "name": "Web Form-payment_button_label", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "payments_cb", + "fieldtype": "Column Break", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "payment_button_help", + "is_system_generated": 1, + "is_virtual": 0, + "label": null, + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.288776", + "module": null, + "name": "Web Form-payments_cb", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": "eval:doc.accept_payment && !doc.amount_based_on_field", + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "amount", + "fieldtype": "Currency", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "amount_field", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Amount", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.387203", + "module": null, + "name": "Web Form-amount", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, @@ -12775,14 +13402,71 @@ "collapsible_depends_on": null, "columns": 0, "default": null, - "depends_on": null, + "depends_on": "accept_payment", "description": null, "docstatus": 0, "doctype": "Custom Field", - "dt": "Sales Order", + "dt": "Web Form", "fetch_from": null, "fetch_if_empty": 0, - "fieldname": "exempt_from_sales_tax", + "fieldname": "payment_button_help", + "fieldtype": "Text", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "payment_button_label", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Button Help", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.256345", + "module": null, + "name": "Web Form-payment_button_help", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": "0", + "depends_on": "accept_payment", + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "amount_based_on_field", "fieldtype": "Check", "hidden": 0, "hide_border": 0, @@ -12794,16 +13478,73 @@ "in_list_view": 0, "in_preview": 0, "in_standard_filter": 0, - "insert_after": "taxes_and_charges", + "insert_after": "payments_cb", "is_system_generated": 1, "is_virtual": 0, - "label": "Is customer exempted from sales tax?", + "label": "Amount Based On Field", "length": 0, "link_filters": null, "mandatory_depends_on": null, - "modified": "2024-04-03 13:53:07.674608", + "modified": "2026-01-27 11:11:05.321231", "module": null, - "name": "Sales Order-exempt_from_sales_tax", + "name": "Web Form-amount_based_on_field", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": "eval:doc.accept_payment && doc.amount_based_on_field", + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "amount_field", + "fieldtype": "Select", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "amount_based_on_field", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Amount Field", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.354178", + "module": null, + "name": "Web Form-amount_field", "no_copy": 0, "non_negative": 0, "options": null, @@ -12881,6 +13622,120 @@ "unique": 0, "width": null }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": "accept_payment", + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Web Form", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "currency", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "amount", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Currency", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2026-01-27 11:11:05.420470", + "module": null, + "name": "Web Form-currency", + "no_copy": 0, + "non_negative": 0, + "options": "Currency", + "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 + }, + { + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "docstatus": 0, + "doctype": "Custom Field", + "dt": "Sales Order", + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "exempt_from_sales_tax", + "fieldtype": "Check", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "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": "taxes_and_charges", + "is_system_generated": 1, + "is_virtual": 0, + "label": "Is customer exempted from sales tax?", + "length": 0, + "link_filters": null, + "mandatory_depends_on": null, + "modified": "2024-04-03 13:53:07.674608", + "module": null, + "name": "Sales Order-exempt_from_sales_tax", + "no_copy": 0, + "non_negative": 0, + "options": null, + "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 + }, { "allow_in_quick_entry": 0, "allow_on_submit": 0, diff --git a/custom_ui/fixtures/doctype.json b/custom_ui/fixtures/doctype.json index b56d2a8..677343a 100644 --- a/custom_ui/fixtures/doctype.json +++ b/custom_ui/fixtures/doctype.json @@ -1408,8 +1408,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:12.948757", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:30.309793", "module": "CRM", "name": "Properties", "naming_rule": "By fieldname", @@ -3186,8 +3186,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.056788", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:30.432329", "module": "CRM", "name": "SNW Jobs", "naming_rule": "Autoincrement", @@ -4109,8 +4109,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.154567", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:30.520105", "module": "Projects", "name": "Work Schedule", "naming_rule": "", @@ -9151,8 +9151,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.303974", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:30.684330", "module": "CRM", "name": "Follow Up Checklist", "naming_rule": "By fieldname", @@ -9457,8 +9457,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.377143", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:30.760407", "module": "CRM", "name": "Follow Check List Fields", "naming_rule": "By fieldname", @@ -10147,8 +10147,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.498788", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:30.859914", "module": "Brotherton SOP", "name": "SOP-Documentation", "naming_rule": "Set by user", @@ -10348,8 +10348,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.568354", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:30.922266", "module": "Desk", "name": "SOP Notes", "naming_rule": "", @@ -10694,8 +10694,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.644007", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:30.991664", "module": "Desk", "name": "Tutorials", "naming_rule": "By fieldname", @@ -11064,8 +11064,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.714534", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.061659", "module": "Desk", "name": "Brotherton Meetings Scheduler", "naming_rule": "", @@ -11242,8 +11242,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.776408", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.124415", "module": "Desk", "name": "Meeting Participants", "naming_rule": "", @@ -11588,8 +11588,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.863897", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.204512", "module": "Desk", "name": "Add-On Job Detail", "naming_rule": "By fieldname", @@ -11870,8 +11870,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:13.938332", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.273908", "module": "Desk", "name": "Crew Schedule Detail", "naming_rule": "", @@ -12152,8 +12152,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.015669", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.342599", "module": "Setup", "name": "City", "naming_rule": "By fieldname", @@ -14738,8 +14738,8 @@ "make_attachments_public": 1, "max_attachments": 5, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.167954", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.484159", "module": "Projects", "name": "Fencing Job Queue", "naming_rule": "Set by user", @@ -15630,8 +15630,8 @@ "make_attachments_public": 1, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.271176", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.555530", "module": "Setup", "name": "Irrigation District", "naming_rule": "By fieldname", @@ -15808,8 +15808,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.346591", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.610090", "module": "Setup", "name": "Linked Companies", "naming_rule": "", @@ -16154,8 +16154,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.429267", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.668108", "module": "Contacts", "name": "Address Contact Role", "naming_rule": "", @@ -17056,6 +17056,70 @@ "unique": 0, "width": null }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "documentation_url": null, + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "is_virtual": 0, + "label": "Amended From", + "length": 0, + "link_filters": null, + "make_attachment_public": 0, + "mandatory_depends_on": null, + "max_height": null, + "no_copy": 1, + "non_negative": 0, + "oldfieldname": null, + "oldfieldtype": null, + "options": "Backflow Test Form", + "parent": "Backflow Test Form", + "parentfield": "fields", + "parenttype": "DocType", + "permlevel": 0, + "placeholder": null, + "precision": null, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 1, + "read_only_depends_on": null, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "show_dashboard": 0, + "show_on_timeline": 0, + "show_preview_popup": 0, + "sort_options": 0, + "translatable": 0, + "trigger": null, + "unique": 0, + "width": null + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -17140,8 +17204,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.536984", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.743894", "module": "Selling", "name": "Backflow Test Form", "naming_rule": "", @@ -17830,8 +17894,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.668256", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.827955", "module": "Selling", "name": "Pre-Built Routes", "naming_rule": "By \"Naming Series\" field", @@ -18351,8 +18415,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.752785", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:31.885625", "module": "Contacts", "name": "Assigned Address", "naming_rule": "By fieldname", @@ -19573,6 +19637,70 @@ "unique": 0, "width": null }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "documentation_url": null, + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "is_virtual": 0, + "label": "Amended From", + "length": 0, + "link_filters": null, + "make_attachment_public": 0, + "mandatory_depends_on": null, + "max_height": null, + "no_copy": 1, + "non_negative": 0, + "oldfieldname": null, + "oldfieldtype": null, + "options": "Locate Log", + "parent": "Locate Log", + "parentfield": "fields", + "parenttype": "DocType", + "permlevel": 0, + "placeholder": null, + "precision": null, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 1, + "read_only_depends_on": null, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "show_dashboard": 0, + "show_on_timeline": 0, + "show_preview_popup": 0, + "sort_options": 0, + "translatable": 0, + "trigger": null, + "unique": 0, + "width": null + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -19671,8 +19799,8 @@ "make_attachments_public": 1, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.894391", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.021173", "module": "Projects", "name": "Locate Log", "naming_rule": "", @@ -20243,6 +20371,70 @@ "unique": 0, "width": null }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": null, + "columns": 0, + "default": null, + "depends_on": null, + "description": null, + "documentation_url": null, + "fetch_from": null, + "fetch_if_empty": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "hide_border": 0, + "hide_days": 0, + "hide_seconds": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_preview": 0, + "in_standard_filter": 0, + "is_virtual": 0, + "label": "Amended From", + "length": 0, + "link_filters": null, + "make_attachment_public": 0, + "mandatory_depends_on": null, + "max_height": null, + "no_copy": 1, + "non_negative": 0, + "oldfieldname": null, + "oldfieldtype": null, + "options": "Backflow test report form", + "parent": "Backflow test report form", + "parentfield": "fields", + "parenttype": "DocType", + "permlevel": 0, + "placeholder": null, + "precision": null, + "print_hide": 1, + "print_hide_if_no_value": 0, + "print_width": null, + "read_only": 1, + "read_only_depends_on": null, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "show_dashboard": 0, + "show_on_timeline": 0, + "show_preview_popup": 0, + "sort_options": 0, + "translatable": 0, + "trigger": null, + "unique": 0, + "width": null + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -20327,8 +20519,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:14.974731", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.089145", "module": "Brotherton SOP", "name": "Backflow test report form", "naming_rule": "", @@ -20633,8 +20825,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.060171", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.161902", "module": "Accounts", "name": "QB Export Entry", "naming_rule": "Autoincrement", @@ -21171,8 +21363,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.161301", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.228299", "module": "Accounts", "name": "QB Export", "naming_rule": "Expression", @@ -21669,8 +21861,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.226771", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.288896", "module": "Desk", "name": "Custom Customer Address Link", "naming_rule": "", @@ -22015,8 +22207,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.293419", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.353749", "module": "Selling", "name": "On-Site Meeting", "naming_rule": "Expression", @@ -22193,8 +22385,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.349611", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.406321", "module": "Selling", "name": "Route Technician Assignment", "naming_rule": "", @@ -22347,8 +22539,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.412654", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.462798", "module": "Desk", "name": "Test Doctype", "naming_rule": "", @@ -22525,8 +22717,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.467707", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.512828", "module": "Custom", "name": "Lead Company Link", "naming_rule": "", @@ -22743,8 +22935,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.520767", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.565309", "module": "Custom UI", "name": "Customer Task Link", "naming_rule": "", @@ -22961,8 +23153,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.580338", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.619158", "module": "Custom UI", "name": "Address Task Link", "naming_rule": "", @@ -23115,8 +23307,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.635575", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.669515", "module": "Custom", "name": "Lead Companies Link", "naming_rule": "", @@ -23333,8 +23525,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.692709", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.723818", "module": "Custom", "name": "Address Project Link", "naming_rule": "", @@ -23551,8 +23743,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.753245", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.776210", "module": "Custom", "name": "Address Quotation Link", "naming_rule": "", @@ -23769,8 +23961,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.813569", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.828052", "module": "Custom", "name": "Address On-Site Meeting Link", "naming_rule": "", @@ -23987,8 +24179,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.869381", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.883125", "module": "Custom", "name": "Address Sales Order Link", "naming_rule": "", @@ -24141,8 +24333,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.926523", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.934024", "module": "Custom", "name": "Contact Address Link", "naming_rule": "", @@ -24295,8 +24487,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:15.982944", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:32.986817", "module": "Custom", "name": "Lead On-Site Meeting Link", "naming_rule": "", @@ -24897,8 +25089,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.051786", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.054497", "module": "Selling", "name": "Quotation Template", "naming_rule": "", @@ -25395,8 +25587,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.131703", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.128567", "module": "Selling", "name": "Quotation Template Item", "naming_rule": "", @@ -25549,8 +25741,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.186884", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.180500", "module": "Custom UI", "name": "Customer Company Link", "naming_rule": "", @@ -25703,8 +25895,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.242217", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.232445", "module": "Custom UI", "name": "Customer Address Link", "naming_rule": "", @@ -25857,8 +26049,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.295479", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.283358", "module": "Custom UI", "name": "Customer Contact Link", "naming_rule": "", @@ -26011,8 +26203,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.349430", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.334916", "module": "Custom", "name": "Address Contact Link", "naming_rule": "", @@ -26165,8 +26357,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.402648", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.388907", "module": "Custom", "name": "Customer On-Site Meeting Link", "naming_rule": "", @@ -26319,8 +26511,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.453671", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.442065", "module": "Custom", "name": "Customer Project Link", "naming_rule": "", @@ -26473,8 +26665,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.510653", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.493993", "module": "Custom", "name": "Customer Quotation Link", "naming_rule": "", @@ -26627,8 +26819,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.565855", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.547121", "module": "Custom", "name": "Customer Sales Order Link", "naming_rule": "", @@ -26781,8 +26973,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.623951", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.599872", "module": "Custom", "name": "Lead Address Link", "naming_rule": "", @@ -26935,8 +27127,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.678981", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.670663", "module": "Custom", "name": "Lead Contact Link", "naming_rule": "", @@ -27089,8 +27281,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.735725", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.723019", "module": "Custom", "name": "Lead Quotation Link", "naming_rule": "", @@ -27243,8 +27435,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.790139", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.773957", "module": "Custom", "name": "Address Company Link", "naming_rule": "", @@ -28229,8 +28421,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 10:35:03.150818", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.849415", "module": "Custom UI", "name": "Service Appointment", "naming_rule": "Expression", @@ -29303,8 +29495,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.929388", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.917771", "module": "Custom UI", "name": "Bid Meeting Note Form Field", "naming_rule": "", @@ -29713,8 +29905,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:16.999820", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:33.980734", "module": "Custom UI", "name": "Bid Meeting Note Form", "naming_rule": "", @@ -30595,8 +30787,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:17.067503", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:34.047833", "module": "Custom UI", "name": "Bid Meeting Note Field", "naming_rule": "", @@ -31005,8 +31197,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:17.135078", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:34.111266", "module": "Custom UI", "name": "Bid Meeting Note", "naming_rule": "", @@ -31183,8 +31375,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:17.193504", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:34.162346", "module": "Custom UI", "name": "Project Task Link", "naming_rule": "", @@ -31337,8 +31529,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:17.253714", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:34.224291", "module": "Custom UI", "name": "Condition", "naming_rule": "", @@ -31643,8 +31835,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": "c9094ea959c7b6ff11522d064fe04b35", - "modified": "2026-01-26 01:52:17.308226", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:34.278957", "module": "Custom UI", "name": "Bid Meeting Note Field Quantity", "naming_rule": "", @@ -32693,8 +32885,8 @@ "make_attachments_public": 0, "max_attachments": 0, "menu_index": null, - "migration_hash": null, - "modified": "2026-01-27 04:34:52.205293", + "migration_hash": "330c425fa522cd61f3e1012dfbe56f02", + "modified": "2026-02-02 09:31:34.354639", "module": "Custom UI", "name": "Service Address 2", "naming_rule": "", diff --git a/custom_ui/fixtures/property_setter.json b/custom_ui/fixtures/property_setter.json index f3d55ca..b966453 100644 --- a/custom_ui/fixtures/property_setter.json +++ b/custom_ui/fixtures/property_setter.json @@ -11583,22 +11583,6 @@ "row_name": null, "value": "1" }, - { - "default_value": null, - "doc_type": "Sales Order", - "docstatus": 0, - "doctype": "Property Setter", - "doctype_or_field": "DocType", - "field_name": null, - "is_system_generated": 0, - "modified": "2025-04-25 03:31:21.087382", - "module": null, - "name": "Sales Order-main-field_order", - "property": "field_order", - "property_type": "Data", - "row_name": null, - "value": "[\"customer_section\", \"column_break0\", \"custom_installation_address\", \"custom_requires_halfdown\", \"title\", \"naming_series\", \"customer\", \"customer_name\", \"tax_id\", \"column_break_7\", \"transaction_date\", \"order_type\", \"delivery_date\", \"custom_department_type\", \"custom_project_complete\", \"column_break1\", \"po_no\", \"po_date\", \"company\", \"skip_delivery_note\", \"amended_from\", \"custom_section_break_htf05\", \"custom_workflow_related_custom_fields__landry\", \"custom_coordinator_notification\", \"custom_sales_order_addon\", \"accounting_dimensions_section\", \"cost_center\", \"dimension_col_break\", \"project\", \"currency_and_price_list\", \"currency\", \"conversion_rate\", \"column_break2\", \"selling_price_list\", \"price_list_currency\", \"plc_conversion_rate\", \"ignore_pricing_rule\", \"sec_warehouse\", \"scan_barcode\", \"column_break_28\", \"set_warehouse\", \"reserve_stock\", \"items_section\", \"items\", \"section_break_31\", \"total_qty\", \"total_net_weight\", \"column_break_33\", \"base_total\", \"base_net_total\", \"column_break_33a\", \"total\", \"net_total\", \"taxes_section\", \"tax_category\", \"taxes_and_charges\", \"exempt_from_sales_tax\", \"column_break_38\", \"shipping_rule\", \"column_break_49\", \"incoterm\", \"named_place\", \"section_break_40\", \"taxes\", \"section_break_43\", \"base_total_taxes_and_charges\", \"column_break_46\", \"total_taxes_and_charges\", \"totals\", \"base_grand_total\", \"base_rounding_adjustment\", \"base_rounded_total\", \"base_in_words\", \"column_break3\", \"grand_total\", \"rounding_adjustment\", \"rounded_total\", \"in_words\", \"advance_paid\", \"disable_rounded_total\", \"section_break_48\", \"apply_discount_on\", \"base_discount_amount\", \"coupon_code\", \"column_break_50\", \"additional_discount_percentage\", \"discount_amount\", \"sec_tax_breakup\", \"other_charges_calculation\", \"packing_list\", \"packed_items\", \"pricing_rule_details\", \"pricing_rules\", \"contact_info\", \"billing_address_column\", \"customer_address\", \"address_display\", \"customer_group\", \"territory\", \"column_break_84\", \"contact_person\", \"contact_display\", \"contact_phone\", \"contact_mobile\", \"contact_email\", \"shipping_address_column\", \"shipping_address_name\", \"shipping_address\", \"column_break_93\", \"dispatch_address_name\", \"dispatch_address\", \"col_break46\", \"company_address\", \"column_break_92\", \"company_address_display\", \"payment_schedule_section\", \"payment_terms_section\", \"payment_terms_template\", \"payment_schedule\", \"terms_section_break\", \"tc_name\", \"terms\", \"more_info\", \"section_break_78\", \"status\", \"delivery_status\", \"per_delivered\", \"column_break_81\", \"per_billed\", \"per_picked\", \"billing_status\", \"sales_team_section_break\", \"sales_partner\", \"column_break7\", \"amount_eligible_for_commission\", \"commission_rate\", \"total_commission\", \"section_break1\", \"sales_team\", \"loyalty_points_redemption\", \"loyalty_points\", \"column_break_116\", \"loyalty_amount\", \"subscription_section\", \"from_date\", \"to_date\", \"column_break_108\", \"auto_repeat\", \"update_auto_repeat_reference\", \"printing_details\", \"letter_head\", \"group_same_items\", \"column_break4\", \"select_print_heading\", \"language\", \"additional_info_section\", \"is_internal_customer\", \"represents_company\", \"column_break_152\", \"source\", \"inter_company_order_reference\", \"campaign\", \"party_account_currency\", \"connections_tab\"]" - }, { "default_value": null, "doc_type": "Address", @@ -15134,5 +15118,21 @@ "property_type": "Data", "row_name": null, "value": "[\"custom_column_break_k7sgq\", \"custom_installation_address\", \"naming_series\", \"project_name\", \"job_address\", \"status\", \"custom_warranty_duration_days\", \"custom_warranty_expiration_date\", \"custom_warranty_information\", \"project_type\", \"percent_complete_method\", \"percent_complete\", \"column_break_5\", \"project_template\", \"expected_start_date\", \"expected_start_time\", \"expected_end_date\", \"expected_end_time\", \"is_scheduled\", \"invoice_status\", \"custom_completion_date\", \"priority\", \"custom_foreman\", \"custom_hidden_fields\", \"department\", \"service_appointment\", \"tasks\", \"is_active\", \"custom_address\", \"custom_section_break_lgkpd\", \"custom_workflow_related_custom_fields__landry\", \"custom_permit_status\", \"custom_utlity_locate_status\", \"custom_crew_scheduling\", \"customer_details\", \"customer\", \"column_break_14\", \"sales_order\", \"users_section\", \"users\", \"copied_from\", \"section_break0\", \"notes\", \"section_break_18\", \"actual_start_date\", \"actual_start_time\", \"actual_time\", \"column_break_20\", \"actual_end_date\", \"actual_end_time\", \"project_details\", \"estimated_costing\", \"total_costing_amount\", \"total_expense_claim\", \"total_purchase_cost\", \"company\", \"column_break_28\", \"total_sales_amount\", \"total_billable_amount\", \"total_billed_amount\", \"total_consumed_material_cost\", \"cost_center\", \"margin\", \"gross_margin\", \"column_break_37\", \"per_gross_margin\", \"monitor_progress\", \"collect_progress\", \"holiday_list\", \"frequency\", \"from_time\", \"to_time\", \"first_email\", \"second_email\", \"daily_time_to_send\", \"day_to_send\", \"weekly_time_to_send\", \"column_break_45\", \"subject\", \"message\"]" + }, + { + "default_value": null, + "doc_type": "Sales Order", + "docstatus": 0, + "doctype": "Property Setter", + "doctype_or_field": "DocType", + "field_name": null, + "is_system_generated": 0, + "modified": "2026-02-05 12:10:08.553140", + "module": null, + "name": "Sales Order-main-field_order", + "property": "field_order", + "property_type": "Data", + "row_name": null, + "value": "[\"customer_section\", \"column_break0\", \"custom_installation_address\", \"custom_job_address\", \"requires_half_payment\", \"custom_project_template\", \"custom_requires_halfdown\", \"title\", \"naming_series\", \"customer\", \"customer_name\", \"tax_id\", \"custom_halfdown_is_paid\", \"custom_halfdown_amount\", \"column_break_7\", \"transaction_date\", \"order_type\", \"delivery_date\", \"custom_department_type\", \"custom_project_complete\", \"column_break1\", \"po_no\", \"po_date\", \"company\", \"skip_delivery_note\", \"has_unit_price_items\", \"amended_from\", \"custom_section_break_htf05\", \"custom_workflow_related_custom_fields__landry\", \"custom_coordinator_notification\", \"custom_sales_order_addon\", \"accounting_dimensions_section\", \"cost_center\", \"dimension_col_break\", \"project\", \"currency_and_price_list\", \"currency\", \"conversion_rate\", \"column_break2\", \"selling_price_list\", \"price_list_currency\", \"plc_conversion_rate\", \"ignore_pricing_rule\", \"sec_warehouse\", \"scan_barcode\", \"last_scanned_warehouse\", \"column_break_28\", \"set_warehouse\", \"reserve_stock\", \"items_section\", \"items\", \"section_break_31\", \"total_qty\", \"total_net_weight\", \"column_break_33\", \"base_total\", \"base_net_total\", \"column_break_33a\", \"total\", \"net_total\", \"taxes_section\", \"tax_category\", \"taxes_and_charges\", \"exempt_from_sales_tax\", \"column_break_38\", \"shipping_rule\", \"column_break_49\", \"incoterm\", \"named_place\", \"section_break_40\", \"taxes\", \"section_break_43\", \"base_total_taxes_and_charges\", \"column_break_46\", \"total_taxes_and_charges\", \"totals\", \"base_grand_total\", \"base_rounding_adjustment\", \"base_rounded_total\", \"base_in_words\", \"column_break3\", \"grand_total\", \"rounding_adjustment\", \"rounded_total\", \"in_words\", \"advance_paid\", \"disable_rounded_total\", \"section_break_48\", \"apply_discount_on\", \"base_discount_amount\", \"coupon_code\", \"column_break_50\", \"additional_discount_percentage\", \"discount_amount\", \"sec_tax_breakup\", \"other_charges_calculation\", \"packing_list\", \"packed_items\", \"pricing_rule_details\", \"pricing_rules\", \"contact_info\", \"billing_address_column\", \"customer_address\", \"address_display\", \"customer_group\", \"territory\", \"column_break_84\", \"contact_person\", \"contact_display\", \"contact_phone\", \"contact_mobile\", \"contact_email\", \"shipping_address_column\", \"shipping_address_name\", \"shipping_address\", \"column_break_93\", \"dispatch_address_name\", \"dispatch_address\", \"col_break46\", \"company_address\", \"column_break_92\", \"company_contact_person\", \"company_address_display\", \"payment_schedule_section\", \"payment_terms_section\", \"payment_terms_template\", \"payment_schedule\", \"terms_section_break\", \"tc_name\", \"terms\", \"more_info\", \"section_break_78\", \"status\", \"delivery_status\", \"per_delivered\", \"column_break_81\", \"per_billed\", \"per_picked\", \"billing_status\", \"sales_team_section_break\", \"sales_partner\", \"column_break7\", \"amount_eligible_for_commission\", \"commission_rate\", \"total_commission\", \"section_break1\", \"sales_team\", \"loyalty_points_redemption\", \"loyalty_points\", \"column_break_116\", \"loyalty_amount\", \"subscription_section\", \"from_date\", \"to_date\", \"column_break_108\", \"auto_repeat\", \"update_auto_repeat_reference\", \"printing_details\", \"letter_head\", \"group_same_items\", \"column_break4\", \"select_print_heading\", \"language\", \"additional_info_section\", \"is_internal_customer\", \"represents_company\", \"column_break_152\", \"source\", \"inter_company_order_reference\", \"campaign\", \"party_account_currency\", \"connections_tab\"]" } ] \ No newline at end of file diff --git a/custom_ui/models/__init__.py b/custom_ui/models/__init__.py index c0134af..cf24148 100644 --- a/custom_ui/models/__init__.py +++ b/custom_ui/models/__init__.py @@ -1 +1,2 @@ -from .payments import PaymentData \ No newline at end of file +from .payments import PaymentData +from .item_models import BOMItem, PackageCreationData \ No newline at end of file diff --git a/custom_ui/models/item_models.py b/custom_ui/models/item_models.py new file mode 100644 index 0000000..b7e58cc --- /dev/null +++ b/custom_ui/models/item_models.py @@ -0,0 +1,18 @@ +from dataclasses import dataclass + +@dataclass +class BOMItem: + item_code: str + qty: float + uom: str + item_name: str = None + +@dataclass +class PackageCreationData: + package_name: str + items: list[BOMItem] + item_group: str + code_prefix: str + rate: float = 0.0 + company: str = None + description: str = None \ No newline at end of file diff --git a/custom_ui/services/__init__.py b/custom_ui/services/__init__.py index d5fafc8..409e0b0 100644 --- a/custom_ui/services/__init__.py +++ b/custom_ui/services/__init__.py @@ -8,4 +8,5 @@ from .task_service import TaskService from .service_appointment_service import ServiceAppointmentService from .stripe_service import StripeService from .payment_service import PaymentService -from .item_service import ItemService \ No newline at end of file +from .item_service import ItemService +from .project_service import ProjectService \ No newline at end of file diff --git a/custom_ui/services/item_service.py b/custom_ui/services/item_service.py index 4e4e3de..d6e10c3 100644 --- a/custom_ui/services/item_service.py +++ b/custom_ui/services/item_service.py @@ -24,9 +24,11 @@ class ItemService: print(f"DEBUG: Getting BOM for Item {item_code}") bom_name = frappe.db.get_value("BOM", {"item": item_code, "is_active": 1}, "name") bom_dict = frappe.get_doc("BOM", bom_name).as_dict() - for item in bom_dict.get('exploded_items', []): - item_bom_name = frappe.get_value("Item", item["item_name"], "default_bom") - item["bom"] = frappe.get_doc("BOM", item_bom_name).as_dict() if item_bom_name else None + for item in bom_dict.get('items', []): + bom_no = item.get("bom_no") + if bom_no: + bom_item_code = frappe.db.get_value("BOM", bom_no, "item") + item["bom"] = ItemService.get_full_bom_dict(bom_item_code) return bom_dict @staticmethod @@ -35,4 +37,168 @@ class ItemService: print(f"DEBUG: Checking existence of Item {item_code}") exists = frappe.db.exists("Item", item_code) is not None print(f"DEBUG: Item {item_code} exists: {exists}") - return exists \ No newline at end of file + return exists + + @staticmethod + def get_child_groups(item_group: str) -> list[str]: + """Retrieve all child item groups of a given item group.""" + print(f"DEBUG: Getting child groups for Item Group {item_group}") + children = [] + child_groups = frappe.get_all("Item Group", filters={"parent_item_group": item_group}, pluck="name") + if child_groups: + children.extend(child_groups) + print(f"DEBUG: Found child groups: {child_groups}. Checking for further children.") + for child_group in child_groups: + additional_child_groups = ItemService.get_child_groups(child_group) + children.extend(additional_child_groups) + + print(f"DEBUG: Retrieved child groups: {child_groups}") + return children + + @staticmethod + def get_item_names_by_group(item_groups: set[str]) -> list[str]: + """Retrieve item names for items belonging to the specified item groups.""" + print(f"DEBUG: Getting item names for Item Groups {item_groups}") + items = frappe.get_all("Item", filters={"item_group": ["in", list(item_groups)]}, pluck="name") + print(f"DEBUG: Retrieved item names: {items}") + return items + + @staticmethod + def get_items_by_groups(item_groups: list[str]) -> list[dict]: + """Retrieve all items belonging to the specified item groups.""" + print(f"DEBUG: Getting items for Item Groups {item_groups}") + all_groups = set(item_groups) + for group in item_groups: + all_groups.update(ItemService.get_child_groups(group)) + + # Batch fetch all items at once with all needed fields + items = frappe.get_all( + "Item", + filters={"item_group": ["in", list(all_groups)]}, + fields=[ + "name", "item_code", "item_name", "item_group", "description", + "standard_rate", "stock_uom", "default_bom" + ] + ) + + # Get all item codes that have BOMs + items_with_boms = [item for item in items if item.get("default_bom")] + item_codes_with_boms = [item["item_code"] for item in items_with_boms] + + # Batch fetch all BOMs and their nested structure + bom_dict = ItemService.batch_fetch_boms(item_codes_with_boms) if item_codes_with_boms else {} + + # Attach BOMs to items + for item in items: + if item.get("default_bom"): + item["bom"] = bom_dict.get(item["item_code"]) + else: + item["bom"] = None + + print(f"DEBUG: Retrieved {len(items)} items") + return items + + @staticmethod + def batch_fetch_boms(item_codes: list[str]) -> dict: + """Batch fetch all BOMs and build nested structure efficiently.""" + if not item_codes: + return {} + + print(f"DEBUG: Batch fetching BOMs for {len(item_codes)} items") + + # Fetch all active BOMs for the given items + boms = frappe.get_all( + "BOM", + filters={"item": ["in", item_codes], "is_active": 1}, + fields=["name", "item"] + ) + + if not boms: + return {} + + bom_names = [bom["name"] for bom in boms] + + # Fetch all BOM items (children) in one query + bom_items = frappe.get_all( + "BOM Item", + filters={"parent": ["in", bom_names]}, + fields=["parent", "item_code", "item_name", "qty", "uom", "bom_no"], + order_by="idx" + ) + + # Group BOM items by their parent BOM + bom_items_map = {} + nested_bom_items = set() + + for bom_item in bom_items: + parent = bom_item["parent"] + if parent not in bom_items_map: + bom_items_map[parent] = [] + bom_items_map[parent].append(bom_item) + + # Track which items have nested BOMs + if bom_item.get("bom_no"): + nested_bom_items.add(bom_item["item_code"]) + + # Recursively fetch nested BOMs if any + nested_bom_dict = {} + if nested_bom_items: + nested_bom_dict = ItemService.batch_fetch_boms(list(nested_bom_items)) + + # Build the result dictionary mapping item_code to its BOM structure + result = {} + for bom in boms: + bom_name = bom["name"] + item_code = bom["item"] + + items = bom_items_map.get(bom_name, []) + # Attach nested BOMs to items + for item in items: + if item.get("bom_no"): + item["bom"] = nested_bom_dict.get(item["item_code"]) + else: + item["bom"] = None + + result[item_code] = { + "name": bom_name, + "items": items + } + + return result + + @staticmethod + def build_category_dict(items: list[dict]) -> dict: + """Build a dictionary categorizing items by their item group.""" + print(f"DEBUG: Building category dictionary for items") + category_dict = {} + category_dict["Packages"] = {} + for item in items: + if item.get("bom"): + if item.get("item_group", "Uncategorized") not in category_dict["Packages"]: + category_dict["Packages"][item.get("item_group", "Uncategorized")] = [] + category_dict["Packages"][item.get("item_group", "Uncategorized")].append(item) + else: + category = item.get("item_group", "Uncategorized") + if category not in category_dict: + category_dict[category] = [] + category_dict[category].append(item) + print(f"DEBUG: Built category dictionary with categories: {list(category_dict.keys())}") + return category_dict + + @staticmethod + def build_item_code(prefix: str, item_name: str) -> str: + """Build a unique item code based on the provided prefix and item name.""" + print(f"DEBUG: Building item code with prefix: {prefix} and item name: {item_name}") + # Replace all " " with "-" and convert to uppercase + base_code = f"{prefix}-{item_name.replace(' ', '-').upper()}" + # Check for existing items with the same base code and append a number if necessary + existing_codes = frappe.get_all("Item", filters={"item_code": ["like", f"{base_code}-%"]}, pluck="item_code") + if base_code in existing_codes: + suffix = 1 + while f"{base_code}-{suffix}" in existing_codes: + suffix += 1 + final_code = f"{base_code}-{suffix}" + else: + final_code = base_code + print(f"DEBUG: Built item code: {final_code}") + return final_code \ No newline at end of file diff --git a/custom_ui/services/project_service.py b/custom_ui/services/project_service.py new file mode 100644 index 0000000..b7a23da --- /dev/null +++ b/custom_ui/services/project_service.py @@ -0,0 +1,12 @@ +import frappe + +class ProjectService: + + @staticmethod + def get_project_item_groups(project_template: str) -> list[str]: + """Retrieve item groups associated with a given project template.""" + print(f"DEBUG: Getting item groups for Project Template {project_template}") + item_groups_str = frappe.db.get_value("Project Template", project_template, "item_groups") or "" + item_groups = [item_group.strip() for item_group in item_groups_str.split(",") if item_group.strip()] + print(f"DEBUG: Retrieved item groups: {item_groups}") + return item_groups \ No newline at end of file diff --git a/frontend/src/api.js b/frontend/src/api.js index a1da164..7bbbb0f 100644 --- a/frontend/src/api.js +++ b/frontend/src/api.js @@ -19,6 +19,9 @@ const FRAPPE_GET_ESTIMATE_TEMPLATES_METHOD = "custom_ui.api.db.estimates.get_est const FRAPPE_CREATE_ESTIMATE_TEMPLATE_METHOD = "custom_ui.api.db.estimates.create_estimate_template"; const FRAPPE_GET_UNAPPROVED_ESTIMATES_COUNT_METHOD = "custom_ui.api.db.estimates.get_unapproved_estimates_count"; const FRAPPE_GET_ESTIMATES_HALF_DOWN_COUNT_METHOD = "custom_ui.api.db.estimates.get_estimates_half_down_count"; +// Item methods +const FRAPPE_SAVE_AS_PACKAGE_ITEM_METHOD = "custom_ui.api.db.items.save_as_package_item"; +const FRAPPE_GET_ITEMS_BY_PROJECT_TEMPLATE_METHOD = "custom_ui.api.db.items.get_by_project_template"; // Job methods const FRAPPE_GET_JOB_METHOD = "custom_ui.api.db.jobs.get_job"; const FRAPPE_GET_JOBS_METHOD = "custom_ui.api.db.jobs.get_jobs_table_data"; @@ -657,6 +660,22 @@ class Api { return await this.request(FRAPPE_GET_ADDRESSES_METHOD, { fields, filters }); } + // ============================================================================ + // ITEM/PACKAGE METHODS + // ============================================================================ + + static async getItemsByProjectTemplate(projectTemplate) { + return await this.request(FRAPPE_GET_ITEMS_BY_PROJECT_TEMPLATE_METHOD, { projectTemplate }); + } + + static async saveAsPackageItem(data) { + return await this.request(FRAPPE_SAVE_AS_PACKAGE_ITEM_METHOD, { data }); + } + + static async getItemCategories() { + return await this.request("custom_ui.api.db.items.get_item_categories"); + } + // ============================================================================ // SERVICE / ROUTE / TIMESHEET METHODS // ============================================================================ diff --git a/frontend/src/components/common/ItemSelector.vue b/frontend/src/components/common/ItemSelector.vue index 46ee774..12a26a8 100644 --- a/frontend/src/components/common/ItemSelector.vue +++ b/frontend/src/components/common/ItemSelector.vue @@ -4,17 +4,17 @@

{{ emptyMessage }}

-
+
{{ item.itemCode }} {{ item.itemName }} ${{ item.standardRate?.toFixed(2) || '0.00' }}
@@ -26,7 +26,7 @@ diff --git a/frontend/src/components/modals/AddItemModal.vue b/frontend/src/components/modals/AddItemModal.vue index ae70a8a..afb973c 100644 --- a/frontend/src/components/modals/AddItemModal.vue +++ b/frontend/src/components/modals/AddItemModal.vue @@ -25,15 +25,13 @@
+ + + Packages + {{ group }} - Packages - - - - - @@ -64,12 +62,10 @@ class="add-package-button" />
-
+
Bill of Materials:
-
- {{ bomItem.itemCode }} - {{ bomItem.itemName }} - Qty: {{ bomItem.qty }} +
+
@@ -78,6 +74,14 @@ + + + + @@ -102,7 +106,7 @@ + + diff --git a/frontend/src/components/pages/Estimate.vue b/frontend/src/components/pages/Estimate.vue index 4bb7a1d..8f4de74 100644 --- a/frontend/src/components/pages/Estimate.vue +++ b/frontend/src/components/pages/Estimate.vue @@ -67,43 +67,7 @@
- -
-
- -
- -
-
-
-
-
+
@@ -118,102 +82,137 @@ optionLabel="name" optionValue="name" placeholder="Select a project template" - :disabled="!isEditable || isProjectTemplateDisabled" + :disabled="!isEditable" fluid /> +
+ + Loading available items... +
-

Items

-
- X -
- Rate - -
-
- Discount -
-
- - -
-
-
+
+
+
+
+
+ Quantity + +
+ X +
+ Rate + +
+
+ Discount +
+
+ + +
+
+
+ Total: ${{ ((item.qty || 0) * (item.rate || 0) - (item.discountAmount || 0)).toFixed(2) }} +
+
+
+ +
- Total: ${{ ((item.qty || 0) * (item.rate || 0) - (item.discountAmount || 0)).toFixed(2) }} -
Total Cost: ${{ totalCost.toFixed(2) }} @@ -301,6 +300,14 @@ :quotation-items="quotationItems" @add-items="addSelectedItems" /> + +