Contracts — Production Guide
Full go-live audits:
Licensing
- Catalog slug:
contracts - Category: Sales (
sales) - Free Marketplace opt-in (not auto-installed)
- Catalog flags:
is_default_included = false,is_billable = false, price0,sort_order = 60, version 1.7.0 - Hard dependency: requires the Opportunities module — install is blocked at the Marketplace/API level until Opportunities is entitled
- Soft optional dependency: linking a
quotation_idrequires the Quotations module to also be entitled; the link is otherwise rejected by validation (LinkableQuotation) - Soft optional dependency (1.7.0): enabling signature image / ID document acceptance settings requires the free Storage module (API + Settings UI gate). Phone-only does not.
- Existing workspaces that already have Contracts keep their subscription (policy change does not uninstall)
Bootstrap
On new workspace create:
installDefaultModules()installs publishedis_default_includedmodules only (Contracts is never auto-installed)- Operators enable Opportunities first, then Contracts, from Marketplace (free / non-billable install activates immediately)
- Tenant permissions include
contracts.*viaconfig/tenant-permissions.php/ default role maps
Permissions rollout
New Contracts permissions for existing workspaces ship as an additive data migration using TenantPermissionSynchronizer::grantMissingDefaultRolePermissions([...]). Do not re-seed roles. Catalog 1.5.0 adds contracts.send and contracts.accept via that grant path.
Monitoring
- Platform audit events:
contract_created,contract_updated,contract_deleted,contract_assigned,contract_status_changed,contract_invoice_created,contract_note_added - Notifications: assignment via
ContractAssignedNotification; renewal due viaContractRenewalDueNotification(database; scheduled bycrm:send-due-notifications) - Domain timeline also records
emailed,signature_requested, andsignedfor PDF/email/accept flows
Deploy checklist
- Migrate tables (
contracts,contract_notes,contract_activities) plusdescription(1.1.0),customer_invoices.contract_id(1.2.0), convert permission, acceptance columns,contracts.send/contracts.acceptgrants, and catalog bump through 1.7.0 - Register the
contractscatalog module via migration (DefaultModuleRegistrar) as free Sales opt-in — notdb:seed - Register the hard dependency row (
contracts→opportunities) via migration - Run contracts permissions migration so default roles receive missing
contracts.*grants (includingsend/acceptfor 1.5.0) - Confirm
module:contracts+contracts.*permissions on target roles - Deploy Frontend SPA with Contracts nav/pages (mirror Opportunities/Quotations table + form) when the SPA ships
- After catalog 1.2.0: confirm
contracts.convertgrants and that create-invoice stays hidden until Invoices is entitled - After catalog 1.5.0: migrate acceptance columns; confirm PDF throttle
contracts-pdfand public throttlecontract-acceptance; deploy SPA guest route/#/accept/contracts/:token; smoke Download PDF, Send for signature → Copy accept link / Email customer → public accept → signer metadata on the record; verify Activate without signature still works from draft - After catalog 1.6.0: confirm Settings → General exposes
contract_renewal_notice_days; with an Active contract ending inside the window, runphp artisan crm:send-due-notificationsand expect one in-appcontract.renewal_dueper day per assignee/creator - After catalog 1.7.0: migrate evidence columns; confirm Settings toggles
contracts.acceptance_require_phone/_signature_image/_id_document; with Storage entitled, smoke public accept with phone + drawn/uploaded signature + ID upload; staff download signature and ID from the record