Beispiel #1
0
	def test_multi_uom_for_purchase(self):
		mr = frappe.copy_doc(test_records[0])
		mr.material_request_type = "Purchase"
		item = mr.items[0]
		mr.schedule_date = today()

		if not frappe.db.get_value("UOM Conversion Detail", {"parent": item.item_code, "uom": "Kg"}):
			item_doc = frappe.get_doc("Item", item.item_code)
			item_doc.append("uoms", {"uom": "Kg", "conversion_factor": 5})
			item_doc.save(ignore_permissions=True)

		item.uom = "Kg"
		for item in mr.items:
			item.schedule_date = mr.schedule_date

		mr.insert()
		self.assertRaises(frappe.ValidationError, make_purchase_order, mr.name)

		mr = frappe.get_doc("Material Request", mr.name)
		mr.submit()
		item = mr.items[0]

		self.assertEqual(item.uom, "Kg")
		self.assertEqual(item.conversion_factor, 5.0)
		self.assertEqual(item.stock_qty, flt(item.qty * 5))

		po = make_purchase_order(mr.name)
		self.assertEqual(po.doctype, "Purchase Order")
		self.assertEqual(len(po.get("items")), len(mr.get("items")))

		po.supplier = "_Test Supplier"
		po.insert()
		po.submit()
		mr = frappe.get_doc("Material Request", mr.name)
		self.assertEqual(mr.per_ordered, 100)
	def test_completed_qty_for_purchase(self):
		existing_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
		existing_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")

		# submit material request of type Purchase
		mr = frappe.copy_doc(test_records[0])
		mr.insert()
		mr.submit()

		# map a purchase order
		po_doc = make_purchase_order(mr.name)
		po_doc.supplier = "_Test Supplier"
		po_doc.transaction_date = "2013-07-07"
		po_doc.schedule_date = "2013-07-09"
		po_doc.get("items")[0].qty = 27.0
		po_doc.get("items")[1].qty = 1.5
		po_doc.get("items")[0].schedule_date = "2013-07-09"
		po_doc.get("items")[1].schedule_date = "2013-07-09"


		# check for stopped status of Material Request
		po = frappe.copy_doc(po_doc)
		po.insert()
		po.load_from_db()
		mr.update_status('Stopped')
		self.assertRaises(frappe.InvalidStatusError, po.submit)
		frappe.db.set(po, "docstatus", 1)
		self.assertRaises(frappe.InvalidStatusError, po.cancel)

		# resubmit and check for per complete
		mr.load_from_db()
		mr.update_status('Submitted')
		po = frappe.copy_doc(po_doc)
		po.insert()
		po.submit()

		# check if per complete is as expected
		mr.load_from_db()
		self.assertEqual(mr.per_ordered, 50)
		self.assertEqual(mr.get("items")[0].ordered_qty, 27.0)
		self.assertEqual(mr.get("items")[1].ordered_qty, 1.5)

		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")

		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1 + 27.0)
		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2 + 1.5)

		po.cancel()
		# check if per complete is as expected
		mr.load_from_db()
		self.assertEqual(mr.per_ordered, 0)
		self.assertEqual(mr.get("items")[0].ordered_qty, 0)
		self.assertEqual(mr.get("items")[1].ordered_qty, 0)

		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")

		self.assertEqual(current_requested_qty_item1, existing_requested_qty_item1 + 54.0)
		self.assertEqual(current_requested_qty_item2, existing_requested_qty_item2 + 3.0)
    def test_update_child_qty_rate(self):
        mr = make_material_request(qty=10)
        po = make_purchase_order(mr.name)
        po.supplier = "_Test Supplier"
        po.items[0].qty = 4
        po.save()
        po.submit()

        create_pr_against_po(po.name)

        make_purchase_invoice(po.name)

        existing_ordered_qty = get_ordered_qty()
        existing_requested_qty = get_requested_qty()

        trans_item = json.dumps([{
            'item_code': '_Test Item',
            'rate': 200,
            'qty': 7,
            'docname': po.items[0].name
        }])
        update_child_qty_rate('Purchase Order', trans_item, po.name)

        mr.reload()
        self.assertEqual(mr.items[0].ordered_qty, 7)
        self.assertEqual(mr.per_ordered, 70)
        self.assertEqual(get_requested_qty(), existing_requested_qty - 3)

        po.reload()
        self.assertEqual(po.get("items")[0].rate, 200)
        self.assertEqual(po.get("items")[0].qty, 7)
        self.assertEqual(po.get("items")[0].amount, 1400)
        self.assertEqual(get_ordered_qty(), existing_ordered_qty + 3)
Beispiel #4
0
    def test_update_child(self):
        mr = make_material_request(qty=10)
        po = make_purchase_order(mr.name)
        po.supplier = "_Test Supplier"
        po.items[0].qty = 4
        po.save()
        po.submit()

        create_pr_against_po(po.name)

        make_pi_from_po(po.name)

        existing_ordered_qty = get_ordered_qty()
        existing_requested_qty = get_requested_qty()

        trans_item = json.dumps([{
            "item_code": "_Test Item",
            "rate": 200,
            "qty": 7,
            "docname": po.items[0].name
        }])
        update_child_qty_rate("Purchase Order", trans_item, po.name)

        mr.reload()
        self.assertEqual(mr.items[0].ordered_qty, 7)
        self.assertEqual(mr.per_ordered, 70)
        self.assertEqual(get_requested_qty(), existing_requested_qty - 3)

        po.reload()
        self.assertEqual(po.get("items")[0].rate, 200)
        self.assertEqual(po.get("items")[0].qty, 7)
        self.assertEqual(po.get("items")[0].amount, 1400)
        self.assertEqual(get_ordered_qty(), existing_ordered_qty + 3)
