# 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