Architecture de la caisse v2

Vue d’ensemble

La caisse v2 est une application Angular standalone qui fonctionne en mode synchrone pour les opérations critiques (paiements, finalisation) et utilise des processus asynchrones pour les interactions avec Odoo.

Arborescence du projet

caisse-ui/
├── src/
│   ├── app/
│   │   ├── app.component.ts
│   │   ├── app.component.html
│   │   ├── app.component.scss
│   │   ├── app.config.ts
│   │   ├── app.routes.ts
│   │   │
│   │   ├── bootseq/                    # Séquence de démarrage
│   │   │   ├── bootseq.component.ts
│   │   │   ├── bootseq.component.html
│   │   │   └── bootseq.component.scss
│   │   │
│   │   ├── caisse/                      # Composant principal de la caisse
│   │   │   ├── caisse.component.ts
│   │   │   ├── caisse.component.html
│   │   │   ├── caisse.component.scss
│   │   │   └── booting/                 # Composant d'écran de démarrage
│   │   │       ├── booting.component.ts
│   │   │       ├── booting.component.html
│   │   │       └── booting.component.scss
│   │   │
│   │   ├── clock/                       # Composant horloge
│   │   │   ├── clock.component.ts
│   │   │   ├── clock.component.html
│   │   │   └── clock.component.scss
│   │   │
│   │   ├── diagnostics/                 # Outils de diagnostic
│   │   │   ├── diagnostics.component.ts
│   │   │   ├── diagnostics.component.html
│   │   │   ├── diagnostics.component.scss
│   │   │   └── escpos/                  # Tests d'impression ESC/POS
│   │   │       ├── testprintmodal.component.ts
│   │   │       ├── testprintmodal.component.html
│   │   │       └── testprintmodal.component.scss
│   │   │
│   │   ├── paycard/                     # Modal de paiement par carte abonnement
│   │   │   ├── paycard.component.ts
│   │   │   └── paycard.component.html
│   │   │
│   │   ├── payprepaid/                  # Modal de paiement par prépayé
│   │   │   ├── payprepaid.component.ts
│   │   │   └── payprepaid.component.html
│   │   │
│   │   ├── paytpe/                      # Modal de paiement TPE
│   │   │   ├── paytpe.component.ts
│   │   │   └── paytpe.component.html
│   │   │
│   │   ├── payvoucher/                  # Modal de paiement par voucher
│   │   │   ├── payvoucher.component.ts
│   │   │   └── payvoucher.component.html
│   │   │
│   │   ├── pos/                         # Service point de vente
│   │   │   └── pointofsale.service.ts
│   │   │
│   │   ├── posclose/                    # Modal de fermeture de session
│   │   │   ├── posclose.component.ts
│   │   │   ├── posclose.component.html
│   │   │   ├── posclose.component.scss
│   │   │   └── bank-deposit-confirm-modal.component.ts
│   │   │       └── bank-deposit-confirm-modal.component.html
│   │   │
│   │   ├── posopen/                     # Modal d'ouverture de session
│   │   │   ├── posopen.component.ts
│   │   │   ├── posopen.component.html
│   │   │   ├── posopen.component.scss
│   │   │   ├── poscontinue.component.ts
│   │   │   ├── poscontinue.component.html
│   │   │   └── poscontinue.component.scss
│   │   │
│   │   ├── posstatusbar/                # Barre de statut POS
│   │   │   ├── posstatusbar.component.ts
│   │   │   ├── posstatusbar.component.html
│   │   │   └── posstatusbar.component.scss
│   │   │
│   │   ├── service/                     # Services de gestion de la caisse
│   │   │   ├── caisse.service.ts        # Service principal de la caisse
│   │   │   ├── caisse.properties.ts     # Propriétés de base de la caisse
│   │   │   └── status.ts                # Énumération des statuts
│   │   │
│   │   ├── services/                   # Services supplémentaires
│   │   │   └── card-manager.service.ts
│   │   │
│   │   ├── sessions/                    # Composant de gestion des sessions
│   │   │   ├── sessions.component.ts
│   │   │   ├── sessions.component.html
│   │   │   └── sessions.component.scss
│   │   │
│   │   └── work/                        # Composant de travail (mode preview)
│   │       ├── work.component.ts
│   │       ├── work.component.html
│   │       └── work.component.scss
│   │
│   ├── assets/                          # Ressources statiques
│   │   ├── env.json
│   │   ├── icon-user.svg
│   │   ├── isi-qr.png
│   │   ├── isi-qr.svg
│   │   ├── isi.png
│   │   ├── isi.svg
│   │   ├── logo-cinecity.svg
│   │   └── ...
│   │
│   ├── _styles.scss                     # Styles globaux
│   ├── spinner.scss                     # Styles du spinner
│   ├── index.html                       # Point d'entrée HTML
│   └── main.ts                          # Point d'entrée TypeScript
│
├── nginx.conf.template                  # Configuration Nginx
├── tsconfig.app.json                    # Configuration TypeScript (app)
└── tsconfig.spec.json                   # Configuration TypeScript (tests)

Bibliothèque partagée : core-lib

Les services et composants partagés sont situés dans projects/core-lib/src/lib/ :

