import frappe from frappe import _ DOCTYPE = "Customer Onboarding Request" FIELDS = [ "name", "organisation_name", "trading_name", "customer_type", "business_tax_identifier", "contact_name", "email_id", "telephone", "submitted_address", "location", "product_interest", "initial_enquiry", "registration_source", "assisted_channel", "onboarding_status", "customer_match_result", "possible_existing_customer", "created_linked_customer", "created_linked_contact", "portal_access_status", "review_notes", "privacy_notice_acknowledged", "acknowledgement_timestamp", "privacy_notice_reference_version", "creation", "modified", "owner", ] def _filters(args): filters = {} status = args.get("status") if status and status != "All": filters["onboarding_status"] = status return filters @frappe.whitelist() def get_onboarding_summary(): return { "all": frappe.db.count(DOCTYPE), "submitted": frappe.db.count(DOCTYPE, {"onboarding_status": "Submitted"}), "under_review": frappe.db.count(DOCTYPE, {"onboarding_status": "Under Review"}), "approved": frappe.db.count(DOCTYPE, {"onboarding_status": "Approved"}), "completed": frappe.db.count(DOCTYPE, {"onboarding_status": "Completed"}), "rejected": frappe.db.count(DOCTYPE, {"onboarding_status": "Rejected"}), } @frappe.whitelist() def get_onboarding_requests(status=None, search=None, limit_start=0, limit_page_length=25): filters = _filters({"status": status}) fields = [ "name", "organisation_name", "trading_name", "contact_name", "email_id", "customer_type", "location", "onboarding_status", "customer_match_result", "portal_access_status", "creation", "modified", ] rows = frappe.get_list( DOCTYPE, filters=filters, fields=fields, order_by="modified desc", limit_start=int(limit_start or 0), limit_page_length=min(int(limit_page_length or 25), 100), ) if search: term = str(search).lower() rows = [ row for row in rows if term in " ".join(str(row.get(key) or "") for key in fields).lower() ] return rows @frappe.whitelist() def get_onboarding_request(name): if not name: frappe.throw(_("Request name is required.")) return frappe.get_doc(DOCTYPE, name).as_dict() @frappe.whitelist() def create_onboarding_request(data): data = frappe.parse_json(data) if isinstance(data, str) else (data or {}) allowed = {field: data.get(field) for field in FIELDS if field in data} allowed.pop("name", None) allowed["doctype"] = DOCTYPE allowed["onboarding_status"] = "Submitted" allowed["customer_match_result"] = "Not Checked" allowed["portal_access_status"] = "Not Provisioned" if not allowed.get("organisation_name"): frappe.throw(_("Organisation name is required.")) if not allowed.get("contact_name"): frappe.throw(_("Contact name is required.")) if not allowed.get("email_id"): frappe.throw(_("Email address is required.")) doc = frappe.get_doc(allowed) doc.insert() frappe.db.commit() return doc.name @frappe.whitelist() def update_onboarding_request(name, data): data = frappe.parse_json(data) if isinstance(data, str) else (data or {}) doc = frappe.get_doc(DOCTYPE, name) for field in FIELDS: if field in data and field not in {"name", "onboarding_status", "customer_match_result", "portal_access_status"}: doc.set(field, data[field]) doc.save() frappe.db.commit() return doc.as_dict()