Quotations — Production Guide
Licensing
- Catalog slug:
quotations - Category: Sales (
sales) - Free Marketplace opt-in (not auto-installed)
- Catalog flags:
is_default_included = false,is_billable = false, price0,sort_order = 50 - Hard dependency: requires the Opportunities module — install is blocked at the Marketplace/API level until Opportunities is entitled
- Existing workspaces that already have Quotations keep their subscription (policy change does not uninstall)
Bootstrap
On new workspace create:
installDefaultModules()installs publishedis_default_includedmodules only (Quotations is never auto-installed)- Operators enable Opportunities first, then Quotations, from Marketplace (free / non-billable install activates immediately)
- Tenant permissions include
quotations.*viaconfig/tenant-permissions.php/ default role maps
Permissions rollout
New Quotations permissions for existing workspaces ship as an additive data migration using TenantPermissionSynchronizer::grantMissingDefaultRolePermissions([...]). Do not re-seed roles.
Monitoring
- Platform audit events:
quotation_created,quotation_updated,quotation_deleted,quotation_assigned,quotation_status_changed,quotation_converted,quotation_note_added - Notifications: assignment via
QuotationAssignedNotification
Deploy checklist
- Migrate tables (
quotations,quotation_lines,quotation_notes,quotation_activities) - Register the
quotationscatalog module via migration (DefaultModuleRegistrar) as free Sales opt-in — notdb:seed - Register the hard dependency row (
quotations→opportunities) via migration - Run quotations permissions migration so default roles receive missing
quotations.*grants - Confirm
module:quotations+quotations.*permissions on target roles - Deploy Frontend SPA with Quotations nav/pages (mirror Opportunities table + form) when the SPA ships
- After catalog 1.4.0: confirm
quotations.convertgrants and that convert stays hidden until Invoices is entitled - After catalog 1.9.0: migrate acceptance columns; deploy SPA guest route
/#/accept/quotations/:token; smoke Send → Copy accept link / Email → public accept → signer metadata on the record