def add_items(self, items): self.set('po_items', []) for data in items: item_details = get_item_details(data.item_code) pi = self.append( 'po_items', { 'include_exploded_items': 1, 'warehouse': data.warehouse, 'item_code': data.item_code, 'description': item_details and item_details.description or '', 'stock_uom': item_details and item_details.stock_uom or '', 'bom_no': item_details and item_details.bom_no or '', 'planned_qty': data.pending_qty, 'pending_qty': data.pending_qty, 'planned_start_date': now_datetime(), 'product_bundle_item': data.parent_item }) if self.get_items_from == "Sales Order": pi.sales_order = data.parent pi.sales_order_item = data.name elif self.get_items_from == "Material Request": pi.material_request = data.parent pi.material_request_item = data.name
def raise_work_orders(material_request): mr= frappe.get_doc("Material Request", material_request) errors =[] work_orders = [] default_wip_warehouse = frappe.db.get_single_value("Manufacturing Settings", "default_wip_warehouse") for d in mr.items: if (d.qty - d.ordered_qty) >0: if frappe.db.get_value("BOM", {"item": d.item_code, "is_default": 1}): wo_order = frappe.new_doc("Work Order") wo_order.production_item = d.item_code wo_order.qty = d.qty - d.ordered_qty wo_order.fg_warehouse = d.warehouse wo_order.wip_warehouse = default_wip_warehouse wo_order.description = d.description wo_order.stock_uom = d.stock_uom wo_order.expected_delivery_date = d.schedule_date wo_order.sales_order = d.sales_order wo_order.bom_no = get_item_details(d.item_code).bom_no wo_order.material_request = mr.name wo_order.material_request_item = d.name wo_order.planned_start_date = mr.transaction_date wo_order.company = mr.company wo_order.save() work_orders.append(wo_order.name) else: errors.append(_("Row {0}: Bill of Materials not found for the Item {1}").format(d.idx, d.item_code)) if work_orders: message = ["""<a href="#Form/Work Order/%s" target="_blank">%s</a>""" % \ (p, p) for p in work_orders] msgprint(_("The following Work Orders were created:") + '\n' + new_line_sep(message)) if errors: frappe.throw(_("Productions Orders cannot be raised for:") + '\n' + new_line_sep(errors)) return work_orders
def get_item_data(item_code): item_details = get_item_details(item_code) return { "bom_no": item_details.get("bom_no"), "stock_uom": item_details.get("stock_uom"), "description": item_details.get("description") }
def raise_work_orders(material_request): mr = frappe.get_doc("Material Request", material_request) errors = [] work_orders = [] default_wip_warehouse = frappe.db.get_single_value( "Manufacturing Settings", "default_wip_warehouse") for d in mr.items: if (d.stock_qty - d.ordered_qty) > 0: if frappe.db.exists("BOM", {"item": d.item_code, "is_default": 1}): wo_order = frappe.new_doc("Work Order") wo_order.update({ "production_item": d.item_code, "qty": d.stock_qty - d.ordered_qty, "fg_warehouse": d.warehouse, "wip_warehouse": default_wip_warehouse, "description": d.description, "stock_uom": d.stock_uom, "expected_delivery_date": d.schedule_date, "sales_order": d.sales_order, "sales_order_item": d.get("sales_order_item"), "bom_no": get_item_details(d.item_code).bom_no, "material_request": mr.name, "material_request_item": d.name, "planned_start_date": mr.transaction_date, "company": mr.company, }) wo_order.set_work_order_operations() wo_order.save() work_orders.append(wo_order.name) else: errors.append( _("Row {0}: Bill of Materials not found for the Item {1}"). format(d.idx, get_link_to_form("Item", d.item_code))) if work_orders: work_orders_list = [ get_link_to_form("Work Order", d) for d in work_orders ] if len(work_orders) > 1: msgprint( _("The following {0} were created: {1}").format( frappe.bold(_("Work Orders")), "<br>" + ", ".join(work_orders_list))) else: msgprint( _("The {0} {1} created sucessfully").format( frappe.bold(_("Work Order")), work_orders_list[0])) if errors: frappe.throw( _("Work Order cannot be created for following reason: <br> {0}"). format(new_line_sep(errors))) return work_orders
def raise_work_orders(material_request): mr = frappe.get_doc("Material Request", material_request) errors = [] work_orders = [] default_wip_warehouse = frappe.db.get_single_value( "Manufacturing Settings", "default_wip_warehouse") for d in mr.items: if (d.stock_qty - d.ordered_qty) > 0: if frappe.db.exists("BOM", {"item": d.item_code, "is_default": 1}): wo_order = frappe.new_doc("Work Order") wo_order.update({ "production_item": d.item_code, "qty": d.stock_qty - d.ordered_qty, "production_plan": d.production_plan, "production_plan_item": d.production_plan_item, "fg_warehouse": d.warehouse, "wip_warehouse": default_wip_warehouse, "description": d.description, "stock_uom": d.stock_uom, "expected_delivery_date": d.schedule_date, "sales_order": d.sales_order, "bom_no": get_item_details(d.item_code).bom_no, "material_request": mr.name, "material_request_item": d.name, "material_request_plan_item": d.material_request_plan_item, "planned_start_date": mr.transaction_date, "company": mr.company }) wo_order.set_work_order_operations() wo_order.save() work_orders.append(wo_order.name) else: errors.append( _("Row {0}: Bill of Materials not found for the Item {1}"). format(d.idx, d.item_code)) if work_orders: message = ["""<a href="#Form/Work Order/%s" target="_blank">%s</a>""" % \ (p, p) for p in work_orders] msgprint( _("The following Work Orders were created:") + '\n' + new_line_sep(message)) if errors: frappe.throw( _("Work Order cannot be created for following reason:") + '\n' + new_line_sep(errors)) return work_orders
def add_items(self, items): self.clear_table("items") for p in items: item_details = get_item_details(p['item_code']) pi = self.append('items', {}) pi.warehouse = p['warehouse'] pi.item_code = p['item_code'] pi.description = item_details and item_details.description or '' pi.stock_uom = item_details and item_details.stock_uom or '' pi.bom_no = item_details and item_details.bom_no or '' pi.planned_qty = flt(p['pending_qty']) pi.pending_qty = flt(p['pending_qty']) if self.get_items_from == "Sales Order": pi.sales_order = p['parent'] elif self.get_items_from == "Material Request": pi.material_request = p['parent'] pi.material_request_item = p['name']
def get_item_data(item_code): item_details = get_item_details(item_code) bom_no = item_details.get("bom_no") total_operating_hours = frappe.db.get_value( "BOM Operation", {"parent": bom_no}, "sum(time_in_mins) AS total_operating_time") total_operating_hours = flt(total_operating_hours) / 60.0 total_workstations = frappe.db.count( "BOM Operation", {"parent": bom_no, "workstation": ["!=", ""]}) return { "bom_no": item_details.get("bom_no"), "stock_uom": item_details.get("stock_uom"), "raw_material_cost": item_details.get("raw_material_cost"), "total_operational_cost": item_details.get("operating_cost"), "total_operational_hours": total_operating_hours, "total_workstations": total_workstations # "description": item_details.get("description") }
def raise_work_orders(material_request): mr= frappe.get_doc("Material Request", material_request) errors =[] work_orders = [] default_wip_warehouse = frappe.db.get_single_value("Manufacturing Settings", "default_wip_warehouse") for d in mr.items: if (d.qty - d.ordered_qty) >0: if frappe.db.exists("BOM", {"item": d.item_code, "is_default": 1}): wo_order = frappe.new_doc("Work Order") wo_order.update({ "production_item": d.item_code, "qty": d.qty - d.ordered_qty, "fg_warehouse": d.warehouse, "wip_warehouse": default_wip_warehouse, "description": d.description, "stock_uom": d.stock_uom, "expected_delivery_date": d.schedule_date, "sales_order": d.sales_order, "bom_no": get_item_details(d.item_code).bom_no, "material_request": mr.name, "material_request_item": d.name, "planned_start_date": mr.transaction_date, "company": mr.company }) wo_order.set_work_order_operations() wo_order.save() work_orders.append(wo_order.name) else: errors.append(_("Row {0}: Bill of Materials not found for the Item {1}").format(d.idx, d.item_code)) if work_orders: message = ["""<a href="#Form/Work Order/%s" target="_blank">%s</a>""" % \ (p, p) for p in work_orders] msgprint(_("The following Work Orders were created:") + '\n' + new_line_sep(message)) if errors: frappe.throw(_("Productions Orders cannot be raised for:") + '\n' + new_line_sep(errors)) return work_orders
def add_items(self, items): self.set('po_items', []) for data in items: item_details = get_item_details(data.item_code) pi = self.append('po_items', { 'include_exploded_items': 1, 'warehouse': data.warehouse, 'item_code': data.item_code, 'description': item_details and item_details.description or '', 'stock_uom': item_details and item_details.stock_uom or '', 'bom_no': item_details and item_details.bom_no or '', 'planned_qty': data.pending_qty, 'pending_qty': data.pending_qty, 'planned_start_date': now_datetime(), 'product_bundle_item': data.parent_item }) if self.get_items_from == "Sales Order": pi.sales_order = data.parent pi.sales_order_item = data.name elif self.get_items_from == "Material Request": pi.material_request = data.parent pi.material_request_item = data.name
def add_items(self, items): refs = {} for data in items: item_details = get_item_details(data.item_code) if self.combine_items: if item_details.bom_no in refs: refs[item_details.bom_no]["so_details"].append({ "sales_order": data.parent, "sales_order_item": data.name, "qty": data.pending_qty }) refs[item_details.bom_no]["qty"] += data.pending_qty continue else: refs[item_details.bom_no] = { "qty": data.pending_qty, "po_item_ref": data.name, "so_details": [], } refs[item_details.bom_no]["so_details"].append({ "sales_order": data.parent, "sales_order_item": data.name, "qty": data.pending_qty }) pi = self.append( "po_items", { "warehouse": data.warehouse, "item_code": data.item_code, "description": data.description or item_details.description, "stock_uom": item_details and item_details.stock_uom or "", "bom_no": item_details and item_details.bom_no or "", "planned_qty": data.pending_qty, "pending_qty": data.pending_qty, "planned_start_date": now_datetime(), "product_bundle_item": data.parent_item, }, ) pi._set_defaults() if self.get_items_from == "Sales Order": pi.sales_order = data.parent pi.sales_order_item = data.name pi.description = data.description elif self.get_items_from == "Material Request": pi.material_request = data.parent pi.material_request_item = data.name pi.description = data.description if refs: for po_item in self.po_items: po_item.planned_qty = refs[po_item.bom_no]["qty"] po_item.pending_qty = refs[po_item.bom_no]["qty"] po_item.sales_order = "" self.add_pp_ref(refs)
def add_items(self, items): refs = {} for data in items: item_details = get_item_details(data.item_code) if self.combine_items: if item_details.bom_no in refs: refs[item_details.bom_no]['so_details'].append({ 'sales_order': data.parent, 'sales_order_item': data.name, 'qty': data.pending_qty }) refs[item_details.bom_no]['qty'] += data.pending_qty continue else: refs[item_details.bom_no] = { 'qty': data.pending_qty, 'po_item_ref': data.name, 'so_details': [] } refs[item_details.bom_no]['so_details'].append({ 'sales_order': data.parent, 'sales_order_item': data.name, 'qty': data.pending_qty }) pi = self.append( 'po_items', { 'warehouse': data.warehouse, 'item_code': data.item_code, 'description': data.description or item_details.description, 'stock_uom': item_details and item_details.stock_uom or '', 'bom_no': item_details and item_details.bom_no or '', 'planned_qty': data.pending_qty, 'pending_qty': data.pending_qty, 'planned_start_date': now_datetime(), 'product_bundle_item': data.parent_item, 'delivery_date': data.delivery_date or data.schedule_date or '' }) pi._set_defaults() if self.get_items_from == "Sales Order": pi.sales_order = data.parent pi.sales_order_item = data.name pi.description = data.description pi.delivery_date = data.delivery_date elif self.get_items_from == "Material Request": pi.material_request = data.parent pi.material_request_item = data.name pi.description = data.description pi.schedule_date = data.schedule_date if refs: for po_item in self.po_items: po_item.planned_qty = refs[po_item.bom_no]['qty'] po_item.pending_qty = refs[po_item.bom_no]['qty'] po_item.sales_order = '' self.add_pp_ref(refs)