def test_make_sales_invoice_from_dn_with_returned_qty_against_dn(self): from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice dn = create_delivery_note(qty=8, do_not_submit=True) dn.append("items", { "item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC", "qty": 1, "rate": 100, "conversion_factor": 1.0, "expense_account": "Cost of Goods Sold - _TC", "cost_center": "_Test Cost Center - _TC" }) dn.submit() si1 = make_sales_invoice(dn.name) si1.items[0].qty = 4 si1.items.pop(1) si1.save() si1.submit() create_delivery_note(is_return=1, return_against=dn.name, qty=-2) si2 = make_sales_invoice(dn.name) self.assertEquals(si2.items[0].qty, 2) self.assertEquals(si2.items[1].qty, 1)
def test_serialized_partial_sales_invoice(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no) serial_no = '\n'.join(serial_no) dn = create_delivery_note(item_code="_Test Serialized Item With Series", qty=2, serial_no=serial_no) si = make_sales_invoice(dn.name) si.items[0].qty = 1 si.submit() self.assertEqual(si.items[0].qty, 1) si = make_sales_invoice(dn.name) si.submit() self.assertEqual(si.items[0].qty, len(get_serial_nos(si.items[0].serial_no)))
def _test_delivery_note_return_against_sales_order(self, item_code, delivered_qty, returned_qty): from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice actual_qty_0 = get_qty_after_transaction() so = make_sales_order(qty=50) dn = create_dn_against_so(so.name, delivered_qty) actual_qty_1 = get_qty_after_transaction() self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1) si = make_sales_invoice(so.name) si.insert() si.submit() # insert and submit stock entry for sales return se = make_stock_entry( item_code="_Test Item", target="_Test Warehouse - _TC", qty=returned_qty, purpose="Sales Return", delivery_note_no=dn.name, ) actual_qty_2 = get_qty_after_transaction() self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2) return se
def _test_delivery_note_return(self, item_code, delivered_qty, returned_qty): from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, incoming_rate=100) actual_qty_0 = get_qty_after_transaction() # make a delivery note based on this invoice dn = create_delivery_note(item_code="_Test Item", warehouse="_Test Warehouse - _TC", qty=delivered_qty) actual_qty_1 = get_qty_after_transaction() self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1) si = make_sales_invoice(dn.name) si.insert() si.submit() # insert and submit stock entry for sales return se = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=returned_qty, purpose="Sales Return", delivery_note_no=dn.name) actual_qty_2 = get_qty_after_transaction() self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2) return se
def test_dn_billing_status_case2(self): # SO -> SI and SO -> DN1, DN2 from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note, make_sales_invoice so = make_sales_order() si = make_sales_invoice(so.name) si.get("items")[0].qty = 5 si.insert() si.submit() frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) dn1 = make_delivery_note(so.name) dn1.posting_time = "10:00" dn1.get("items")[0].qty = 2 dn1.submit() self.assertEqual(dn1.get("items")[0].billed_amt, 200) self.assertEqual(dn1.per_billed, 100) self.assertEqual(dn1.status, "Completed") dn2 = make_delivery_note(so.name) dn2.posting_time = "08:00" dn2.get("items")[0].qty = 4 dn2.submit() dn1.load_from_db() self.assertEqual(dn1.get("items")[0].billed_amt, 100) self.assertEqual(dn1.per_billed, 50) self.assertEqual(dn1.status, "To Bill") self.assertEqual(dn2.get("items")[0].billed_amt, 400) self.assertEqual(dn2.per_billed, 100) self.assertEqual(dn2.status, "Completed")
def test_over_billing_against_dn(self): frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) dn = create_delivery_note(do_not_submit=True) self.assertRaises(frappe.ValidationError, make_sales_invoice, dn.name) dn.submit() si = make_sales_invoice(dn.name) self.assertEquals(len(si.get("items")), len(dn.get("items"))) # modify amount si.get("items")[0].rate = 200 self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert)
def _test_delivery_note_return_against_sales_order(self, item_code, delivered_qty, returned_qty): self._insert_material_receipt() from erpnext.selling.doctype.sales_order.test_sales_order import test_records as sales_order_test_records from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice, make_delivery_note actual_qty_0 = self._get_actual_qty() so = frappe.copy_doc(sales_order_test_records[0]) so.get("sales_order_details")[0].item_code = item_code so.get("sales_order_details")[0].qty = 5.0 so.insert() so.submit() dn = make_delivery_note(so.name) dn.status = "Draft" dn.posting_date = so.delivery_date dn.insert() dn.submit() actual_qty_1 = self._get_actual_qty() self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1) si = make_sales_invoice(so.name) si.posting_date = dn.posting_date si.debit_to = "_Test Customer - _TC" for d in si.get("entries"): d.income_account = "Sales - _TC" d.cost_center = "_Test Cost Center - _TC" si.insert() si.submit() # insert and submit stock entry for sales return se = frappe.copy_doc(test_records[0]) se.purpose = "Sales Return" se.delivery_note_no = dn.name se.posting_date = "2013-03-10" se.fiscal_year = "_Test Fiscal Year 2013" se.get("mtn_details")[0].qty = se.get( "mtn_details")[0].transfer_qty = returned_qty se.insert() se.submit() actual_qty_2 = self._get_actual_qty() self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2) return se
def test_returned_qty_in_return_dn(self): # SO ---> SI ---> DN # | # |---> DN(Partial Sales Return) ---> SI(Credit Note) # | # |---> DN(Partial Sales Return) ---> SI(Credit Note) from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_delivery_note from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice so = make_sales_order(qty=10) si = make_sales_invoice(so.name) si.insert() si.submit() dn = make_delivery_note(si.name) dn.insert() dn.submit() self.assertEqual(dn.items[0].returned_qty, 0) self.assertEqual(dn.per_billed, 100) from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-3) si1 = make_sales_invoice(dn1.name) si1.insert() si1.submit() dn1.reload() self.assertEqual(dn1.items[0].returned_qty, 0) self.assertEqual(dn1.per_billed, 100) dn2 = create_delivery_note(is_return=1, return_against=dn.name, qty=-4) si2 = make_sales_invoice(dn2.name) si2.insert() si2.submit() dn2.reload() self.assertEqual(dn2.items[0].returned_qty, 0) self.assertEqual(dn2.per_billed, 100)
def test_dn_billing_status_case3(self): # SO -> DN1 -> SI and SO -> SI and SO -> DN2 from erpnext.selling.doctype.sales_order.sales_order \ import make_delivery_note, make_sales_invoice as make_sales_invoice_from_so frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) so = make_sales_order() dn1 = make_delivery_note(so.name) dn1.set_posting_time = 1 dn1.posting_time = "10:00" dn1.get("items")[0].qty = 2 dn1.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn1.po_no, so.po_no) si1 = make_sales_invoice(dn1.name) si1.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn1.po_no, si1.po_no) dn1.load_from_db() self.assertEqual(dn1.per_billed, 100) si2 = make_sales_invoice_from_so(so.name) si2.get("items")[0].qty = 4 si2.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(si2.po_no, so.po_no) dn2 = make_delivery_note(so.name) dn2.posting_time = "08:00" dn2.get("items")[0].qty = 5 dn2.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn2.po_no, so.po_no) dn1.load_from_db() self.assertEqual(dn1.get("items")[0].billed_amt, 200) self.assertEqual(dn1.per_billed, 100) self.assertEqual(dn1.status, "Completed") self.assertEqual(dn2.get("items")[0].billed_amt, 400) self.assertEqual(dn2.per_billed, 80) self.assertEqual(dn2.status, "To Bill")
def test_dn_billing_status_case1(self): # SO -> DN -> SI so = make_sales_order() dn = create_dn_against_so(so.name, delivered_qty=2) self.assertEqual(dn.status, "To Bill") self.assertEqual(dn.per_billed, 0) si = make_sales_invoice(dn.name) si.submit() dn.load_from_db() self.assertEqual(dn.get("items")[0].billed_amt, 200) self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, "Completed")
def test_dn_billing_status_case4(self): # SO -> SI -> DN from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_delivery_note so = make_sales_order() si = make_sales_invoice(so.name) si.submit() dn = make_delivery_note(si.name) dn.submit() self.assertEqual(dn.get("items")[0].billed_amt, 1000) self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, "Completed")
def _test_delivery_note_return(self, item_code, delivered_qty, returned_qty): self._insert_material_receipt() from erpnext.stock.doctype.delivery_note.test_delivery_note \ import test_records as delivery_note_test_records from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice actual_qty_0 = self._get_actual_qty() # make a delivery note based on this invoice dn = frappe.copy_doc(delivery_note_test_records[0]) dn.get("delivery_note_details")[0].item_code = item_code dn.insert() dn.submit() actual_qty_1 = self._get_actual_qty() self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1) si_doc = make_sales_invoice(dn.name) si = frappe.get_doc(si_doc) si.posting_date = dn.posting_date si.debit_to = "_Test Customer - _TC" for d in si.get("entries"): d.income_account = "Sales - _TC" d.cost_center = "_Test Cost Center - _TC" si.insert() si.submit() # insert and submit stock entry for sales return se = frappe.copy_doc(test_records[0]) se.purpose = "Sales Return" se.delivery_note_no = dn.name se.posting_date = "2013-03-10" se.fiscal_year = "_Test Fiscal Year 2013" se.get("mtn_details")[0].qty = se.get( "mtn_details")[0].transfer_qty = returned_qty se.insert() se.submit() actual_qty_2 = self._get_actual_qty() self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2) return se
def _test_delivery_note_return_against_sales_order(self, item_code, delivered_qty, returned_qty): self._insert_material_receipt() from erpnext.selling.doctype.sales_order.test_sales_order import test_records as sales_order_test_records from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice, make_delivery_note actual_qty_0 = self._get_actual_qty() so = frappe.copy_doc(sales_order_test_records[0]) so.get("sales_order_details")[0].item_code = item_code so.get("sales_order_details")[0].qty = 5.0 so.insert() so.submit() dn = make_delivery_note(so.name) dn.status = "Draft" dn.posting_date = so.delivery_date dn.insert() dn.submit() actual_qty_1 = self._get_actual_qty() self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1) si = make_sales_invoice(so.name) si.posting_date = dn.posting_date si.debit_to = "_Test Customer - _TC" for d in si.get("entries"): d.income_account = "Sales - _TC" d.cost_center = "_Test Cost Center - _TC" si.insert() si.submit() # insert and submit stock entry for sales return se = frappe.copy_doc(test_records[0]) se.purpose = "Sales Return" se.delivery_note_no = dn.name se.posting_date = "2013-03-10" se.fiscal_year = "_Test Fiscal Year 2013" se.get("mtn_details")[0].qty = se.get("mtn_details")[0].transfer_qty = returned_qty se.insert() se.submit() actual_qty_2 = self._get_actual_qty() self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2) return se
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 test_make_sales_invoice_from_dn_for_returned_qty(self): from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice so = make_sales_order(qty=2) so.submit() dn = make_delivery_note(so.name) dn.submit() dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-1, do_not_submit=True) dn1.items[0].against_sales_order = so.name dn1.items[0].so_detail = so.items[0].name dn1.submit() si = make_sales_invoice(dn.name) self.assertEquals(si.items[0].qty, 1)
def track_packages(): # track packages and update the status # get all the packing_slips name date_format = convert_user_date_format() now = dt.strptime(datetime_in_user_format(dt.now()), date_format) #scheduler_events should run on 8AM, 12PM, and 5PM condition = ( (now > now.replace(hour=8, minute=0, second=0, microsecond=0) and now < now.replace(hour=9, minute=0, second=0, microsecond=0)) or (now > now.replace(hour=12, minute=0, second=0, microsecond=0) and now < now.replace(hour=13, minute=0, second=0, microsecond=0)) or (now > now.replace(hour=17, minute=0, second=0, microsecond=0) and now < now.replace(hour=18, minute=0, second=0, microsecond=0))) if condition: query = """SELECT DISTINCT ps.delivery_note, ps.name, ps.tracking_id FROM `tabPacking Slip` ps,`tabDelivery Note` dn WHERE ps.docstatus=1 AND dn.docstatus=1 AND dn.is_manual_shipping = 0 AND ps.tracking_status<>'Delivered' AND ps.delivery_note=dn.name""" packing_slips = frappe.db.sql(query, as_dict=True) for ps in packing_slips: status = get_package_tracking_status(ps.get("tracking_id")) # status = get_package_tracking_status("5932428095") # status = get_package_tracking_status("990728071") # In Transit # status = get_package_tracking_status("1Z12345E0291980793") # Delivered if status: code = status.get("code") # update status ps_name = ps.get("name") description = status.get("description").capitalize() query = """UPDATE `tabPacking Slip` SET tracking_status='%s' WHERE name='%s'""" % (description, ps_name) frappe.db.sql(query) query = """UPDATE `tabPacking Slip Details` SET tracking_status='%s' WHERE parent='%s' AND packing_slip='%s'""" % ( description, ps.get("delivery_note"), ps_name) frappe.db.sql(query) if code == "I": si = make_sales_invoice( source_name=ps.get("delivery_note"), target_doc=None) si.save(ignore_permissions=True) create_todo(si.name, ps.get("delivery_note"))
def _test_delivery_note_return(self, item_code, delivered_qty, returned_qty): self._insert_material_receipt() from erpnext.stock.doctype.delivery_note.test_delivery_note \ import test_records as delivery_note_test_records from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice actual_qty_0 = self._get_actual_qty() # make a delivery note based on this invoice dn = frappe.copy_doc(delivery_note_test_records[0]) dn.get("delivery_note_details")[0].item_code = item_code dn.insert() dn.submit() actual_qty_1 = self._get_actual_qty() self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1) si_doc = make_sales_invoice(dn.name) si = frappe.get_doc(si_doc) si.posting_date = dn.posting_date si.debit_to = "_Test Customer - _TC" for d in si.get("entries"): d.income_account = "Sales - _TC" d.cost_center = "_Test Cost Center - _TC" si.insert() si.submit() # insert and submit stock entry for sales return se = frappe.copy_doc(test_records[0]) se.purpose = "Sales Return" se.delivery_note_no = dn.name se.posting_date = "2013-03-10" se.fiscal_year = "_Test Fiscal Year 2013" se.get("mtn_details")[0].qty = se.get("mtn_details")[0].transfer_qty = returned_qty se.insert() se.submit() actual_qty_2 = self._get_actual_qty() self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2) return se
def track_packages(): # track packages and update the status # get all the packing_slips name date_format = convert_user_date_format() now = dt.strptime(datetime_in_user_format(dt.now()), date_format) #scheduler_events should run on 8AM, 12PM, and 5PM condition = ((now > now.replace(hour=8, minute=0, second=0, microsecond=0) and now < now.replace(hour=9, minute=0, second=0, microsecond=0)) or (now > now.replace(hour=12, minute=0, second=0, microsecond=0) and now < now.replace(hour=13, minute=0, second=0, microsecond=0)) or (now > now.replace(hour=17, minute=0, second=0, microsecond=0) and now < now.replace(hour=18, minute=0, second=0, microsecond=0))) if condition: query = """SELECT DISTINCT ps.delivery_note, ps.name, ps.tracking_id FROM `tabPacking Slip` ps,`tabDelivery Note` dn WHERE ps.docstatus=1 AND dn.docstatus=1 AND dn.is_manual_shipping = 0 AND ps.tracking_status<>'Delivered' AND ps.delivery_note=dn.name""" packing_slips = frappe.db.sql(query,as_dict=True) for ps in packing_slips: status = get_package_tracking_status(ps.get("tracking_id")) # status = get_package_tracking_status("5932428095") # status = get_package_tracking_status("990728071") # In Transit # status = get_package_tracking_status("1Z12345E0291980793") # Delivered if status: code = status.get("code") # update status ps_name = ps.get("name") description = status.get("description").capitalize() query = """UPDATE `tabPacking Slip` SET tracking_status='%s' WHERE name='%s'"""%(description, ps_name) frappe.db.sql(query) query = """UPDATE `tabPacking Slip Details` SET tracking_status='%s' WHERE parent='%s' AND packing_slip='%s'"""%(description, ps.get("delivery_note"),ps_name) frappe.db.sql(query) if code == "I": si = make_sales_invoice(source_name=ps.get("delivery_note"), target_doc=None) si.save(ignore_permissions=True) create_todo(si.name, ps.get("delivery_note"))
def test_over_billing_against_dn(self): self.clear_stock_account_balance() _insert_purchase_receipt() from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice _insert_purchase_receipt() dn = frappe.copy_doc(test_records[0]).insert() self.assertRaises(frappe.ValidationError, make_sales_invoice, dn.name) dn = frappe.get_doc("Delivery Note", dn.name) dn.submit() si = make_sales_invoice(dn.name) self.assertEquals(len(si.get("items")), len(dn.get("items"))) # modify amount si.get("items")[0].rate = 200 self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert)
def test_serial_numbers_against_delivery_note(self): """ check if the sales invoice item serial numbers and the delivery note items serial numbers are same """ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item() serial_nos = get_serial_nos(se.get("items")[0].serial_no) dn = create_delivery_note(item=se.get("items")[0].item_code, serial_no=serial_nos[0]) dn.submit() si = make_sales_invoice(dn.name) si.save() self.assertEquals(si.get("items")[0].serial_no, dn.get("items")[0].serial_no)
def test_over_billing_against_dn(self): self.clear_stock_account_balance() _insert_purchase_receipt() from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice _insert_purchase_receipt() dn = frappe.copy_doc(test_records[0]).insert() self.assertRaises(frappe.ValidationError, make_sales_invoice, dn.name) dn = frappe.get_doc("Delivery Note", dn.name) dn.submit() si = make_sales_invoice(dn.name) self.assertEquals(len(si.get("entries")), len(dn.get("delivery_note_details"))) # modify amount si.get("entries")[0].rate = 200 self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert)
def test_dn_billing_status_case2(self): # SO -> SI and SO -> DN1, DN2 from erpnext.selling.doctype.sales_order.sales_order import ( make_delivery_note, make_sales_invoice, ) so = make_sales_order() si = make_sales_invoice(so.name) si.get("items")[0].qty = 5 si.insert() si.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(so.po_no, si.po_no) frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) dn1 = make_delivery_note(so.name) dn1.get("items")[0].qty = 2 dn1.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(so.po_no, dn1.po_no) dn2 = make_delivery_note(so.name) dn2.get("items")[0].qty = 3 dn2.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(so.po_no, dn2.po_no) dn1.load_from_db() self.assertEqual(dn1.get("items")[0].billed_amt, 200) self.assertEqual(dn1.per_billed, 100) self.assertEqual(dn1.status, "Completed") self.assertEqual(dn2.get("items")[0].billed_amt, 300) self.assertEqual(dn2.per_billed, 100) self.assertEqual(dn2.status, "Completed")
def test_serialized(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] dn = create_delivery_note(item_code="_Test Serialized Item With Series", serial_no=serial_no) self.check_serial_no_values(serial_no, { "warehouse": "", "delivery_document_no": dn.name }) si = make_sales_invoice(dn.name) si.insert(ignore_permissions=True) self.assertEqual(dn.items[0].serial_no, si.items[0].serial_no) dn.cancel() self.check_serial_no_values(serial_no, { "warehouse": "_Test Warehouse - _TC", "delivery_document_no": "" })
def test_dn_billing_status_case1(self): # SO -> DN -> SI so = make_sales_order() dn = create_dn_against_so(so.name, delivered_qty=2) self.assertEqual(dn.status, "To Bill") self.assertEqual(dn.per_billed, 0) # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn.po_no, so.po_no) si = make_sales_invoice(dn.name) si.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn.po_no, si.po_no) dn.load_from_db() self.assertEqual(dn.get("items")[0].billed_amt, 200) self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, "Completed")
def test_dn_billing_status_case4(self): # SO -> SI -> DN from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_delivery_note from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice so = make_sales_order() si = make_sales_invoice(so.name) si.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(so.po_no, si.po_no) dn = make_delivery_note(si.name) dn.submit() # Testing if Customer's Purchase Order No was rightly copied self.assertEqual(dn.po_no, si.po_no) self.assertEqual(dn.get("items")[0].billed_amt, 1000) self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, "Completed")
def test_dn_billing_status_case2(self): # SO -> SI and SO -> DN1, DN2 from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note, make_sales_invoice so = make_sales_order() si = make_sales_invoice(so.name) si.get("items")[0].qty = 5 si.insert() si.submit() frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) dn1 = make_delivery_note(so.name) dn1.set_posting_time = 1 dn1.posting_time = "10:00" dn1.get("items")[0].qty = 2 dn1.submit() self.assertEqual(dn1.get("items")[0].billed_amt, 200) self.assertEqual(dn1.per_billed, 100) self.assertEqual(dn1.status, "Completed") dn2 = make_delivery_note(so.name) dn2.set_posting_time = 1 dn2.posting_time = "08:00" dn2.get("items")[0].qty = 4 dn2.submit() dn1.load_from_db() self.assertEqual(dn1.get("items")[0].billed_amt, 100) self.assertEqual(dn1.per_billed, 50) self.assertEqual(dn1.status, "To Bill") self.assertEqual(dn2.get("items")[0].billed_amt, 400) self.assertEqual(dn2.per_billed, 100) self.assertEqual(dn2.status, "Completed")
def _test_delivery_note_return_against_sales_order(self, item_code, delivered_qty, returned_qty): from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice actual_qty_0 = get_qty_after_transaction() so = make_sales_order(qty=50) dn = create_dn_against_so(so.name, delivered_qty) actual_qty_1 = get_qty_after_transaction() self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1) si = make_sales_invoice(so.name) si.insert() si.submit() # insert and submit stock entry for sales return se = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=returned_qty, purpose="Sales Return", delivery_note_no=dn.name) actual_qty_2 = get_qty_after_transaction() self.assertEquals(actual_qty_1 + returned_qty, actual_qty_2) return se
def test_sales_return_for_non_bundled_items_partial(self): company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=50, basic_rate=100) actual_qty_0 = get_qty_after_transaction(warehouse="Stores - TCP1") dn = create_delivery_note(qty=5, rate=500, warehouse="Stores - TCP1", company=company, expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1") actual_qty_1 = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty_0 - 5, actual_qty_1) # outgoing_rate outgoing_rate = frappe.db.get_value("Stock Ledger Entry", { "voucher_type": "Delivery Note", "voucher_no": dn.name }, "stock_value_difference") / 5 # return entry dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-2, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1", do_not_submit=1) dn1.items[0].dn_detail = dn.items[0].name dn1.submit() actual_qty_2 = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty_1 + 2, actual_qty_2) incoming_rate, stock_value_difference = frappe.db.get_value( "Stock Ledger Entry", { "voucher_type": "Delivery Note", "voucher_no": dn1.name }, ["incoming_rate", "stock_value_difference"]) self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3))) stock_in_hand_account = get_inventory_account(company, dn1.items[0].warehouse) gle_warehouse_amount = frappe.db.get_value( "GL Entry", { "voucher_type": "Delivery Note", "voucher_no": dn1.name, "account": stock_in_hand_account }, "debit") self.assertEqual(gle_warehouse_amount, stock_value_difference) # hack because new_doc isn't considering is_return portion of status_updater returned = frappe.get_doc("Delivery Note", dn1.name) returned.update_prevdoc_status() dn.load_from_db() # Check if Original DN updated self.assertEqual(dn.items[0].returned_qty, 2) self.assertEqual(dn.per_returned, 40) from erpnext.controllers.sales_and_purchase_return import make_return_doc return_dn_2 = make_return_doc("Delivery Note", dn.name) # Check if unreturned amount is mapped in 2nd return self.assertEqual(return_dn_2.items[0].qty, -3) si = make_sales_invoice(dn.name) si.submit() self.assertEqual(si.items[0].qty, 3) dn.load_from_db() # DN should be completed on billing all unreturned amount self.assertEqual(dn.items[0].billed_amt, 1500) self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, 'Completed') si.load_from_db() si.cancel() dn.load_from_db() self.assertEqual(dn.per_billed, 0) dn1.cancel() dn.cancel()