Beispiel #5
0
	def test_update_child_qty_rate(self):
		mr = make_material_request(qty=10)
		po = make_purchase_order(mr.name)
		po.supplier = "_Test Supplier"
		po.items[0].qty = 4
		po.save()
		po.submit()

		create_pr_against_po(po.name)

		make_purchase_invoice(po.name)

		existing_ordered_qty = get_ordered_qty()
		existing_requested_qty = get_requested_qty()

		trans_item = json.dumps([{'item_code' : '_Test Item', 'rate' : 200, 'qty' : 7, 'docname': po.items[0].name}])
		update_child_qty_rate('Purchase Order', trans_item, po.name)

		mr.reload()
		self.assertEqual(mr.items[0].ordered_qty, 7)
		self.assertEqual(mr.per_ordered, 70)
		self.assertEqual(get_requested_qty(), existing_requested_qty - 3)

		po.reload()
		self.assertEqual(po.get("items")[0].rate, 200)
		self.assertEqual(po.get("items")[0].qty, 7)
		self.assertEqual(po.get("items")[0].amount, 1400)
		self.assertEqual(get_ordered_qty(), existing_ordered_qty + 3)
	def test_completed_qty_for_purchase(self):
		frappe.db.sql("""delete from `tabBin`""")

		# submit material request of type Purchase
		mr = frappe.copy_doc(test_records[0])
		mr.insert()
		mr.submit()

		# check if per complete is None
		self.assertEquals(mr.per_ordered, None)
		self.assertEquals(mr.get("indent_details")[0].ordered_qty, 0)
		self.assertEquals(mr.get("indent_details")[1].ordered_qty, 0)

		self._test_requested_qty(54.0, 3.0)

		# map a purchase order
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order
		po_doc = make_purchase_order(mr.name)
		po_doc.supplier = "_Test Supplier"
		po_doc.transaction_date = "2013-07-07"
		po_doc.get("po_details")[0].qty = 27.0
		po_doc.get("po_details")[1].qty = 1.5
		po_doc.get("po_details")[0].schedule_date = "2013-07-09"
		po_doc.get("po_details")[1].schedule_date = "2013-07-09"


		# check for stopped status of Material Request
		po = frappe.copy_doc(po_doc)
		po.insert()
		po.load_from_db()
		mr.update_status('Stopped')
		self.assertRaises(frappe.InvalidStatusError, po.submit)
		frappe.db.set(po, "docstatus", 1)
		self.assertRaises(frappe.InvalidStatusError, po.cancel)

		# resubmit and check for per complete
		mr.load_from_db()
		mr.update_status('Submitted')
		po = frappe.copy_doc(po_doc)
		po.insert()
		po.submit()

		# check if per complete is as expected
		mr.load_from_db()
		self.assertEquals(mr.per_ordered, 50)
		self.assertEquals(mr.get("indent_details")[0].ordered_qty, 27.0)
		self.assertEquals(mr.get("indent_details")[1].ordered_qty, 1.5)
		self._test_requested_qty(27.0, 1.5)

		po.cancel()
		# check if per complete is as expected
		mr.load_from_db()
		self.assertEquals(mr.per_ordered, None)
		self.assertEquals(mr.get("indent_details")[0].ordered_qty, None)
		self.assertEquals(mr.get("indent_details")[1].ordered_qty, None)

		self._test_requested_qty(54.0, 3.0)
Beispiel #7
0
def run_purchase(current_date):
    # make material requests for purchase items that have negative projected qtys
    if can_make("Material Request"):
        report = "Items To Be Requested"
        for row in query_report.run(
                report)["result"][:how_many("Material Request")]:
            make_material_request(current_date, row[0], -row[-1])

    # get supplier details
    supplier = get_random("Supplier")

    company_currency = frappe.db.get_value("Company", "Wind Power LLC",
                                           "default_currency")
    party_account_currency = get_party_account_currency(
        "Supplier", supplier, "Wind Power LLC")
    if company_currency == party_account_currency:
        exchange_rate = 1
    else:
        exchange_rate = get_exchange_rate(party_account_currency,
                                          company_currency)

    # make supplier quotations
    if can_make("Supplier Quotation"):
        from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation

        report = "Material Requests for which Supplier Quotations are not created"
        for row in query_report.run(
                report)["result"][:how_many("Supplier Quotation")]:
            if row[0] != "'Total'":
                sq = frappe.get_doc(make_supplier_quotation(row[0]))
                sq.transaction_date = current_date
                sq.supplier = supplier
                sq.currency = party_account_currency or company_currency
                sq.conversion_rate = exchange_rate
                sq.insert()
                sq.submit()
                frappe.db.commit()

    # make purchase orders
    if can_make("Purchase Order"):
        from erpnext.stock.doctype.material_request.material_request import make_purchase_order
        report = "Requested Items To Be Ordered"
        for row in query_report.run(
                report)["result"][:how_many("Purchase Order")]:
            if row[0] != "'Total'":
                po = frappe.get_doc(make_purchase_order(row[0]))
                po.supplier = supplier
                po.currency = party_account_currency or company_currency
                po.conversion_rate = exchange_rate
                po.transaction_date = current_date
                po.insert()
                po.submit()
                frappe.db.commit()

    if can_make("Subcontract"):
        make_subcontract(current_date)
