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)
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)
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)
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)
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)
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")))
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)
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
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
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)
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)
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()
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)
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)
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()
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()