Consolidated Product Import

Merges the BS14 Members, Non-Members and Modifier files into one Flint-format workbook (Products, PriceLevels, Configurators sheets) and downloads it to your device. The format is read live from PRODUCT_IMPORT.md.

Import format reference

Flint Consolidated Product Import

This document is the single source of truth for the consolidated product import format. The import builder (src/lib/buildProductImport.js) reads the machine-readable spec block below from this file at runtime, so the column layout, sheet names, price levels and configurators defined here are exactly what the generated workbook will contain.

If you change the format, edit this file — the builder picks up the change on the next run. No code changes required for structural edits (column additions/renames, sheet renames, price-level or configurator definitions).


Source files

The generator merges three BS14 source workbooks:

| File | Role | |----------------|-----------------------------------------------------------| | Members | Member pricing + container/variant structure | | Non-Members | Default (non-member) sell price per SKU | | Modifiers | SKUs that should attach the "Splash / Fill Up" configurator |

Source URLs are configured in SOURCE_URLS in src/lib/buildProductImport.js.


Output workbook

The generated workbook contains three sheets:

1. Products sheet

One row per product. Containers produce one row with their variants spread across variant_n_* columns; regular products use variant_1_*.

| Column | Meaning | |---------------------------------|---------------------------------------------------------------| | product_name | Product display name | | product_type | Container or Regular | | sku | Product SKU | | dept_code | Department code | | tax_code | Tax code (e.g. VAT20) | | tax_rate | Numeric tax rate parsed from tax_code | | barcode | Product barcode | | cost_price | Buy price | | product_group_codes | Product group codes | | configurator | Configurator name (e.g. Splash / Fill Up) or blank | | import_record | *Import Record flag from source | | delete | Delete flag from source | | variant_n_name | Variant display name (container child short name) | | variant_n_sku | Variant SKU | | variant_n_measure | Measure / size | | variant_n_price_nonmember | Non-member sell price (from Non-Members file, fallback member)| | variant_n_price_member | Member sell price (from Members file) |

n runs from 1 up to the maximum number of variants on any container.

2. PriceLevels sheet

Defines the named price levels used by the variant_n_price_* columns.

3. Configurators sheet

Defines product configurators referenced by the configurator column.


Transformation rules

  1. Containers — Members rows with *Product Type = Container become one product row each. Their child rows (same Parent SKU) become variants.
  2. Regulars — Members rows with no parent and a price become standalone products (single variant_1).
  3. Pricing — Non-member price comes from the Non-Members file by SKU; if missing, falls back to the Members sell price. Member price is the Members sell price.
  4. Configurator — any variant whose SKU appears in the Modifiers file gets Splash / Fill Up in the configurator column.

Machine-readable spec

The builder parses the JSON block below from this file. Do not remove the import-spec tag.

{
  "sheets": {
    "products": "Products",
    "price_levels": "PriceLevels",
    "configurators": "Configurators"
  },
  "product_columns": [
    "product_name",
    "product_type",
    "sku",
    "dept_code",
    "tax_code",
    "tax_rate",
    "barcode",
    "cost_price",
    "product_group_codes",
    "configurator",
    "import_record",
    "delete"
  ],
  "variant_columns": [
    "variant_{n}_name",
    "variant_{n}_sku",
    "variant_{n}_measure",
    "variant_{n}_price_nonmember",
    "variant_{n}_price_member"
  ],
  "price_levels": [
    { "level_name": "Non-Member", "is_default": "Yes" },
    { "level_name": "Member", "is_default": "No" }
  ],
  "configurators": [
    {
      "name": "Splash / Fill Up",
      "step_name": "Choose",
      "selectable_items": "SPLASH;FILL UP",
      "min_selection": 0,
      "max_selection": 1,
      "price_mode": "Follow Transaction"
    }
  ]
}