Beispiel #8
0
    def test_completed_qty_for_purchase(self):
        frappe.db.sql("""delete from `tabBin`""")

        # submit material request of type Purchase
        mr = frappe.copy_doc(test_records[0])
        mr.insert()
        mr.submit()

        # check if per complete is None
        self.assertEquals(mr.per_ordered, None)
        self.assertEquals(mr.get("indent_details")[0].ordered_qty, 0)
        self.assertEquals(mr.get("indent_details")[1].ordered_qty, 0)

        self._test_requested_qty(54.0, 3.0)

        # map a purchase order
        from erpnext.stock.doctype.material_request.material_request import make_purchase_order
        po_doc = make_purchase_order(mr.name)
        po_doc.supplier = "_Test Supplier"
        po_doc.transaction_date = "2013-07-07"
        po_doc.get("po_details")[0].qty = 27.0
        po_doc.get("po_details")[1].qty = 1.5
        po_doc.get("po_details")[0].schedule_date = "2013-07-09"
        po_doc.get("po_details")[1].schedule_date = "2013-07-09"

        # check for stopped status of Material Request
        po = frappe.copy_doc(po_doc)
        po.insert()
        po.load_from_db()
        mr.update_status('Stopped')
        self.assertRaises(frappe.InvalidStatusError, po.submit)
        frappe.db.set(po, "docstatus", 1)
        self.assertRaises(frappe.InvalidStatusError, po.cancel)

        # resubmit and check for per complete
        mr.load_from_db()
        mr.update_status('Submitted')
        po = frappe.copy_doc(po_doc)
        po.insert()
        po.submit()

        # check if per complete is as expected
        mr.load_from_db()
        self.assertEquals(mr.per_ordered, 50)
        self.assertEquals(mr.get("indent_details")[0].ordered_qty, 27.0)
        self.assertEquals(mr.get("indent_details")[1].ordered_qty, 1.5)
        self._test_requested_qty(27.0, 1.5)

        po.cancel()
        # check if per complete is as expected
        mr.load_from_db()
        self.assertEquals(mr.per_ordered, None)
        self.assertEquals(mr.get("indent_details")[0].ordered_qty, None)
        self.assertEquals(mr.get("indent_details")[1].ordered_qty, None)

        self._test_requested_qty(54.0, 3.0)
Beispiel #9
0
    def test_make_purchase_order(self):
        mr = frappe.copy_doc(test_records[0]).insert()

        self.assertRaises(frappe.ValidationError, make_purchase_order, mr.name)

        mr = frappe.get_doc("Material Request", mr.name)
        mr.submit()
        po = make_purchase_order(mr.name)

        self.assertEqual(po.doctype, "Purchase Order")
        self.assertEqual(len(po.get("items")), len(mr.get("items")))
Beispiel #10
0
def run_purchase(current_date):
    # make material requests for purchase items that have negative projected qtys
    if can_make("Material Request"):
        report = "Items To Be Requested"
        for row in query_report.run(report)["result"][: how_many("Material Request")]:
            make_material_request(current_date, row[0], -row[-1])

            # get supplier details
    supplier = get_random("Supplier")

    company_currency = frappe.db.get_value("Company", "Wind Power LLC", "default_currency")
    party_account_currency = frappe.db.get_value("Supplier", supplier, "party_account_currency")
    if company_currency == party_account_currency:
        exchange_rate = 1
    else:
        exchange_rate = get_exchange_rate(party_account_currency, company_currency)

        # make supplier quotations
    if can_make("Supplier Quotation"):
        from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation

        report = "Material Requests for which Supplier Quotations are not created"
        for row in query_report.run(report)["result"][: how_many("Supplier Quotation")]:
            if row[0] != "'Total'":
                sq = frappe.get_doc(make_supplier_quotation(row[0]))
                sq.transaction_date = current_date
                sq.fiscal_year = cstr(current_date.year)
                sq.supplier = supplier
                sq.currency = party_account_currency or company_currency
                sq.conversion_rate = exchange_rate
                sq.insert()
                sq.submit()
                frappe.db.commit()

                # make purchase orders
    if can_make("Purchase Order"):
        from erpnext.stock.doctype.material_request.material_request import make_purchase_order

        report = "Requested Items To Be Ordered"
        for row in query_report.run(report)["result"][: how_many("Purchase Order")]:
            if row[0] != "'Total'":
                po = frappe.get_doc(make_purchase_order(row[0]))
                po.supplier = supplier
                po.currency = party_account_currency or company_currency
                po.conversion_rate = exchange_rate
                po.transaction_date = current_date
                po.fiscal_year = cstr(current_date.year)
                po.insert()
                po.submit()
                frappe.db.commit()

    if can_make("Subcontract"):
        make_subcontract(current_date)
