From 84cd4f7beb1649218e629114de8e9cb7a4b5af5a Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 30 Jan 2026 12:22:47 -0500 Subject: [PATCH] Added the rest of the Custom UI doctypes to code. --- .../doctype/address_task_link/__init__.py | 0 .../address_task_link/address_task_link.json | 43 +++++ .../address_task_link/address_task_link.py | 9 ++ .../bid_meeting_note_field/__init__.py | 0 .../bid_meeting_note_field.json | 108 +++++++++++++ .../bid_meeting_note_field.py | 9 ++ .../__init__.py | 0 .../bid_meeting_note_field_quantity.json | 50 ++++++ .../bid_meeting_note_field_quantity.py | 9 ++ .../doctype/bid_meeting_note_form/__init__.py | 0 .../bid_meeting_note_form.js | 8 + .../bid_meeting_note_form.json | 76 +++++++++ .../bid_meeting_note_form.py | 9 ++ .../test_bid_meeting_note_form.py | 9 ++ .../bid_meeting_note_form_field/__init__.py | 0 .../bid_meeting_note_form_field.json | 149 ++++++++++++++++++ .../bid_meeting_note_form_field.py | 9 ++ .../custom_ui/doctype/condition/__init__.py | 0 .../custom_ui/doctype/condition/condition.js | 8 + .../doctype/condition/condition.json | 43 +++++ .../custom_ui/doctype/condition/condition.py | 9 ++ .../doctype/condition/test_condition.py | 9 ++ .../doctype/customer_address_link/__init__.py | 0 .../customer_address_link.json | 34 ++++ .../customer_address_link.py | 9 ++ .../doctype/customer_company_link/__init__.py | 0 .../customer_company_link.json | 32 ++++ .../customer_company_link.py | 9 ++ .../doctype/customer_contact_link/__init__.py | 0 .../customer_contact_link.json | 34 ++++ .../customer_contact_link.py | 9 ++ .../doctype/customer_task_link/__init__.py | 0 .../customer_task_link.json | 43 +++++ .../customer_task_link/customer_task_link.py | 9 ++ .../doctype/project_task_link/__init__.py | 0 .../project_task_link/project_task_link.json | 36 +++++ .../project_task_link/project_task_link.py | 9 ++ .../doctype/service_address_2/__init__.py | 0 .../service_address_2/service_address_2.js | 8 + .../service_address_2/service_address_2.json | 145 +++++++++++++++++ .../service_address_2/service_address_2.py | 9 ++ .../test_service_address_2.py | 9 ++ .../doctype/service_appointment/__init__.py | 0 .../service_appointment.js | 8 + .../service_appointment.json | 138 ++++++++++++++++ .../service_appointment.py | 9 ++ .../test_service_appointment.py | 9 ++ 47 files changed, 1116 insertions(+) create mode 100644 custom_ui/custom_ui/doctype/address_task_link/__init__.py create mode 100644 custom_ui/custom_ui/doctype/address_task_link/address_task_link.json create mode 100644 custom_ui/custom_ui/doctype/address_task_link/address_task_link.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_field/__init__.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_field/bid_meeting_note_field.json create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_field/bid_meeting_note_field.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/__init__.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/bid_meeting_note_field_quantity.json create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/bid_meeting_note_field_quantity.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_form/__init__.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.js create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.json create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_form/test_bid_meeting_note_form.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_form_field/__init__.py create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_form_field/bid_meeting_note_form_field.json create mode 100644 custom_ui/custom_ui/doctype/bid_meeting_note_form_field/bid_meeting_note_form_field.py create mode 100644 custom_ui/custom_ui/doctype/condition/__init__.py create mode 100644 custom_ui/custom_ui/doctype/condition/condition.js create mode 100644 custom_ui/custom_ui/doctype/condition/condition.json create mode 100644 custom_ui/custom_ui/doctype/condition/condition.py create mode 100644 custom_ui/custom_ui/doctype/condition/test_condition.py create mode 100644 custom_ui/custom_ui/doctype/customer_address_link/__init__.py create mode 100644 custom_ui/custom_ui/doctype/customer_address_link/customer_address_link.json create mode 100644 custom_ui/custom_ui/doctype/customer_address_link/customer_address_link.py create mode 100644 custom_ui/custom_ui/doctype/customer_company_link/__init__.py create mode 100644 custom_ui/custom_ui/doctype/customer_company_link/customer_company_link.json create mode 100644 custom_ui/custom_ui/doctype/customer_company_link/customer_company_link.py create mode 100644 custom_ui/custom_ui/doctype/customer_contact_link/__init__.py create mode 100644 custom_ui/custom_ui/doctype/customer_contact_link/customer_contact_link.json create mode 100644 custom_ui/custom_ui/doctype/customer_contact_link/customer_contact_link.py create mode 100644 custom_ui/custom_ui/doctype/customer_task_link/__init__.py create mode 100644 custom_ui/custom_ui/doctype/customer_task_link/customer_task_link.json create mode 100644 custom_ui/custom_ui/doctype/customer_task_link/customer_task_link.py create mode 100644 custom_ui/custom_ui/doctype/project_task_link/__init__.py create mode 100644 custom_ui/custom_ui/doctype/project_task_link/project_task_link.json create mode 100644 custom_ui/custom_ui/doctype/project_task_link/project_task_link.py create mode 100644 custom_ui/custom_ui/doctype/service_address_2/__init__.py create mode 100644 custom_ui/custom_ui/doctype/service_address_2/service_address_2.js create mode 100644 custom_ui/custom_ui/doctype/service_address_2/service_address_2.json create mode 100644 custom_ui/custom_ui/doctype/service_address_2/service_address_2.py create mode 100644 custom_ui/custom_ui/doctype/service_address_2/test_service_address_2.py create mode 100644 custom_ui/custom_ui/doctype/service_appointment/__init__.py create mode 100644 custom_ui/custom_ui/doctype/service_appointment/service_appointment.js create mode 100644 custom_ui/custom_ui/doctype/service_appointment/service_appointment.json create mode 100644 custom_ui/custom_ui/doctype/service_appointment/service_appointment.py create mode 100644 custom_ui/custom_ui/doctype/service_appointment/test_service_appointment.py diff --git a/custom_ui/custom_ui/doctype/address_task_link/__init__.py b/custom_ui/custom_ui/doctype/address_task_link/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/address_task_link/address_task_link.json b/custom_ui/custom_ui/doctype/address_task_link/address_task_link.json new file mode 100644 index 0000000..18aa982 --- /dev/null +++ b/custom_ui/custom_ui/doctype/address_task_link/address_task_link.json @@ -0,0 +1,43 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:55.346772", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "task", + "project_template" + ], + "fields": [ + { + "fieldname": "task", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Task", + "options": "Task", + "reqd": 1 + }, + { + "fieldname": "project_template", + "fieldtype": "Link", + "label": "Project Template", + "options": "Project Template" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:19:28.268420", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Address Task Link", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/address_task_link/address_task_link.py b/custom_ui/custom_ui/doctype/address_task_link/address_task_link.py new file mode 100644 index 0000000..1e743b6 --- /dev/null +++ b/custom_ui/custom_ui/doctype/address_task_link/address_task_link.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class AddressTaskLink(Document): + pass diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_field/__init__.py b/custom_ui/custom_ui/doctype/bid_meeting_note_field/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_field/bid_meeting_note_field.json b/custom_ui/custom_ui/doctype/bid_meeting_note_field/bid_meeting_note_field.json new file mode 100644 index 0000000..742841d --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_field/bid_meeting_note_field.json @@ -0,0 +1,108 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:57.149313", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "label", + "type", + "value", + "order", + "value_doctype", + "available_options", + "include_available_options", + "row", + "column", + "conditional_on_field", + "conditional_on_value", + "doctype_label_field" + ], + "fields": [ + { + "fieldname": "label", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Label", + "reqd": 1 + }, + { + "fieldname": "type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Type", + "options": "Data\nText\nCheck\nDate\nDatetime\nTime\nSelect\nMulti-Select\nMulti-Select w/ Quantity", + "reqd": 1 + }, + { + "fieldname": "value", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Value", + "reqd": 1 + }, + { + "fieldname": "order", + "fieldtype": "Int", + "label": "Order" + }, + { + "description": "Holds the doctype if this field is a link to either a single doctype or a list of doctypes. If this field has a value, then the Value field will hold the name(s) of the Doctype(s)", + "fieldname": "value_doctype", + "fieldtype": "Data", + "label": "Doctype" + }, + { + "fieldname": "available_options", + "fieldtype": "Small Text", + "label": "Available Options" + }, + { + "default": "0", + "fieldname": "include_available_options", + "fieldtype": "Check", + "label": "Include Available Options" + }, + { + "fieldname": "row", + "fieldtype": "Int", + "label": "Row" + }, + { + "fieldname": "column", + "fieldtype": "Int", + "label": "Column" + }, + { + "fieldname": "conditional_on_field", + "fieldtype": "Data", + "label": "Conditional On Field" + }, + { + "fieldname": "conditional_on_value", + "fieldtype": "Data", + "label": "Conditional On Value" + }, + { + "fieldname": "doctype_label_field", + "fieldtype": "Data", + "label": "Doctype Label Field" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:17:35.393538", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Bid Meeting Note Field", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_field/bid_meeting_note_field.py b/custom_ui/custom_ui/doctype/bid_meeting_note_field/bid_meeting_note_field.py new file mode 100644 index 0000000..6550ba9 --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_field/bid_meeting_note_field.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class BidMeetingNoteField(Document): + pass diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/__init__.py b/custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/bid_meeting_note_field_quantity.json b/custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/bid_meeting_note_field_quantity.json new file mode 100644 index 0000000..227b2ba --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/bid_meeting_note_field_quantity.json @@ -0,0 +1,50 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:57.483855", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "quantity", + "meeting_note_field", + "item" + ], + "fields": [ + { + "fieldname": "quantity", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Quantity", + "reqd": 1 + }, + { + "fieldname": "meeting_note_field", + "fieldtype": "Link", + "label": "Meeting Note Field", + "options": "Bid Meeting Note Field", + "reqd": 1 + }, + { + "fieldname": "item", + "fieldtype": "Data", + "label": "Item", + "reqd": 1 + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:16:33.946022", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Bid Meeting Note Field Quantity", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/bid_meeting_note_field_quantity.py b/custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/bid_meeting_note_field_quantity.py new file mode 100644 index 0000000..aa8a7f5 --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_field_quantity/bid_meeting_note_field_quantity.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class BidMeetingNoteFieldQuantity(Document): + pass diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_form/__init__.py b/custom_ui/custom_ui/doctype/bid_meeting_note_form/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.js b/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.js new file mode 100644 index 0000000..f37f2fb --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.js @@ -0,0 +1,8 @@ +// Copyright (c) 2026, Shiloh Code LLC and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Bid Meeting Note Form", { +// refresh(frm) { + +// }, +// }); diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.json b/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.json new file mode 100644 index 0000000..23443a0 --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.json @@ -0,0 +1,76 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:57.052796", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "title", + "project_template", + "notes", + "fields", + "company" + ], + "fields": [ + { + "fieldname": "title", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Title", + "reqd": 1 + }, + { + "fieldname": "project_template", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Project Template", + "options": "Project Template", + "reqd": 1 + }, + { + "fieldname": "notes", + "fieldtype": "Small Text", + "label": "Notes" + }, + { + "fieldname": "fields", + "fieldtype": "Table", + "label": "Fields", + "options": "Bid Meeting Note Form Field", + "reqd": 1 + }, + { + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "options": "Company" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "links": [], + "modified": "2026-01-30 07:17:51.934698", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Bid Meeting Note Form", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.py b/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.py new file mode 100644 index 0000000..e1015a9 --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_form/bid_meeting_note_form.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class BidMeetingNoteForm(Document): + pass diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_form/test_bid_meeting_note_form.py b/custom_ui/custom_ui/doctype/bid_meeting_note_form/test_bid_meeting_note_form.py new file mode 100644 index 0000000..d1e341c --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_form/test_bid_meeting_note_form.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestBidMeetingNoteForm(FrappeTestCase): + pass diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_form_field/__init__.py b/custom_ui/custom_ui/doctype/bid_meeting_note_form_field/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_form_field/bid_meeting_note_form_field.json b/custom_ui/custom_ui/doctype/bid_meeting_note_form_field/bid_meeting_note_form_field.json new file mode 100644 index 0000000..82ce821 --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_form_field/bid_meeting_note_form_field.json @@ -0,0 +1,149 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:56.967496", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "label", + "type", + "options", + "required", + "default_value", + "read_only", + "order", + "help_text", + "doctype_for_select", + "include_options", + "conditional_on_field", + "conditional_on_value", + "doctype_label_field", + "row", + "column" + ], + "fields": [ + { + "fieldname": "label", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Label", + "reqd": 1 + }, + { + "fieldname": "type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Type", + "options": "Data\nText\nCheck\nDate\nDatetime\nTime\nSelect\nMulti-Select\nNumber\nMulti-Select w/ Quantity", + "reqd": 1 + }, + { + "allow_in_quick_entry": 1, + "description": "Comma separated options for select fields", + "fieldname": "options", + "fieldtype": "Small Text", + "in_list_view": 1, + "label": "Options" + }, + { + "allow_in_quick_entry": 1, + "default": "0", + "fieldname": "required", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Required" + }, + { + "allow_in_quick_entry": 1, + "fieldname": "default_value", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Default Value" + }, + { + "allow_in_quick_entry": 1, + "default": "0", + "fieldname": "read_only", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Read Only" + }, + { + "allow_in_quick_entry": 1, + "fieldname": "order", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Order" + }, + { + "allow_in_quick_entry": 1, + "fieldname": "help_text", + "fieldtype": "Small Text", + "in_list_view": 1, + "label": "Help Text" + }, + { + "allow_in_quick_entry": 1, + "description": "The doctype for a select or multi-select if it's options are doctypes.", + "fieldname": "doctype_for_select", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Doctype For Select" + }, + { + "default": "0", + "fieldname": "include_options", + "fieldtype": "Check", + "label": "Include Options" + }, + { + "description": "If a value is entered in this field, then the field this describes is conditional based on the value in the provided field. ", + "fieldname": "conditional_on_field", + "fieldtype": "Data", + "label": "Conditional On Field" + }, + { + "description": "The value in which conditional should evaluate to True. If no value is provided here and a value exists in Conditional On Field, then the condition will just simply be if \"truthy\" (meaning, not null, emtpy, false, or 0)", + "fieldname": "conditional_on_value", + "fieldtype": "Data", + "label": "Conditional On Value" + }, + { + "allow_in_quick_entry": 1, + "fieldname": "doctype_label_field", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Doctype Label Field" + }, + { + "allow_in_quick_entry": 1, + "fieldname": "row", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Row" + }, + { + "allow_in_quick_entry": 1, + "fieldname": "column", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Column" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:18:03.116131", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Bid Meeting Note Form Field", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/bid_meeting_note_form_field/bid_meeting_note_form_field.py b/custom_ui/custom_ui/doctype/bid_meeting_note_form_field/bid_meeting_note_form_field.py new file mode 100644 index 0000000..c918765 --- /dev/null +++ b/custom_ui/custom_ui/doctype/bid_meeting_note_form_field/bid_meeting_note_form_field.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class BidMeetingNoteFormField(Document): + pass diff --git a/custom_ui/custom_ui/doctype/condition/__init__.py b/custom_ui/custom_ui/doctype/condition/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/condition/condition.js b/custom_ui/custom_ui/doctype/condition/condition.js new file mode 100644 index 0000000..aa4607b --- /dev/null +++ b/custom_ui/custom_ui/doctype/condition/condition.js @@ -0,0 +1,8 @@ +// Copyright (c) 2026, Shiloh Code LLC and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Condition", { +// refresh(frm) { + +// }, +// }); diff --git a/custom_ui/custom_ui/doctype/condition/condition.json b/custom_ui/custom_ui/doctype/condition/condition.json new file mode 100644 index 0000000..bb10d4f --- /dev/null +++ b/custom_ui/custom_ui/doctype/condition/condition.json @@ -0,0 +1,43 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:57.401662", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "section_break_thqn" + ], + "fields": [ + { + "fieldname": "section_break_thqn", + "fieldtype": "Section Break" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "links": [], + "modified": "2026-01-30 07:16:50.657332", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Condition", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/condition/condition.py b/custom_ui/custom_ui/doctype/condition/condition.py new file mode 100644 index 0000000..7344fbb --- /dev/null +++ b/custom_ui/custom_ui/doctype/condition/condition.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class Condition(Document): + pass diff --git a/custom_ui/custom_ui/doctype/condition/test_condition.py b/custom_ui/custom_ui/doctype/condition/test_condition.py new file mode 100644 index 0000000..42ef290 --- /dev/null +++ b/custom_ui/custom_ui/doctype/condition/test_condition.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestCondition(FrappeTestCase): + pass diff --git a/custom_ui/custom_ui/doctype/customer_address_link/__init__.py b/custom_ui/custom_ui/doctype/customer_address_link/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/customer_address_link/customer_address_link.json b/custom_ui/custom_ui/doctype/customer_address_link/customer_address_link.json new file mode 100644 index 0000000..4a0d38b --- /dev/null +++ b/custom_ui/custom_ui/doctype/customer_address_link/customer_address_link.json @@ -0,0 +1,34 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:55.994487", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "address" + ], + "fields": [ + { + "fieldname": "address", + "fieldtype": "Link", + "label": "Address", + "options": "Address" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:19:08.403527", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Customer Address Link", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/customer_address_link/customer_address_link.py b/custom_ui/custom_ui/doctype/customer_address_link/customer_address_link.py new file mode 100644 index 0000000..050ae7c --- /dev/null +++ b/custom_ui/custom_ui/doctype/customer_address_link/customer_address_link.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class CustomerAddressLink(Document): + pass diff --git a/custom_ui/custom_ui/doctype/customer_company_link/__init__.py b/custom_ui/custom_ui/doctype/customer_company_link/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/customer_company_link/customer_company_link.json b/custom_ui/custom_ui/doctype/customer_company_link/customer_company_link.json new file mode 100644 index 0000000..661d2ac --- /dev/null +++ b/custom_ui/custom_ui/doctype/customer_company_link/customer_company_link.json @@ -0,0 +1,32 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:55.917998", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "section_break_flvp" + ], + "fields": [ + { + "fieldname": "section_break_flvp", + "fieldtype": "Section Break" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:19:19.758924", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Customer Company Link", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/customer_company_link/customer_company_link.py b/custom_ui/custom_ui/doctype/customer_company_link/customer_company_link.py new file mode 100644 index 0000000..b40b143 --- /dev/null +++ b/custom_ui/custom_ui/doctype/customer_company_link/customer_company_link.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class CustomerCompanyLink(Document): + pass diff --git a/custom_ui/custom_ui/doctype/customer_contact_link/__init__.py b/custom_ui/custom_ui/doctype/customer_contact_link/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/customer_contact_link/customer_contact_link.json b/custom_ui/custom_ui/doctype/customer_contact_link/customer_contact_link.json new file mode 100644 index 0000000..0f1c2fb --- /dev/null +++ b/custom_ui/custom_ui/doctype/customer_contact_link/customer_contact_link.json @@ -0,0 +1,34 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:56.069455", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "contact" + ], + "fields": [ + { + "fieldname": "contact", + "fieldtype": "Link", + "label": "Contact", + "options": "Contact" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:18:53.525528", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Customer Contact Link", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/customer_contact_link/customer_contact_link.py b/custom_ui/custom_ui/doctype/customer_contact_link/customer_contact_link.py new file mode 100644 index 0000000..5006e32 --- /dev/null +++ b/custom_ui/custom_ui/doctype/customer_contact_link/customer_contact_link.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class CustomerContactLink(Document): + pass diff --git a/custom_ui/custom_ui/doctype/customer_task_link/__init__.py b/custom_ui/custom_ui/doctype/customer_task_link/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/customer_task_link/customer_task_link.json b/custom_ui/custom_ui/doctype/customer_task_link/customer_task_link.json new file mode 100644 index 0000000..cc56722 --- /dev/null +++ b/custom_ui/custom_ui/doctype/customer_task_link/customer_task_link.json @@ -0,0 +1,43 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:55.271717", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "task", + "project_template" + ], + "fields": [ + { + "fieldname": "task", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Task", + "options": "Task", + "reqd": 1 + }, + { + "fieldname": "project_template", + "fieldtype": "Link", + "label": "Project Template", + "options": "Project Template" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:19:39.009804", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Customer Task Link", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/customer_task_link/customer_task_link.py b/custom_ui/custom_ui/doctype/customer_task_link/customer_task_link.py new file mode 100644 index 0000000..1747fab --- /dev/null +++ b/custom_ui/custom_ui/doctype/customer_task_link/customer_task_link.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class CustomerTaskLink(Document): + pass diff --git a/custom_ui/custom_ui/doctype/project_task_link/__init__.py b/custom_ui/custom_ui/doctype/project_task_link/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/project_task_link/project_task_link.json b/custom_ui/custom_ui/doctype/project_task_link/project_task_link.json new file mode 100644 index 0000000..572d62d --- /dev/null +++ b/custom_ui/custom_ui/doctype/project_task_link/project_task_link.json @@ -0,0 +1,36 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:57.326418", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "task" + ], + "fields": [ + { + "fieldname": "task", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Task", + "options": "Task", + "reqd": 1 + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2026-01-30 07:17:25.090887", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Project Task Link", + "owner": "Administrator", + "permissions": [], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/project_task_link/project_task_link.py b/custom_ui/custom_ui/doctype/project_task_link/project_task_link.py new file mode 100644 index 0000000..c7c35ae --- /dev/null +++ b/custom_ui/custom_ui/doctype/project_task_link/project_task_link.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class ProjectTaskLink(Document): + pass diff --git a/custom_ui/custom_ui/doctype/service_address_2/__init__.py b/custom_ui/custom_ui/doctype/service_address_2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/service_address_2/service_address_2.js b/custom_ui/custom_ui/doctype/service_address_2/service_address_2.js new file mode 100644 index 0000000..733839d --- /dev/null +++ b/custom_ui/custom_ui/doctype/service_address_2/service_address_2.js @@ -0,0 +1,8 @@ +// Copyright (c) 2026, Shiloh Code LLC and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Service Address 2", { +// refresh(frm) { + +// }, +// }); diff --git a/custom_ui/custom_ui/doctype/service_address_2/service_address_2.json b/custom_ui/custom_ui/doctype/service_address_2/service_address_2.json new file mode 100644 index 0000000..436e2b0 --- /dev/null +++ b/custom_ui/custom_ui/doctype/service_address_2/service_address_2.json @@ -0,0 +1,145 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2026-01-30 07:01:57.571003", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "expected_end_date", + "expected_end_time", + "actual_end_date", + "actual_end_time", + "project_template", + "project", + "status", + "expected_start_date", + "expected_start_time", + "actual_start_date", + "actual_start_time", + "customer", + "company", + "service_address", + "foreman" + ], + "fields": [ + { + "fieldname": "expected_end_date", + "fieldtype": "Date", + "label": "Expected End Date" + }, + { + "fieldname": "expected_end_time", + "fieldtype": "Time", + "label": "Expected End Time" + }, + { + "fieldname": "actual_end_date", + "fieldtype": "Date", + "label": "Actual End Date" + }, + { + "fieldname": "actual_end_time", + "fieldtype": "Time", + "label": "Actual End Time" + }, + { + "fieldname": "project_template", + "fieldtype": "Link", + "label": "Project Template", + "options": "Project Template" + }, + { + "fieldname": "project", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Project", + "options": "Project", + "reqd": 1 + }, + { + "default": "Open", + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Status", + "options": "Open\nScheduled\nStarted\nCompleted\nCanceled", + "reqd": 1 + }, + { + "fieldname": "expected_start_date", + "fieldtype": "Date", + "label": "Expected Start Date" + }, + { + "fieldname": "expected_start_time", + "fieldtype": "Time", + "label": "Expected Start Time" + }, + { + "fieldname": "actual_start_date", + "fieldtype": "Date", + "label": "Actual Start Date" + }, + { + "fieldname": "actual_start_time", + "fieldtype": "Time", + "label": "Actual Start Time" + }, + { + "fieldname": "customer", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Customer", + "options": "Customer", + "reqd": 1 + }, + { + "fieldname": "company", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Company", + "options": "Company", + "reqd": 1 + }, + { + "fieldname": "service_address", + "fieldtype": "Link", + "label": "Service Address", + "options": "Address", + "reqd": 1 + }, + { + "fieldname": "foreman", + "fieldtype": "Link", + "label": "Foreman", + "options": "Employee" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "links": [], + "modified": "2026-01-30 07:15:39.410145", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Service Address 2", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/service_address_2/service_address_2.py b/custom_ui/custom_ui/doctype/service_address_2/service_address_2.py new file mode 100644 index 0000000..8411c3a --- /dev/null +++ b/custom_ui/custom_ui/doctype/service_address_2/service_address_2.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class ServiceAddress2(Document): + pass diff --git a/custom_ui/custom_ui/doctype/service_address_2/test_service_address_2.py b/custom_ui/custom_ui/doctype/service_address_2/test_service_address_2.py new file mode 100644 index 0000000..8c60c43 --- /dev/null +++ b/custom_ui/custom_ui/doctype/service_address_2/test_service_address_2.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestServiceAddress2(FrappeTestCase): + pass diff --git a/custom_ui/custom_ui/doctype/service_appointment/__init__.py b/custom_ui/custom_ui/doctype/service_appointment/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/custom_ui/custom_ui/doctype/service_appointment/service_appointment.js b/custom_ui/custom_ui/doctype/service_appointment/service_appointment.js new file mode 100644 index 0000000..b37bf72 --- /dev/null +++ b/custom_ui/custom_ui/doctype/service_appointment/service_appointment.js @@ -0,0 +1,8 @@ +// Copyright (c) 2026, Shiloh Code LLC and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Service Appointment", { +// refresh(frm) { + +// }, +// }); diff --git a/custom_ui/custom_ui/doctype/service_appointment/service_appointment.json b/custom_ui/custom_ui/doctype/service_appointment/service_appointment.json new file mode 100644 index 0000000..b7f6ab4 --- /dev/null +++ b/custom_ui/custom_ui/doctype/service_appointment/service_appointment.json @@ -0,0 +1,138 @@ +{ + "actions": [], + "allow_rename": 1, + "autoname": "format:SA-{MM}-{YYYY}-{####}", + "creation": "2026-01-30 07:01:56.861733", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "expected_start_date", + "expected_end_date", + "project_template", + "project", + "actual_start_date", + "actual_end_date", + "expected_start_time", + "expected_end_time", + "actual_end_time", + "actual_start_time", + "status", + "customer", + "company", + "service_address" + ], + "fields": [ + { + "fieldname": "expected_start_date", + "fieldtype": "Date", + "label": "Expected Start Date" + }, + { + "fieldname": "expected_end_date", + "fieldtype": "Date", + "label": "Expected End Date" + }, + { + "fieldname": "project_template", + "fieldtype": "Link", + "label": "Project Template", + "options": "Project Template" + }, + { + "fieldname": "project", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Project", + "options": "Project", + "reqd": 1 + }, + { + "fieldname": "actual_start_date", + "fieldtype": "Date", + "label": "Actual Start Date" + }, + { + "fieldname": "actual_end_date", + "fieldtype": "Date", + "label": "Actual End Date" + }, + { + "fieldname": "expected_start_time", + "fieldtype": "Time", + "label": "Expected Start Time" + }, + { + "fieldname": "expected_end_time", + "fieldtype": "Time", + "label": "Expected End Time" + }, + { + "fieldname": "actual_end_time", + "fieldtype": "Time", + "label": "Actual End Time" + }, + { + "fieldname": "actual_start_time", + "fieldtype": "Time", + "label": "Actual Start Time" + }, + { + "default": "Open", + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Status", + "options": "Open\nScheduled\nStarted\nCompleted\nCanceled", + "reqd": 1 + }, + { + "fieldname": "customer", + "fieldtype": "Link", + "label": "Customer", + "options": "Customer", + "reqd": 1 + }, + { + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "options": "Company", + "reqd": 1 + }, + { + "fieldname": "service_address", + "fieldtype": "Link", + "label": "Service Address", + "options": "Address", + "reqd": 1 + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "links": [], + "modified": "2026-01-30 07:18:16.297996", + "modified_by": "Administrator", + "module": "Custom UI", + "name": "Service Appointment", + "naming_rule": "Expression", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/custom_ui/custom_ui/doctype/service_appointment/service_appointment.py b/custom_ui/custom_ui/doctype/service_appointment/service_appointment.py new file mode 100644 index 0000000..1e96ee3 --- /dev/null +++ b/custom_ui/custom_ui/doctype/service_appointment/service_appointment.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class ServiceAppointment(Document): + pass diff --git a/custom_ui/custom_ui/doctype/service_appointment/test_service_appointment.py b/custom_ui/custom_ui/doctype/service_appointment/test_service_appointment.py new file mode 100644 index 0000000..36a8b1f --- /dev/null +++ b/custom_ui/custom_ui/doctype/service_appointment/test_service_appointment.py @@ -0,0 +1,9 @@ +# Copyright (c) 2026, Shiloh Code LLC and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestServiceAppointment(FrappeTestCase): + pass