コード例 #1
0
	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)
コード例 #2
0
	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)))
コード例 #3
0
    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
コード例 #4
0
ファイル: test_stock_entry.py プロジェクト: plakesr/erpnext
	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
コード例 #5
0
	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")
コード例 #6
0
    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)
コード例 #7
0
    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)
コード例 #8
0
    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
コード例 #9
0
ファイル: test_delivery_note.py プロジェクト: ankush/erpnext
    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)
コード例 #10
0
    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")
コード例 #11
0
    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")
コード例 #12
0
	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")
コード例 #13
0
    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")
コード例 #14
0
	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")
コード例 #15
0
    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
コード例 #16
0
	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
コード例 #17
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'))
コード例 #18
0
	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)
コード例 #19
0
	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)
コード例 #20
0
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"))
コード例 #21
0
	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
コード例 #22
0
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"))
コード例 #23
0
    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)
コード例 #24
0
	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)
コード例 #25
0
	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)
コード例 #26
0
	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)
コード例 #27
0
ファイル: test_delivery_note.py プロジェクト: ankush/erpnext
    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")
コード例 #28
0
	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": ""
		})
コード例 #29
0
	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": ""
		})
コード例 #30
0
ファイル: test_delivery_note.py プロジェクト: giangdn/teama
    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")
コード例 #31
0
ファイル: test_delivery_note.py プロジェクト: ankush/erpnext
    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")
コード例 #32
0
    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")
コード例 #33
0
    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
コード例 #34
0
	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
コード例 #35
0
ファイル: test_delivery_note.py プロジェクト: giangdn/teama
    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()