build meeting notes form in install on migrate

This commit is contained in:
Casey 2026-01-27 11:40:49 -06:00
parent 6cd3d138ad
commit c024e7fd86
12 changed files with 227 additions and 124 deletions

View file

@ -41,7 +41,7 @@ def after_migrate():
# create_project_templates()
create_task_types()
# create_tasks()
# create_bid_meeting_note_form_templates()
create_bid_meeting_note_form_templates()
# update_address_fields()
# build_frontend()
@ -1252,85 +1252,117 @@ def create_project_templates():
]
}
import frappe
def create_bid_meeting_note_form_templates():
"""Create Bid Meeting Note Forms if they do not exist."""
print("\n🔧 Checking for Bid Meeting Note Forms...")
forms = {
"Sprinklers Northwest": [
{
"name": "SNW Install Bid Meeting Notes",
{
"title": "SNW Install Bid Meeting Notes",
"description": "Notes form for SNW Install bid meetings.",
"project_template": "SNW Install",
"fields": [{
"label": "Locate Needed",
"type": "Check",
"required": 1,
"help_text": "Indicate if a locate is needed for this project.",
"row": 1,
"column": 1
},
{
"label": "Permit Needed",
"type": "Check",
"required": 1,
"help_text": "Indicate if a permit is needed for this project.",
"row": 1,
"column": 2
},
{
"label": "Back Flow Test Required",
"type": "Check",
"required": 1,
"help_text": "Indicate if a backflow test is required after installation.",
"row": 1,
"column": 3
},
{
"label": "Machine Access",
"type": "Check",
"required": 1,
"row": 2,
"column": 1
},
{
"label": "Machines",
"type": "Multi-Select",
"options": "MT, Skip Steer, Excavator-E-50, Link Belt, Tre?, Forks, Auger, Backhoe, Loader, Duzer",
"required": 0,
"include_options": 1,
"conditional_on_field": "Machine Access",
"row": 2,
"column": 2
},
{
"label": "Materials Required",
"type": "Check",
"required": 1,
"row": 3,
"column": 0
},
{
"label": "Materials",
"type": "Multi-Select w/ Quantity",
"required": 0,
"doctype_for_select": "Item",
"conditional_on_field": "Materials Required",
"doctype_label_field": "itemName",
"row": 4,
"column": 0
}]
}]}
"fields": [
{
"label": "Locate Needed",
"type": "Check",
"required": 1,
"help_text": "Indicate if a locate is needed for this project.",
"row": 1,
"column": 1,
},
{
"label": "Permit Needed",
"type": "Check",
"required": 1,
"help_text": "Indicate if a permit is needed for this project.",
"row": 1,
"column": 2,
},
{
"label": "Back Flow Test Required",
"type": "Check",
"required": 1,
"help_text": "Indicate if a backflow test is required after installation.",
"row": 1,
"column": 3,
},
{
"label": "Machine Access",
"type": "Check",
"required": 1,
"row": 2,
"column": 1,
},
{
"label": "Machines",
"type": "Multi-Select",
"options": "MT, Skip Steer, Excavator-E-50, Link Belt, Tre?, Forks, Auger, Backhoe, Loader, Duzer",
"include_options": 1,
"conditional_on_field": "Machine Access",
"row": 2,
"column": 2,
},
{
"label": "Materials Required",
"type": "Check",
"required": 1,
"row": 3,
"column": 0,
},
{
"label": "Materials",
"type": "Multi-Select w/ Quantity",
"doctype_for_select": "Item",
"doctype_label_field": "itemName",
"conditional_on_field": "Materials Required",
"row": 4,
"column": 0,
},
],
}
]
}
for company, form_list in forms.items():
for form in form_list:
if frappe.db.exists("Bid Meeting Note Form", form["name"]):
# Idempotency check
if frappe.db.exists(
"Bid Meeting Note Form",
{"title": form["title"], "company": company},
):
continue
doc = frappe.get_doc({
"doctype": "Bid Meeting Note Form",
"company": company,
"title": form["title"],
"description": form["description"],
"project_template": form["project_template"],
"fields": form["fields"]
})
doc = frappe.new_doc("Bid Meeting Note Form")
doc.company = company
doc.title = form["title"]
doc.description = form.get("description")
doc.project_template = form.get("project_template")
for idx, field in enumerate(form.get("fields", []), start=1):
doc.append(
"fields",
{
"label": field["label"],
"type": field["type"],
"options": field.get("options"),
"required": field.get("required", 0),
"default_value": field.get("default_value"),
"read_only": field.get("read_only", 0),
"order": field.get("order", 0),
"help_text": field.get("help_text"),
"doctype_for_select": field.get("doctype_for_select"),
"include_options": field.get("include_options", 0),
"conditional_on_field": field.get("conditional_on_field"),
"conditional_on_value": field.get("conditional_on_value"),
"doctype_label_field": field.get("doctype_label_field"),
"row": field.get("row"),
"column": field.get("column"),
"idx": idx,
},
)
doc.insert(ignore_permissions=True)