Initial commit
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
# CSV Import Error Handling Improvements
|
||||
|
||||
## Problem Solved
|
||||
|
||||
**Original Issue**: When importing CSV files, if a single record had a database constraint violation (like duplicate SKU or email), the entire import would crash with a database exception, providing a poor user experience.
|
||||
|
||||
## Solution Applied
|
||||
|
||||
All three CSV import methods now use **robust error handling** that:
|
||||
1. ✅ Validates all records in-memory first
|
||||
2. ✅ Saves records one-by-one to isolate failures
|
||||
3. ✅ Catches database exceptions gracefully
|
||||
4. ✅ Skips problem records and continues importing
|
||||
5. ✅ Provides detailed error/warning messages
|
||||
|
||||
## Changes Made
|
||||
|
||||
### 1. **Updated Sample Data Files**
|
||||
- **inventory-items-sample.csv**: Changed SKU prefix from `PWD-*/CON-*` to `IMP-PWD-*/IMP-CON-*`
|
||||
- Prevents conflicts with seed data
|
||||
- Also created `inventory-items-sample-v2.csv` as backup
|
||||
|
||||
### 2. **Enhanced Import Service** (`CsvImportService.cs`)
|
||||
|
||||
#### All Three Import Methods Now:
|
||||
|
||||
**Customer Import (ImportCustomersAsync)**:
|
||||
- Detects duplicate emails in database **and** within CSV file
|
||||
- Saves each customer individually
|
||||
- Catches database constraint violations
|
||||
- Reports: "Row X: Customer with email 'Y' already exists in database. Skipping."
|
||||
|
||||
**Catalog Items Import (ImportCatalogItemsAsync)**:
|
||||
- Detects duplicate SKUs in database **and** within CSV file
|
||||
- Saves each catalog item individually
|
||||
- Catches database constraint violations
|
||||
- Reports: "Row X: Catalog item with SKU 'Y' already exists in database. Skipping."
|
||||
|
||||
**Inventory Import (ImportInventoryItemsAsync)**:
|
||||
- Detects duplicate SKUs in database **and** within CSV file
|
||||
- Saves each inventory item individually
|
||||
- Catches database constraint violations
|
||||
- Reports: "Row X: SKU 'Y' already exists in database. Skipping."
|
||||
|
||||
### 3. **Updated Documentation**
|
||||
- **README.md**: Added troubleshooting section for duplicate SKU/email errors
|
||||
- Explains how to handle conflicts (use new sample files, delete existing data, or edit CSV)
|
||||
|
||||
## How It Works Now
|
||||
|
||||
### Before (Old Behavior):
|
||||
```
|
||||
1. Read CSV file
|
||||
2. Validate all rows
|
||||
3. Add all rows to DbContext
|
||||
4. Call SaveChanges() once
|
||||
5. ❌ If ANY row fails → entire import crashes with exception
|
||||
```
|
||||
|
||||
### After (New Behavior):
|
||||
```
|
||||
1. Read CSV file
|
||||
2. Validate all rows (in-memory duplicate detection)
|
||||
3. Build list of valid items to import
|
||||
4. Loop through each item:
|
||||
a. Add to DbContext
|
||||
b. Call SaveChanges()
|
||||
c. If success → increment success count
|
||||
d. If database error → log warning, rollback, continue to next
|
||||
5. ✅ Return detailed results: X succeeded, Y failed
|
||||
```
|
||||
|
||||
## Error Messages You'll See
|
||||
|
||||
### Duplicate Detection (In-Memory):
|
||||
- ✅ `Row 5: Customer with email 'john@example.com' already exists in database. Skipping.`
|
||||
- ✅ `Row 12: Duplicate SKU 'IMP-PWD-BLK-001' found in import file. Skipping.`
|
||||
|
||||
### Database Constraint Violations:
|
||||
- ✅ `Row 8: SKU 'PWD-BLK-001' already exists in database (detected during save). Skipping.`
|
||||
- ✅ `Row 15: Database error - Cannot insert duplicate key...`
|
||||
|
||||
### Missing Required Fields:
|
||||
- ✅ `Row 3: SKU is required.`
|
||||
- ✅ `Row 7: CompanyName is required.`
|
||||
|
||||
### Warnings (Non-Critical):
|
||||
- ⚠️ `Row 10: Pricing tier 'DIAMOND' not found. Customer will have no pricing tier.`
|
||||
- ⚠️ `Row 22: Category 'Automotive/Wheels' created automatically.`
|
||||
|
||||
## Example Import Results
|
||||
|
||||
```
|
||||
Import Results:
|
||||
✅ Success: 18 records imported
|
||||
❌ Errors: 2 records skipped
|
||||
|
||||
Warnings:
|
||||
- Row 5: Customer with email 'jane@acme.com' already exists in database. Skipping.
|
||||
- Row 12: Pricing tier 'GOLD' not found. Customer will have no pricing tier.
|
||||
|
||||
Errors:
|
||||
- Row 8: SKU is required.
|
||||
- Row 15: Duplicate SKU 'IMP-PWD-BLK-001' found in import file. Skipping.
|
||||
```
|
||||
|
||||
## Testing the Fix
|
||||
|
||||
### Test Case 1: Import with Existing Data
|
||||
1. Run **Platform Management > Seed Data** to create demo inventory
|
||||
2. Try to import `inventory-items-sample-v2.csv` (old SKU format)
|
||||
3. ✅ **Expected**: Graceful warnings, no crash, other records still import
|
||||
|
||||
### Test Case 2: Import Fresh Data
|
||||
1. Use the updated `inventory-items-sample.csv` (IMP- prefix)
|
||||
2. Upload to **Tools > CSV Bulk Import > Inventory** tab
|
||||
3. ✅ **Expected**: All 25 records import successfully
|
||||
|
||||
### Test Case 3: Duplicate Within CSV
|
||||
1. Edit any CSV file and duplicate a row (same SKU or email)
|
||||
2. Upload the file
|
||||
3. ✅ **Expected**: First occurrence imports, second gets warning "found in import file"
|
||||
|
||||
### Test Case 4: Invalid Data
|
||||
1. Edit CSV and remove required field (SKU, CompanyName, etc.)
|
||||
2. Upload the file
|
||||
3. ✅ **Expected**: Row skipped with clear error, other rows still import
|
||||
|
||||
## Benefits
|
||||
|
||||
1. **No More Crashes**: Database exceptions don't crash the import
|
||||
2. **Partial Imports Work**: 18 out of 20 records? No problem!
|
||||
3. **Clear Feedback**: Know exactly which rows failed and why
|
||||
4. **Data Integrity**: Transaction rollback prevents partial saves
|
||||
5. **User-Friendly**: Non-technical users can understand error messages
|
||||
|
||||
## Technical Details
|
||||
|
||||
### Transaction Handling
|
||||
Each record is saved in its own mini-transaction:
|
||||
```csharp
|
||||
try
|
||||
{
|
||||
await _unitOfWork.InventoryItems.AddAsync(item);
|
||||
await _unitOfWork.CompleteAsync(); // Commit this one record
|
||||
result.SuccessCount++;
|
||||
}
|
||||
catch (DbUpdateException dbEx)
|
||||
{
|
||||
result.Warnings.Add($"Row {rowNumber}: SKU already exists. Skipping.");
|
||||
await uow.RollbackTransactionAsync(); // Rollback just this record
|
||||
// Continue to next record
|
||||
}
|
||||
```
|
||||
|
||||
### Duplicate Detection Strategy
|
||||
1. **First Pass (In-Memory)**: Check against existing database data (fast)
|
||||
2. **Second Pass (In-Memory)**: Check for duplicates within the CSV file itself
|
||||
3. **Third Pass (Database)**: Catch any race conditions or concurrent inserts
|
||||
|
||||
## Files Modified
|
||||
|
||||
1. ✅ `PowderCoating.Infrastructure/Services/CsvImportService.cs` (3 methods updated)
|
||||
2. ✅ `sample-data/inventory-items-sample.csv` (SKUs updated)
|
||||
3. ✅ `sample-data/inventory-items-sample-v2.csv` (created)
|
||||
4. ✅ `sample-data/README.md` (troubleshooting added)
|
||||
5. ✅ `sample-data/IMPORT_ERROR_FIXES.md` (this file)
|
||||
|
||||
## Build Status
|
||||
|
||||
✅ **Build Succeeded** - 0 Errors, 0 New Warnings
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Test the imports** with the updated sample CSV files
|
||||
2. **Re-import inventory** using the new `inventory-items-sample.csv` (IMP- prefix)
|
||||
3. **Delete old inventory items** if you have duplicates from seed data (optional)
|
||||
4. **Create your own CSV files** using the updated template format
|
||||
|
||||
## Questions?
|
||||
|
||||
- Sample files not importing? Check the README.md troubleshooting section
|
||||
- Still seeing errors? The error messages now tell you exactly what's wrong
|
||||
- Want to reset data? Delete existing records or use new SKU prefixes in your CSV
|
||||
@@ -0,0 +1,146 @@
|
||||
# Sample CSV Data for Bulk Import Testing
|
||||
|
||||
This folder contains ready-to-use sample CSV files for testing the bulk import feature.
|
||||
|
||||
## Files Included
|
||||
|
||||
### 1. `customers-sample.csv` (20 customers)
|
||||
- **10 Commercial Customers** with pricing tiers (Standard, Silver, Gold, Platinum)
|
||||
- **10 Individual Customers** (Non-Commercial, COD payment)
|
||||
- Mix of credit limits, payment terms, and tax-exempt status
|
||||
- Realistic company names and contact information
|
||||
|
||||
**Pricing Tiers Used:**
|
||||
- STANDARD - No discount
|
||||
- SILVER - 5% discount
|
||||
- GOLD - 10% discount
|
||||
- PLATINUM - 15% discount
|
||||
|
||||
### 2. `catalog-items-sample.csv` (25 products)
|
||||
- **Automotive** (8 items): Wheels, engine parts, body components
|
||||
- **Furniture** (4 items): Outdoor and indoor furniture
|
||||
- **Railings** (3 items): Residential and commercial railings
|
||||
- **Gates** (3 items): Driveway, garden, and security gates
|
||||
- **Fitness** (3 items): Exercise equipment frames
|
||||
- **Industrial** (2 items): Shelving and carts
|
||||
- **Bicycle** (2 items): Road and mountain bike frames
|
||||
|
||||
**Features:**
|
||||
- Hierarchical categories (automatically created on import)
|
||||
- Realistic pricing ($35 - $450)
|
||||
- Weight and surface area estimates
|
||||
- Sandblasting and masking requirements
|
||||
|
||||
### 3. `inventory-items-sample.csv` (25 items)
|
||||
- **14 Powder Coating Colors**: Black, White, Red, Blue, Silver, Gray, Green, Yellow, Orange, Bronze, Gold, Cream, Clear, Textured Black
|
||||
- **11 Consumables**: Masking tape, plugs, cleaners, sandblasting media, hanging supplies, safety equipment
|
||||
- **Manufacturers**: Tiger Drylac, Axalta, PPG, 3M, etc.
|
||||
- Realistic stock levels, unit costs, and reorder points
|
||||
- RAL color codes for powder coatings
|
||||
|
||||
## How to Use
|
||||
|
||||
### Option 1: Import All Files (Recommended)
|
||||
1. Start the application
|
||||
2. Navigate to **Tools** page
|
||||
3. Scroll to **CSV Bulk Import** section
|
||||
4. Import in this order:
|
||||
- **Customers** tab → Upload `customers-sample.csv`
|
||||
- **Catalog Items** tab → Upload `catalog-items-sample.csv`
|
||||
- **Inventory** tab → Upload `inventory-items-sample.csv`
|
||||
|
||||
### Option 2: Modify Before Import
|
||||
1. Open any CSV file in Excel or a text editor
|
||||
2. Add/remove/modify rows as needed
|
||||
3. Save the file (keep CSV format)
|
||||
4. Upload via the Tools page
|
||||
|
||||
### Option 3: Use as Templates
|
||||
1. Download the official templates from the Tools page
|
||||
2. Use these sample files as reference for data format
|
||||
3. Create your own custom data
|
||||
|
||||
## Expected Import Results
|
||||
|
||||
### Customers Import
|
||||
- ✅ 20 customers created
|
||||
- ✅ 4 pricing tiers automatically linked
|
||||
- ✅ 1 tax-exempt customer flagged
|
||||
- ⚠️ Warnings if pricing tier codes don't exist (e.g., if you haven't seeded company data)
|
||||
|
||||
### Catalog Items Import
|
||||
- ✅ 25 catalog items created
|
||||
- ✅ 8 categories auto-created hierarchically:
|
||||
- Automotive → Wheels → Standard, Performance
|
||||
- Automotive → Engine → Valve Covers, Intake Manifolds
|
||||
- Automotive → Body → Bumpers, Grilles
|
||||
- Furniture → Outdoor, Indoor
|
||||
- Railings → Residential, Commercial
|
||||
- Gates → Residential, Commercial
|
||||
- Fitness → Equipment
|
||||
- Industrial → Shelving, Carts
|
||||
- Bicycle → Frames
|
||||
- ✅ SKU format validated (CAT-*)
|
||||
|
||||
### Inventory Items Import
|
||||
- ✅ 25 inventory items created
|
||||
- ✅ 2 categories auto-created: "Powder Coating", "Consumables"
|
||||
- ✅ Stock levels and reorder points set
|
||||
- ✅ RAL color codes preserved
|
||||
|
||||
## Data Validation
|
||||
|
||||
The import process will:
|
||||
- ✅ Validate required fields (name, email, SKU, etc.)
|
||||
- ✅ Check for duplicate emails (customers) and SKUs (catalog/inventory)
|
||||
- ✅ Auto-create missing categories and pricing tiers
|
||||
- ✅ Skip rows with errors and report them
|
||||
- ✅ Show warnings for non-critical issues
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Issue**: "Pricing tier not found" warning
|
||||
**Solution**: Run **Platform Management > Seed Data** to create pricing tiers first
|
||||
|
||||
**Issue**: "Duplicate email" error
|
||||
**Solution**: Customer with that email already exists. Change the email or skip that row.
|
||||
|
||||
**Issue**: "Duplicate SKU" error (e.g., "Cannot insert duplicate key... PWD-BLK-001")
|
||||
**Solution**: You have existing inventory/catalog items with those SKUs. Options:
|
||||
1. **Use the updated sample file** - All SKUs now have "IMP-" prefix to avoid conflicts
|
||||
2. **Delete existing items** - Go to Inventory page and delete conflicting items first
|
||||
3. **Edit the CSV** - Change SKUs in the file before importing (e.g., add your company code prefix)
|
||||
|
||||
**Issue**: CSV format error
|
||||
**Solution**: Ensure file is saved as UTF-8 CSV format. Check for extra commas or quotes.
|
||||
|
||||
**Issue**: Database constraint violation
|
||||
**Solution**: Check that all required fields are present and data types are correct (numbers for prices, valid dates, etc.)
|
||||
|
||||
## File Format Notes
|
||||
|
||||
- **Encoding**: UTF-8 (recommended)
|
||||
- **Delimiter**: Comma (,)
|
||||
- **Quote Character**: Double quote (") for fields containing commas
|
||||
- **Line Ending**: Windows (CRLF) or Unix (LF) both supported
|
||||
- **Header Row**: Required (first row must be field names)
|
||||
|
||||
## Tips
|
||||
|
||||
1. **Start Fresh**: Import these files into a new company for a complete demo dataset
|
||||
2. **Test Workflows**: Use the imported data to test quote creation, job management, etc.
|
||||
3. **Customize**: Modify the data to match your specific business needs
|
||||
4. **Export Reference**: After import, you can use the system's export feature to see how data should be formatted
|
||||
|
||||
## Next Steps
|
||||
|
||||
After importing sample data:
|
||||
1. View imported **Customers** at `/Customers`
|
||||
2. Browse **Catalog Items** at `/CatalogItems`
|
||||
3. Check **Inventory** at `/Inventory`
|
||||
4. Create a quote using the new customers and catalog items
|
||||
5. Create a job and assign inventory items
|
||||
|
||||
## Questions?
|
||||
|
||||
Refer to the main application documentation or contact support.
|
||||
@@ -0,0 +1,26 @@
|
||||
CategoryPath,ItemName,SKU,Description,BasePrice,UnitOfMeasure,EstimatedWeight,EstimatedSurfaceArea,RequiresSandblasting,RequiresMasking,IsActive
|
||||
"Automotive/Wheels/Standard","16-inch Steel Wheel","CAT-WHL-16ST","Standard 16-inch steel automotive wheel","45.00","Each","15.5","2.8","true","false","true"
|
||||
"Automotive/Wheels/Standard","17-inch Alloy Wheel","CAT-WHL-17AL","17-inch aluminum alloy wheel","65.00","Each","18.2","3.2","true","true","true"
|
||||
"Automotive/Wheels/Performance","18-inch Performance Wheel","CAT-WHL-18PF","High-performance 18-inch racing wheel","95.00","Each","19.5","3.5","true","true","true"
|
||||
"Automotive/Wheels/Performance","20-inch Forged Wheel","CAT-WHL-20FG","Premium 20-inch forged aluminum wheel","145.00","Each","22.0","4.2","true","true","true"
|
||||
"Automotive/Engine/Valve Covers","V8 Valve Cover","CAT-ENG-V8VC","Small block V8 valve cover","35.00","Each","4.5","1.2","true","true","true"
|
||||
"Automotive/Engine/Intake Manifolds","Performance Intake Manifold","CAT-ENG-INTK","High-flow intake manifold","125.00","Each","12.0","2.5","true","true","true"
|
||||
"Automotive/Body/Bumpers","Front Bumper","CAT-BDY-FBMP","Standard front bumper assembly","180.00","Each","35.0","8.5","true","true","true"
|
||||
"Automotive/Body/Grilles","Custom Grille","CAT-BDY-GRIL","Custom mesh grille assembly","75.00","Each","8.5","2.0","true","false","true"
|
||||
"Furniture/Outdoor/Chairs","Patio Chair Frame","CAT-FRN-PTCH","Metal patio chair frame","40.00","Each","12.0","4.5","true","false","true"
|
||||
"Furniture/Outdoor/Tables","Patio Table Frame","CAT-FRN-PTTB","Round patio table frame (42-inch)","85.00","Each","28.0","8.2","true","false","true"
|
||||
"Furniture/Indoor/Office","Office Desk Frame","CAT-FRN-DESK","Metal office desk frame","120.00","Each","45.0","12.5","true","false","true"
|
||||
"Furniture/Indoor/Storage","File Cabinet","CAT-FRN-FLCB","4-drawer metal file cabinet","95.00","Each","65.0","15.0","true","false","true"
|
||||
"Railings/Residential/Deck","Standard Deck Railing","CAT-RAL-DECK","6-foot residential deck railing section","55.00","Per Section","18.0","5.5","true","false","true"
|
||||
"Railings/Residential/Stair","Interior Stair Rail","CAT-RAL-STIR","Interior stair handrail with brackets","45.00","Per Section","12.0","3.8","true","false","true"
|
||||
"Railings/Commercial/ADA","ADA Compliant Handrail","CAT-RAL-ADA","Commercial ADA-compliant handrail","75.00","Per Section","15.0","4.2","true","false","true"
|
||||
"Gates/Residential/Driveway","Single Driveway Gate","CAT-GAT-DRSG","Single swing driveway gate (10ft)","285.00","Each","125.0","35.0","true","false","true"
|
||||
"Gates/Residential/Garden","Garden Gate","CAT-GAT-GRDN","Decorative garden gate (4ft)","95.00","Each","35.0","8.5","true","false","true"
|
||||
"Gates/Commercial/Security","Security Gate Panel","CAT-GAT-SCTY","Commercial security gate panel (8ft)","225.00","Each","95.0","28.0","true","false","true"
|
||||
"Fitness/Equipment/Racks","Power Rack Frame","CAT-FIT-RACK","Heavy-duty power rack frame","450.00","Each","185.0","45.0","true","false","true"
|
||||
"Fitness/Equipment/Benches","Adjustable Bench Frame","CAT-FIT-BNCH","Adjustable workout bench frame","125.00","Each","55.0","12.0","true","false","true"
|
||||
"Fitness/Equipment/Accessories","Weight Plate Tree","CAT-FIT-WGTR","Vertical weight plate storage tree","85.00","Each","45.0","8.5","true","false","true"
|
||||
"Industrial/Shelving/Heavy Duty","Industrial Shelf Unit","CAT-IND-SHLF","Heavy-duty industrial shelving unit (6ft)","165.00","Each","85.0","22.0","true","false","true"
|
||||
"Industrial/Carts/Material Handling","Platform Cart","CAT-IND-CART","Industrial platform cart (4ft x 3ft)","195.00","Each","75.0","18.5","true","false","true"
|
||||
"Bicycle/Frames/Road","Road Bike Frame","CAT-BIK-ROAD","Aluminum road bike frame (56cm)","175.00","Each","4.5","3.2","true","true","true"
|
||||
"Bicycle/Frames/Mountain","Mountain Bike Frame","CAT-BIK-MTN","Full suspension MTB frame (19-inch)","225.00","Each","6.2","3.8","true","true","true"
|
||||
|
@@ -0,0 +1,21 @@
|
||||
CompanyName,ContactName,Email,Phone,Address,City,State,ZipCode,CustomerType,PricingTierCode,CreditLimit,PaymentTerms,TaxExempt,Notes
|
||||
"Acme Manufacturing","John Smith","john.smith@acme.com","555-0101","123 Industrial Blvd","Detroit","MI","48201","Commercial","GOLD","10000","Net 30","false","Large automotive parts manufacturer"
|
||||
"Precision Auto Parts","Sarah Johnson","sarah@precisionauto.com","555-0102","456 Factory Road","Cleveland","OH","44101","Commercial","SILVER","5000","Net 30","false","Quality auto parts supplier"
|
||||
"Metro Railings Inc","Mike Davis","mike@metrorailings.com","555-0103","789 Steel Avenue","Pittsburgh","PA","15201","Commercial","STANDARD","2500","Net 15","false","Residential and commercial railings"
|
||||
"Custom Wheels Plus","Lisa Chen","lisa@customwheels.com","555-0104","321 Performance Dr","Indianapolis","IN","46201","Commercial","PLATINUM","25000","Net 45","false","High-end custom wheel restoration"
|
||||
"Valley Furniture Co","Robert Williams","rob@valleyfurniture.com","555-0105","654 Oak Street","Grand Rapids","MI","49501","Commercial","GOLD","8000","Net 30","false","Commercial furniture manufacturer"
|
||||
"Gym Equipment Pro","Amanda Martinez","amanda@gymequippro.com","555-0106","987 Fitness Lane","Columbus","OH","43201","Commercial","SILVER","6000","Net 30","false","Fitness equipment supplier"
|
||||
"Iron Gates Design","David Brown","david@irongates.com","555-0107","147 Forge Road","Toledo","OH","43601","Commercial","STANDARD","3000","Net 15","false","Custom gate fabrication"
|
||||
"Office Solutions Ltd","Jennifer Taylor","jen@officesolutions.com","555-0108","258 Business Pkwy","Lansing","MI","48901","Commercial","GOLD","7500","Net 30","true","Government contractor - tax exempt"
|
||||
"Anderson Motorsports","Tom Anderson","tom@andersonmoto.com","555-0109","369 Race Track Rd","Dayton","OH","45401","Commercial","PLATINUM","15000","Net 30","false","Racing parts and restoration"
|
||||
"Bike Frame Builders","Emily White","emily@bikeframes.com","555-0110","741 Cycle Way","Ann Arbor","MI","48101","Commercial","SILVER","4500","Net 30","false","Custom bicycle manufacturing"
|
||||
"Jane Wilson","Jane Wilson","jane.wilson@email.com","555-0201","852 Maple Ave","Detroit","MI","48202","NonCommercial","","0","COD","false","Personal bike restoration project"
|
||||
"Mark Thompson","Mark Thompson","mark.t@email.com","555-0202","963 Pine Street","Cleveland","OH","44102","NonCommercial","","0","COD","false","Antique furniture refinishing"
|
||||
"Susan Miller","Susan Miller","susan.m@email.com","555-0203","159 Elm Drive","Columbus","OH","43202","NonCommercial","","0","COD","false","Home railing project"
|
||||
"Chris Davis","Chris Davis","chris.davis@email.com","555-0204","357 Cedar Lane","Toledo","OH","43602","NonCommercial","","0","COD","false","Motorcycle parts restoration"
|
||||
"Patricia Garcia","Patricia Garcia","patricia.g@email.com","555-0205","753 Birch Court","Lansing","MI","48902","NonCommercial","","0","COD","false","Garden furniture project"
|
||||
"James Rodriguez","James Rodriguez","james.r@email.com","555-0206","951 Walnut Place","Dayton","OH","45402","NonCommercial","","0","COD","false","Custom wheel refinishing"
|
||||
"Linda Martinez","Linda Martinez","linda.m@email.com","555-0207","159 Cherry Street","Ann Arbor","MI","48102","NonCommercial","","0","COD","false","Outdoor metal furniture"
|
||||
"William Lee","William Lee","will.lee@email.com","555-0208","357 Spruce Road","Grand Rapids","MI","49502","NonCommercial","","0","COD","false","Automotive restoration"
|
||||
"Barbara Taylor","Barbara Taylor","barb.t@email.com","555-0209","753 Hickory Drive","Pittsburgh","PA","15202","NonCommercial","","0","COD","false","Personal gym equipment"
|
||||
"Richard Hall","Richard Hall","rich.hall@email.com","555-0210","951 Ash Boulevard","Indianapolis","IN","46202","NonCommercial","","0","COD","false","Classic car parts"
|
||||
|
@@ -0,0 +1,26 @@
|
||||
SKU,ItemName,CategoryName,Manufacturer,ColorName,ColorCode,QuantityInStock,UnitOfMeasure,UnitCost,ReorderPoint,ReorderQuantity,Notes
|
||||
"IMP-PWD-BLK-001","Black Powder Coating","Powder Coating","Tiger Drylac","Jet Black","RAL 9005","450","Pounds","8.50","100","200","High-gloss black - most popular"
|
||||
"IMP-PWD-WHT-001","White Powder Coating","Powder Coating","Axalta","Pure White","RAL 9010","325","Pounds","8.75","100","200","Bright white finish"
|
||||
"IMP-PWD-RED-001","Red Powder Coating","Powder Coating","PPG","Ferrari Red","RAL 3020","125","Pounds","9.25","50","100","Glossy automotive red"
|
||||
"IMP-PWD-BLU-001","Blue Powder Coating","Powder Coating","Tiger Drylac","Ocean Blue","RAL 5012","85","Pounds","9.00","50","100","Deep blue metallic"
|
||||
"IMP-PWD-SLV-001","Silver Powder Coating","Powder Coating","Axalta","Metallic Silver","RAL 9006","215","Pounds","10.50","75","150","Metallic silver finish"
|
||||
"IMP-PWD-GRY-001","Charcoal Gray Powder Coating","Powder Coating","PPG","Charcoal Gray","RAL 7024","165","Pounds","8.50","75","150","Modern charcoal gray"
|
||||
"IMP-PWD-GRN-001","Green Powder Coating","Powder Coating","Tiger Drylac","John Deere Green","RAL 6010","95","Pounds","9.00","50","100","Classic tractor green"
|
||||
"IMP-PWD-YLW-001","Yellow Powder Coating","Powder Coating","Axalta","Safety Yellow","RAL 1023","45","Pounds","9.50","25","50","High-visibility yellow"
|
||||
"IMP-PWD-ORG-001","Orange Powder Coating","Powder Coating","PPG","Safety Orange","RAL 2009","55","Pounds","9.50","25","50","High-visibility orange"
|
||||
"IMP-PWD-BRN-001","Bronze Powder Coating","Powder Coating","Tiger Drylac","Copper Bronze","RAL 8004","75","Pounds","11.00","50","100","Metallic bronze finish"
|
||||
"IMP-PWD-GLD-001","Gold Powder Coating","Powder Coating","Axalta","Gold Metallic","RAL 1036","35","Pounds","12.50","25","50","Premium gold metallic"
|
||||
"IMP-PWD-CRM-001","Cream Powder Coating","Powder Coating","PPG","Antique Cream","RAL 1015","65","Pounds","8.75","50","100","Vintage cream color"
|
||||
"IMP-PWD-CLR-001","Clear Powder Coating","Powder Coating","Tiger Drylac","Clear Coat","N/A","185","Pounds","11.50","75","150","Protective clear coat"
|
||||
"IMP-PWD-TXT-001","Textured Black Powder","Powder Coating","Axalta","Black Texture","RAL 9005","145","Pounds","9.75","75","150","Wrinkle texture finish"
|
||||
"IMP-CON-MSK-001","Masking Tape - 2 inch","Consumables","3M","N/A","N/A","48","Rolls","12.50","12","24","High-temp masking tape"
|
||||
"IMP-CON-MSK-002","Masking Tape - 1 inch","Consumables","3M","N/A","N/A","72","Rolls","7.50","24","48","Standard masking tape"
|
||||
"IMP-CON-PLG-001","Silicone Plugs Kit","Consumables","Caplugs","N/A","N/A","15","Kits","45.00","5","10","Assorted sizes"
|
||||
"IMP-CON-CLN-001","Pre-Treatment Cleaner","Consumables","ChemTech","N/A","N/A","85","Gallons","18.50","20","40","Alkaline cleaner"
|
||||
"IMP-CON-SND-001","Sandblasting Media - Aluminum Oxide","Consumables","Kramer Industries","N/A","N/A","1850","Pounds","0.95","500","1000","60 grit aluminum oxide"
|
||||
"IMP-CON-SND-002","Sandblasting Media - Glass Bead","Consumables","Kramer Industries","N/A","N/A","1250","Pounds","1.25","500","1000","Fine glass bead"
|
||||
"IMP-CON-WIP-001","Tack Cloths","Consumables","SEM Products","N/A","N/A","125","Each","1.50","50","100","Pre-coating tack cloths"
|
||||
"IMP-CON-HNG-001","Hanging Wire - Heavy Duty","Consumables","Industrial Supply","N/A","N/A","2500","Feet","0.35","500","1000","12 gauge steel wire"
|
||||
"IMP-CON-HNG-002","Powder Coating Hooks","Consumables","Finishing Systems","N/A","N/A","450","Each","2.75","100","200","Standard S-hooks"
|
||||
"IMP-CON-CMP-001","Compressed Air Filter","Consumables","Parker","N/A","N/A","8","Each","85.00","3","6","High-efficiency air filter"
|
||||
"IMP-CON-SAF-001","Respirator Filters","Consumables","3M","N/A","N/A","36","Each","15.50","12","24","P100 particulate filters"
|
||||
|
@@ -0,0 +1,26 @@
|
||||
SKU,ItemName,CategoryName,Manufacturer,ColorName,ColorCode,QuantityInStock,UnitOfMeasure,UnitCost,ReorderPoint,ReorderQuantity,Notes
|
||||
"IMP-PWD-BLK-001","Black Powder Coating","Powder Coating","Tiger Drylac","Jet Black","RAL 9005","450","Pounds","8.50","100","200","High-gloss black - most popular"
|
||||
"IMP-PWD-WHT-001","White Powder Coating","Powder Coating","Axalta","Pure White","RAL 9010","325","Pounds","8.75","100","200","Bright white finish"
|
||||
"IMP-PWD-RED-001","Red Powder Coating","Powder Coating","PPG","Ferrari Red","RAL 3020","125","Pounds","9.25","50","100","Glossy automotive red"
|
||||
"IMP-PWD-BLU-001","Blue Powder Coating","Powder Coating","Tiger Drylac","Ocean Blue","RAL 5012","85","Pounds","9.00","50","100","Deep blue metallic"
|
||||
"IMP-PWD-SLV-001","Silver Powder Coating","Powder Coating","Axalta","Metallic Silver","RAL 9006","215","Pounds","10.50","75","150","Metallic silver finish"
|
||||
"IMP-PWD-GRY-001","Charcoal Gray Powder Coating","Powder Coating","PPG","Charcoal Gray","RAL 7024","165","Pounds","8.50","75","150","Modern charcoal gray"
|
||||
"IMP-PWD-GRN-001","Green Powder Coating","Powder Coating","Tiger Drylac","John Deere Green","RAL 6010","95","Pounds","9.00","50","100","Classic tractor green"
|
||||
"IMP-PWD-YLW-001","Yellow Powder Coating","Powder Coating","Axalta","Safety Yellow","RAL 1023","45","Pounds","9.50","25","50","High-visibility yellow"
|
||||
"IMP-PWD-ORG-001","Orange Powder Coating","Powder Coating","PPG","Safety Orange","RAL 2009","55","Pounds","9.50","25","50","High-visibility orange"
|
||||
"IMP-PWD-BRN-001","Bronze Powder Coating","Powder Coating","Tiger Drylac","Copper Bronze","RAL 8004","75","Pounds","11.00","50","100","Metallic bronze finish"
|
||||
"IMP-PWD-GLD-001","Gold Powder Coating","Powder Coating","Axalta","Gold Metallic","RAL 1036","35","Pounds","12.50","25","50","Premium gold metallic"
|
||||
"IMP-PWD-CRM-001","Cream Powder Coating","Powder Coating","PPG","Antique Cream","RAL 1015","65","Pounds","8.75","50","100","Vintage cream color"
|
||||
"IMP-PWD-CLR-001","Clear Powder Coating","Powder Coating","Tiger Drylac","Clear Coat","N/A","185","Pounds","11.50","75","150","Protective clear coat"
|
||||
"IMP-PWD-TXT-001","Textured Black Powder","Powder Coating","Axalta","Black Texture","RAL 9005","145","Pounds","9.75","75","150","Wrinkle texture finish"
|
||||
"IMP-CON-MSK-001","Masking Tape - 2 inch","Consumables","3M","N/A","N/A","48","Rolls","12.50","12","24","High-temp masking tape"
|
||||
"IMP-CON-MSK-002","Masking Tape - 1 inch","Consumables","3M","N/A","N/A","72","Rolls","7.50","24","48","Standard masking tape"
|
||||
"IMP-CON-PLG-001","Silicone Plugs Kit","Consumables","Caplugs","N/A","N/A","15","Kits","45.00","5","10","Assorted sizes"
|
||||
"IMP-CON-CLN-001","Pre-Treatment Cleaner","Consumables","ChemTech","N/A","N/A","85","Gallons","18.50","20","40","Alkaline cleaner"
|
||||
"IMP-CON-SND-001","Sandblasting Media - Aluminum Oxide","Consumables","Kramer Industries","N/A","N/A","1850","Pounds","0.95","500","1000","60 grit aluminum oxide"
|
||||
"IMP-CON-SND-002","Sandblasting Media - Glass Bead","Consumables","Kramer Industries","N/A","N/A","1250","Pounds","1.25","500","1000","Fine glass bead"
|
||||
"IMP-CON-WIP-001","Tack Cloths","Consumables","SEM Products","N/A","N/A","125","Each","1.50","50","100","Pre-coating tack cloths"
|
||||
"IMP-CON-HNG-001","Hanging Wire - Heavy Duty","Consumables","Industrial Supply","N/A","N/A","2500","Feet","0.35","500","1000","12 gauge steel wire"
|
||||
"IMP-CON-HNG-002","Powder Coating Hooks","Consumables","Finishing Systems","N/A","N/A","450","Each","2.75","100","200","Standard S-hooks"
|
||||
"IMP-CON-CMP-001","Compressed Air Filter","Consumables","Parker","N/A","N/A","8","Each","85.00","3","6","High-efficiency air filter"
|
||||
"IMP-CON-SAF-001","Respirator Filters","Consumables","3M","N/A","N/A","36","Each","15.50","12","24","P100 particulate filters"
|
||||
|
Reference in New Issue
Block a user