def _make_return_dn(si_doc):
    get_dns = compose(list, unique, partial(pluck, "parent"), frappe.get_all)
    dns = get_dns(
        "Delivery Note Item",
        filters={
            "against_sales_invoice": si_doc.return_against,
            "docstatus": 1
        },
        fields=["parent"],
    )
    if not dns:
        return
    if len(dns) > 1:
        frappe.throw(
            _("Multiple Delivery Notes found for this Sales Invoice. "
              "Please create Sales Return from the Delivery Note manually."))
    doc = make_delivery_note(si_doc.return_against)
    for i, item in enumerate(doc.items):
        item.qty = si_doc.items[i].qty
        item.stock_qty = si_doc.items[i].stock_qty
    doc.is_return = 1
    doc.return_against = first(dns)
    doc.run_method("calculate_taxes_and_totals")
    doc.insert()
    doc.submit()
def on_sales_invoice_added(doc_sales_invoice):
    try:
        if is_pos_payment_method(doc_sales_invoice.oc_pm_code):
            doc_sales_invoice.submit()
    except Exception as ex:
        frappe.msgprint('Sales Invoice "%s" was not submitted.\n%s' % (doc_sales_invoice.get('name'), str(ex)))
    else:
        dn = erpnext_sales_invoice.make_delivery_note(doc_sales_invoice.get('name'))
        dn.insert()
        on_delivery_note_added(dn.get('name'))
def on_sales_invoice_added(doc_sales_invoice):
    try:
        if is_pos_payment_method(doc_sales_invoice.oc_pm_code):
            doc_sales_invoice.submit()
    except Exception as ex:
        frappe.msgprint('Sales Invoice "%s" was not submitted.\n%s' %
                        (doc_sales_invoice.get('name'), str(ex)))
    else:
        dn = erpnext_sales_invoice.make_delivery_note(
            doc_sales_invoice.get('name'))
        dn.insert()
        on_delivery_note_added(dn.get('name'))
Beispiel #4
0
def deliver_qol(name, payments=[], batches=None, deliver=0):

    is_delivery = cint(deliver)

    si = frappe.get_doc("Sales Invoice", name)
    if is_delivery:
        _validate_qol(batches, si)

    def make_payment(payment):
        pe = _make_payment_entry(
            name,
            payment.get("mode_of_payment"),
            payment.get("amount"),
            payment.get("gift_card_no"),
        )
        pe.insert(ignore_permissions=True)
        pe.submit()
        pe.name

    make_payments = compose(partial(mapf, make_payment), json.loads)
    pe_names = make_payments(payments) if payments else []

    result = {"payment_entries": pe_names}
    if is_delivery:
        dn = make_delivery_note(name)
        dn.os_branch = si.os_branch
        warehouse = (frappe.db.get_value("Branch", si.os_branch, "warehouse")
                     if si.os_branch else None)
        if batches:
            get_batches = compose(unique, partial(pluck, "item_code"),
                                  json.loads)
            batch_items = filterf(
                lambda x: x.item_code in get_batches(batches), dn.items)

            def get_item(si_detail):
                return compose(
                    lambda x: x.as_dict() if x else {},
                    excepts(StopIteration, first, None),
                    partial(filter, lambda x: x.si_detail == si_detail),
                )(batch_items)

            dn.items = filterf(lambda x: x not in batch_items, dn.items)
            for batch in json.loads(batches):
                item = get_item(batch.get("si_detail"))
                dn.append("items", merge(item, batch))
        if warehouse:
            for item in dn.items:
                item.warehouse = warehouse
        dn.insert(ignore_permissions=True)
        dn.submit()
        result = merge(result, {"delivery_note": dn.name})

    return result
Beispiel #5
0
def deliver_qol(name, payments=[], deliver=0):
    is_delivery = cint(deliver)
    si = frappe.get_doc("Sales Invoice", name)

    def make_payment(payment):
        pe = _make_payment_entry(
            name,
            payment.get("mode_of_payment"),
            payment.get("amount"),
            payment.get("gift_card_no"),
        )
        pe.insert(ignore_permissions=True)
        pe.submit()
        pe.name

    make_payments = compose(partial(map, make_payment), json.loads)
    pe_names = make_payments(payments) if payments else []

    result = {"payment_entries": pe_names}

    def si_deliverable(items):
        return sum_by("qty")(items) > sum_by("delivered_qty")(items)

    sos_deliverable = compose(
        lambda states: reduce(lambda a, x: a and x == "Ready to Deliver", states, True),
        partial(map, lambda x: frappe.db.get_value("Sales Order", x, "workflow_state")),
        unique,
        partial(filter, lambda x: x),
        partial(map, lambda x: x.sales_order),
    )
    if is_delivery:
        if si.update_stock or not si_deliverable(si.items):
            return frappe.throw(_("Delivery has already been processed"))
        if not sos_deliverable(si.items):
            return frappe.throw(
                _("Cannot make delivery until Sales Order status is 'Ready to Deliver'")
            )
        dn = make_delivery_note(name)
        dn.os_branch = si.os_branch
        warehouse = (
            frappe.db.get_value("Branch", si.os_branch, "warehouse")
            if si.os_branch
            else None
        )
        if warehouse:
            for item in dn.items:
                item.warehouse = warehouse
        dn.insert(ignore_permissions=True)
        dn.submit()
        result = merge(result, {"delivery_note": dn.name})

    return result
Beispiel #6
0
def create_delivery_note(shipment, sales_invoice):
    dn = make_delivery_note(sales_invoice.name)
    dn.shipstation_shipment_id = shipment.shipment_id
    dn.carrier = shipment.carrier_code.upper()
    dn.carrier_service = shipment.service_code.upper()
    dn.tracking_number = shipment.tracking_number

    for row in dn.items:
        row.allow_zero_valuation_rate = 1  # if row.rate < 0.001 else 0

    dn.save()
    dn.submit()
    frappe.db.commit()
    return dn
Beispiel #7
0
def makeDelivery(si, method):
    doc = make_delivery_note(si.name)
    doc.insert()