Beispiel #11
0
    def test_update_remove_child_linked_to_mr(self):
        """Test impact on linked PO and MR on deleting/updating row."""
        mr = make_material_request(qty=10)
        po = make_purchase_order(mr.name)
        po.supplier = "_Test Supplier"
        po.save()
        po.submit()

        first_item_of_po = po.get("items")[0]
        existing_ordered_qty = get_ordered_qty()  # 10
        existing_requested_qty = get_requested_qty()  # 0

        # decrease ordered qty by 3 (10 -> 7) and add item
        trans_item = json.dumps([
            {
                "item_code": first_item_of_po.item_code,
                "rate": first_item_of_po.rate,
                "qty": 7,
                "docname": first_item_of_po.name,
            },
            {
                "item_code": "_Test Item 2",
                "rate": 200,
                "qty": 2
            },
        ])
        update_child_qty_rate("Purchase Order", trans_item, po.name)
        mr.reload()

        # requested qty increases as ordered qty decreases
        self.assertEqual(get_requested_qty(), existing_requested_qty + 3)  # 3
        self.assertEqual(mr.items[0].ordered_qty, 7)

        self.assertEqual(get_ordered_qty(), existing_ordered_qty - 3)  # 7

        # delete first item linked to Material Request
        trans_item = json.dumps([{
            "item_code": "_Test Item 2",
            "rate": 200,
            "qty": 2
        }])
        update_child_qty_rate("Purchase Order", trans_item, po.name)
        mr.reload()

        # requested qty increases as ordered qty is 0 (deleted row)
        self.assertEqual(get_requested_qty(),
                         existing_requested_qty + 10)  # 10
        self.assertEqual(mr.items[0].ordered_qty, 0)

        # ordered qty decreases as ordered qty is 0 (deleted row)
        self.assertEqual(get_ordered_qty(), existing_ordered_qty - 10)  # 0
Beispiel #12
0
    def test_make_purchase_order(self):
        from erpnext.stock.doctype.material_request.material_request import make_purchase_order

        mr = frappe.copy_doc(test_records[0]).insert()

        self.assertRaises(frappe.ValidationError, make_purchase_order, mr.name)

        mr = frappe.get_doc("Material Request", mr.name)
        mr.submit()
        po = make_purchase_order(mr.name)

        self.assertEquals(po.doctype, "Purchase Order")
        self.assertEquals(len(po.get("po_details")),
                          len(mr.get("indent_details")))
	def test_make_purchase_order(self):
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order

		mr = frappe.bean(copy=test_records[0]).insert()

		self.assertRaises(frappe.ValidationError, make_purchase_order, 
			mr.doc.name)

		mr = frappe.bean("Material Request", mr.doc.name)
		mr.submit()
		po = make_purchase_order(mr.doc.name)
		
		self.assertEquals(po[0]["doctype"], "Purchase Order")
		self.assertEquals(len(po), len(mr.doclist))
	def test_make_purchase_order(self):
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order

		mr = frappe.copy_doc(test_records[0]).insert()

		self.assertRaises(frappe.ValidationError, make_purchase_order,
			mr.name)

		mr = frappe.get_doc("Material Request", mr.name)
		mr.submit()
		po = make_purchase_order(mr.name)

		self.assertEquals(po.doctype, "Purchase Order")
		self.assertEquals(len(po.get("items")), len(mr.get("items")))
    def generate_expected_data(self):
        if not frappe.db.exists("Company", "_Test Procurement Company"):
            frappe.get_doc(
                dict(
                    doctype="Company",
                    company_name="_Test Procurement Company",
                    abbr="_TPC",
                    default_currency="INR",
                    country="Pakistan",
                )).insert()
        warehouse = create_warehouse("_Test Procurement Warehouse",
                                     company="_Test Procurement Company")
        mr = make_material_request(company="_Test Procurement Company",
                                   warehouse=warehouse,
                                   cost_center="Main - _TPC")
        po = make_purchase_order(mr.name)
        po.supplier = "_Test Supplier"
        po.get("items")[0].cost_center = "Main - _TPC"
        po.submit()
        pr = make_purchase_receipt(po.name)
        pr.get("items")[0].cost_center = "Main - _TPC"
        pr.submit()
        date_obj = datetime.date(datetime.now())

        po.load_from_db()

        expected_data = {
            "material_request_date": date_obj,
            "cost_center": "Main - _TPC",
            "project": None,
            "requesting_site": "_Test Procurement Warehouse - _TPC",
            "requestor": "Administrator",
            "material_request_no": mr.name,
            "item_code": "_Test Item",
            "quantity": 10.0,
            "unit_of_measurement": "_Test UOM",
            "status": "To Bill",
            "purchase_order_date": date_obj,
            "purchase_order": po.name,
            "supplier": "_Test Supplier",
            "estimated_cost": 0.0,
            "actual_cost": 0.0,
            "purchase_order_amt": po.net_total,
            "purchase_order_amt_in_company_currency": po.base_net_total,
            "expected_delivery_date": date_obj,
            "actual_delivery_date": date_obj,
        }

        return expected_data
