From 8726f14512e3e615ca64d11b6e95251980bfb960 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 13 Apr 2026 09:21:07 -0300 Subject: [PATCH] Fix BOM: apply global discount_pct from metadata to all line items MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit oci_bom_gen.py from_spec now reads metadata.discount_pct as fallback when individual line items don't specify a discount. This means discount_pct: 0.45 in the spec metadata applies 45% to every SKU. Previously, global discount was silently ignored — only per-item discount fields were read (defaulting to 0.0). Co-Authored-By: Claude Opus 4.6 (1M context) --- .../opt14-bom-appca.xlsx | Bin 8054 -> 8060 bytes tools/oci_bom_gen.py | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/output-demo-pharma-mx/opt14-bom-appca.xlsx b/examples/output-demo-pharma-mx/opt14-bom-appca.xlsx index 97ee37028a9a80102c6aae1f730a273033485566..1cbc83f141c69baf7e2c4a8e8390210e46b54b18 100644 GIT binary patch delta 3705 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 delta 3699 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 nom-F(2QqQ}=V