Files
schuetz3-erpnext/erpnext/demo/user/manufacturing.py
Ankush Menat c07713b860 style: bulk format code with black
v13 port because otherwise backports will result in conflicts always
2022-03-29 17:29:34 +05:30

143 lines
4.3 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
import random
from datetime import timedelta
import frappe
from frappe.desk import query_report
from frappe.utils.make_random import how_many
import erpnext
from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record
def work():
if random.random() < 0.3:
return
frappe.set_user(frappe.db.get_global("demo_manufacturing_user"))
if not frappe.get_all("Sales Order"):
return
ppt = frappe.new_doc("Production Plan")
ppt.company = erpnext.get_default_company()
# ppt.use_multi_level_bom = 1 #refactored
ppt.get_items_from = "Sales Order"
# ppt.purchase_request_for_warehouse = "Stores - WPL" # refactored
ppt.run_method("get_open_sales_orders")
if not ppt.get("sales_orders"):
return
ppt.run_method("get_items")
ppt.run_method("raise_material_requests")
ppt.save()
ppt.submit()
ppt.run_method("raise_work_orders")
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.4:
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.4:
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_wo_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 job card
if random.random() < 0.4:
submit_job_cards()
def make_stock_entry_from_pro(pro_id, purpose):
from erpnext.manufacturing.doctype.work_order.work_order import make_stock_entry
from erpnext.stock.doctype.stock_entry.stock_entry import (
DuplicateEntryForWorkOrderError,
IncorrectValuationRateError,
OperationsNotCompleteError,
)
from erpnext.stock.stock_ledger import NegativeStockError
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.get_cached_value("Company", st.company, "abbr")
st.insert()
frappe.db.commit()
st.submit()
frappe.db.commit()
except (
NegativeStockError,
IncorrectValuationRateError,
DuplicateEntryForWorkOrderError,
OperationsNotCompleteError,
):
frappe.db.rollback()
def submit_job_cards():
work_orders = frappe.get_all(
"Work Order", ["name", "creation"], {"docstatus": 1, "status": "Not Started"}
)
work_order = random.choice(work_orders)
# for work_order in work_orders:
start_date = work_order.creation
work_order = frappe.get_doc("Work Order", work_order.name)
job = frappe.get_all(
"Job Card", ["name", "operation", "work_order"], {"docstatus": 0, "work_order": work_order.name}
)
if not job:
return
job_map = {}
for d in job:
job_map[d.operation] = frappe.get_doc("Job Card", d.name)
for operation in work_order.operations:
job = job_map[operation.operation]
job_time_log = frappe.new_doc("Job Card Time Log")
job_time_log.from_time = start_date
minutes = operation.get("time_in_mins")
job_time_log.time_in_mins = random.randint(int(minutes / 2), minutes)
job_time_log.to_time = job_time_log.from_time + timedelta(minutes=job_time_log.time_in_mins)
job_time_log.parent = job.name
job_time_log.parenttype = "Job Card"
job_time_log.parentfield = "time_logs"
job_time_log.completed_qty = work_order.qty
job_time_log.save(ignore_permissions=True)
job.time_logs.append(job_time_log)
job.save(ignore_permissions=True)
job.submit()
start_date = job_time_log.to_time