# oca/contract architecture

> Architecture diagram of the GitHub repository oca/contract, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/oca/contract
- Repository: https://github.com/oca/contract

## Overview

This Odoo addon suite manages recurring contracts and subscriptions: users maintain contract terms and lines, then scheduled or manual actions generate invoices; a separate subscription app also supports lifecycle stages and pausing/closing. The map includes the documented addon capabilities, but several extension implementations are represented only by their exact addon directories because their source was not sampled. Edges are limited to relationships visible in excerpts or documented in the README.

Main entry points: [`contract/models/contract.py`](https://github.com/oca/contract/blob/19.0/contract/models/contract.py) (Contracts and terms), [`subscription_oca/models/sale_subscription.py`](https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription.py) (Subscription records), [`contract/models/contract_line.py`](https://github.com/oca/contract/blob/19.0/contract/models/contract_line.py) (Contract lines), [`contract/wizards/contract_manually_create_invoice.py`](https://github.com/oca/contract/blob/19.0/contract/wizards/contract_manually_create_invoice.py) (Manual invoicing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_contracts["Contract management"]
  node_contract_core["Contracts and terms<br/>[contract.py]"]
  node_contract_lines["Contract lines<br/>[contract_line.py]"]
  node_recurring_rules["Recurring rules"]
  node_templates["Contract templates"]
  node_template_lines["Template lines"]
  node_portal["Contract portal<br/>[main.py]"]
end

subgraph group_extensions["Contract extensions"]
  node_successor["Line successor lifecycle<br/>[contract_line.py]"]
  node_successor_rules["Successor constraints"]
  node_analytic_tags["Analytic tags"]
  node_delivery_zone["Delivery zone"]
  node_auto_validate["Invoice auto-validation"]
  node_payment_mode["Payment modes"]
  node_sale_contract["Contracts from sales"]
  node_termination["Contract termination"]
  node_last_invoiced["Invoice date repair"]
  node_variable_qty["Variable quantities"]
  node_prorated_qty["Prorated quantities"]
end

subgraph group_subscriptions["Subscriptions"]
  node_subscription["Subscription records"]
  node_subscription_lines["Subscription lines"]
  node_subscription_templates["Subscription templates"]
  node_subscription_stages["Subscription stages"]
  node_sub_close_pause["Pause and close"]
  node_sale_orders["Sales orders<br/>[sale_order.py]"]
end

subgraph group_billing["Billing"]
  node_manual_invoice["Manual invoicing"]
  node_invoice[("Invoices")]
end

node_user(("User"))
node_portal_customer(("Portal customer"))

node_user -->|"manages"| node_contract_core
node_user -->|"requests invoices"| node_manual_invoice
node_manual_invoice -->|"selects due contracts"| node_contract_core
node_manual_invoice -->|"creates via recurring action"| node_invoice
node_contract_core -->|"creates recurring invoices"| node_invoice
node_contract_core -->|"uses contract lines"| node_contract_lines
node_contract_core -.->|"uses recurring behavior"| node_recurring_rules
node_contract_core -.->|"uses templates"| node_templates
node_templates -.->|"defines template lines"| node_template_lines
node_portal_customer -->|"views contracts"| node_portal
node_portal -->|"searches contract records"| node_contract_core
node_contract_lines -.->|"adds analytic tags"| node_analytic_tags
node_contract_core -.->|"supports delivery zone"| node_delivery_zone
node_contract_core -.->|"supports invoice validation"| node_auto_validate
node_contract_core -.->|"supports payment mode"| node_payment_mode
node_sale_contract -.->|"creates contracts from sales"| node_contract_core
node_contract_lines -->|"extends lifecycle"| node_successor
node_successor -->|"checks allowed actions"| node_successor_rules
node_termination -.->|"extends termination"| node_contract_core
node_last_invoiced -.->|"repairs invoiced date"| node_contract_lines
node_variable_qty -.->|"extends quantity"| node_contract_lines
node_prorated_qty -.->|"extends quantity"| node_contract_lines
node_user -->|"manages subscriptions"| node_subscription
node_subscription -->|"uses subscription lines"| node_subscription_lines
node_subscription -.->|"uses templates"| node_subscription_templates
node_subscription -.->|"tracks stages"| node_subscription_stages
node_subscription -->|"creates invoices"| node_invoice
node_subscription -->|"creates sales orders"| node_sale_orders
node_sub_close_pause -.->|"updates lifecycle"| node_subscription

click node_contract_core "https://github.com/oca/contract/blob/19.0/contract/models/contract.py"
click node_contract_lines "https://github.com/oca/contract/blob/19.0/contract/models/contract_line.py"
click node_recurring_rules "https://github.com/oca/contract/blob/19.0/contract/models/contract_recurring_mixin.py"
click node_templates "https://github.com/oca/contract/blob/19.0/contract/models/contract_template.py"
click node_template_lines "https://github.com/oca/contract/blob/19.0/contract/models/contract_template_line.py"
click node_manual_invoice "https://github.com/oca/contract/blob/19.0/contract/wizards/contract_manually_create_invoice.py"
click node_portal "https://github.com/oca/contract/blob/19.0/contract/controllers/main.py"
click node_successor "https://github.com/oca/contract/blob/19.0/contract_line_successor/models/contract_line.py"
click node_successor_rules "https://github.com/oca/contract/blob/19.0/contract_line_successor/models/contract_line_constraints.py"
click node_analytic_tags "https://github.com/oca/contract/tree/19.0/contract_analytic_tag"
click node_delivery_zone "https://github.com/oca/contract/tree/19.0/contract_delivery_zone"
click node_auto_validate "https://github.com/oca/contract/tree/19.0/contract_invoice_auto_validate"
click node_payment_mode "https://github.com/oca/contract/tree/19.0/contract_payment_mode"
click node_sale_contract "https://github.com/oca/contract/tree/19.0/contract_sale"
click node_termination "https://github.com/oca/contract/tree/19.0/contract_termination"
click node_last_invoiced "https://github.com/oca/contract/tree/19.0/contract_update_last_date_invoiced"
click node_variable_qty "https://github.com/oca/contract/tree/19.0/contract_variable_quantity"
click node_prorated_qty "https://github.com/oca/contract/tree/19.0/contract_variable_qty_prorated"
click node_subscription "https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription.py"
click node_subscription_lines "https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription_line.py"
click node_subscription_templates "https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription_template.py"
click node_subscription_stages "https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription_stage.py"
click node_sub_close_pause "https://github.com/oca/contract/tree/19.0/subscription_oca/wizard"
click node_sale_orders "https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_order.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_contract_core,node_contract_lines,node_recurring_rules,node_templates,node_template_lines,node_portal,node_user toneBlue
class node_successor,node_successor_rules,node_analytic_tags,node_delivery_zone,node_auto_validate,node_payment_mode,node_sale_contract,node_termination,node_last_invoiced,node_variable_qty,node_prorated_qty toneAmber
class node_subscription,node_subscription_lines,node_subscription_templates,node_subscription_stages,node_sub_close_pause,node_sale_orders toneMint
class node_manual_invoice,node_invoice toneRose
class node_portal_customer toneIndigo
```

## Components

### Contract management

- [Contracts and terms](https://github.com/oca/contract/blob/19.0/contract/models/contract.py): `contract/models/contract.py`
- [Contract lines](https://github.com/oca/contract/blob/19.0/contract/models/contract_line.py): `contract/models/contract_line.py`
- [Recurring rules](https://github.com/oca/contract/blob/19.0/contract/models/contract_recurring_mixin.py): `contract/models/contract_recurring_mixin.py`
- [Contract templates](https://github.com/oca/contract/blob/19.0/contract/models/contract_template.py): `contract/models/contract_template.py`
- [Template lines](https://github.com/oca/contract/blob/19.0/contract/models/contract_template_line.py): `contract/models/contract_template_line.py`
- [Contract portal](https://github.com/oca/contract/blob/19.0/contract/controllers/main.py): `contract/controllers/main.py`

### Contract extensions

- [Line successor lifecycle](https://github.com/oca/contract/blob/19.0/contract_line_successor/models/contract_line.py): `contract_line_successor/models/contract_line.py`
- [Successor constraints](https://github.com/oca/contract/blob/19.0/contract_line_successor/models/contract_line_constraints.py): `contract_line_successor/models/contract_line_constraints.py`
- [Analytic tags](https://github.com/oca/contract/tree/19.0/contract_analytic_tag): `contract_analytic_tag`
- [Delivery zone](https://github.com/oca/contract/tree/19.0/contract_delivery_zone): `contract_delivery_zone`
- [Invoice auto-validation](https://github.com/oca/contract/tree/19.0/contract_invoice_auto_validate): `contract_invoice_auto_validate`
- [Payment modes](https://github.com/oca/contract/tree/19.0/contract_payment_mode): `contract_payment_mode`
- [Contracts from sales](https://github.com/oca/contract/tree/19.0/contract_sale): `contract_sale`
- [Contract termination](https://github.com/oca/contract/tree/19.0/contract_termination): `contract_termination`
- [Invoice date repair](https://github.com/oca/contract/tree/19.0/contract_update_last_date_invoiced): `contract_update_last_date_invoiced`
- [Variable quantities](https://github.com/oca/contract/tree/19.0/contract_variable_quantity): `contract_variable_quantity`
- [Prorated quantities](https://github.com/oca/contract/tree/19.0/contract_variable_qty_prorated): `contract_variable_qty_prorated`

### Subscriptions

- [Subscription records](https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription.py): `subscription_oca/models/sale_subscription.py`
- [Subscription lines](https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription_line.py): `subscription_oca/models/sale_subscription_line.py`
- [Subscription templates](https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription_template.py): `subscription_oca/models/sale_subscription_template.py`
- [Subscription stages](https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_subscription_stage.py): `subscription_oca/models/sale_subscription_stage.py`
- [Pause and close](https://github.com/oca/contract/tree/19.0/subscription_oca/wizard): `subscription_oca/wizard`
- [Sales orders](https://github.com/oca/contract/blob/19.0/subscription_oca/models/sale_order.py): `subscription_oca/models/sale_order.py`

### Billing

- [Manual invoicing](https://github.com/oca/contract/blob/19.0/contract/wizards/contract_manually_create_invoice.py): `contract/wizards/contract_manually_create_invoice.py`
- **Invoices**

### Other components

- **User**
- **Portal customer**

## Connections

- User → Contracts and terms: manages
- User → Manual invoicing: requests invoices (evidence: `contract/wizards/contract_manually_create_invoice.py`)
- Manual invoicing → Contracts and terms: selects due contracts (evidence: `contract/wizards/contract_manually_create_invoice.py`)
- Manual invoicing → Invoices: creates via recurring action (evidence: `contract/wizards/contract_manually_create_invoice.py`)
- Contracts and terms → Invoices: creates recurring invoices (evidence: `contract/models/contract.py`)
- Contracts and terms → Contract lines: uses contract lines (evidence: `contract/models/contract.py`)
- Contracts and terms → Recurring rules: uses recurring behavior
- Contracts and terms → Contract templates: uses templates
- Contract templates → Template lines: defines template lines
- Portal customer → Contract portal: views contracts (evidence: `contract/controllers/main.py`)
- Contract portal → Contracts and terms: searches contract records (evidence: `contract/controllers/main.py`)
- Contract lines → Analytic tags: adds analytic tags
- Contracts and terms → Delivery zone: supports delivery zone
- Contracts and terms → Invoice auto-validation: supports invoice validation
- Contracts and terms → Payment modes: supports payment mode
- Contracts from sales → Contracts and terms: creates contracts from sales
- Contract lines → Line successor lifecycle: extends lifecycle (evidence: `contract_line_successor/models/contract_line.py`)
- Line successor lifecycle → Successor constraints: checks allowed actions (evidence: `contract_line_successor/models/contract_line.py`)
- Contract termination → Contracts and terms: extends termination
- Invoice date repair → Contract lines: repairs invoiced date
- Variable quantities → Contract lines: extends quantity
- Prorated quantities → Contract lines: extends quantity
- User → Subscription records: manages subscriptions
- Subscription records → Subscription lines: uses subscription lines (evidence: `subscription_oca/models/sale_subscription.py`)
- Subscription records → Subscription templates: uses templates
- Subscription records → Subscription stages: tracks stages
- Subscription records → Invoices: creates invoices (evidence: `subscription_oca/models/sale_subscription.py`)
- Subscription records → Sales orders: creates sales orders
- Pause and close → Subscription records: updates lifecycle
