def make_delivery_trip(source_name, target_doc=None): def update_stop_details(source_doc, target_doc, source_parent): target_doc.customer = source_parent.customer target_doc.address = source_parent.shipping_address_name target_doc.customer_address = source_parent.shipping_address target_doc.contact = source_parent.contact_person target_doc.customer_contact = source_parent.contact_display target_doc.grand_total = source_parent.grand_total # Append unique Delivery Notes in Delivery Trip delivery_notes.append(target_doc.delivery_note) delivery_notes = [] doclist = get_mapped_doc( "Delivery Note", source_name, { "Delivery Note": { "doctype": "Delivery Trip", "validation": { "docstatus": ["=", 1] } }, "Delivery Note Item": { "doctype": "Delivery Stop", "field_map": { "parent": "delivery_note" }, "condition": lambda item: item.parent not in delivery_notes, "postprocess": update_stop_details } }, target_doc) return doclist
def make_maintenance_visit(source_name, target_doc=None): from dataent.model.mapper import get_mapped_doc, map_child_doc def _update_links(source_doc, target_doc, source_parent): target_doc.prevdoc_doctype = source_parent.doctype target_doc.prevdoc_docname = source_parent.name visit = dataent.db.sql( """select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1 and t1.completion_status='Fully Completed'""", source_name) if not visit: target_doc = get_mapped_doc("Warranty Claim", source_name, { "Warranty Claim": { "doctype": "Maintenance Visit", "field_map": {} } }, target_doc) source_doc = dataent.get_doc("Warranty Claim", source_name) if source_doc.get("item_code"): table_map = { "doctype": "Maintenance Visit Purpose", "postprocess": _update_links } map_child_doc(source_doc, target_doc, table_map, source_doc) return target_doc
def make_maintenance_visit(source_name, target_doc=None): from dataent.model.mapper import get_mapped_doc def update_status(source, target, parent): target.maintenance_type = "Scheduled" doclist = get_mapped_doc( "Maintenance Schedule", source_name, { "Maintenance Schedule": { "doctype": "Maintenance Visit", "field_map": { "name": "maintenance_schedule" }, "validation": { "docstatus": ["=", 1] }, "postprocess": update_status }, "Maintenance Schedule Item": { "doctype": "Maintenance Visit Purpose", "field_map": { "parent": "prevdoc_docname", "parenttype": "prevdoc_doctype", "sales_person": "service_person" } } }, target_doc) return doclist
def make_supplier_scorecard(source_name, target_doc=None): def update_criteria_fields(obj, target, source_parent): target.max_score, target.formula = dataent.db.get_value('Supplier Scorecard Criteria', obj.criteria_name, ['max_score', 'formula']) def post_process(source, target): variables = [] for cr in target.criteria: for var in get_variables(cr.criteria_name): if var not in variables: variables.append(var) target.extend('variables', variables) doc = get_mapped_doc("Supplier Scorecard", source_name, { "Supplier Scorecard": { "doctype": "Supplier Scorecard Period" }, "Supplier Scorecard Scoring Criteria": { "doctype": "Supplier Scorecard Scoring Criteria", "postprocess": update_criteria_fields, } }, target_doc, post_process) return doc
def make_supplier_quotation(source_name, for_supplier, target_doc=None): def postprocess(source, target_doc): target_doc.supplier = for_supplier args = get_party_details(for_supplier, party_type="Supplier", ignore_permissions=True) target_doc.currency = args.currency or get_party_account_currency( 'Supplier', for_supplier, source.company) target_doc.buying_price_list = args.buying_price_list or dataent.db.get_value( 'Buying Settings', None, 'buying_price_list') set_missing_values(source, target_doc) doclist = get_mapped_doc( "Request for Quotation", source_name, { "Request for Quotation": { "doctype": "Supplier Quotation", "validation": { "docstatus": ["=", 1] } }, "Request for Quotation Item": { "doctype": "Supplier Quotation Item", "field_map": { "name": "request_for_quotation_item", "parent": "request_for_quotation" }, } }, target_doc, postprocess) return doclist
def _make_customer(source_name, target_doc=None, ignore_permissions=False): def set_missing_values(source, target): if source.company_name: target.customer_type = "Company" target.customer_name = source.company_name else: target.customer_type = "Individual" target.customer_name = source.lead_name target.customer_group = dataent.db.get_default("Customer Group") doclist = get_mapped_doc("Lead", source_name, { "Lead": { "doctype": "Customer", "field_map": { "name": "lead_name", "company_name": "customer_name", "contact_no": "phone_1", "fax": "fax_1" } } }, target_doc, set_missing_values, ignore_permissions=ignore_permissions) return doclist
def make_quotation(source_name, target_doc=None): def set_missing_values(source, target): from epaas.controllers.accounts_controller import get_default_taxes_and_charges quotation = dataent.get_doc(target) company_currency = dataent.get_cached_value('Company', quotation.company, "default_currency") if quotation.quotation_to == 'Customer' and quotation.party_name: party_account_currency = get_party_account_currency( "Customer", quotation.party_name, quotation.company) else: party_account_currency = company_currency quotation.currency = party_account_currency or company_currency if company_currency == quotation.currency: exchange_rate = 1 else: exchange_rate = get_exchange_rate(quotation.currency, company_currency, quotation.transaction_date, args="for_selling") quotation.conversion_rate = exchange_rate # get default taxes taxes = get_default_taxes_and_charges( "Sales Taxes and Charges Template", company=quotation.company) if taxes.get('taxes'): quotation.update(taxes) quotation.run_method("set_missing_values") quotation.run_method("calculate_taxes_and_totals") if not source.with_items: quotation.opportunity = source.name doclist = get_mapped_doc( "Opportunity", source_name, { "Opportunity": { "doctype": "Quotation", "field_map": { "opportunity_from": "quotation_to", "opportunity_type": "order_type", "name": "enq_no", } }, "Opportunity Item": { "doctype": "Quotation Item", "field_map": { "parent": "prevdoc_docname", "parenttype": "prevdoc_doctype", "uom": "stock_uom" }, "add_if_empty": True } }, target_doc, set_missing_values) return doclist
def make_maintenance_visit(source_name, target_doc=None): visit = dataent.db.sql( """select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1 and t1.completion_status='Fully Completed'""", source_name) if not visit: doclist = get_mapped_doc( "Sales Order", source_name, { "Sales Order": { "doctype": "Maintenance Visit", "validation": { "docstatus": ["=", 1] } }, "Sales Order Item": { "doctype": "Maintenance Visit Purpose", "field_map": { "parent": "prevdoc_docname", "parenttype": "prevdoc_doctype" }, "add_if_empty": True } }, target_doc) return doclist
def enroll_student(source_name): """Creates a Student Record and returns a Program Enrollment. :param source_name: Student Applicant. """ dataent.publish_realtime('enroll_student_progress', {"progress": [1, 4]}, user=dataent.session.user) student = get_mapped_doc("Student Applicant", source_name, { "Student Applicant": { "doctype": "Student", "field_map": { "name": "student_applicant" } } }, ignore_permissions=True) student.save() program_enrollment = dataent.new_doc("Program Enrollment") program_enrollment.student = student.name program_enrollment.student_name = student.title program_enrollment.program = dataent.db.get_value("Student Applicant", source_name, "program") dataent.publish_realtime('enroll_student_progress', {"progress": [4, 4]}, user=dataent.session.user) return program_enrollment
def make_project(source_name, target_doc=None): def postprocess(source, doc): doc.project_type = "External" doc.project_name = source.name doc = get_mapped_doc( "Sales Order", source_name, { "Sales Order": { "doctype": "Project", "validation": { "docstatus": ["=", 1] }, "field_map": { "name": "sales_order", "base_grand_total": "estimated_costing", } }, "Sales Order Item": { "doctype": "Project Task", "field_map": { "item_code": "title", }, } }, target_doc, postprocess) return doc
def make_maintenance_schedule(source_name, target_doc=None): maint_schedule = dataent.db.sql( """select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.sales_order=%s and t1.docstatus=1""", source_name) if not maint_schedule: doclist = get_mapped_doc( "Sales Order", source_name, { "Sales Order": { "doctype": "Maintenance Schedule", "validation": { "docstatus": ["=", 1] } }, "Sales Order Item": { "doctype": "Maintenance Schedule Item", "field_map": { "parent": "sales_order" }, "add_if_empty": True } }, target_doc) return doclist
def make_stock_entry(source_name, target_doc=None): def update_item(obj, target, source_parent): target.t_warehouse = source_parent.wip_warehouse def set_missing_values(source, target): target.purpose = "Material Transfer for Manufacture" target.from_bom = 1 target.fg_completed_qty = source.get('for_quantity', 0) - source.get( 'transferred_qty', 0) target.calculate_rate_and_amount() target.set_missing_values() doclist = get_mapped_doc( "Job Card", source_name, { "Job Card": { "doctype": "Stock Entry", "field_map": { "name": "job_card", "for_quantity": "fg_completed_qty" }, }, "Job Card Item": { "doctype": "Stock Entry Detail", "field_map": { "source_warehouse": "s_warehouse", "required_qty": "qty", "uom": "stock_uom" }, "postprocess": update_item, } }, target_doc, set_missing_values) return doclist
def make_material_request(source_name, target_doc=None): def update_item(obj, target, source_parent): target.warehouse = source_parent.wip_warehouse def set_missing_values(source, target): target.material_request_type = "Material Transfer" doclist = get_mapped_doc( "Job Card", source_name, { "Job Card": { "doctype": "Material Request", "field_map": { "name": "job_card", }, }, "Job Card Item": { "doctype": "Material Request Item", "field_map": { "required_qty": "qty", "uom": "stock_uom" }, "postprocess": update_item, } }, target_doc, set_missing_values) return doclist
def make_purchase_order(source_name): def update_item(source, target, source_parent): target_qty = source.get("qty") - source.get("ordered_qty") target.qty = target_qty if not flt(target_qty) < 0 else 0 item = get_item_defaults(target.item_code, source_parent.company) if item: target.item_name = item.get("item_name") target.description = item.get("description") target.uom = item.get("stock_uom") target.warehouse = item.get("default_warehouse") target_doc = get_mapped_doc( "Blanket Order", source_name, { "Blanket Order": { "doctype": "Purchase Order" }, "Blanket Order Item": { "doctype": "Purchase Order Item", "field_map": { "rate": "blanket_order_rate", "parent": "blanket_order" }, "postprocess": update_item } }) return target_doc
def make_installation_note(source_name, target_doc=None): def update_item(obj, target, source_parent): target.qty = flt(obj.qty) - flt(obj.installed_qty) target.serial_no = obj.serial_no doclist = get_mapped_doc( "Delivery Note", source_name, { "Delivery Note": { "doctype": "Installation Note", "validation": { "docstatus": ["=", 1] } }, "Delivery Note Item": { "doctype": "Installation Note Item", "field_map": { "name": "prevdoc_detail_docname", "parent": "prevdoc_docname", "parenttype": "prevdoc_doctype", }, "postprocess": update_item, "condition": lambda doc: doc.installed_qty < doc.qty } }, target_doc) return doclist
def generate_fee(fee_schedule): doc = dataent.get_doc("Fee Schedule", fee_schedule) error = False total_records = sum([int(d.total_students) for d in doc.student_groups]) created_records = 0 if not total_records: dataent.throw(_("Please setup Students under Student Groups")) for d in doc.student_groups: students = get_students(d.student_group, doc.academic_year, doc.academic_term, doc.student_category) for student in students: try: fees_doc = get_mapped_doc( "Fee Schedule", fee_schedule, { "Fee Schedule": { "doctype": "Fees", "field_map": { "name": "Fee Schedule" } } }) fees_doc.student = student.student fees_doc.student_name = student.student_name fees_doc.program = student.program fees_doc.student_batch = student.student_batch_name fees_doc.send_payment_request = doc.send_email fees_doc.save() fees_doc.submit() created_records += 1 dataent.publish_realtime("fee_schedule_progress", { "progress": str(int(created_records * 100 / total_records)) }, user=dataent.session.user) except Exception as e: error = True err_msg = dataent.local.message_log and "\n\n".join( dataent.local.message_log) or cstr(e) if error: dataent.db.rollback() dataent.db.set_value("Fee Schedule", fee_schedule, "fee_creation_status", "Failed") dataent.db.set_value("Fee Schedule", fee_schedule, "error_log", err_msg) else: dataent.db.set_value("Fee Schedule", fee_schedule, "fee_creation_status", "Successful") dataent.db.set_value("Fee Schedule", fee_schedule, "error_log", None) dataent.publish_realtime("fee_schedule_progress", { "progress": "100", "reload": 1 }, user=dataent.session.user)
def get_fee_structure(source_name, target_doc=None): fee_request = get_mapped_doc( "Fee Structure", source_name, {"Fee Structure": { "doctype": "Fee Schedule" }}, ignore_permissions=True) return fee_request
def make_employee(source_name, target_doc=None): def set_missing_values(source, target): target.personal_email = dataent.db.get_value("Job Applicant", source.job_applicant, "email_id") doc = get_mapped_doc("Job Offer", source_name, { "Job Offer": { "doctype": "Employee", "field_map": { "applicant_name": "employee_name", }} }, target_doc, set_missing_values) return doc
def fetch_appraisal_template(source_name, target_doc=None): target_doc = get_mapped_doc( "Appraisal Template", source_name, { "Appraisal Template": { "doctype": "Appraisal", }, "Appraisal Template Goal": { "doctype": "Appraisal Goal", } }, target_doc) return target_doc
def make_loan(source_name, target_doc=None): doclist = get_mapped_doc( "Loan Application", source_name, { "Loan Application": { "doctype": "Loan", "validation": { "docstatus": ["=", 1] } } }, target_doc) return doclist
def make_fee_schedule(source_name, target_doc=None): return get_mapped_doc( "Fee Structure", source_name, { "Fee Structure": { "doctype": "Fee Schedule", "validation": { "docstatus": ["=", 1], } }, "Fee Component": { "doctype": "Fee Component" } }, target_doc)
def make_proof_submission(source_name, target_doc=None): doclist = get_mapped_doc( "Employee Tax Exemption Declaration", source_name, { "Employee Tax Exemption Declaration": { "doctype": "Employee Tax Exemption Proof Submission", "field_no_map": ["monthly_house_rent", "monthly_hra_exemption"] }, "Employee Tax Exemption Declaration Category": { "doctype": "Employee Tax Exemption Proof Submission Detail", "add_if_empty": True } }, target_doc) return doclist
def make_request_for_quotation(source_name, target_doc=None): doclist = get_mapped_doc( "Opportunity", source_name, { "Opportunity": { "doctype": "Request for Quotation" }, "Opportunity Item": { "doctype": "Request for Quotation Item", "field_map": [["name", "opportunity_item"], ["parent", "opportunity"], ["uom", "uom"]] } }, target_doc) return doclist
def make_quotation(source_name, target_doc=None): target_doc = get_mapped_doc("Lead", source_name, { "Lead": { "doctype": "Quotation", "field_map": { "name": "party_name" } } }, target_doc) target_doc.quotation_to = "Lead" target_doc.run_method("set_missing_values") target_doc.run_method("set_other_charges") target_doc.run_method("calculate_taxes_and_totals") return target_doc
def make_packing_slip(source_name, target_doc=None): doclist = get_mapped_doc( "Delivery Note", source_name, { "Delivery Note": { "doctype": "Packing Slip", "field_map": { "name": "delivery_note", "letter_head": "letter_head" }, "validation": { "docstatus": ["=", 0] } } }, target_doc) return doclist
def get_item_from_material_requests_based_on_supplier(source_name, target_doc=None): mr_items_list = dataent.db.sql(""" SELECT mr.name, mr_item.item_code FROM `tabItem` as item, `tabItem Supplier` as item_supp, `tabMaterial Request Item` as mr_item, `tabMaterial Request` as mr WHERE item_supp.supplier = %(supplier)s AND item.name = item_supp.parent AND mr_item.parent = mr.name AND mr_item.item_code = item.name AND mr.status != "Stopped" AND mr.material_request_type = "Purchase" AND mr.docstatus = 1 AND mr.per_ordered < 99.99""", {"supplier": source_name}, as_dict=1) material_requests = {} for d in mr_items_list: material_requests.setdefault(d.name, []).append(d.item_code) for mr, items in material_requests.items(): target_doc = get_mapped_doc( "Material Request", mr, { "Material Request": { "doctype": "Request for Quotation", "validation": { "docstatus": ["=", 1], "material_request_type": ["=", "Purchase"], } }, "Material Request Item": { "doctype": "Request for Quotation Item", "condition": lambda row: row.item_code in items, "field_map": [["name", "material_request_item"], ["parent", "material_request"], ["uom", "uom"]] } }, target_doc) return target_doc
def _make_sales_order(source_name, target_doc=None, ignore_permissions=False): customer = _make_customer(source_name, ignore_permissions) def set_missing_values(source, target): if customer: target.customer = customer.name target.customer_name = customer.customer_name target.ignore_pricing_rule = 1 target.flags.ignore_permissions = ignore_permissions target.run_method("set_missing_values") target.run_method("calculate_taxes_and_totals") def update_item(obj, target, source_parent): target.stock_qty = flt(obj.qty) * flt(obj.conversion_factor) doclist = get_mapped_doc("Quotation", source_name, { "Quotation": { "doctype": "Sales Order", "validation": { "docstatus": ["=", 1] } }, "Quotation Item": { "doctype": "Sales Order Item", "field_map": { "parent": "prevdoc_docname" }, "postprocess": update_item }, "Sales Taxes and Charges": { "doctype": "Sales Taxes and Charges", "add_if_empty": True }, "Sales Team": { "doctype": "Sales Team", "add_if_empty": True }, "Payment Schedule": { "doctype": "Payment Schedule", "add_if_empty": True } }, target_doc, set_missing_values, ignore_permissions=ignore_permissions) # postprocess: fetch shipping address, set missing values return doclist
def make_stock_entry(source_name, target_doc=None): doc = get_mapped_doc("Purchase Invoice", source_name, { "Purchase Invoice": { "doctype": "Stock Entry", "validation": { "docstatus": ["=", 1] } }, "Purchase Invoice Item": { "doctype": "Stock Entry Detail", "field_map": { "stock_qty": "transfer_qty", "batch_no": "batch_no" }, } }, target_doc) return doc
def make_supplier_quotation(source_name, target_doc=None): doclist = get_mapped_doc( "Opportunity", source_name, { "Opportunity": { "doctype": "Supplier Quotation", "field_map": { "name": "opportunity" } }, "Opportunity Item": { "doctype": "Supplier Quotation Item", "field_map": { "uom": "stock_uom" } } }, target_doc) return doclist
def make_opportunity(source_name, target_doc=None): target_doc = get_mapped_doc( "Lead", source_name, { "Lead": { "doctype": "Opportunity", "field_map": { "campaign_name": "campaign", "doctype": "opportunity_from", "name": "party_name", "lead_name": "contact_display", "company_name": "customer_name", "email_id": "contact_email", "mobile_no": "contact_mobile" } } }, target_doc) return target_doc