Files
CGW-Printing/TODO.md
T
2026-06-11 10:22:45 -05:00

247 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LAAPC Print Service - Remaining Work
## ✅ Completed
- [x] Core service architecture (queue, IPC, file monitoring)
- [x] CLI with self-installation capability
- [x] Basic printing with tray control
- [x] PDF output for testing
- [x] System tray application with status display
- [x] Configuration dialog for printer/tray assignments
- [x] Fixed System.Drawing.Common platform compatibility
## 🅿️ Parking Lot - Future Enhancements
### Configuration Dialog Issues (Non-Critical)
- [ ] **Printer resets on add page:** When adding a new page to a document type, the printer dropdown resets to the first printer in the list if the configuration hasn't been saved yet
- Expected: Should remember previous page's printer selection or default intelligently
- Workaround: Save after configuring each page
- [ ] **Save closes dialog:** Clicking Save closes the configuration dialog, forcing users to reopen it to continue editing
- Expected: Save button should persist changes but keep dialog open
- Suggested: Add "Save & Close" and "Save" as separate buttons, or just make Save not close the dialog
### Printing Enhancements
- [ ] **Skip blank pages:** Add option to skip printing pages with no content
- Use case: Save paper/toner when certain pages in a document are empty
- Implementation: Check if page has content before setting `HasMorePages = true`
- Could be a global setting or per-document-type configuration
## 🔲 Immediate Testing
### Test Configuration Dialog
- [ ] Right-click tray icon → "Configure Printers..."
- [ ] Create new document type
- [ ] Add pages with printer/tray assignments
- [ ] Save configuration (test both local and global)
- [ ] Verify printer-config.json file created correctly
- [ ] Test loading existing configuration
## 🔨 High Priority - Service Integration
### 1. Integrate printer-config.json into PrintService
**Goal:** Service should read printer-config.json instead of appsettings.json
**Files to modify:**
- `PrintService/Services/ConfigurationService.cs` (CREATE NEW)
- Load printer-config.json from C:\ProgramData\LAAPC\ (global) and %LOCALAPPDATA%\LAAPC\ (local)
- Merge local over global (same logic as tray app)
- Return `PrinterConfiguration` object
- `PrintService/Models/PrinterConfig.cs` (COPY from PrintServiceTray)
- Copy the new config models into PrintService project
- `PrintService/Worker.cs` (MODIFY)
- Replace DocumentConfig loading with PrinterConfiguration loading
- Pass PageConfig[] to DocumentProcessor
- `PrintService/Services/DocumentProcessor.cs` (MODIFY - or DELETE if not needed)
- Update to work with new PageConfig format
- May need to refactor logic
- `PrintService/Services/PrinterService.cs` (MODIFY)
- Update Print() method signature to accept PageConfig[]
- Print each page to correct printer/tray based on PageConfig
**Notes:**
- Keep appsettings.json for service-level settings (queue path, retry counts, etc.)
- printer-config.json ONLY for document type → printer/tray mappings
- Support missing config gracefully (log warning, skip job)
## 🔨 High Priority - Page Duplication Pattern
### 2. Implement Multi-Tray Page Duplication
**User Requirement:** Print EACH original page to ALL trays in sequence
**Current Behavior:**
```
TraySequence: [3,4,1,2]
Original document: 4 pages
Output: 4 pages (page 1→tray3, page 2→tray4, page 3→tray1, page 4→tray2)
```
**New Behavior:**
```
TraySequence: [3,4,1,2]
Original document: 4 pages
Output: 16 pages
Page 1 → Tray 3
Page 1 → Tray 4
Page 1 → Tray 1
Page 1 → Tray 2
Page 2 → Tray 3
Page 2 → Tray 4
Page 2 → Tray 1
Page 2 → Tray 2
... (and so on)
```
**Files to modify:**
- `PrintService/Services/PrinterService.cs`
- Modify PrintPage event handler
- Add page duplication logic
- Track: originalPageIndex, trayIndex, currentOutputPage
- For each original page, cycle through all trays before moving to next page
**Algorithm:**
```csharp
int originalPageIndex = 0;
int trayIndex = 0;
int totalOriginalPages = CalculateTotalPages(lines);
bool hasMorePages = true;
PrintPage event:
1. Render lines for originalPageIndex
2. Set tray to pageConfigs[originalPageIndex].TrayNumber
3. Increment trayIndex
4. If trayIndex >= trays.Length:
trayIndex = 0
originalPageIndex++
5. hasMorePages = (originalPageIndex < totalOriginalPages)
```
## 🔨 Medium Priority - Content Modifications
### 3. Port Rust Content Transformation Logic
**Reference:** `RUST/cgwprint/src/background.rs` and `RUST/cgwprint/data/printers.json`
**DO NOT START UNTIL:** Tray config and page duplication are complete and tested
**New config fields needed in PageConfig:**
```json
{
"PageNumber": 1,
"PrinterName": "Brother HL-L6415DW",
"TrayNumber": 3,
"TrayLabel": "Pink",
// NEW FIELDS:
"RemoveOrderNumber": false,
"RemoveOrderNumberLabel": false,
"IndentOrderNumber": 0,
"RowShift": {
"5": -2, // Move line 5 up by 2 positions
"12": 1 // Move line 12 down by 1 position
},
"RowTrim": {
"3": { "Start": 0, "End": 40 }, // Keep only first 40 chars of line 3
"7": { "Start": 10, "End": 50 } // Keep chars 10-50 of line 7
},
"BoldFont": "Courier New Bold",
"NormalFont": "Courier New"
}
```
**Processing steps:**
1. Parse hex escapes (\xHH → bytes)
2. Split on form feed (\x0C) into pages
3. Font replacement (ESC+w+1 → bold, ESC+w+0 → normal)
4. Order number manipulation (remove/indent based on config)
5. Apply row_shift (vertical position adjustments)
6. Apply row_trim (substring extraction)
7. Add PCL/PJL header/footer wrapping
**Files to modify:**
- `PrintService/Models/PageConfig.cs` - Add new properties
- `PrintService/Services/DocumentProcessor.cs` - Add content transformation
- `PrintService/Services/ContentTransformer.cs` (CREATE NEW)
- ParseHexEscapes()
- SplitPages()
- ProcessFontCodes()
- ManipulateOrderNumber()
- ApplyRowShift()
- ApplyRowTrim()
- WrapWithPclHeaders()
**Location-specific variations:**
- "there are 3 locations where this app is used and each has a slight different layout"
- Use document type naming to differentiate: "Invoice_Location1", "Invoice_Location2", etc.
- Or add "Location" field to config and filter by it
## 📋 Testing Checklist
### Before Production Deployment
- [ ] Test service installation on clean 32-bit Windows 10 machine
- [ ] Test CLI from Harbor/Clipper integration
- [ ] Test rapid concurrent print requests (race condition prevention)
- [ ] Test multi-tray printing on Brother HL-L6415DW
- [ ] Test configuration changes without service restart
- [ ] Test queue persistence (stop service mid-job, restart, verify resume)
- [ ] Test error handling (printer offline, invalid tray, etc.)
- [ ] Test tray app startup on Windows boot (add to Startup folder?)
- [ ] Verify file cleanup after successful print
- [ ] Verify error folder gets populated on failures
## 🎯 Future Enhancements (Low Priority)
- [ ] Add logging to file for tray app (currently only service logs)
- [ ] Add "Start/Stop Service" option in tray menu
- [ ] Add "View Logs" option in tray menu
- [ ] Add notification sound for completed jobs
- [ ] Add job history view (last 50 jobs)
- [ ] Support per-page margins configuration
- [ ] Support custom font sizes per document type
- [ ] Add web UI for remote monitoring
## 📝 Important Notes
### Platform Compatibility
- **System.Drawing.Common:** Requires RuntimeHostConfigurationOption in .csproj
- **Remove explicit package reference** to avoid startup errors
- WinForms apps automatically include System.Drawing on Windows
### Configuration Locations
- **Global:** `C:\ProgramData\LAAPC\printer-config.json` (shared, requires admin)
- **Local:** `%LOCALAPPDATA%\LAAPC\printer-config.json` (per-user, no admin)
- **Merge strategy:** Local settings override global settings by document type
### Print Service Config
- Service currently uses: `appsettings.json` (old format with DocumentConfig)
- Service needs to migrate to: `printer-config.json` (new format with PageConfig[])
- Keep `appsettings.json` for non-printer settings (QueuePath, MaxRetries, etc.)
### Page Duplication Logic
- Current: One page per tray (simple mapping)
- Required: All pages to all trays (page duplication with tray cycling)
- Example: 4-page invoice × 5 trays = 20 physical pages printed
- Reason: Simulates carbon copy paper (each page needs copy in each color)
### Content Modifications
- Do LAST (most complex, least critical for initial deployment)
- Three locations have slightly different requirements
- May need per-location configuration or document type naming convention
- PCL/PJL wrapping may only apply to specific printers
### Git Status
- Last commit: cce9248
- `RUST/` folder excluded from version control
- Remember to commit after each major milestone
## 🚀 Next Steps (In Order)
1. **RIGHT NOW:** Test configuration dialog in tray app
2. Integrate printer-config.json into service
3. Implement page duplication pattern
4. Test on production hardware (Brother HL-L6415DW)
5. Deploy to first location
6. Gather feedback
7. Port content modifications from Rust
8. Deploy to remaining two locations