diff --git a/custom_ui/events/sales_order.py b/custom_ui/events/sales_order.py index 4738e8d..1fffdb4 100644 --- a/custom_ui/events/sales_order.py +++ b/custom_ui/events/sales_order.py @@ -1,6 +1,16 @@ import frappe from custom_ui.services import DbService, AddressService, ClientService + +def on_save(doc, method): + print("DEBUG: on_save hook triggered for Sales Order", doc.name) + if doc.advance_paid >= doc.grand_total/2: + if doc.project and doc.half_down_required: + print("DEBUG: Advance payments exceed required threshold of half down, setting project half down paid.") + project = frappe.get_doc("Project", doc.project) + project.is_half_down_paid = True + + def before_insert(doc, method): print("DEBUG: before_insert hook triggered for Sales Order") # if doc.custom_project_template == "SNW Install": @@ -9,6 +19,7 @@ def before_insert(doc, method): # if "SNW Install" in [link.project_template for link in address_doc.sales_orders]: # raise frappe.ValidationError("A Sales Order with project template 'SNW Install' is already linked to this address.") + def on_submit(doc, method): print("DEBUG: Info from Sales Order") print(doc.custom_installation_address) @@ -29,7 +40,8 @@ def on_submit(doc, method): "custom_warranty_duration_days": 90, "customer": doc.customer, "job_address": doc.custom_job_address, - "sales_order": doc.name + "sales_order": doc.name, + "requires_half_payment": doc.requires_half_payment }) # attatch the job to the sales_order links new_job.insert() @@ -37,6 +49,7 @@ def on_submit(doc, method): except Exception as e: print("ERROR creating Project from Sales Order:", str(e)) + def after_insert(doc, method): print("DEBUG: after_insert hook triggered for Sales Order:", doc.name) AddressService.append_link_v2( @@ -49,6 +62,7 @@ def after_insert(doc, method): doc.customer, "sales_orders", {"sales_order": doc.name, "project_template": doc.custom_project_template} ) + def create_sales_invoice_from_sales_order(doc, method): pass # try: diff --git a/custom_ui/install.py b/custom_ui/install.py index f1e2041..c4a42ae 100644 --- a/custom_ui/install.py +++ b/custom_ui/install.py @@ -596,7 +596,7 @@ def add_custom_fields(): label="Is Scheduled", fieldtype="Check", default=0, - insert_after="expected_end_time" + insert_after="is_half_down_paid" ), dict( fieldname="invoice_status", @@ -606,6 +606,20 @@ def add_custom_fields(): options="Not Ready\nReady to Invoice\nInvoice Created\nInvoice Sent", insert_after="is_scheduled" ), + dict( + fieldname="requires_half_payment", + label="Requires Half Payment", + fieldtype="Check", + default=0, + insert_after="expected_end_time" + ), + dict( + fieldname="is_half_down_paid", + label="Is Half Down Paid", + fieldtype="Check", + default=0, + insert_after="requires_half_payment" + ), ], "Project Template": [ dict( @@ -1150,7 +1164,7 @@ def create_task_types(): "calculate_from": "Service Address 2", "trigger": "Completed", "triggering_doctype": "Service Address 2" - + }, { "title": "80 Day Lien Notice", @@ -1196,10 +1210,10 @@ def create_task_types(): }) doc.insert(ignore_permissions=True) - + frappe.db.commit() - + def create_tasks(): print("\n🔧 Creating default Tasks if they do not exist...") default_tasks = [ @@ -1223,7 +1237,7 @@ def create_tasks(): "priority": "High" } ] - + for task in default_tasks: if frappe.db.exists("Task", task["task_name"]): continue @@ -1237,7 +1251,7 @@ def create_tasks(): "type": task["type"] }) doc.insert(ignore_permissions=True) - + def create_project_templates(): """Create default Project Templates if they do not exist.""" print("\n🔧 Checking for default Project Templates...") @@ -1251,8 +1265,6 @@ def create_project_templates(): } ] } - -import frappe def create_bid_meeting_note_form_templates():