Beispiel #16
0
def run_purchase(current_date):
    # make material requests for purchase items that have negative projected qtys
    if can_make("Material Request"):
        report = "Items To Be Requested"
        for row in query_report.run(
                report)["result"][:how_many("Material Request")]:
            mr = frappe.new_doc("Material Request")
            mr.material_request_type = "Purchase"
            mr.transaction_date = current_date
            mr.fiscal_year = cstr(current_date.year)
            mr.append(
                "indent_details", {
                    "doctype": "Material Request Item",
                    "schedule_date": frappe.utils.add_days(current_date, 7),
                    "item_code": row[0],
                    "qty": -row[-1]
                })
            mr.insert()
            mr.submit()

    # make supplier quotations
    if can_make("Supplier Quotation"):
        from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation
        report = "Material Requests for which Supplier Quotations are not created"
        for row in query_report.run(
                report)["result"][:how_many("Supplier Quotation")]:
            if row[0] != "Total":
                sq = frappe.get_doc(make_supplier_quotation(row[0]))
                sq.transaction_date = current_date
                sq.fiscal_year = cstr(current_date.year)
                sq.insert()
                sq.submit()
                frappe.db.commit()

    # make purchase orders
    if can_make("Purchase Order"):
        from erpnext.stock.doctype.material_request.material_request import make_purchase_order
        report = "Requested Items To Be Ordered"
        for row in query_report.run(
                report)["result"][:how_many("Purchase Order")]:
            if row[0] != "Total":
                po = frappe.get_doc(make_purchase_order(row[0]))
                po.transaction_date = current_date
                po.fiscal_year = cstr(current_date.year)
                po.insert()
                po.submit()
                frappe.db.commit()
    def test_multi_uom_for_purchase(self):
        from erpnext.stock.doctype.material_request.material_request import make_purchase_order

        mr = frappe.copy_doc(test_records[0])
        mr.material_request_type = 'Purchase'
        item = mr.items[0]
        mr.schedule_date = today()

        if not frappe.db.get_value('UOM Conversion Detail', {
                'parent': item.item_code,
                'uom': 'Kg'
        }):
            item_doc = frappe.get_doc('Item', item.item_code)
            item_doc.append(
                'uom_conversion_graph',
                {
                    'from_qty': 1,
                    'from_uom': 'Kg',
                    'to_qty': 5,  # conversion factor
                    'to_uom': item_doc.stock_uom
                })
        item_doc.save(ignore_permissions=True)

        item.uom = 'Kg'
        for item in mr.items:
            item.schedule_date = mr.schedule_date

        mr.insert()
        self.assertRaises(frappe.ValidationError, make_purchase_order, mr.name)

        mr = frappe.get_doc("Material Request", mr.name)
        mr.submit()
        item = mr.items[0]

        self.assertEqual(item.uom, "Kg")
        self.assertEqual(item.conversion_factor, 5.0)
        self.assertEqual(item.stock_qty, flt(item.qty * 5))

        po = make_purchase_order(mr.name)
        self.assertEqual(po.doctype, "Purchase Order")
        self.assertEqual(len(po.get("items")), len(mr.get("items")))

        po.supplier = '_Test Supplier'
        po.insert()
        po.submit()
        mr = frappe.get_doc("Material Request", mr.name)
        self.assertEqual(mr.per_ordered, 100)
	def test_completed_qty_for_purchase(self):
		frappe.db.sql("""delete from `tabBin`""")
		
		# submit material request of type Purchase
		mr = frappe.bean(copy=test_records[0])
		mr.insert()
		mr.submit()
		
		# check if per complete is None
		self._test_expected(mr.doclist, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}])
		
		self._test_requested_qty(54.0, 3.0)
		
		# map a purchase order
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order
		po_doclist = make_purchase_order(mr.doc.name)
		po_doclist[0].supplier = "_Test Supplier"
		po_doclist[0].transaction_date = "2013-07-07"
		po_doclist[1].qty = 27.0
		po_doclist[2].qty = 1.5
		po_doclist[1].schedule_date = "2013-07-09"
		po_doclist[2].schedule_date = "2013-07-09"

		
		# check for stopped status of Material Request
		po = frappe.bean(copy=po_doclist)
		po.insert()
		mr.obj.update_status('Stopped')
		self.assertRaises(frappe.ValidationError, po.submit)
		self.assertRaises(frappe.ValidationError, po.cancel)

		mr.obj.update_status('Submitted')
		po = frappe.bean(copy=po_doclist)
		po.insert()
		po.submit()
		
		# check if per complete is as expected
		mr.load_from_db()
		self._test_expected(mr.doclist, [{"per_ordered": 50}, {"ordered_qty": 27.0}, {"ordered_qty": 1.5}])
		self._test_requested_qty(27.0, 1.5)
		
		po.cancel()
		# check if per complete is as expected
		mr.load_from_db()
		self._test_expected(mr.doclist, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}])
		self._test_requested_qty(54.0, 3.0)
