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

# RecurringEntity

## Connections
[[_CompanyUser]] · [[[Model]User]] · [[[Model]JournalEntry]] · [[[Controller]RecurringController]] · [[[Service]RecurringServices]] · [[[Job]Jobs]] · [[[Command]Commands]] · [[[DB]DatabaseTables]] · [[[Cross]CrossModuleDependencies]]

## Source
```
Modules/CompanyUser/Models/RecurringEntity.php
Modules/CompanyUser/Models/RecurringEntityLog.php
```

## Responsibilities
- Configures a document (Invoice or JournalEntry) to be auto-generated on a schedule
- `RecurringEntityLog` records every generation attempt — success or failure
- Polymorphic `entity()` relation points to the source document being cloned

## Key Relationships

| Relation | Type | Target |
|---|---|---|
| createdBy | belongsTo | [[[Model]User]] |
| recurringEntityLogs | hasMany | RecurringEntityLog |
| entity | morphTo | [[[Cross]CrossModuleDependencies#Sales]] Invoice or [[[Cross]CrossModuleDependencies#Accounting]] JournalEntry |
| RecurringEntityLog.createdEntity | morphTo | Newly generated entity |

## Key Columns (recurring_entities)
`entity_type` · `entity_id` · `start_date` · `end_date` · `recurring_status` · `interval` · `next_generate_date` · `created_by` · `emails` (JSON) · `allow_send_emails`

## Scopes
`scopeActive()` — filters active recurring entities

## Generation Flow
```
Commands::GenerateRecurringEntitiesCommand (cron)
  → GenerateRecurringEntityJob (per tenant)
      → Find RecurringEntities where next_generate_date = today
      → GenerateRecurringInvoiceService or GenerateRecurringJournalEntryService
      → RecurringEntityLog created (success/failure)
      → next_generate_date recalculated via CalculateRecurringGenerateDate
      → Email sent if allow_send_emails = true
```

## Traits
`SoftDeletes` · `UsesTenantConnection`
