Contracts — Production Guide
Full go-live audit / checklist: Contracts 1.1.0 production readiness.
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.5.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) - 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 - 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.5.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