Ejemplo n.º 1
0
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()
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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