# mkarrit/facturation-devis architecture

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

- Interactive diagram: https://gitdiagram.com/mkarrit/facturation-devis
- Repository: https://github.com/mkarrit/facturation-devis

## Overview

Facturation & Devis is a WPF desktop application for managing a small business’s sales cycle, backed directly by PostgreSQL rather than an application server. A user maintains clients and articles, prepares and sends a quote, converts an accepted quote into an invoice, issues it with a definitive number, then records payment or creates a credit note. The graph captures the sampled client and invoice paths plus documented quote/PDF and dashboard capabilities. Some view-model and repository wiring is represented at directory level because those sources were not sampled.

Main entry points: [`src/Facturation.Desktop/ViewModels/ShellViewModel.cs`](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ShellViewModel.cs) (Shell navigation), [`src/Facturation.Infrastructure/Persistence/Repositories`](https://github.com/mkarrit/facturation-devis/tree/main/src/Facturation.Infrastructure/Persistence/Repositories) (Repositories and queries), [`src/Facturation.UseCases/Factures/FactureService.cs`](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Factures/FactureService.cs) (Invoice lifecycle), [`src/Facturation.UseCases/Devis/DevisService.cs`](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Devis/DevisService.cs) (Quote lifecycle)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_desktop["Desktop app"]
  node_shell["Shell navigation<br/>[ShellViewModel.cs]"]
  node_clients_ui["Client screen"]
  node_quotes_ui["Quote screens"]
  node_invoices_ui["Invoice screens"]
  node_catalog_ui["Articles screen"]
  node_dashboard_ui["Dashboard screen"]
  node_settings_ui["Company settings"]
  node_app["Startup and composition<br/>[App.xaml.cs]"]
end

subgraph group_usecases["Application workflows"]
  node_client_service["Client workflows<br/>[ClientService.cs]"]
  node_article_service["Article workflows<br/>[ArticleService.cs]"]
  node_quote_service["Quote lifecycle<br/>[DevisService.cs]"]
  node_invoice_service["Invoice lifecycle<br/>[FactureService.cs]"]
end

subgraph group_domain["Sales domain"]
  node_client_domain["Client records<br/>[Client.cs]"]
  node_sales_docs["Quote and invoice rules<br/>[Devis.cs]"]
  node_totals["Document totals<br/>[CalculTotaux.cs]"]
end

subgraph group_infra["Persistence and documents"]
  node_repositories["Repositories and queries<br/>[Repositories]"]
  node_numbering["Legal numbering"]
  node_pdf["PDF export<br/>[ExportateurPdf.cs]"]
  node_initializer["Database initialization"]
end

subgraph group_offline["Offline support"]
  node_connection["Connection monitor"]
  node_client_cache["Local client cache"]
  node_quote_queue["Offline quote queue"]
end

node_user(("Staff user"))
node_database[("PostgreSQL")]
node_pdf_reader["PDF viewer<br/>[OuvreurPdf.cs]"]

node_user -->|"uses"| node_shell
node_shell -->|"navigates"| node_clients_ui
node_shell -->|"navigates"| node_quotes_ui
node_shell -->|"navigates"| node_invoices_ui
node_shell -->|"navigates"| node_catalog_ui
node_shell -->|"navigates"| node_dashboard_ui
node_shell -->|"navigates"| node_settings_ui
node_clients_ui -->|"invokes"| node_client_service
node_client_service -->|"creates or edits"| node_client_domain
node_client_service -->|"loads and saves"| node_repositories
node_catalog_ui -->|"invokes"| node_article_service
node_article_service -->|"loads and saves"| node_repositories
node_quotes_ui -->|"invokes"| node_quote_service
node_quote_service -->|"loads and saves"| node_repositories
node_quote_service -->|"applies lifecycle rules"| node_sales_docs
node_quote_service -->|"calculates totals"| node_totals
node_quotes_ui -->|"requests export"| node_pdf
node_invoices_ui -->|"invokes"| node_invoice_service
node_invoice_service -->|"loads and saves"| node_repositories
node_invoice_service -->|"applies lifecycle rules"| node_sales_docs
node_invoice_service -->|"emits with number"| node_numbering
node_invoice_service -->|"calculates totals"| node_totals
node_invoices_ui -->|"requests export"| node_pdf
node_pdf_reader -->|"opens PDF for"| node_user
node_dashboard_ui -->|"loads dashboard data"| node_repositories
node_settings_ui -->|"loads and saves"| node_repositories
node_app -->|"initializes database"| node_initializer
node_initializer -->|"migrates and seeds"| node_database
node_repositories -->|"reads and writes"| node_database
node_numbering -->|"locks and updates counter"| node_database
node_connection -->|"checks connectivity"| node_database
node_client_cache -.->|"stores client copies from"| node_database
node_quote_queue -.->|"syncs queued quotes"| node_database

click node_shell "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ShellViewModel.cs"
click node_clients_ui "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ClientsViewModel.cs"
click node_quotes_ui "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/DevisEditorViewModel.cs"
click node_invoices_ui "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/FactureEditorViewModel.cs"
click node_catalog_ui "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ArticlesViewModel.cs"
click node_dashboard_ui "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/TableauDeBordViewModel.cs"
click node_settings_ui "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ParametresSocieteViewModel.cs"
click node_app "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/App.xaml.cs"
click node_client_service "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Clients/ClientService.cs"
click node_article_service "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Articles/ArticleService.cs"
click node_quote_service "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Devis/DevisService.cs"
click node_invoice_service "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Factures/FactureService.cs"
click node_client_domain "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Domain/Clients/Client.cs"
click node_sales_docs "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Domain/Devis/Devis.cs"
click node_totals "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Domain/Calculs/CalculTotaux.cs"
click node_repositories "https://github.com/mkarrit/facturation-devis/tree/main/src/Facturation.Infrastructure/Persistence/Repositories"
click node_numbering "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Infrastructure/Persistence/Repositories/NumerotationRepository.cs"
click node_pdf "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Infrastructure/Pdf/ExportateurPdf.cs"
click node_initializer "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Infrastructure/Persistence/DatabaseInitializer.cs"
click node_connection "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/Services/MoniteurConnexion.cs"
click node_client_cache "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/Services/CacheClientsLocal.cs"
click node_quote_queue "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/Services/FileAttenteDevisHorsLigne.cs"
click node_pdf_reader "https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/Services/OuvreurPdf.cs"

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_shell,node_clients_ui,node_quotes_ui,node_invoices_ui,node_catalog_ui,node_dashboard_ui,node_settings_ui,node_app,node_user,node_pdf_reader toneBlue
class node_client_service,node_article_service,node_quote_service,node_invoice_service,node_database toneAmber
class node_client_domain,node_sales_docs,node_totals toneMint
class node_repositories,node_numbering,node_pdf,node_initializer toneRose
class node_connection,node_client_cache,node_quote_queue toneIndigo
```

## Components

### Desktop app

- [Shell navigation](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ShellViewModel.cs): `src/Facturation.Desktop/ViewModels/ShellViewModel.cs`
- [Client screen](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ClientsViewModel.cs): `src/Facturation.Desktop/ViewModels/ClientsViewModel.cs`
- [Quote screens](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/DevisEditorViewModel.cs): `src/Facturation.Desktop/ViewModels/DevisEditorViewModel.cs`
- [Invoice screens](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/FactureEditorViewModel.cs): `src/Facturation.Desktop/ViewModels/FactureEditorViewModel.cs`
- [Articles screen](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ArticlesViewModel.cs): `src/Facturation.Desktop/ViewModels/ArticlesViewModel.cs`
- [Dashboard screen](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/TableauDeBordViewModel.cs): `src/Facturation.Desktop/ViewModels/TableauDeBordViewModel.cs`
- [Company settings](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/ViewModels/ParametresSocieteViewModel.cs): `src/Facturation.Desktop/ViewModels/ParametresSocieteViewModel.cs`
- [Startup and composition](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/App.xaml.cs): `src/Facturation.Desktop/App.xaml.cs`

### Application workflows

- [Client workflows](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Clients/ClientService.cs): `src/Facturation.UseCases/Clients/ClientService.cs`
- [Article workflows](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Articles/ArticleService.cs): `src/Facturation.UseCases/Articles/ArticleService.cs`
- [Quote lifecycle](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Devis/DevisService.cs): `src/Facturation.UseCases/Devis/DevisService.cs`
- [Invoice lifecycle](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.UseCases/Factures/FactureService.cs): `src/Facturation.UseCases/Factures/FactureService.cs`

### Sales domain

- [Client records](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Domain/Clients/Client.cs): `src/Facturation.Domain/Clients/Client.cs`
- [Quote and invoice rules](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Domain/Devis/Devis.cs): `src/Facturation.Domain/Devis/Devis.cs`
- [Document totals](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Domain/Calculs/CalculTotaux.cs): `src/Facturation.Domain/Calculs/CalculTotaux.cs`

### Persistence and documents

- [Repositories and queries](https://github.com/mkarrit/facturation-devis/tree/main/src/Facturation.Infrastructure/Persistence/Repositories): `src/Facturation.Infrastructure/Persistence/Repositories`
- [Legal numbering](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Infrastructure/Persistence/Repositories/NumerotationRepository.cs): `src/Facturation.Infrastructure/Persistence/Repositories/NumerotationRepository.cs`
- [PDF export](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Infrastructure/Pdf/ExportateurPdf.cs): `src/Facturation.Infrastructure/Pdf/ExportateurPdf.cs`
- [Database initialization](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Infrastructure/Persistence/DatabaseInitializer.cs): `src/Facturation.Infrastructure/Persistence/DatabaseInitializer.cs`

### Offline support

- [Connection monitor](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/Services/MoniteurConnexion.cs): `src/Facturation.Desktop/Services/MoniteurConnexion.cs`
- [Local client cache](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/Services/CacheClientsLocal.cs): `src/Facturation.Desktop/Services/CacheClientsLocal.cs`
- [Offline quote queue](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/Services/FileAttenteDevisHorsLigne.cs): `src/Facturation.Desktop/Services/FileAttenteDevisHorsLigne.cs`

### Other components

- **Staff user**
- **PostgreSQL**
- [PDF viewer](https://github.com/mkarrit/facturation-devis/blob/main/src/Facturation.Desktop/Services/OuvreurPdf.cs): `src/Facturation.Desktop/Services/OuvreurPdf.cs`

## Connections

- Staff user → Shell navigation: uses
- Shell navigation → Client screen: navigates
- Shell navigation → Quote screens: navigates
- Shell navigation → Invoice screens: navigates
- Shell navigation → Articles screen: navigates
- Shell navigation → Dashboard screen: navigates
- Shell navigation → Company settings: navigates
- Client screen → Client workflows: invokes
- Client workflows → Client records: creates or edits
- Client workflows → Repositories and queries: loads and saves
- Articles screen → Article workflows: invokes
- Article workflows → Repositories and queries: loads and saves
- Quote screens → Quote lifecycle: invokes
- Quote lifecycle → Repositories and queries: loads and saves
- Quote lifecycle → Quote and invoice rules: applies lifecycle rules
- Quote lifecycle → Document totals: calculates totals
- Quote screens → PDF export: requests export
- Invoice screens → Invoice lifecycle: invokes
- Invoice lifecycle → Repositories and queries: loads and saves
- Invoice lifecycle → Quote and invoice rules: applies lifecycle rules
- Invoice lifecycle → Legal numbering: emits with number
- Invoice lifecycle → Document totals: calculates totals
- Invoice screens → PDF export: requests export
- PDF viewer → Staff user: opens PDF for
- Dashboard screen → Repositories and queries: loads dashboard data
- Company settings → Repositories and queries: loads and saves
- Startup and composition → Database initialization: initializes database
- Database initialization → PostgreSQL: migrates and seeds
- Repositories and queries → PostgreSQL: reads and writes
- Legal numbering → PostgreSQL: locks and updates counter
- Connection monitor → PostgreSQL: checks connectivity
- Local client cache → PostgreSQL: stores client copies from
- Offline quote queue → PostgreSQL: syncs queued quotes
