724 lines
24 KiB
Markdown
724 lines
24 KiB
Markdown
# AI Data Parsing Instructions
|
|
|
|
## 📋 Quick Reference
|
|
|
|
**Input**: `data/products.csv` (1000 rows with product and accessory data)
|
|
|
|
**Outputs**:
|
|
1. `data/navigation.json` - Smart navigation flow with conditional questions
|
|
2. `data/products.json` - Product catalog with materials, colors, and accessory links
|
|
3. `data/accessories.json` - Accessory options with compatibility rules
|
|
|
|
**Key Features**:
|
|
- ✅ Conditional material questions (only show if multiple materials exist in sub-type)
|
|
- ✅ Conditional color questions (only show if multiple colors available)
|
|
- ✅ Auto-skip questions when only one option exists
|
|
- ✅ Smart product-accessory linking by sub-type, category, or specific product code
|
|
- 🔄 Multi-group assignment using bit values (optional enhancement)
|
|
|
|
---
|
|
|
|
## Overview
|
|
Parse the `data/products.csv` file to generate three separate JSON files that structure product data, navigation, and accessory options for a doors and windows e-commerce application.
|
|
|
|
## Source File Structure
|
|
|
|
### CSV File: `data/products.csv`
|
|
The CSV contains product and accessory data with the following column structure:
|
|
|
|
**Row 1**: Category headers (informational)
|
|
**Row 2**: Column names (actual headers)
|
|
|
|
### Column Mapping (0-indexed):
|
|
- **A (0)**: DISCONT - Discontinued flag (TRUE/FALSE)
|
|
- **B (1)**: LOC_CODE - Location code (e.g., "Iola")
|
|
- **C (2)**: PROD_CODE - Product code (unique identifier)
|
|
- **D (3)**: CATEGORY - Category code
|
|
- **E (4)**: CATEGORY_NEW - New category (usually empty)
|
|
- **F (5)**: DESCRIPTION - Full product description
|
|
- **G (6)**: Base Type - Primary type ("Window", "Door", or empty)
|
|
- **H (7)**: Sub-type Door - Door subcategory (e.g., "Storm Door")
|
|
- **I (8)**: Sub-type Window - Window subcategory (e.g., "Storm Window")
|
|
- **J (9)**: Accessory Yes - Boolean indicating if item is an accessory
|
|
- **K (10)**: This Item - Boolean for specific item relationship
|
|
- **L+ (11+)**: Material and Color availability (Aluminum, Vinyl, Black, White, Bronze, Tan, Mill, Sandstone, etc.)
|
|
|
|
---
|
|
|
|
## Output File 1: `data/navigation.json`
|
|
|
|
### Purpose
|
|
Generate a navigation flow with questions and button options to guide users through product selection.
|
|
|
|
### ⚡ Key Navigation Principles
|
|
|
|
1. **Question 1 (Start)**: Built from Column G (Base Type) - Door, Window, etc.
|
|
2. **Question 2 (Sub-Type)**: Built from Column H (Doors) OR Column I (Windows) based on Q1 selection
|
|
3. **Question 3 (Material)**: **CONDITIONAL** - Only show if sub-type has products with multiple materials (Aluminum AND Vinyl)
|
|
- Example: Storm Doors (all Aluminum) → SKIP this question
|
|
- Example: Mixed Windows (some Aluminum, some Vinyl) → SHOW this question
|
|
4. **Question 4 (Color)**: **CONDITIONAL** - Only show if filtered products have multiple color options
|
|
5. **Question 5 (Dimensions)**: Always show - final step before product display
|
|
6. **Dynamic Linking**: The "next" property must skip questions that aren't needed for that path
|
|
|
|
### Structure
|
|
```json
|
|
{
|
|
"start": {
|
|
"type": "question",
|
|
"inputType": "button",
|
|
"title": "What are you looking for?",
|
|
"subtitle": "Select the product category",
|
|
"answers": [
|
|
{
|
|
"caption": "PRODUCT_TYPE",
|
|
"image": "EMOJI",
|
|
"next": "NEXT_QUESTION_ID",
|
|
"filter": {
|
|
"baseType": "VALUE"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"q-QUESTION_ID": {
|
|
"type": "question",
|
|
"inputType": "button|form",
|
|
"title": "Question Title",
|
|
"subtitle": "Question subtitle",
|
|
"answers": [...],
|
|
"fields": [...]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Generation Rules
|
|
|
|
#### Question 1: Base Type Selection (Start)
|
|
**Source**: Column G (Base Type)
|
|
1. Extract all unique values from column G where DISCONT=FALSE
|
|
2. Create button option for each unique base type (e.g., "Window", "Door")
|
|
3. Assign appropriate emojis (🪟 for windows, 🚪 for doors)
|
|
4. Each answer links to the corresponding sub-type question
|
|
|
|
**Example**: "What are you looking for?" → Window / Door options
|
|
|
|
#### Question 2: Sub-Type Selection
|
|
**Source**: Column H (for Doors) OR Column I (for Windows)
|
|
1. **For Door selection**: Use column H (Sub-type Door)
|
|
- Extract unique values where column G = "Door" and DISCONT=FALSE
|
|
- Examples: "Storm Door", "Patio Door", etc.
|
|
|
|
2. **For Window selection**: Use column I (Sub-type Window)
|
|
- Extract unique values where column G = "Window" and DISCONT=FALSE
|
|
- Examples: "Storm Window", "Casement", etc.
|
|
|
|
3. Create separate question branches:
|
|
- `q-door-type`: For door sub-types
|
|
- `q-window-type`: For window sub-types
|
|
|
|
4. Each answer links to either material question (if needed) or dimensions question
|
|
|
|
**Example**: "What type of door?" → Storm Door / Patio Door options
|
|
|
|
#### Question 3: Material Selection (CONDITIONAL)
|
|
**Source**: Columns L (Aluminum) and M (Vinyl)
|
|
**Important**: This question should **only appear** if products in the selected sub-type have multiple material options.
|
|
|
|
**Logic**:
|
|
1. For each sub-type group, count materials:
|
|
- Count products where Aluminum (column L) = TRUE
|
|
- Count products where Vinyl (column M) = TRUE
|
|
|
|
2. **Show material question** if:
|
|
- Some products have Aluminum=TRUE AND some have Vinyl=TRUE
|
|
- OR any single product has BOTH Aluminum=TRUE AND Vinyl=TRUE
|
|
|
|
3. **Skip material question** if:
|
|
- ALL products in the sub-type have only one material type
|
|
- Example: All "Storm Door" products only have Aluminum=TRUE → Skip material question
|
|
|
|
4. If shown, create radio buttons or select dropdown with:
|
|
- Only materials that exist in the sub-type group
|
|
- Link to color question or dimensions
|
|
|
|
**Example Skip Case**: Storm Doors (all Aluminum only) → Skip directly to dimensions
|
|
**Example Show Case**: Windows (some Aluminum, some Vinyl) → Show material selection
|
|
|
|
#### Question 4: Color Selection (CONDITIONAL)
|
|
**Source**: Color columns (N through S+)
|
|
Similar conditional logic as materials:
|
|
1. Only show if products in the filtered group have multiple color options
|
|
2. Present only colors available for the selected material (if material was selected)
|
|
3. Skip if all products have the same single color
|
|
|
|
#### Question 5: Dimensions Entry (Always Show)
|
|
**Source**: User input
|
|
1. Width input field (number, required)
|
|
2. Height input field (number, required)
|
|
3. This is typically the final question before showing filtered products
|
|
|
|
#### Filter Integration
|
|
Each answer should accumulate filter criteria:
|
|
```json
|
|
"filter": {
|
|
"baseType": "Window|Door",
|
|
"subType": "Storm Door|etc",
|
|
"material": "Aluminum|Vinyl", // Only if material question was shown
|
|
"color": "White|Bronze|etc", // Only if color question was shown
|
|
"category": "CATEGORY_CODE"
|
|
}
|
|
```
|
|
|
|
#### Navigation Flow Schema
|
|
```
|
|
start (Column G)
|
|
→ q-door-type (Column H) OR q-window-type (Column I)
|
|
→ q-material (Columns L,M) [CONDITIONAL - only if multiple materials exist]
|
|
→ q-color (Columns N+) [CONDITIONAL - only if multiple colors exist]
|
|
→ q-dimensions (User Input)
|
|
→ results (Filtered products)
|
|
```
|
|
|
|
**Dynamic Linking**: The "next" value for each question must be calculated based on whether the next conditional question is needed:
|
|
- If material question not needed → link sub-type directly to color or dimensions
|
|
- If color question not needed → link material (or sub-type) directly to dimensions
|
|
|
|
---
|
|
|
|
## Output File 2: `data/products.json`
|
|
|
|
### Purpose
|
|
Store all product data for display on product detail pages.
|
|
|
|
### Structure
|
|
```json
|
|
[
|
|
{
|
|
"id": "PROD_CODE",
|
|
"productCode": "PROD_CODE",
|
|
"category": "CATEGORY",
|
|
"description": "DESCRIPTION",
|
|
"discontinued": false,
|
|
"location": "LOC_CODE",
|
|
"baseType": "Window|Door",
|
|
"subType": {
|
|
"door": "VALUE_OR_NULL",
|
|
"window": "VALUE_OR_NULL"
|
|
},
|
|
"materials": ["Aluminum", "Vinyl"],
|
|
"colors": ["Black", "White", "Bronze", "Tan", "Mill", "Sandstone"],
|
|
"isAccessory": false,
|
|
"compatibleAccessories": ["PROD_CODE1", "PROD_CODE2"]
|
|
}
|
|
]
|
|
```
|
|
|
|
### Generation Rules
|
|
1. **Include all rows** where `DISCONT` (column A) is FALSE
|
|
2. **Skip accessories** (column J = TRUE) - those go in accessories.json
|
|
3. **Materials array**: Include all material columns (L+) where value is TRUE
|
|
4. **Colors array**: Include all color columns where value is TRUE
|
|
5. **baseType**: Copy from column G
|
|
6. **subType**: Create object with "door" and "window" keys from columns H and I
|
|
7. **compatibleAccessories**: Populate based on accessories linked to this product (see Accessories section)
|
|
|
|
---
|
|
|
|
## Output File 3: `data/accessories.json`
|
|
|
|
### Purpose
|
|
Store accessory/option data that can be applied to products (e.g., handles for storm doors, glass inserts).
|
|
|
|
### Structure
|
|
```json
|
|
[
|
|
{
|
|
"id": "PROD_CODE",
|
|
"accessoryCode": "PROD_CODE",
|
|
"category": "CATEGORY",
|
|
"description": "DESCRIPTION",
|
|
"discontinued": false,
|
|
"location": "LOC_CODE",
|
|
"baseType": "Window|Door",
|
|
"materials": ["Aluminum"],
|
|
"colors": ["Black", "White"],
|
|
"compatibilityRules": {
|
|
"type": "subType|category|specific",
|
|
"subTypeDoor": "Storm Door",
|
|
"subTypeWindow": null,
|
|
"categories": ["STD", "INSERTS"],
|
|
"specificProducts": ["6100I", "8100I"],
|
|
"requiresMatch": {
|
|
"material": true,
|
|
"color": false
|
|
}
|
|
},
|
|
"optionType": "handle|insert|hardware|glass",
|
|
"metadata": {
|
|
"specificItemLink": false
|
|
}
|
|
}
|
|
]
|
|
```
|
|
|
|
### Generation Rules
|
|
1. **Include all rows** where `Accessory Yes` (column J) is TRUE
|
|
2. **Skip discontinued** items (column A = TRUE)
|
|
3. **compatibilityRules.type**: Determine based on available data
|
|
- If column H (Sub-type Door) or column I (Sub-type Window) has value → "subType"
|
|
- If column K (This Item) is TRUE → "specific" (requires product linking)
|
|
- Otherwise → "category"
|
|
|
|
4. **compatibilityRules.subTypeDoor/Window**: Copy from columns H and I
|
|
5. **compatibilityRules.categories**: Extract from column D (CATEGORY)
|
|
6. **compatibilityRules.specificProducts**: To be populated based on column K logic
|
|
- If column K is TRUE, this accessory is for specific products
|
|
- You may need to analyze patterns in PROD_CODE or CATEGORY to determine relationships
|
|
- Example: "BGIST" (inserts for storm doors) might be compatible with all storm door products
|
|
|
|
7. **optionType**: Infer from DESCRIPTION or CATEGORY
|
|
- If DESCRIPTION contains "HANDLE" → "handle"
|
|
- If DESCRIPTION contains "INSERT" → "insert"
|
|
- If DESCRIPTION contains "HARDWARE" → "hardware"
|
|
- If DESCRIPTION contains "GLASS" → "glass"
|
|
- Default → "option"
|
|
|
|
8. **requiresMatch**: Set based on whether accessory materials/colors must match product
|
|
- For handles/hardware: material matching often required
|
|
- For inserts: usually flexible
|
|
|
|
---
|
|
|
|
## Multi-Group Assignment (Bit Values Consideration)
|
|
|
|
### Current Structure
|
|
Currently, each product belongs to a single category/sub-type based on columns G, H, and I.
|
|
|
|
### Proposed Enhancement: Bit Flags
|
|
To allow products to appear in multiple navigation groups, consider implementing bit flags for categories:
|
|
|
|
```json
|
|
{
|
|
"productCode": "EXAMPLE",
|
|
"description": "Multi-purpose product",
|
|
"categoryFlags": 7, // Binary: 111 (belongs to groups 1, 2, and 4)
|
|
"categoryBits": {
|
|
"residential": 1, // 2^0 = 1
|
|
"commercial": 2, // 2^1 = 2
|
|
"industrial": 4, // 2^2 = 4
|
|
"custom": 8 // 2^3 = 8
|
|
},
|
|
"navigationGroups": ["residential", "commercial", "industrial"]
|
|
}
|
|
```
|
|
|
|
### Implementation Options
|
|
|
|
#### Option A: Additional CSV Columns
|
|
Add bit value columns to track multiple group memberships:
|
|
- Column U: Navigation Group Bits (integer)
|
|
- Column V: Secondary Category
|
|
- Column W: Tertiary Category
|
|
|
|
#### Option B: Parse from Description/Category
|
|
Analyze DESCRIPTION and CATEGORY fields to identify products that could belong to multiple groups:
|
|
- Keywords indicating dual-purpose (e.g., "residential/commercial")
|
|
- Multiple category codes separated by delimiter
|
|
|
|
#### Option C: JSON-Only Enhancement
|
|
Generate single-group assignments from CSV, then manually or programmatically enhance JSON with additional group memberships based on business rules.
|
|
|
|
### Navigation Impact
|
|
With bit values:
|
|
1. Multiple sub-type paths could lead to the same product
|
|
2. Products appear in search results for multiple filter combinations
|
|
3. Requires modification to filter logic to use bitwise operations
|
|
|
|
**Example**: A storm door that works for both residential and commercial applications could appear in both navigation paths.
|
|
|
|
### Refinement Needed
|
|
This feature requires:
|
|
- ✅ Business rules for multi-group assignment
|
|
- ✅ Decision on implementation approach (CSV vs JSON)
|
|
- ✅ Filter logic updates to handle bitwise comparisons
|
|
- ✅ Testing to ensure products appear in correct groups
|
|
- ✅ UI considerations (showing product appears in multiple categories)
|
|
|
|
---
|
|
|
|
## Data Relationships
|
|
|
|
### Products ↔ Accessories Linking
|
|
|
|
1. **By Sub-Type**: Accessories with matching sub-type values (columns H or I) are compatible
|
|
- Example: Accessory with subTypeDoor="Storm Door" → compatible with all products where subType.door="Storm Door"
|
|
|
|
2. **By Category**: Accessories linked to specific CATEGORY codes
|
|
- Example: Accessory with category="INSERTS" might be compatible with products in "STD" category
|
|
|
|
3. **By Specific Product Code**: Use column K (This Item) flag
|
|
- If TRUE, requires manual mapping or pattern analysis
|
|
- Consider adding a "specificProductCodes" field to link directly
|
|
|
|
### Recommendation Algorithm
|
|
When displaying accessories for a product:
|
|
```
|
|
1. Match by specificProducts first (exact match)
|
|
2. Match by subType (door or window)
|
|
3. Match by category
|
|
4. Filter by material/color compatibility if requiresMatch is true
|
|
5. Exclude discontinued accessories
|
|
```
|
|
|
|
---
|
|
|
|
## Processing Steps
|
|
|
|
### Step 1: Parse CSV
|
|
1. Read products.csv starting from row 3 (skip header rows 1-2)
|
|
2. Split each row by comma delimiter
|
|
3. Handle empty fields appropriately
|
|
4. Parse boolean values (TRUE/FALSE → true/false in JSON)
|
|
|
|
### Step 2: Categorize Rows
|
|
1. Separate products (column J = FALSE) from accessories (column J = TRUE)
|
|
2. Filter out discontinued items (column A = TRUE) or include with flag
|
|
|
|
### Step 3: Extract Navigation Data
|
|
1. Collect unique values from columns G, H, I
|
|
2. For each sub-type group, analyze material and color diversity
|
|
3. Build question hierarchy with conditional logic:
|
|
- Level 1: Base Type (Window, Door) - from column G
|
|
- Level 2: Sub-Type (Storm Door, Casement, etc.) - from columns H/I
|
|
- Level 3: Material (CONDITIONAL) - from columns L, M
|
|
- Level 4: Color (CONDITIONAL) - from color columns
|
|
- Level 5: Dimensions & final inputs
|
|
4. Generate question flow with proper linking (next values)
|
|
|
|
#### Algorithm: Determine Material Question Necessity
|
|
```
|
|
For each sub-type group:
|
|
products = filter products where subType matches AND DISCONT=FALSE
|
|
|
|
aluminumCount = count products where Aluminum (col L) = TRUE
|
|
vinylCount = count products where Vinyl (col M) = TRUE
|
|
bothCount = count products where Aluminum=TRUE AND Vinyl=TRUE
|
|
|
|
IF (aluminumCount > 0 AND vinylCount > 0) OR bothCount > 0:
|
|
SHOW material question for this sub-type
|
|
Create q-material-{subtype} with options for available materials
|
|
ELSE:
|
|
SKIP material question
|
|
Link sub-type answer directly to color question or dimensions
|
|
Auto-apply the single material to filter
|
|
```
|
|
|
|
#### Algorithm: Determine Color Question Necessity
|
|
```
|
|
For each (sub-type, material) combination:
|
|
products = filter products where match AND DISCONT=FALSE
|
|
|
|
availableColors = []
|
|
For each color column (N through S+):
|
|
IF any product has this color = TRUE:
|
|
add color to availableColors
|
|
|
|
IF len(availableColors) > 1:
|
|
SHOW color question for this path
|
|
ELSE IF len(availableColors) = 1:
|
|
SKIP color question
|
|
Auto-apply the single color to filter
|
|
ELSE:
|
|
SKIP color question (no color data)
|
|
```
|
|
|
|
### Step 4: Build Products Array
|
|
1. For each non-accessory, non-discontinued row:
|
|
- Extract all product fields
|
|
- Parse material/color columns into arrays
|
|
- Create product object
|
|
- Add to products array
|
|
|
|
### Step 5: Build Accessories Array
|
|
1. For each accessory row:
|
|
- Extract accessory fields
|
|
- Determine compatibility rules
|
|
- Infer option type from description
|
|
- Create accessory object
|
|
- Add to accessories array
|
|
|
|
### Step 6: Link Products to Accessories
|
|
1. For each product, find compatible accessories based on:
|
|
- Sub-type matching
|
|
- Category matching
|
|
- Specific product code matching
|
|
2. Populate compatibleAccessories array in products.json
|
|
3. Verify bidirectional relationships
|
|
|
|
### Step 7: Validate Output
|
|
1. Ensure all JSON is valid and properly formatted
|
|
2. Check that all question flows have valid "next" links
|
|
3. Verify product-accessory relationships are logical
|
|
4. Confirm no duplicate IDs exist
|
|
|
|
---
|
|
|
|
## Advanced Considerations
|
|
|
|
### Column Extensions
|
|
If additional columns are added beyond column T (~):
|
|
- Check for additional material/color flags
|
|
- Look for price, availability, or specification data
|
|
- Include in metadata or as new product properties
|
|
|
|
### Future Enhancements
|
|
You may want to extend the schema with:
|
|
1. **Pricing**: Add price fields to products and accessories
|
|
2. **Images**: Add image URLs or filenames
|
|
3. **Specifications**: Add detailed specs (dimensions, ratings, etc.)
|
|
4. **Availability**: Add stock levels or lead times
|
|
5. **Sorting**: Add sort order or priority fields
|
|
|
|
---
|
|
|
|
## Example Outputs
|
|
|
|
### Example Product Object
|
|
```json
|
|
{
|
|
"id": "6100I",
|
|
"productCode": "6100I",
|
|
"category": "STD",
|
|
"description": "STAR 6100 FULL VIEW STORM DOOR",
|
|
"discontinued": false,
|
|
"location": "Iola",
|
|
"baseType": "Door",
|
|
"subType": {
|
|
"door": "Storm Door",
|
|
"window": null
|
|
},
|
|
"materials": ["Aluminum"],
|
|
"colors": ["White", "Bronze"],
|
|
"isAccessory": false,
|
|
"compatibleAccessories": ["BGIST", "TGIODD"]
|
|
}
|
|
```
|
|
|
|
### Example Accessory Object
|
|
```json
|
|
{
|
|
"id": "BGIST",
|
|
"accessoryCode": "BGIST",
|
|
"category": "INSERTS",
|
|
"description": "INSERTS FOR STORM DOORS",
|
|
"discontinued": false,
|
|
"location": "Iola",
|
|
"baseType": "Door",
|
|
"materials": ["Aluminum"],
|
|
"colors": ["Black", "White", "Bronze", "Mill", "Sandstone"],
|
|
"compatibilityRules": {
|
|
"type": "subType",
|
|
"subTypeDoor": "Storm Door",
|
|
"subTypeWindow": null,
|
|
"categories": ["STD", "PD"],
|
|
"specificProducts": [],
|
|
"requiresMatch": {
|
|
"material": true,
|
|
"color": false
|
|
}
|
|
},
|
|
"optionType": "insert",
|
|
"metadata": {
|
|
"specificItemLink": false
|
|
}
|
|
}
|
|
```
|
|
|
|
### Example Navigation Flow
|
|
```json
|
|
{
|
|
"start": {
|
|
"type": "question",
|
|
"inputType": "button",
|
|
"title": "What are you looking for?",
|
|
"subtitle": "Select the product category",
|
|
"answers": [
|
|
{
|
|
"caption": "Door",
|
|
"image": "🚪",
|
|
"next": "q-door-type",
|
|
"filter": { "baseType": "Door" }
|
|
},
|
|
{
|
|
"caption": "Window",
|
|
"image": "🪟",
|
|
"next": "q-window-type",
|
|
"filter": { "baseType": "Window" }
|
|
}
|
|
]
|
|
},
|
|
"q-door-type": {
|
|
"type": "question",
|
|
"inputType": "button",
|
|
"title": "What type of door?",
|
|
"subtitle": "Select the door category",
|
|
"answers": [
|
|
{
|
|
"caption": "Storm Door",
|
|
"image": "🚪",
|
|
"next": "q-dimensions",
|
|
"filter": {
|
|
"baseType": "Door",
|
|
"subType": "Storm Door",
|
|
"material": "Aluminum"
|
|
},
|
|
"note": "Material question skipped - all storm doors are aluminum only"
|
|
},
|
|
{
|
|
"caption": "Patio Door",
|
|
"image": "🚪",
|
|
"next": "q-material-patio",
|
|
"filter": {
|
|
"baseType": "Door",
|
|
"subType": "Patio Door"
|
|
},
|
|
"note": "Material question shown - patio doors have multiple material options"
|
|
}
|
|
]
|
|
},
|
|
"q-material-patio": {
|
|
"type": "question",
|
|
"inputType": "button",
|
|
"title": "Select Material",
|
|
"subtitle": "Choose your preferred material for Patio Door",
|
|
"answers": [
|
|
{
|
|
"caption": "Aluminum",
|
|
"image": "🔩",
|
|
"next": "q-color-patio-aluminum",
|
|
"filter": {
|
|
"baseType": "Door",
|
|
"subType": "Patio Door",
|
|
"material": "Aluminum"
|
|
}
|
|
},
|
|
{
|
|
"caption": "Vinyl",
|
|
"image": "🪟",
|
|
"next": "q-color-patio-vinyl",
|
|
"filter": {
|
|
"baseType": "Door",
|
|
"subType": "Patio Door",
|
|
"material": "Vinyl"
|
|
}
|
|
}
|
|
],
|
|
"conditional": {
|
|
"showIf": "multipleOptionsExist",
|
|
"check": "materials",
|
|
"fallbackNext": "q-dimensions"
|
|
}
|
|
},
|
|
"q-color-patio-aluminum": {
|
|
"type": "question",
|
|
"inputType": "button",
|
|
"title": "Select Color",
|
|
"subtitle": "Choose your preferred color",
|
|
"answers": [
|
|
{
|
|
"caption": "White",
|
|
"next": "q-dimensions",
|
|
"filter": {
|
|
"baseType": "Door",
|
|
"subType": "Patio Door",
|
|
"material": "Aluminum",
|
|
"color": "White"
|
|
}
|
|
},
|
|
{
|
|
"caption": "Bronze",
|
|
"next": "q-dimensions",
|
|
"filter": {
|
|
"baseType": "Door",
|
|
"subType": "Patio Door",
|
|
"material": "Aluminum",
|
|
"color": "Bronze"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"q-dimensions": {
|
|
"type": "question",
|
|
"inputType": "form",
|
|
"title": "Enter Product Dimensions",
|
|
"subtitle": "Please provide the measurements",
|
|
"fields": [
|
|
{
|
|
"name": "width",
|
|
"label": "Width (inches)",
|
|
"type": "number",
|
|
"required": true,
|
|
"placeholder": "e.g., 36"
|
|
},
|
|
{
|
|
"name": "height",
|
|
"label": "Height (inches)",
|
|
"type": "number",
|
|
"required": true,
|
|
"placeholder": "e.g., 80"
|
|
}
|
|
],
|
|
"next": "results"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Key Points in Example**:
|
|
- Storm Door skips material question (goes directly to dimensions)
|
|
- Patio Door shows material question (multiple materials available)
|
|
- Material selection leads to color-specific questions
|
|
- All paths eventually reach dimensions entry
|
|
|
|
---
|
|
|
|
## Final Notes
|
|
|
|
1. **Data Quality**: Some rows may have inconsistent data. Handle gracefully with defaults.
|
|
2. **Empty Values**: Treat empty strings as null in JSON
|
|
3. **Boolean Conversion**: CSV TRUE/FALSE should become JSON true/false
|
|
4. **Unique IDs**: PROD_CODE serves as the unique identifier
|
|
5. **Relationships**: The linking between products and accessories may require iterative refinement based on business rules
|
|
|
|
## Questions to Consider
|
|
|
|
When implementing, clarify:
|
|
1. Should discontinued items be included in ANY output file?
|
|
2. How should accessories with column K=TRUE be specifically linked?
|
|
3. Are there additional columns beyond column S that need parsing?
|
|
4. Should colors and materials be validated against a master list?
|
|
5. What should happen if a product has no compatible accessories?
|
|
6. **Should the navigation include filters for materials/colors early, or determine dynamically based on product availability?** ✅ RESOLVED: Dynamic based on availability
|
|
7. **For sub-types with only one material option, should that material be auto-applied to the filter?** → YES, skip question and auto-apply
|
|
8. **Multi-group assignment (bit values):**
|
|
- Should products be able to appear in multiple navigation paths?
|
|
- If yes, how should this be indicated in the CSV? (new column, description parsing, manual JSON editing?)
|
|
- What business rules determine multi-group membership?
|
|
- Should search results indicate a product appears in multiple categories?
|
|
9. **Material/Color question threshold:**
|
|
- Current logic: Show if > 1 option exists
|
|
- Alternative: Show only if > X% of products have multiple options (e.g., 20% threshold)
|
|
- Should we show questions even if only 1-2 products have alternative options?
|
|
|
|
---
|
|
|
|
## Success Criteria
|
|
|
|
The parsing is complete when:
|
|
- ✅ All three JSON files are generated and valid
|
|
- ✅ Products.json contains all non-accessory, non-discontinued products
|
|
- ✅ Accessories.json contains all accessory items with proper compatibility rules
|
|
- ✅ Navigation.json provides a complete question flow from start to product selection
|
|
- ✅ Product-accessory relationships are established and logical
|
|
- ✅ All materials and colors are properly extracted into arrays
|
|
- ✅ No data loss from the original CSV
|