Beispiel #19
0
def run_purchase(current_date):
	# make material requests for purchase items that have negative projected qtys
	if can_make("Material Request"):
		report = "Items To Be Requested"
		for row in query_report.run(report)["result"][:how_many("Material Request")]:
			mr = webnotes.new_bean("Material Request")
			mr.doc.material_request_type = "Purchase"
			mr.doc.transaction_date = current_date
			mr.doc.fiscal_year = cstr(current_date.year)
			mr.doclist.append({
				"doctype": "Material Request Item",
				"parentfield": "indent_details",
				"schedule_date": webnotes.utils.add_days(current_date, 7),
				"item_code": row[0],
				"qty": -row[-1]
			})
			mr.insert()
			mr.submit()
	
	# make supplier quotations
	if can_make("Supplier Quotation"):
		from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation
		report = "Material Requests for which Supplier Quotations are not created"
		for row in query_report.run(report)["result"][:how_many("Supplier Quotation")]:
			if row[0] != "Total":
				sq = webnotes.bean(make_supplier_quotation(row[0]))
				sq.doc.transaction_date = current_date
				sq.doc.fiscal_year = cstr(current_date.year)
				sq.insert()
				sq.submit()
				webnotes.conn.commit()
		
	# make purchase orders
	if can_make("Purchase Order"):
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order
		report = "Requested Items To Be Ordered"
		for row in query_report.run(report)["result"][:how_many("Purchase Order")]:
			if row[0] != "Total":
				po = webnotes.bean(make_purchase_order(row[0]))
				po.doc.transaction_date = current_date
				po.doc.fiscal_year = cstr(current_date.year)
				po.insert()
				po.submit()
				webnotes.conn.commit()
	def test_multi_uom_for_purchase(self):
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order

		mr = frappe.copy_doc(test_records[0])
		mr.material_request_type = 'Purchase'
		item = mr.items[0]
		mr.schedule_date = today()

		if not frappe.db.get_value('UOM Conversion Detail',
			 {'parent': item.item_code, 'uom': 'Kg'}):
			 item_doc = frappe.get_doc('Item', item.item_code)
			 item_doc.append('uoms', {
				 'uom': 'Kg',
				 'conversion_factor': 5
			 })
			 item_doc.save(ignore_permissions=True)

		item.uom = 'Kg'
		for item in mr.items:
			item.schedule_date = mr.schedule_date

		mr.insert()
		self.assertRaises(frappe.ValidationError, make_purchase_order,
			mr.name)

		mr = frappe.get_doc("Material Request", mr.name)
		mr.submit()
		item = mr.items[0]

		self.assertEquals(item.uom, "Kg")
		self.assertEquals(item.conversion_factor, 5.0)
		self.assertEquals(item.stock_qty, flt(item.qty * 5))

		po = make_purchase_order(mr.name)
		self.assertEquals(po.doctype, "Purchase Order")
		self.assertEquals(len(po.get("items")), len(mr.get("items")))

		po.supplier = '_Test Supplier'
		po.insert()
		po.submit()
		mr = frappe.get_doc("Material Request", mr.name)
		self.assertEquals(mr.per_ordered, 100)
Beispiel #21
0
    def setup_material_request(self, order=False, receive=False, days=0):
        po = None
        test_records = frappe.get_test_records("Material Request")

        mr = frappe.copy_doc(test_records[0])
        mr.transaction_date = add_days(today(), days)
        mr.schedule_date = add_days(mr.transaction_date, 1)
        for row in mr.items:
            row.item_code = "Test MR Report Item"
            row.item_name = "Test MR Report Item"
            row.description = "Test MR Report Item"
            row.uom = "Nos"
            row.schedule_date = mr.schedule_date
        mr.submit()

        if order or receive:
            po = make_purchase_order(mr.name)
            po.supplier = "_Test Supplier"
            po.submit()
            if receive:
                pr = make_purchase_receipt(po.name)
                pr.submit()
Beispiel #22
0
def run_purchase(current_date):
	# make material requests for purchase items that have negative projected qtys
	if can_make("Material Request"):
		report = "Items To Be Requested"
		for row in query_report.run(report)["result"][:how_many("Material Request")]:
			make_material_request(current_date, row[0], -row[-1])

	# make supplier quotations
	if can_make("Supplier Quotation"):
		from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation

		report = "Material Requests for which Supplier Quotations are not created"
		for row in query_report.run(report)["result"][:how_many("Supplier Quotation")]:
			if row[0] != "'Total'":
				sq = frappe.get_doc(make_supplier_quotation(row[0]))
				sq.transaction_date = current_date
				sq.fiscal_year = cstr(current_date.year)
				sq.supplier = get_random("Supplier")
				sq.insert()
				sq.submit()
				frappe.db.commit()

	# make purchase orders
	if can_make("Purchase Order"):
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order
		report = "Requested Items To Be Ordered"
		for row in query_report.run(report)["result"][:how_many("Purchase Order")]:
			if row[0] != "'Total'":
				po = frappe.get_doc(make_purchase_order(row[0]))
				po.supplier = get_random("Supplier")
				po.transaction_date = current_date
				po.fiscal_year = cstr(current_date.year)
				po.insert()
				po.submit()
				frappe.db.commit()

	if can_make("Subcontract"):
		make_subcontract(current_date)
