Sales Reference Public

Module Research Notes

Evidence gathered from the current Sales module files — controllers, models, configs, and migrations — before writing these user guide pages.

Guide version: r1 Module version: 1.0.0 Updated: 2026-07-22 Estimated time: 3 min 2 views
Reference

Module Research Notes

Evidence gathered from the current module files before writing the user guide pages.

Slug: salesVersion: 1.0.0Category: SalesReviewed: 2026-07-11

Research Sources Inspected

Source path

modules/Sales

Feature flags marked true

  • Controllers
  • Views
  • Language
  • Permissions
  • Left Menu
  • Default Menu
  • Routes
  • Cron Jobs

Evidence Summary

Manifest

module.json defines slug sales, version 1.0.0, category Sales, and the module capability flags used in this guide.

Runtime surface

10 controller file(s), 90 view file(s), and 2 route mapping(s) were found.

Data surface

0 model file(s), 12 declared table(s), and 0 migration file(s) were found.

Operations surface

31 permission key(s), 6 job(s), 1 seeder(s), and 0 test file(s) were found.

Detailed File Evidence

Controllers and methods

  • Client_groups
  • Clients
  • Customers
  • Estimate_requests
  • Estimates
  • Invoices
  • Request_estimate
  • Sales_matrix
  • Stores
  • Stores_categories

Jobs and schedules

  • Mark overdue invoices (5 1 * * *) - Sets status=overdue for not_paid invoices whose due_date has passed.
  • Generate recurring invoices (30 * * * *) - Creates new invoices from recurring templates whose next_recurring_date has arrived.
  • Send estimate expiry reminders (15 * * * *) - Notifies clients of estimates expiring within estimate_reminder_days_before days.
  • Send invoice post-due reminders (5 * * * *) - Emails reminders to invoice recipients past the configured post-due window.
  • Send invoice pre-due reminders (0 * * * *) - Emails reminders to invoice recipients before the configured pre-due window.
  • Send recurring invoice creation reminders (25 * * * *) - Notifies invoice owners ahead of upcoming recurring invoice generation.

Routes sampled

RouteTarget
sales/(:any)/(.+)$1/$2
sales/(:any)$1

README topics

  • Structure
  • Demo Seeder
  • Routing
  • Models stay in core (by design)
  • Client portal
  • Activation

Operating Implications

  • Permission coverage is part of the module contract, so every workflow should be tested with a role-limited user and an administrator.
  • Scheduled jobs can change statuses, notifications, or summaries after users leave the screen; support should check cron status during troubleshooting.
  • Seeders exist for sample or starter data; operators should know whether seeded records are demo-only or operational defaults.

Known Risks from the Manifest

  • Controllers moved out of application/controllers/sales/ (subdirectory removed) into flat top-level classes; App_Router resolves them. All legacy sales/* URLs are preserved via module routes (raw-regex (.+) catch-alls). Request_estimate is a public CI_Controller routed at request_estimate.
  • Large cross-reference surface (client/project profile tabs, customer portal, dashboards, search, leads, payments) links to sales/* URLs - covered because the prefix is preserved.
  • Sales-domain models remain in core (Clients_model is loaded by 30+ controllers); moving them is deferred to a models pass with full cross-consumer QA.
  • Staff sidebar gains a consolidated 'Sales' group; the client portal's Estimates/Invoices entries remain in Left_menu.php (unchanged) so the customer portal menu is untouched.
  • Sales views (invoices/estimates/clients tabs) are loaded by the Projects module's project detail tabs through global module package paths (runbook G2).
Was this guide helpful?

Report a content problem