100 lines
3.5 KiB
Python
100 lines
3.5 KiB
Python
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()
|