def reorder_stock(item_code):
    mr = make_material_request(item_code)
    po = make_purchase_order(mr.name)
    po.supplier = random.choice(SUPPLIERS)
    po.transaction_date = frappe.flags.current_date
    po.insert()
    po.submit()
    pr = make_purchase_receipt(po.name)
    pr.set_posting_time = True
    pr.posting_date = frappe.flags.current_date
    pr.insert()
    pr.submit()
    pi = make_purchase_invoice(pr.name)
    pi.set_posting_time = True
    pi.posting_date = frappe.flags.current_date
    pi.insert()
    pi.submit()
    pe = frappe.new_doc("Journal Entry")
    pe.update(get_payment_entry_against_invoice("Purchase Invoice", pi.name))
    pe.posting_date = frappe.flags.current_date
    pe.voucher_type = "Cash Entry"
    pe.insert()
    pe.submit()
	def test_completed_qty_for_purchase(self):
		existing_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
		existing_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")

		# submit material request of type Purchase
		mr = frappe.copy_doc(test_records[0])
		mr.insert()
		mr.submit()

		# check if per complete is None
		mr.load_from_db()
		self.assertEquals(mr.per_ordered, 0)
		self.assertEquals(mr.get("items")[0].ordered_qty, 0)
		self.assertEquals(mr.get("items")[1].ordered_qty, 0)

		# map a purchase order
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order
		po_doc = make_purchase_order(mr.name)
		po_doc.supplier = "_Test Supplier"
		po_doc.transaction_date = "2013-07-07"
		po_doc.schedule_date = "2013-07-09"
		po_doc.get("items")[0].qty = 27.0
		po_doc.get("items")[1].qty = 1.5
		po_doc.get("items")[0].schedule_date = "2013-07-09"
		po_doc.get("items")[1].schedule_date = "2013-07-09"


		# check for stopped status of Material Request
		po = frappe.copy_doc(po_doc)
		po.insert()
		po.load_from_db()
		mr.update_status('Stopped')
		self.assertRaises(frappe.InvalidStatusError, po.submit)
		frappe.db.set(po, "docstatus", 1)
		self.assertRaises(frappe.InvalidStatusError, po.cancel)

		# resubmit and check for per complete
		mr.load_from_db()
		mr.update_status('Submitted')
		po = frappe.copy_doc(po_doc)
		po.insert()
		po.submit()

		# check if per complete is as expected
		mr.load_from_db()
		self.assertEquals(mr.per_ordered, 50)
		self.assertEquals(mr.get("items")[0].ordered_qty, 27.0)
		self.assertEquals(mr.get("items")[1].ordered_qty, 1.5)

		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")

		self.assertEquals(current_requested_qty_item1, existing_requested_qty_item1 + 27.0)
		self.assertEquals(current_requested_qty_item2, existing_requested_qty_item2 + 1.5)

		po.cancel()
		# check if per complete is as expected
		mr.load_from_db()
		self.assertEquals(mr.per_ordered, 0)
		self.assertEquals(mr.get("items")[0].ordered_qty, 0)
		self.assertEquals(mr.get("items")[1].ordered_qty, 0)

		current_requested_qty_item1 = self._get_requested_qty("_Test Item Home Desktop 100", "_Test Warehouse - _TC")
		current_requested_qty_item2 = self._get_requested_qty("_Test Item Home Desktop 200", "_Test Warehouse - _TC")

		self.assertEquals(current_requested_qty_item1, existing_requested_qty_item1 + 54.0)
		self.assertEquals(current_requested_qty_item2, existing_requested_qty_item2 + 3.0)
Beispiel #25
0
def run_purchase(current_date):

	if can_make("Material Request"):
		report = "Items To Be Requested"
		for row in query_report.run(report)["result"][:how_many("Material Request")]:
			mr = make_material_request(current_date, row[0], -row[-1])

			if mr and can_make("Request for Quotation"):
				rfq = make_request_for_quotation(mr.name)
				rfq.transaction_date = current_date
				rfq.status = "Draft"
				rfq.company = 'Wind Power LLC'
				add_suppliers(rfq)
				rfq.message_for_supplier = 'Please supply the specified items at the best possible rates.'
				rfq.save()
				rfq.submit()

				# Make suppier quotation from RFQ against each supplier.

				for supplier in rfq.suppliers:
					supplier_quotation = make_quotation_from_rfq(rfq.name, supplier.supplier)
					supplier_quotation.save()
					supplier_quotation.submit()

	# get supplier details
	supplier = get_random("Supplier")

	company_currency = frappe.db.get_value("Company", "Wind Power LLC", "default_currency")
	party_account_currency = get_party_account_currency("Supplier", supplier, "Wind Power LLC")
	if company_currency == party_account_currency:
		exchange_rate = 1
	else:
		exchange_rate = get_exchange_rate(party_account_currency, company_currency)

	# make supplier quotations
	if can_make("Supplier Quotation"):
		from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation

		report = "Material Requests for which Supplier Quotations are not created"
		for row in query_report.run(report)["result"][:how_many("Supplier Quotation")]:
			if row[0] != "'Total'":
				sq = frappe.get_doc(make_supplier_quotation(row[0]))
				sq.transaction_date = current_date
				sq.supplier = supplier
				sq.currency = party_account_currency or company_currency
				sq.conversion_rate = exchange_rate
				sq.insert()
				sq.submit()
				frappe.db.commit()

	# make purchase orders
	if can_make("Purchase Order"):
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order
		report = "Requested Items To Be Ordered"
		for row in query_report.run(report)["result"][:how_many("Purchase Order")]:
			if row[0] != "'Total'":
				po = frappe.get_doc(make_purchase_order(row[0]))
				po.supplier = supplier
				po.currency = party_account_currency or company_currency
				po.conversion_rate = exchange_rate
				po.transaction_date = current_date
				po.insert()
				po.submit()
				frappe.db.commit()

	if can_make("Subcontract"):
		make_subcontract(current_date)
