def on_submit(self, method=None): sales_order = frappe.db.get_value('Delivery Note', self.name, 'sales_order') if not erpnext_sales_order.has_active_si(sales_order): si = erpnext_delivery_note.make_sales_invoice(self.get('name')) si.insert() try: si.submit() except Exception as ex: frappe.msgprint( 'Sales Invoice %s was created but not submitted due to the following error:\n%s' % (si.get('name'), cstr(ex))) else: frappe.msgprint( 'Sales Invoice %s was created and submitted automatically' % si.get('name')) frappe.clear_cache() else: for si in frappe.get_all('Sales Invoice', fields=['name'], filters={ 'sales_order': sales_order, 'docstatus': 0 }): si = frappe.get_doc('Sales Invoice', si.get('name')) si.submit() frappe.msgprint('Sales Invoice %s was submitted automatically' % si.get('name'))
def on_submit(self, method=None): sales_order = frappe.db.get_value('Delivery Note', self.name, 'sales_order') if not erpnext_sales_order.has_active_si(sales_order): si = erpnext_delivery_note.make_sales_invoice(self.get('name')) si.insert() try: si.submit() except Exception as ex: frappe.msgprint('Sales Invoice %s was created but not submitted due to the following error:\n%s' % (si.get('name'), cstr(ex))) else: frappe.msgprint('Sales Invoice %s was created and submitted automatically' % si.get('name')) frappe.clear_cache() else: for si in frappe.get_all('Sales Invoice', fields=['name'], filters={'sales_order': sales_order, 'docstatus': 0}): si = frappe.get_doc('Sales Invoice', si.get('name')) si.submit() frappe.msgprint('Sales Invoice %s was submitted automatically' % si.get('name'))
def update_delivery_note_from_packing_slip(doc_delivery_note, packing_slip_doc): ps_item_map = {i.item_code: i for i in packing_slip_doc.items} dn_item_map = {i.item_code: i for i in doc_delivery_note.items} for dn_item_code, dn_doc_item in dn_item_map.items(): dln_doc_item = ps_item_map.get(dn_item_code) if dln_doc_item: dn_doc_item.update({ 'qty': flt(dln_doc_item.qty), }) else: doc_delivery_note.items.remove(dn_doc_item) if len(doc_delivery_note.items) > 1 and dn_doc_item.qty == 0 and dn_doc_item in doc_delivery_note.items: doc_delivery_note.items.remove(dn_doc_item) doc_delivery_note.validate() sales_order = frappe.db.get_value('Delivery Note', doc_delivery_note.name, 'sales_order') if erpnext_sales_order.has_active_si(sales_order): si = frappe.get_doc('Sales Invoice', {'sales_order': sales_order}) si.delete()
def update_delivery_note_from_packing_slip(doc_delivery_note, packing_slip_doc): ps_item_map = {i.item_code: i for i in packing_slip_doc.items} dn_item_map = {i.item_code: i for i in doc_delivery_note.items} for dn_item_code, dn_doc_item in dn_item_map.items(): dln_doc_item = ps_item_map.get(dn_item_code) if dln_doc_item: dn_doc_item.update({ 'qty': flt(dln_doc_item.qty), }) else: doc_delivery_note.items.remove(dn_doc_item) if len( doc_delivery_note.items ) > 1 and dn_doc_item.qty == 0 and dn_doc_item in doc_delivery_note.items: doc_delivery_note.items.remove(dn_doc_item) doc_delivery_note.validate() sales_order = frappe.db.get_value('Delivery Note', doc_delivery_note.name, 'sales_order') if erpnext_sales_order.has_active_si(sales_order): si = frappe.get_doc('Sales Invoice', {'sales_order': sales_order}) si.delete()
def make_sales_invoice(source_name, target_doc=None): def postprocess(source, target): set_missing_values(source, target) # Get the advance paid Journal Entries in Sales Invoice Advance target.get_advances() def set_missing_values(source, target): target.cash_bank_account = get_cash_bank_account(source, mode_of_payment=target.mode_of_payment) target.is_pos = 0 if is_oc_sales_order(source): target.is_pos = mode_of_payments.is_pos_payment_method(source.oc_pm_code) payment_territory = territories.get_by_country(source.oc_pa_country) target.mode_of_payment = resolve_mode_of_payment(source.oc_pm_code, payment_territory) # payment method target.oc_pm_title = source.oc_pm_title target.oc_pm_code = source.oc_pm_code target.ignore_pricing_rule = 1 target.run_method("set_missing_values") target.run_method("calculate_taxes_and_totals") def update_item(source, target, source_parent): target.amount = flt(source.amount) - flt(source.billed_amt) target.base_amount = target.amount * flt(source_parent.conversion_rate) target.qty = target.amount / flt(source.rate) if (source.rate and source.billed_amt) else source.qty target.income_account = get_income_account(source_parent) if erpnext_sales_order.has_active_si(source_name): frappe.throw('Cannot make new Sales Invoice: Sales Invoice is already created and its docstatus is not canceled.') doclist = get_mapped_doc("Sales Order", source_name, { "Sales Order": { "doctype": "Sales Invoice", "field_map": { "name": "sales_order", }, "validation": { "docstatus": ["=", 1] } }, "Sales Order Item": { "doctype": "Sales Invoice Item", "field_map": { "name": "so_detail", "parent": "sales_order", }, "postprocess": update_item, "condition": lambda doc: doc.base_amount == 0 or doc.billed_amt < doc.amount }, "Sales Taxes and Charges": { "doctype": "Sales Taxes and Charges", "add_if_empty": True }, "Sales Team": { "doctype": "Sales Team", "add_if_empty": True } }, target_doc, postprocess) return doclist
def make_sales_invoice(source_name, target_doc=None): def postprocess(source, target): set_missing_values(source, target) # Get the advance paid Journal Entries in Sales Invoice Advance target.get_advances() def set_missing_values(source, target): target.cash_bank_account = get_cash_bank_account( source, mode_of_payment=target.mode_of_payment) target.is_pos = 0 if is_oc_sales_order(source): target.is_pos = mode_of_payments.is_pos_payment_method( source.oc_pm_code) payment_territory = territories.get_by_country( source.oc_pa_country) target.mode_of_payment = resolve_mode_of_payment( source.oc_pm_code, payment_territory) # payment method target.oc_pm_title = source.oc_pm_title target.oc_pm_code = source.oc_pm_code target.ignore_pricing_rule = 1 target.run_method("set_missing_values") target.run_method("calculate_taxes_and_totals") def update_item(source, target, source_parent): target.amount = flt(source.amount) - flt(source.billed_amt) target.base_amount = target.amount * flt(source_parent.conversion_rate) target.qty = target.amount / flt(source.rate) if ( source.rate and source.billed_amt) else source.qty target.income_account = get_income_account(source_parent) if erpnext_sales_order.has_active_si(source_name): frappe.throw( 'Cannot make new Sales Invoice: Sales Invoice is already created and its docstatus is not canceled.' ) doclist = get_mapped_doc( "Sales Order", source_name, { "Sales Order": { "doctype": "Sales Invoice", "field_map": { "name": "sales_order", }, "validation": { "docstatus": ["=", 1] } }, "Sales Order Item": { "doctype": "Sales Invoice Item", "field_map": { "name": "so_detail", "parent": "sales_order", }, "postprocess": update_item, "condition": lambda doc: doc.base_amount == 0 or doc.billed_amt < doc.amount }, "Sales Taxes and Charges": { "doctype": "Sales Taxes and Charges", "add_if_empty": True }, "Sales Team": { "doctype": "Sales Team", "add_if_empty": True } }, target_doc, postprocess) return doclist