Files
QuoteForge/bible-local/09-vendor-spec.md
Michael Chus 67a761345f feat: поддержка импорта BOM Inspur в формате PN*qty
Добавлен парсер для текстового формата Inspur (опциональный '|' в начале
строки, разделитель '*' перед количеством). На BOM-вкладке вставка такого
текста автоматически определяется и разбивается на колонки P/N + Qty без
ручного выбора типов. На бэкенде тот же формат поддерживается через
POST /api/projects/:uuid/vendor-import.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 17:04:10 +03:00

2.5 KiB

09 - Vendor BOM

Storage contract

Vendor BOM is stored in local_configurations.vendor_spec and synced with qt_configurations.vendor_spec.

Each row uses this canonical shape:

{
  "sort_order": 10,
  "vendor_partnumber": "ABC-123",
  "quantity": 2,
  "description": "row description",
  "unit_price": 4500.0,
  "total_price": 9000.0,
  "lot_mappings": [
    { "lot_name": "LOT_A", "quantity_per_pn": 1 }
  ]
}

Rules:

  • lot_mappings[] is the only persisted PN -> LOT mapping contract;
  • QuoteForge does not use legacy BOM tables;
  • apply flow rebuilds cart rows from lot_mappings[].

Partnumber books

Partnumber books are pull-only snapshots from PriceForge.

Local tables:

  • local_partnumber_books
  • local_partnumber_book_items

Server tables:

  • qt_partnumber_books
  • qt_partnumber_book_items

Resolution flow:

  1. load the active local book;
  2. find vendor_partnumber;
  3. copy lots_json into lot_mappings[];
  4. keep unresolved rows editable in the UI.

CFXML import

POST /api/projects/:uuid/vendor-import imports one vendor workspace into an existing project.

Rules:

  • accepted file field is file;
  • maximum file size is 1 GiB;
  • one ProprietaryGroupIdentifier becomes one QuoteForge configuration;
  • software rows stay inside their hardware group and never become standalone configurations;
  • primary group row is selected structurally, without vendor-specific SKU hardcoding;
  • imported configuration order follows workspace order.

Imported configuration fields:

  • name from primary row ProductName
  • server_count from primary row Quantity
  • server_model from primary row ProductDescription
  • article or support_code from ProprietaryProductIdentifier

Imported BOM rows become vendor_spec rows and are resolved through the active local partnumber book when possible.

Inspur BOM import

The same endpoint POST /api/projects/:uuid/vendor-import also accepts Inspur text BOM exports.

Format: one component per line, <partnumber>*<quantity>. A leading | character is optional and stripped. Trailing whitespace around * is normalised.

Example:

|CPU_AMD_9535-EPYC2.4_64C_256M_300W*1
|PowerSupply_1300W_Titanium_220VACor240VDC_GaN*2

Rules:

  • the entire file becomes a single configuration (server_count = 1);
  • configuration name is derived from the uploaded filename (without extension);
  • lines that do not contain *<digits> are skipped;
  • no price data is present in the format; unit_price and total_price are left nil.