core-lib/src/lib/
├── caisse/
│   └── basketcomposer.service.ts        # Service de composition du panier
│
├── components/
│   ├── posbasketcomposer/               # Composant d'affichage du panier
│   ├── paycash/                         # Modal de paiement en espèce
│   ├── posinterfacetabproducts/         # Onglet produits
│   ├── posinterfacetabshowstoday/       # Onglet séances du jour
│   ├── posinterfacetabshowspresale/     # Onglet séances prévente
│   ├── posinterfacetabcardrefill/       # Onglet recharge carte
│   ├── posinterfacetabvoucher/          # Onglet vouchers
│   ├── posinterfacetabusersessions/     # Onglet sessions utilisateur
│   ├── posinterfacetabwebwithdrawal/    # Onglet retraits web
│   └── ...
│
├── services/
│   └── finalize-basket.service.ts       # Service de finalisation du panier
│
├── apis/                                # Services API pour le backend
│   ├── posbasket.service.ts
│   ├── pointofsale.service.ts
│   ├── possession.service.ts
│   ├── card.service.ts
│   ├── prepaid.service.ts
│   └── ...
│
├── models/                              # Modèles de données
│   ├── posbasket.ts
│   ├── possession.ts
│   ├── pointofsale.ts
│   └── ...
│
├── posmath.service.ts                   # Service de calcul mathématique
└── odoomath.ts                          # Utilitaires mathématiques

Structure des modules

Module principal : caisse-ui

Application Angular standalone située dans projects/caisse-ui/.

Dépendances principales

  • @hickson/core-lib : Bibliothèque partagée contenant :

    • Services de calcul (PosMathService, BasketComposerService)
    • Composants réutilisables (PosBasketComposerComponent, modaux de paiement)
    • Modèles de données (PosBasket, PosSession, PosData)
    • Services API pour la communication backend
  • @hardware/hwproxy : Proxy pour l’accès au matériel (imprimante, tiroir caisse)

  • @isilib/kafka-notif : Service de notifications Kafka pour les mises à jour en temps réel

Architecture des données

Modèle de données principal

PosData {
  territory: Territory
  company: Company
  cinema: Cinema
  pos: PointOfSale
  products: Product[]
  showsOfDay: ShowConsolidated[]
  showsPresale: ShowConsolidated[]
  // ...
}

PosBasket {
  id: string
  sessionId: string
  posId: string
  cinemaId: string
  status: BasketStatus
  finalizeStatus: BasketFinalizeStatus
  lines: PosBasketLine[]
  payment: {
    paymentDetails: PosBasketPaymentEntry[]
    taxesDetails: TaxAmount[]
    totalHT: number
    totalHTDiscounted: number
    totalWithTaxReal: number
    totalPaid: number
    totalRemaining: number
    changeReturned: number
  }
  // ...
}

PosSession {
  id: string
  opened: number
  opener: string
  openCash: number
  // ...
}

Flux de données

Initialisation

  1. Démarrage de l’application : CaisseService.start()

    • Récupération de l’environnement (EnvironmentService)
    • Vérification de la connexion hardware (HwProxyService)
    • Récupération du hostname de la machine
  2. Chargement des données POS : PointOfSaleApiService.getPosData()

    • Récupération des données du point de vente
    • Vérification de l’état de la session courante
    • Chargement des séances du jour et des produits
  3. Souscription aux notifications Kafka

    • Mises à jour en temps réel du territoire, entreprise, cinéma, POS

Gestion du panier

  1. Création/Modification : BasketComposerService

    • Ajout de lignes (produits, séances)
    • Calcul des prix et taxes via PosMathService
    • Persistance automatique via PosBasketApiService.persist()
  2. Calcul : PosMathService.computeBasketReal()

    • Calcul des prix HT
    • Application des réductions (cartes, prépayés)
    • Calcul des taxes
    • Calcul des totaux
  3. Persistance : File d’attente dans BasketComposerService

    • Une seule opération de persistance à la fois
    • Queue avec remplacement si nouvelle opération avant la fin de la précédente

Communication avec le backend

API REST

  • PointOfSaleApiService :

    • getPosData(hostname, date) : Récupération des données POS
    • open(args) : Ouverture de session (synchrone)
    • close(args) : Fermeture de session
  • PosBasketApiService :

    • persist(params) : Sauvegarde du panier (synchrone ou asynchrone selon finalize)
  • PosSessionApiService :

    • getById(id) : Récupération d’une session
    • getBankDepositSlip(id) : Génération du bordereau de remise

Kafka

  • Notifications en temps réel :
    • Mises à jour du territoire, entreprise, cinéma, POS
    • Utilisation de KafkaNotifService pour s’abonner aux changements

Gestion du matériel

HwProxyService

Service proxy pour l’accès au matériel via @hardware/hwproxy :

  • Imprimante ESC/POS : Impression des tickets
  • Tiroir caisse : Ouverture automatique lors des paiements en espèce
  • TPE : Gestion des paiements par carte

Séparation des responsabilités

CaisseService

Gère l’état global de la caisse :

  • Statut de la caisse (CaisseStatus)
  • Données POS (PosData)
  • Session courante (PosSession)
  • Panier actif (PosBasket)

BasketComposerService

Gère la composition et le calcul du panier :

  • Ajout/suppression de lignes
  • Calcul des prix et taxes
  • Persistance du panier
  • Affichage formaté (DisplayBasket)

PosMathService

Service de calcul mathématique :

  • Calcul des prix HT/TTC
  • Application des taxes
  • Calcul des réductions (cartes, prépayés)
  • Gestion des arrondis pour les paiements en espèce

FinalizeBasketService

Gère la finalisation du panier :

  • Validation du paiement
  • Persistance finale
  • Génération des tickets
  • Impression