Added the rest of the Custom UI doctypes to code.

This commit is contained in:
Ben Nilsen 2026-01-30 12:22:47 -05:00
parent 1f416302d2
commit 84cd4f7beb
47 changed files with 1116 additions and 0 deletions

View File

@ -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": []
}

View File

@ -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

View File

@ -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": []
}

View File

@ -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

View File

@ -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": []
}

View File

@ -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

View File

@ -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) {
// },
// });

View File

@ -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": []
}

View File

@ -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

View File

@ -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

View File

@ -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": []
}

View File

@ -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

View File

@ -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) {
// },
// });

View File

@ -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": []
}

View File

@ -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

View File

@ -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

View File

@ -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": []
}

View File

@ -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

View File

@ -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": []
}

View File

@ -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

View File

@ -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": []
}

View File

@ -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

View File

@ -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": []
}

View File

@ -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

View File

@ -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": []
}

View File

@ -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

View File

@ -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) {
// },
// });

View File

@ -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": []
}

View File

@ -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

View File

@ -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

View File

@ -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) {
// },
// });

View File

@ -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": []
}

View File

@ -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

View File

@ -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