| # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors |
| # License: GNU General Public License v3. See license.txt |
| |
| from __future__ import unicode_literals |
| |
| import frappe, random, erpnext |
| from frappe.utils.make_random import how_many |
| from frappe.desk import query_report |
| from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError |
| from erpnext.manufacturing.doctype.work_order.test_work_order import make_prod_order_test_record |
| |
| def work(): |
| frappe.set_user(frappe.db.get_global('demo_manufacturing_user')) |
| |
| from erpnext.projects.doctype.timesheet.timesheet import OverlapError |
| |
| ppt = frappe.get_doc("Production Planning Tool", "Production Planning Tool") |
| ppt.company = erpnext.get_default_company() |
| ppt.use_multi_level_bom = 1 |
| ppt.get_items_from = "Sales Order" |
| ppt.purchase_request_for_warehouse = "Stores - WPL" |
| ppt.run_method("get_open_sales_orders") |
| ppt.run_method("get_items") |
| ppt.run_method("raise_work_orders") |
| ppt.run_method("raise_material_requests") |
| frappe.db.commit() |
| |
| # submit work orders |
| for pro in frappe.db.get_values("Work Order", {"docstatus": 0}, "name"): |
| b = frappe.get_doc("Work Order", pro[0]) |
| b.wip_warehouse = "Work in Progress - WPL" |
| b.submit() |
| frappe.db.commit() |
| |
| # submit material requests |
| for pro in frappe.db.get_values("Material Request", {"docstatus": 0}, "name"): |
| b = frappe.get_doc("Material Request", pro[0]) |
| b.submit() |
| frappe.db.commit() |
| |
| # stores -> wip |
| if random.random() < 0.3: |
| for pro in query_report.run("Open Work Orders")["result"][:how_many("Stock Entry for WIP")]: |
| make_stock_entry_from_pro(pro[0], "Material Transfer for Manufacture") |
| |
| # wip -> fg |
| if random.random() < 0.3: |
| for pro in query_report.run("Work Orders in Progress")["result"][:how_many("Stock Entry for FG")]: |
| make_stock_entry_from_pro(pro[0], "Manufacture") |
| |
| for bom in frappe.get_all('BOM', fields=['item'], filters = {'with_operations': 1}): |
| pro_order = make_prod_order_test_record(item=bom.item, qty=2, |
| source_warehouse="Stores - WPL", wip_warehouse = "Work in Progress - WPL", |
| fg_warehouse = "Stores - WPL", company = erpnext.get_default_company(), |
| stock_uom = frappe.db.get_value('Item', bom.item, 'stock_uom'), |
| planned_start_date = frappe.flags.current_date) |
| |
| # submit time logs |
| for timesheet in frappe.get_all("Timesheet", ["name"], {"docstatus": 0, |
| "work_order": ("!=", ""), "to_time": ("<", frappe.flags.current_date)}): |
| timesheet = frappe.get_doc("Timesheet", timesheet.name) |
| try: |
| timesheet.submit() |
| frappe.db.commit() |
| except OverlapError: |
| pass |
| except WorkstationHolidayError: |
| pass |
| |
| def make_stock_entry_from_pro(pro_id, purpose): |
| from erpnext.manufacturing.doctype.work_order.work_order import make_stock_entry |
| from erpnext.stock.stock_ledger import NegativeStockError |
| from erpnext.stock.doctype.stock_entry.stock_entry import IncorrectValuationRateError, \ |
| DuplicateEntryForWorkOrderError, OperationsNotCompleteError |
| |
| try: |
| st = frappe.get_doc(make_stock_entry(pro_id, purpose)) |
| st.posting_date = frappe.flags.current_date |
| st.fiscal_year = str(frappe.flags.current_date.year) |
| for d in st.get("items"): |
| d.cost_center = "Main - " + frappe.db.get_value('Company', st.company, 'abbr') |
| st.insert() |
| frappe.db.commit() |
| st.submit() |
| frappe.db.commit() |
| except (NegativeStockError, IncorrectValuationRateError, DuplicateEntryForWorkOrderError, |
| OperationsNotCompleteError): |
| frappe.db.rollback() |