Update BOM to latest version automatically

If you find a mistake with your BOM after submitting Sales Orders and Production Plans you have a problem. You also have to remember to use the BOM Update Tool to make sure the latest BOM is referenced by other BOMs.

Not anymore!
(Note this does not update Work Orders or Job cards…)

  • Script Type: DocType Event
  • Reference Document Type: BOM
  • DocType Event: After Submit


if doc.is_active and doc.is_default:
    # Make all BOM replacements
    boms = frappe.get_all('BOM',
        filters={'is_default': 0, 'item': doc.item}
    but = frappe.get_doc("BOM Update Tool")
    for bom in boms:
        but.current_bom = bom['name']
        but.new_bom = doc.name

    # Update open Sales Order Items
    sos = frappe.get_all('Sales Order',
        filters={'docstatus': ['<=', 1], 'status': ['!=', 'Completed']}
    for so in sos:
        so_doc = frappe.get_cached_doc('Sales Order', so['name'])
        dirty = False
        for soi_doc in so_doc.items:
            if soi_doc.item_code == doc.item:
                dirty = True
                soi_doc.bom_no = doc.name
        if dirty:
            so_doc.flags.ignore_validate_update_after_submit = True

    # Update open Production Plans
    pps = frappe.get_all('Production Plan',
        filters={'docstatus': ['<=', 1], 'status': ['!=', 'Completed']}
    for pp in pps:
        pp_doc = frappe.get_cached_doc('Production Plan', pp['name'])
        dirty = False
        for ppi_doc in pp_doc.po_items:
            if ppi_doc.item_code == doc.item:
                dirty = True
                ppi_doc.bom_no = doc.name
        if dirty:
            pp_doc.flags.ignore_validate_update_after_submit = True
1 Like