---
tags: [companyuser, service]
module: CompanyUser
---

# RecurringServices

## Connections
[[_CompanyUser]] · [[[Model]RecurringEntity]] · [[[Job]Jobs]] · [[[Command]Commands]] · [[[Controller]RecurringController]] · [[[Cross]CrossModuleDependencies]] · [[[Service]JournalEntryServices]]

## Source
`Modules/CompanyUser/Services/` (recurring-related)

## Services
| Service | Responsibility |
|---|---|
| `CalculateRecurringGenerateDate` | Calculates next generation date from `interval` (daily/weekly/monthly/quarterly/yearly) using Carbon |
| `HandleRecurringExternalIssues` | Called from [[[Cross]CrossModuleDependencies#Accounting]] `AccountObserver` and other modules when account/entity status changes; deactivates affected recurring entities |

## Cross-Module Generation Services
These live in other modules but are called by [[[Job]Jobs#GenerateRecurringEntityJob]]:
- `GenerateRecurringInvoiceService` → [[[Cross]CrossModuleDependencies#Sales]]
- `GenerateRecurringJournalEntryService` → [[[Cross]CrossModuleDependencies#Accounting]]

## Generation Flow
```
GenerateRecurringEntitiesCommand (cron)
  → GenerateRecurringEntityJob (queued per tenant)
      → RecurringEntity::scopeActive() - get due entities
      → entity_type == Invoice → GenerateRecurringInvoiceService
      → entity_type == JournalEntry → GenerateRecurringJournalEntryService
      → RecurringEntityLog::create(status, errors)
      → CalculateRecurringGenerateDate → update next_generate_date
      → Email sent if allow_send_emails = true
```
