Documentation développeur Caisses Caisse v2 Technique Architecture
November 26, 2025 at 2:48 AMArchitecture 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
- Services de calcul (
-
@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
-
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
- Récupération de l’environnement (
-
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
-
Souscription aux notifications Kafka
- Mises à jour en temps réel du territoire, entreprise, cinéma, POS
Gestion du panier
-
Création/Modification :
BasketComposerService- Ajout de lignes (produits, séances)
- Calcul des prix et taxes via
PosMathService - Persistance automatique via
PosBasketApiService.persist()
-
Calcul :
PosMathService.computeBasketReal()- Calcul des prix HT
- Application des réductions (cartes, prépayés)
- Calcul des taxes
- Calcul des totaux
-
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 POSopen(args): Ouverture de session (synchrone)close(args): Fermeture de session
-
PosBasketApiService:persist(params): Sauvegarde du panier (synchrone ou asynchrone selonfinalize)
-
PosSessionApiService:getById(id): Récupération d’une sessiongetBankDepositSlip(id): Génération du bordereau de remise
Kafka
- Notifications en temps réel :
- Mises à jour du territoire, entreprise, cinéma, POS
- Utilisation de
KafkaNotifServicepour 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