feat(time-blocks): Add comprehensive time blocking system with contracts

- Add TimeBlock and Holiday models with recurrence support (one-time, weekly, monthly, yearly, holiday)
- Implement business-level and resource-level blocking with hard/soft block types
- Add multi-select holiday picker for bulk holiday blocking
- Add calendar overlay visualization with distinct colors:
  - Business blocks: Red (hard) / Yellow (soft)
  - Resource blocks: Purple (hard) / Cyan (soft)
- Add month view resource indicators showing 1/n width per resource
- Add yearly calendar view for block overview
- Add My Availability page for staff self-service
- Add contracts module with templates, signing flow, and PDF generation
- Update scheduler with click-to-day navigation in week view

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-04 17:19:12 -05:00
parent cf91bae24f
commit 8d0cc1e90a
63 changed files with 11863 additions and 61 deletions

View File

@@ -92,6 +92,7 @@
"platformSettings": "Platform Settings",
"tickets": "Tickets",
"help": "Help",
"contracts": "Contracts",
"platformGuide": "Platform Guide",
"ticketingHelp": "Ticketing System",
"apiDocs": "API Docs",
@@ -409,6 +410,106 @@
"sendReply": "Send Reply",
"ticketClosedNoReply": "This ticket is closed. If you need further assistance, please open a new support request."
},
"contracts": {
"title": "Contracts",
"description": "Manage contract templates and sent contracts",
"templates": "Templates",
"allContracts": "All Contracts",
"createTemplate": "Create Template",
"createContract": "Create Contract",
"editTemplate": "Edit Template",
"viewContract": "View Contract",
"noTemplates": "No contract templates yet",
"noContracts": "No contracts yet",
"templateName": "Template Name",
"templateDescription": "Description",
"content": "Content",
"scope": {
"label": "Scope",
"customer": "Customer Agreement",
"appointment": "Appointment Agreement"
},
"status": {
"label": "Status",
"draft": "Draft",
"active": "Active",
"archived": "Archived",
"pending": "Pending Signature",
"signed": "Signed",
"expired": "Expired",
"voided": "Voided"
},
"expiresAfterDays": "Expires After (Days)",
"expiresAfterDaysHint": "Leave empty for no expiration",
"versionNotes": "Version Notes",
"versionNotesPlaceholder": "What changed in this version?",
"services": "Applicable Services",
"servicesHint": "Leave empty to apply to all services",
"customer": "Customer",
"appointment": "Appointment",
"service": "Service",
"sentAt": "Sent At",
"signedAt": "Signed At",
"expiresAt": "Expires At",
"actions": {
"send": "Send Contract",
"resend": "Resend Contract",
"void": "Void Contract",
"duplicate": "Duplicate Template",
"preview": "Preview",
"delete": "Delete"
},
"sendContract": {
"title": "Send Contract",
"selectCustomer": "Select Customer",
"selectAppointment": "Select Appointment (Optional)",
"selectService": "Select Service (Optional)",
"send": "Send",
"success": "Contract sent successfully",
"error": "Failed to send contract"
},
"voidContract": {
"title": "Void Contract",
"reason": "Reason for voiding",
"reasonPlaceholder": "Why is this contract being voided?",
"confirm": "Void Contract",
"success": "Contract voided successfully",
"error": "Failed to void contract"
},
"preview": {
"title": "Preview Contract",
"sampleData": "Using sample data for preview"
},
"signing": {
"title": "Sign Contract",
"businessName": "{{businessName}}",
"contractFor": "Contract for {{customerName}}",
"pleaseReview": "Please review and sign this contract",
"signerName": "Your Full Name",
"signerEmail": "Your Email",
"signatureLabel": "Sign Below",
"signaturePlaceholder": "Draw your signature here",
"clearSignature": "Clear",
"agreeToTerms": "I agree to the terms and conditions",
"submitSignature": "Submit Signature",
"submitting": "Submitting...",
"success": "Contract signed successfully!",
"error": "Failed to sign contract",
"expired": "This contract has expired",
"alreadySigned": "This contract has already been signed",
"notFound": "Contract not found",
"signedBy": "Signed by {{name}} on {{date}}",
"thankYou": "Thank you for signing!"
},
"errors": {
"loadFailed": "Failed to load contracts",
"createFailed": "Failed to create contract",
"updateFailed": "Failed to update contract",
"deleteFailed": "Failed to delete contract",
"sendFailed": "Failed to send contract",
"voidFailed": "Failed to void contract"
}
},
"dashboard": {
"title": "Dashboard",
"welcome": "Welcome, {{name}}!",