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'))
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
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
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
def makeDelivery(si, method): doc = make_delivery_note(si.name) doc.insert()