# edx/enterprise-subsidy architecture

> Architecture diagram of the GitHub repository edx/enterprise-subsidy, 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/edx/enterprise-subsidy
- Repository: https://github.com/edx/enterprise-subsidy

## Overview

enterprise-subsidy is a Django service for capturing and balancing enterprise-funded transactions. Its principal workflow exposes subsidy and transaction operations through versioned APIs; subsidy logic obtains content details and pricing, creates ledger transactions, and coordinates enrollment or other fulfillment. Reversal handling also responds to ledger events and can process recent enterprise unenrollments. The graph preserves documented and indexed product areas, but some links are omitted because their implementation was not excerpted; dashed links mark integrations whose wiring is not verified here.

Main entry points: [`enterprise_subsidy/apps/subsidy/models.py`](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/subsidy/models.py) (Subsidy and ledger), [`enterprise_subsidy/apps/fulfillment/api.py`](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/fulfillment/api.py) (Fulfillment operations), [`enterprise_subsidy/apps/transaction/api.py`](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/transaction/api.py) (Transaction operations), [`enterprise_subsidy/apps/api/v1/serializers.py`](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/serializers.py) (API serializers)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API surface"]
  node_v1routes["Version 1 routes<br/>[urls.py]"]
  node_v1transactions["Transaction views<br/>[transaction.py]"]
  node_v1subsidies["Subsidy views<br/>[subsidy.py]"]
  node_metadata_view["Metadata views"]
  node_v1serializers["API serializers<br/>[serializers.py]"]
  node_v2routes["Version 2 routes<br/>[urls.py]"]
  node_deposit_view["Deposit views<br/>[deposit.py]"]
  node_v2transactions["Version 2 transactions<br/>[transaction.py]"]
  node_deposit_serializer["Deposit serializers<br/>[deposits.py]"]
  node_paginator["Transaction pagination<br/>[paginators.py]"]
end

subgraph group_domain["Subsidy domain"]
  node_subsidies[("Subsidy and ledger<br/>[models.py]")]
  node_subsidy_api["Subsidy operations<br/>[api.py]"]
  node_transactions["Transaction operations<br/>[api.py]"]
end

subgraph group_integrations["External services"]
  node_metadata["Content metadata<br/>[api.py]"]
  node_enterprise_client["Enterprise client<br/>[enterprise.py]"]
  node_catalog_client["Catalog client"]
  node_lms_client["LMS user client<br/>[lms_user.py]"]
  node_fulfillment["Fulfillment operations<br/>[api.py]"]
end

subgraph group_events["Events and reversals"]
  node_event_bus["Ledger event publisher<br/>[event_bus.py]"]
  node_reversal_handler["Reversal handlers<br/>[handlers.py]"]
  node_reversal_command["Unenrollment reversal job"]
end

node_client(("API client"))
node_ledger_events(("Ledger event source"))
node_enterprise_service["Enterprise service"]
node_catalog_service["Catalog service"]
node_lms["LMS"]
node_geag["GEAG service"]
node_event_consumers(("Open edX event consumers"))

node_client -.->|"calls"| node_v1routes
node_client -.->|"calls"| node_v2routes
node_v1transactions -->|"uses"| node_v1serializers
node_v1transactions -->|"uses"| node_paginator
node_v1transactions -->|"queries"| node_subsidies
node_v1serializers -->|"serializes"| node_subsidies
node_v1serializers -->|"uses"| node_fulfillment
node_v2transactions -->|"uses"| node_subsidies
node_v2transactions -->|"uses"| node_fulfillment
node_v2transactions -->|"uses"| node_v1serializers
node_subsidy_api -->|"operates"| node_subsidies
node_subsidies -->|"requests details"| node_metadata
node_subsidies -->|"requests enrollment"| node_enterprise_client
node_subsidies -->|"uses"| node_catalog_client
node_subsidies -->|"requests user data"| node_lms_client
node_subsidies -->|"requests fulfillment"| node_fulfillment
node_subsidies -->|"publishes events"| node_event_bus
node_metadata -->|"queries"| node_catalog_client
node_enterprise_client -->|"HTTP requests"| node_enterprise_service
node_fulfillment -->|"creates allocation"| node_geag
node_transactions -->|"uses"| node_enterprise_client
node_transactions -->|"uses"| node_fulfillment
node_transactions -->|"publishes events"| node_event_bus
node_event_bus -->|"emits events"| node_event_consumers
node_ledger_events -->|"signals reversal"| node_reversal_handler
node_reversal_handler -->|"cancels fulfillment"| node_transactions
node_reversal_handler -->|"publishes reversal"| node_event_bus
node_reversal_command -->|"fetches unenrollments"| node_enterprise_client
node_reversal_command -->|"delegates reversal"| node_reversal_handler
node_catalog_client -.->|"queries"| node_catalog_service
node_lms_client -.->|"queries"| node_lms