Beispiel #26
0
def run():
	frappe.set_user("*****@*****.**")
	frappe.set_user_lang("fr")

	if random.random() < 0.6:
		report = "Items To Be Requested"
		for row in query_report.run(report)["result"][:random.randint(1, 5)]:
			item_code, qty = row[0], abs(row[-1])

			mr = make_material_request(item_code, qty)

	if random.random() < 0.6:
		for mr in frappe.get_all('Material Request',
			filters={'material_request_type': 'Purchase', 'status': 'Open'},
			limit=random.randint(1,6)):
			if not frappe.get_all('Request for Quotation',
				filters={'material_request': mr.name}, limit=1):
				rfq = make_request_for_quotation(mr.name)
				rfq.transaction_date = frappe.flags.current_date
				add_suppliers(rfq)
				rfq.save()
				rfq.submit()

	# Make suppier quotation from RFQ against each supplier.
	if random.random() < 0.6:
		for rfq in frappe.get_all('Request for Quotation',
			filters={'status': 'Open'}, limit=random.randint(1, 6)):
			if not frappe.get_all('Supplier Quotation',
				filters={'request_for_quotation': rfq.name}, limit=1):
				rfq = frappe.get_doc('Request for Quotation', rfq.name)

				for supplier in rfq.suppliers:
					supplier_quotation = make_quotation_from_rfq(rfq.name, supplier.supplier)
					supplier_quotation.save()
					supplier_quotation.submit()

	# get supplier details
	supplier = get_random("Supplier")

	company_currency = frappe.get_cached_value('Company', erpnext.get_default_company(), "default_currency")
	party_account_currency = get_party_account_currency("Supplier", supplier, erpnext.get_default_company())
	if company_currency == party_account_currency:
		exchange_rate = 1
	else:
		exchange_rate = get_exchange_rate(party_account_currency, company_currency, args="for_buying")

	# make supplier quotations
	if random.random() < 0.5:
		from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation

		report = "Material Requests for which Supplier Quotations are not created"
		for row in query_report.run(report)["result"][:random.randint(1, 3)]:
			if row[0] != "Total":
				sq = frappe.get_doc(make_supplier_quotation(row[0]))
				sq.transaction_date = frappe.flags.current_date
				sq.supplier = supplier
				sq.currency = party_account_currency or company_currency
				sq.conversion_rate = exchange_rate
				sq.insert()
				sq.submit()
				frappe.db.commit()

	# make purchase orders
	if random.random() < 0.5:
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order
		report = "Requested Items To Be Ordered"
		for row in query_report.run(report)["result"][:how_many("Purchase Order")]:
			if row[0] != "Total":
				try:
					po = frappe.get_doc(make_purchase_order(row[0]))
					po.supplier = supplier
					po.currency = party_account_currency or company_currency
					po.conversion_rate = exchange_rate
					po.transaction_date = frappe.flags.current_date
					po.insert()
					po.submit()
				except Exception:
					pass
				else:
					frappe.db.commit()

	if random.random() < 0.5:
		make_subcontract()
Beispiel #27
0
def work():
	frappe.set_user(frappe.db.get_global('demo_purchase_user'))

	if random.random() < 0.3:
		report = "Items To Be Requested"
		for row in query_report.run(report)["result"][:random.randint(1, 5)]:
			item_code, qty = row[0], abs(row[-1])

			mr = make_material_request(item_code, qty)

	if random.random() < 0.3:
		for mr in frappe.get_all('Material Request',
			filters={'material_request_type': 'Purchase', 'status': 'Open'},
			limit=random.randint(1,6)):
			if not frappe.get_all('Request for Quotation',
				filters={'material_request': mr.name}, limit=1):
				rfq = make_request_for_quotation(mr.name)
				rfq.transaction_date = frappe.flags.current_date
				add_suppliers(rfq)
				rfq.save()
				rfq.submit()

	# Make suppier quotation from RFQ against each supplier.
	if random.random() < 0.3:
		for rfq in frappe.get_all('Request for Quotation',
			filters={'status': 'Open'}, limit=random.randint(1, 6)):
			if not frappe.get_all('Supplier Quotation',
				filters={'request_for_quotation': rfq.name}, limit=1):
				rfq = frappe.get_doc('Request for Quotation', rfq.name)

				for supplier in rfq.suppliers:
					supplier_quotation = make_quotation_from_rfq(rfq.name, supplier.supplier)
					supplier_quotation.save()
					supplier_quotation.submit()

	# get supplier details
	supplier = get_random("Supplier")

	company_currency = frappe.db.get_value("Company", "Wind Power LLC", "default_currency")
	party_account_currency = get_party_account_currency("Supplier", supplier, "Wind Power LLC")
	if company_currency == party_account_currency:
		exchange_rate = 1
	else:
		exchange_rate = get_exchange_rate(party_account_currency, company_currency)

	# make supplier quotations
	if random.random() < 0.2:
		from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation

		report = "Material Requests for which Supplier Quotations are not created"
		for row in query_report.run(report)["result"][:random.randint(1, 3)]:
			if row[0] != "'Total'":
				sq = frappe.get_doc(make_supplier_quotation(row[0]))
				sq.transaction_date = frappe.flags.current_date
				sq.supplier = supplier
				sq.currency = party_account_currency or company_currency
				sq.conversion_rate = exchange_rate
				sq.insert()
				sq.submit()
				frappe.db.commit()

	# make purchase orders
	if random.random() < 0.5:
		from erpnext.stock.doctype.material_request.material_request import make_purchase_order
		report = "Requested Items To Be Ordered"
		for row in query_report.run(report)["result"][:how_many("Purchase Order")]:
			if row[0] != "'Total'":
				po = frappe.get_doc(make_purchase_order(row[0]))
				po.supplier = supplier
				po.currency = party_account_currency or company_currency
				po.conversion_rate = exchange_rate
				po.transaction_date = frappe.flags.current_date
				po.insert()
				po.submit()
				frappe.db.commit()

	if random.random() < 0.2:
		make_subcontract()