diff --git a/.claude/skills/report-an-issue/SKILL.md b/.claude/skills/report-an-issue/SKILL.md index 431b80683..242a501f9 100644 --- a/.claude/skills/report-an-issue/SKILL.md +++ b/.claude/skills/report-an-issue/SKILL.md @@ -41,8 +41,7 @@ Then help them write the *private* report using the same evidence-gathering belo here — do not draft a public issue. **The one exception people trip over:** the demo and staging deployments run with -`AUTH_MODE=dev`, which intentionally disables login and treats everyone as the seeded -`demo@gable.com` admin. On a deployment that is *deliberately* a demo or staging sandbox +`AUTH_MODE=dev`, which intentionally disables login and treats everyone as an admin. On a deployment that is *deliberately* a demo or staging sandbox that is expected and safe (the data is fake). It is only a security issue if you find it on a host that is meant to be real. See `SECURITY.md` § "`AUTH_MODE=dev` must never reach production". diff --git a/core/internal/app/seed/demodata.go b/core/internal/app/seed/demodata.go index 817c25967..d679cbe19 100644 --- a/core/internal/app/seed/demodata.go +++ b/core/internal/app/seed/demodata.go @@ -759,7 +759,7 @@ func importCustomers(ctx context.Context, db *sql.DB, yards map[string]uuid.UUID // importStaff reads demodata/staff.jsonl and upserts each row into staff // and user_locations (the staff-home / yard grant). The legacy seed's three -// AI_LM demo rows (dispatcher@gable.com, yard@gable.com, admin@gable.com) +// AI_LM demo rows (dispatcher@gablebuildingsupply.example, yard@gablebuildingsupply.example, admin@gablebuildingsupply.example) // and the nine multi yard personas live in the same table and are preserved. func importStaff(ctx context.Context, db *sql.DB, yards map[string]uuid.UUID) error { scanner := bufio.NewScanner(bytes.NewReader(staffData)) diff --git a/core/internal/app/seed/demodata/catalog.jsonl b/core/internal/app/seed/demodata/catalog.jsonl index e704cb4e1..b02a203c5 100644 --- a/core/internal/app/seed/demodata/catalog.jsonl +++ b/core/internal/app/seed/demodata/catalog.jsonl @@ -373,19 +373,19 @@ {"sku":"PLS_ACXFIR_T050","description":"Plywood 0.5 4x8 ACX Fir","department":"Yard","category_slug":"lumber.sheathing","vendor_key":"GABLE_INTERNAL","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32}],"species":"Fir","grade":"ACX Fir","treatment":"Select","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":26.6,"cost":55.0,"price":78.57,"contractor_price":66.78,"vip_price":58.93,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"plywood_select_sheet","barcode":"2000100002614","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":240,"reorder_point":72,"reorder_qty":240},"WK":{"on_hand":72,"reorder_point":72,"reorder_qty":240},"LK":{"on_hand":24,"reorder_point":72,"reorder_qty":240}}} {"sku":"PLS_ACXFIR_T075","description":"Plywood 0.75 4x8 ACX Fir","department":"Yard","category_slug":"lumber.sheathing","vendor_key":"GABLE_INTERNAL","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32}],"species":"Fir","grade":"ACX Fir","treatment":"Select","board_thickness_in":0.75,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.75,"stackable":true,"weight_lbs":39.1,"cost":65.0,"price":92.86,"contractor_price":78.93,"vip_price":69.65,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"plywood_select_sheet","barcode":"2000100002621","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":315,"reorder_point":94,"reorder_qty":315},"WK":{"on_hand":94,"reorder_point":94,"reorder_qty":315},"LK":{"on_hand":31,"reorder_point":94,"reorder_qty":315}}} {"sku":"DW_14_REG_48","description":"Drywall 0.25 4X8 Regular","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Regular","treatment":"Sheet","board_thickness_in":0.25,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.25,"stackable":true,"weight_lbs":24.75,"cost":13.0,"price":16.67,"contractor_price":14.17,"vip_price":12.5,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002628","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":228,"reorder_point":68,"reorder_qty":228},"WK":{"on_hand":68,"reorder_point":68,"reorder_qty":228},"LK":{"on_hand":22,"reorder_point":68,"reorder_qty":228}}} -{"sku":"DW_14_FC_48","description":"Drywall 0.25 4X8 Firecode","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Firecode","treatment":"Sheet","board_thickness_in":0.25,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.25,"stackable":true,"weight_lbs":24.75,"cost":16.9,"price":21.67,"contractor_price":18.42,"vip_price":16.25,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002635","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":228,"reorder_point":68,"reorder_qty":228},"WK":{"on_hand":68,"reorder_point":68,"reorder_qty":228},"LK":{"on_hand":22,"reorder_point":68,"reorder_qty":228}}} +{"sku":"DW_14_FC_48","description":"Drywall 0.25 4X8 Type X","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Type X","treatment":"Sheet","board_thickness_in":0.25,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.25,"stackable":true,"weight_lbs":24.75,"cost":16.9,"price":21.67,"contractor_price":18.42,"vip_price":16.25,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002635","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":228,"reorder_point":68,"reorder_qty":228},"WK":{"on_hand":68,"reorder_point":68,"reorder_qty":228},"LK":{"on_hand":22,"reorder_point":68,"reorder_qty":228}}} {"sku":"DW_14_MR_48","description":"Drywall 0.25 4X8 Moisture Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Moisture Resistant","treatment":"Sheet","board_thickness_in":0.25,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.25,"stackable":true,"weight_lbs":24.75,"cost":18.85,"price":24.17,"contractor_price":20.54,"vip_price":18.13,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002642","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":228,"reorder_point":68,"reorder_qty":228},"WK":{"on_hand":68,"reorder_point":68,"reorder_qty":228},"LK":{"on_hand":22,"reorder_point":68,"reorder_qty":228}}} {"sku":"DW_14_AR_48","description":"Drywall 0.25 4X8 Abuse Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Abuse Resistant","treatment":"Sheet","board_thickness_in":0.25,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.25,"stackable":true,"weight_lbs":24.75,"cost":21.45,"price":27.5,"contractor_price":23.38,"vip_price":20.63,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002649","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":228,"reorder_point":68,"reorder_qty":228},"WK":{"on_hand":68,"reorder_point":68,"reorder_qty":228},"LK":{"on_hand":22,"reorder_point":68,"reorder_qty":228}}} {"sku":"DW_38_REG_48","description":"Drywall 0.375 4X8 Regular","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Regular","treatment":"Sheet","board_thickness_in":0.375,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.375,"stackable":true,"weight_lbs":36.63,"cost":14.5,"price":18.59,"contractor_price":15.8,"vip_price":13.94,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002656","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":300,"reorder_point":90,"reorder_qty":300},"WK":{"on_hand":90,"reorder_point":90,"reorder_qty":300},"LK":{"on_hand":30,"reorder_point":90,"reorder_qty":300}}} -{"sku":"DW_38_FC_48","description":"Drywall 0.375 4X8 Firecode","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Firecode","treatment":"Sheet","board_thickness_in":0.375,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.375,"stackable":true,"weight_lbs":36.63,"cost":18.85,"price":24.17,"contractor_price":20.54,"vip_price":18.13,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002663","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":300,"reorder_point":90,"reorder_qty":300},"WK":{"on_hand":90,"reorder_point":90,"reorder_qty":300},"LK":{"on_hand":30,"reorder_point":90,"reorder_qty":300}}} +{"sku":"DW_38_FC_48","description":"Drywall 0.375 4X8 Type X","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Type X","treatment":"Sheet","board_thickness_in":0.375,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.375,"stackable":true,"weight_lbs":36.63,"cost":18.85,"price":24.17,"contractor_price":20.54,"vip_price":18.13,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002663","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":300,"reorder_point":90,"reorder_qty":300},"WK":{"on_hand":90,"reorder_point":90,"reorder_qty":300},"LK":{"on_hand":30,"reorder_point":90,"reorder_qty":300}}} {"sku":"DW_38_MR_48","description":"Drywall 0.375 4X8 Moisture Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Moisture Resistant","treatment":"Sheet","board_thickness_in":0.375,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.375,"stackable":true,"weight_lbs":36.63,"cost":21.03,"price":26.96,"contractor_price":22.92,"vip_price":20.22,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002670","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":300,"reorder_point":90,"reorder_qty":300},"WK":{"on_hand":90,"reorder_point":90,"reorder_qty":300},"LK":{"on_hand":30,"reorder_point":90,"reorder_qty":300}}} {"sku":"DW_38_AR_48","description":"Drywall 0.375 4X8 Abuse Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Abuse Resistant","treatment":"Sheet","board_thickness_in":0.375,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.375,"stackable":true,"weight_lbs":36.63,"cost":23.93,"price":30.67,"contractor_price":26.07,"vip_price":23.0,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002677","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":300,"reorder_point":90,"reorder_qty":300},"WK":{"on_hand":90,"reorder_point":90,"reorder_qty":300},"LK":{"on_hand":30,"reorder_point":90,"reorder_qty":300}}} {"sku":"DW_12_REG_48","description":"Drywall 0.5 4X8 Regular","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Regular","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":48.5,"cost":16.0,"price":20.51,"contractor_price":17.43,"vip_price":15.38,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002684","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":371,"reorder_point":111,"reorder_qty":371},"WK":{"on_hand":111,"reorder_point":111,"reorder_qty":371},"LK":{"on_hand":37,"reorder_point":111,"reorder_qty":371}}} {"sku":"DW_12_REG_410","description":"Drywall 0.5 4X10 Regular","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":40.0}],"species":"Gypsum","grade":"Regular","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":60.63,"cost":16.0,"price":20.51,"contractor_price":17.43,"vip_price":15.38,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002691","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":444,"reorder_point":133,"reorder_qty":444},"WK":{"on_hand":133,"reorder_point":133,"reorder_qty":444},"LK":{"on_hand":44,"reorder_point":133,"reorder_qty":444}}} {"sku":"DW_12_REG_412","description":"Drywall 0.5 4X12 Regular","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":48.0}],"species":"Gypsum","grade":"Regular","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":72.75,"cost":16.0,"price":20.51,"contractor_price":17.43,"vip_price":15.38,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002698","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":516,"reorder_point":154,"reorder_qty":516},"WK":{"on_hand":154,"reorder_point":154,"reorder_qty":516},"LK":{"on_hand":51,"reorder_point":154,"reorder_qty":516}}} -{"sku":"DW_12_FC_48","description":"Drywall 0.5 4X8 Firecode","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Firecode","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":48.5,"cost":20.8,"price":26.67,"contractor_price":22.67,"vip_price":20.0,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002705","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":371,"reorder_point":111,"reorder_qty":371},"WK":{"on_hand":111,"reorder_point":111,"reorder_qty":371},"LK":{"on_hand":37,"reorder_point":111,"reorder_qty":371}}} -{"sku":"DW_12_FC_410","description":"Drywall 0.5 4X10 Firecode","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":40.0}],"species":"Gypsum","grade":"Firecode","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":60.63,"cost":20.8,"price":26.67,"contractor_price":22.67,"vip_price":20.0,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002712","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":444,"reorder_point":133,"reorder_qty":444},"WK":{"on_hand":133,"reorder_point":133,"reorder_qty":444},"LK":{"on_hand":44,"reorder_point":133,"reorder_qty":444}}} -{"sku":"DW_12_FC_412","description":"Drywall 0.5 4X12 Firecode","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":48.0}],"species":"Gypsum","grade":"Firecode","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":72.75,"cost":20.8,"price":26.67,"contractor_price":22.67,"vip_price":20.0,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002719","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":516,"reorder_point":154,"reorder_qty":516},"WK":{"on_hand":154,"reorder_point":154,"reorder_qty":516},"LK":{"on_hand":51,"reorder_point":154,"reorder_qty":516}}} +{"sku":"DW_12_FC_48","description":"Drywall 0.5 4X8 Type X","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Type X","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":48.5,"cost":20.8,"price":26.67,"contractor_price":22.67,"vip_price":20.0,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002705","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":371,"reorder_point":111,"reorder_qty":371},"WK":{"on_hand":111,"reorder_point":111,"reorder_qty":371},"LK":{"on_hand":37,"reorder_point":111,"reorder_qty":371}}} +{"sku":"DW_12_FC_410","description":"Drywall 0.5 4X10 Type X","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":40.0}],"species":"Gypsum","grade":"Type X","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":60.63,"cost":20.8,"price":26.67,"contractor_price":22.67,"vip_price":20.0,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002712","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":444,"reorder_point":133,"reorder_qty":444},"WK":{"on_hand":133,"reorder_point":133,"reorder_qty":444},"LK":{"on_hand":44,"reorder_point":133,"reorder_qty":444}}} +{"sku":"DW_12_FC_412","description":"Drywall 0.5 4X12 Type X","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":48.0}],"species":"Gypsum","grade":"Type X","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":72.75,"cost":20.8,"price":26.67,"contractor_price":22.67,"vip_price":20.0,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002719","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":516,"reorder_point":154,"reorder_qty":516},"WK":{"on_hand":154,"reorder_point":154,"reorder_qty":516},"LK":{"on_hand":51,"reorder_point":154,"reorder_qty":516}}} {"sku":"DW_12_MR_48","description":"Drywall 0.5 4X8 Moisture Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Moisture Resistant","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":48.5,"cost":23.2,"price":29.74,"contractor_price":25.28,"vip_price":22.31,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002726","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":371,"reorder_point":111,"reorder_qty":371},"WK":{"on_hand":111,"reorder_point":111,"reorder_qty":371},"LK":{"on_hand":37,"reorder_point":111,"reorder_qty":371}}} {"sku":"DW_12_MR_410","description":"Drywall 0.5 4X10 Moisture Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":40.0}],"species":"Gypsum","grade":"Moisture Resistant","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":60.63,"cost":23.2,"price":29.74,"contractor_price":25.28,"vip_price":22.31,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002733","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":444,"reorder_point":133,"reorder_qty":444},"WK":{"on_hand":133,"reorder_point":133,"reorder_qty":444},"LK":{"on_hand":44,"reorder_point":133,"reorder_qty":444}}} {"sku":"DW_12_MR_412","description":"Drywall 0.5 4X12 Moisture Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":48.0}],"species":"Gypsum","grade":"Moisture Resistant","treatment":"Sheet","board_thickness_in":0.5,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":48,"height_in":0.5,"stackable":true,"weight_lbs":72.75,"cost":23.2,"price":29.74,"contractor_price":25.28,"vip_price":22.31,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002740","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":516,"reorder_point":154,"reorder_qty":516},"WK":{"on_hand":154,"reorder_point":154,"reorder_qty":516},"LK":{"on_hand":51,"reorder_point":154,"reorder_qty":516}}} @@ -395,9 +395,9 @@ {"sku":"DW_58_REG_48","description":"Drywall 0.625 4X8 Regular","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Regular","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":60.38,"cost":17.5,"price":22.44,"contractor_price":19.07,"vip_price":16.83,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002768","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":442,"reorder_point":132,"reorder_qty":442},"WK":{"on_hand":132,"reorder_point":132,"reorder_qty":442},"LK":{"on_hand":44,"reorder_point":132,"reorder_qty":442}}} {"sku":"DW_58_REG_410","description":"Drywall 0.625 4X10 Regular","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":40.0}],"species":"Gypsum","grade":"Regular","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":75.47,"cost":17.5,"price":22.44,"contractor_price":19.07,"vip_price":16.83,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002775","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":533,"reorder_point":159,"reorder_qty":533},"WK":{"on_hand":159,"reorder_point":159,"reorder_qty":533},"LK":{"on_hand":53,"reorder_point":159,"reorder_qty":533}}} {"sku":"DW_58_REG_412","description":"Drywall 0.625 4X12 Regular","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":48.0}],"species":"Gypsum","grade":"Regular","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":90.56,"cost":17.5,"price":22.44,"contractor_price":19.07,"vip_price":16.83,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002782","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":623,"reorder_point":186,"reorder_qty":623},"WK":{"on_hand":186,"reorder_point":186,"reorder_qty":623},"LK":{"on_hand":62,"reorder_point":186,"reorder_qty":623}}} -{"sku":"DW_58_FC_48","description":"Drywall 0.625 4X8 Firecode","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Firecode","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":60.38,"cost":22.75,"price":29.17,"contractor_price":24.79,"vip_price":21.88,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002789","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":442,"reorder_point":132,"reorder_qty":442},"WK":{"on_hand":132,"reorder_point":132,"reorder_qty":442},"LK":{"on_hand":44,"reorder_point":132,"reorder_qty":442}}} -{"sku":"DW_58_FC_410","description":"Drywall 0.625 4X10 Firecode","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":40.0}],"species":"Gypsum","grade":"Firecode","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":75.47,"cost":22.75,"price":29.17,"contractor_price":24.79,"vip_price":21.88,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002796","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":533,"reorder_point":159,"reorder_qty":533},"WK":{"on_hand":159,"reorder_point":159,"reorder_qty":533},"LK":{"on_hand":53,"reorder_point":159,"reorder_qty":533}}} -{"sku":"DW_58_FC_412","description":"Drywall 0.625 4X12 Firecode","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":48.0}],"species":"Gypsum","grade":"Firecode","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":90.56,"cost":22.75,"price":29.17,"contractor_price":24.79,"vip_price":21.88,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002803","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":623,"reorder_point":186,"reorder_qty":623},"WK":{"on_hand":186,"reorder_point":186,"reorder_qty":623},"LK":{"on_hand":62,"reorder_point":186,"reorder_qty":623}}} +{"sku":"DW_58_FC_48","description":"Drywall 0.625 4X8 Type X","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Type X","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":60.38,"cost":22.75,"price":29.17,"contractor_price":24.79,"vip_price":21.88,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002789","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":442,"reorder_point":132,"reorder_qty":442},"WK":{"on_hand":132,"reorder_point":132,"reorder_qty":442},"LK":{"on_hand":44,"reorder_point":132,"reorder_qty":442}}} +{"sku":"DW_58_FC_410","description":"Drywall 0.625 4X10 Type X","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":40.0}],"species":"Gypsum","grade":"Type X","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":75.47,"cost":22.75,"price":29.17,"contractor_price":24.79,"vip_price":21.88,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002796","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":533,"reorder_point":159,"reorder_qty":533},"WK":{"on_hand":159,"reorder_point":159,"reorder_qty":533},"LK":{"on_hand":53,"reorder_point":159,"reorder_qty":533}}} +{"sku":"DW_58_FC_412","description":"Drywall 0.625 4X12 Type X","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":48.0}],"species":"Gypsum","grade":"Type X","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":90.56,"cost":22.75,"price":29.17,"contractor_price":24.79,"vip_price":21.88,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002803","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":623,"reorder_point":186,"reorder_qty":623},"WK":{"on_hand":186,"reorder_point":186,"reorder_qty":623},"LK":{"on_hand":62,"reorder_point":186,"reorder_qty":623}}} {"sku":"DW_58_MR_48","description":"Drywall 0.625 4X8 Moisture Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":32.0}],"species":"Gypsum","grade":"Moisture Resistant","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":60.38,"cost":25.38,"price":32.53,"contractor_price":27.65,"vip_price":24.4,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002810","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":442,"reorder_point":132,"reorder_qty":442},"WK":{"on_hand":132,"reorder_point":132,"reorder_qty":442},"LK":{"on_hand":44,"reorder_point":132,"reorder_qty":442}}} {"sku":"DW_58_MR_410","description":"Drywall 0.625 4X10 Moisture Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":40.0}],"species":"Gypsum","grade":"Moisture Resistant","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":75.47,"cost":25.38,"price":32.53,"contractor_price":27.65,"vip_price":24.4,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002817","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":533,"reorder_point":159,"reorder_qty":533},"WK":{"on_hand":159,"reorder_point":159,"reorder_qty":533},"LK":{"on_hand":53,"reorder_point":159,"reorder_qty":533}}} {"sku":"DW_58_MR_412","description":"Drywall 0.625 4X12 Moisture Resistant","department":"Yard","category_slug":"drywall_finishing.drywall_sheets","vendor_key":"GYP_OKN","uom_primary":"PCS","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":48.0}],"species":"Gypsum","grade":"Moisture Resistant","treatment":"Sheet","board_thickness_in":0.625,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":48,"height_in":0.625,"stackable":true,"weight_lbs":90.56,"cost":25.38,"price":32.53,"contractor_price":27.65,"vip_price":24.4,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"drywall_sheet_stack","barcode":"2000100002824","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":623,"reorder_point":186,"reorder_qty":623},"WK":{"on_hand":186,"reorder_point":186,"reorder_qty":623},"LK":{"on_hand":62,"reorder_point":186,"reorder_qty":623}}} @@ -433,7 +433,7 @@ {"sku":"RB_S8_L20","description":"Rebar #8 Grade 60 20'","department":"Yard","category_slug":"concrete_masonry.rebar_wire","vendor_key":"STONE_CTR","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":20}],"species":"Steel","grade":"Grade 60","treatment":"Black","board_thickness_in":1.0,"board_width_in":null,"board_length_ft":20,"random_length":false,"length_in":240.0,"width_in":1.0,"height_in":1.0,"stackable":false,"weight_lbs":17.0,"cost":5.5,"price":7.64,"contractor_price":6.49,"vip_price":5.73,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"rebar_bundle","barcode":"2000100003034","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":182,"reorder_point":54,"reorder_qty":182},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":182},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":182}}} {"sku":"RB_S8_L24","description":"Rebar #8 Grade 60 24'","department":"Yard","category_slug":"concrete_masonry.rebar_wire","vendor_key":"STONE_CTR","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":24}],"species":"Steel","grade":"Grade 60","treatment":"Black","board_thickness_in":1.0,"board_width_in":null,"board_length_ft":24,"random_length":false,"length_in":288.0,"width_in":1.0,"height_in":1.0,"stackable":false,"weight_lbs":20.4,"cost":6.6,"price":9.17,"contractor_price":7.79,"vip_price":6.88,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"rebar_bundle","barcode":"2000100003041","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":202,"reorder_point":60,"reorder_qty":202},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":202},"LK":{"on_hand":20,"reorder_point":60,"reorder_qty":202}}} {"sku":"RF_3T25","description":"Shingle 3-Tab 25yr Black Bundle","department":"Yard","category_slug":"roofing_ventilation.asphalt_shingles","vendor_key":"PEAK_ROOF","uom_primary":"BUNDLE","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":33.3},{"uom":"SQ","unit_qty":1,"stock_qty":0.333}],"species":"Asphalt","grade":"3-Tab","treatment":"25yr","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":36,"width_in":12,"height_in":2,"stackable":true,"weight_lbs":75.0,"cost":22.0,"price":28.21,"contractor_price":23.98,"vip_price":21.16,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"asphalt_shingle_bundle","barcode":"2000100003048","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":530,"reorder_point":159,"reorder_qty":530},"WK":{"on_hand":159,"reorder_point":159,"reorder_qty":530},"LK":{"on_hand":53,"reorder_point":159,"reorder_qty":530}}} -{"sku":"RF_3T25BW","description":"Shingle 3-Tab 25yr Brownwood Bundle","department":"Yard","category_slug":"roofing_ventilation.asphalt_shingles","vendor_key":"PEAK_ROOF","uom_primary":"BUNDLE","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":33.3},{"uom":"SQ","unit_qty":1,"stock_qty":0.333}],"species":"Asphalt","grade":"3-Tab","treatment":"25yr","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":36,"width_in":12,"height_in":2,"stackable":true,"weight_lbs":75.0,"cost":22.0,"price":28.21,"contractor_price":23.98,"vip_price":21.16,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"asphalt_shingle_bundle","barcode":"2000100003055","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":530,"reorder_point":159,"reorder_qty":530},"WK":{"on_hand":159,"reorder_point":159,"reorder_qty":530},"LK":{"on_hand":53,"reorder_point":159,"reorder_qty":530}}} +{"sku":"RF_3T25BW","description":"Shingle 3-Tab 25yr Brown Bundle","department":"Yard","category_slug":"roofing_ventilation.asphalt_shingles","vendor_key":"PEAK_ROOF","uom_primary":"BUNDLE","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":33.3},{"uom":"SQ","unit_qty":1,"stock_qty":0.333}],"species":"Asphalt","grade":"3-Tab","treatment":"25yr","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":36,"width_in":12,"height_in":2,"stackable":true,"weight_lbs":75.0,"cost":22.0,"price":28.21,"contractor_price":23.98,"vip_price":21.16,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"asphalt_shingle_bundle","barcode":"2000100003055","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":530,"reorder_point":159,"reorder_qty":530},"WK":{"on_hand":159,"reorder_point":159,"reorder_qty":530},"LK":{"on_hand":53,"reorder_point":159,"reorder_qty":530}}} {"sku":"RF_ARC30BLK","description":"Shingle Architectural 30yr Black Bundle","department":"Yard","category_slug":"roofing_ventilation.asphalt_shingles","vendor_key":"PEAK_ROOF","uom_primary":"BUNDLE","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":33.3},{"uom":"SQ","unit_qty":1,"stock_qty":0.333}],"species":"Asphalt","grade":"Architectural","treatment":"30yr","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":36,"width_in":12,"height_in":2,"stackable":true,"weight_lbs":76.0,"cost":28.0,"price":35.9,"contractor_price":30.52,"vip_price":26.93,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"asphalt_shingle_bundle","barcode":"2000100003062","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":536,"reorder_point":160,"reorder_qty":536},"WK":{"on_hand":160,"reorder_point":160,"reorder_qty":536},"LK":{"on_hand":53,"reorder_point":160,"reorder_qty":536}}} {"sku":"RF_ARC30WW","description":"Shingle Architectural 30yr Weathered Wood Bundle","department":"Yard","category_slug":"roofing_ventilation.asphalt_shingles","vendor_key":"PEAK_ROOF","uom_primary":"BUNDLE","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":33.3},{"uom":"SQ","unit_qty":1,"stock_qty":0.333}],"species":"Asphalt","grade":"Architectural","treatment":"30yr","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":36,"width_in":12,"height_in":2,"stackable":true,"weight_lbs":76.0,"cost":28.0,"price":35.9,"contractor_price":30.52,"vip_price":26.93,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"asphalt_shingle_bundle","barcode":"2000100003069","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":536,"reorder_point":160,"reorder_qty":536},"WK":{"on_hand":160,"reorder_point":160,"reorder_qty":536},"LK":{"on_hand":53,"reorder_point":160,"reorder_qty":536}}} {"sku":"RF_ARC30DR","description":"Shingle Architectural 30yr Driftwood Bundle","department":"Yard","category_slug":"roofing_ventilation.asphalt_shingles","vendor_key":"PEAK_ROOF","uom_primary":"BUNDLE","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":33.3},{"uom":"SQ","unit_qty":1,"stock_qty":0.333}],"species":"Asphalt","grade":"Architectural","treatment":"30yr","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":36,"width_in":12,"height_in":2,"stackable":true,"weight_lbs":76.0,"cost":28.0,"price":35.9,"contractor_price":30.52,"vip_price":26.93,"target_margin":22.0,"tax_class":"TAXABLE","image_family":"asphalt_shingle_bundle","barcode":"2000100003076","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":536,"reorder_point":160,"reorder_qty":536},"WK":{"on_hand":160,"reorder_point":160,"reorder_qty":536},"LK":{"on_hand":53,"reorder_point":160,"reorder_qty":536}}} @@ -453,8 +453,8 @@ {"sku":"RF_MRP_L16_BLA","description":"Metal Roofing Panel 16' Black","department":"Yard","category_slug":"roofing_ventilation.metal_roofing","vendor_key":"METAL_ROOF_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"Steel","grade":"26 gauge","treatment":"Black","board_thickness_in":null,"board_width_in":36,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":36,"height_in":0.5,"stackable":true,"weight_lbs":24.0,"cost":59.0,"price":81.94,"contractor_price":69.65,"vip_price":61.46,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"metal_roof_panel","barcode":"2000100003174","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":224,"reorder_point":67,"reorder_qty":224},"WK":{"on_hand":67,"reorder_point":67,"reorder_qty":224},"LK":{"on_hand":22,"reorder_point":67,"reorder_qty":224}}} {"sku":"RF_UN_FS30","description":"Underlayment Felt #30 432 sf","department":"Yard","category_slug":"roofing_ventilation.underlayment","vendor_key":"PEAK_ROOF","uom_primary":"RL","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":432}],"species":"Asphalt","grade":"Felt","treatment":"Roll","board_thickness_in":null,"board_width_in":36,"board_length_ft":12.0,"random_length":false,"length_in":1728.0,"width_in":36,"height_in":0.25,"stackable":true,"weight_lbs":2.16,"cost":17.28,"price":23.35,"contractor_price":19.85,"vip_price":17.51,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"roof_underlayment_roll","barcode":"2000100003181","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":93,"reorder_point":27,"reorder_qty":93},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":93},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":93}}} {"sku":"RF_UN_SS30","description":"Underlayment Synthetic 1000 sf","department":"Yard","category_slug":"roofing_ventilation.underlayment","vendor_key":"PEAK_ROOF","uom_primary":"RL","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":1000}],"species":"Polypropylene","grade":"Synthetic","treatment":"Roll","board_thickness_in":null,"board_width_in":36,"board_length_ft":27.777777777777775,"random_length":false,"length_in":4000.0,"width_in":36,"height_in":0.25,"stackable":true,"weight_lbs":5.0,"cost":50.0,"price":67.57,"contractor_price":57.43,"vip_price":50.68,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"roof_underlayment_roll","barcode":"2000100003188","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":110,"reorder_point":33,"reorder_qty":110},"WK":{"on_hand":33,"reorder_point":33,"reorder_qty":110},"LK":{"on_hand":11,"reorder_point":33,"reorder_qty":110}}} -{"sku":"RF_UN_IW65","description":"Underlayment Ice & Water Shield 75' x 3'","department":"Yard","category_slug":"roofing_ventilation.underlayment","vendor_key":"PEAK_ROOF","uom_primary":"RL","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":225}],"species":"Asphalt","grade":"Ice & Water","treatment":"Roll","board_thickness_in":null,"board_width_in":36,"board_length_ft":6.25,"random_length":false,"length_in":900.0,"width_in":36,"height_in":0.25,"stackable":true,"weight_lbs":10.13,"cost":22.5,"price":30.41,"contractor_price":25.85,"vip_price":22.81,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"roof_underlayment_roll","barcode":"2000100003195","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":141,"reorder_point":42,"reorder_qty":141},"WK":{"on_hand":42,"reorder_point":42,"reorder_qty":141},"LK":{"on_hand":14,"reorder_point":42,"reorder_qty":141}}} -{"sku":"RF_UN_IW150","description":"Underlayment Ice & Water Shield 150' x 3'","department":"Yard","category_slug":"roofing_ventilation.underlayment","vendor_key":"PEAK_ROOF","uom_primary":"RL","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":450}],"species":"Asphalt","grade":"Ice & Water","treatment":"Roll","board_thickness_in":null,"board_width_in":36,"board_length_ft":12.5,"random_length":false,"length_in":1800.0,"width_in":36,"height_in":0.25,"stackable":true,"weight_lbs":20.25,"cost":45.0,"price":60.81,"contractor_price":51.69,"vip_price":45.61,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"roof_underlayment_roll","barcode":"2000100003202","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":202,"reorder_point":60,"reorder_qty":202},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":202},"LK":{"on_hand":20,"reorder_point":60,"reorder_qty":202}}} +{"sku":"RF_UN_IW65","description":"Underlayment Ice and Water Barrier 75' x 3'","department":"Yard","category_slug":"roofing_ventilation.underlayment","vendor_key":"PEAK_ROOF","uom_primary":"RL","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":225}],"species":"Asphalt","grade":"Ice & Water","treatment":"Roll","board_thickness_in":null,"board_width_in":36,"board_length_ft":6.25,"random_length":false,"length_in":900.0,"width_in":36,"height_in":0.25,"stackable":true,"weight_lbs":10.13,"cost":22.5,"price":30.41,"contractor_price":25.85,"vip_price":22.81,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"roof_underlayment_roll","barcode":"2000100003195","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":141,"reorder_point":42,"reorder_qty":141},"WK":{"on_hand":42,"reorder_point":42,"reorder_qty":141},"LK":{"on_hand":14,"reorder_point":42,"reorder_qty":141}}} +{"sku":"RF_UN_IW150","description":"Underlayment Ice and Water Barrier 150' x 3'","department":"Yard","category_slug":"roofing_ventilation.underlayment","vendor_key":"PEAK_ROOF","uom_primary":"RL","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":450}],"species":"Asphalt","grade":"Ice & Water","treatment":"Roll","board_thickness_in":null,"board_width_in":36,"board_length_ft":12.5,"random_length":false,"length_in":1800.0,"width_in":36,"height_in":0.25,"stackable":true,"weight_lbs":20.25,"cost":45.0,"price":60.81,"contractor_price":51.69,"vip_price":45.61,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"roof_underlayment_roll","barcode":"2000100003202","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":202,"reorder_point":60,"reorder_qty":202},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":202},"LK":{"on_hand":20,"reorder_point":60,"reorder_qty":202}}} {"sku":"RF_FL_STEP","description":"Flashing Step Flashing 8x8","department":"Yard","category_slug":"roofing_ventilation.flashing","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Galvanized Steel","grade":"Step","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":8,"board_length_ft":0.07083333333333333,"random_length":false,"length_in":10.2,"width_in":8,"height_in":0.25,"stackable":true,"weight_lbs":0.93,"cost":2.88,"price":4.5,"contractor_price":3.83,"vip_price":3.38,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"roof_flashing_piece","barcode":"2000100003209","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":86,"reorder_point":25,"reorder_qty":86},"WK":{"on_hand":25,"reorder_point":25,"reorder_qty":86},"LK":{"on_hand":8,"reorder_point":25,"reorder_qty":86}}} {"sku":"RF_FL_APR10","description":"Flashing Apron Flashing 10'","department":"Yard","category_slug":"roofing_ventilation.flashing","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Galvanized Steel","grade":"Apron","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":5,"board_length_ft":0.8333333333333334,"random_length":false,"length_in":120.0,"width_in":5,"height_in":0.25,"stackable":true,"weight_lbs":5.5,"cost":7.0,"price":10.94,"contractor_price":9.3,"vip_price":8.21,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"roof_flashing_piece","barcode":"2000100003216","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":113,"reorder_point":33,"reorder_qty":113},"WK":{"on_hand":33,"reorder_point":33,"reorder_qty":113},"LK":{"on_hand":11,"reorder_point":33,"reorder_qty":113}}} {"sku":"RF_FL_DRP10","description":"Flashing Drip Edge 10' White","department":"Yard","category_slug":"roofing_ventilation.flashing","vendor_key":"METAL_ROOF_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Aluminum","grade":"Drip Edge","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":5,"board_length_ft":0.8333333333333334,"random_length":false,"length_in":120.0,"width_in":5,"height_in":0.25,"stackable":true,"weight_lbs":5.5,"cost":7.0,"price":10.94,"contractor_price":9.3,"vip_price":8.21,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"roof_flashing_piece","barcode":"2000100003223","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":113,"reorder_point":33,"reorder_qty":113},"WK":{"on_hand":33,"reorder_point":33,"reorder_qty":113},"LK":{"on_hand":11,"reorder_point":33,"reorder_qty":113}}} @@ -464,18 +464,18 @@ {"sku":"RF_FL_PIPE4","description":"Flashing Pipe Boot 4'","department":"Yard","category_slug":"roofing_ventilation.flashing","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Galvanized Steel","grade":"Pipe Boot","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":5,"board_length_ft":0.041666666666666664,"random_length":false,"length_in":6.0,"width_in":5,"height_in":0.25,"stackable":true,"weight_lbs":0.75,"cost":2.73,"price":4.26,"contractor_price":3.62,"vip_price":3.2,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"roof_flashing_piece","barcode":"2000100003251","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":84,"reorder_point":25,"reorder_qty":84},"WK":{"on_hand":25,"reorder_point":25,"reorder_qty":84},"LK":{"on_hand":8,"reorder_point":25,"reorder_qty":84}}} {"sku":"RF_FL_VENT","description":"Flashing Ridge Vent 4'","department":"Yard","category_slug":"roofing_ventilation.flashing","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Galvanized Steel","grade":"Ridge Vent","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":5,"board_length_ft":0.3333333333333333,"random_length":false,"length_in":48.0,"width_in":5,"height_in":0.25,"stackable":true,"weight_lbs":2.5,"cost":4.3,"price":6.72,"contractor_price":5.71,"vip_price":5.04,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"roof_flashing_piece","barcode":"2000100003258","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":95,"reorder_point":28,"reorder_qty":95},"WK":{"on_hand":28,"reorder_point":28,"reorder_qty":95},"LK":{"on_hand":9,"reorder_point":28,"reorder_qty":95}}} {"sku":"RF_VT_RV4","description":"Vent Ridge Vent 4' Black","department":"Yard","category_slug":"roofing_ventilation.vents_roof_accessories","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Aluminum","grade":"Ridge","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":3.5,"board_length_ft":0.3333333333333333,"random_length":false,"length_in":48.0,"width_in":3.5,"height_in":1.0,"stackable":true,"weight_lbs":1.7,"cost":12.8,"price":19.1,"contractor_price":16.24,"vip_price":14.33,"target_margin":33.0,"tax_class":"TAXABLE","image_family":"roof_vent_piece","barcode":"2000100003265","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":90,"reorder_point":27,"reorder_qty":90},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":90},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":90}}} -{"sku":"RF_VT_TV8","description":"Vent Turtle Vent 8x8 Brown","department":"Yard","category_slug":"roofing_ventilation.vents_roof_accessories","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Aluminum","grade":"Roof","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":8,"board_length_ft":0.6666666666666666,"random_length":false,"length_in":96.0,"width_in":8,"height_in":1.0,"stackable":true,"weight_lbs":2.9,"cost":17.6,"price":26.27,"contractor_price":22.33,"vip_price":19.7,"target_margin":33.0,"tax_class":"TAXABLE","image_family":"roof_vent_piece","barcode":"2000100003272","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":97,"reorder_point":29,"reorder_qty":97},"WK":{"on_hand":29,"reorder_point":29,"reorder_qty":97},"LK":{"on_hand":9,"reorder_point":29,"reorder_qty":97}}} +{"sku":"RF_VT_TV8","description":"Box Vent 8x8 Brown","department":"Yard","category_slug":"roofing_ventilation.vents_roof_accessories","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Aluminum","grade":"Roof","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":8,"board_length_ft":0.6666666666666666,"random_length":false,"length_in":96.0,"width_in":8,"height_in":1.0,"stackable":true,"weight_lbs":2.9,"cost":17.6,"price":26.27,"contractor_price":22.33,"vip_price":19.7,"target_margin":33.0,"tax_class":"TAXABLE","image_family":"roof_vent_piece","barcode":"2000100003272","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":97,"reorder_point":29,"reorder_qty":97},"WK":{"on_hand":29,"reorder_point":29,"reorder_qty":97},"LK":{"on_hand":9,"reorder_point":29,"reorder_qty":97}}} {"sku":"RF_VT_TCV","description":"Vent Roof Cap Vent 4'","department":"Yard","category_slug":"roofing_ventilation.vents_roof_accessories","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Aluminum","grade":"Roof","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":4,"board_length_ft":0.3333333333333333,"random_length":false,"length_in":48.0,"width_in":4,"height_in":1.0,"stackable":true,"weight_lbs":1.7,"cost":12.8,"price":19.1,"contractor_price":16.24,"vip_price":14.33,"target_margin":33.0,"tax_class":"TAXABLE","image_family":"roof_vent_piece","barcode":"2000100003279","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":90,"reorder_point":27,"reorder_qty":90},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":90},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":90}}} {"sku":"RF_VT_FA8","description":"Vent Fascia Vent 8' White","department":"Yard","category_slug":"roofing_ventilation.vents_roof_accessories","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Aluminum","grade":"Fascia","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":4,"board_length_ft":0.6666666666666666,"random_length":false,"length_in":96.0,"width_in":4,"height_in":1.0,"stackable":true,"weight_lbs":2.9,"cost":17.6,"price":26.27,"contractor_price":22.33,"vip_price":19.7,"target_margin":33.0,"tax_class":"TAXABLE","image_family":"roof_vent_piece","barcode":"2000100003286","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":97,"reorder_point":29,"reorder_qty":97},"WK":{"on_hand":29,"reorder_point":29,"reorder_qty":97},"LK":{"on_hand":9,"reorder_point":29,"reorder_qty":97}}} {"sku":"RF_VT_SOV12","description":"Vent Soffit Vent 12' Aluminum","department":"Yard","category_slug":"roofing_ventilation.vents_roof_accessories","vendor_key":"BC_ROOF","uom_primary":"PCS","alternate_uoms":[],"species":"Aluminum","grade":"Soffit","treatment":"Mill Finish","board_thickness_in":null,"board_width_in":4,"board_length_ft":1.0,"random_length":false,"length_in":144.0,"width_in":4,"height_in":1.0,"stackable":true,"weight_lbs":4.1,"cost":22.4,"price":33.43,"contractor_price":28.42,"vip_price":25.07,"target_margin":33.0,"tax_class":"TAXABLE","image_family":"roof_vent_piece","barcode":"2000100003293","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":105,"reorder_point":31,"reorder_qty":105},"WK":{"on_hand":31,"reorder_point":31,"reorder_qty":105},"LK":{"on_hand":10,"reorder_point":31,"reorder_qty":105}}} -{"sku":"SD_VN_D45_WHI","description":"Vinyl Siding D45 White 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D45","treatment":"White","board_thickness_in":null,"board_width_in":10,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":10,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003300","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} -{"sku":"SD_VN_D55_WHI","description":"Vinyl Siding D55 White 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D55","treatment":"White","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003307","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} -{"sku":"SD_VN_D45_SAN","description":"Vinyl Siding D45 Sand 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D45","treatment":"Sand","board_thickness_in":null,"board_width_in":10,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":10,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003314","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} -{"sku":"SD_VN_D55_SAN","description":"Vinyl Siding D55 Sand 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D55","treatment":"Sand","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003321","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} -{"sku":"SD_VN_D45_DRI","description":"Vinyl Siding D45 Driftwood 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D45","treatment":"Driftwood","board_thickness_in":null,"board_width_in":10,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":10,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003328","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} -{"sku":"SD_VN_D55_DRI","description":"Vinyl Siding D55 Driftwood 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D55","treatment":"Driftwood","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003335","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} -{"sku":"SD_VN_D45_SLA","description":"Vinyl Siding D45 Slate 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D45","treatment":"Slate","board_thickness_in":null,"board_width_in":10,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":10,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003342","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} -{"sku":"SD_VN_D55_SLA","description":"Vinyl Siding D55 Slate 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D55","treatment":"Slate","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003349","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} +{"sku":"SD_VN_D45_WHI","description":"Vinyl Siding D45 White 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D45","treatment":"White","board_thickness_in":null,"board_width_in":10,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":10,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003300","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} +{"sku":"SD_VN_D55_WHI","description":"Vinyl Siding D55 White 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D55","treatment":"White","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003307","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} +{"sku":"SD_VN_D45_SAN","description":"Vinyl Siding D45 Sand 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D45","treatment":"Sand","board_thickness_in":null,"board_width_in":10,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":10,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003314","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} +{"sku":"SD_VN_D55_SAN","description":"Vinyl Siding D55 Sand 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D55","treatment":"Sand","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003321","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} +{"sku":"SD_VN_D45_DRI","description":"Vinyl Siding D45 Driftwood 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D45","treatment":"Driftwood","board_thickness_in":null,"board_width_in":10,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":10,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003328","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} +{"sku":"SD_VN_D55_DRI","description":"Vinyl Siding D55 Driftwood 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D55","treatment":"Driftwood","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003335","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} +{"sku":"SD_VN_D45_SLA","description":"Vinyl Siding D45 Slate 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D45","treatment":"Slate","board_thickness_in":null,"board_width_in":10,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":10,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003342","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} +{"sku":"SD_VN_D55_SLA","description":"Vinyl Siding D55 Slate 144\"","department":"Yard","category_slug":"siding_trim.vinyl_siding","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"D55","treatment":"Slate","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.04,"stackable":true,"weight_lbs":2.0,"cost":22.0,"price":32.35,"contractor_price":27.5,"vip_price":24.26,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_siding_panel","barcode":"2000100003349","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":92,"reorder_point":27,"reorder_qty":92},"WK":{"on_hand":27,"reorder_point":27,"reorder_qty":92},"LK":{"on_hand":9,"reorder_point":27,"reorder_qty":92}}} {"sku":"SD_WD_TNG_L08_CP","description":"Cedar Premium TNG Siding 8'","department":"Yard","category_slug":"siding_trim.wood_siding","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"Cedar","grade":"TNG","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":16.0,"cost":10.1,"price":14.03,"contractor_price":11.93,"vip_price":10.52,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"wood_siding_panel","barcode":"2000100003356","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":176,"reorder_point":52,"reorder_qty":176},"WK":{"on_hand":52,"reorder_point":52,"reorder_qty":176},"LK":{"on_hand":17,"reorder_point":52,"reorder_qty":176}}} {"sku":"SD_WD_TNG_L08_CS","description":"Cedar Standard TNG Siding 8'","department":"Yard","category_slug":"siding_trim.wood_siding","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"Cedar","grade":"TNG","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":16.0,"cost":6.5,"price":9.03,"contractor_price":7.68,"vip_price":6.77,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"wood_siding_panel","barcode":"2000100003363","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":176,"reorder_point":52,"reorder_qty":176},"WK":{"on_hand":52,"reorder_point":52,"reorder_qty":176},"LK":{"on_hand":17,"reorder_point":52,"reorder_qty":176}}} {"sku":"SD_WD_TNG_L08_PP","description":"Pine Premium TNG Siding 8'","department":"Yard","category_slug":"siding_trim.wood_siding","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"Pine","grade":"TNG","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":16.0,"cost":8.3,"price":11.53,"contractor_price":9.8,"vip_price":8.65,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"wood_siding_panel","barcode":"2000100003370","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":176,"reorder_point":52,"reorder_qty":176},"WK":{"on_hand":52,"reorder_point":52,"reorder_qty":176},"LK":{"on_hand":17,"reorder_point":52,"reorder_qty":176}}} @@ -503,10 +503,10 @@ {"sku":"SD_WD_BEVL_L16_CP","description":"Cedar Premium BEVL Siding 16'","department":"Yard","category_slug":"siding_trim.wood_siding","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"Cedar","grade":"BEVL","treatment":"S4S","board_thickness_in":0.625,"board_width_in":6,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":6,"height_in":0.625,"stackable":true,"weight_lbs":32.0,"cost":10.6,"price":14.72,"contractor_price":12.51,"vip_price":11.04,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"wood_siding_panel","barcode":"2000100003524","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":272,"reorder_point":81,"reorder_qty":272},"WK":{"on_hand":81,"reorder_point":81,"reorder_qty":272},"LK":{"on_hand":27,"reorder_point":81,"reorder_qty":272}}} {"sku":"SD_WD_BEVL_L16_CS","description":"Cedar Standard BEVL Siding 16'","department":"Yard","category_slug":"siding_trim.wood_siding","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"Cedar","grade":"BEVL","treatment":"S4S","board_thickness_in":0.625,"board_width_in":6,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":6,"height_in":0.625,"stackable":true,"weight_lbs":32.0,"cost":7.0,"price":9.72,"contractor_price":8.26,"vip_price":7.29,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"wood_siding_panel","barcode":"2000100003531","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":272,"reorder_point":81,"reorder_qty":272},"WK":{"on_hand":81,"reorder_point":81,"reorder_qty":272},"LK":{"on_hand":27,"reorder_point":81,"reorder_qty":272}}} {"sku":"SD_WD_BEVL_L16_PP","description":"Pine Premium BEVL Siding 16'","department":"Yard","category_slug":"siding_trim.wood_siding","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"Pine","grade":"BEVL","treatment":"S4S","board_thickness_in":0.625,"board_width_in":6,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":6,"height_in":0.625,"stackable":true,"weight_lbs":32.0,"cost":8.8,"price":12.22,"contractor_price":10.39,"vip_price":9.17,"target_margin":28.0,"tax_class":"TAXABLE","image_family":"wood_siding_panel","barcode":"2000100003538","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":272,"reorder_point":81,"reorder_qty":272},"WK":{"on_hand":81,"reorder_point":81,"reorder_qty":272},"LK":{"on_hand":27,"reorder_point":81,"reorder_qty":272}}} -{"sku":"SD_FC_PL4X8","description":"Fibre Cement Panel 4x8 Okanagan Cemtrim","department":"Yard","category_slug":"siding_trim.fibre_cement","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Fibre Cement","grade":"Standard","treatment":"Primed","board_thickness_in":0.31,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.31,"stackable":true,"weight_lbs":64.0,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"fibre_cement_panel","barcode":"2000100003545","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":464,"reorder_point":139,"reorder_qty":464},"WK":{"on_hand":139,"reorder_point":139,"reorder_qty":464},"LK":{"on_hand":46,"reorder_point":139,"reorder_qty":464}}} -{"sku":"SD_FC_PL4X10","description":"Fibre Cement Panel 4x10 Okanagan Cemtrim","department":"Yard","category_slug":"siding_trim.fibre_cement","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Fibre Cement","grade":"Standard","treatment":"Primed","board_thickness_in":0.31,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.31,"stackable":true,"weight_lbs":80.0,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"fibre_cement_panel","barcode":"2000100003552","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":560,"reorder_point":168,"reorder_qty":560},"WK":{"on_hand":168,"reorder_point":168,"reorder_qty":560},"LK":{"on_hand":56,"reorder_point":168,"reorder_qty":560}}} -{"sku":"SD_FC_TR12","description":"Fibre Cement Trim 1x4 12' Okanagan Cemtrim","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Fibre Cement","grade":"Standard","treatment":"Primed","board_thickness_in":0.75,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":12.0,"cost":8.0,"price":11.76,"contractor_price":10.0,"vip_price":8.82,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"fibre_cement_panel","barcode":"2000100003559","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":152,"reorder_point":45,"reorder_qty":152},"WK":{"on_hand":45,"reorder_point":45,"reorder_qty":152},"LK":{"on_hand":15,"reorder_point":45,"reorder_qty":152}}} -{"sku":"SD_FC_SO12","description":"Fibre Cement Soffit 4x8 Okanagan Cemtrim","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Fibre Cement","grade":"Standard","treatment":"Primed","board_thickness_in":0.31,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.31,"stackable":true,"weight_lbs":60.0,"cost":8.0,"price":11.76,"contractor_price":10.0,"vip_price":8.82,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"fibre_cement_soffit","barcode":"2000100003566","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":440,"reorder_point":132,"reorder_qty":440},"WK":{"on_hand":132,"reorder_point":132,"reorder_qty":440},"LK":{"on_hand":44,"reorder_point":132,"reorder_qty":440}}} +{"sku":"SD_FC_PL4X8","description":"Fibre Cement Panel 4x8 Okanagan Fibre Trim","department":"Yard","category_slug":"siding_trim.fibre_cement","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Fibre Cement","grade":"Standard","treatment":"Primed","board_thickness_in":0.31,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.31,"stackable":true,"weight_lbs":64.0,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"fibre_cement_panel","barcode":"2000100003545","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":464,"reorder_point":139,"reorder_qty":464},"WK":{"on_hand":139,"reorder_point":139,"reorder_qty":464},"LK":{"on_hand":46,"reorder_point":139,"reorder_qty":464}}} +{"sku":"SD_FC_PL4X10","description":"Fibre Cement Panel 4x10 Okanagan Fibre Trim","department":"Yard","category_slug":"siding_trim.fibre_cement","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Fibre Cement","grade":"Standard","treatment":"Primed","board_thickness_in":0.31,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":120,"width_in":48,"height_in":0.31,"stackable":true,"weight_lbs":80.0,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"fibre_cement_panel","barcode":"2000100003552","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":560,"reorder_point":168,"reorder_qty":560},"WK":{"on_hand":168,"reorder_point":168,"reorder_qty":560},"LK":{"on_hand":56,"reorder_point":168,"reorder_qty":560}}} +{"sku":"SD_FC_TR12","description":"Fibre Cement Trim 1x4 12' Okanagan Fibre Trim","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Fibre Cement","grade":"Standard","treatment":"Primed","board_thickness_in":0.75,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":144,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":12.0,"cost":8.0,"price":11.76,"contractor_price":10.0,"vip_price":8.82,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"fibre_cement_panel","barcode":"2000100003559","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":152,"reorder_point":45,"reorder_qty":152},"WK":{"on_hand":45,"reorder_point":45,"reorder_qty":152},"LK":{"on_hand":15,"reorder_point":45,"reorder_qty":152}}} +{"sku":"SD_FC_SO12","description":"Fibre Cement Soffit 4x8 Okanagan Fibre Trim","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[],"species":"Fibre Cement","grade":"Standard","treatment":"Primed","board_thickness_in":0.31,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":96,"width_in":48,"height_in":0.31,"stackable":true,"weight_lbs":60.0,"cost":8.0,"price":11.76,"contractor_price":10.0,"vip_price":8.82,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"fibre_cement_soffit","barcode":"2000100003566","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":440,"reorder_point":132,"reorder_qty":440},"WK":{"on_hand":132,"reorder_point":132,"reorder_qty":440},"LK":{"on_hand":44,"reorder_point":132,"reorder_qty":440}}} {"sku":"SD_TR_CED_1X4_L08","description":"Cedar 1x4 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CORNICE_VLY","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"Cedar","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":12.0,"cost":5.5,"price":7.86,"contractor_price":6.68,"vip_price":5.9,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003573","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":152,"reorder_point":45,"reorder_qty":152},"WK":{"on_hand":45,"reorder_point":45,"reorder_qty":152},"LK":{"on_hand":15,"reorder_point":45,"reorder_qty":152}}} {"sku":"SD_TR_CED_1X4_L12","description":"Cedar 1x4 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CORNICE_VLY","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"Cedar","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":18.0,"cost":5.65,"price":8.07,"contractor_price":6.86,"vip_price":6.05,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003580","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":188,"reorder_point":56,"reorder_qty":188},"WK":{"on_hand":56,"reorder_point":56,"reorder_qty":188},"LK":{"on_hand":18,"reorder_point":56,"reorder_qty":188}}} {"sku":"SD_TR_CED_1X4_L16","description":"Cedar 1x4 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CORNICE_VLY","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"Cedar","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":24.0,"cost":5.8,"price":8.29,"contractor_price":7.05,"vip_price":6.22,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003587","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":224,"reorder_point":67,"reorder_qty":224},"WK":{"on_hand":67,"reorder_point":67,"reorder_qty":224},"LK":{"on_hand":22,"reorder_point":67,"reorder_qty":224}}} @@ -531,36 +531,36 @@ {"sku":"SD_TR_PIN_1X10_L08","description":"Pine 1x10 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"Pine","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":7.2,"cost":4.38,"price":6.26,"contractor_price":5.32,"vip_price":4.7,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003720","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":123,"reorder_point":36,"reorder_qty":123},"WK":{"on_hand":36,"reorder_point":36,"reorder_qty":123},"LK":{"on_hand":12,"reorder_point":36,"reorder_qty":123}}} {"sku":"SD_TR_PIN_1X10_L12","description":"Pine 1x10 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"Pine","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":10.8,"cost":4.47,"price":6.39,"contractor_price":5.43,"vip_price":4.79,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003727","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":145,"reorder_point":43,"reorder_qty":145},"WK":{"on_hand":43,"reorder_point":43,"reorder_qty":145},"LK":{"on_hand":14,"reorder_point":43,"reorder_qty":145}}} {"sku":"SD_TR_PIN_1X10_L16","description":"Pine 1x10 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"OKN_LBR_MILL","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"Pine","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":14.4,"cost":4.56,"price":6.51,"contractor_price":5.53,"vip_price":4.88,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003734","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":166,"reorder_point":49,"reorder_qty":166},"WK":{"on_hand":49,"reorder_point":49,"reorder_qty":166},"LK":{"on_hand":16,"reorder_point":49,"reorder_qty":166}}} -{"sku":"SD_TR_PVC_1X4_L08","description":"PVC 1x4 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":16.8,"cost":7.7,"price":11.0,"contractor_price":9.35,"vip_price":8.25,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003741","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":181,"reorder_point":54,"reorder_qty":181},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":181},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":181}}} -{"sku":"SD_TR_PVC_1X4_L12","description":"PVC 1x4 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":25.2,"cost":7.91,"price":11.3,"contractor_price":9.61,"vip_price":8.48,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003748","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":231,"reorder_point":69,"reorder_qty":231},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":231},"LK":{"on_hand":23,"reorder_point":69,"reorder_qty":231}}} -{"sku":"SD_TR_PVC_1X4_L16","description":"PVC 1x4 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":33.6,"cost":8.12,"price":11.6,"contractor_price":9.86,"vip_price":8.7,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003755","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":282,"reorder_point":84,"reorder_qty":282},"WK":{"on_hand":84,"reorder_point":84,"reorder_qty":282},"LK":{"on_hand":28,"reorder_point":84,"reorder_qty":282}}} -{"sku":"SD_TR_PVC_1X6_L08","description":"PVC 1x6 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":16.8,"cost":8.54,"price":12.2,"contractor_price":10.37,"vip_price":9.15,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003762","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":181,"reorder_point":54,"reorder_qty":181},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":181},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":181}}} -{"sku":"SD_TR_PVC_1X6_L12","description":"PVC 1x6 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":25.2,"cost":8.75,"price":12.5,"contractor_price":10.63,"vip_price":9.38,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003769","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":231,"reorder_point":69,"reorder_qty":231},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":231},"LK":{"on_hand":23,"reorder_point":69,"reorder_qty":231}}} -{"sku":"SD_TR_PVC_1X6_L16","description":"PVC 1x6 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":33.6,"cost":8.96,"price":12.8,"contractor_price":10.88,"vip_price":9.6,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003776","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":282,"reorder_point":84,"reorder_qty":282},"WK":{"on_hand":84,"reorder_point":84,"reorder_qty":282},"LK":{"on_hand":28,"reorder_point":84,"reorder_qty":282}}} -{"sku":"SD_TR_PVC_1X8_L08","description":"PVC 1x8 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":8,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":8,"height_in":0.75,"stackable":true,"weight_lbs":16.8,"cost":9.38,"price":13.4,"contractor_price":11.39,"vip_price":10.05,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003783","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":181,"reorder_point":54,"reorder_qty":181},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":181},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":181}}} -{"sku":"SD_TR_PVC_1X8_L12","description":"PVC 1x8 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":8,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":8,"height_in":0.75,"stackable":true,"weight_lbs":25.2,"cost":9.59,"price":13.7,"contractor_price":11.65,"vip_price":10.28,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003790","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":231,"reorder_point":69,"reorder_qty":231},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":231},"LK":{"on_hand":23,"reorder_point":69,"reorder_qty":231}}} -{"sku":"SD_TR_PVC_1X8_L16","description":"PVC 1x8 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":8,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":8,"height_in":0.75,"stackable":true,"weight_lbs":33.6,"cost":9.8,"price":14.0,"contractor_price":11.9,"vip_price":10.5,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003797","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":282,"reorder_point":84,"reorder_qty":282},"WK":{"on_hand":84,"reorder_point":84,"reorder_qty":282},"LK":{"on_hand":28,"reorder_point":84,"reorder_qty":282}}} -{"sku":"SD_TR_PVC_1X10_L08","description":"PVC 1x10 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":16.8,"cost":10.22,"price":14.6,"contractor_price":12.41,"vip_price":10.95,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003804","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":181,"reorder_point":54,"reorder_qty":181},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":181},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":181}}} -{"sku":"SD_TR_PVC_1X10_L12","description":"PVC 1x10 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":25.2,"cost":10.43,"price":14.9,"contractor_price":12.67,"vip_price":11.18,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003811","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":231,"reorder_point":69,"reorder_qty":231},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":231},"LK":{"on_hand":23,"reorder_point":69,"reorder_qty":231}}} -{"sku":"SD_TR_PVC_1X10_L16","description":"PVC 1x10 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":33.6,"cost":10.64,"price":15.2,"contractor_price":12.92,"vip_price":11.4,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003818","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":282,"reorder_point":84,"reorder_qty":282},"WK":{"on_hand":84,"reorder_point":84,"reorder_qty":282},"LK":{"on_hand":28,"reorder_point":84,"reorder_qty":282}}} -{"sku":"SD_VN_VNT_WHI","description":"Vinyl VNT White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"VNT","treatment":"White","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003825","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_VN_SLD_WHI","description":"Vinyl SLD White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"SLD","treatment":"White","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003832","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_VN_FAS4_WHI","description":"Vinyl FAS4 White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"FAS4","treatment":"White","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":12.0,"price":17.65,"contractor_price":15.0,"vip_price":13.24,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003839","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_VN_VNT_BRO","description":"Vinyl VNT Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"VNT","treatment":"Brown","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003846","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_VN_SLD_BRO","description":"Vinyl SLD Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"SLD","treatment":"Brown","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003853","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_VN_FAS4_BRO","description":"Vinyl FAS4 Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"FAS4","treatment":"Brown","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":12.0,"price":17.65,"contractor_price":15.0,"vip_price":13.24,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003860","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_VN_VNT_SAN","description":"Vinyl VNT Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"VNT","treatment":"Sand","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003867","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_VN_SLD_SAN","description":"Vinyl SLD Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"SLD","treatment":"Sand","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003874","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_VN_FAS4_SAN","description":"Vinyl FAS4 Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"FAS4","treatment":"Sand","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":12.0,"price":17.65,"contractor_price":15.0,"vip_price":13.24,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003881","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} -{"sku":"SD_AL_VNT_WHI","description":"Aluminum VNT White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"VNT","treatment":"White","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003888","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} -{"sku":"SD_AL_SLD_WHI","description":"Aluminum SLD White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"SLD","treatment":"White","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003895","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} -{"sku":"SD_AL_FAS4_WHI","description":"Aluminum FAS4 White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"FAS4","treatment":"White","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":16.8,"price":24.71,"contractor_price":21.0,"vip_price":18.53,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003902","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} -{"sku":"SD_AL_VNT_BRO","description":"Aluminum VNT Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"VNT","treatment":"Brown","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003909","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} -{"sku":"SD_AL_SLD_BRO","description":"Aluminum SLD Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"SLD","treatment":"Brown","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003916","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} -{"sku":"SD_AL_FAS4_BRO","description":"Aluminum FAS4 Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"FAS4","treatment":"Brown","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":16.8,"price":24.71,"contractor_price":21.0,"vip_price":18.53,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003923","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} -{"sku":"SD_AL_VNT_SAN","description":"Aluminum VNT Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"VNT","treatment":"Sand","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003930","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} -{"sku":"SD_AL_SLD_SAN","description":"Aluminum SLD Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"SLD","treatment":"Sand","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003937","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} -{"sku":"SD_AL_FAS4_SAN","description":"Aluminum FAS4 Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"CEMTRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"FAS4","treatment":"Sand","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":16.8,"price":24.71,"contractor_price":21.0,"vip_price":18.53,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003944","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_TR_PVC_1X4_L08","description":"PVC 1x4 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":16.8,"cost":7.7,"price":11.0,"contractor_price":9.35,"vip_price":8.25,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003741","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":181,"reorder_point":54,"reorder_qty":181},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":181},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":181}}} +{"sku":"SD_TR_PVC_1X4_L12","description":"PVC 1x4 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":25.2,"cost":7.91,"price":11.3,"contractor_price":9.61,"vip_price":8.48,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003748","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":231,"reorder_point":69,"reorder_qty":231},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":231},"LK":{"on_hand":23,"reorder_point":69,"reorder_qty":231}}} +{"sku":"SD_TR_PVC_1X4_L16","description":"PVC 1x4 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":4,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":4,"height_in":0.75,"stackable":true,"weight_lbs":33.6,"cost":8.12,"price":11.6,"contractor_price":9.86,"vip_price":8.7,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003755","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":282,"reorder_point":84,"reorder_qty":282},"WK":{"on_hand":84,"reorder_point":84,"reorder_qty":282},"LK":{"on_hand":28,"reorder_point":84,"reorder_qty":282}}} +{"sku":"SD_TR_PVC_1X6_L08","description":"PVC 1x6 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":16.8,"cost":8.54,"price":12.2,"contractor_price":10.37,"vip_price":9.15,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003762","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":181,"reorder_point":54,"reorder_qty":181},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":181},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":181}}} +{"sku":"SD_TR_PVC_1X6_L12","description":"PVC 1x6 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":25.2,"cost":8.75,"price":12.5,"contractor_price":10.63,"vip_price":9.38,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003769","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":231,"reorder_point":69,"reorder_qty":231},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":231},"LK":{"on_hand":23,"reorder_point":69,"reorder_qty":231}}} +{"sku":"SD_TR_PVC_1X6_L16","description":"PVC 1x6 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":6,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":6,"height_in":0.75,"stackable":true,"weight_lbs":33.6,"cost":8.96,"price":12.8,"contractor_price":10.88,"vip_price":9.6,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003776","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":282,"reorder_point":84,"reorder_qty":282},"WK":{"on_hand":84,"reorder_point":84,"reorder_qty":282},"LK":{"on_hand":28,"reorder_point":84,"reorder_qty":282}}} +{"sku":"SD_TR_PVC_1X8_L08","description":"PVC 1x8 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":8,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":8,"height_in":0.75,"stackable":true,"weight_lbs":16.8,"cost":9.38,"price":13.4,"contractor_price":11.39,"vip_price":10.05,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003783","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":181,"reorder_point":54,"reorder_qty":181},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":181},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":181}}} +{"sku":"SD_TR_PVC_1X8_L12","description":"PVC 1x8 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":8,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":8,"height_in":0.75,"stackable":true,"weight_lbs":25.2,"cost":9.59,"price":13.7,"contractor_price":11.65,"vip_price":10.28,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003790","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":231,"reorder_point":69,"reorder_qty":231},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":231},"LK":{"on_hand":23,"reorder_point":69,"reorder_qty":231}}} +{"sku":"SD_TR_PVC_1X8_L16","description":"PVC 1x8 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":8,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":8,"height_in":0.75,"stackable":true,"weight_lbs":33.6,"cost":9.8,"price":14.0,"contractor_price":11.9,"vip_price":10.5,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003797","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":282,"reorder_point":84,"reorder_qty":282},"WK":{"on_hand":84,"reorder_point":84,"reorder_qty":282},"LK":{"on_hand":28,"reorder_point":84,"reorder_qty":282}}} +{"sku":"SD_TR_PVC_1X10_L08","description":"PVC 1x10 Trim 8'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":8}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":8,"random_length":false,"length_in":96.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":16.8,"cost":10.22,"price":14.6,"contractor_price":12.41,"vip_price":10.95,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003804","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":181,"reorder_point":54,"reorder_qty":181},"WK":{"on_hand":54,"reorder_point":54,"reorder_qty":181},"LK":{"on_hand":18,"reorder_point":54,"reorder_qty":181}}} +{"sku":"SD_TR_PVC_1X10_L12","description":"PVC 1x10 Trim 12'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":12,"random_length":false,"length_in":144.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":25.2,"cost":10.43,"price":14.9,"contractor_price":12.67,"vip_price":11.18,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003811","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":231,"reorder_point":69,"reorder_qty":231},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":231},"LK":{"on_hand":23,"reorder_point":69,"reorder_qty":231}}} +{"sku":"SD_TR_PVC_1X10_L16","description":"PVC 1x10 Trim 16'","department":"Yard","category_slug":"siding_trim.exterior_trim","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":16}],"species":"PVC","grade":"#1","treatment":"S4S","board_thickness_in":0.75,"board_width_in":10,"board_length_ft":16,"random_length":false,"length_in":192.0,"width_in":10,"height_in":0.75,"stackable":true,"weight_lbs":33.6,"cost":10.64,"price":15.2,"contractor_price":12.92,"vip_price":11.4,"target_margin":30.0,"tax_class":"TAXABLE","image_family":"cedar_trim_board","barcode":"2000100003818","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":282,"reorder_point":84,"reorder_qty":282},"WK":{"on_hand":84,"reorder_point":84,"reorder_qty":282},"LK":{"on_hand":28,"reorder_point":84,"reorder_qty":282}}} +{"sku":"SD_VN_VNT_WHI","description":"Vinyl VNT White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"VNT","treatment":"White","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003825","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_VN_SLD_WHI","description":"Vinyl SLD White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"SLD","treatment":"White","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003832","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_VN_FAS4_WHI","description":"Vinyl FAS4 White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"FAS4","treatment":"White","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":12.0,"price":17.65,"contractor_price":15.0,"vip_price":13.24,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003839","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_VN_VNT_BRO","description":"Vinyl VNT Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"VNT","treatment":"Brown","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003846","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_VN_SLD_BRO","description":"Vinyl SLD Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"SLD","treatment":"Brown","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003853","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_VN_FAS4_BRO","description":"Vinyl FAS4 Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"FAS4","treatment":"Brown","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":12.0,"price":17.65,"contractor_price":15.0,"vip_price":13.24,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003860","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_VN_VNT_SAN","description":"Vinyl VNT Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"VNT","treatment":"Sand","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003867","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_VN_SLD_SAN","description":"Vinyl SLD Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"SLD","treatment":"Sand","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":14.0,"price":20.59,"contractor_price":17.5,"vip_price":15.44,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003874","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_VN_FAS4_SAN","description":"Vinyl FAS4 Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Vinyl","grade":"FAS4","treatment":"Sand","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":11.52,"cost":12.0,"price":17.65,"contractor_price":15.0,"vip_price":13.24,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"vinyl_soffit_panel","barcode":"2000100003881","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":149,"reorder_point":44,"reorder_qty":149},"WK":{"on_hand":44,"reorder_point":44,"reorder_qty":149},"LK":{"on_hand":14,"reorder_point":44,"reorder_qty":149}}} +{"sku":"SD_AL_VNT_WHI","description":"Aluminum VNT White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"VNT","treatment":"White","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003888","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_AL_SLD_WHI","description":"Aluminum SLD White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"SLD","treatment":"White","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003895","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_AL_FAS4_WHI","description":"Aluminum FAS4 White 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"FAS4","treatment":"White","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":16.8,"price":24.71,"contractor_price":21.0,"vip_price":18.53,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003902","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_AL_VNT_BRO","description":"Aluminum VNT Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"VNT","treatment":"Brown","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003909","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_AL_SLD_BRO","description":"Aluminum SLD Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"SLD","treatment":"Brown","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003916","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_AL_FAS4_BRO","description":"Aluminum FAS4 Brown 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"FAS4","treatment":"Brown","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":16.8,"price":24.71,"contractor_price":21.0,"vip_price":18.53,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003923","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_AL_VNT_SAN","description":"Aluminum VNT Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"VNT","treatment":"Sand","board_thickness_in":null,"board_width_in":12,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":12,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003930","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_AL_SLD_SAN","description":"Aluminum SLD Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"SLD","treatment":"Sand","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":19.6,"price":28.82,"contractor_price":24.5,"vip_price":21.62,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003937","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} +{"sku":"SD_AL_FAS4_SAN","description":"Aluminum FAS4 Sand 12'","department":"Yard","category_slug":"siding_trim.soffit_fascia","vendor_key":"FIBRETRIM_OK","uom_primary":"PCS","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":12.0}],"species":"Aluminum","grade":"FAS4","treatment":"Sand","board_thickness_in":null,"board_width_in":6,"board_length_ft":12.0,"random_length":false,"length_in":144,"width_in":6,"height_in":0.5,"stackable":true,"weight_lbs":16.13,"cost":16.8,"price":24.71,"contractor_price":21.0,"vip_price":18.53,"target_margin":32.0,"tax_class":"TAXABLE","image_family":"aluminum_soffit_panel","barcode":"2000100003944","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":177,"reorder_point":53,"reorder_qty":177},"WK":{"on_hand":53,"reorder_point":53,"reorder_qty":177},"LK":{"on_hand":17,"reorder_point":53,"reorder_qty":177}}} {"sku":"IN_FB_R12","description":"R-12 Fiberglass Batt 88 sf","department":"Yard","category_slug":"insulation_air.fiberglass_batts","vendor_key":"CAR_INS","uom_primary":"BAG","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":88}],"species":"Fiberglass","grade":"R12","treatment":"Unfaced","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":48,"width_in":15,"height_in":6.5,"stackable":true,"weight_lbs":8.8,"cost":35.2,"price":47.57,"contractor_price":40.43,"vip_price":35.68,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"fiberglass_insulation_batt","barcode":"2000100003951","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":133,"reorder_point":39,"reorder_qty":133},"WK":{"on_hand":39,"reorder_point":39,"reorder_qty":133},"LK":{"on_hand":13,"reorder_point":39,"reorder_qty":133}}} {"sku":"IN_FB_R14","description":"R-14 Fiberglass Batt 75 sf","department":"Yard","category_slug":"insulation_air.fiberglass_batts","vendor_key":"CAR_INS","uom_primary":"BAG","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":75}],"species":"Fiberglass","grade":"R14","treatment":"Unfaced","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":48,"width_in":15,"height_in":6.5,"stackable":true,"weight_lbs":7.5,"cost":30.0,"price":40.54,"contractor_price":34.46,"vip_price":30.41,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"fiberglass_insulation_batt","barcode":"2000100003958","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":125,"reorder_point":37,"reorder_qty":125},"WK":{"on_hand":37,"reorder_point":37,"reorder_qty":125},"LK":{"on_hand":12,"reorder_point":37,"reorder_qty":125}}} {"sku":"IN_FB_R20","description":"R-20 Fiberglass Batt 50 sf","department":"Yard","category_slug":"insulation_air.fiberglass_batts","vendor_key":"CAR_INS","uom_primary":"BAG","alternate_uoms":[{"uom":"SF","unit_qty":1,"stock_qty":50}],"species":"Fiberglass","grade":"R20","treatment":"Kraft Faced","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":48,"width_in":15,"height_in":5.5,"stackable":true,"weight_lbs":5.0,"cost":20.0,"price":27.03,"contractor_price":22.98,"vip_price":20.27,"target_margin":26.0,"tax_class":"TAXABLE","image_family":"fiberglass_insulation_batt","barcode":"2000100003965","is_commodity":false,"yards_stocked":["KEL-MAIN","WK","LK"],"inventory":{"KEL-MAIN":{"on_hand":110,"reorder_point":33,"reorder_qty":110},"WK":{"on_hand":33,"reorder_point":33,"reorder_qty":110},"LK":{"on_hand":11,"reorder_point":33,"reorder_qty":110}}} @@ -715,12 +715,12 @@ {"sku":"HT_HAM16","description":"Stone Hammer 16 oz Claw","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":2.5,"cost":11.75,"price":18.36,"contractor_price":15.61,"vip_price":13.77,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"claw_hammer","barcode":"2000100005008","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":95,"reorder_point":28,"reorder_qty":95},"WK":{"on_hand":28,"reorder_point":28,"reorder_qty":95},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_HAM22","description":"Stone Hammer 22 oz Framing","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":3.5,"cost":13.25,"price":20.7,"contractor_price":17.6,"vip_price":15.53,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"claw_hammer","barcode":"2000100005015","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":101,"reorder_point":30,"reorder_qty":101},"WK":{"on_hand":30,"reorder_point":30,"reorder_qty":101},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_WBAR","description":"Stone Wrecking Bar 36\"","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":7.0,"cost":18.5,"price":28.91,"contractor_price":24.57,"vip_price":21.68,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"wrecking_bar","barcode":"2000100005022","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":122,"reorder_point":36,"reorder_qty":122},"WK":{"on_hand":36,"reorder_point":36,"reorder_qty":122},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"HT_PLR","description":"Stone Pliers 8\" Channellock","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.6,"cost":8.9,"price":13.91,"contractor_price":11.82,"vip_price":10.43,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"pliers","barcode":"2000100005029","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":84,"reorder_point":25,"reorder_qty":84},"WK":{"on_hand":25,"reorder_point":25,"reorder_qty":84},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"HT_PLR","description":"Stone Pliers 8\" Tongue and Groove","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.6,"cost":8.9,"price":13.91,"contractor_price":11.82,"vip_price":10.43,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"pliers","barcode":"2000100005029","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":84,"reorder_point":25,"reorder_qty":84},"WK":{"on_hand":25,"reorder_point":25,"reorder_qty":84},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_CUT","description":"Stone Cutters 9\" Side","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.7,"cost":9.05,"price":14.14,"contractor_price":12.02,"vip_price":10.61,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"pliers","barcode":"2000100005036","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":84,"reorder_point":25,"reorder_qty":84},"WK":{"on_hand":25,"reorder_point":25,"reorder_qty":84},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_TAP25","description":"Stone Tape Measure 25'","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":1.5,"cost":10.25,"price":16.02,"contractor_price":13.62,"vip_price":12.02,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"tape_measure","barcode":"2000100005043","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":89,"reorder_point":26,"reorder_qty":89},"WK":{"on_hand":26,"reorder_point":26,"reorder_qty":89},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_LVL48","description":"Stone Level 48\" Aluminum","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":2.5,"cost":11.75,"price":18.36,"contractor_price":15.61,"vip_price":13.77,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"level","barcode":"2000100005050","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":95,"reorder_point":28,"reorder_qty":95},"WK":{"on_hand":28,"reorder_point":28,"reorder_qty":95},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_SAW","description":"Stone Hand Saw 20\"","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":1.5,"cost":10.25,"price":16.02,"contractor_price":13.62,"vip_price":12.02,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"hand_saw","barcode":"2000100005057","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":89,"reorder_point":26,"reorder_qty":89},"WK":{"on_hand":26,"reorder_point":26,"reorder_qty":89},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"HT_SQR","description":"Stone Speed Square 7\"","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.4,"cost":8.6,"price":13.44,"contractor_price":11.42,"vip_price":10.08,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"speed_square","barcode":"2000100005064","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":82,"reorder_point":24,"reorder_qty":82},"WK":{"on_hand":24,"reorder_point":24,"reorder_qty":82},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"HT_SQR","description":"Stone Rafter Square 7\"","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.4,"cost":8.6,"price":13.44,"contractor_price":11.42,"vip_price":10.08,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"rafter_square","barcode":"2000100005064","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":82,"reorder_point":24,"reorder_qty":82},"WK":{"on_hand":24,"reorder_point":24,"reorder_qty":82},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_CHALK","description":"Stone Chalk Line 100'","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.6,"cost":8.9,"price":13.91,"contractor_price":11.82,"vip_price":10.43,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"chalk_line","barcode":"2000100005071","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":84,"reorder_point":25,"reorder_qty":84},"WK":{"on_hand":25,"reorder_point":25,"reorder_qty":84},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_UTIL","description":"Stone Utility Knife","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.3,"cost":8.45,"price":13.2,"contractor_price":11.22,"vip_price":9.9,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"utility_knife","barcode":"2000100005078","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":82,"reorder_point":24,"reorder_qty":82},"WK":{"on_hand":24,"reorder_point":24,"reorder_qty":82},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"HT_SCRD","description":"Stone Screwdriver Set 6 pc","department":"Home Center","category_slug":"hardware_tools.hand_tools","vendor_key":"HARD_WON","uom_primary":"EA","alternate_uoms":[],"species":"Tool","grade":"Standard","treatment":"Forged","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":1.2,"cost":9.8,"price":15.31,"contractor_price":13.01,"vip_price":11.48,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"utility_knife","barcode":"2000100005085","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":87,"reorder_point":26,"reorder_qty":87},"WK":{"on_hand":26,"reorder_point":26,"reorder_qty":87},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} @@ -826,13 +826,13 @@ {"sku":"FIX_TOILT","description":"Toilet Round Front White","department":"Home Center","category_slug":"plumbing.bath_fixtures","vendor_key":"OK_PLUMB","uom_primary":"EA","alternate_uoms":[],"species":"Vitreous China","grade":"Toilet","treatment":"Standard","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":false,"weight_lbs":60.0,"cost":130.0,"price":200.0,"contractor_price":170.0,"vip_price":150.0,"target_margin":35.0,"tax_class":"TAXABLE","image_family":"bath_fixture_white","barcode":"2000100005785","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":440,"reorder_point":132,"reorder_qty":440},"WK":{"on_hand":132,"reorder_point":132,"reorder_qty":440},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"FIX_LAV","description":"Lavatory Sink White","department":"Home Center","category_slug":"plumbing.bath_fixtures","vendor_key":"OK_PLUMB","uom_primary":"EA","alternate_uoms":[],"species":"Vitreous China","grade":"Sink","treatment":"Standard","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":false,"weight_lbs":25.0,"cost":50.0,"price":76.92,"contractor_price":65.38,"vip_price":57.69,"target_margin":35.0,"tax_class":"TAXABLE","image_family":"bath_fixture_white","barcode":"2000100005792","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":230,"reorder_point":69,"reorder_qty":230},"WK":{"on_hand":69,"reorder_point":69,"reorder_qty":230},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"FIX_TUB","description":"Bath Tub 5' White","department":"Home Center","category_slug":"plumbing.bath_fixtures","vendor_key":"OK_PLUMB","uom_primary":"EA","alternate_uoms":[],"species":"Chrome","grade":"Tub","treatment":"Standard","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":false,"weight_lbs":90.0,"cost":200.0,"price":307.69,"contractor_price":261.54,"vip_price":230.77,"target_margin":35.0,"tax_class":"TAXABLE","image_family":"bath_fixture_white","barcode":"2000100005799","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":620,"reorder_point":186,"reorder_qty":620},"WK":{"on_hand":186,"reorder_point":186,"reorder_qty":620},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"EL_NM142250","description":"14/2 Romex 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":16.0,"price":25.0,"contractor_price":21.25,"vip_price":18.75,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"romex_wire_coil","barcode":"2000100005806","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"EL_NM122250","description":"12/2 Romex 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":23.0,"price":35.94,"contractor_price":30.55,"vip_price":26.96,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"romex_wire_coil","barcode":"2000100005813","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"EL_NM102250","description":"10/2 Romex 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":35.0,"price":54.69,"contractor_price":46.49,"vip_price":41.02,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"romex_wire_coil","barcode":"2000100005820","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"EL_NM143250","description":"14/3 Romex 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":22.0,"price":34.38,"contractor_price":29.22,"vip_price":25.79,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"romex_wire_coil","barcode":"2000100005827","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"EL_NM123250","description":"12/3 Romex 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":32.0,"price":50.0,"contractor_price":42.5,"vip_price":37.5,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"romex_wire_coil","barcode":"2000100005834","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"EL_NM141000","description":"14/2 Romex 1000'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":1000}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":83.33333333333333,"random_length":false,"length_in":12000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":80.0,"cost":64.0,"price":100.0,"contractor_price":85.0,"vip_price":75.0,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"romex_wire_coil","barcode":"2000100005841","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":560,"reorder_point":168,"reorder_qty":560},"WK":{"on_hand":168,"reorder_point":168,"reorder_qty":560},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} -{"sku":"EL_NM121000","description":"12/2 Romex 1000'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":1000}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":83.33333333333333,"random_length":false,"length_in":12000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":80.0,"cost":92.0,"price":143.75,"contractor_price":122.19,"vip_price":107.81,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"romex_wire_coil","barcode":"2000100005848","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":560,"reorder_point":168,"reorder_qty":560},"WK":{"on_hand":168,"reorder_point":168,"reorder_qty":560},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"EL_NM142250","description":"14/2 NM-B Cable 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":16.0,"price":25.0,"contractor_price":21.25,"vip_price":18.75,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"nm_cable_coil","barcode":"2000100005806","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"EL_NM122250","description":"12/2 NM-B Cable 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":23.0,"price":35.94,"contractor_price":30.55,"vip_price":26.96,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"nm_cable_coil","barcode":"2000100005813","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"EL_NM102250","description":"10/2 NM-B Cable 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":35.0,"price":54.69,"contractor_price":46.49,"vip_price":41.02,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"nm_cable_coil","barcode":"2000100005820","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"EL_NM143250","description":"14/3 NM-B Cable 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":22.0,"price":34.38,"contractor_price":29.22,"vip_price":25.79,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"nm_cable_coil","barcode":"2000100005827","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"EL_NM123250","description":"12/3 NM-B Cable 250'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":250}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":20.833333333333332,"random_length":false,"length_in":3000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":20.0,"cost":32.0,"price":50.0,"contractor_price":42.5,"vip_price":37.5,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"nm_cable_coil","barcode":"2000100005834","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":200,"reorder_point":60,"reorder_qty":200},"WK":{"on_hand":60,"reorder_point":60,"reorder_qty":200},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"EL_NM141000","description":"14/2 NM-B Cable 1000'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":1000}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":83.33333333333333,"random_length":false,"length_in":12000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":80.0,"cost":64.0,"price":100.0,"contractor_price":85.0,"vip_price":75.0,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"nm_cable_coil","barcode":"2000100005841","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":560,"reorder_point":168,"reorder_qty":560},"WK":{"on_hand":168,"reorder_point":168,"reorder_qty":560},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} +{"sku":"EL_NM121000","description":"12/2 NM-B Cable 1000'","department":"Home Center","category_slug":"electrical.electrical_wire","vendor_key":"OK_ELEC","uom_primary":"RL","alternate_uoms":[{"uom":"LF","unit_qty":1,"stock_qty":1000}],"species":"Copper","grade":"NM-B","treatment":"PVC Jacket","board_thickness_in":null,"board_width_in":null,"board_length_ft":83.33333333333333,"random_length":false,"length_in":12000.0,"width_in":0.5,"height_in":0.5,"stackable":false,"weight_lbs":80.0,"cost":92.0,"price":143.75,"contractor_price":122.19,"vip_price":107.81,"target_margin":36.0,"tax_class":"TAXABLE","image_family":"nm_cable_coil","barcode":"2000100005848","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":560,"reorder_point":168,"reorder_qty":560},"WK":{"on_hand":168,"reorder_point":168,"reorder_qty":560},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"BX_BX14","description":"Outlet Box 14 cu in Plastic","department":"Home Center","category_slug":"electrical.boxes_conduit","vendor_key":"OK_ELEC","uom_primary":"EA","alternate_uoms":[],"species":"Plastic","grade":"Plastic","treatment":"Standard","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.2,"cost":1.5,"price":2.42,"contractor_price":2.06,"vip_price":1.82,"target_margin":38.0,"tax_class":"TAXABLE","image_family":"electrical_outlet_box","barcode":"2000100005855","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":81,"reorder_point":24,"reorder_qty":81},"WK":{"on_hand":24,"reorder_point":24,"reorder_qty":81},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"BX_BX20","description":"Outlet Box 20 cu in Plastic","department":"Home Center","category_slug":"electrical.boxes_conduit","vendor_key":"OK_ELEC","uom_primary":"EA","alternate_uoms":[],"species":"Plastic","grade":"Plastic","treatment":"Standard","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.2,"cost":1.8,"price":2.9,"contractor_price":2.47,"vip_price":2.18,"target_margin":38.0,"tax_class":"TAXABLE","image_family":"electrical_outlet_box","barcode":"2000100005862","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":81,"reorder_point":24,"reorder_qty":81},"WK":{"on_hand":24,"reorder_point":24,"reorder_qty":81},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} {"sku":"BX_BX4SQ","description":"4 Square Box Metal","department":"Home Center","category_slug":"electrical.boxes_conduit","vendor_key":"OK_ELEC","uom_primary":"EA","alternate_uoms":[],"species":"Metal","grade":"Metal","treatment":"Standard","board_thickness_in":null,"board_width_in":null,"board_length_ft":null,"random_length":false,"length_in":null,"width_in":null,"height_in":null,"stackable":true,"weight_lbs":0.5,"cost":2.5,"price":4.03,"contractor_price":3.43,"vip_price":3.02,"target_margin":38.0,"tax_class":"TAXABLE","image_family":"electrical_outlet_box","barcode":"2000100005869","is_commodity":false,"yards_stocked":["KEL-MAIN","WK"],"inventory":{"KEL-MAIN":{"on_hand":83,"reorder_point":24,"reorder_qty":83},"WK":{"on_hand":24,"reorder_point":24,"reorder_qty":83},"LK":{"on_hand":0,"reorder_point":0,"reorder_qty":0}}} diff --git a/core/internal/app/seed/demodata/customers.jsonl b/core/internal/app/seed/demodata/customers.jsonl index fac393e32..f173a6fb1 100644 --- a/core/internal/app/seed/demodata/customers.jsonl +++ b/core/internal/app/seed/demodata/customers.jsonl @@ -30,7 +30,7 @@ {"account_number":"LK-0205","name":"Pemberton Polebarn Construction","email":"marc.pemberton@brand.example","phone":"250-555-0140","address_line1":"1410 Hip Rd, Lake Country BC","city":"Lake Country","region":"BC","tier":"GOLD","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":50000,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["KEL-MAIN","LK"],"trade_type":"general_contractor","contacts":[{"first_name":"Marc","last_name":"Pemberton","title":"Owner","email":"marc.pemberton@brand.example","phone":"250-555-0145","role":"Owner","is_primary":true}],"job_sites":[{"name":"Hollow Addition","line1":"1930 Fascia Pl","city":"Lake Country","region":"BC","notes":""},{"name":"Heights Shop Build","line1":"1977 Shake Pl","city":"Penticton","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} {"account_number":"LK-0206","name":"Standish Cripple Construction","email":"theo.standish@brand.example","phone":"250-555-0141","address_line1":"1417 Shake Rd, Vernon BC","city":"Vernon","region":"BC","tier":"GOLD","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":50000,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"general_contractor","contacts":[{"first_name":"Theo","last_name":"Standish","title":"Project Manager","email":"theo.standish@brand.example","phone":"250-555-0146","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Crescent Carriage","line1":"1961 Tread Pl","city":"West Kelowna","region":"BC","notes":""},{"name":"Ridge Custom Home","line1":"2008 Lath Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} {"account_number":"LK-0207","name":"Vanderpol Dormer Construction","email":"bree.vanderpol@brand.example","phone":"250-555-0142","address_line1":"1424 Lap Rd, Lumby BC","city":"Lumby","region":"BC","tier":"GOLD","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":50000,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"general_contractor","contacts":[{"first_name":"Bree","last_name":"Vanderpol","title":"Project Manager","email":"bree.vanderpol@brand.example","phone":"250-555-0147","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Heights Project","line1":"1992 Furring Pl","city":"Lake Country","region":"BC","notes":""},{"name":"Bay Cottage","line1":"2039 Purlins Pl","city":"West Kelowna","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} -{"account_number":"LK-0208","name":"Zellweger Pilaster Construction","email":"ines.zellweger@brand.example","phone":"250-555-0143","address_line1":"1431 Dado Rd, Lake Country BC","city":"Lake Country","region":"BC","tier":"GOLD","payment_terms_code":"NET45","price_level":"Contractor","credit_limit_cad":50000,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"general_contractor","contacts":[{"first_name":"Ines","last_name":"Zellweger","title":"Owner","email":"ines.zellweger@brand.example","phone":"250-555-0148","role":"Owner","is_primary":true}],"job_sites":[{"name":"Ridge Studio Build","line1":"2023 Trimmer Pl","city":"Osoyoos","region":"BC","notes":""},{"name":"Bluff Laneway","line1":"2070 Cupola Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} +{"account_number":"LK-0208","name":"Wexcombe Pilaster Construction","email":"ines.wexcombe@brand.example","phone":"250-555-0143","address_line1":"1431 Dado Rd, Lake Country BC","city":"Lake Country","region":"BC","tier":"GOLD","payment_terms_code":"NET45","price_level":"Contractor","credit_limit_cad":50000,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"general_contractor","contacts":[{"first_name":"Ines","last_name":"Wexcombe","title":"Owner","email":"ines.wexcombe@brand.example","phone":"250-555-0148","role":"Owner","is_primary":true}],"job_sites":[{"name":"Ridge Studio Build","line1":"2023 Trimmer Pl","city":"Osoyoos","region":"BC","notes":""},{"name":"Bluff Laneway","line1":"2070 Cupola Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} {"account_number":"KEL-0216","name":"Caldwell Framing Crew","email":"petra.caldwell@brand.example","phone":"250-555-0144","address_line1":"1438 Mitre Rd, Summerland BC","city":"Summerland","region":"BC","tier":"SILVER","payment_terms_code":"COD","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"framer","contacts":[{"first_name":"Petra","last_name":"Caldwell","title":"Foreman","email":"petra.caldwell@brand.example","phone":"250-555-0149","role":"Owner","is_primary":true}],"job_sites":[{"name":"Bay Reno","line1":"2054 Render Pl","city":"Lumby","region":"BC","notes":""},{"name":"Terrace Build","line1":"2101 Kickout Pl","city":"Osoyoos","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"KEL-0217","name":"Fairweather Framing Crew","email":"wren.fairweather@brand.example","phone":"250-555-0145","address_line1":"1445 Plumbline Rd, Kelowna BC","city":"Kelowna","region":"BC","tier":"SILVER","payment_terms_code":"2PCT10NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN","LK"],"trade_type":"framer","contacts":[{"first_name":"Wren","last_name":"Fairweather","title":"Owner","email":"wren.fairweather@brand.example","phone":"250-555-0150","role":"Owner","is_primary":true}],"job_sites":[{"name":"Bluff Shop Build","line1":"2085 Formwork Pl","city":"Summerland","region":"BC","notes":""},{"name":"Mews Pavilion","line1":"2132 Aggregate Pl","city":"Lumby","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"KEL-0218","name":"Iverson Framing Crew","email":"erik.iverson@brand.example","phone":"250-555-0146","address_line1":"1452 Plumbob Rd, West Kelowna BC","city":"West Kelowna","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN","WK"],"trade_type":"framer","contacts":[{"first_name":"Erik","last_name":"Iverson","title":"Foreman","email":"erik.iverson@brand.example","phone":"250-555-0151","role":"Owner","is_primary":true}],"job_sites":[{"name":"Terrace Custom Home","line1":"2116 Millwright Pl","city":"Summerland","region":"BC","notes":""},{"name":"Court Residence","line1":"2163 Stucco Pl","city":"Summerland","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} @@ -55,7 +55,7 @@ {"account_number":"WK-0214","name":"Pemberton Framing and Truss","email":"mira.pemberton@brand.example","phone":"250-555-0165","address_line1":"1585 Blocking Rd, Peachland BC","city":"Peachland","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"framer","contacts":[{"first_name":"Mira","last_name":"Pemberton","title":"Owner","email":"mira.pemberton@brand.example","phone":"250-555-0170","role":"Owner","is_primary":true}],"job_sites":[{"name":"Reach Carriage","line1":"2705 Render Pl","city":"Peachland","region":"BC","notes":""},{"name":"Reach Custom Home","line1":"2752 Kickout Pl","city":"Peachland","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"WK-0215","name":"Standish Framing and Truss","email":"tara.standish@brand.example","phone":"250-555-0166","address_line1":"1592 Strut Rd, Summerland BC","city":"Summerland","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["KEL-MAIN","WK"],"trade_type":"framer","contacts":[{"first_name":"Tara","last_name":"Standish","title":"Foreman","email":"tara.standish@brand.example","phone":"250-555-0171","role":"Owner","is_primary":true}],"job_sites":[{"name":"Common Project","line1":"2736 Formwork Pl","city":"Kelowna","region":"BC","notes":""},{"name":"Park Cottage","line1":"2783 Aggregate Pl","city":"Peachland","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"WK-0216","name":"Vanderpol Framing and Truss","email":"ben.vanderpol@brand.example","phone":"250-555-0167","address_line1":"1599 Purlins Rd, West Kelowna BC","city":"West Kelowna","region":"BC","tier":"SILVER","payment_terms_code":"NET45","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"framer","contacts":[{"first_name":"Ben","last_name":"Vanderpol","title":"Owner","email":"ben.vanderpol@brand.example","phone":"250-555-0172","role":"Owner","is_primary":true}],"job_sites":[{"name":"Reach Studio Build","line1":"2767 Millwright Pl","city":"Penticton","region":"BC","notes":""},{"name":"Square Laneway","line1":"2814 Stucco Pl","city":"Kelowna","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} -{"account_number":"WK-0217","name":"Zellweger Framing and Truss","email":"ian.zellweger@brand.example","phone":"250-555-0168","address_line1":"1606 Rafter Rd, Peachland BC","city":"Peachland","region":"BC","tier":"SILVER","payment_terms_code":"COD","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"framer","contacts":[{"first_name":"Ian","last_name":"Zellweger","title":"Foreman","email":"ian.zellweger@brand.example","phone":"250-555-0173","role":"Owner","is_primary":true}],"job_sites":[{"name":"Park Reno","line1":"2798 Fascia Pl","city":"Lake Country","region":"BC","notes":""},{"name":"Hollow Build","line1":"2845 Shake Pl","city":"Penticton","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} +{"account_number":"WK-0217","name":"Wexcombe Framing and Truss","email":"ian.wexcombe@brand.example","phone":"250-555-0168","address_line1":"1606 Rafter Rd, Peachland BC","city":"Peachland","region":"BC","tier":"SILVER","payment_terms_code":"COD","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"framer","contacts":[{"first_name":"Ian","last_name":"Wexcombe","title":"Foreman","email":"ian.wexcombe@brand.example","phone":"250-555-0173","role":"Owner","is_primary":true}],"job_sites":[{"name":"Park Reno","line1":"2798 Fascia Pl","city":"Lake Country","region":"BC","notes":""},{"name":"Hollow Build","line1":"2845 Shake Pl","city":"Penticton","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"WK-0218","name":"Caldwell Framing and Truss","email":"paolo.caldwell@brand.example","phone":"250-555-0169","address_line1":"1613 Polebarn Rd, Summerland BC","city":"Summerland","region":"BC","tier":"SILVER","payment_terms_code":"2PCT10NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"framer","contacts":[{"first_name":"Paolo","last_name":"Caldwell","title":"Owner","email":"paolo.caldwell@brand.example","phone":"250-555-0174","role":"Owner","is_primary":true}],"job_sites":[{"name":"Square Shop Build","line1":"2829 Tread Pl","city":"West Kelowna","region":"BC","notes":""},{"name":"Crescent Pavilion","line1":"2876 Lath Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"LK-0209","name":"Wade Fairweather Framing","email":"wade.fairweather@brand.example","phone":"250-555-0170","address_line1":"1620 Trussway Rd, Lake Country BC","city":"Lake Country","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["KEL-MAIN","LK"],"trade_type":"framer","contacts":[{"first_name":"Wade","last_name":"Fairweather","title":"Foreman","email":"wade.fairweather@brand.example","phone":"250-555-0175","role":"Owner","is_primary":true}],"job_sites":[{"name":"Hollow Custom Home","line1":"2860 Furring Pl","city":"Lake Country","region":"BC","notes":""},{"name":"Heights Residence","line1":"2907 Purlins Pl","city":"West Kelowna","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} {"account_number":"LK-0210","name":"Erin Iverson Framing","email":"erin.iverson@brand.example","phone":"250-555-0171","address_line1":"1627 Firestop Rd, Vernon BC","city":"Vernon","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"framer","contacts":[{"first_name":"Erin","last_name":"Iverson","title":"Owner","email":"erin.iverson@brand.example","phone":"250-555-0176","role":"Owner","is_primary":true}],"job_sites":[{"name":"Crescent Cottage","line1":"2891 Trimmer Pl","city":"Osoyoos","region":"BC","notes":""},{"name":"Ridge Addition","line1":"2938 Cupola Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} @@ -80,7 +80,7 @@ {"account_number":"KEL-0244","name":"Pemberton Roofing and Sheet Metal","email":"marc.pemberton@brand.example","phone":"250-555-0190","address_line1":"1760 Weep Rd, Kelowna BC","city":"Kelowna","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"roofer","contacts":[{"first_name":"Marc","last_name":"Pemberton","title":"Estimator","email":"marc.pemberton@brand.example","phone":"250-555-0195","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Knoll Project","line1":"3480 Tread Pl","city":"Oliver","region":"BC","notes":""},{"name":"Lookout Cottage","line1":"3527 Lath Pl","city":"West Kelowna","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"KEL-0245","name":"Standish Roofing and Sheet Metal","email":"theo.standish@brand.example","phone":"250-555-0191","address_line1":"1767 Flashing Rd, West Kelowna BC","city":"West Kelowna","region":"BC","tier":"SILVER","payment_terms_code":"NET45","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN","WK"],"trade_type":"roofer","contacts":[{"first_name":"Theo","last_name":"Standish","title":"Estimator","email":"theo.standish@brand.example","phone":"250-555-0196","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Trace Studio Build","line1":"3511 Furring Pl","city":"Vernon","region":"BC","notes":""},{"name":"Reach Laneway","line1":"3558 Purlins Pl","city":"Oliver","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"KEL-0246","name":"Vanderpol Roofing and Sheet Metal","email":"bree.vanderpol@brand.example","phone":"250-555-0192","address_line1":"1774 Stepflash Rd, Lake Country BC","city":"Lake Country","region":"BC","tier":"SILVER","payment_terms_code":"COD","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"roofer","contacts":[{"first_name":"Bree","last_name":"Vanderpol","title":"Estimator","email":"bree.vanderpol@brand.example","phone":"250-555-0197","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Lookout Reno","line1":"3542 Trimmer Pl","city":"Peachland","region":"BC","notes":""},{"name":"Bend Build","line1":"3589 Cupola Pl","city":"Vernon","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} -{"account_number":"WK-0224","name":"Zellweger Re-Roof Specialists","email":"ines.zellweger@brand.example","phone":"250-555-0193","address_line1":"1781 Kickout Rd, Summerland BC","city":"Summerland","region":"BC","tier":"SILVER","payment_terms_code":"2PCT10NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"roofer","contacts":[{"first_name":"Ines","last_name":"Zellweger","title":"Estimator","email":"ines.zellweger@brand.example","phone":"250-555-0198","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Reach Shop Build","line1":"3573 Render Pl","city":"Peachland","region":"BC","notes":""},{"name":"Reach Pavilion","line1":"3620 Kickout Pl","city":"Peachland","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} +{"account_number":"WK-0224","name":"Wexcombe Re-Roof Specialists","email":"ines.wexcombe@brand.example","phone":"250-555-0193","address_line1":"1781 Kickout Rd, Summerland BC","city":"Summerland","region":"BC","tier":"SILVER","payment_terms_code":"2PCT10NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"roofer","contacts":[{"first_name":"Ines","last_name":"Wexcombe","title":"Estimator","email":"ines.wexcombe@brand.example","phone":"250-555-0198","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Reach Shop Build","line1":"3573 Render Pl","city":"Peachland","region":"BC","notes":""},{"name":"Reach Pavilion","line1":"3620 Kickout Pl","city":"Peachland","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"WK-0225","name":"Caldwell Re-Roof Specialists","email":"petra.caldwell@brand.example","phone":"250-555-0194","address_line1":"1788 Diverter Rd, West Kelowna BC","city":"West Kelowna","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["KEL-MAIN","WK"],"trade_type":"roofer","contacts":[{"first_name":"Petra","last_name":"Caldwell","title":"Estimator","email":"petra.caldwell@brand.example","phone":"250-555-0199","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Bend Custom Home","line1":"3604 Formwork Pl","city":"Kelowna","region":"BC","notes":""},{"name":"Common Residence","line1":"3651 Aggregate Pl","city":"Peachland","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"WK-0226","name":"Fairweather Re-Roof Specialists","email":"wren.fairweather@brand.example","phone":"250-555-0195","address_line1":"1795 Backpan Rd, Peachland BC","city":"Peachland","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"roofer","contacts":[{"first_name":"Wren","last_name":"Fairweather","title":"Estimator","email":"wren.fairweather@brand.example","phone":"250-555-0110","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Reach Cottage","line1":"3635 Millwright Pl","city":"Penticton","region":"BC","notes":""},{"name":"Reach Addition","line1":"3682 Stucco Pl","city":"Kelowna","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"KEL-0247","name":"Iverson Decks and Rail","email":"erik.iverson@brand.example","phone":"250-555-0196","address_line1":"1802 Counterflash Rd, West Kelowna BC","city":"West Kelowna","region":"BC","tier":"SILVER","payment_terms_code":"NET30","price_level":"Contractor","credit_limit_cad":20000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"deck_fence_builder","contacts":[{"first_name":"Erik","last_name":"Iverson","title":"Foreman","email":"erik.iverson@brand.example","phone":"250-555-0111","role":"Owner","is_primary":true}],"job_sites":[{"name":"Common Laneway","line1":"3666 Fascia Pl","city":"Lake Country","region":"BC","notes":""},{"name":"Park Carriage","line1":"3713 Shake Pl","city":"Penticton","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} @@ -105,7 +105,7 @@ {"account_number":"KEL-0262","name":"Central Okanagan School District","email":"mira.central@brand.example","phone":"250-555-0125","address_line1":"1935 Fastener Rd, Kelowna BC","city":"Kelowna","region":"BC","tier":"PLATINUM","payment_terms_code":"NET45","price_level":"VIP Builder","credit_limit_cad":250000,"pst_exempt":true,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN","LK","WK"],"trade_type":"school_district","contacts":[{"first_name":"Mira","last_name":"Central","title":"Facilities Procurement Lead","email":"mira.central@brand.example","phone":"250-555-0130","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Vista Studio Build","line1":"4255 Formwork Pl","city":"Summerland","region":"BC","notes":""},{"name":"Walk Laneway","line1":"4302 Aggregate Pl","city":"Lumby","region":"BC","notes":""},{"name":"Landing Carriage","line1":"4349 Topsoil Pl","city":"Osoyoos","region":"BC","notes":""}],"salesperson_email":"heather.m@gablebuildingsupply.example","active":true} {"account_number":"KEL-0263","name":"Standish Strata Services","email":"tara.standish@brand.example","phone":"250-555-0126","address_line1":"1942 Cabin Rd, West Kelowna BC","city":"West Kelowna","region":"BC","tier":"GOLD","payment_terms_code":"COD","price_level":"Contractor","credit_limit_cad":75000,"pst_exempt":true,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"strata","contacts":[{"first_name":"Tara","last_name":"Standish","title":"Strata Manager","email":"tara.standish@brand.example","phone":"250-555-0131","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Loft Reno","line1":"4286 Millwright Pl","city":"Summerland","region":"BC","notes":""},{"name":"Crossing Build","line1":"4333 Stucco Pl","city":"Summerland","region":"BC","notes":""},{"name":"Knoll Project","line1":"4380 Level Pl","city":"Lumby","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"KEL-0264","name":"Vanderpol Strata Services","email":"ben.vanderpol@brand.example","phone":"250-555-0127","address_line1":"1949 Stave Rd, Lake Country BC","city":"Lake Country","region":"BC","tier":"GOLD","payment_terms_code":"2PCT10NET30","price_level":"Contractor","credit_limit_cad":75000,"pst_exempt":true,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"strata","contacts":[{"first_name":"Ben","last_name":"Vanderpol","title":"Strata Manager","email":"ben.vanderpol@brand.example","phone":"250-555-0132","role":"Buyer","is_primary":true}],"job_sites":[{"name":"Walk Shop Build","line1":"4317 Fascia Pl","city":"West Kelowna","region":"BC","notes":""},{"name":"Landing Pavilion","line1":"4364 Shake Pl","city":"Summerland","region":"BC","notes":""},{"name":"Trace Studio Build","line1":"4411 Plumbob Pl","city":"Summerland","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} -{"account_number":"KEL-0265","name":"Zellweger Handyman Service","email":"pm@service.example","phone":"250-555-0128","address_line1":"1956 Lathe Rd, Peachland BC","city":"Peachland","region":"BC","tier":"RETAIL","payment_terms_code":"COD","price_level":"Retail","credit_limit_cad":5000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN","WK"],"trade_type":"handyman","contacts":[{"first_name":"Ian","last_name":"Zellweger","title":"Owner","email":"ian.zellweger@brand.example","phone":"250-555-0133","role":"Owner","is_primary":true}],"job_sites":[{"name":"Crossing Custom Home","line1":"4348 Tread Pl","city":"Oliver","region":"BC","notes":""},{"name":"Knoll Residence","line1":"4395 Lath Pl","city":"West Kelowna","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} +{"account_number":"KEL-0265","name":"Wexcombe Handyman Service","email":"pm@service.example","phone":"250-555-0128","address_line1":"1956 Lathe Rd, Peachland BC","city":"Peachland","region":"BC","tier":"RETAIL","payment_terms_code":"COD","price_level":"Retail","credit_limit_cad":5000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN","WK"],"trade_type":"handyman","contacts":[{"first_name":"Ian","last_name":"Wexcombe","title":"Owner","email":"ian.wexcombe@brand.example","phone":"250-555-0133","role":"Owner","is_primary":true}],"job_sites":[{"name":"Crossing Custom Home","line1":"4348 Tread Pl","city":"Oliver","region":"BC","notes":""},{"name":"Knoll Residence","line1":"4395 Lath Pl","city":"West Kelowna","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"KEL-0266","name":"Caldwell Handyman Service","email":"pm@service.example","phone":"250-555-0129","address_line1":"1963 Stucco Rd, Summerland BC","city":"Summerland","region":"BC","tier":"RETAIL","payment_terms_code":"DUE_ON_RECEIPT","price_level":"Retail","credit_limit_cad":5000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"handyman","contacts":[{"first_name":"Paolo","last_name":"Caldwell","title":"Owner","email":"paolo.caldwell@brand.example","phone":"250-555-0134","role":"Owner","is_primary":true}],"job_sites":[{"name":"Landing Cottage","line1":"4379 Furring Pl","city":"Vernon","region":"BC","notes":""},{"name":"Trace Addition","line1":"4426 Purlins Pl","city":"Oliver","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"KEL-0267","name":"Fairweather Handyman Service","email":"pm@service.example","phone":"250-555-0130","address_line1":"1970 Batten Rd, Kelowna BC","city":"Kelowna","region":"BC","tier":"RETAIL","payment_terms_code":"NET30","price_level":"Retail","credit_limit_cad":5000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"handyman","contacts":[{"first_name":"Wade","last_name":"Fairweather","title":"Owner","email":"wade.fairweather@brand.example","phone":"250-555-0135","role":"Owner","is_primary":true}],"job_sites":[{"name":"Knoll Laneway","line1":"4410 Trimmer Pl","city":"Peachland","region":"BC","notes":""},{"name":"Lookout Carriage","line1":"4457 Cupola Pl","city":"Vernon","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"KEL-0268","name":"Iverson Handyman Service","email":"pm@service.example","phone":"250-555-0131","address_line1":"1977 Sheathing Rd, West Kelowna BC","city":"West Kelowna","region":"BC","tier":"RETAIL","payment_terms_code":"CASH","price_level":"Retail","credit_limit_cad":5000,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN","WK"],"trade_type":"handyman","contacts":[{"first_name":"Erin","last_name":"Iverson","title":"Owner","email":"erin.iverson@brand.example","phone":"250-555-0136","role":"Owner","is_primary":true}],"job_sites":[{"name":"Trace Build","line1":"4441 Render Pl","city":"Peachland","region":"BC","notes":""},{"name":"Reach Project","line1":"4488 Kickout Pl","city":"Peachland","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} @@ -130,7 +130,7 @@ {"account_number":"RET-0010","name":"Fern Pemberton","email":"marc.fern@brand.example","phone":"250-555-0150","address_line1":"2110 Tread Rd, Peachland BC","city":"Peachland","region":"BC","tier":"RETAIL","payment_terms_code":"NET30","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"homeowner","contacts":[{"first_name":"Marc","last_name":"Fern","title":"Owner","email":"marc.fern@brand.example","phone":"250-555-0155","role":"Owner","is_primary":true}],"job_sites":[{"name":"Crest Reno","line1":"5030 Furring Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"RET-0011","name":"Gina Standish","email":"theo.gina@brand.example","phone":"250-555-0151","address_line1":"2117 Riser Rd, Lumby BC","city":"Lumby","region":"BC","tier":"RETAIL","payment_terms_code":"CASH","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"homeowner","contacts":[{"first_name":"Theo","last_name":"Gina","title":"Owner","email":"theo.gina@brand.example","phone":"250-555-0156","role":"Owner","is_primary":true}],"job_sites":[{"name":"Spur Shop Build","line1":"5061 Trimmer Pl","city":"Osoyoos","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} {"account_number":"RET-0012","name":"Hana Vanderpol","email":"bree.hana@brand.example","phone":"250-555-0152","address_line1":"2124 Stringer Rd, Lake Country BC","city":"Lake Country","region":"BC","tier":"RETAIL","payment_terms_code":"COD","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"homeowner","contacts":[{"first_name":"Bree","last_name":"Hana","title":"Owner","email":"bree.hana@brand.example","phone":"250-555-0157","role":"Owner","is_primary":true}],"job_sites":[{"name":"Meadows Custom Home","line1":"5092 Render Pl","city":"Lumby","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} -{"account_number":"RET-0013","name":"Ines Zellweger","email":"ines.ines@brand.example","phone":"250-555-0153","address_line1":"2131 Joister Rd, Peachland BC","city":"Peachland","region":"BC","tier":"RETAIL","payment_terms_code":"DUE_ON_RECEIPT","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"homeowner","contacts":[{"first_name":"Ines","last_name":"Ines","title":"Owner","email":"ines.ines@brand.example","phone":"250-555-0158","role":"Owner","is_primary":true}],"job_sites":[{"name":"Pointe Cottage","line1":"5123 Formwork Pl","city":"Summerland","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} +{"account_number":"RET-0013","name":"Ines Wexcombe","email":"ines.ines@brand.example","phone":"250-555-0153","address_line1":"2131 Joister Rd, Peachland BC","city":"Peachland","region":"BC","tier":"RETAIL","payment_terms_code":"DUE_ON_RECEIPT","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"homeowner","contacts":[{"first_name":"Ines","last_name":"Ines","title":"Owner","email":"ines.ines@brand.example","phone":"250-555-0158","role":"Owner","is_primary":true}],"job_sites":[{"name":"Pointe Cottage","line1":"5123 Formwork Pl","city":"Summerland","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} {"account_number":"RET-0014","name":"Jana Caldwell","email":"petra.jana@brand.example","phone":"250-555-0154","address_line1":"2138 Plaster Rd, Lumby BC","city":"Lumby","region":"BC","tier":"RETAIL","payment_terms_code":"NET30","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"homeowner","contacts":[{"first_name":"Petra","last_name":"Jana","title":"Owner","email":"petra.jana@brand.example","phone":"250-555-0159","role":"Owner","is_primary":true}],"job_sites":[{"name":"Shores Laneway","line1":"5154 Millwright Pl","city":"Summerland","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} {"account_number":"RET-0015","name":"Kira Fairweather","email":"wren.kira@brand.example","phone":"250-555-0155","address_line1":"2145 Lath Rd, Kelowna BC","city":"Kelowna","region":"BC","tier":"RETAIL","payment_terms_code":"CASH","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"homeowner","contacts":[{"first_name":"Wren","last_name":"Kira","title":"Owner","email":"wren.kira@brand.example","phone":"250-555-0160","role":"Owner","is_primary":true}],"job_sites":[{"name":"Vista Build","line1":"5185 Fascia Pl","city":"West Kelowna","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"RET-0016","name":"Lena Iverson","email":"erik.lena@brand.example","phone":"250-555-0156","address_line1":"2152 Quoin Rd, Peachland BC","city":"Peachland","region":"BC","tier":"RETAIL","payment_terms_code":"COD","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"homeowner","contacts":[{"first_name":"Erik","last_name":"Lena","title":"Owner","email":"erik.lena@brand.example","phone":"250-555-0161","role":"Owner","is_primary":true}],"job_sites":[{"name":"Loft Pavilion","line1":"5216 Tread Pl","city":"Oliver","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} @@ -155,6 +155,6 @@ {"account_number":"RET-0035","name":"Finn Pemberton","email":"mira.finn@brand.example","phone":"250-555-0175","address_line1":"2285 Cripple Rd, Lumby BC","city":"Lumby","region":"BC","tier":"RETAIL","payment_terms_code":"CASH","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"homeowner","contacts":[{"first_name":"Mira","last_name":"Finn","title":"Owner","email":"mira.finn@brand.example","phone":"250-555-0180","role":"Owner","is_primary":true}],"job_sites":[{"name":"Bluff Shop Build","line1":"5805 Millwright Pl","city":"Penticton","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} {"account_number":"RET-0036","name":"Gareth Standish","email":"tara.gareth@brand.example","phone":"250-555-0176","address_line1":"2292 Trimmer Rd, West Kelowna BC","city":"West Kelowna","region":"BC","tier":"RETAIL","payment_terms_code":"COD","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"homeowner","contacts":[{"first_name":"Tara","last_name":"Gareth","title":"Owner","email":"tara.gareth@brand.example","phone":"250-555-0181","role":"Owner","is_primary":true}],"job_sites":[{"name":"Terrace Custom Home","line1":"5836 Fascia Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"RET-0037","name":"Hank Vanderpol","email":"ben.hank@brand.example","phone":"250-555-0177","address_line1":"2299 Kingpost Rd, Peachland BC","city":"Peachland","region":"BC","tier":"RETAIL","payment_terms_code":"DUE_ON_RECEIPT","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"homeowner","contacts":[{"first_name":"Ben","last_name":"Hank","title":"Owner","email":"ben.hank@brand.example","phone":"250-555-0182","role":"Owner","is_primary":true}],"job_sites":[{"name":"Mews Cottage","line1":"5867 Tread Pl","city":"West Kelowna","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} -{"account_number":"RET-0038","name":"Ian Zellweger","email":"ian.ian@brand.example","phone":"250-555-0178","address_line1":"2306 Hipjack Rd, Lumby BC","city":"Lumby","region":"BC","tier":"RETAIL","payment_terms_code":"NET30","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"homeowner","contacts":[{"first_name":"Ian","last_name":"Ian","title":"Owner","email":"ian.ian@brand.example","phone":"250-555-0183","role":"Owner","is_primary":true}],"job_sites":[{"name":"Court Laneway","line1":"5898 Furring Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} +{"account_number":"RET-0038","name":"Ian Wexcombe","email":"ian.ian@brand.example","phone":"250-555-0178","address_line1":"2306 Hipjack Rd, Lumby BC","city":"Lumby","region":"BC","tier":"RETAIL","payment_terms_code":"NET30","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"LK","yards_trades_at":["LK"],"trade_type":"homeowner","contacts":[{"first_name":"Ian","last_name":"Ian","title":"Owner","email":"ian.ian@brand.example","phone":"250-555-0183","role":"Owner","is_primary":true}],"job_sites":[{"name":"Court Laneway","line1":"5898 Furring Pl","city":"Lake Country","region":"BC","notes":""}],"salesperson_email":"lucas.p@gablebuildingsupply.example","active":true} {"account_number":"RET-0039","name":"Joel Caldwell","email":"paolo.joel@brand.example","phone":"250-555-0179","address_line1":"2313 Valleyjack Rd, Summerland BC","city":"Summerland","region":"BC","tier":"RETAIL","payment_terms_code":"CASH","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"KEL-MAIN","yards_trades_at":["KEL-MAIN"],"trade_type":"homeowner","contacts":[{"first_name":"Paolo","last_name":"Joel","title":"Owner","email":"paolo.joel@brand.example","phone":"250-555-0184","role":"Owner","is_primary":true}],"job_sites":[{"name":"Glen Build","line1":"5929 Trimmer Pl","city":"Osoyoos","region":"BC","notes":""}],"salesperson_email":"ethan.g@gablebuildingsupply.example","active":true} {"account_number":"RET-0040","name":"Kale Fairweather","email":"wade.kale@brand.example","phone":"250-555-0180","address_line1":"2320 Dormer Rd, Peachland BC","city":"Peachland","region":"BC","tier":"RETAIL","payment_terms_code":"COD","price_level":"Retail","credit_limit_cad":0,"pst_exempt":false,"home_yard":"WK","yards_trades_at":["WK"],"trade_type":"homeowner","contacts":[{"first_name":"Wade","last_name":"Kale","title":"Owner","email":"wade.kale@brand.example","phone":"250-555-0185","role":"Owner","is_primary":true}],"job_sites":[{"name":"Crest Pavilion","line1":"5960 Render Pl","city":"Lumby","region":"BC","notes":""}],"salesperson_email":"cameron.f@gablebuildingsupply.example","active":true} diff --git a/core/internal/app/seed/demodata/staff.jsonl b/core/internal/app/seed/demodata/staff.jsonl index 0c4d8c677..7bd24f85e 100644 --- a/core/internal/app/seed/demodata/staff.jsonl +++ b/core/internal/app/seed/demodata/staff.jsonl @@ -12,13 +12,13 @@ {"email":"buyer.hardware.paint@brand.example","full_name":"Joel Aldridge","staff_no":"STF-015","role":"buyer_hardware_paint","home_yard":"WK","active":true} {"email":"buyer.millwork.doors@brand.example","full_name":"Rhea Jamison","staff_no":"STF-016","role":"buyer_millwork_doors","home_yard":"WK","active":true} {"email":"buyer.seasonal.lawn@brand.example","full_name":"Theo Caldwell","staff_no":"STF-017","role":"buyer_seasonal_lawn","home_yard":"LK","active":true} -{"email":"home.center.associate.kel.1@brand.example","full_name":"Una Zellweger","staff_no":"STF-018","role":"home_center_associate","home_yard":"KEL-MAIN","active":true} +{"email":"home.center.associate.kel.1@brand.example","full_name":"Una Wexcombe","staff_no":"STF-018","role":"home_center_associate","home_yard":"KEL-MAIN","active":true} {"email":"home.center.associate.kel.2@brand.example","full_name":"Yara Yardley","staff_no":"STF-019","role":"home_center_associate","home_yard":"KEL-MAIN","active":true} {"email":"home.center.associate.kel.3@brand.example","full_name":"Quinn Gardiner","staff_no":"STF-020","role":"home_center_associate","home_yard":"KEL-MAIN","active":true} -{"email":"home.center.associate.wk.1@brand.example","full_name":"Vince Nordstrom","staff_no":"STF-021","role":"home_center_associate","home_yard":"WK","active":true} +{"email":"home.center.associate.wk.1@brand.example","full_name":"Vince Ashgrove","staff_no":"STF-021","role":"home_center_associate","home_yard":"WK","active":true} {"email":"home.center.associate.wk.2@brand.example","full_name":"Olga Fairweather","staff_no":"STF-022","role":"home_center_associate","home_yard":"WK","active":true} {"email":"home.center.associate.lk.1@brand.example","full_name":"Kira Bergstrom","staff_no":"STF-023","role":"home_center_associate","home_yard":"LK","active":true} -{"email":"cashier.kel.1@brand.example","full_name":"Tara Kellogg","staff_no":"STF-024","role":"cashier","home_yard":"KEL-MAIN","active":true} +{"email":"cashier.kel.1@brand.example","full_name":"Tara Penhallow","staff_no":"STF-024","role":"cashier","home_yard":"KEL-MAIN","active":true} {"email":"cashier.kel.2@brand.example","full_name":"Mira Vanderpol","staff_no":"STF-025","role":"cashier","home_yard":"KEL-MAIN","active":true} {"email":"cashier.wk.1@brand.example","full_name":"Finn Underhill","staff_no":"STF-026","role":"cashier","home_yard":"WK","active":true} {"email":"cashier.lk.1@brand.example","full_name":"Avril MacNaught","staff_no":"STF-027","role":"cashier","home_yard":"LK","active":true} diff --git a/core/internal/app/seed/demodata/vendor_keys.json b/core/internal/app/seed/demodata/vendor_keys.json index 9dfd76b14..8402fe3a5 100644 --- a/core/internal/app/seed/demodata/vendor_keys.json +++ b/core/internal/app/seed/demodata/vendor_keys.json @@ -157,8 +157,8 @@ "notes": "Invented connector brand. Joist hangers, hurricane ties, hold downs." }, { - "key": "CEMTRIM_OK", - "name": "Okanagan Cemtrim Ltd", + "key": "FIBRETRIM_OK", + "name": "Okanagan Fibre Trim Ltd", "category": "Fibre cement siding and trim", "payment_terms": "Net 30", "average_lead_time_days": 10, diff --git a/core/internal/app/seed/demodata_test.go b/core/internal/app/seed/demodata_test.go index 31caeb7b9..84f1f27ed 100644 --- a/core/internal/app/seed/demodata_test.go +++ b/core/internal/app/seed/demodata_test.go @@ -83,12 +83,50 @@ func TestDemoImportRequested(t *testing.T) { } } +// bannedSeedWords are real brands and a real domain the seeds and the import +// never carry: a product is named for what it is, and a demo address ends in +// a reserved ".example" domain. +var bannedSeedWords = []string{ + "simpson", "strong-tie", "hardie", "cemtrim", "channellock", "romex", + "dryline", "firecode", "brownwood", "turtle", "gable.com", + "nordstrom", "kellogg", "zellweger", + "simp-", "ice & water shield", "speed square", +} + +// TestSeedDataHoldsNoBrandWord reads the embedded import and fails on any +// banned word, so the check needs no database. +func TestSeedDataHoldsNoBrandWord(t *testing.T) { + for name, data := range map[string][]byte{ + "catalog": catalogData, + "customers": customersData, + "staff": staffData, + "vendors": vendorsData, + "vendorkeys": vendorKeysData, + } { + lower := strings.ToLower(string(data)) + for _, word := range bannedSeedWords { + if strings.Contains(lower, word) { + t.Errorf("%s import holds %q", name, word) + } + } + } +} + func TestDemoImport(t *testing.T) { if testing.Short() { t.Skip("seeds a scratch database of its own; skipped under -short") } db, dbURL := demoImportDB(t) runCommand(t, dbURL, "./cmd/migrate") + // Migrations 080 and 118 together: a migrated database, before any seed + // run, holds no row on the real domain. + var onRealDomain int + if err := db.QueryRow(`SELECT COUNT(*) FROM staff WHERE email ILIKE '%@gable.com'`).Scan(&onRealDomain); err != nil { + t.Fatalf("count staff on the real domain: %v", err) + } + if onRealDomain != 0 { + t.Errorf("a migrated database holds %d staff rows on @gable.com", onRealDomain) + } // The tenant takes a currency other than the documents' column default // (USD), so a history document that fell back to the default would show. res, err := db.Exec(`UPDATE system_settings SET value = 'CAD' WHERE key IN ('currency.default', 'currency.enabled')`) @@ -161,7 +199,6 @@ func TestDemoImport(t *testing.T) { AND sku NOT LIKE 'SCR-%' AND sku NOT LIKE 'HANGER-%' AND sku NOT LIKE 'TIE-%' - AND sku NOT LIKE 'SIMP-%' AND sku NOT LIKE 'RF-%' AND sku NOT LIKE 'INS-%' AND sku NOT LIKE 'DR-%' @@ -213,6 +250,29 @@ func TestDemoImport(t *testing.T) { } }) + t.Run("no row carries a brand word or the real domain", func(t *testing.T) { + for _, c := range []struct{ table, column string }{ + {"products", "sku"}, + {"products", "description"}, + {"products", "vendor"}, + {"products", "category"}, + {"vendors", "name"}, + {"staff", "email"}, + {"staff", "full_name"}, + } { + for _, word := range bannedSeedWords { + var n int + q := fmt.Sprintf(`SELECT COUNT(*) FROM %s WHERE %s ILIKE $1`, c.table, c.column) + if err := db.QueryRow(q, "%"+word+"%").Scan(&n); err != nil { + t.Fatalf("%s.%s: %v", c.table, c.column, err) + } + if n > 0 { + t.Errorf("%s.%s: %d rows hold %q", c.table, c.column, n, word) + } + } + } + }) + t.Run("revenue trends across many days at each yard", func(t *testing.T) { var days int if err := db.QueryRow(` diff --git a/core/internal/app/seed/dispatch_day.go b/core/internal/app/seed/dispatch_day.go index a38d9164f..f9a63d10d 100644 --- a/core/internal/app/seed/dispatch_day.go +++ b/core/internal/app/seed/dispatch_day.go @@ -144,7 +144,7 @@ var productGeometry = []geometry{ noGeometry("HANGER-28"), noGeometry("HANGER-210"), noGeometry("TIE-H1"), - noGeometry("SIMP-LUS28"), + noGeometry("HANGER-28FM"), // --- Insulation: compressed bags --- dims("INS-R13-15", 48, 16, 20, true), diff --git a/core/internal/app/seed/product_pictures.go b/core/internal/app/seed/product_pictures.go index 1eb85acec..08a4201e7 100644 --- a/core/internal/app/seed/product_pictures.go +++ b/core/internal/app/seed/product_pictures.go @@ -45,7 +45,7 @@ var baseProductFamilies = map[string]string{ "NAIL-16D-50": "common_nail_box", "NAIL-10D-50": "common_nail_box", "RF-NAIL-125": "galvanized_nail_box", "SCR-DECK-3-5": "deck_screw_box", "HANGER-26": "joist_hanger", "HANGER-28": "joist_hanger", "HANGER-210": "joist_hanger", - "SIMP-LUS28": "joist_hanger", "TIE-H1": "framing_connector", + "HANGER-28FM": "joist_hanger", "TIE-H1": "framing_connector", // roofing "RF-ARCH-30": "asphalt_shingle_bundle", "RF-SH-BLK": "asphalt_shingle_bundle", "RF-SH-WW": "asphalt_shingle_bundle", "RF-START": "asphalt_shingle_bundle", diff --git a/core/internal/app/seed/product_pictures_test.go b/core/internal/app/seed/product_pictures_test.go index 0722fde86..910f3e82f 100644 --- a/core/internal/app/seed/product_pictures_test.go +++ b/core/internal/app/seed/product_pictures_test.go @@ -8,6 +8,8 @@ import ( "encoding/json" "os" "path/filepath" + "regexp" + "strings" "testing" ) @@ -39,3 +41,47 @@ func TestEveryPicturePathHasAnIllustration(t *testing.T) { } } } + +// RULE: the base seed's picture map keys only SKUs the base seed writes, and +// no key holds a brand word, so a renamed product keeps its picture. +func TestBasePictureKeysAreSeededSKUs(t *testing.T) { + src, err := os.ReadFile("seed.go") + if err != nil { + t.Fatal(err) + } + for sku := range baseProductFamilies { + if !strings.Contains(string(src), `"`+sku+`"`) { + t.Errorf("picture key %q is not a SKU the base seed writes", sku) + } + for _, word := range bannedSeedWords { + if strings.Contains(strings.ToLower(sku), word) { + t.Errorf("picture key %q holds %q", sku, word) + } + } + } +} + +// RULE: no illustration's title or text names a maker's mark. +func TestIllustrationsNameNoBrand(t *testing.T) { + dir := filepath.Join("..", "..", "..", "..", "web", "apps", "desk", "public", "catalog-illustrations") + files, err := filepath.Glob(filepath.Join(dir, "*.svg")) + if err != nil || len(files) == 0 { + t.Fatalf("no illustrations found: %v", err) + } + decora := regexp.MustCompile(`\bdecora\b`) + for _, f := range files { + raw, err := os.ReadFile(f) + if err != nil { + t.Fatal(err) + } + lower := strings.ToLower(string(raw)) + " " + strings.ToLower(filepath.Base(f)) + for _, word := range bannedSeedWords { + if strings.Contains(lower, word) { + t.Errorf("%s holds %q", filepath.Base(f), word) + } + } + if decora.MatchString(lower) { + t.Errorf("%s holds the mark Decora", filepath.Base(f)) + } + } +} diff --git a/core/internal/app/seed/seed.go b/core/internal/app/seed/seed.go index c1616966e..aa55d8178 100644 --- a/core/internal/app/seed/seed.go +++ b/core/internal/app/seed/seed.go @@ -470,7 +470,7 @@ func Run() { {"3/4 OSB T&G 4x8", "OSB-34-TG", "PCS", "Gable Building Supply", "Sheet Goods", 22.00, 34.00, 65.0, 100, 250}, {"7/16 OSB 4x8", "OSB-12", "PCS", "Gable Building Supply", "Sheet Goods", 12.00, 19.50, 44.0, 120, 300}, {"1/2 Drywall Regular 4x8", "DW-12-REG", "PCS", "Gable Building Supply", "Sheet Goods", 11.00, 16.00, 57.0, 100, 250}, - {"5/8 Drywall Firecode 4x8", "DW-58-FC", "PCS", "Gable Building Supply", "Sheet Goods", 14.00, 21.00, 70.0, 60, 150}, + {"5/8 Drywall Type X 4x8", "DW-58-FC", "PCS", "Gable Building Supply", "Sheet Goods", 14.00, 21.00, 70.0, 60, 150}, {"3-1/4\" Common Nails (25kg)", "NAIL-16D-50", "BOX", "Mountain Fastener Supply", "Hardware", 45.00, 65.00, 50.0, 20, 50}, {"3\" Common Nails (25kg)", "NAIL-10D-50", "BOX", "Mountain Fastener Supply", "Hardware", 45.00, 65.00, 50.0, 20, 50}, {"3\" Deck Screws (2.5kg)", "SCR-DECK-3-5", "BOX", "Mountain Fastener Supply", "Hardware", 18.00, 29.99, 5.0, 40, 100}, @@ -478,19 +478,19 @@ func Run() { {"Joist Hanger 2x8", "HANGER-28", "PCS", "Okanagan Hardware Distribution", "Hardware", 0.95, 1.65, 0.6, 150, 400}, {"Joist Hanger 2x10", "HANGER-210", "PCS", "Okanagan Hardware Distribution", "Hardware", 1.10, 1.85, 0.7, 100, 300}, {"Hurricane Tie H1", "TIE-H1", "PCS", "Okanagan Hardware Distribution", "Hardware", 0.65, 1.15, 0.3, 200, 500}, - {"Simpson Strong-Tie LUS28", "SIMP-LUS28", "PCS", "Okanagan Hardware Distribution", "Hardware", 0.90, 1.50, 0.4, 150, 400}, + {"Face Mount Joist Hanger 2x8", "HANGER-28FM", "PCS", "Okanagan Hardware Distribution", "Hardware", 0.90, 1.50, 0.4, 150, 400}, {"Architectural Shingles 30yr", "RF-ARCH-30", "BUNDLE", "BC Roofing Wholesale", "Roofing", 28.00, 42.00, 70.0, 50, 100}, {"Architectural Shingles (Black)", "RF-SH-BLK", "BUNDLE", "BC Roofing Wholesale", "Roofing", 28.00, 42.00, 70.0, 50, 100}, {"Architectural Shingles (Weathered Wood)", "RF-SH-WW", "BUNDLE", "BC Roofing Wholesale", "Roofing", 28.00, 42.00, 70.0, 50, 100}, {"Roofing Felt #15", "RF-FELT-15", "RL", "BC Roofing Wholesale", "Roofing", 15.00, 22.50, 15.0, 30, 80}, - {"Ice & Water Shield 65'", "RF-ICE-65", "RL", "BC Roofing Wholesale", "Roofing", 65.00, 98.00, 36.0, 20, 50}, + {"Ice and Water Barrier 65'", "RF-ICE-65", "RL", "BC Roofing Wholesale", "Roofing", 65.00, 98.00, 36.0, 20, 50}, {"Roof Edge Drip 10'", "RF-DRIP-10", "PCS", "BC Roofing Wholesale", "Roofing", 4.50, 7.50, 2.0, 60, 150}, {"Ridge Vent 4'", "RF-RIDGE-4", "PCS", "BC Roofing Wholesale", "Roofing", 8.00, 13.50, 3.0, 40, 80}, {"Starter Strip", "RF-START", "PCS", "BC Roofing Wholesale", "Roofing", 6.00, 10.00, 2.5, 40, 80}, {"1.25\" Roofing Nails 2.5kg", "RF-NAIL-125", "BOX", "BC Roofing Wholesale", "Roofing", 12.00, 19.00, 5.0, 30, 60}, {"Step Flashing", "RF-FLASH-STEP", "PCS", "BC Roofing Wholesale", "Roofing", 2.50, 4.50, 0.5, 60, 120}, {"Pipe Boot Flashing", "RF-FLASH-PIPE", "PCS", "BC Roofing Wholesale", "Roofing", 8.00, 14.00, 1.5, 20, 40}, - {"Ice & Water Shield", "RF-ICE-WTR", "RL", "BC Roofing Wholesale", "Roofing", 65.00, 98.00, 36.0, 20, 50}, + {"Ice and Water Barrier", "RF-ICE-WTR", "RL", "BC Roofing Wholesale", "Roofing", 65.00, 98.00, 36.0, 20, 50}, {"Roof Edge Drip 10'", "RF-EDGE-WHT", "PCS", "BC Roofing Wholesale", "Roofing", 4.50, 7.50, 2.0, 60, 150}, {"R-14 Fiberglass Batts 15x93", "INS-R13-15", "BAG", "Cariboo Insulation Ltd", "Insulation", 45.00, 68.00, 32.0, 30, 60}, {"R-20 Fiberglass Batts 15x93", "INS-R19-15", "BAG", "Cariboo Insulation Ltd", "Insulation", 55.00, 82.00, 42.0, 25, 50}, @@ -506,15 +506,15 @@ func Run() { {"Flashing J 6 X 6 X 10", "CORN2006", "EA", "Gable Building Supply", "Cornice", 15.50, 23.25, 3.0, 20, 50}, {"Flashing Z Bar 3/4 X 10'", "CORN2009", "EA", "Gable Building Supply", "Cornice", 3.50, 5.25, 1.5, 30, 60}, {"Silicone Clear Caulk", "CORNCLEAR", "EA", "Okanagan Hardware Distribution", "Cornice", 5.75, 8.65, 0.8, 40, 80}, - {"Cemtrim Textured 7/16 X 4 X 12", "CORNCTRM412+", "EA", "Gable Building Supply", "Cornice", 7.54, 11.31, 12.0, 50, 120}, - {"Cemtrim Textured 7/16 X 6 X 12", "CORNCTRMG12+", "EA", "Gable Building Supply", "Cornice", 11.94, 17.91, 18.0, 30, 80}, + {"Composite Trim Textured 7/16 X 4 X 12", "CORNCTRM412+", "EA", "Gable Building Supply", "Cornice", 7.54, 11.31, 12.0, 50, 120}, + {"Composite Trim Textured 7/16 X 6 X 12", "CORNCTRMG12+", "EA", "Gable Building Supply", "Cornice", 11.94, 17.91, 18.0, 30, 80}, {"Vinyl H Mold 1/4 X 12'", "CORNHMOLD14", "EA", "Gable Building Supply", "Cornice", 4.00, 6.00, 1.0, 30, 60}, {"Poly Black 18 X 300", "CORNPOLY18", "RL", "Okanagan Hardware Distribution", "Cornice", 23.12, 34.68, 25.0, 10, 25}, - {"Solid Soffit Hardie Textured 1/4 X 12 X 12", "CORNSFT1212", "EA", "Gable Building Supply", "Cornice", 15.25, 22.88, 20.0, 30, 60}, - {"Solid Soffit Hardie Textured 1/4 X 16 X 12", "CORNSFT1612", "EA", "Gable Building Supply", "Cornice", 20.45, 30.68, 28.0, 20, 50}, - {"Vented Soffit Hardie Textured 1/4 X 16 X 12", "CORNSFT1612V", "EA", "Gable Building Supply", "Cornice", 26.15, 39.23, 30.0, 25, 60}, - {"Vented Soffit Hardie Textured 1/4 X 24 X 8", "CORNSFT2408V", "EA", "Gable Building Supply", "Cornice", 17.50, 26.25, 22.0, 20, 50}, - {"Sheathing 1/8 X 4 X 9 (Green) NSP DRYLine TSX", "CORNSHTGR49", "EA", "Gable Building Supply", "Cornice", 9.36, 14.04, 24.0, 40, 100}, + {"Solid Soffit Fibre Cement Textured 1/4 X 12 X 12", "CORNSFT1212", "EA", "Gable Building Supply", "Cornice", 15.25, 22.88, 20.0, 30, 60}, + {"Solid Soffit Fibre Cement Textured 1/4 X 16 X 12", "CORNSFT1612", "EA", "Gable Building Supply", "Cornice", 20.45, 30.68, 28.0, 20, 50}, + {"Vented Soffit Fibre Cement Textured 1/4 X 16 X 12", "CORNSFT1612V", "EA", "Gable Building Supply", "Cornice", 26.15, 39.23, 30.0, 25, 60}, + {"Vented Soffit Fibre Cement Textured 1/4 X 24 X 8", "CORNSFT2408V", "EA", "Gable Building Supply", "Cornice", 17.50, 26.25, 22.0, 20, 50}, + {"Sheathing 1/8 X 4 X 9 (Green) NSP Weather Barrier", "CORNSHTGR49", "EA", "Gable Building Supply", "Cornice", 9.36, 14.04, 24.0, 40, 100}, {"Window Tape 6\" (100')", "CORNTAPE", "RL", "Okanagan Hardware Distribution", "Cornice", 22.00, 33.00, 3.0, 15, 30}, // Random-length / economy grade @@ -1087,7 +1087,7 @@ func Run() { var podURL, podSigner *string var podTS *time.Time if dStatus == "DELIVERED" { - u := "https://storage.gable.com/pod/" + uuid.New().String() + ".jpg" + u := "https://storage.gablebuildingsupply.example/pod/" + uuid.New().String() + ".jpg" n := "Site Foreman" t := sDate.Add(time.Duration(8+rand.Intn(6)) * time.Hour) podURL = &u diff --git a/core/internal/characterization/testdata/goldens/dashboard.json b/core/internal/characterization/testdata/goldens/dashboard.json index b88dfd036..3471cd3c6 100644 --- a/core/internal/characterization/testdata/goldens/dashboard.json +++ b/core/internal/characterization/testdata/goldens/dashboard.json @@ -30,7 +30,7 @@ "alert_type": "LOW_STOCK", "current_qty": 12, "location_id": "", - "name": "Sheathing 1/8 X 4 X 9 (Green) NSP DRYLine TSX", + "name": "Sheathing 1/8 X 4 X 9 (Green) NSP Weather Barrier", "product_id": "", "reorder_qty": 40, "sku": "CORNSHTGR49" @@ -39,10 +39,10 @@ "alert_type": "LOW_STOCK", "current_qty": 12, "location_id": "", - "name": "Simpson Strong-Tie LUS28", + "name": "Face Mount Joist Hanger 2x8", "product_id": "", "reorder_qty": 150, - "sku": "SIMP-LUS28" + "sku": "HANGER-28FM" }, { "alert_type": "LOW_STOCK", @@ -75,7 +75,7 @@ "alert_type": "LOW_STOCK", "current_qty": 17, "location_id": "", - "name": "Vented Soffit Hardie Textured 1/4 X 24 X 8", + "name": "Vented Soffit Fibre Cement Textured 1/4 X 24 X 8", "product_id": "", "reorder_qty": 20, "sku": "CORNSFT2408V" @@ -93,7 +93,7 @@ "alert_type": "LOW_STOCK", "current_qty": 17, "location_id": "", - "name": "Ice & Water Shield 65'", + "name": "Ice and Water Barrier 65'", "product_id": "", "reorder_qty": 20, "sku": "RF-ICE-65" diff --git a/core/internal/characterization/testdata/goldens/portal_quotes.json b/core/internal/characterization/testdata/goldens/portal_quotes.json index 38a863fa4..e54b457d0 100644 --- a/core/internal/characterization/testdata/goldens/portal_quotes.json +++ b/core/internal/characterization/testdata/goldens/portal_quotes.json @@ -697,7 +697,7 @@ "lines": [ { "customer_note": "", - "description": "5/8 Drywall Firecode 4x8", + "description": "5/8 Drywall Type X 4x8", "id": "", "is_special_order": false, "line_total": 819, @@ -847,7 +847,7 @@ }, { "customer_note": "", - "description": "Vented Soffit Hardie Textured 1/4 X 24 X 8", + "description": "Vented Soffit Fibre Cement Textured 1/4 X 24 X 8", "id": "", "is_special_order": false, "line_total": 2703.75, @@ -873,7 +873,7 @@ }, { "customer_note": "", - "description": "Cemtrim Textured 7/16 X 6 X 12", + "description": "Composite Trim Textured 7/16 X 6 X 12", "id": "", "is_special_order": false, "line_total": 1504.44, @@ -919,7 +919,7 @@ }, { "customer_note": "", - "description": "Vented Soffit Hardie Textured 1/4 X 16 X 12", + "description": "Vented Soffit Fibre Cement Textured 1/4 X 16 X 12", "id": "", "is_special_order": false, "line_total": 3687.62, @@ -932,7 +932,7 @@ }, { "customer_note": "", - "description": "Vented Soffit Hardie Textured 1/4 X 16 X 12", + "description": "Vented Soffit Fibre Cement Textured 1/4 X 16 X 12", "id": "", "is_special_order": false, "line_total": 274.61, @@ -945,7 +945,7 @@ }, { "customer_note": "", - "description": "Sheathing 1/8 X 4 X 9 (Green) NSP DRYLine TSX", + "description": "Sheathing 1/8 X 4 X 9 (Green) NSP Weather Barrier", "id": "", "is_special_order": false, "line_total": 463.32, diff --git a/core/internal/characterization/testdata/goldens/pos.json b/core/internal/characterization/testdata/goldens/pos.json index 23cfa2bff..1e8a074a6 100644 --- a/core/internal/characterization/testdata/goldens/pos.json +++ b/core/internal/characterization/testdata/goldens/pos.json @@ -128,7 +128,7 @@ "uom": "EA" }, { - "description": "Cemtrim Textured 7/16 X 4 X 12", + "description": "Composite Trim Textured 7/16 X 4 X 12", "in_stock": "523", "product_id": "", "sku": "CORNCTRM412+", @@ -136,7 +136,7 @@ "uom": "EA" }, { - "description": "Cemtrim Textured 7/16 X 6 X 12", + "description": "Composite Trim Textured 7/16 X 6 X 12", "in_stock": "667", "product_id": "", "sku": "CORNCTRMG12+", @@ -160,7 +160,7 @@ "uom": "RL" }, { - "description": "Solid Soffit Hardie Textured 1/4 X 12 X 12", + "description": "Solid Soffit Fibre Cement Textured 1/4 X 12 X 12", "in_stock": "375", "product_id": "", "sku": "CORNSFT1212", @@ -168,7 +168,7 @@ "uom": "EA" }, { - "description": "Solid Soffit Hardie Textured 1/4 X 16 X 12", + "description": "Solid Soffit Fibre Cement Textured 1/4 X 16 X 12", "in_stock": "773", "product_id": "", "sku": "CORNSFT1612", @@ -176,7 +176,7 @@ "uom": "EA" }, { - "description": "Vented Soffit Hardie Textured 1/4 X 16 X 12", + "description": "Vented Soffit Fibre Cement Textured 1/4 X 16 X 12", "in_stock": "339", "product_id": "", "sku": "CORNSFT1612V", @@ -184,7 +184,7 @@ "uom": "EA" }, { - "description": "Vented Soffit Hardie Textured 1/4 X 24 X 8", + "description": "Vented Soffit Fibre Cement Textured 1/4 X 24 X 8", "in_stock": "471", "product_id": "", "sku": "CORNSFT2408V", @@ -192,7 +192,7 @@ "uom": "EA" }, { - "description": "Sheathing 1/8 X 4 X 9 (Green) NSP DRYLine TSX", + "description": "Sheathing 1/8 X 4 X 9 (Green) NSP Weather Barrier", "in_stock": "487", "product_id": "", "sku": "CORNSHTGR49", @@ -248,7 +248,7 @@ "uom": "PCS" }, { - "description": "5/8 Drywall Firecode 4x8", + "description": "5/8 Drywall Type X 4x8", "in_stock": "800", "product_id": "", "sku": "DW-58-FC", @@ -287,10 +287,18 @@ "unit_price_cents": 165, "uom": "PCS" }, + { + "description": "Face Mount Joist Hanger 2x8", + "in_stock": "846", + "product_id": "", + "sku": "HANGER-28FM", + "unit_price_cents": 150, + "uom": "PCS" + }, { "description": "R-14 Fiberglass Batts 15x93", "in_stock": "298", - "product_id": "", + "product_id": "", "sku": "INS-R13-15", "unit_price_cents": 6800, "uom": "BAG" @@ -298,7 +306,7 @@ { "description": "R-20 Fiberglass Batts 15x93", "in_stock": "932", - "product_id": "", + "product_id": "", "sku": "INS-R19-15", "unit_price_cents": 8200, "uom": "BAG" @@ -306,7 +314,7 @@ { "description": "R-28 Fiberglass Batts 24x48", "in_stock": "429", - "product_id": "", + "product_id": "", "sku": "INS-R30-24", "unit_price_cents": 9800, "uom": "BAG" @@ -314,7 +322,7 @@ { "description": "1x6x6 Cedar Fence Board", "in_stock": "739", - "product_id": "", + "product_id": "", "sku": "LUM-166-WRC", "unit_price_cents": 510, "uom": "PCS" @@ -322,7 +330,7 @@ { "description": "2x10x12 Hem-Fir No.2", "in_stock": "543", - "product_id": "", + "product_id": "", "sku": "LUM-21012-NO2", "unit_price_cents": 2450, "uom": "PCS" @@ -330,7 +338,7 @@ { "description": "2x12x16 Hem-Fir No.2", "in_stock": "586", - "product_id": "", + "product_id": "", "sku": "LUM-21216-NO2", "unit_price_cents": 4500, "uom": "PCS" @@ -338,7 +346,7 @@ { "description": "2x4x10 SPF Premium", "in_stock": "488", - "product_id": "", + "product_id": "", "sku": "LUM-2410-PREM", "unit_price_cents": 725, "uom": "PCS" @@ -346,7 +354,7 @@ { "description": "2x4x12 SPF Premium", "in_stock": "631", - "product_id": "", + "product_id": "", "sku": "LUM-2412-PREM", "unit_price_cents": 875, "uom": "PCS" @@ -354,7 +362,7 @@ { "description": "2x4x8 SPF Premium", "in_stock": "379", - "product_id": "", + "product_id": "", "sku": "LUM-248-PREM", "unit_price_cents": 550, "uom": "PCS" @@ -362,7 +370,7 @@ { "description": "2x4x92-5/8 SPF Stud", "in_stock": "635", - "product_id": "", + "product_id": "", "sku": "LUM-2492-STUD", "unit_price_cents": 510, "uom": "PCS" @@ -370,7 +378,7 @@ { "description": "2x6x10 SPF Premium", "in_stock": "869", - "product_id": "", + "product_id": "", "sku": "LUM-2610-PREM", "unit_price_cents": 980, "uom": "PCS" @@ -378,7 +386,7 @@ { "description": "2x6x12 SPF Premium", "in_stock": "200", - "product_id": "", + "product_id": "", "sku": "LUM-2612-PREM", "unit_price_cents": 1175, "uom": "PCS" @@ -386,7 +394,7 @@ { "description": "2x6x16 SPF Premium", "in_stock": "868", - "product_id": "", + "product_id": "", "sku": "LUM-2616-PREM", "unit_price_cents": 1560, "uom": "PCS" @@ -394,7 +402,7 @@ { "description": "2x8x10 Hem-Fir No.2", "in_stock": "622", - "product_id": "", + "product_id": "", "sku": "LUM-2810-NO2", "unit_price_cents": 1390, "uom": "PCS" @@ -402,7 +410,7 @@ { "description": "2x8x16 Hem-Fir No.2", "in_stock": "851", - "product_id": "", + "product_id": "", "sku": "LUM-2816-NO2", "unit_price_cents": 2225, "uom": "PCS" @@ -410,7 +418,7 @@ { "description": "4x4x10 Pressure Treated", "in_stock": "823", - "product_id": "", + "product_id": "", "sku": "LUM-4410-PT", "unit_price_cents": 1575, "uom": "PCS" @@ -418,7 +426,7 @@ { "description": "4x4x8 Pressure Treated", "in_stock": "646", - "product_id": "", + "product_id": "", "sku": "LUM-448-PT", "unit_price_cents": 1250, "uom": "PCS" @@ -426,7 +434,7 @@ { "description": "4x4x8 Western Red Cedar", "in_stock": "674", - "product_id": "", + "product_id": "", "sku": "LUM-448-WRC", "unit_price_cents": 3400, "uom": "PCS" @@ -434,7 +442,7 @@ { "description": "6x6x12 Pressure Treated", "in_stock": "406", - "product_id": "", + "product_id": "", "sku": "LUM-6612-PT", "unit_price_cents": 5500, "uom": "PCS" @@ -442,7 +450,7 @@ { "description": "1 X 4 RL #3 SPF", "in_stock": "787", - "product_id": "", + "product_id": "", "sku": "LUMB14RLN3+", "unit_price_cents": 52, "uom": "LF" @@ -450,7 +458,7 @@ { "description": "2 X 4 RL #3 SPF", "in_stock": "535", - "product_id": "", + "product_id": "", "sku": "LUMB24RLN3", "unit_price_cents": 46, "uom": "LF" @@ -458,7 +466,7 @@ { "description": "2 X 4 RL Utility", "in_stock": "590", - "product_id": "", + "product_id": "", "sku": "LUMBUT24RL", "unit_price_cents": 44, "uom": "LF" @@ -466,7 +474,7 @@ { "description": "Baseboard 3-1/4 MDF 16'", "in_stock": "645", - "product_id": "", + "product_id": "", "sku": "MLD-BASE-MDF", "unit_price_cents": 1950, "uom": "PCS" @@ -474,7 +482,7 @@ { "description": "Casing 2-1/4 MDF 14'", "in_stock": "542", - "product_id": "", + "product_id": "", "sku": "MLD-CASE-MDF", "unit_price_cents": 1350, "uom": "PCS" @@ -482,7 +490,7 @@ { "description": "3\" Common Nails (25kg)", "in_stock": "975", - "product_id": "", + "product_id": "", "sku": "NAIL-10D-50", "unit_price_cents": 6500, "uom": "BOX" @@ -490,7 +498,7 @@ { "description": "3-1/4\" Common Nails (25kg)", "in_stock": "336", - "product_id": "", + "product_id": "", "sku": "NAIL-16D-50", "unit_price_cents": 6500, "uom": "BOX" @@ -498,7 +506,7 @@ { "description": "7/16 OSB 4x8", "in_stock": "326", - "product_id": "", + "product_id": "", "sku": "OSB-12", "unit_price_cents": 1950, "uom": "PCS" @@ -506,7 +514,7 @@ { "description": "3/4 OSB T&G 4x8", "in_stock": "623", - "product_id": "", + "product_id": "", "sku": "OSB-34-TG", "unit_price_cents": 3400, "uom": "PCS" @@ -514,7 +522,7 @@ { "description": "1/2 Plywood G1S 4x8 (Fir)", "in_stock": "359", - "product_id": "", + "product_id": "", "sku": "PLY-12-CDX", "unit_price_cents": 2850, "uom": "PCS" @@ -522,7 +530,7 @@ { "description": "3/4 Plywood G1S 4x8 (Fir)", "in_stock": "859", - "product_id": "", + "product_id": "", "sku": "PLY-34-CDX", "unit_price_cents": 3800, "uom": "PCS" @@ -530,7 +538,7 @@ { "description": "Architectural Shingles 30yr", "in_stock": "990", - "product_id": "", + "product_id": "", "sku": "RF-ARCH-30", "unit_price_cents": 4200, "uom": "BUNDLE" @@ -538,7 +546,7 @@ { "description": "Roof Edge Drip 10'", "in_stock": "135", - "product_id": "", + "product_id": "", "sku": "RF-DRIP-10", "unit_price_cents": 750, "uom": "PCS" @@ -546,7 +554,7 @@ { "description": "Roof Edge Drip 10'", "in_stock": "548", - "product_id": "", + "product_id": "", "sku": "RF-EDGE-WHT", "unit_price_cents": 750, "uom": "PCS" @@ -554,7 +562,7 @@ { "description": "Roofing Felt #15", "in_stock": "404", - "product_id": "", + "product_id": "", "sku": "RF-FELT-15", "unit_price_cents": 2250, "uom": "RL" @@ -562,7 +570,7 @@ { "description": "Pipe Boot Flashing", "in_stock": "399", - "product_id": "", + "product_id": "", "sku": "RF-FLASH-PIPE", "unit_price_cents": 1400, "uom": "PCS" @@ -570,23 +578,23 @@ { "description": "Step Flashing", "in_stock": "272", - "product_id": "", + "product_id": "", "sku": "RF-FLASH-STEP", "unit_price_cents": 450, "uom": "PCS" }, { - "description": "Ice & Water Shield 65'", + "description": "Ice and Water Barrier 65'", "in_stock": "489", - "product_id": "", + "product_id": "", "sku": "RF-ICE-65", "unit_price_cents": 9800, "uom": "RL" }, { - "description": "Ice & Water Shield", + "description": "Ice and Water Barrier", "in_stock": "359", - "product_id": "", + "product_id": "", "sku": "RF-ICE-WTR", "unit_price_cents": 9800, "uom": "RL" @@ -594,7 +602,7 @@ { "description": "1.25\" Roofing Nails 2.5kg", "in_stock": "958", - "product_id": "", + "product_id": "", "sku": "RF-NAIL-125", "unit_price_cents": 1900, "uom": "BOX" @@ -602,7 +610,7 @@ { "description": "Ridge Vent 4'", "in_stock": "690", - "product_id": "", + "product_id": "", "sku": "RF-RIDGE-4", "unit_price_cents": 1350, "uom": "PCS" @@ -610,7 +618,7 @@ { "description": "Architectural Shingles (Black)", "in_stock": "880", - "product_id": "", + "product_id": "", "sku": "RF-SH-BLK", "unit_price_cents": 4200, "uom": "BUNDLE" @@ -618,7 +626,7 @@ { "description": "Architectural Shingles (Weathered Wood)", "in_stock": "750", - "product_id": "", + "product_id": "", "sku": "RF-SH-WW", "unit_price_cents": 4200, "uom": "BUNDLE" @@ -626,7 +634,7 @@ { "description": "Starter Strip", "in_stock": "876", - "product_id": "", + "product_id": "", "sku": "RF-START", "unit_price_cents": 1000, "uom": "PCS" @@ -634,19 +642,11 @@ { "description": "3\" Deck Screws (2.5kg)", "in_stock": "537", - "product_id": "", + "product_id": "", "sku": "SCR-DECK-3-5", "unit_price_cents": 2999, "uom": "BOX" }, - { - "description": "Simpson Strong-Tie LUS28", - "in_stock": "846", - "product_id": "", - "sku": "SIMP-LUS28", - "unit_price_cents": 150, - "uom": "PCS" - }, { "description": "Hurricane Tie H1", "in_stock": "583", diff --git a/core/internal/characterization/testdata/goldens/purchase_order_flow.json b/core/internal/characterization/testdata/goldens/purchase_order_flow.json index b26c0ca32..5223ae97c 100644 --- a/core/internal/characterization/testdata/goldens/purchase_order_flow.json +++ b/core/internal/characterization/testdata/goldens/purchase_order_flow.json @@ -288,13 +288,22 @@ "product_id": "", "sku": "HANGER-28" }, + { + "avg_daily": 1.64, + "new_point": 18, + "new_qty": 50, + "old_point": 150, + "old_qty": 400, + "product_id": "", + "sku": "HANGER-28FM" + }, { "avg_daily": 3.18, "new_point": 34, "new_qty": 96, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "INS-R13-15" }, { @@ -303,7 +312,7 @@ "new_qty": 108, "old_point": 25, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "INS-R19-15" }, { @@ -312,7 +321,7 @@ "new_qty": 137, "old_point": 20, "old_qty": 40, - "product_id": "", + "product_id": "", "sku": "INS-R30-24" }, { @@ -321,7 +330,7 @@ "new_qty": 182, "old_point": 200, "old_qty": 600, - "product_id": "", + "product_id": "", "sku": "LUM-166-WRC" }, { @@ -330,7 +339,7 @@ "new_qty": 123, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-21012-NO2" }, { @@ -339,7 +348,7 @@ "new_qty": 82, "old_point": 30, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "LUM-21216-NO2" }, { @@ -348,7 +357,7 @@ "new_qty": 95, "old_point": 150, "old_qty": 400, - "product_id": "", + "product_id": "", "sku": "LUM-2410-PREM" }, { @@ -357,7 +366,7 @@ "new_qty": 66, "old_point": 100, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "LUM-2412-PREM" }, { @@ -366,7 +375,7 @@ "new_qty": 167, "old_point": 200, "old_qty": 500, - "product_id": "", + "product_id": "", "sku": "LUM-248-PREM" }, { @@ -375,7 +384,7 @@ "new_qty": 199, "old_point": 300, "old_qty": 600, - "product_id": "", + "product_id": "", "sku": "LUM-2492-STUD" }, { @@ -384,7 +393,7 @@ "new_qty": 117, "old_point": 120, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "LUM-2610-PREM" }, { @@ -393,7 +402,7 @@ "new_qty": 119, "old_point": 100, "old_qty": 250, - "product_id": "", + "product_id": "", "sku": "LUM-2612-PREM" }, { @@ -402,7 +411,7 @@ "new_qty": 52, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-2616-PREM" }, { @@ -411,7 +420,7 @@ "new_qty": 118, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-2810-NO2" }, { @@ -420,7 +429,7 @@ "new_qty": 86, "old_point": 50, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-2816-NO2" }, { @@ -429,7 +438,7 @@ "new_qty": 98, "old_point": 80, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-4410-PT" }, { @@ -438,7 +447,7 @@ "new_qty": 138, "old_point": 100, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-448-PT" }, { @@ -447,7 +456,7 @@ "new_qty": 126, "old_point": 40, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "LUM-448-WRC" }, { @@ -456,7 +465,7 @@ "new_qty": 98, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "LUM-6612-PT" }, { @@ -465,7 +474,7 @@ "new_qty": 57, "old_point": 500, "old_qty": 2000, - "product_id": "", + "product_id": "", "sku": "LUMB14RLN3+" }, { @@ -474,7 +483,7 @@ "new_qty": 56, "old_point": 1000, "old_qty": 5000, - "product_id": "", + "product_id": "", "sku": "LUMB24RLN3" }, { @@ -483,7 +492,7 @@ "new_qty": 77, "old_point": 500, "old_qty": 2000, - "product_id": "", + "product_id": "", "sku": "LUMBUT24RL" }, { @@ -492,7 +501,7 @@ "new_qty": 97, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "MLD-BASE-MDF" }, { @@ -501,7 +510,7 @@ "new_qty": 131, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "MLD-CASE-MDF" }, { @@ -510,7 +519,7 @@ "new_qty": 53, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "NAIL-10D-50" }, { @@ -519,7 +528,7 @@ "new_qty": 144, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "NAIL-16D-50" }, { @@ -528,7 +537,7 @@ "new_qty": 89, "old_point": 120, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "OSB-12" }, { @@ -537,7 +546,7 @@ "new_qty": 84, "old_point": 100, "old_qty": 250, - "product_id": "", + "product_id": "", "sku": "OSB-34-TG" }, { @@ -546,7 +555,7 @@ "new_qty": 108, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "PLY-12-CDX" }, { @@ -555,7 +564,7 @@ "new_qty": 311, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "PLY-34-CDX" }, { @@ -564,7 +573,7 @@ "new_qty": 75, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-ARCH-30" }, { @@ -573,7 +582,7 @@ "new_qty": 83, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "RF-DRIP-10" }, { @@ -582,7 +591,7 @@ "new_qty": 65, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "RF-EDGE-WHT" }, { @@ -591,7 +600,7 @@ "new_qty": 39, "old_point": 30, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-FELT-15" }, { @@ -600,7 +609,7 @@ "new_qty": 75, "old_point": 20, "old_qty": 40, - "product_id": "", + "product_id": "", "sku": "RF-FLASH-PIPE" }, { @@ -609,7 +618,7 @@ "new_qty": 93, "old_point": 60, "old_qty": 120, - "product_id": "", + "product_id": "", "sku": "RF-FLASH-STEP" }, { @@ -618,7 +627,7 @@ "new_qty": 105, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "RF-ICE-65" }, { @@ -627,7 +636,7 @@ "new_qty": 66, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "RF-ICE-WTR" }, { @@ -636,7 +645,7 @@ "new_qty": 73, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "RF-NAIL-125" }, { @@ -645,7 +654,7 @@ "new_qty": 135, "old_point": 40, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-RIDGE-4" }, { @@ -654,7 +663,7 @@ "new_qty": 118, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-SH-BLK" }, { @@ -663,7 +672,7 @@ "new_qty": 111, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-SH-WW" }, { @@ -672,7 +681,7 @@ "new_qty": 42, "old_point": 40, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-START" }, { @@ -681,17 +690,8 @@ "new_qty": 68, "old_point": 40, "old_qty": 100, - "product_id": "", - "sku": "SCR-DECK-3-5" - }, - { - "avg_daily": 1.64, - "new_point": 18, - "new_qty": 50, - "old_point": 150, - "old_qty": 400, "product_id": "", - "sku": "SIMP-LUS28" + "sku": "SCR-DECK-3-5" }, { "avg_daily": 4.54, @@ -922,13 +922,22 @@ "product_id": "", "sku": "HANGER-28" }, + { + "avg_daily": 4.93, + "new_point": 52, + "new_qty": 148, + "old_point": 150, + "old_qty": 400, + "product_id": "", + "sku": "HANGER-28FM" + }, { "avg_daily": 9.53, "new_point": 101, "new_qty": 286, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "INS-R13-15" }, { @@ -937,7 +946,7 @@ "new_qty": 323, "old_point": 25, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "INS-R19-15" }, { @@ -946,7 +955,7 @@ "new_qty": 409, "old_point": 20, "old_qty": 40, - "product_id": "", + "product_id": "", "sku": "INS-R30-24" }, { @@ -955,7 +964,7 @@ "new_qty": 546, "old_point": 200, "old_qty": 600, - "product_id": "", + "product_id": "", "sku": "LUM-166-WRC" }, { @@ -964,7 +973,7 @@ "new_qty": 368, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-21012-NO2" }, { @@ -973,7 +982,7 @@ "new_qty": 246, "old_point": 30, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "LUM-21216-NO2" }, { @@ -982,7 +991,7 @@ "new_qty": 283, "old_point": 150, "old_qty": 400, - "product_id": "", + "product_id": "", "sku": "LUM-2410-PREM" }, { @@ -991,7 +1000,7 @@ "new_qty": 198, "old_point": 100, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "LUM-2412-PREM" }, { @@ -1000,7 +1009,7 @@ "new_qty": 499, "old_point": 200, "old_qty": 500, - "product_id": "", + "product_id": "", "sku": "LUM-248-PREM" }, { @@ -1009,7 +1018,7 @@ "new_qty": 595, "old_point": 300, "old_qty": 600, - "product_id": "", + "product_id": "", "sku": "LUM-2492-STUD" }, { @@ -1018,7 +1027,7 @@ "new_qty": 349, "old_point": 120, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "LUM-2610-PREM" }, { @@ -1027,7 +1036,7 @@ "new_qty": 355, "old_point": 100, "old_qty": 250, - "product_id": "", + "product_id": "", "sku": "LUM-2612-PREM" }, { @@ -1036,7 +1045,7 @@ "new_qty": 154, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-2616-PREM" }, { @@ -1045,7 +1054,7 @@ "new_qty": 353, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-2810-NO2" }, { @@ -1054,7 +1063,7 @@ "new_qty": 258, "old_point": 50, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-2816-NO2" }, { @@ -1063,7 +1072,7 @@ "new_qty": 294, "old_point": 80, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-4410-PT" }, { @@ -1072,7 +1081,7 @@ "new_qty": 413, "old_point": 100, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-448-PT" }, { @@ -1081,7 +1090,7 @@ "new_qty": 376, "old_point": 40, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "LUM-448-WRC" }, { @@ -1090,7 +1099,7 @@ "new_qty": 293, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "LUM-6612-PT" }, { @@ -1099,7 +1108,7 @@ "new_qty": 171, "old_point": 500, "old_qty": 2000, - "product_id": "", + "product_id": "", "sku": "LUMB14RLN3+" }, { @@ -1108,7 +1117,7 @@ "new_qty": 166, "old_point": 1000, "old_qty": 5000, - "product_id": "", + "product_id": "", "sku": "LUMB24RLN3" }, { @@ -1117,7 +1126,7 @@ "new_qty": 229, "old_point": 500, "old_qty": 2000, - "product_id": "", + "product_id": "", "sku": "LUMBUT24RL" }, { @@ -1126,7 +1135,7 @@ "new_qty": 289, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "MLD-BASE-MDF" }, { @@ -1135,7 +1144,7 @@ "new_qty": 393, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "MLD-CASE-MDF" }, { @@ -1144,7 +1153,7 @@ "new_qty": 157, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "NAIL-10D-50" }, { @@ -1153,7 +1162,7 @@ "new_qty": 430, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "NAIL-16D-50" }, { @@ -1162,7 +1171,7 @@ "new_qty": 265, "old_point": 120, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "OSB-12" }, { @@ -1171,7 +1180,7 @@ "new_qty": 252, "old_point": 100, "old_qty": 250, - "product_id": "", + "product_id": "", "sku": "OSB-34-TG" }, { @@ -1180,7 +1189,7 @@ "new_qty": 323, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "PLY-12-CDX" }, { @@ -1189,7 +1198,7 @@ "new_qty": 932, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "PLY-34-CDX" }, { @@ -1198,7 +1207,7 @@ "new_qty": 223, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-ARCH-30" }, { @@ -1207,7 +1216,7 @@ "new_qty": 250, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "RF-DRIP-10" }, { @@ -1216,7 +1225,7 @@ "new_qty": 195, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "RF-EDGE-WHT" }, { @@ -1225,7 +1234,7 @@ "new_qty": 117, "old_point": 30, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-FELT-15" }, { @@ -1234,7 +1243,7 @@ "new_qty": 224, "old_point": 20, "old_qty": 40, - "product_id": "", + "product_id": "", "sku": "RF-FLASH-PIPE" }, { @@ -1243,7 +1252,7 @@ "new_qty": 277, "old_point": 60, "old_qty": 120, - "product_id": "", + "product_id": "", "sku": "RF-FLASH-STEP" }, { @@ -1252,7 +1261,7 @@ "new_qty": 314, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "RF-ICE-65" }, { @@ -1261,7 +1270,7 @@ "new_qty": 196, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "RF-ICE-WTR" }, { @@ -1270,7 +1279,7 @@ "new_qty": 218, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "RF-NAIL-125" }, { @@ -1279,7 +1288,7 @@ "new_qty": 405, "old_point": 40, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-RIDGE-4" }, { @@ -1288,7 +1297,7 @@ "new_qty": 352, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-SH-BLK" }, { @@ -1297,7 +1306,7 @@ "new_qty": 332, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-SH-WW" }, { @@ -1306,7 +1315,7 @@ "new_qty": 125, "old_point": 40, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-START" }, { @@ -1315,17 +1324,8 @@ "new_qty": 204, "old_point": 40, "old_qty": 100, - "product_id": "", - "sku": "SCR-DECK-3-5" - }, - { - "avg_daily": 4.93, - "new_point": 52, - "new_qty": 148, - "old_point": 150, - "old_qty": 400, "product_id": "", - "sku": "SIMP-LUS28" + "sku": "SCR-DECK-3-5" }, { "avg_daily": 13.63, @@ -1553,13 +1553,22 @@ "product_id": "", "sku": "HANGER-28" }, + { + "avg_daily": 1.64, + "new_point": 18, + "new_qty": 50, + "old_point": 150, + "old_qty": 400, + "product_id": "", + "sku": "HANGER-28FM" + }, { "avg_daily": 3.18, "new_point": 34, "new_qty": 96, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "INS-R13-15" }, { @@ -1568,7 +1577,7 @@ "new_qty": 108, "old_point": 25, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "INS-R19-15" }, { @@ -1577,7 +1586,7 @@ "new_qty": 137, "old_point": 20, "old_qty": 40, - "product_id": "", + "product_id": "", "sku": "INS-R30-24" }, { @@ -1586,7 +1595,7 @@ "new_qty": 182, "old_point": 200, "old_qty": 600, - "product_id": "", + "product_id": "", "sku": "LUM-166-WRC" }, { @@ -1595,7 +1604,7 @@ "new_qty": 123, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-21012-NO2" }, { @@ -1604,7 +1613,7 @@ "new_qty": 82, "old_point": 30, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "LUM-21216-NO2" }, { @@ -1613,7 +1622,7 @@ "new_qty": 95, "old_point": 150, "old_qty": 400, - "product_id": "", + "product_id": "", "sku": "LUM-2410-PREM" }, { @@ -1622,7 +1631,7 @@ "new_qty": 66, "old_point": 100, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "LUM-2412-PREM" }, { @@ -1631,7 +1640,7 @@ "new_qty": 167, "old_point": 200, "old_qty": 500, - "product_id": "", + "product_id": "", "sku": "LUM-248-PREM" }, { @@ -1640,7 +1649,7 @@ "new_qty": 199, "old_point": 300, "old_qty": 600, - "product_id": "", + "product_id": "", "sku": "LUM-2492-STUD" }, { @@ -1649,7 +1658,7 @@ "new_qty": 117, "old_point": 120, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "LUM-2610-PREM" }, { @@ -1658,7 +1667,7 @@ "new_qty": 119, "old_point": 100, "old_qty": 250, - "product_id": "", + "product_id": "", "sku": "LUM-2612-PREM" }, { @@ -1667,7 +1676,7 @@ "new_qty": 52, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-2616-PREM" }, { @@ -1676,7 +1685,7 @@ "new_qty": 118, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-2810-NO2" }, { @@ -1685,7 +1694,7 @@ "new_qty": 86, "old_point": 50, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-2816-NO2" }, { @@ -1694,7 +1703,7 @@ "new_qty": 98, "old_point": 80, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "LUM-4410-PT" }, { @@ -1703,7 +1712,7 @@ "new_qty": 138, "old_point": 100, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "LUM-448-PT" }, { @@ -1712,7 +1721,7 @@ "new_qty": 126, "old_point": 40, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "LUM-448-WRC" }, { @@ -1721,7 +1730,7 @@ "new_qty": 98, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "LUM-6612-PT" }, { @@ -1730,7 +1739,7 @@ "new_qty": 57, "old_point": 500, "old_qty": 2000, - "product_id": "", + "product_id": "", "sku": "LUMB14RLN3+" }, { @@ -1739,7 +1748,7 @@ "new_qty": 56, "old_point": 1000, "old_qty": 5000, - "product_id": "", + "product_id": "", "sku": "LUMB24RLN3" }, { @@ -1748,7 +1757,7 @@ "new_qty": 77, "old_point": 500, "old_qty": 2000, - "product_id": "", + "product_id": "", "sku": "LUMBUT24RL" }, { @@ -1757,7 +1766,7 @@ "new_qty": 97, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "MLD-BASE-MDF" }, { @@ -1766,7 +1775,7 @@ "new_qty": 131, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "MLD-CASE-MDF" }, { @@ -1775,7 +1784,7 @@ "new_qty": 53, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "NAIL-10D-50" }, { @@ -1784,7 +1793,7 @@ "new_qty": 144, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "NAIL-16D-50" }, { @@ -1793,7 +1802,7 @@ "new_qty": 89, "old_point": 120, "old_qty": 300, - "product_id": "", + "product_id": "", "sku": "OSB-12" }, { @@ -1802,7 +1811,7 @@ "new_qty": 84, "old_point": 100, "old_qty": 250, - "product_id": "", + "product_id": "", "sku": "OSB-34-TG" }, { @@ -1811,7 +1820,7 @@ "new_qty": 108, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "PLY-12-CDX" }, { @@ -1820,7 +1829,7 @@ "new_qty": 311, "old_point": 80, "old_qty": 200, - "product_id": "", + "product_id": "", "sku": "PLY-34-CDX" }, { @@ -1829,7 +1838,7 @@ "new_qty": 75, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-ARCH-30" }, { @@ -1838,7 +1847,7 @@ "new_qty": 83, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "RF-DRIP-10" }, { @@ -1847,7 +1856,7 @@ "new_qty": 65, "old_point": 60, "old_qty": 150, - "product_id": "", + "product_id": "", "sku": "RF-EDGE-WHT" }, { @@ -1856,7 +1865,7 @@ "new_qty": 39, "old_point": 30, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-FELT-15" }, { @@ -1865,7 +1874,7 @@ "new_qty": 75, "old_point": 20, "old_qty": 40, - "product_id": "", + "product_id": "", "sku": "RF-FLASH-PIPE" }, { @@ -1874,7 +1883,7 @@ "new_qty": 93, "old_point": 60, "old_qty": 120, - "product_id": "", + "product_id": "", "sku": "RF-FLASH-STEP" }, { @@ -1883,7 +1892,7 @@ "new_qty": 105, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "RF-ICE-65" }, { @@ -1892,7 +1901,7 @@ "new_qty": 66, "old_point": 20, "old_qty": 50, - "product_id": "", + "product_id": "", "sku": "RF-ICE-WTR" }, { @@ -1901,7 +1910,7 @@ "new_qty": 73, "old_point": 30, "old_qty": 60, - "product_id": "", + "product_id": "", "sku": "RF-NAIL-125" }, { @@ -1910,7 +1919,7 @@ "new_qty": 135, "old_point": 40, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-RIDGE-4" }, { @@ -1919,7 +1928,7 @@ "new_qty": 118, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-SH-BLK" }, { @@ -1928,7 +1937,7 @@ "new_qty": 111, "old_point": 50, "old_qty": 100, - "product_id": "", + "product_id": "", "sku": "RF-SH-WW" }, { @@ -1937,7 +1946,7 @@ "new_qty": 42, "old_point": 40, "old_qty": 80, - "product_id": "", + "product_id": "", "sku": "RF-START" }, { @@ -1946,17 +1955,8 @@ "new_qty": 68, "old_point": 40, "old_qty": 100, - "product_id": "", - "sku": "SCR-DECK-3-5" - }, - { - "avg_daily": 1.64, - "new_point": 18, - "new_qty": 50, - "old_point": 150, - "old_qty": 400, "product_id": "", - "sku": "SIMP-LUS28" + "sku": "SCR-DECK-3-5" }, { "avg_daily": 4.54, @@ -1993,13 +1993,13 @@ { "cost": 20, "description": "r1b c sheet goods", - "product_id": "", + "product_id": "", "quantity": 10 }, { "cost": 8, "description": "r1b c lumber", - "product_id": "", + "product_id": "", "quantity": 5 } ], @@ -2019,7 +2019,7 @@ "description": "r1b c sheet goods", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 0, "quantity": 10 }, @@ -2028,7 +2028,7 @@ "description": "r1b c lumber", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 0, "quantity": 5 } @@ -2051,7 +2051,7 @@ { "cost": 9, "description": "r1b c draft only", - "product_id": "", + "product_id": "", "quantity": 1 } ], @@ -2071,7 +2071,7 @@ "description": "r1b c draft only", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 0, "quantity": 1 } @@ -2103,7 +2103,7 @@ "description": "r1b c lumber", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 0, "quantity": 5 }, @@ -2112,7 +2112,7 @@ "description": "r1b c sheet goods", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 0, "quantity": 10 } @@ -2473,7 +2473,7 @@ "description": "r1b c lumber", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 0, "quantity": 5 }, @@ -2482,7 +2482,7 @@ "description": "r1b c sheet goods", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 4, "quantity": 10 } @@ -2713,7 +2713,7 @@ "description": "r1b c lumber", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 0, "quantity": 5 }, @@ -2722,7 +2722,7 @@ "description": "r1b c sheet goods", "id": "", "po_id": "", - "product_id": "", + "product_id": "", "qty_received": 10, "quantity": 10 } diff --git a/core/internal/integrations/ailm_contract_test.go b/core/internal/integrations/ailm_contract_test.go index 28a9f1a20..0e461a2b6 100644 --- a/core/internal/integrations/ailm_contract_test.go +++ b/core/internal/integrations/ailm_contract_test.go @@ -334,7 +334,7 @@ func TestAILMValidateStaffResponseContract(t *testing.T) { body string golden string }{ - {"entitled", `{"email":"dispatcher@gable.com"}`, "ailm_validate_staff_entitled.json"}, + {"entitled", `{"email":"dispatcher@gablebuildingsupply.example"}`, "ailm_validate_staff_entitled.json"}, {"unknown", `{"email":"stranger@example.com"}`, "ailm_validate_staff_unknown.json"}, } @@ -440,7 +440,7 @@ func TestAILMRequestContract(t *testing.T) { func TestAILMValidateStaffRequestContract(t *testing.T) { t.Parallel() - body := mustIndent(t, map[string]string{"email": "dispatcher@gable.com"}) + body := mustIndent(t, map[string]string{"email": "dispatcher@gablebuildingsupply.example"}) assertGolden(t, "ailm_validate_staff_request.json", body) srv := newTestServer(fullFakeStore(), testKey) diff --git a/core/internal/integrations/ailm_test.go b/core/internal/integrations/ailm_test.go index 62a3c4f45..71f41bca9 100644 --- a/core/internal/integrations/ailm_test.go +++ b/core/internal/integrations/ailm_test.go @@ -228,25 +228,25 @@ func fixtureOrders() []IntegrationOrderResponse { func fixtureStaff() map[string]*staffLookup { return map[string]*staffLookup{ - "dispatcher@gable.com": { - Found: true, ID: staffUUID, Email: "dispatcher@gable.com", + "dispatcher@gablebuildingsupply.example": { + Found: true, ID: staffUUID, Email: "dispatcher@gablebuildingsupply.example", Name: "Dana Ramirez", Role: "dispatcher", Active: true, Modules: []string{"ai_lm"}, }, - "onleave@gable.com": { + "onleave@gablebuildingsupply.example": { // Granted the module but deactivated: entitlement must be false. - Found: true, ID: staffUUID, Email: "onleave@gable.com", + Found: true, ID: staffUUID, Email: "onleave@gablebuildingsupply.example", Name: "Sam Vega", Role: "dispatcher", Active: false, Modules: []string{"ai_lm"}, }, - "yard@gable.com": { + "yard@gablebuildingsupply.example": { // Active, but AI_LM is not among their effective modules. - Found: true, ID: staffUUID, Email: "yard@gable.com", + Found: true, ID: staffUUID, Email: "yard@gablebuildingsupply.example", Name: "Yuki Tan", Role: "yard", Active: true, Modules: []string{"pos"}, }, - "noroles@gable.com": { - Found: true, ID: staffUUID, Email: "noroles@gable.com", + "noroles@gablebuildingsupply.example": { + Found: true, ID: staffUUID, Email: "noroles@gablebuildingsupply.example", Name: "Pat Doe", Role: "", Active: true, Modules: nil, }, } @@ -337,7 +337,7 @@ func TestAILMEndpointsRequireIntegrationKey(t *testing.T) { {http.MethodGet, "/api/integration/locations", ""}, {http.MethodGet, "/api/integration/orders?date=2026-08-21&status=CONFIRMED", ""}, {http.MethodPost, "/api/integration/delivery-routes", `{"vehicle_id":"` + vehicleUUID + `"}`}, - {http.MethodPost, "/api/integration/validate-staff", `{"email":"dispatcher@gable.com"}`}, + {http.MethodPost, "/api/integration/validate-staff", `{"email":"dispatcher@gablebuildingsupply.example"}`}, } cases := []struct { @@ -1043,45 +1043,45 @@ func TestValidateStaff(t *testing.T) { }{ { name: "entitled staff member", - body: `{"email":"dispatcher@gable.com"}`, + body: `{"email":"dispatcher@gablebuildingsupply.example"}`, wantCode: http.StatusOK, - wantJSON: `{"staff_id":"` + staffUUID + `","email":"dispatcher@gable.com", + wantJSON: `{"staff_id":"` + staffUUID + `","email":"dispatcher@gablebuildingsupply.example", "name":"Dana Ramirez","entitled":true, "roles":["dispatcher"],"modules":["ai_lm"]}`, }, { name: "email lookup is case-insensitive", - body: `{"email":"Dispatcher@Gable.com"}`, + body: `{"email":"Dispatcher@GableBuildingSupply.Example"}`, wantCode: http.StatusOK, - wantJSON: `{"staff_id":"` + staffUUID + `","email":"dispatcher@gable.com", + wantJSON: `{"staff_id":"` + staffUUID + `","email":"dispatcher@gablebuildingsupply.example", "name":"Dana Ramirez","entitled":true, "roles":["dispatcher"],"modules":["ai_lm"]}`, }, { name: "granted but deactivated staff member is not entitled", - body: `{"email":"onleave@gable.com"}`, + body: `{"email":"onleave@gablebuildingsupply.example"}`, // 200, not 401: AI_LM's client turns any non-2xx into a transport // error and would report "GableLBM is down" for a failed login. wantCode: http.StatusOK, - wantJSON: `{"staff_id":"` + staffUUID + `","email":"onleave@gable.com", + wantJSON: `{"staff_id":"` + staffUUID + `","email":"onleave@gablebuildingsupply.example", "name":"Sam Vega","entitled":false, "roles":["dispatcher"],"modules":["ai_lm"]}`, }, { name: "active staff member without the ai_lm module is not entitled", - body: `{"email":"yard@gable.com"}`, + body: `{"email":"yard@gablebuildingsupply.example"}`, wantCode: http.StatusOK, - wantJSON: `{"staff_id":"` + staffUUID + `","email":"yard@gable.com", + wantJSON: `{"staff_id":"` + staffUUID + `","email":"yard@gablebuildingsupply.example", "name":"Yuki Tan","entitled":false, "roles":["yard"],"modules":["pos"]}`, }, { name: "roles and modules are never null", - body: `{"email":"noroles@gable.com"}`, + body: `{"email":"noroles@gablebuildingsupply.example"}`, // AI_LM copies Roles straight into a JWT claim; a null would // marshal as `null` in the token instead of an empty array. wantCode: http.StatusOK, - wantJSON: `{"staff_id":"` + staffUUID + `","email":"noroles@gable.com", + wantJSON: `{"staff_id":"` + staffUUID + `","email":"noroles@gablebuildingsupply.example", "name":"Pat Doe","entitled":false,"roles":[],"modules":[]}`, }, { diff --git a/core/internal/integrations/testdata/ailm_validate_staff_entitled.json b/core/internal/integrations/testdata/ailm_validate_staff_entitled.json index 4ecc86ef5..f70aa3724 100644 --- a/core/internal/integrations/testdata/ailm_validate_staff_entitled.json +++ b/core/internal/integrations/testdata/ailm_validate_staff_entitled.json @@ -1,6 +1,6 @@ { "staff_id": "66666666-6666-4666-8666-111111111111", - "email": "dispatcher@gable.com", + "email": "dispatcher@gablebuildingsupply.example", "name": "Dana Ramirez", "entitled": true, "roles": [ diff --git a/core/internal/integrations/testdata/ailm_validate_staff_request.json b/core/internal/integrations/testdata/ailm_validate_staff_request.json index 73e9e5e17..0cda4e6fd 100644 --- a/core/internal/integrations/testdata/ailm_validate_staff_request.json +++ b/core/internal/integrations/testdata/ailm_validate_staff_request.json @@ -1,3 +1,3 @@ { - "email": "dispatcher@gable.com" + "email": "dispatcher@gablebuildingsupply.example" } diff --git a/core/internal/techadmin/migration_test.go b/core/internal/techadmin/migration_test.go index 429d8f9c9..7137dd398 100644 --- a/core/internal/techadmin/migration_test.go +++ b/core/internal/techadmin/migration_test.go @@ -127,7 +127,7 @@ func TestMigration095_BackfillsRowsThatExist(t *testing.T) { ('00000000-0000-0000-0000-0000000000a1','First RFC','draft','p1','s1','c1', now() - interval '2 hours', now() - interval '2 hours'), ('00000000-0000-0000-0000-0000000000a2','Second RFC','approved','p2','s2', NULL, NULL, NULL); INSERT INTO staff (id, email, full_name, staff_no, role, active) VALUES - ('00000000-0000-0000-0000-0000000000b1','dana@gable.com','Dana Ramirez','STF-101','dispatcher',TRUE); + ('00000000-0000-0000-0000-0000000000b1','dana@gablebuildingsupply.example','Dana Ramirez','STF-101','dispatcher',TRUE); INSERT INTO api_keys (id, name, key_hash, key_prefix, scopes, created_at) VALUES ('00000000-0000-0000-0000-0000000000c1','legacy','h','sk_live_xx','{quotes:read}', NULL);`); err != nil { t.Fatalf("legacy rows: %v", err) diff --git a/core/migrations/118_staff_demo_domain.sql b/core/migrations/118_staff_demo_domain.sql new file mode 100644 index 000000000..30f13f8b6 --- /dev/null +++ b/core/migrations/118_staff_demo_domain.sql @@ -0,0 +1,21 @@ +-- SPDX-License-Identifier: LicenseRef-OpenLBM-Commons-1.0 +-- SPDX-FileCopyrightText: 2026 FutureBuild, Inc. and OpenLBM contributors + +-- Migration: 118_staff_demo_domain +-- Description: migration 080 seeded three demo staff rows on a real domain +-- (gable.com). A demo address belongs on a reserved .example domain, so this +-- rewrites exactly those three values and nothing else. A row is left alone +-- when the new address is already taken, and the staff id (so every module +-- grant) is unchanged. + +UPDATE staff SET email = 'dispatcher@gablebuildingsupply.example' +WHERE email = 'dispatcher@gable.com' + AND NOT EXISTS (SELECT 1 FROM staff WHERE email = 'dispatcher@gablebuildingsupply.example'); + +UPDATE staff SET email = 'yard@gablebuildingsupply.example' +WHERE email = 'yard@gable.com' + AND NOT EXISTS (SELECT 1 FROM staff WHERE email = 'yard@gablebuildingsupply.example'); + +UPDATE staff SET email = 'admin@gablebuildingsupply.example' +WHERE email = 'admin@gable.com' + AND NOT EXISTS (SELECT 1 FROM staff WHERE email = 'admin@gablebuildingsupply.example'); diff --git a/core/migrations/down/118_staff_demo_domain_down.sql b/core/migrations/down/118_staff_demo_domain_down.sql new file mode 100644 index 000000000..a39de2249 --- /dev/null +++ b/core/migrations/down/118_staff_demo_domain_down.sql @@ -0,0 +1,15 @@ +-- SPDX-License-Identifier: LicenseRef-OpenLBM-Commons-1.0 +-- SPDX-FileCopyrightText: 2026 FutureBuild, Inc. and OpenLBM contributors + +-- Rollback for 118_staff_demo_domain.sql. +-- +-- Lives in migrations/down/ so cmd/migrate's `migrations/*.sql` glob cannot +-- pick it up and apply it as a forward migration. Apply by hand. +-- +-- The addresses stay on the reserved domain on purpose: the old values were a +-- real domain, and an operator may have edited a row since. + +DO $$ +BEGIN + RAISE NOTICE '118 down: the demo staff addresses stay on the reserved domain'; +END $$; diff --git a/docs/parity/WALKS.md b/docs/parity/WALKS.md index 728407927..660caba05 100644 --- a/docs/parity/WALKS.md +++ b/docs/parity/WALKS.md @@ -167,7 +167,7 @@ Steps: must show `REG-01` on `KEL-MAIN`, `REG-WK` on `WK` and `REG-LK` on `LK`. 3. Stock differs by yard. Pick the product `2x4x8 SPF Premium` (`LUM-248-PREM`): in the desk's inventory page, or `curl -s "http://127.0.0.1:8080/api/v1/inventory?product_id="`, it must show three rows with three - different quantities, one per yard. Then pick `Ice & Water Shield` (`RF-ICE-WTR`): it must show a row at + different quantities, one per yard. Then pick `Ice and Water Barrier` (`RF-ICE-WTR`): it must show a row at `KEL-MAIN` only, and none at `WK` or `LK`. 4. People: `select s.staff_no, s.full_name, s.role, l.code, ul.is_home from staff s join user_locations ul on ul.user_sub = s.staff_no join locations l on l.id = ul.branch_id where s.staff_no like 'demo-%' order by 1, 4;` diff --git a/docs/refactor/CONTRACT-CHANGES.md b/docs/refactor/CONTRACT-CHANGES.md index 66a5d1339..01d292503 100644 --- a/docs/refactor/CONTRACT-CHANGES.md +++ b/docs/refactor/CONTRACT-CHANGES.md @@ -421,5 +421,7 @@ get an entry. | ACCOUNT-RULING-A | `GET /api/v1/accounts/{id}` | The account summary held the customer to the old finance wall: a user on a yard the customer is not linked to (by header, or with no header and grants that miss it) read it as 404 "account not found", although the Customers app lists every customer and the customer record opens (ruling A, ADR 0007 section 5.8) | The summary is the customer's dealer wide standing (balance, credit limit, open credits, unapplied cash; the same figures the counter's standing and the credit check read dealer wide, ADR 0007 section 5.8) and reads through ruling A's reach (`CustomerReadBranchForQuery`, `CustomerReadGrantsSubForQuery`): a user, an administrator and an unbound key reach every customer; a key bound to a branch keeps its pin and reads a customer outside it as 404, as before. Route, roles, body and error envelope are unchanged. Branch bound key class stays CONFINED (`CustomerBranch(path customer)`, `TestKeyBranchPin_PosAndAccountRows`). `GET /api/v1/accounts/{id}/transactions` and `GET /api/v1/ar/customers/{id}/statement` keep the finance documents' wall unchanged, as do each payment and credit memo: the subledger still answers 404 for a customer outside the caller's reach (the route now runs that wall as its own gate instead of through the summary), and the desk shows a calm note in the ledger's place | | DASH-AR-NET | `GET /api/v1/dashboard/summary` field `outstanding_ar` | The sum of `total_amount` over the yard's `UNPAID` and `PARTIAL` invoices, so part payments, open credit memos and unapplied cash were not netted and the figure disagreed with AR Aging for the same yard. | The yard's net open receivable as AR Aging reads it today (invoice open amounts, plus open credit memo amounts, less unapplied cash, inside the caller's wall). `outstanding_ar_count` is unchanged (open invoices). In the clockwindow golden `dashboard.summary.outstanding_ar` moved from 11865877 to 11056347; nothing else moved. | | PRODUCT-PICTURES-1 | the product wire (`ProductView`: `GET /api/v1/products`, `GET /api/v1/products/{id}`, the product writes' bodies and the `product` of `GET /api/v1/products/{id}/detail`) and the inventory levels' product summary (`GET /api/v1/inventory?include=product`) | The drawn product pictures showed only on the counter's tiles; the quote builder's lines, the inventory list and the product page had no picture path to show | Each carries `image_url`: the product's picture path while the `catalog.product_images` setting is "on", null while it is off or absent and for a product with none. The create answers null (its body is the row as written); the margin, dimensions and lead time writes answer the read, so they carry the path while the setting is on. No other wire change, no new route and no change to any wall. In the goldens `image_url: null` is added to the product, product_item, pim_media and inventory_transfer responses (the base seed leaves the setting off) | +| SEED-HYGIENE (items 108 and 109) | the base seed's product names and SKU, seen by the `dashboard`, `pos`, `portal_quotes` and `purchase_order_flow` goldens (no route or shape changes) | The seed carried real brand words in product names and one SKU: `Simpson Strong-Tie LUS28` (`SIMP-LUS28`), `Cemtrim Textured ...`, `... Soffit Hardie Textured ...`, `5/8 Drywall Firecode 4x8` and `... NSP DRYLine TSX`, and `Ice & Water Shield` (`RF-ICE-65`, `RF-ICE-WTR`). | The same products under plain names: `Face Mount Joist Hanger 2x8` (`HANGER-28FM`), `Composite Trim Textured ...`, `... Soffit Fibre Cement Textured ...`, `5/8 Drywall Type X 4x8` and `... NSP Weather Barrier`, and `Ice and Water Barrier` for the two ice and water rows (the dashboard and pos goldens). Products list in SKU order, so the renamed SKU moves one row and the `` placeholders after it shift by one; no value other than these names, that SKU and the placeholders moved. | +| SEED-HYGIENE (item 108 b) | migration 118 `staff_demo_domain` (operational, no route) | Migration 080 left three demo staff on `@gable.com`, a real domain. | Migration 118 rewrites those three addresses to `@gablebuildingsupply.example`; staff ids and grants are unchanged. | | POS-RECEIPT-1 (item 111) | pos: `GET /api/v1/pos/transactions/{id}/receipt`, `POST /api/v1/pos/transactions/{id}/receipt/email` (new routes) | The Sale complete card's Print receipt and Email receipt called the documents print route and the invoice email route, mounted for admin, owner, sales and finance, so a cashier got a 403 from both. | The counter's own pair, mounted for admin, owner and cashier with the same reach as the sale read (the branch context, the wall and a bound key's pin; a sale the caller cannot read is the sale read's 404). Print answers the sale's invoice document by the documents print route's own renderer (same body and content type); email sends the sale's invoice to the account's contact by the invoice email route's own function (same 202 `{"status":"queued"}`, same delivery record). A sale that is not completed or has no invoice is a 409 blocker `no_receipt`; an email with no contact (a sale that names no customer or the shared walk in customer, whatever address that row holds, or an account with no email address) is a 409 blocker `no_contact` in words, and nothing is sent; only a completed sale has a receipt (a voided or held sale that keeps its invoice is `no_receipt`). Both routes are WALLED in the bound key allowlist. The documents routes and their roles are unchanged. `posTileList`'s description now says a counter sale's own invoice (origin POS) is not counted. | | AI-CLAUDE-FIX1 | `POST /api/v1/parsing/upload`, `POST /api/v1/purchase-orders/{id}/freight`; `GET /api/v1/apps` golden `apps`; pim: `POST /api/v1/products/{id}/pim/generate/image` | A file of a type the chosen provider cannot read (a BMP under Anthropic) got the canned demo list at the intake and a bare 400 at freight. The apps catalog described the AI client as "OpenRouter client". Image generation under Anthropic answered 409 AI off. | The unreadable type answers 415 `unsupported_type` in the wire envelope with the words naming what the provider reads; no canned list. The catalog line reads "Provider routed AI client (OpenRouter or Anthropic), KeyStore, and model routing (library)." and the `apps` golden is re-recorded for that one string. Image generation answers 202 under Anthropic and draws an illustration, stored only after a strict sanitiser. | diff --git a/web/apps/desk/public/catalog-illustrations/romex_wire_coil.svg b/web/apps/desk/public/catalog-illustrations/nm_cable_coil.svg similarity index 98% rename from web/apps/desk/public/catalog-illustrations/romex_wire_coil.svg rename to web/apps/desk/public/catalog-illustrations/nm_cable_coil.svg index af8f517f1..bf67e6cf5 100644 --- a/web/apps/desk/public/catalog-illustrations/romex_wire_coil.svg +++ b/web/apps/desk/public/catalog-illustrations/nm_cable_coil.svg @@ -1,5 +1,5 @@ - Coil of 14-2 NM Romex cable + Coil of 14-2 NM-B cable Portal logins: - demo@gable.com - summit@gable.com - elite@gable.com + demo@kelbrook.ca + okhomes@gablebuildingsupply.example + missionhill@gablebuildingsupply.example / password password diff --git a/web/apps/desk/src/pages/admin/tech_admin/StaffModuleAccess.test.ts b/web/apps/desk/src/pages/admin/tech_admin/StaffModuleAccess.test.ts index 0432c99fd..3f76faa66 100644 --- a/web/apps/desk/src/pages/admin/tech_admin/StaffModuleAccess.test.ts +++ b/web/apps/desk/src/pages/admin/tech_admin/StaffModuleAccess.test.ts @@ -34,7 +34,7 @@ function roster(danaHasAILM = true): StaffMember[] { return [ { id: DANA, - email: 'dispatcher@gable.com', + email: 'dispatcher@gablebuildingsupply.example', full_name: 'Dana Ramirez', staff_no: 'STF-001', role: 'dispatcher', @@ -46,7 +46,7 @@ function roster(danaHasAILM = true): StaffMember[] { }, { id: YUKI, - email: 'yard@gable.com', + email: 'yard@gablebuildingsupply.example', full_name: 'Yuki Tan', staff_no: null, role: 'yard', @@ -198,7 +198,7 @@ describe('Staff tab — roster', () => { const dana = Array.from(el.querySelectorAll('tbody tr')).find((tr) => text(tr).includes('Dana Ramirez'), )! - expect(text(dana)).toContain('dispatcher@gable.com') + expect(text(dana)).toContain('dispatcher@gablebuildingsupply.example') expect(text(dana)).toContain('STF-001') expect(text(dana)).toContain('Active') diff --git a/web/e2e/admin.spec.ts b/web/e2e/admin.spec.ts index 42aa2fa65..c7eb07246 100644 --- a/web/e2e/admin.spec.ts +++ b/web/e2e/admin.spec.ts @@ -94,8 +94,8 @@ test.describe('Tech admin flow on the new contract', () => { // The seeded roster renders with each member's grant state once the // tab's own loads finish. await expect(page.getByText('Staff & Module Access')).toBeVisible(); - await expect(page.getByText('dispatcher@gable.com')).toBeVisible(); - const yuki = page.locator('tr', { hasText: 'yard@gable.com' }); + await expect(page.getByText('dispatcher@gablebuildingsupply.example')).toBeVisible(); + const yuki = page.locator('tr', { hasText: 'yard@gablebuildingsupply.example' }); await expect(yuki).toContainText('Yuki Tan'); // Grant AI_LM to the inactive yard member: the write carries the staff @@ -128,7 +128,7 @@ test.describe('Tech admin flow on the new contract', () => { await toggle.click(); expect((await flip).status()).toBe(200); await expect(toggle).toHaveAttribute('aria-checked', 'false'); - const dana = page.locator('tr', { hasText: 'dispatcher@gable.com' }); + const dana = page.locator('tr', { hasText: 'dispatcher@gablebuildingsupply.example' }); await expect(dana.locator('input[type="checkbox"]')).toBeChecked(); await page.screenshot({ path: path.join(SHOTS_DIR, 'admin-staff-disabled.png') });