click node_v1routes "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/urls.py"
click node_v1transactions "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/views/transaction.py"
click node_v1subsidies "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/views/subsidy.py"
click node_metadata_view "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/views/content_metadata.py"
click node_v1serializers "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/serializers.py"
click node_v2routes "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v2/urls.py"
click node_deposit_view "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v2/views/deposit.py"
click node_v2transactions "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v2/views/transaction.py"
click node_deposit_serializer "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v2/serializers/deposits.py"
click node_subsidies "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/subsidy/models.py"
click node_subsidy_api "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/subsidy/api.py"
click node_transactions "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/transaction/api.py"
click node_paginator "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/paginators.py"
click node_metadata "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/content_metadata/api.py"
click node_enterprise_client "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api_client/enterprise.py"
click node_catalog_client "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api_client/enterprise_catalog.py"
click node_lms_client "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api_client/lms_user.py"
click node_fulfillment "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/fulfillment/api.py"
click node_event_bus "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/core/event_bus.py"
click node_reversal_handler "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/transaction/signals/handlers.py"
click node_reversal_command "https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.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_v1routes,node_v1transactions,node_v1subsidies,node_metadata_view,node_v1serializers,node_v2routes,node_deposit_view,node_v2transactions,node_deposit_serializer,node_paginator,node_client toneBlue
class node_subsidies,node_subsidy_api,node_transactions toneAmber
class node_metadata,node_enterprise_client,node_catalog_client,node_lms_client,node_fulfillment toneMint
class node_event_bus,node_reversal_handler,node_reversal_command toneRose
class node_ledger_events,node_enterprise_service,node_catalog_service,node_lms,node_geag,node_event_consumers toneIndigo
```

## Components

### API surface

- [Version 1 routes](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/urls.py): `enterprise_subsidy/apps/api/v1/urls.py`
- [Transaction views](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/views/transaction.py): `enterprise_subsidy/apps/api/v1/views/transaction.py`
- [Subsidy views](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/views/subsidy.py): `enterprise_subsidy/apps/api/v1/views/subsidy.py`
- [Metadata views](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/views/content_metadata.py): `enterprise_subsidy/apps/api/v1/views/content_metadata.py`
- [API serializers](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v1/serializers.py): `enterprise_subsidy/apps/api/v1/serializers.py`
- [Version 2 routes](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v2/urls.py): `enterprise_subsidy/apps/api/v2/urls.py`
- [Deposit views](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v2/views/deposit.py): `enterprise_subsidy/apps/api/v2/views/deposit.py`
- [Version 2 transactions](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v2/views/transaction.py): `enterprise_subsidy/apps/api/v2/views/transaction.py`
- [Deposit serializers](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/v2/serializers/deposits.py): `enterprise_subsidy/apps/api/v2/serializers/deposits.py`
- [Transaction pagination](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api/paginators.py): `enterprise_subsidy/apps/api/paginators.py`

### Subsidy domain

- [Subsidy and ledger](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/subsidy/models.py): `enterprise_subsidy/apps/subsidy/models.py`
- [Subsidy operations](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/subsidy/api.py): `enterprise_subsidy/apps/subsidy/api.py`
- [Transaction operations](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/transaction/api.py): `enterprise_subsidy/apps/transaction/api.py`

### External services

- [Content metadata](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/content_metadata/api.py): `enterprise_subsidy/apps/content_metadata/api.py`
- [Enterprise client](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api_client/enterprise.py): `enterprise_subsidy/apps/api_client/enterprise.py`
- [Catalog client](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api_client/enterprise_catalog.py): `enterprise_subsidy/apps/api_client/enterprise_catalog.py`
- [LMS user client](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/api_client/lms_user.py): `enterprise_subsidy/apps/api_client/lms_user.py`
- [Fulfillment operations](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/fulfillment/api.py): `enterprise_subsidy/apps/fulfillment/api.py`

### Events and reversals

- [Ledger event publisher](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/core/event_bus.py): `enterprise_subsidy/apps/core/event_bus.py`
- [Reversal handlers](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/transaction/signals/handlers.py): `enterprise_subsidy/apps/transaction/signals/handlers.py`
- [Unenrollment reversal job](https://github.com/edx/enterprise-subsidy/blob/main/enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.py): `enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.py`

### Other components

- **API client**
- **Ledger event source**
- **Enterprise service**
- **Catalog service**
- **LMS**
- **GEAG service**
- **Open edX event consumers**

## Connections

- API client → Version 1 routes: calls
- API client → Version 2 routes: calls
- Transaction views → API serializers: uses (evidence: `enterprise_subsidy/apps/api/v1/views/transaction.py`)
- Transaction views → Transaction pagination: uses (evidence: `enterprise_subsidy/apps/api/v1/views/transaction.py`)
- Transaction views → Subsidy and ledger: queries (evidence: `enterprise_subsidy/apps/api/v1/views/transaction.py`)
- API serializers → Subsidy and ledger: serializes (evidence: `enterprise_subsidy/apps/api/v1/serializers.py`)
- API serializers → Fulfillment operations: uses (evidence: `enterprise_subsidy/apps/api/v1/serializers.py`)
- Version 2 transactions → Subsidy and ledger: uses (evidence: `enterprise_subsidy/apps/api/v2/views/transaction.py`)
- Version 2 transactions → Fulfillment operations: uses (evidence: `enterprise_subsidy/apps/api/v2/views/transaction.py`)
- Version 2 transactions → API serializers: uses (evidence: `enterprise_subsidy/apps/api/v2/views/transaction.py`)
- Subsidy operations → Subsidy and ledger: operates (evidence: `enterprise_subsidy/apps/subsidy/api.py`)
- Subsidy and ledger → Content metadata: requests details (evidence: `enterprise_subsidy/apps/subsidy/models.py`)
- Subsidy and ledger → Enterprise client: requests enrollment (evidence: `enterprise_subsidy/apps/subsidy/models.py`)
- Subsidy and ledger → Catalog client: uses (evidence: `enterprise_subsidy/apps/subsidy/models.py`)
- Subsidy and ledger → LMS user client: requests user data (evidence: `enterprise_subsidy/apps/subsidy/models.py`)
- Subsidy and ledger → Fulfillment operations: requests fulfillment (evidence: `enterprise_subsidy/apps/subsidy/models.py`)
- Subsidy and ledger → Ledger event publisher: publishes events (evidence: `enterprise_subsidy/apps/subsidy/models.py`)
- Content metadata → Catalog client: queries (evidence: `enterprise_subsidy/apps/content_metadata/api.py`)
- Enterprise client → Enterprise service: HTTP requests (evidence: `enterprise_subsidy/apps/api_client/enterprise.py`)
- Fulfillment operations → GEAG service: creates allocation (evidence: `enterprise_subsidy/apps/fulfillment/api.py`)
- Transaction operations → Enterprise client: uses (evidence: `enterprise_subsidy/apps/transaction/api.py`)
- Transaction operations → Fulfillment operations: uses (evidence: `enterprise_subsidy/apps/transaction/api.py`)
- Transaction operations → Ledger event publisher: publishes events (evidence: `enterprise_subsidy/apps/transaction/api.py`)
- Ledger event publisher → Open edX event consumers: emits events (evidence: `enterprise_subsidy/apps/core/event_bus.py`)
- Ledger event source → Reversal handlers: signals reversal
- Reversal handlers → Transaction operations: cancels fulfillment (evidence: `enterprise_subsidy/apps/transaction/signals/handlers.py`)
- Reversal handlers → Ledger event publisher: publishes reversal (evidence: `enterprise_subsidy/apps/transaction/signals/handlers.py`)
- Unenrollment reversal job → Enterprise client: fetches unenrollments (evidence: `enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.py`)
- Unenrollment reversal job → Reversal handlers: delegates reversal (evidence: `enterprise_subsidy/apps/transaction/management/commands/write_reversals_from_enterprise_unenrollments.py`)
- Catalog client → Catalog service: queries
- LMS user client → LMS: queries
