# Public Training Attachment Requirement Report ## Summary Implemented the public training attachment requirement in the shared training record form flow so create and edit screens now: - show a dynamic red notice when the selected training type is `EXTERNAL_TRAINING` - block submit when public training has no attachment - allow unlimited attachment selection in the UI while keeping the existing 10 MB per-file rule and file-type rule ## Files Changed - `src/features/training-records/components/training-record-form.tsx` - `src/features/training-records/components/training-record-certificate-manager.tsx` - `src/features/training-records/constants/certificate-upload.ts` ## Requirement Mapping - Dynamic warning for Public Training: Added conditional notice rendering in the shared training record form based on `EXTERNAL_TRAINING`. - Upload section placement: Notice is rendered directly in the upload section above the uploader. - Required attachment validation: Submit is blocked in the shared form when public training has no existing or pending attachment. - Attachment rule: Reused the existing PDF/JPG/JPEG/PNG and 10 MB per-file limits, and removed the previous UI file-count cap. - Shared pattern: Kept the existing TanStack Form + mutation + certificate upload flow and updated the shared form used by both create and edit routes. ## Implementation Details - Added `certificate-upload.ts` as the shared source for: - public training type constant - public training warning/error messages - accepted file types - max file size - uploader max file count behavior - Updated `training-record-form.tsx` to: - read existing certificate count for edit mode - render a red notice when `trainingType === "EXTERNAL_TRAINING"` - prevent submit if public training has neither existing attachments nor pending files - clear the attachment error when attachments are added or the training type changes away from public training - upload attachments before the record update in the specific edit case where public training would otherwise become attachment-less - roll back newly created public training records if attachment upload fails after create - Updated `training-record-certificate-manager.tsx` to reuse the same upload constants and remove the old `maxFiles={5}` limit. ## Validation Rules - Public training requires at least one attachment before submit. - Non-public training keeps the previous behavior and does not require attachments. - Accepted file types remain: - PDF - JPG - JPEG - PNG - Maximum size remains 10 MB per file. ## Testing Result - Code path reviewed for: - create flow (`trainingRecordId === "new"`) - edit flow (`trainingRecordId !== "new"`) - shared training record form - existing certificate manager upload flow - Automated verification pending: - project lint - build - browser/manual interaction checks ## Impact Analysis - No database schema changes. - No training record API contract changes. - No role or permission changes. - Existing certificate upload storage flow is preserved. - The change is scoped to training-record attachment UX and submit validation. ## Notes / Limitations - The attachment requirement is enforced in the shared client form flow, which is the existing create/edit entry point for dashboard users. - I kept the route-handler contract unchanged to avoid widening the feature scope and to stay aligned with the current two-step record-create then certificate-upload architecture.