# Accounting Business Rules

Date: 2026-05-05

## 1. Ecritures comptables

Source principale: `modules/account/move.py`.

### Move

- `account.move` porte un numero interne `number`, un `post_number`, une
  societe, une periode, un journal, une date effective, une date de post et des
  lignes.
- Un move draft peut etre modifie; un move posted ne doit pas etre modifie hors
  champs explicitement toleres.
- A la creation, le numero est tire de la sequence du journal si absent.
- La date ajuste la periode si la date sort de la periode courante.
- Le posting refuse:
  - un move sans ligne;
  - un move non equilibre dans la devise societe.
- Au `post`, le move recoit `state = posted`, `post_date` et `post_number`.
- Les lignes a zero sur comptes reconciliables peuvent etre letrees
  automatiquement.

### Move Line

- `account.move.line` porte debit, credit, compte, party, devise seconde,
  montant devise seconde, taxes, maturity date et reconciliation.
- La validite des lignes suit l'equilibre du move.
- Le lettrage groupe compte, party et devise.
- Si une devise seconde est presente, le solde de reconciliation peut etre lu
  dans cette devise plutot que dans la devise societe.

## 2. Comptes

Source principale: `modules/account/account.py`.

- Les comptes sont rattaches a une societe et a un type de compte.
- Les types de compte portent les categories structurantes:
  assets, receivable, payable, debt, revenue, expense, stock.
- Les comptes peuvent etre fermes, reconciliables, ou exiger une party.
- Les comptes portent aussi des indicateurs Tradon ajoutes:
  `fx_eval`, `fx_eval_detail`, comptes de gain/perte de change.
- Les soldes sont calcules par contexte: societe, periodes, dates, posted only.

## 3. Factures

Source principale: `modules/account_invoice/invoice.py`.

### Workflow

Etats:

- `draft`
- `validated`
- `posted`
- `paid`
- `cancelled`

Regles:

- Une facture fournisseur exige une date de facture des `Validate`.
- Une facture client standard exige la date au `Post`, mais ce repository a
  modifie le flux pour creer aussi le move et le numero client au `Validate`.
- `posted` represente le posting comptable.
- `paid` depend du lettrage des lignes a payer.
- `cancelled` cree ou reference les moves d'annulation selon le contexte.

### Montants et taxes

- `untaxed_amount`, `tax_amount`, `total_amount` sont caches et recalcules.
- Les taxes de lignes alimentent les taxes calculees de facture.
- Les taxes manuelles sont preservees lors de `update_taxes`.
- Une ligne produit genere des `account.tax.line` de type `base`.
- Une ligne de taxe facture genere une move line avec `account.tax.line` de
  type `tax`; si la taxe est manuelle, une ligne `base` complementaire peut
  etre ajoutee.
- La devise seconde est portee par `account.move.line`, pas par
  `account.tax.line`.

### Paiements

- `lines_to_pay` expose les lignes comptables ouvertes a payer.
- `payment_lines` rattache les lignes de paiement a la facture.
- Le wizard `account.invoice.pay` cree/reconcilie les paiements selon la
  methode de paiement.
- Les wizards de reschedule/delegate agissent sur les lignes a payer.

## 4. Devises

Regles notees dans `notes/business_rules.md` et vues dans le code:

- `account.move.line.rate` est un champ stocke/editable dans ce repository.
- Le sens du taux suit Tryton: devise seconde / devise societe.
- Montant societe = `amount_second_currency / rate` quand la devise societe a
  une base a 1.
- Les lignes facture generees doivent renseigner `rate` quand elles portent
  `amount_second_currency`.
- Un fallback central sur `account.move.line.create` calcule le taux manquant
  depuis les montants.
- La revaluation FX Tradon cree des moves de revaluation sur comptes marques
  `fx_eval`.

## 5. Reconciliation

Source principale: `modules/account/move.py`.

- Les comptes reconciliables peuvent etre letres automatiquement ou via wizard.
- Le wizard de reconciliation cherche les comptes avec lignes ouvertes, puis
  les parties, puis les devises.
- Il peut proposer uniquement les combinaisons balancees, ou creer un write-off
  si un ecart reste.
- La devise de reconciliation est la devise seconde si elle existe, sinon la
  devise du compte/societe.

## 6. Statements

Source principale: `modules/account_statement/statement.py`.

- Un statement a des lignes, origines, solde de depart/fin, devise et journal.
- La validation controle solde, montants et nombre de lignes selon la
  configuration.
- Le posting cree les moves des lignes.
- La reconciliation des lignes relie les lignes statement aux lignes comptables.

## 7. Stock et couts

Source principale: modules `account_stock_*`.

- Les modules stock comptables generent des moves depuis les mouvements stock
  selon methode continental/anglo-saxon.
- Les landed costs et shipment costs creent des objets dedies, allocation sur
  mouvements/shipments, puis posting comptable.
- Dans `purchase_trade`, les fees peuvent creer des mouvements de stock/cout
  supplementaires lies aux lots.

