GS.Caisse 4.0
Gestion Commerciale Intégrée
CHARGEMENT…
{{ notificationMessage }}

Consolidation des Caisses

ID Compil Caisse Nom d'Utilisateur
Ouverture Fermeture
Nom d'Utilisateur Recette Perçu Dépense Virement
{{ formatMontant(b.recettePercu) }} Ar {{ formatMontant(-Math.abs(b.depense)) }} Ar {{ formatMontant(b.virement) }} Ar
Aucun billetage trouvé
Sommes CA des Com Espèce {{ formatMontant(compilData.sommeCaisse) }} {{ currencySymbol }}
Sommes CA des Com Chèque {{ formatMontant(compilData.sommeCheque) }} {{ currencySymbol }}
Sommes CA des Com Virement {{ formatMontant(compilData.sommeVirement) }} {{ currencySymbol }}
Différence {{ formatMontant(compilDifference) }} {{ currencySymbol }}
Perçu Espèce {{ formatMontant(compilPercuEspece) }} {{ currencySymbol }}
Observation
Totaux des Dépenses {{ formatMontant(-Math.abs(compilData.sommeDepense)) }} {{ currencySymbol }}
Recette Total {{ formatMontant(compilData.recetteTotal) }} {{ currencySymbol }}
Total Couverts {{ compilData.totalCouverts }}
{{ b.label }} {{ formatMontant(compilData.billets[b.key] * b.value) }} {{ currencySymbol }}
Total Billets : {{ currencySymbol }}
Total Pièces : {{ currencySymbol }}
Perçu Espèce
{{ formatMontant(compilPercuEspece) }} {{ currencySymbol }}
Fond De Caisse
{{ formatMontant(compilData.fondDeCaisse) }} {{ currencySymbol }}

GS.Caisse 4.0

Archive d'Activité
×
Compte {{ loggedInUser || '…' }} Aujourd'hui
Archive Mouvement de Stock
Les dates se choisissent dans l'écran suivant. Période max : 31 jours.
Rotation de Stock
Bon de Livraison et Bon de Sortie
Bon de Commande et Avance
Avance Client
Fournisseur
{{ listeRefVideTitle }}
{{ listeRefVideSubtitle }}
Chargement…
✓ Aucune référence vide — toutes les références allouées ont été consommées.
{{ r.IDArchive }}
{{ listeRefVideRows.length }} référence{{ listeRefVideRows.length > 1 ? 's' : '' }} vide{{ listeRefVideRows.length > 1 ? 's' : '' }}
⭐ Rapport Journalier de {{ synthPersonnelUser }}
⭐ Détail de Compte — {{ synthPersonnelUser }} · {{ synthBilletageInfo.id }} (ouvert)
⭐ Synthèse des Recettes Perçues
Depuis l'ouverture de Caisse ({{ formatSynthDate(synthFiltres.dateDebut) }} {{ formatSynthTime(synthFiltres.dateDebut) }}) jusqu'à maintenant ({{ formatSynthDate(synthFiltres.dateFin) }} {{ formatSynthTime(synthFiltres.dateFin) }}) Du {{ formatSynthDate(synthFiltres.dateDebut) }} {{ formatSynthTime(synthFiltres.dateDebut) }} au {{ formatSynthDate(synthFiltres.dateFin) }} {{ formatSynthTime(synthFiltres.dateFin) }} TVA {{ synthRecettes.tvaConfig.taux }}% ({{ synthRecettes.tvaConfig.mode }}) Régime sans TVA (synthétique)
×
Chargement…
PAR ORIGINE
Source Brut Remise TVA Net (TTC) Détail
Ventes Comptant {{ formatSynthMontant(synthRecettes.origine.venteComptant.brut) }} {{ formatSynthMontant(synthRecettes.origine.venteComptant.remise) }} {{ formatSynthMontant(synthRecettes.origine.venteComptant.tva) }} {{ formatSynthMontant(synthRecettes.origine.venteComptant.ttc) }}
Acomptes sur BC (HT) {{ formatSynthMontant(synthRecettes.origine.acompteBC.net) }}
RAP perçus (BL/Vente Crédit/BC Client) {{ formatSynthMontant(synthRecettes.origine.rapPercu.net) }}
TOTAL RECETTES {{ formatSynthMontant(synthRecettes.origine.totalRecette) }}
− Dépenses de caisse ({{ formatSynthMontant(synthRecettes.depense) }})
= RECETTE NETTE {{ formatSynthMontant(synthRecettes.recetteNette) }}
PAR MOYEN DE PAIEMENT
Moyen Montant % Détail
💵 Espèce {{ formatSynthMontant(synthRecettes.moyen.espece) }} {{ synthRecettes.moyen.pctEspece }} %
📄 Chèque (encaissé) {{ formatSynthMontant(synthRecettes.moyen.cheque) }} {{ synthRecettes.moyen.pctCheque }} %
🏦 Virement (encaissé) {{ formatSynthMontant(synthRecettes.moyen.virement) }} {{ synthRecettes.moyen.pctVirement }} %
Total encaissé {{ formatSynthMontant(synthRecettes.moyen.total) }} 100 %
{{ synthRecettes.coherence.ok ? '✓' : '⚠' }} Cohérence : Total Origine = {{ formatSynthMontant(synthRecettes.coherence.totalOrigine) }} · Total Moyen = {{ formatSynthMontant(synthRecettes.coherence.totalMoyen) }} · Écart = {{ formatSynthMontant(synthRecettes.coherence.ecart) }} (à investiguer) · OK
À RECEVOIR (informatif, hors recette)
Ventes Débiteur du jour (BL/BC créés sur la période) {{ formatSynthMontant(synthRecettes.aRecevoir.ventesDebiteurJour) }}
Chèques en attente (Payer=False) {{ formatSynthMontant(synthRecettes.aRecevoir.chequesEnAttente) }}
Virements en attente {{ formatSynthMontant(synthRecettes.aRecevoir.virementsEnAttente) }}
Rapport journalier de {{ synthPersonnelUser }} · Depuis {{ formatSynthDate(synthRecettes.filtres.dateDebut) }} {{ formatSynthTime(synthRecettes.filtres.dateDebut) }} jusqu'au {{ formatSynthDate(synthRecettes.filtres.dateFin) }} {{ formatSynthTime(synthRecettes.filtres.dateFin) }} · Généré le {{ formatSynthDate(new Date()) }} {{ formatSynthTime(new Date()) }} Détail de Compte — {{ synthPersonnelUser }} · {{ synthBilletageInfo.id }} · Du {{ formatSynthDate(synthRecettes.filtres.dateDebut) }} {{ formatSynthTime(synthRecettes.filtres.dateDebut) }} au {{ formatSynthDate(synthRecettes.filtres.dateFin) }} {{ formatSynthTime(synthRecettes.filtres.dateFin) }} · Généré le {{ formatSynthDate(new Date()) }} {{ formatSynthTime(new Date()) }} Généré le {{ formatSynthDate(new Date()) }} · Filtre : {{ formatSynthDate(synthRecettes.filtres.dateDebut) }} → {{ formatSynthDate(synthRecettes.filtres.dateFin) }} · User : {{ synthRecettes.filtres.user }}
{{ labelDrillType(synthDrillType) }}
×
Aucune ligne
N° Facture{{ sortIndicator('IDVente') }} Client{{ sortIndicator('Client_label') }} Table{{ sortIndicator('Tbl_Nom') }} Couvert{{ sortIndicator('NbrPrs') }} Date{{ sortIndicator('DteDeVente') }} Serveur{{ sortIndicator('Serveur') }} Brut{{ sortIndicator('MontantBrut') }} Remise{{ sortIndicator('RemiseVal') }} TVA{{ sortIndicator('TVA') }} TTC{{ sortIndicator('MontantTTC') }} Mode{{ sortIndicator('_moyen') }}
Débiteur {{ v.IDVente }} {{ v.NomCli || v.IDClient }} {{ v.Tbl_Nom || '' }} {{ v.NbrPrs || 0 }} {{ formatSynthDate(v.DteDeVente) }} {{ v.Serveur }} {{ formatSynthMontant(v.MontantBrut) }} {{ formatSynthMontant(v.RemiseVal) }} {{ formatSynthMontant(v.TVA) }} {{ formatSynthMontant(v.MontantTTC) }} {{ v._moyen }}
TOTAL Comptant ({{ countVentesComptant }} vente{{ countVentesComptant > 1 ? 's' : '' }}) {{ sumDrillField('NbrPrs') }} {{ formatSynthMontant(sumDrillField('MontantBrut')) }} {{ formatSynthMontant(sumDrillField('RemiseVal')) }} {{ formatSynthMontant(sumDrillField('TVA')) }} {{ formatSynthMontant(sumDrillField('MontantTTC')) }}
Débiteur {{ countDebiteurs }} facture{{ countDebiteurs > 1 ? 's' : '' }} issue(s) de BL/BC soldé — montant non compté ici, comptabilisé dans RAP perçus.
N° BC{{ sortIndicator('IDVente') }} Client{{ sortIndicator('Client_label') }} Date{{ sortIndicator('Dte') }} User{{ sortIndicator('User') }} Mode{{ sortIndicator('_moyen') }} Poste{{ sortIndicator('IdPoste') }} Montant (HT){{ sortIndicator('MontantAcompte') }}
{{ v.IDVente }} {{ v.NomCli || v.IDClient }} {{ formatSynthDate(v.Dte) }} {{ v.User }} {{ v._moyen }} {{ v.IdPoste }} {{ formatSynthMontant(v.MontantAcompte) }}
Client{{ sortIndicator('Client_label') }} Libellé{{ sortIndicator('Libelle') }} Date{{ sortIndicator('dteOperation') }} User{{ sortIndicator('NomUser') }} Montant{{ sortIndicator('SoldeDebitClient') }}
{{ v.NomCli || v.IDClient }} BC {{ v.Libelle }} {{ formatSynthDate(v.dteOperation) }} {{ v.NomUser }} {{ formatSynthMontant(v.SoldeDebitClient) }}
Banque{{ sortIndicator('Banque') }} Numéro{{ sortIndicator('Numero') }} Propriétaire{{ sortIndicator('Proprietaire') }} N° Opération{{ sortIndicator('IDVente') }} Date{{ sortIndicator('DteDePaiement') }} Montant{{ sortIndicator('Montant') }}
{{ v.Banque }} {{ v.Numero }} {{ v.Proprietaire }} {{ v.IDVente }} {{ formatSynthDate(v.DteDePaiement) }} {{ formatSynthMontant(v.Montant) }}
Banque{{ sortIndicator('Banque') }} N° Opération{{ sortIndicator('IDVente') }} Date{{ sortIndicator('DteDeVirement') }} Montant{{ sortIndicator('Montant') }}
{{ v.Banque }} {{ v.IDVente }} {{ formatSynthDate(v.DteDeVirement) }} {{ formatSynthMontant(v.Montant) }}
N° Dépense{{ sortIndicator('IDVente') }} Bénéficiaire{{ sortIndicator('Client_label') }} Date{{ sortIndicator('DteDeVente') }} User{{ sortIndicator('User') }} Observation{{ sortIndicator('Observation') }} Montant{{ sortIndicator('MontantTTC') }}
{{ v.IDVente }} {{ v.NomCli || v.IDClient }} {{ formatSynthDate(v.DteDeVente) }} {{ v.User }} {{ v.Observation }} {{ formatSynthMontant(Math.abs(v.MontantTTC)) }}
{{ synthDrillData.length }} ligne(s)
{{ archiveVentesMode === 'annulees' ? 'Archive des Ventes Annulées' : 'Archive des Ventes' }}
×
({{ archiveVenteCurrent.IDAvoir }})
Code Barre Désignation Unité Qté Prix Unitaire Montant Action
Annulée {{ d.CodeBarre || '' }} {{ d.NomProduit || d.IDproduit }} {{ d.UnitProduit || '' }} {{ d.QteVendu || 0 }} {{ formatBilletageMontant(d.PrixUnitaire) }} {{ formatBilletageMontant(d.MontantTotalVnt) }} ✖ annulée
Aucune ligne produit
Observation
Mode de paiement
Type de vente
Chargement…
{{ archiveVentesIndex + 1 }} / {{ archiveVentesList.length }}
📋 Journal des Ventes de {{ (journalVentesPersoInfo && journalVentesPersoInfo.user) || loggedInUser }}
Depuis l'ouverture de Caisse ({{ formatSynthDate(journalVentesPersoInfo.dateDebut) }} {{ formatSynthTime(journalVentesPersoInfo.dateDebut) }}) jusqu'à maintenant ({{ formatSynthDate(journalVentesPersoInfo.dateFin) }} {{ formatSynthTime(journalVentesPersoInfo.dateFin) }})
Du {{ formatSynthDate(journalVentesPersoInfo.dateDebut) }} au {{ formatSynthDate(journalVentesPersoInfo.dateFin) }} · Utilisateur : {{ journalVentesPersoInfo.user }}
×
Vue :
Date{{ sortIndicatorJournalPerso('DteDeVente') }} N° Facture{{ sortIndicatorJournalPerso('IDVente') }} Produit{{ sortIndicatorJournalPerso('NomProduit') }} Qté{{ sortIndicatorJournalPerso('SommeDeQteVendu') }} PU{{ sortIndicatorJournalPerso('PrixUnitaire') }} Montant{{ sortIndicatorJournalPerso('SommeDeMontantTotalVnt') }} Montant Remisé{{ sortIndicatorJournalPerso('Prixremiser') }} Marge{{ sortIndicatorJournalPerso('MargeBenefique') }} Serveur{{ sortIndicatorJournalPerso('Serveur') }} Client{{ sortIndicatorJournalPerso('NomClient') }}
{{ formatSynthDate(r.DteDeVente) }} Débiteur {{ r.IDVente }} {{ r.NomProduit || r.IDproduit }} {{ r.SommeDeQteVendu || 0 }} {{ formatBilletageMontant(r.PrixUnitaire) }} {{ formatBilletageMontant(r.SommeDeMontantTotalVnt) }} {{ formatBilletageMontant(r.Prixremiser) }} {{ formatBilletageMontant(r.MargeBenefique) }} {{ r.Serveur || '' }} {{ r.NomClient || '' }}
Chargement… Aucune vente dans votre session de caisse
TOTAL Comptant ({{ journalVentesPersoTotaux().nbComptant }} ligne{{ journalVentesPersoTotaux().nbComptant > 1 ? 's' : '' }}) {{ journalVentesPersoTotaux().tQte }} {{ formatBilletageMontant(journalVentesPersoTotaux().tVente) }} {{ formatBilletageMontant(journalVentesPersoTotaux().tRemise) }} {{ formatBilletageMontant(journalVentesPersoTotaux().tMarge) }}
Débiteur {{ journalVentesPersoTotaux().nbDebiteurs }} ligne{{ journalVentesPersoTotaux().nbDebiteurs > 1 ? 's' : '' }} issue{{ journalVentesPersoTotaux().nbDebiteurs > 1 ? 's' : '' }} de BL/BC soldé — montant non compté ici, comptabilisé dans RAP perçus.
# Produit Qté Vendue CA (Montant) Marge Part Répartition
#{{ i+1 }} {{ p.nomProduit }} {{ p.qte }} {{ formatBilletageMontant(p.ca) }} {{ formatBilletageMontant(p.marge) }} {{ p.pct.toFixed(1) }}%
Chargement… Aucune vente
TOTAL ({{ journalVentesPalmares.length }} produit{{ journalVentesPalmares.length > 1 ? 's' : '' }}) {{ journalVentesPalmaresTotaux.tQte }} {{ formatBilletageMontant(journalVentesPalmaresTotaux.tCA) }} {{ formatBilletageMontant(journalVentesPalmaresTotaux.tMarge) }} 100,0%
Palmarès calculé sur les ventes comptant uniquement (les lignes Débiteur sont exclues pour cohérence avec le CA réel perçu).
{{ journalBLNewType === 'res' ? '🛏 Journal Détail des Réservations' : '📋 Journal Détail des BL' }}
Entre {{ formatSynthDate(journalBLInfoNew.dateDebut) }} et {{ formatSynthDate(journalBLInfoNew.dateFin) }} · Utilisateur : {{ journalBLInfoNew.user }} · État : {{ journalBLEtatLabel(journalBLInfoNew.etat) }} · Âge ≥ {{ journalBLInfoNew.anciennete }} jours
×
Vue :
ID Sortie BL{{ sortIndicatorJournalBL('IDSortieBL') }} Livraison{{ sortIndicatorJournalBL('DteDeSortieBL') }} Nom Client{{ sortIndicatorJournalBL('NomClient') }} Nom du Produit{{ sortIndicatorJournalBL('NomProduit') }} Qté{{ sortIndicatorJournalBL('Qte') }} Prix{{ sortIndicatorJournalBL('Prix') }} Montant{{ sortIndicatorJournalBL('Montant') }} État
{{ r.IDSortieBL }} {{ formatVenteDateHeure(r.DteDeSortieBL) }} {{ r.NomClient || r.IDClient }} {{ r.NomProduit || r.IDproduit }} {{ r.Qte }} {{ formatBilletageMontant(r.Prix) }} {{ formatBilletageMontant(r.Montant) }} {{ journalBLEtatBadge(r).label }}
Chargement… Aucun BL {{ journalBLEtatLabel().toLowerCase() }} sur la période
TOTAL RAP ({{ journalBLTotaux().nbBLs }} BL distincts) {{ journalBLTotaux().tQte }} {{ formatBilletageMontant(journalBLTotaux().tRAP) }}
ID Sortie BL{{ sortIndicatorJournalBL('IDSortieBL') }} Livraison{{ sortIndicatorJournalBL('DteDeSortieBL') }} Âge Nom Client{{ sortIndicatorJournalBL('NomClient') }} Montant TTC{{ sortIndicatorJournalBL('MontantTTC') }} Acompte{{ sortIndicatorJournalBL('Acompte') }} RAP{{ sortIndicatorJournalBL('RAP') }} État Détail
{{ r.IDSortieBL }} {{ formatVenteDateHeure(r.DteDeSortieBL) }} {{ ageBadge(r.DteDeSortieBL).label }} {{ r.NomClient || r.IDClient }} {{ formatBilletageMontant(r.MontantTTC) }} {{ formatBilletageMontant(r.Acompte) }} {{ formatBilletageMontant(r.RAP) }} {{ journalBLEtatBadge(r).label }}
Chargement… Aucun BL {{ journalBLEtatLabel().toLowerCase() }} sur la période (âge ≥ {{ journalBLNewAnciennete }} jours)
TOTAL ({{ journalBLNewList.length }} BL) {{ formatBilletageMontant(journalBLFactureTotaux().tMontantTTC) }} {{ formatBilletageMontant(journalBLFactureTotaux().tAcompte) }} {{ formatBilletageMontant(journalBLFactureTotaux().tRAP) }}
{{ loggedInUser || '' }}
{{ archiveBLMode === 'res' ? 'Archive Réservation' : 'Archive Bon de Livraison' }}
×
BL {{ archiveBLCurrentIdx + 1 }} sur {{ archiveBLList.length }} · Chargement…
ID Produit Désignation Unité PU Quantité Livré Montant
{{ d.IDproduit }} {{ d.NomProduit || d.IDproduit }} {{ d.UnitProduit || '' }} {{ formatBilletageMontant(d.PrixAffiche) }} {{ d.QteSortieBL }} {{ formatBilletageMontant(d.Montant) }}
Aucune ligne produit
Chargement… Aucun Bon de Livraison enregistré.
{{ isAccessTrue(archiveBLCurrent.AnnulerOuiNon) ? '✓ BL déjà retourné' : '✓ BL déjà facturé' }}
Motif d'Annulation du BL
⚠ Acompte à rembourser : {{ formatBilletageMontant(archiveBLCurrent.Acompte) }}
Une Dépense de Caisse sera créée automatiquement. Choisissez le mode de paiement du remboursement :
Note : le Chèque est exclu des dépenses de caisse (pratique comptable).
Cette opération entraînera le retour en stock automatique des produits du BL.
{{ loggedInUser || '' }}
Archive Bon de Sortie
×
BS {{ archiveBSCurrentIdx + 1 }} sur {{ archiveBSList.length }} · Chargement…
ID Produit Désignation Unité Quantité Sortie
{{ d.IDproduit }} {{ d.NomProduit || d.IDproduit }} {{ d.UnitProduit || '' }} {{ d.QteSortieBS }}
Aucune ligne produit
Chargement… Aucun Bon de Sortie enregistré.
📦 Journal Détail des BS
Entre {{ formatSynthDate(journalBSInfo.dateDebut) }} et {{ formatSynthDate(journalBSInfo.dateFin) }} · Utilisateur : {{ journalBSInfo.user }} · Sortie interne de stock (lecture seule)
×
Vue :
ID Sortie BS{{ sortIndicatorJournalBS('IDSortieBS') }} Date Sortie{{ sortIndicatorJournalBS('DteDeSortieBS') }} Client{{ sortIndicatorJournalBS('NomClient') }} Nom du Produit{{ sortIndicatorJournalBS('NomProduit') }} Unité Qté{{ sortIndicatorJournalBS('Qte') }}
{{ r.IDSortieBS }} {{ formatVenteDateHeure(r.DteDeSortieBS) }} {{ r.NomClient || r.IDClient }} {{ r.NomProduit || r.IDproduit }} {{ r.UnitProduit || '' }} {{ r.Qte }}
Chargement… Aucun BS sur la période
TOTAL ({{ journalBSTotaux().nbBS }} BS distincts) {{ journalBSTotaux().tQte }}
ID Sortie BS{{ sortIndicatorJournalBS('IDSortieBS') }} Date Sortie{{ sortIndicatorJournalBS('DteDeSortieBS') }} Client{{ sortIndicatorJournalBS('NomClient') }} Lignes{{ sortIndicatorJournalBS('NbLignes') }} Total Qté{{ sortIndicatorJournalBS('TotalQte') }} Détail
{{ r.IDSortieBS }} {{ formatVenteDateHeure(r.DteDeSortieBS) }} {{ r.NomClient || r.IDClient }} {{ r.NbLignes }} {{ r.TotalQte }}
Chargement… Aucun BS sur la période
TOTAL ({{ journalBSList.length }} BS) {{ journalBSBSTotaux().tLignes }} {{ journalBSBSTotaux().tQte }}
{{ loggedInUser || '' }}
Archive Commande Client
×
BC {{ archiveBCCurrentIdx + 1 }} sur {{ archiveBCList.length }} · Chargement…
{{ isAccessTrue(archiveBCCurrent.AnnulerOuiNon) ? '✓ BC déjà annulé' : '✓ BC déjà livré' }}
Code Barre Désignation Unité Qté Prix Unitaire Montant Total
{{ d.CodeBarre || '' }} {{ d.NomProduit || d.IDproduit }} {{ d.UnitProduit || '' }} {{ d.QteCommandee }} {{ formatBilletageMontant(d.PrixAffiche) }} {{ formatBilletageMontant(d.Montant) }}
Aucune ligne produit
Chargement… Aucun Bon de Commande client enregistré.
Motif d'Annulation du Bon de Commande
💰 Acompte déjà payé : {{ formatBilletageMontant(archiveBCCurrent.Acompte) }}
Chèque exclu (pratique comptable).
Le BC sera marqué comme annulé. Les stocks ne sont pas touchés (la sortie n'était pas encore effectuée). Le RAPBC du client sera recalculé.
📋 Journal des BC Client
Entre {{ formatSynthDate(journalBCInfo.dateDebut) }} et {{ formatSynthDate(journalBCInfo.dateFin) }} · Utilisateur : {{ journalBCInfo.user }} · État : {{ journalBCEtatLabel(journalBCInfo.etat) }}
×
Vue :
ID Commande{{ sortIndicatorJournalBC('IDVente') }} Date Commande{{ sortIndicatorJournalBC('DteDeCommande') }} Nom Client{{ sortIndicatorJournalBC('NomClient') }} Nom du Produit{{ sortIndicatorJournalBC('NomProduit') }} Qté{{ sortIndicatorJournalBC('Qte') }} Prix{{ sortIndicatorJournalBC('Prix') }} Montant{{ sortIndicatorJournalBC('Montant') }} État
{{ r.IDVente }} {{ formatVenteDateHeure(r.DteDeCommande) }} {{ r.NomClient || r.IDClient }} {{ r.NomProduit || r.IDproduit }} {{ r.Qte }} {{ formatBilletageMontant(r.Prix) }} {{ formatBilletageMontant(r.Montant) }} {{ journalBCEtatBadge(r).label }}
Chargement… Aucun BC {{ journalBCEtatLabel().toLowerCase() }} sur la période
TOTAL RAP ({{ journalBCTotaux().nbBCs }} BC distincts) {{ journalBCTotaux().tQte }} {{ formatBilletageMontant(journalBCTotaux().tRAP) }}
ID Commande{{ sortIndicatorJournalBC('IDVente') }} Date Commande{{ sortIndicatorJournalBC('DteDeCommande') }} Nom Client{{ sortIndicatorJournalBC('NomClient') }} Montant TTC{{ sortIndicatorJournalBC('MontantTTC') }} Acompte{{ sortIndicatorJournalBC('Acompte') }} RAP{{ sortIndicatorJournalBC('RAP') }} État Détail
{{ r.IDVente }} {{ formatVenteDateHeure(r.DteDeCommande) }} {{ r.NomClient || r.IDClient }} {{ formatBilletageMontant(r.MontantTTC) }} {{ formatBilletageMontant(r.Acompte) }} {{ formatBilletageMontant(r.RAP) }} {{ journalBCEtatBadge(r).label }}
Chargement… Aucun BC {{ journalBCEtatLabel().toLowerCase() }} sur la période
TOTAL ({{ journalBCList.length }} BC) {{ formatBilletageMontant(journalBCBcTotaux().tMontantTTC) }} {{ formatBilletageMontant(journalBCBcTotaux().tAcompte) }} {{ formatBilletageMontant(journalBCBcTotaux().tRAP) }}
{{ loggedInUser || '' }}
Archive Commande vers Fournisseur
×
BC {{ archiveBCFrnsCurrentIdx + 1 }} sur {{ archiveBCFrnsList.length }} · Chargement…
{{ isAccessTrue(archiveBCFrnsCurrent.Livrer) ? '✓ BC livré' : '✓ BC annulé' }}
ID Produit Désignation Unité Qté Commandé Prix Unitaire HT Montant Commande
{{ d.IDproduit }} {{ d.NomProduit || d.IDproduit }} {{ d.UnitProduit || '' }} {{ d.QteCommande }} {{ formatBilletageMontant(d.PrixUnitaire) }} {{ formatBilletageMontant(d.MontantTotalCmnd) }}
Aucune ligne produit
{{ archiveBCFrnsCurrent.MontantTTCEnLettre }}
Chargement… Aucun Bon de Commande Fournisseur enregistré.
Motif d'Annulation du Bon de Commande Fournisseur
Le BC Fournisseur sera marqué comme annulé. Aucun impact sur le stock (la livraison n'a pas encore eu lieu).
📋 Journal des BC Fournisseur
Entre {{ formatSynthDate(journalBCFrnsInfo.dateDebut) }} et {{ formatSynthDate(journalBCFrnsInfo.dateFin) }} · Utilisateur : {{ journalBCFrnsInfo.user }} · État : {{ journalBCFrnsEtatLabel(journalBCFrnsInfo.etat) }}
×
Vue :
Réf. Commande{{ sortIndicatorJournalBCFrns('RefComndFrns') }} Date Commande{{ sortIndicatorJournalBCFrns('DtedCmndFrns') }} Fournisseur{{ sortIndicatorJournalBCFrns('NomFrns') }} Nom du Produit{{ sortIndicatorJournalBCFrns('NomProduit') }} Qté{{ sortIndicatorJournalBCFrns('Qte') }} Prix HT{{ sortIndicatorJournalBCFrns('Prix') }} Montant{{ sortIndicatorJournalBCFrns('Montant') }} État
{{ r.RefComndFrns }} {{ formatVenteDateHeure(r.DtedCmndFrns) }} {{ frnsLabel(r) }} {{ r.NomProduit || r.IDproduit }} {{ r.Qte }} {{ formatBilletageMontant(r.Prix) }} {{ formatBilletageMontant(r.Montant) }} {{ journalBCFrnsEtatBadge(r).label }}
Chargement… Aucun BC Frns {{ journalBCFrnsEtatLabel().toLowerCase() }} sur la période
TOTAL ({{ journalBCFrnsTotaux().nbBCs }} BC distincts) {{ journalBCFrnsTotaux().tQte }} {{ formatBilletageMontant(journalBCFrnsTotaux().tMontant) }}
Réf. Commande{{ sortIndicatorJournalBCFrns('RefComndFrns') }} Date Commande{{ sortIndicatorJournalBCFrns('DtedCmndFrns') }} Fournisseur{{ sortIndicatorJournalBCFrns('NomFrns') }} Montant HT{{ sortIndicatorJournalBCFrns('MontantHT') }} TVA{{ sortIndicatorJournalBCFrns('TVAValeur') }} Montant TTC{{ sortIndicatorJournalBCFrns('MontantTTC') }} État Détail
{{ r.RefComndFrns }} {{ formatVenteDateHeure(r.DtedCmndFrns) }} {{ frnsLabel(r) }} {{ formatBilletageMontant(r.MontantHT) }} {{ formatBilletageMontant(r.TVAValeur) }} {{ formatBilletageMontant(r.MontantTTC) }} {{ journalBCFrnsEtatBadge(r).label }}
Chargement… Aucun BC Frns {{ journalBCFrnsEtatLabel().toLowerCase() }} sur la période
TOTAL ({{ journalBCFrnsList.length }} BC) {{ formatBilletageMontant(journalBCFrnsBcTotaux().tMontantHT) }} {{ formatBilletageMontant(journalBCFrnsBcTotaux().tTVA) }} {{ formatBilletageMontant(journalBCFrnsBcTotaux().tMontantTTC) }}
{{ archiveApproMode === 'impayer' ? 'Archive Appro Impayé' : (archiveApproMode === 'retour' ? 'Archive Retour' : 'Archive Appro') }}
×
Appro {{ archiveApproCurrentIdx + 1 }} sur {{ archiveApproList.length }} · Chargement…
Code Barre Désignation Unité Qté Prix d'Achat HT Montant Appro
{{ d.CodeBarre || '' }} {{ d.NomProduit || d.IDproduit }} {{ d.UnitProduit || '' }} {{ d.Qteachete || 0 }} {{ formatBilletageMontant(d.PrixAchatUnitaireTTC) }} {{ formatBilletageMontant(d.MontantApproTbl) }}
Aucune ligne produit
Chargement… {{ archiveApproMode === 'impayer' ? 'Aucun appro impayé.' : 'Aucun approvisionnement enregistré.' }}
Paiement RAP Appro
💰 Recette Totale Disponible
{{ formatBilletageMontant(paiementRapRecetteTotale) }}
Règlement
Consultation Transformation de Produit
×
Transformation {{ archiveTransfoCurrentIdx + 1 }} sur {{ archiveTransfoList.length }} · Chargement…
Produit Obtenu
Produit {{ (archiveTransfoCurrent.UnitProduit || 'Unité') + ' Obtenue' }} Unité
{{ archiveTransfoCurrent.NomProduit || archiveTransfoCurrent.IDproduit }} {{ archiveTransfoCurrent.QteObtenue }} {{ archiveTransfoCurrent.UnitProduit || '' }}
Désignation Qté Sortie Unité
{{ ing.NomProduit || ing.IDproduit }} {{ ing.QteSortie }} {{ ing.UnitProduit || '' }}
Aucun ingrédient enregistré
Chargement… Aucune transformation enregistrée
📦 Archive Mouvement de Stock
Entre {{ formatSynthDate(mouvStockInfo.dateDebut) }} et {{ formatSynthDate(mouvStockInfo.dateFin) }} · {{ mouvStockData.nbLignes || 0 }} ligne(s) · User : {{ mouvStockInfo.user }} · Famille : {{ mouvStockInfo.famille }}
×
Période max 31j :
⚠ Résultat limité à {{ mouvStockData.capLimit }} lignes — affinez vos filtres (période plus courte ou famille précise).
ℹ Base archive externe indisponible — seules les données du jour en cours sont affichées.
Chargement…
Aucun mouvement sur la période Sélectionnez une période et cliquez Charger
Date Caissier Référence Désignation Unité SI Appro
/ Prod°
Vente
BL Ann.
Régul Offert/BL
Ing/Menu/Ret
Vendu S.F CMUP Détail Gros P. Achat
{{ formatSynthDate(r.Dte) }} {{ r.Caissier || '' }} {{ r.CodeBarre || '' }} {{ r.NomProduit || '' }} {{ r.UnitProduit || '' }} {{ r.StockProduit || 0 }} {{ r.Appro || 0 }} {{ r.NombreDeProduitRetourner || 0 }} {{ r.ApproEnPack || 0 }} {{ r.NombreDeProduitSortie || 0 }} {{ r.NombreDeProduitVendu || 0 }} {{ r.StockProduit2 || 0 }} {{ formatBilletageMontant(r.CMUP) }} {{ formatBilletageMontant(r.PrixDeVente) }} {{ formatBilletageMontant(r.PrixDeVenteGrossiste) }} {{ formatBilletageMontant(r.PrixAchat) }}
Appro/Prod° Vendu Vente/BL Annuler Offert/BL/Menu/Retour
🔄 Coefficient de Rotation des Stocks — {{ rotationStockInfo.famille }}
Entre {{ formatSynthDate(rotationStockInfo.dateDebut) }} et {{ formatSynthDate(rotationStockInfo.dateFin) }} · {{ rotationStockInfo.nbJours }} jours · {{ rotationStockData.produits ? rotationStockData.produits.length : 0 }} produit(s)
×
Intervalle ≥ 30 jours requis :
ℹ Méthode de calcul rétrospective — SF est dérivé du stock actuel ajusté des mouvements postérieurs à la date fin. SI = SF + Ventes période − Appros période. Fiable pour les produits (pas services).
Vue :
Chargement…
Aucun produit dans la famille « {{ rotationStockInfo.famille }} » Sélectionnez une famille et cliquez Calculer
Désignation{{ sortIndicatorRotation('nomProduit') }} SI{{ sortIndicatorRotation('SI') }} SF{{ sortIndicatorRotation('SF') }} Appro{{ sortIndicatorRotation('Appro') }} Vente{{ sortIndicatorRotation('Vente') }} Stock Moyen{{ sortIndicatorRotation('StockMoyen') }} Ratio Rotation{{ sortIndicatorRotation('RatioRotation') }} Durée Stockage (j){{ sortIndicatorRotation('DureeStockage') }} Unité
{{ p.nomProduit }} {{ p.SI.toFixed(2) }} {{ p.SF.toFixed(2) }} {{ p.Appro.toFixed(2) }} {{ p.Vente.toFixed(2) }} {{ p.StockMoyen.toFixed(2) }} {{ p.RatioRotation.toFixed(2) }} {{ p.DureeStockage > 0 ? p.DureeStockage.toFixed(1) : '—' }} {{ p.unitProduit }}
TOTAL ({{ rotationStockData.produits.length }}) {{ (rotationStockData.totaux.tSI || 0).toFixed(2) }} {{ (rotationStockData.totaux.tSF || 0).toFixed(2) }} {{ (rotationStockData.totaux.tAppro || 0).toFixed(2) }} {{ (rotationStockData.totaux.tVente || 0).toFixed(2) }}
Stock Moyen 0 = ratio non calculable Ratio ≥ 2 = bonne rotation Durée < 30j = rapide Durée ≥ 60j = stock dormant
Excellent (ratio ≥ 2) Bon (1 ≤ ratio < 2) Moyen (0.5 ≤ ratio < 1) Faible (ratio < 0.5) Non calculable
#{{ i+1 }} · {{ p.nomProduit }} {{ p.RatioRotation.toFixed(2) }} · {{ p.DureeStockage > 0 ? p.DureeStockage.toFixed(1) + 'j' : '—' }}
Vente {{ p.Vente.toFixed(0) }} / Stock Moy. {{ p.StockMoyen.toFixed(1) }}
Palmarès des ventes — triés par quantité vendue sur la période. Utile pour identifier les best-sellers.
#{{ i+1 }} · {{ p.nomProduit }} {{ p.Vente.toFixed(0) }} {{ p.unitProduit }}
SI {{ p.SI.toFixed(0) }} · Appro {{ p.Appro.toFixed(0) }} · SF {{ p.SF.toFixed(0) }}
💹 CA par Famille {{ caFamilleModeLabel }}
Entre {{ formatSynthDate(caFamilleInfo.dateDebut) }} et {{ formatSynthDate(caFamilleInfo.dateFin) }} · {{ caFamilleData.familles ? caFamilleData.familles.length : 0 }} famille(s) · CA Total : {{ formatBilletageMontant(caFamilleData.totalCA || 0) }}
×
Groupement :
Chargement…
Aucune vente sur la période pour ce groupement.
# {{ caFamilleModeLabel }} CA Part Répartition
#{{ i+1 }} {{ f.famille }} {{ formatBilletageMontant(f.ca) }} {{ f.pct.toFixed(1) }}%
TOTAL ({{ caFamilleData.familles.length }}) {{ formatBilletageMontant(caFamilleData.totalCA || 0) }} 100,0%
↩ {{ archiveRetourMode === 'facture' ? 'Archive Retour Fournisseur — Résumé' : 'Archive Retour Fournisseur Détailler' }}
Entre {{ formatSynthDate(archiveRetourInfo.dateDebut) }} et {{ formatSynthDate(archiveRetourInfo.dateFin) }} · {{ archiveRetourMode === 'facture' ? '1 ligne par BR (Bon de Retour) fournisseur' : '1 ligne par produit retourné au fournisseur' }}
×
Vue :
Réf Retour (BR){{ sortIndicatorRetourDet('RefAppro') }} Nom Fournisseur{{ sortIndicatorRetourDet('NomFrns') }} Date Retour{{ sortIndicatorRetourDet('DtedAppro') }} Nom Produit{{ sortIndicatorRetourDet('NomProduit') }} Qté{{ sortIndicatorRetourDet('Qteachete') }} PU{{ sortIndicatorRetourDet('PrixAchatUnitaireTTC') }} Devise{{ sortIndicatorRetourDet('Devise') }} Montant Retour{{ sortIndicatorRetourDet('MontantApproTbl') }}
{{ r.RefAppro }} {{ frnsLabel(r) }} {{ formatSynthDate(r.DtedAppro) }} {{ r.NomProduit || r.IDproduit }} {{ r.Qteachete || 0 }} {{ formatBilletageMontant(r.PrixAchatUnitaireTTC) }} {{ r.Devise || '' }} {{ formatBilletageMontant(r.MontantApproTbl) }}
Chargement… Aucun retour sur la période
Somme Montant Retour ({{ archiveRetourDetList.length }} ligne{{ archiveRetourDetList.length > 1 ? 's' : '' }}) {{ archiveRetourDetTotaux().tQte }} {{ formatBilletageMontant(archiveRetourDetTotaux().tMontant) }}
Réf Retour (BR){{ sortIndicatorRetourFac('RefAppro') }} Date Retour{{ sortIndicatorRetourFac('DtedAppro') }} Nom Fournisseur{{ sortIndicatorRetourFac('NomFrns') }} N° Retour / BR Frns{{ sortIndicatorRetourFac('NumFacFrns') }} Montant Total Retour{{ sortIndicatorRetourFac('MontantTotalAppro') }} Détail
{{ r.RefAppro }} {{ formatSynthDate(r.DtedAppro) }} {{ frnsLabel(r) }} {{ r.NumFacFrns || '' }} {{ formatBilletageMontant(r.MontantTotalAppro) }}
Chargement… Aucun retour sur la période
Montant Total Retour ({{ archiveRetourFacList.length }} BR) {{ formatBilletageMontant(archiveRetourFacTotaux().tMontant) }}
🔄 Consultation Recondition
Entre {{ formatSynthDate(archiveReconditionInfo.dateDebut) }} et {{ formatSynthDate(archiveReconditionInfo.dateFin) }} · Toutes transformations confondues (Transformation, Production, Lot, …)
×
Référence Recondition{{ sortIndicatorRecondition('IDRecondition') }} Date{{ sortIndicatorRecondition('DteRecondition') }} Utilisateur{{ sortIndicatorRecondition('UserRecondition') }} Produit{{ sortIndicatorRecondition('NomProduit') }} Qté Obtenue{{ sortIndicatorRecondition('QteObtenue') }} Unité Détail
{{ r.IDRecondition }} {{ formatSynthDate(r.DteRecondition) }} {{ r.UserRecondition || '' }} {{ r.NomProduit || r.IDproduit }} {{ r.QteObtenue }} {{ r.UnitProduit || '' }}
Chargement… Aucune transformation sur la période
TOTAL ({{ archiveReconditionListFiltered.length }} transformation{{ archiveReconditionListFiltered.length > 1 ? 's' : '' }}) {{ archiveReconditionTotaux().tQte }}
Transformation simple Production avancée Lot (reconditionnement) Autre
📦 {{ archiveApproDetMode === 'facture' ? 'Archive d\'Approvisionnement — Par Facture' : 'Archive d\'Approvisionnement Détailler' }}
Entre {{ formatSynthDate(archiveApproDetInfo.dateDebut) }} et {{ formatSynthDate(archiveApproDetInfo.dateFin) }} · {{ archiveApproDetMode === 'facture' ? '1 ligne par facture / BR d\'approvisionnement' : '1 ligne par produit approvisionné' }} (exclut retours et productions)
×
Vue :
Réf Appro{{ sortIndicatorApproDet('RefAppro') }} Nom Fournisseur{{ sortIndicatorApproDet('NomFrns') }} Date d'Appro{{ sortIndicatorApproDet('DtedAppro') }} Nom Produit{{ sortIndicatorApproDet('NomProduit') }} Qté{{ sortIndicatorApproDet('Qteachete') }} PU{{ sortIndicatorApproDet('PrixAchatUnitaireTTC') }} Devise{{ sortIndicatorApproDet('Devise') }} Montant Appro{{ sortIndicatorApproDet('MontantApproTbl') }}
{{ r.RefAppro }} {{ frnsLabel(r) }} {{ formatSynthDate(r.DtedAppro) }} {{ r.NomProduit || r.IDproduit }} {{ r.Qteachete || 0 }} {{ formatBilletageMontant(r.PrixAchatUnitaireTTC) }} {{ r.Devise || '' }} {{ formatBilletageMontant(r.MontantApproTbl) }}
Chargement… Aucun approvisionnement sur la période
Somme Montant Appro ({{ archiveApproDetList.length }} ligne{{ archiveApproDetList.length > 1 ? 's' : '' }}) {{ archiveApproDetTotaux().tQte }} {{ formatBilletageMontant(archiveApproDetTotaux().tMontant) }}
Réf Appro{{ sortIndicatorApproFac('RefAppro') }} Date d'Appro{{ sortIndicatorApproFac('DtedAppro') }} Nom Fournisseur{{ sortIndicatorApproFac('NomFrns') }} N° Facture / BL{{ sortIndicatorApproFac('NumFacFrns') }} Montant Total{{ sortIndicatorApproFac('MontantTotalAppro') }} RAP{{ sortIndicatorApproFac('RAPAppro') }} Détail
{{ r.RefAppro }} {{ formatSynthDate(r.DtedAppro) }} {{ frnsLabel(r) }} {{ r.NumFacFrns || '' }} {{ formatBilletageMontant(r.MontantTotalAppro) }} {{ formatBilletageMontant(r.RAPAppro) }}
Chargement… Aucun approvisionnement sur la période
Montant Total ({{ archiveApproFacList.length }} facture{{ archiveApproFacList.length > 1 ? 's' : '' }}) {{ formatBilletageMontant(archiveApproFacTotaux().tMontant) }} {{ formatBilletageMontant(archiveApproFacTotaux().tRAP) }}
Consultation Production Avancée
×
Production {{ archiveProdCurrentIdx + 1 }} sur {{ archiveProdList.length }} · Chargement…
Produit Fini
Désignation Qté Entrée Unité
{{ pf.NomProduit || pf.IDproduit }} {{ pf.QteEntree }} {{ pf.UnitProduit || '' }}
Aucun produit fini
Matières Premières (communes au lot)
Désignation Qté Sortie Unité
{{ m.NomProduit || m.IDproduit }} {{ m.QteSortie }} {{ m.UnitProduit || '' }}
Aucune matière commune
📋 Récapitulatif Ingrédients
Produit Fini Ingrédient Qté Unité
{{ r.NomProduitFini }} {{ r.NomIngredient }} {{ r.QteIng }} {{ r.UnitIngredient || '' }}
Aucun ingrédient spécifique
Chargement… Aucune production avancée enregistrée
📊 Graphique CA / Serveur
Du {{ formatSynthDate(graphCAInfo.dateDebut) }} au {{ formatSynthDate(graphCAInfo.dateFin) }} · {{ graphCAData.nbServeurs }} serveur(s) · CA total : {{ formatBilletageMontant(graphCAData.totalCA || 0) }}
×
Chargement…
Aucune vente sur la période (ou aucun serveur renseigné).
CA par serveur (barres horizontales)
{{ s.serveur }} {{ formatBilletageMontant(s.ca) }} ({{ s.pct.toFixed(1) }}%)
{{ s.nbVentes }} vente(s) · {{ s.qte }} produit(s) vendu(s)
Répartition
Total {{ formatBilletageMontantCompact(graphCAData.totalCA) }}
{{ s.serveur }} {{ s.pct.toFixed(1) }}%
Rang Serveur CA Part Nb Ventes Qté Produits Panier Moyen
#{{ i+1 }} {{ s.serveur }} {{ formatBilletageMontant(s.ca) }} {{ s.pct.toFixed(1) }}% {{ s.nbVentes }} {{ s.qte }} {{ s.nbVentes > 0 ? formatBilletageMontant(s.ca / s.nbVentes) : '—' }}
TOTAL {{ formatBilletageMontant(graphCAData.totalCA || 0) }} 100,0% {{ graphCATotaux().nbVentes }} {{ graphCATotaux().qte }}
💰 Journal des Caisses
Du {{ formatSynthDate(journalCaissesInfo.dateDebut) }} au {{ formatSynthDate(journalCaissesInfo.dateFin) }} · Utilisateur : {{ journalCaissesInfo.user }} · Recettes journalières (Vente Comptant + Acompte BC + RAP − Dépense)
×
Date{{ sortIndicatorJC('date') }} Vente Comptant{{ sortIndicatorJC('vComptantTTC') }} Remise{{ sortIndicatorJC('remise') }} Acompte BC{{ sortIndicatorJC('acompteBC') }} RAP Perçu{{ sortIndicatorJC('rapPercu') }} Dépense{{ sortIndicatorJC('depense') }} Total Recette{{ sortIndicatorJC('totalRecette') }} Espèce{{ sortIndicatorJC('espece') }} Chèque{{ sortIndicatorJC('cheque') }} Virement{{ sortIndicatorJC('virement') }} TVA{{ sortIndicatorJC('tva') }} Marge{{ sortIndicatorJC('marge') }}
{{ formatSynthDate(r.date) }} {{ formatBilletageMontant(r.vComptantTTC) }} {{ formatBilletageMontant(r.remise) }} {{ formatBilletageMontant(r.acompteBC) }} {{ formatBilletageMontant(r.rapPercu) }} {{ r.depense ? '−' + formatBilletageMontant(r.depense) : '—' }} {{ formatBilletageMontant(r.totalRecette) }} {{ formatBilletageMontant(r.espece) }} {{ formatBilletageMontant(r.cheque) }} {{ formatBilletageMontant(r.virement) }} {{ formatBilletageMontant(r.tva) }} {{ formatBilletageMontant(r.marge) }}
Chargement… Aucune recette sur la période
TOTAL ({{ journalCaissesList.length }} j) {{ formatBilletageMontant(journalCaissesTotaux().vComptantTTC) }} {{ formatBilletageMontant(journalCaissesTotaux().remise) }} {{ formatBilletageMontant(journalCaissesTotaux().acompteBC) }} {{ formatBilletageMontant(journalCaissesTotaux().rapPercu) }} {{ journalCaissesTotaux().depense ? '−' + formatBilletageMontant(journalCaissesTotaux().depense) : '—' }} {{ formatBilletageMontant(journalCaissesTotaux().totalRecette) }} {{ formatBilletageMontant(journalCaissesTotaux().espece) }} {{ formatBilletageMontant(journalCaissesTotaux().cheque) }} {{ formatBilletageMontant(journalCaissesTotaux().virement) }} {{ formatBilletageMontant(journalCaissesTotaux().tva) }} {{ formatBilletageMontant(journalCaissesTotaux().marge) }}
Moyenne journalière : {{ formatBilletageMontant(journalCaissesTotaux().moyenneTotalRecette) }}
📋 Historique des Régularisations de Stock
Du {{ formatSynthDate(regulHistoInfo.dateDebut) }} au {{ formatSynthDate(regulHistoInfo.dateFin) }} · Utilisateur : {{ regulHistoInfo.user }} · {{ regulHistoTotaux.nbLots }} opération(s), {{ regulHistoTotaux.nbLignes }} produit(s)
×
Affichage :
Écarts positifs (stock retrouvé)
+{{ formatBilletageMontant(regulHistoTotaux.valeurPositive) }}
Écarts négatifs (perte)
−{{ formatBilletageMontant(regulHistoTotaux.valeurNegative) }}
Impact net sur la valeur du stock
{{ regulHistoTotaux.valeurNette < 0 ? '−' : '+' }}{{ formatBilletageMontant(Math.abs(regulHistoTotaux.valeurNette)) }}
N° Régularisation Date Heure Utilisateur Produits Valeur + Valeur − Impact Net
Chargement… Aucune régularisation de stock sur la période.
Date{{ sortIndicatorRG('date') }} Utilisateur{{ sortIndicatorRG('user') }} Famille{{ sortIndicatorRG('famille') }} Produit{{ sortIndicatorRG('nomProduit') }} Stock Avant{{ sortIndicatorRG('stockAvant') }} Stock Physique{{ sortIndicatorRG('stockPhysique') }} Écart{{ sortIndicatorRG('ecart') }} CMUP{{ sortIndicatorRG('cmup') }} Valeur Écart{{ sortIndicatorRG('valeurEcart') }}
{{ formatSynthDate(r.date) }} {{ r.heure ? formatSynthTime(r.heure) : '' }} {{ r.user }} {{ r.famille }} {{ r.nomProduit }} {{ r.unite }} {{ r.stockAvant }} {{ r.stockPhysique }} {{ r.ecart > 0 ? '+' : '' }}{{ r.ecart }} {{ formatBilletageMontant(r.cmup) }} {{ r.valeurEcart < 0 ? '−' : '+' }}{{ formatBilletageMontant(Math.abs(r.valeurEcart)) }}
Chargement… Aucune régularisation de stock sur la période.
Écart = Stock Physique − Stock Avant · Valeur = Écart × CMUP au moment de la régularisation
⚠ Journal des Différences de Caisse
Du {{ formatSynthDate(journalDiffInfo.dateDebut) }} au {{ formatSynthDate(journalDiffInfo.dateFin) }} · Utilisateur : {{ journalDiffInfo.user }} · Clôtures acceptées malgré un Billetage incorrect
×
⚠ L'option « Autoriser la Différence de Caisse » est ACTIVÉE — les clôtures au Billetage incorrect sont acceptées et tracées ici. ✔ L'option « Autoriser la Différence de Caisse » est DÉSACTIVÉE — aucune nouvelle clôture au Billetage incorrect n'est possible. Les lignes ci-dessous sont historiques.
Total Manquant
−{{ formatBilletageMontant(journalDiffTotaux.manquant) }}
Total Excédent
+{{ formatBilletageMontant(journalDiffTotaux.excedent) }}
Écart Net ({{ journalDiffTotaux.nb }} clôture(s))
{{ journalDiffTotaux.net < 0 ? '−' : '+' }}{{ formatBilletageMontant(Math.abs(journalDiffTotaux.net)) }}
Origine{{ sortIndicatorJD('origine') }} ID{{ sortIndicatorJD('id') }} Utilisateur{{ sortIndicatorJD('user') }} Date{{ sortIndicatorJD('date') }} Ouverture Fermeture Recette Attendue{{ sortIndicatorJD('recette') }} Recette Perçue{{ sortIndicatorJD('recettePercu') }} Différence{{ sortIndicatorJD('difference') }} Dépense{{ sortIndicatorJD('depense') }} Observation
{{ r.origine }} {{ r.id }} {{ r.user }} {{ formatSynthDate(r.date) }} {{ r.heureOuverture ? formatSynthTime(r.heureOuverture) : '—' }} {{ r.heureFermeture ? formatSynthTime(r.heureFermeture) : '—' }} {{ formatBilletageMontant(r.recette) }} {{ formatBilletageMontant(r.recettePercu) }} {{ r.difference < 0 ? '−' : '+' }}{{ formatBilletageMontant(Math.abs(r.difference)) }} {{ r.depense ? formatBilletageMontant(r.depense) : '—' }} {{ r.observation || '—' }}
Chargement… ✔ Aucune différence de caisse sur la période — tous les Billetages étaient corrects.
📄 Journal Detail des BL
Depuis l'ouverture de Caisse ({{ formatSynthDate(journalBLInfo.dateDebut) }} {{ formatSynthTime(journalBLInfo.dateDebut) }}) jusqu'à maintenant ({{ formatSynthDate(journalBLInfo.dateFin) }} {{ formatSynthTime(journalBLInfo.dateFin) }}) · Tous utilisateurs · BL non facturés, non annulés
×
ID Sortie BL{{ sortIndicatorBL('IDSortieBL') }} Livraison{{ sortIndicatorBL('DteDeSortieBL') }} Nom Client{{ sortIndicatorBL('NomClient') }} Montant TTC{{ sortIndicatorBL('MontantTTC') }} Acompte{{ sortIndicatorBL('Acompte') }} RAP{{ sortIndicatorBL('RAP') }}
{{ r.IDSortieBL }} {{ formatSynthDate(r.DteDeSortieBL) }} {{ r.NomClient || r.IDClient || '' }} {{ formatBilletageMontant(r.MontantTTC) }} {{ formatBilletageMontant(r.Acompte) }} {{ formatBilletageMontant(r.RAP) }}
Chargement… Aucun BL non facturé sur la période
TOTAL ({{ journalBLTotaux().nbBls }} BL) {{ formatBilletageMontant(journalBLTotaux().tMontantTTC) }} {{ formatBilletageMontant(journalBLTotaux().tAcompte) }} {{ formatBilletageMontant(journalBLTotaux().tRAP) }}
🎁 Produits Offerts — {{ (rapportOffertInfo && rapportOffertInfo.user) || loggedInUser }}
Depuis l'ouverture de Caisse ({{ formatSynthDate(rapportOffertInfo.dateDebut) }} {{ formatSynthTime(rapportOffertInfo.dateDebut) }}) jusqu'à maintenant ({{ formatSynthDate(rapportOffertInfo.dateFin) }} {{ formatSynthTime(rapportOffertInfo.dateFin) }})
Du {{ formatSynthDate(rapportOffertInfo.dateDebut) }} au {{ formatSynthDate(rapportOffertInfo.dateFin) }} · Utilisateur : {{ rapportOffertInfo.user }}
×
Date{{ sortIndicatorOffert('DteDeVente') }} N° Facture{{ sortIndicatorOffert('IDVente') }} Référence{{ sortIndicatorOffert('CodeBarre') }} Désignation Produit{{ sortIndicatorOffert('NomProduit') }} Qté{{ sortIndicatorOffert('SommeDeQteVendu') }} Serveur{{ sortIndicatorOffert('Serveur') }} Client{{ sortIndicatorOffert('NomClient') }} Motif{{ sortIndicatorOffert('Commentaire') }}
{{ formatSynthDate(r.DteDeVente) }} {{ r.IDVente }} {{ r.CodeBarre || '' }} {{ r.NomProduit || r.IDproduit }} {{ r.SommeDeQteVendu || 0 }} {{ r.Serveur || '' }} {{ r.NomClient || '' }} {{ formatOffertMotif(r.Commentaire) }}
Chargement… Aucun produit offert sur la période
TOTAL ({{ rapportOffertTotaux().nbLignes }} ligne{{ rapportOffertTotaux().nbLignes > 1 ? 's' : '' }}, {{ rapportOffertTotaux().nbVentes }} vente{{ rapportOffertTotaux().nbVentes > 1 ? 's' : '' }}) {{ rapportOffertTotaux().tQte }}
{{ loggedInUser || '' }}
Archive Proforma
×
✓ Convertie en facture
Code Barre Désignation Unité Qté Prix Unitaire Montant
{{ d.CodeBarre || '' }} {{ d.NomProduit || d.IDproduit }} {{ d.UnitProduit || '' }} {{ d.QteVendu || 0 }} {{ formatBilletageMontant(d.PrixUnitaire) }} {{ formatBilletageMontant(d.MontantTotalVnt) }}
Aucune ligne produit
{{ archiveProformaCurrent.MontantTTCEnLettre }}
Observation
Type de vente
Chargement…
{{ archiveProformaIndex + 1 }} / {{ archiveProformaList.length }}
Historique des Commande Annuler
Commande Annuler
×
Client Date Heure User Annulé Motif Annulation Nom Produit Table Qté Serveur
{{ r.IDClient }} {{ formatSynthDate(r.DteAnnulation) }} {{ formatSynthTime(r.HeureAnnulation) }} {{ r.UserAnnulation }} {{ r.MotifAnnulation }} {{ r.NomProduit }} {{ r.RecTable }} {{ r.QteVendu || 0 }} {{ r.Serveur }}
Aucune commande annulée dans l'historique
{{ commandesAnnuleesList.length }} ligne(s)
Historique des Transfert Table
Historique Transfert Table
×
Source Destination NomProduit Qte MotifTransfert User Serveur Date Heure
{{ r.NomTableSource || r.AncienneTable }} {{ r.NomTableDest || r.NouvelleTable }} {{ r.NomProduit }} {{ r.QteVendu || 0 }} {{ r.MotifTransfert }} {{ r.UserTransfert }} {{ r.Serveur }} {{ formatSynthDate(r.DateTransfert) }} {{ formatSynthTime(r.HeureTransfert) }}
Aucun transfert de table dans l'historique
{{ transfertsTableList.length }} ligne(s)
✏ Modifier le Mode de Paiement
×
Vente {{ archiveVenteCurrent.IDVente }} · Montant {{ formatBilletageMontant(archiveVenteCurrent.MontantTTC) }}
Nouveau mode :
Détails Chèque
💵 Reliquat Espèce : {{ formatBilletageMontant(reliquatEspeceModif) }}
Détails Virement
💵 Reliquat Espèce : {{ formatBilletageMontant(reliquatEspeceModif) }}
💵 Mode Espèce sélectionné — aucune information supplémentaire requise.
Archives Consolidations des Caisses
×
Compilation {{ archiveCompilCurrentIdx + 1 }} sur {{ archiveCompilList.length }} · Chargement…
Billetages par Utilisateur
Nom d'Utilisateur État Recette Perçu Dépense Virement Chèque
{{ b.NomUser }} OUVERT CLÔTURÉ {{ formatBilletageMontant(b.RecettePercu) }} {{ parseFloat(b.Depense) ? '−' + formatBilletageMontant(Math.abs(b.Depense)) : '—' }} {{ formatBilletageMontant(b.Virement) }} {{ formatBilletageMontant(b.Cheque) }}
Aucun billetage rattaché
Billetage Consolidé (Coupures)
Coupure Nbre Total
{{ formatBilletageMontant(c.valeur) }} {{ c.nombre }} {{ formatBilletageMontant(c.total) }}
Total Billetage {{ formatBilletageMontant(archiveCompilSommes.sommeBilletageTotal) }}
Sommes CA Espèce
{{ formatBilletageMontant(archiveCompilSommes.sommeCaisse) }}
Sommes CA Chèque
{{ formatBilletageMontant(archiveCompilSommes.sommeCheque) }}
Sommes CA Virement
{{ formatBilletageMontant(archiveCompilSommes.sommeVirement) }}
Totaux des Dépenses
{{ parseFloat(archiveCompilSommes.sommeDepense) ? '−' + formatBilletageMontant(Math.abs(archiveCompilSommes.sommeDepense)) : '—' }}
Recette Totale
{{ formatBilletageMontant(archiveCompilSommes.recetteTotal) }}
Total Acompte
{{ formatBilletageMontant(archiveCompilSommes.totalAcompte) }}
Total RAP
{{ formatBilletageMontant(archiveCompilSommes.totalRAP) }}
Différence Billetage
{{ formatBilletageMontant(archiveCompilSommes.differenceBilletage) }}
Chargement… Aucune consolidation enregistrée
{{ loggedInUser || '' }}
Consultation Billetage
{{ formatBilletageDate(new Date()) }} {{ (infoSociete.nomSte || '').toUpperCase() }}
×
20 000 Ar
10 000 Ar
5 000 Ar
2 000 Ar
1 000 Ar
500 Ar
200 Ar
100 Ar
50 Ar
20 Ar
10 Ar
Recette Perçu
Différence
Recette Total
Depense de Caisse
Reste Recette
Fond De Caisse
Chargement…
Journal de Caisse par Facture — {{ billetageCurrent.NomUser }}
×
N° Facture ID Client Date de Vente Serveur Montant Remise % Remise Valeur Montant TTC Nmbr Pax
{{ v.IDVente }} {{ v.IDClient }} {{ formatBilletageDate(v.DteDeVente) }} {{ v.Serveur }} {{ formatBilletageMontant(v.MontantBrut) }} {{ v.RemisePr || 0 }} {{ formatBilletageMontant(v.RemiseVal) }} {{ formatBilletageMontant(v.MontantTTC) }} {{ v.NbrPrs || 0 }}
Aucune opération
Total des Pax : {{ billetageJournal.reduce((s,v) => s + (parseInt(v.NbrPrs)||0), 0) }}
Total Montant Brut : {{ formatBilletageMontant(billetageJournal.reduce((s,v) => s + (parseFloat(v.MontantBrut)||0), 0)) }}
Total Remise : {{ formatBilletageMontant(billetageJournal.reduce((s,v) => s + (parseFloat(v.RemiseVal)||0), 0)) }}
Total TVA : {{ formatBilletageMontant(billetageJournal.reduce((s,v) => s + (parseFloat(v.TVA)||0), 0)) }}
Total Recette Net : {{ formatBilletageMontant(billetageJournal.reduce((s,v) => s + (parseFloat(v.MontantTTC)||0), 0)) }}
Rapport Paiement Virement
Banque Facture Montant
{{ v.Banque }} {{ v.IDVente }} {{ formatBilletageMontant(v.Montant) }}
Aucun virement
Total : {{ formatBilletageMontant(billetageVirement.reduce((s,v) => s + (parseFloat(v.Montant)||0), 0)) }}
Rapport Paiement Chèque
Banque Numéro Propriétaire Montant
{{ c.Banque }} {{ c.Numero }} {{ c.Proprietaire }} {{ formatBilletageMontant(c.Montant) }}
Aucun chèque
Total : {{ formatBilletageMontant(billetageCheque.reduce((s,v) => s + (parseFloat(v.Montant)||0), 0)) }}
Détail RAP Client
×
Client Libellé de l'Opération Montant Date
{{ r.IDClient }} {{ r.Libelle }} {{ formatBilletageMontant(r.SoldeDebitClient) }} {{ formatBilletageDate(r.dteOperation) }} {{ formatBilletageHeure(r.dteOperation) }}
Aucun RAP perçu
Total : {{ formatBilletageMontant(billetageRAP.reduce((s,v) => s + (parseFloat(v.SoldeDebitClient)||0), 0)) }}
Consultation d'Activité
×

Consultation d’Activité

Tableau de Bord - Activité

Évolution du CA Journalier

Ventes par Serveur

Top 10 Produits (Chiffre d'Affaires)

Journal de Caisse Détaillé

N° Facture {{ tableSortIcon('detaille','IDVente') }} Client {{ tableSortIcon('detaille','NomClient') }} Date {{ tableSortIcon('detaille','DteDeVente') }} Serveur {{ tableSortIcon('detaille','Serveur') }} Montant {{ tableSortIcon('detaille','MontantBrut') }} TVA {{ infoSociete.tauxTVA }}% {{ tableSortIcon('detaille','tvaExtrait') }} Remise {{ tableSortIcon('detaille','RemiseVal') }} Net {{ tableSortIcon('detaille','MontantTTC') }} Table {{ tableSortIcon('detaille','NomTable') }} Couverts {{ tableSortIcon('detaille','NbrPrs') }} Observation {{ tableSortIcon('detaille','Observation') }}
{{ ligne.IDVente }} {{ ligne.NomClient }} {{ formatDate(ligne.DteDeVente) }} {{ ligne.Serveur }} {{ formatPrice(ligne.MontantBrut) }} {{ formatPrice(parseFloat(ligne.MontantTTC || ligne.MontantBrut || 0) - parseFloat(ligne.MontantTTC || ligne.MontantBrut || 0) / (1 + infoSociete.tauxTVA / 100)) }} {{ parseFloat(ligne.RemiseVal || 0) > 0 ? formatPrice(ligne.RemiseVal) : '' }} {{ formatPrice(ligne.MontantTTC || ligne.MontantBrut) }} {{ ligne.NomTable }} {{ ligne.NbrPrs || '' }} {{ ligne.Observation }}
Total Brut : {{ rapportDetaille.reduce((sum, l) => sum + parseFloat(l.MontantBrut || 0), 0).toLocaleString('fr-FR') }} Ar Total TVA {{ infoSociete.tauxTVA }}% : {{ rapportDetaille.reduce((sum, l) => { const ttc = parseFloat(l.MontantTTC || l.MontantBrut || 0); return sum + (ttc - ttc / (1 + infoSociete.tauxTVA / 100)); }, 0).toLocaleString('fr-FR') }} Ar Total Remise : {{ rapportDetaille.reduce((sum, l) => sum + parseFloat(l.RemiseVal || 0), 0).toLocaleString('fr-FR') }} Ar Total Net : {{ rapportDetaille.reduce((sum, l) => sum + parseFloat(l.MontantTTC || l.MontantBrut || 0), 0).toLocaleString('fr-FR') }} Ar Total Couverts : {{ rapportDetaille.reduce((sum, l) => sum + (parseInt(l.NbrPrs) || 0), 0) }}

Journal des RAP Perçue

Client {{ tableSortIcon('rap','NomClient') }} Libellé {{ tableSortIcon('rap','Libelle') }} Date {{ tableSortIcon('rap','dteOperation') }} Utilisateur {{ tableSortIcon('rap','NomUser') }} Montant Perçu {{ tableSortIcon('rap','MontantRecu') }}
{{ l.NomClient }} {{ l.Libelle }} {{ formatDate(l.dteOperation) }} {{ l.NomUser }} {{ formatPrice(l.MontantRecu) }}
Total Perçu : {{ rapportRap.reduce((sum, l) => sum + parseFloat(l.MontantRecu || 0), 0).toLocaleString('fr-FR') }} Ar

📦 Journal Detail des BL

Rapport des BL de Produits Livré

ID Sortie BL {{ tableSortIcon('bl','IDSortieBL') }} Livraison {{ tableSortIcon('bl','DteDeSortieBL') }} Nom Client {{ tableSortIcon('bl','NomClient') }} Nom du Produit {{ tableSortIcon('bl','NomProduit') }} Qte {{ tableSortIcon('bl','SommeDeQteSortieBL') }} Prix {{ tableSortIcon('bl','Prix') }} Montant
{{ l.IDSortieBL }} {{ formatDate(l.DteDeSortieBL) }} {{ l.NomClient }} {{ l.NomProduit }} {{ l.SommeDeQteSortieBL }} {{ formatPrice(l.Prix) }} {{ formatPrice((l.SommeDeQteSortieBL || 0) * (l.Prix || 0)) }}
Total RAP {{ formatPrice(totalMontantBL()) }}

📤 Journal des Sorties (BS)

Date {{ tableSortIcon('bs','DteDeSortieBS') }} ID Sortie {{ tableSortIcon('bs','IDSortieBS') }} Caissier {{ tableSortIcon('bs','User') }} Client {{ tableSortIcon('bs','NomClient') }} Code Barre {{ tableSortIcon('bs','CodeBarre') }} Désignation Produit {{ tableSortIcon('bs','NomProduit') }} Qté Sortie {{ tableSortIcon('bs','SommeDeQteSortieBS') }}
{{ formatDate(l.DteDeSortieBS) }} {{ l.IDSortieBS }} {{ l.User }} {{ l.NomClient }} {{ l.CodeBarre }} {{ l.NomProduit }} {{ l.SommeDeQteSortieBS }}

📥 Archive d'Approvisionnement détailler

Réf Appro {{ tableSortIcon('appro','RefAppro') }} Nom Fournisseur {{ tableSortIcon('appro','NomFrns') }} Date d'Appro {{ tableSortIcon('appro','DtedAppro') }} Nom Produit {{ tableSortIcon('appro','NomProduit') }} Qté {{ tableSortIcon('appro','Qteachete') }} PU {{ tableSortIcon('appro','PrixAchatUnitaireTTC') }} Devise {{ tableSortIcon('appro','Devise') }} Montant Appro {{ tableSortIcon('appro','MontantApproTbl') }}
{{ l.RefAppro }} {{ frnsLabel(l) }} {{ formatDate(l.DtedAppro) }} {{ l.NomProduit }} {{ l.Qteachete }} {{ formatPrice(l.PrixAchatUnitaireTTC) }} {{ l.Devise }} {{ formatPrice(l.MontantApproTbl) }}
Somme Montant Appro {{ formatPrice(rapportAppro.reduce((sum, l) => sum + (parseFloat(l.MontantApproTbl) || 0), 0)) }}

Journal des Ventes

Date {{ tableSortIcon('vente','DteDeVente') }} N° Facture {{ tableSortIcon('vente','IDVente') }} Produit {{ tableSortIcon('vente','NomProduit') }} Qté {{ tableSortIcon('vente','SommeDeQteVendu') }} PU {{ tableSortIcon('vente','PrixUnitaire') }} Montant {{ tableSortIcon('vente','SommeDeMontantTotalVnt') }} Montant Remisé {{ tableSortIcon('vente','Prixremiser') }} Marge {{ tableSortIcon('vente','MargeBenefique') }} Serveur {{ tableSortIcon('vente','Serveur') }} Client {{ tableSortIcon('vente','NomClient') }}
{{ formatDate(ligne.DteDeVente) }} {{ ligne.IDVente }} {{ ligne.NomProduit }} {{ ligne.SommeDeQteVendu }} {{ formatPrice(ligne.PrixUnitaire) }} {{ formatPrice(ligne.SommeDeMontantTotalVnt) }} {{ formatPrice(ligne.Prixremiser || ligne.SommeDeMontantTotalVnt) }} {{ formatPrice(ligne.MargeBenefique) }} {{ ligne.Serveur }} {{ ligne.NomClient }}
Total ventes : {{ rapportVente.reduce((sum, l) => sum + parseFloat(l.SommeDeMontantTotalVnt || 0), 0).toLocaleString('fr-FR') }} Ar Total remisé : {{ rapportVente.reduce((sum, l) => sum + parseFloat(l.Prixremiser || l.SommeDeMontantTotalVnt || 0), 0).toLocaleString('fr-FR') }} Ar Total marge : {{ rapportVente.reduce((sum, l) => sum + parseFloat(l.MargeBenefique || 0), 0).toLocaleString('fr-FR') }} Ar

Commandes en cours

Produit {{ tableSortIcon('cmdencours','NomProduit') }} Quantité {{ tableSortIcon('cmdencours','SommeDeQteVendu') }} Table {{ tableSortIcon('cmdencours','NomTable') }} Commande {{ tableSortIcon('cmdencours','Commande') }} Montant {{ tableSortIcon('cmdencours','MontantTotal') }} Serveur {{ tableSortIcon('cmdencours','Serveur') }}
{{ ligne.NomProduit }} {{ ligne.SommeDeQteVendu }} {{ ligne.NomTable }} {{ ligne.Commande }} {{ formatPrice(ligne.MontantTotal) }} {{ ligne.Serveur }}
Total : {{ commandesEnCours.reduce((sum, l) => sum + parseFloat(l.MontantTotal || 0), 0).toLocaleString('fr-FR') }} Ar

Dépense de Caisse

ID Vente {{ tableSortIcon('depense','IDVente') }} Date {{ tableSortIcon('depense','DteDeVente') }} Montant TTC {{ tableSortIcon('depense','MontantTTC') }} Utilisateur {{ tableSortIcon('depense','User') }} Observation {{ tableSortIcon('depense','Observation') }}
{{ ligne.IDVente }} {{ formatDate(ligne.DteDeVente) }} {{ formatPrice(ligne.MontantTTC) }} {{ ligne.User }} {{ ligne.Observation }}

Offert

Date {{ tableSortIcon('offert','DteDeVente') }} Heure {{ tableSortIcon('offert','HeurDeVente') }} ID Vente {{ tableSortIcon('offert','IDVente') }} Produit {{ tableSortIcon('offert','NomProduit') }} Qté {{ tableSortIcon('offert','SommeDeQteVendu') }} Utilisateur {{ tableSortIcon('offert','User') }} Observation {{ tableSortIcon('offert','Observation') }}
{{ formatDate(l.DteDeVente) }} {{ formatHeure(l.HeurDeVente) }} {{ l.IDVente }} {{ l.NomProduit }} {{ l.SommeDeQteVendu }} {{ l.User }} {{ l.Observation }}

GS.Caisse 4.0

Etat des Stocks et Liste des Prix
Consultation des Comptes {{ consultationEntityLabelPlural }}
×

Recherche Avancée des {{ consultationEntityLabelPlural }}

Nom {{ consultationEntityLabel }} {{ tableSortIcon('clients','NomClient') }} Contact {{ consultationEntityLabel }} {{ tableSortIcon('clients','ContactClient') }} Adresse de la Soc {{ tableSortIcon('clients','Adresse') }} RAP (BL) {{ tableSortIcon('clients','RAP') }} RAPBC (BC) {{ tableSortIcon('clients','RAPBC') }} CARealiser {{ tableSortIcon('clients','CARealiser') }} RAPSomme {{ tableSortIcon('clients','RAPSomme') }}
TOTAL : {{ formatPrice(totalRAP) }} {{ formatPrice(totalRAPBC) }} {{ formatPrice(totalCARealiser) }} {{ formatPrice(totalRAPSomme) }}
{{ (consultationMode === 'fournisseur' && userStatut !== 'Administrateur' && !canIdentifierFrns) ? client.IDClient : client.NomClient }} {{ (consultationMode === 'fournisseur' && userStatut !== 'Administrateur' && !canIdentifierFrns) ? '***' : client.ContactClient }} {{ (consultationMode === 'fournisseur' && userStatut !== 'Administrateur' && !canIdentifierFrns) ? '***' : client.Adresse }} {{ formatPrice(client.RAP || 0) }} {{ formatPrice(client.RAPBC || 0) }} {{ formatPrice(client.CARealiser || 0) }} {{ formatPrice(client.RAPSomme || 0) }}
Aucun client trouvé
Nbr des {{ consultationEntityLabelPlural }} Trouvés : {{ clientsList.length }}
🚫 Blacklister le {{ consultationEntityLabel }}
{{ consultationEntityLabel }} concerné : {{ editClient && editClient.NomClient ? editClient.NomClient : '—' }}
ℹ️ La date et l'utilisateur seront automatiquement ajoutés au motif. L'historique du client (ventes, BL, factures) est conservé ; le client sera simplement exclu de toutes les recherches.

Sélection de la Table

Déconnexion
×
{{ table.NomTable }}
Table libre
Commande en cours
Addition imprimée
Non envoyée cuisine
🔄 Mise à jour…

{{ selectedTable.NomTable }} - Sélection Commande

×
{{ commande.NomChaise }}
Montant Total des Commande Actuel
Nombre de Commande Actuel

{{ (selectedTable && selectedTable.NomTable) || '' }} - {{ selectedCommandeNum }}

×
DÉJÀ ENVOYÉ EN CUISINE {{ articlesDejaCommandes.length }}
{{ art.name }} ×{{ art.quantity }} ({{ art.cuisson }}) 🍽 {{ art.accompagnement }}
⚠ Vérifiez avant de re-saisir un produit déjà commandé.

Catégories

{{ categorie.nom }}

Sous-catégories

{{ sousCategorie.nom }}

Produits

{{ product.name }}
Mode : Commande OUVERTE (tout serveur peut ajouté)
Mode : Commande VERROUILLÉE (sécurité serveur)

Commande en cours

{{ item.name }} {{ item.palierPrix }} 💬
{{ item.quantity }}
{{ item.offert ? 'OFFERT' : formatPrice(item.price * item.quantity) }}
X
🍽 {{ item.accompagnement }} { {{ item.commentaire }} }
Total: {{ formatPrice(calculateTotal()) }}
🧾 Addition
⇄ Transfert
📋 Cmd En Cours
Valider

⚠ Base Archive introuvable

Cherchez le fichier qui porte ce nom : ({{ (archiveStatus && archiveStatus.expectedFileName) || 'Archive.accdb' }})
{{ archiveStatus.message }}
{{ (archiveStatus && archiveStatus.currentPath) || '(aucun)' }}
Fichier choisi : {{ archivePickedFileName }}
{{ archivePathError }}

{{ titreCommande || 'Commande Boutique' }}

×
RAP : {{ formatPrice(getSelectedClientRAP()) }}
{{ chip }}

Produits disponibles ({{ filteredProduitsBoutique.length }})

{{ product.name }}
📋 {{ product.reference }} 🏷 {{ product.NomFamillePere }} › {{ product.NomFamilleFils }} 💬 {{ product.Commentaire }}
{{ formatPrice(getProductPrice(product)) }}
Stock: {{ formatStock(product.stock) }}

{{ titreCommande || 'Commande Boutique' }}

{{ item.name }} {{ item.palierPrix }}
{{ formatPrice(item.price * item.quantity) }}
X
Total: {{ formatPrice(calculateTotal()) }}
Valider
Utilisateur : {{ loggedInUser }}
Caisse et Facturation de {{ (selectedClientCO && selectedClientCO.NomClient) || 'Particulier' }}
{{ infoSociete.typeApp || 'GS.Caisse 4.0' }}
×
1. Vente
2. Etat Achat
3. Etat BL
4. Etat Proforma
5. Etat Avance Client

Caisse et Facturation

{{ c.NomClient }}
Code : {{ c.IDClient }} · Tél : {{ c.ContactClient }}
GROS VIP DÉTAIL STÉ PARTIEL
{{ selectedClientCO.NomClient }}
Code : {{ selectedClientCO.IDClient }} · Tél : {{ selectedClientCO.ContactClient }} SOCIÉTÉ RAP : {{ Number(selectedClientCO.RAPSomme).toLocaleString('fr-FR') }} Points : {{ Number(selectedClientCO.PointClient).toLocaleString('fr-FR') }} PAIEMENT PARTIEL
Mode d'opération

Nouvelle Ligne

{{ p.name }} ({{ p.reference }})
{{ formatPrice(coGetPriceForClient(p, coQteTotaleProduit(p.id, coCurrentLine.qte))) }} Stk: {{ p.stock !== undefined && p.stock !== null ? p.stock : '—' }} Service
{{ coCurrentLine.unite || '—' }}
{{ coCurrentLine.stock !== null ? coCurrentLine.stock : '—' }}
{{ coLines.length }} Ligne(s)
Code Barre Désignation Unité Qté PU HT Stock Montant HT Action
{{ item.codeBarre || '—' }} {{ item.nomProduit }} {{ item.unite }} {{ formatPrice(item.prixUnitaire) }} {{ item.stock !== null ? item.stock : '—' }} {{ formatPrice((item.qte || 0) * (item.prixUnitaire || 0)) }}
Aucune ligne. Utilisez la zone au-dessus pour ajouter des produits.
Arrêtée la présente à la somme de : {{ typeof numberToLettre === 'function' ? numberToLettre(coTotals.montantTTC) : coTotals.montantTTC }}
Mode de Paiement
Récapitulatif
{{ formatPrice(coTotals.montantBrut) }}
% {{ currencySymbol }}
{{ formatPrice(coTotals.montantHT) }}
{{ formatPrice(coTotals.tva) }}
{{ infoSociete.etiqMontTTC || 'Montant TTC' }} {{ formatPrice(coTotals.montantTTC) }}
{{ formatPrice(coRendu) }}
{{ coOperationModeLabel }}
Information Reste à Payer
Ce Client vous doit encore {{ formatPrice(rapPendingCO) }} de Reste à Payer.
Voulez vous Continuer cette Opération ?
🔒 Saisie produit désactivée — Le client a un reste à payer et vous avez choisi de ne pas continuer. Changez de client ou réactivez la saisie.
Aucun client sélectionné
Retournez à l'onglet Vente pour choisir un client, les factures apparaîtront ici.
Aucune facture trouvée
Ce client n'a encore effectué aucun achat enregistré.
Vente en Détail Vente Grossiste Vente VIP
ID Produit Désignation Unité Qté Vendu P.U. Montant
Chargement des lignes…
Aucune ligne
{{ d.IDproduit }} {{ d.NomProduit }} {{ d.Unite }} {{ d.QteVendu }} {{ formatPrice(d.PrixUnitaire) }} {{ formatPrice(d.MontantTotalVnt) }}
Observation
{{ etatAchatFactures[etatAchatFactureIdx].Observation || '—' }}
{{ infoSociete.etiqMontantBrut || 'Montant Brut' }}
{{ formatPrice(etatAchatFactures[etatAchatFactureIdx].MontantBrut) }}
Remise {{ (Number(etatAchatFactures[etatAchatFactureIdx].RemisePr) || 0).toFixed(2) }} %
{{ formatPrice(etatAchatFactures[etatAchatFactureIdx].RemiseVal) }}
{{ infoSociete.etiqNetCom || 'Montant HT' }}
{{ formatPrice(etatAchatFactures[etatAchatFactureIdx].MontantHT) }}
TVA {{ Number(etatAchatFactures[etatAchatFactureIdx].TVAPr || 0) }} %
{{ formatPrice(etatAchatFactures[etatAchatFactureIdx].TVA) }}
{{ infoSociete.etiqMontTTC || 'Montant TTC' }}
{{ formatPrice(etatAchatFactures[etatAchatFactureIdx].MontantTTC) }}
Factures du client ({{ etatAchatFactures.length }})
ID Vente Montant TTC
{{ f.IDVente }} {{ formatPrice(f.MontantTTC) }}
Chargement des factures…
Produits acheter par {{ (selectedClientCO && selectedClientCO.NomClient) || '' }} ×
{{ produitsCumules.length }} produit(s) distinct(s) {{ produitsCumulesLignes.length }} ligne(s) — {{ new Set(produitsCumulesLignes.map(l => l.IDVente)).size }} facture(s)
Chargement…
Code Barre Famille Père Famille Fils Nom du Produit Qté Acheter Montant Total Nb Factures
Aucun produit trouvé
{{ r.CodeBarre }} {{ r.FamillePere }} {{ r.FamilleFils }} {{ r.NomProduit }} {{ r.QteTotale }} {{ formatPrice(r.MontantTotal) }} {{ r.NbFactures }}
Date N° Facture Code Barre Famille Père Famille Fils Nom du Produit Qté P.U. Montant
Aucune ligne trouvée
{{ formatDateTimeCO(r.DteDeVente) }} {{ r.IDVente }} {{ r.CodeBarre }} {{ r.FamillePere }} {{ r.FamilleFils }} {{ r.NomProduit }} {{ r.QteVendu }} {{ formatPrice(r.PrixUnitaire) }} {{ formatPrice(r.MontantTotalVnt) }}
Sélectionnez d'abord un client dans l'onglet Vente pour voir ses Bons de Livraison.
Chargement des BL...
Aucun Bon de Livraison en attente
Ce client n'a pas de BL non facturé.
ID Sortie BL : {{ etatBLList[etatBLIdx].IDSortieBL }}
Nom Client : {{ selectedClientCO.NomClient }}
Date Livraison : {{ formatDateTimeCO(etatBLList[etatBLIdx].DteDeSortieBL) }}
Date Échéance : {{ formatDateTimeCO(etatBLList[etatBLIdx].DteEcheance) }}
ID Facturation : {{ etatBLList[etatBLIdx].IDFacturation || '—' }}
État du BL : Annulé Déjà Facturé En Cours
Vente Grossiste Vente VIP Vente en Détail
Désignation Unité Qté P.U. Montant
Chargement...
Aucune ligne
{{ l.NomProduit }} {{ l.Unite }} {{ l.QteSortieBL }} {{ formatPrice(l.PrixApresRemise) }} {{ formatPrice(l.MontantTotal) }}
{{ (infoSociete && infoSociete.etiqMontantBrut) || 'Montant Brut' }} : {{ formatPrice(etatBLList[etatBLIdx].MontantBrut) }}
Remise ({{ (parseFloat(etatBLList[etatBLIdx].RemisePr) || 0).toFixed(2) }} %) : {{ formatPrice(etatBLList[etatBLIdx].RemiseVal) }}
{{ (infoSociete && infoSociete.etiqNetCom) || 'Net Commercial HT' }} : {{ formatPrice(etatBLList[etatBLIdx].MontantHT) }}
TVA ({{ etatBLList[etatBLIdx].TVAPr }} %) : {{ formatPrice(etatBLList[etatBLIdx].TVA) }}
{{ (infoSociete && infoSociete.etiqMontTTC) || 'Net à Payer TTC' }} : {{ formatPrice(etatBLList[etatBLIdx].MontantTTC) }}
Acompte : {{ formatPrice(etatBLList[etatBLIdx].Acompte) }}
Reste à Payer : {{ formatPrice(etatBLList[etatBLIdx].RAP) }}
📝 Observation
{{ etatBLList[etatBLIdx].Observation }}
Liste des BL ({{ etatBLList.length }})
Chargement...
Aucun BL en attente
{{ bl.IDSortieBL }}
{{ formatPrice(bl.MontantTTC) }}
{{ formatDateTimeCO(bl.DteDeSortieBL) }}
Annulé Facturé En Cours
RAP : {{ formatPrice(bl.RAP) }}
CA Réalisé
{{ formatPrice((etatBLIndicateurs && etatBLIndicateurs.CARealiser) || 0) }}
Reste à Payer
{{ formatPrice((etatBLIndicateurs && etatBLIndicateurs.RAPSomme) || 0) }}
Fréquence d'Achat
{{ (etatBLIndicateurs && etatBLIndicateurs.FrequenceDAchat) || 0 }}
Points Obtenus
{{ (etatBLIndicateurs && etatBLIndicateurs.PointClient) || 0 }}
Facturation du BL — Choix du mode de paiement
BL : {{ etatBLList[etatBLIdx].IDSortieBL }}
Client : {{ selectedClientCO && selectedClientCO.NomClient }}
Montant TTC : {{ formatPrice(etatBLList[etatBLIdx].MontantTTC) }}
Sélectionnez d'abord un client dans l'onglet Vente pour voir ses Proformas.
Chargement des Proformas...
Aucune Proforma
Ce client n'a pas de Proforma enregistrée.
ID Proforma : {{ etatProfoList[etatProfoIdx].IDVente }}
Nom Client : {{ selectedClientCO.NomClient }}
Date de Vente : {{ formatDateTimeCO(etatProfoList[etatProfoIdx].DteDeVente) }}
Date Échéance : {{ formatDateTimeCO(etatProfoList[etatProfoIdx].DteEcheance) }}
Caissier : {{ etatProfoList[etatProfoIdx].UserProfo || '—' }}
État : Déjà Facturé En Attente
Vente en Détail Vente Grossiste Vente VIP
Désignation Unité Qté P.U. Montant
Chargement...
Aucune ligne
{{ l.NomProduit }} {{ l.Unite }} {{ l.QteVendu }} {{ formatPrice(l.PrixApresRemise) }} {{ formatPrice(l.MontantTotal) }}
{{ (infoSociete && infoSociete.etiqMontantBrut) || 'Montant Brut' }} : {{ formatPrice(etatProfoList[etatProfoIdx].MontantBrut) }}
Remise ({{ (parseFloat(etatProfoList[etatProfoIdx].RemisePr) || 0).toFixed(2) }} %) : {{ formatPrice(etatProfoList[etatProfoIdx].RemiseVal) }}
{{ (infoSociete && infoSociete.etiqNetCom) || 'Net Commercial HT' }} : {{ formatPrice(etatProfoList[etatProfoIdx].MontantHT) }}
TVA ({{ etatProfoList[etatProfoIdx].TVAPr }} %) : {{ formatPrice(etatProfoList[etatProfoIdx].TVA) }}
{{ (infoSociete && infoSociete.etiqMontTTC) || 'Net à Payer TTC' }} : {{ formatPrice(etatProfoList[etatProfoIdx].MontantTTC) }}
Observation : {{ etatProfoList[etatProfoIdx].Observation }}
Liste des Proformas ({{ etatProfoList.length }})
Chargement...
Aucune Proforma
{{ p.IDVente }}
{{ formatPrice(p.MontantTTC) }}
{{ formatDateTimeCO(p.DteDeVente) }}
Facturé En Attente
Facturation de la Proforma — Choix du mode de paiement
Proforma : {{ etatProfoList[etatProfoIdx].IDVente }}
Client : {{ selectedClientCO && selectedClientCO.NomClient }}
Montant TTC : {{ formatPrice(etatProfoList[etatProfoIdx].MontantTTC) }}
Sélectionnez d'abord un client dans l'onglet Vente pour voir ses Bons de Commande.
Chargement des Bons de Commande...
Aucun Bon de Commande
Ce client n'a pas de BC en cours.
ID Commande : {{ etatBcList[etatBcIdx].IDVente }}
Nom Client : {{ selectedClientCO.NomClient }}
Date de Commande : {{ formatDateTimeCO(etatBcList[etatBcIdx].DteDeCommande) }}
Date de Livraison : {{ formatDateTimeCO(etatBcList[etatBcIdx].DteEcheance) }}
Caissier : {{ etatBcList[etatBcIdx].UserBC || '—' }}
État : Livré En Attente
Vente en Détail Vente Grossiste Vente VIP
Désignation Unité Qté P.U. Montant
Chargement...
Aucune ligne
{{ l.NomProduit }} {{ l.Unite }} {{ formatPrice(l.PrixApresRemise) }} {{ formatPrice(l.MontantTotal) }} 🔒
{{ (infoSociete && infoSociete.etiqMontantBrut) || 'Montant Brut' }} : {{ formatPrice(etatBcList[etatBcIdx].MontantBrut) }}
Remise ({{ (parseFloat(etatBcList[etatBcIdx].RemisePr) || 0).toFixed(2) }} %) : {{ formatPrice(etatBcList[etatBcIdx].RemiseVal) }}
{{ (infoSociete && infoSociete.etiqNetCom) || 'Net Commercial HT' }} : {{ formatPrice(etatBcList[etatBcIdx].MontantHT) }}
TVA ({{ etatBcList[etatBcIdx].TVAPr }} %) : {{ formatPrice(etatBcList[etatBcIdx].TVA) }}
{{ (infoSociete && infoSociete.etiqMontTTC) || 'Net à Payer TTC' }} : {{ formatPrice(etatBcList[etatBcIdx].MontantTTC) }}
Acompte : {{ formatPrice(etatBcList[etatBcIdx].Acompte) }}
Reste à Payer : {{ formatPrice(etatBcList[etatBcIdx].RAP) }}
Observation : {{ etatBcList[etatBcIdx].Observation }}
Liste des Bons de Commande ({{ etatBcList.length }})
Chargement...
Aucun BC pour ce client
{{ bc.IDVente }}
{{ formatPrice(bc.MontantTTC) }}
{{ formatDateTimeCO(bc.DteDeCommande) }}
RAP : {{ formatPrice(bc.RAP) }}
Livraison : {{ formatDateTimeCO(bc.DteEcheance) }}
✓ Facturé / Livré ⏳ En cours
Facturation et Livraison du Bon de Commande
Commande : {{ etatBcList[etatBcIdx].IDVente }}
Client : {{ selectedClientCO && selectedClientCO.NomClient }}
Montant TTC : {{ formatPrice(etatBcList[etatBcIdx].MontantTTC) }}
Acompte déjà payé : {{ formatPrice(etatBcList[etatBcIdx].Acompte) }}
Reste à Payer : {{ formatPrice(etatBcList[etatBcIdx].RAP) }}
Paiement Acompte — Historique
Commande : {{ etatBcList[etatBcIdx].IDVente }}
Client : {{ selectedClientCO && selectedClientCO.NomClient }}
Montant TTC : {{ formatPrice(etatBcList[etatBcIdx].MontantTTC) }}
Acompte déjà payé : {{ formatPrice(etatBcList[etatBcIdx].Acompte) }}
Reste à Payer : {{ formatPrice(etatBcList[etatBcIdx].RAP) }}
Acompte Date User Poste
Chargement...
Aucun acompte partiel enregistré.
{{ formatPrice(p.MontantAcompte) }} {{ formatDateHeure(p.Dte) }} {{ p.UserBc }} {{ p.IdPoste }}
Total : {{ formatPrice(historiqueAcompteBcTotal()) }}
Versement Acompte Partiel
Commande : {{ etatBcList[etatBcIdx].IDVente }}
Reste à Payer : {{ formatPrice(etatBcList[etatBcIdx].RAP) }}
Onglet actif : {{ caisseOngletActif }}
F_Vente_avec_Ongler — Sous-étape 1.A (Squelette)
{{ ticketData.ste.NomSte }}
{{ ticketData.ste.Adresse }}
{{ ticketData.ste.Tel }} {{ ticketData.ste.Email }}
Ticket de Commande
N° Ticket : {{ ticketData.numTicket }}
{{ ticketData.cmd.NomTable || 'Table ' + getNumTable(ticketData.cmd.NumDetailTables) }} Commande {{ getNumCommande(ticketData.cmd.NumDetailTables) }}
N° Attente : {{ caisseNumeroAttenteComplet }}
{{ formatDateHeure(ticketData.cmd.DteDeVente) }}
Désignation Qté
{{ item.name }}
{{ item.commentaire }}
{{ item.quantity }}
Couverts : {{ ticketData.cmd.NbrPrs }}
Obs : {{ ticketData.cmd.Observation }}
Planning de Réservation
×
Du {{ formatDate(planningDates[0]) }} Au {{ formatDate(planningDates[planningDates.length-1]) }}
Chambre
{{ getDayName(date) }}
{{ date.getDate() }}/{{ date.getMonth()+1 }}
{{ (appro.tauxDevise || 0).toLocaleString('fr-FR', {minimumFractionDigits: 2, maximumFractionDigits: 2}) }} {{ appro.symboleDevise || 'Ar' }}

Nouvelle Ligne

{{ p.name }} ({{ p.reference }})
{{ formatPrice(Number(p.priceParticulier) || 0) }} Stk: {{ p.stock !== undefined && p.stock !== null ? p.stock : '—' }} Service
{{ currentApproItem.unite }}
Code Barre Désignation Qté Unité Prix d'Achat Remise Montant Action
{{ item.codeBarre }} {{ (produitsBoutique.find(p => p.id == item.idProduit) || {}).name || item.idProduit }} {{ item.unite }} {{ item.remise }}% {{ formatPrice((item.qte || 0) * (item.prixAchat || 0) * (1 - (item.remise || 0) / 100) * (appro.tauxDevise || 1)) }}
Aucune ligne. Utilisez la zone au-dessus pour ajouter des produits.
{{ formatPrice(appro.rapAnterieur) }}
{{ formatPrice(appro.caisseActu) }}
{{ formatPrice(calculateApproTotal()) }}
Règlement
Reste à Payer Appro {{ formatPrice(calculateApproRest()) }}
Entrer
Sortie
Commandes Fournisseur
Chargement…
Aucune commande trouvée.
{{ bc.RefComndFrns }}
{{ formatDateFr(bc.DtedCmndFrns) }}
En Attente Livrée
{{ formatPrice(bc.MontantTTC) }}
Bon de Commande : {{ selectedApproBC.RefComndFrns }}
{{ formatDateFr(selectedApproBC.DtedCmndFrns) }} · Devise {{ selectedApproBC.Devise || 'Ariary' }}
⚠ Ce Bon de Commande est déjà livré. Pour l'ajouter de nouveau à l'Appro, utilisez les quantités en tant que référence uniquement.
Code Désignation Unité PU HT Qté Cmd Montant
{{ l.CodeBarre || '-' }} {{ l.NomProduit || '(produit inconnu)' }} {{ l.UnitProduit || '-' }} {{ formatPrice((l.PrixUnitaire || 0) * (l.QteCommande || 0)) }}
Aucune ligne détail.
Sélectionnez un Bon de Commande à droite pour voir ses détails.

Famille Produit

×
Famille Père
{{ fp }}
Famille Fils ({{ selectedFamillePere || '...' }})
{{ ff }}
Produits ({{ selectedFamilleFils || '...' }})
Code Barre Nom Produit Unité Prix Vente Gros VIP Qté Gros Qté VIP Stock Seuil Péremption Active Cuisine Convers Obs
{{ p.StockProduit }}
0
Valeur CMUP {{ formatPrice(totalGlobalCMUP) }}
Valeur Prix Détail {{ formatPrice(totalGlobalRetail) }}
Marge potentielle : {{ formatPrice(margePotentielleValeur) }}
soit {{ margePotentiellePct.toFixed(2) }}% du CMUP
Nom Produit {{ globalSortIcon('NomProduit') }} Unité {{ globalSortIcon('UnitProduit') }} Prix Vente {{ globalSortIcon('PrixDeVente') }} Gros {{ globalSortIcon('PrixDeVenteGrossiste') }} VIP {{ globalSortIcon('PrixDeVenteVIP') }} Stock {{ globalSortIcon('StockProduit') }} Seuil {{ globalSortIcon('SeuilProduit') }} CMUP {{ globalSortIcon('CMUP') }}
{{ gp.NomProduit }} {{ gp.UnitProduit }} {{ formatPrice(gp.PrixDeVente) }} {{ formatPrice(gp.PrixDeVenteGrossiste) }} {{ formatPrice(gp.PrixDeVenteVIP) }} {{ gp.StockProduit }} {{ gp.SeuilProduit }} {{ formatPrice(gp.CMUP) }}
{{ totalGlobalCount }}

Famille Service

×
Nom Famille Service
{{ fs }}
Produits ({{ selectedFamilleService || '...' }})
Code Barre Désignation Service Unité Prix Detail Prix Gold Prix Silver Qté Gold Qté Silver Compteur Temps mn Active Cuisine Action
Sélectionnez une famille à gauche pour voir les produits.

Commande vers Fournisseur

×

Commande

Paramètres Commande

Nouvelle Ligne

{{ p.name }} ({{ p.reference }})
{{ formatPrice(Number(p.priceParticulier) || 0) }} Stk: {{ p.stock !== undefined && p.stock !== null ? p.stock : '—' }} Service
{{ currentFrnsItem.unite }}
{{ commandeFrns.items.length }} Lignes
Code Barre Désignation Unité Qté PU HT Montant Commande Action
{{ (produitsBoutique.find(p => p.id == item.idProduit) || {}).reference || item.idProduit }} {{ (produitsBoutique.find(p => p.id == item.idProduit) || {}).name || 'Produit ' + item.idProduit }} {{ item.unite }} {{ formatPrice(item.prixUnitaire) }} {{ formatPrice((item.qte || 0) * (item.prixUnitaire || 0)) }}
Aucune ligne. Utilisez la zone au-dessus pour ajouter des produits.
Récapitulatif
{{ formatPrice(commandeFrnsTotals.ht) }}
{{ formatPrice(commandeFrnsTotals.tva) }}
Montant TTC {{ formatPrice(commandeFrnsTotals.ttc) }}

Saisie Proforma ou Bon de Commande Clients

×

Proforma / BC Client

{{ profoBC.nomClient }} GROS VIP DÉTAIL
{{ cli.NomClient }}
Tél : {{ cli.ContactClient }} (pas de contact) · {{ cli.IDClient }}
GROS VIP DÉTAIL

Nouvelle Ligne

{{ p.name }} ({{ p.reference }})
{{ formatPrice(profoGetPriceForClient(p, profoQteTotaleProduit(p.id, currentProfoItem.qte))) }} Stk: {{ p.stock !== undefined && p.stock !== null ? p.stock : '—' }} Service
{{ currentProfoItem.unite }}
{{ profoBC.items.length }} Lignes
Code Barre Désignation Unité Qté PU Montant Action
{{ (produitsBoutique.find(p => p.id == item.idProduit) || {}).reference || item.idProduit }} {{ (produitsBoutique.find(p => p.id == item.idProduit) || {}).name || 'Produit ' + item.idProduit }} {{ item.unite }} {{ formatPrice(item.prixUnitaire) }} {{ formatPrice((item.qte || 0) * (item.prixUnitaire || 0)) }}
Aucune ligne. Utilisez la zone au-dessus pour ajouter des produits.
Récapitulatif
{{ formatPrice(profoBCTotals.montantBrut) }}
% {{ currencySymbol }}
{{ formatPrice(profoBCTotals.montantHT) }}
{{ formatPrice(profoBCTotals.tva) }}
{{ infoSociete.etiqMontTTC || 'Montant TTC' }} {{ formatPrice(profoBCTotals.montantTTC) }}
Arrêtée la présente à la somme de: {{ numberToLettre(profoBCTotals.montantTTC) }}
×

Gestion de Prix de Vente des Produits

Utilisateur: {{ loggedInUser }}
×
Nom Famille Produit
{{ f.NomFamille }}
Aucune famille trouvée
{{ prixSelectedFamille ? prixSelectedFamille : 'Sélectionnez une famille' }} ({{ prixProduits.length }} produits)
Désignation Unité CMUP Dernier P.A Prix de Vente HT
Détail Gros VIP
{{ p.NomProduit }} {{ p.UnitProduit }} {{ formatPrice(p.CMUP) }} {{ formatPrice(p.PrixBouteilVide) }}
Aucun produit dans cette famille. Sélectionnez une famille pour afficher les produits.
Recherche Produit
Résultats de Recherche ({{ prixSearchResults.length }} résultats)
Nom du Produit Prix Détail CMUP Prix Gros Prix VIP
{{ r.NomProduit }} {{ formatPrice(r.PrixDeVente) }} {{ formatPrice(r.CMUP) }} {{ formatPrice(r.PrixDeVenteGrossiste) }} {{ formatPrice(r.PrixDeVenteVIP) }}
Aucun résultat. Lancez une recherche.
{{ prixSearchResults.length }} résultats
Modification Prix de ({{ prixModifProduct.NomProduit }})
{{ prixModifProduct.CodeBarre || '' }}
{{ prixModifProduct.IDproduit }}
{{ prixModifProduct.NomProduit }}
{{ prixModifProduct.UnitProduit || '-' }}
{{ formatPrice(prixModifProduct.CMUP) }}
Prix de Vente HT
Prix Modifié (non enregistré)
Prix de Vente Inférieur au CMUP
Le Produit n'a pas encore un Prix de Vente
Liste des Chambres
×
Categorie {{ tableSortIcon('chambres','Categorie') }} Chambre {{ tableSortIcon('chambres','Chambre') }} Lit Simple {{ tableSortIcon('chambres','nbLitSimple') }} Lit Double {{ tableSortIcon('chambres','nbLitDouble') }} Prix {{ tableSortIcon('chambres','PrixDetailHauteSaison') }} Prix Agence {{ tableSortIcon('chambres','PrixGrosHauteSaison') }} Prix VIP {{ tableSortIcon('chambres','PrixVIPHauteSaison') }} Equipement {{ tableSortIcon('chambres','equipement') }}
{{ ch.Categorie }} {{ ch.Chambre || ch.chambre }} {{ ch.nbLitSimple || 0 }} {{ ch.nbLitDouble || 0 }} {{ formatPrice(ch.PrixDetailHauteSaison || 0) }} {{ formatPrice(ch.PrixGrosHauteSaison || 0) }} {{ formatPrice(ch.PrixVIPHauteSaison || 0) }} {{ ch.equipement || '-' }}
Aucune chambre trouvée
Enr: {{ chambreCurrentPage }} sur {{ getTotalChambrePages() }}
{{ chambreFilterCategorie === 'ALL' && !chambreSearchQuery ? 'Aucun filtre' : 'Filtré' }} {{ getFilteredChambres().length }} chambre(s)

Acompte et Date de Livraison

Acompte et Date d'Echeance pour le Reste a Payer
{{ currencySymbol }}
{{ currencySymbol }}

⚙️ Paramètres

Gestion des Utilisateurs

Nom Nom Famille Statut Actif Actions
{{ user.NomUser }} {{ user.NomDeFamille }} {{ user.Statut }} ✔️

Gestion des Boutons

Coordonnées de votre Société

Identité, fiscalité, étiquettes facture, mail rapports, devise.

Identité Société
Aucun logo

Auto-redimensionné à 400×400 max

Ticket & Paramètres
Type d'Impôt

Synthétique : pas de TVA (HT = TTC). Assujetie : TVA active.
⚠ Irréversible une fois Assujetie activée et sauvegardée.

Style Documents (Facture)
Personnalisation Étiquettes Facture
Mail Rapports de Clôture
Devise
Caisse
Si activé : une Clôture, Passation ou Déconnexion avec un Billetage incorrect (différence négative) est quand même acceptée. Sinon, elle est refusée tant que le Billetage n'est pas correct.

Mode d'utilisation du Logiciel

Architecture de déploiement et paramètres mobile.

Comment voulez-vous utiliser ce Logiciel
Paramètre Appareil Mobile

Périphérique du Logiciel

Configuration des périphériques pour ce poste uniquement.

Type Lecteur Code Barre
Type Imprimante
Type de Caisse
Colonnes Liste Produits (Vente au Comptoir)
Coche pour afficher la colonne, utilise ↑ / ↓ pour changer l'ordre d'affichage. « Nom du Produit » est toujours en position 1.
{{ idx + 1 }}

Paramètres de Remise Globale

Promotions personnalisées par groupe de produits OU par famille — la remise s'applique automatiquement entre la date de début et la date de fin.

ID Groupe Nom Date Début Date Fin Remise État Actions
Chargement…
Aucun groupe de promotion enregistré.
{{ g.IDGroupeProm }} {{ g.NomGroupe }} {{ g.DteDebut ? new Date(g.DteDebut).toLocaleDateString('fr-FR') : '—' }} {{ g.DteFin ? new Date(g.DteFin).toLocaleDateString('fr-FR') : '—' }} -{{ g.RemiseAppliquer }} % {{ g.Etat }}

⭐ Paramètres de Fidélisation des Clients par Point

Configurez les règles d'attribution de points et les paliers de remise.

{{ fidelisationData.clientsAvecPoints }} client(s) possèdent déjà des points de fidélité. La modification des paramètres peut affecter leur calcul de remise.
ID Fidélisation : {{ fidelisationData.IDFidelisation }} Dernière modif : {{ new Date(fidelisationData.DateModif).toLocaleString('fr-FR') }}
Règles d'attribution de points

💡 Les tranches CA et Fréquence sont mutuellement exclusives — si vous saisissez l'une, l'autre est remise à 0.

Paliers de Remise
Points Obtenus Remise en % à Accorder Action
Aucun palier défini. Cliquez « + Ajouter un palier ».
Note d'utilisation :
Veuillez mettre les Points en Ordre Croissant. Ex: 1, 3, 5, 7 (du plus petit au plus grand).
Attention : Si vous ne respectez pas cette instruction, les conditions de Fidélisation risquent de compromettre tous les calculs.

Exportation Général des Bases de Données

Cliquez sur une base pour la télécharger en CSV (compatible Excel — séparateur ; + UTF-8 BOM).

Listes des Appareils Connectés

Nom Serveur (Appareil) ID Appareil Active Action
{{ dev.NomAppareil }} {{ dev.IDDevice }} {{ dev.active ? '☑' : '☐' }} {{ dev.active ? 'Oui' : 'Non' }}
Aucun appareil enregistré

Votre Adresse IP : {{ serverAddresses }}

Configuration Générale

🔄 Réinitialisation de la Base de Données

Supprime tout ou partie des données : Approvisionnement, Ventes, BL, BS, Proforma, Commandes, Clients, Fournisseurs, Produits, Chambres, Réservations, etc. Action irréversible — utiliser avec extrême prudence.

🟢 Action déverrouillée par LOGITOKY — usage unique. Cliquez pour ouvrir.

🔒 Action verrouillée. Pour réinitialiser, contactez LOGITOKY qui activera l'interrupteur via GSActivator.exe.

🔒 La réinitialisation de la base de données est réservée aux Administrateurs.
🔄 Recalcul des Montants des Commandes

Compare le header T_Commande_Tables.MontantTTC avec la somme réelle des lignes T_Detail_Commande_Tables.MontantTotalVnt et corrige les écarts éventuels (header désynchronisé après modif/suppression de ligne). Utile quand le total dans « Commande En Cours » diverge du « Montant Total des Commandes Actuel ».

{{ recalcResultMsg }}
🧾 Recalcul des Comptes Clients (RAP)

Recalcule T_Client.RAP / RAPSomme / CARealiser depuis la somme réelle de T_Detail_Compte_Client (lignes non annulées) pour TOUS les clients dont le solde stocké diverge. Utile après une migration 3.0 ou quand le « Solde » du Détail Compte ne correspond pas au RAP de la liste clients.
Action non-destructive : seuls les clients dont le RAP stocké diffère de la somme calculée sont corrigés (les autres sont ignorés).

{{ recalcRapResultMsg }}
🏨 Rectification Globale des Réservations

Réaligne le document financier de chaque réservation active (T_BL débiteur ou T_Commande avec acompte) sur le séjour tel qu'il est aujourd'hui : nuitées × prix/nuit − remise. Corrige l'en-tête, la ligne de détail, la ligne du Compte Client et le RAP / RAPBC des clients concernés. Utile quand le « Reste à payer » de la fiche réservation ne correspond pas au RAP de la liste clients (séjour prolongé, réservation confirmée pour une seule nuit…).
Deux temps : « Analyser » liste les écarts sans rien écrire ; « Appliquer » ne corrige que les réservations listées. BL facturés, BC livrés et locations à l'heure sont ignorés.

{{ rectifResaMsg }}
Réservation Client Nuits Doc Actuel Attendu Écart
{{ d.numSejour }} {{ d.client }} (doc sur {{ d.clientDoc }}) {{ d.nuits }} × {{ formatPrice(d.prixNuit) }} {{ d.doc }} {{ formatPrice(d.actuel) }} {{ formatPrice(d.attendu) }} {{ formatPrice(d.ecart) }}
💰 Recalcul des CMUP des Ventes Archivées

Met à jour T_Consul_Detail_Vente.CMUPDetail pour les lignes qui ont CMUPDetail = 0 en copiant le CMUP courant depuis T_Produit. Utile après correctif du bug d'enregistrement CMUP (mai 2026) — affecte directement les calculs de marge dans tous les rapports (palmarès, journal des ventes, etc.).
Action non-destructive : aucune valeur valide n'est écrasée. Seules les lignes à 0 sont corrigées.

{{ recalcCmupResultMsg }}

📋 Produits sans CMUP (CMUP=0)

{{ produitsSansCmupData.nbProduits }} produit(s) ont CMUP=0 et déjà des ventes. CA cumulé sans marge calculable : {{ formatPrice(produitsSansCmupData.totalCAImpacte) }}.
💡 Pour corriger : ouvre la fiche produit (Paramètres → Produits) et saisis le CMUP, ou fais un approvisionnement avec prix d'achat. Ensuite clique « 💰 Recalculer les CMUP » pour corriger les marges des ventes archivées.
Produit Prix Vente Stock Nb Ventes Qté Vendue CA sans marge
{{ p.nomProduit }}
{{ p.idProduit }}
{{ formatPrice(p.prixDeVente) }} {{ p.stock }} {{ p.nbVentes }} {{ p.qteVendueTotale }} {{ formatPrice(p.caManquantMarge) }}
✓ Aucun produit sans CMUP — toutes les ventes peuvent calculer leur marge.
🧹 Nettoyer Tag [stock-resync-done] dans Observations

Retire le tag [stock-resync-done] qui pouvait être inscrit dans T_Consul_Vente.Observation par une ancienne version du re-sync stock. Le tag est désormais géré en mémoire — cette action nettoie les ventes archivées polluées.
Action non-destructive : seul le tag est retiré, le reste de l'observation est conservé.

{{ nettoyerTagResultMsg }}
💾 Sauvegarde de la Base de Données

Copie quotidienne automatique de la base + archive vers le dossier Sauvegarde GS.Caisse 3.0 Auto. Le serveur vérifie chaque heure si la sauvegarde du jour a été faite.

📁 Dossier : {{ backupStatus.backupFolder || '(non défini)' }}
🕒 Dernière sauvegarde : {{ backupStatus.lastBackup || '(jamais)' }}
⏰ Timer horaire : {{ backupStatus.timerActive ? '🟢 actif' : '🔴 inactif (redémarrer le serveur)' }}
⚠ {{ backupStatus.dbError }}

Autres paramètres à venir...

🔐 Réinitialisation Mot de Passe Administrateur

{{ firstUseDateAffichage() }}
⚠ {{ pwdResetModal.error }}

💡 Communiquez l'ID Logiciel ci-dessus à LOGITOKY (032 84 289 89). En retour vous recevrez un Code à saisir.
Si valide, le mot de passe de tous les comptes Administrateur sera réinitialisé à 123.

⚠️ Motif d'Annulation de la Commande
⚠ Action irréversible
La commande sera supprimée définitivement de la base. Veuillez saisir le motif.
Note : le motif est tracé côté serveur (log d'audit).
🔐

Double Authentification

Bonjour {{ totp2FA.username }}

Entrez le code à 6 chiffres affiché dans votre application d'authentification (Google Authenticator, Authy, Microsoft Authenticator…)

Entrez l'un de vos codes de secours (format XXXX-XXXX).
⚠️ Ce code sera invalidé après usage.

❌ {{ totp2FA.error }}
{{ totp2FA.useRecovery ? '← Utiliser le code de mon authenticator' : 'Je n\'ai pas accès à mon téléphone — utiliser un code de secours' }}
🔐

Activer la Double Authentification

{{ loggedInUser }}

Pour des raisons de sécurité, confirmez votre mot de passe avant de configurer la double authentification.

❌ {{ totp2FASetup.error }}

1. Scannez ce QR code avec votre application (Google Authenticator, Authy, Microsoft Authenticator…) :

QR 2FA
Pas de scanner ? Saisir la clé manuellement
{{ totp2FASetup.secret }}

2. Entrez le code à 6 chiffres affiché dans votre application :

❌ {{ totp2FASetup.error }}
⚠️ IMPORTANT — Notez ces codes maintenant

Ces codes de secours vous permettront de vous connecter si vous perdez l'accès à votre téléphone. Ils ne seront affichés QU'UNE SEULE FOIS. Chaque code est à usage unique.

{{ code }}
⚠️

Désactiver la 2FA

Vous êtes sur le point de désactiver la double authentification. Confirmez votre mot de passe + un code TOTP valide.

❌ {{ totp2FADisable.error }}
🔁

Régénérer les codes de secours

⚠️ Les 10 anciens codes seront invalidés et remplacés par 10 nouveaux.

❌ {{ totp2FARegen.error }}
⚠️ Notez ces nouveaux codes — les anciens sont invalidés
{{ code }}
🔐

Sécurité — Mon compte

{{ loggedInUser }}
{{ totp2FAStatus.enabled ? '✓' : '⚠️' }}
Double Authentification : {{ totp2FAStatus.enabled ? 'ACTIVÉE' : 'NON ACTIVÉE' }}
Codes de secours restants : {{ totp2FAStatus.nbRecoveryRestants }} / 10
Renforcez la sécurité de votre compte avec un code à 6 chiffres temporaire.
— ADMINISTRATION —
🛡️

Administration 2FA

Réinitialiser la 2FA d'un utilisateur
⏳ Chargement…
Utilisateur 2FA Codes restants Action
{{ u.NomUser }}
{{ u.Statut }}
✓ Active {{ totp2FAUsersStatus[u.NomUser].nbRecoveryRestants }} / 10 (vous-même)
Aucun utilisateur
🔄

Réinitialiser la 2FA

Cible : {{ totp2FAAdminReset.targetUser }}
⚠️ Action irréversible

Le secret 2FA et tous les codes de secours de {{ totp2FAAdminReset.targetUser }} seront supprimés. Cet utilisateur pourra se connecter sans 2FA et devra la réactiver depuis son profil.

❌ {{ totp2FAAdminReset.error }}

Première Utilisation, Lisez Attentivement!!!

!!!  Important  !!!

Après ce Message

1) Créer un Nouveau Nom d'Utilisateur et un Mot de Passe avec le Statut ADMINISTRATEUR.

2) *Utilisez ce Nouveau Nom et Nouveau Mot de Passe pour ouvrir l'Application

3) Avant de Cliquer sur OK, assurez-vous que la Date de Votre Ordinateur est bien correcte.

{{ firstUseDateAffichage() }}

4) Cliquer sur OK si vous avez Bien Compris, Annuler pour Sortir si vous n'êtes pas sûr

*Il est Impossible de récupérer le Mot de Passe si vous l'oubliez!!!.
La Réinitialisation du Mot de Passe nécessite un coût de prestation Supplémentaire.

⚙️ Configuration du Logiciel — Étape 2/3

Comment voulez-vous Utiliser ce Logiciel
Mode de Paiement

Si vous recevez plusieurs paiements autres que l'espèce dans la journée (Chèque, Orange Money, MVola, Airtel Money…), vous pourrez les configurer dans Paramètres → Périphérique du Logiciel.

Paramètre Appareil Mobile

👤 Premier Utilisateur — Étape 3/3

⚠ {{ firstUseWizard.error }}

💡 Ce premier utilisateur Administrateur remplacera l'utilisateur par défaut iTooky.
Aucun mot de passe ne peut être récupéré en cas d'oubli — notez-le précieusement.

Supprimer Tout

Attention : chaque bouton supprime ou réinitialise une partie de la base. Les opérations sont irréversibles. Aucune sauvegarde automatique n'est faite.
⏳ Opération en cours…
{{ l }}
{{ e }}
📊 Nombre Total d'enregistrements Total : {{ resetDbTotalCount.toLocaleString('fr-FR') }}
Table Enregistrements
{{ c.table }} {{ c.count !== null ? c.count.toLocaleString('fr-FR') : '—' }}

💱 Cours d'aujourd'hui — {{ new Date().toLocaleDateString('fr-FR') }}

Devise Cours Unité Nom Centime Défaut
Aucune devise. Cliquez sur « + Ajouter ».

Une seule devise peut être marquée comme Défaut (automatiquement décochée sur les autres lignes).

{{ originalUsername ? 'Edit Paramètres de ' + originalUsername : 'Nouvel Utilisateur' }}

Paramètres des Produits
Paramètres Système
Paramètres des Ventes
Paramètres des Appro et Confidentialité
Paramètres des Clients
Opération RAP Client
🔐 Sécurité — Double Authentification (2FA)
⏳ Vérification…

🔘 Bouton Père et Fils

{{ selectedBoutonPereIndex + 1 }} / {{ boutonsParents.length }}
Boutons Fils (10 emplacements)
#{{ index + 1 }}

📦 Bouton Fils et Produit

Produits (40 emplacements)
#{{ index + 1 }}

{{ isResto ? 'Listes des Tables' : 'Listes des Caisses' }}

{{ isResto ? 'Vous avez Combien de Tables?' : 'Vous voulez Combien de Caisse?' }}
{{ isResto ? 'Num\u00e9ro Table' : 'Num\u00e9ro Caisse' }} {{ isResto ? 'Nom de Votre Table' : 'Nom de Votre Caisse' }}
{{ table.IDTable }}
Listes Cuisson
Cuisson
NomCuisson
{{ c.NomCuisson }}

Eclatement de la Facture

Commande en cours
NomProduit Qte Prix U Montant
{{ item.name }} {{ item.qte }} {{ formatPrice(item.prix) }} {{ formatPrice(item.prix * item.qte) }}
Aucun article
{{ formatPrice(eclateSourceTotal) }}
Facture éclatée
Désignation Qté Prix HT Montant HT
{{ item.name }} {{ item.qte }} {{ formatPrice(item.prix) }} {{ formatPrice(item.prix * item.qte) }}
Aucun article — cliquez > pour basculer
{{ infoSociete.etiqMontBrut || 'Montant Brut' }}
{{ formatPrice(eclateDestMontantBrut) }}
{{ eclateRemiseAutorise ? '🔓' : '🔒' }} REMISE %
REMISE Ar
TVA {{ infoSociete.tauxTVA }}%
{{ formatPrice(eclateDestTVA) }}
{{ infoSociete.etiqMontTTC || 'Net à Payer' }}
{{ formatPrice(eclateDestNetAPayer) }}
Client :
{{ cli.name }}
📞 {{ cli.contact }}
{{ getClientTypeLabel(cli.type) }}
Mode Paiement
Banque

Paiement par Chèque (Éclaté)

Nom du Propriétaire
Banque
Type du Chèque
Numéro du Chèque
Montant du Chèque
{{ currencySymbol || 'Ar' }}

Sélectionner le Client Débiteur (Éclaté)

Nom Client Type RAP
{{ cli.NomClient }} {{ cli.TypeClient || 'Particulier' }} {{ formatPrice(cli.RAPSomme || 0) }}
Aucun client trouvé
Client sélectionné : {{ eclateDebiteurSelected.NomClient }} — RAP : {{ formatPrice(eclateDebiteurSelected.RAPSomme || 0) }}

Paiement par Chèque

Nom du Propriétaire
Banque
Type du Chèque
Numéro du Chèque
Montant du Chèque
{{ currencySymbol || 'Ar' }}

Autre Paiement

Virement / Mobile Money Total : {{ formatPrice(tpeVirementTotal) }}
Banque Numéro Référence Montant
{{ v.banque }}💳 dont frais {{ v.tauxCarte }}% : {{ formatPrice(v.fraisCarte) }} {{ v.numeroBancaire }} {{ v.reference || '—' }} {{ formatPrice(v.montant) }}
Chèque Total : {{ formatPrice(tpeChequeTotal) }}
Propriétaire Banque Type Numéro Montant
{{ c.proprietaire }} {{ c.banque }} {{ c.type }} {{ c.numero }} {{ formatPrice(c.montant) }}
Espèce : {{ currencySymbol || 'Ar' }}
Net à payer : {{ formatPrice(tpeNetAPayer + tpeFraisCarteTotal) }} 💳 dont Frais Carte : {{ formatPrice(tpeFraisCarteTotal) }} (ajoutés à la facture) Total saisi : {{ formatPrice(tpeTotalSaisi) }}
Banque
{{ tpePaveNumBanque ? tpePaveNumBanque.Banque : '' }}
Référence de Virement
Commission {{ tpePaveNumTaux }}%{{ formatPrice(tpePaveNumCommission) }}
Total carte{{ formatPrice(tpePaveNumTotalAvecFrais) }}

Commentaire pour :

{{ commentaireArticleNom }}
({{ commentaireArticleCuisson }})
🍚 {{ commentaireArticleAccomp }}
Coordonné de votre Banque ou Opérateur
pour le virement en votre compte.
Banque
Adresse de la Banque
{{ (isVenteComptoir && (!currentOrder || currentOrder.length === 0)) ? 'Liste Clients' : 'Vente Débiteur - Sélection Client' }}
⚠ Un client doit être sélectionné pour effectuer une vente débiteur (Bon de Livraison)
Client Téléphone RAP (Solde)
{{ cli.NomClient }} {{ cli.Telephone || '' }} {{ formatPrice(cli.RAP || 0) }}
{{ debiteurClientSearch ? 'Aucun résultat' : 'Tapez pour rechercher un client...' }}
✓ Client sélectionné :
{{ debiteurSelectedClient.NomClient }} RAP: {{ formatPrice(debiteurSelectedClient.RAP || 0) }}
Etat de Compte du Client {{ compilFactureClientNom }}
Detail Compte de {{ compilFactureClientNom }}
Date d'Opération Libelle de l'Opération Debit Credit Utilisateur Print
{{ ligne.dteOperation }} {{ ligne.Libelle }} {{ ligne.SoldeDebitClient ? formatPrice(ligne.SoldeDebitClient) : '' }} {{ ligne.SoldeCreditClient ? formatPrice(ligne.SoldeCreditClient) : '' }} {{ ligne.NomUser }}
Aucun BL non facturé pour ce client
RAP Bon de Livraison
Debit
{{ formatPrice(compilFactureDebit) }}
Credit
{{ formatPrice(compilFactureCredit) }}
Solde
{{ formatPrice(compilFactureSolde) }}
Résumé des BL Sélectionnés
Produit Qté Prix Unit. Total BL
{{ item.NomProduit || item.IDproduit }} {{ item.QteSortieBL }} {{ formatPrice(item.PrixUnitaire) }} {{ formatPrice(item.MontantTotal) }} {{ item.IDSortieBL }}
Aucun détail disponible
Total Sélectionné : {{ formatPrice(compilResumerTotal) }}
{{ infoSociete.nomSte || '' }}
{{ new Date().toLocaleString('fr-FR') }}
{{ caisseNumeroAttente }}
🏨 Client Chambre - Sélection
Clients avec chambre occupée — Vente Débiteur sur Chambre
Client Chambre / Tél RAP (Solde)
{{ cli.NomClient }} {{ cli.chambre || cli.Telephone || '' }} {{ formatPrice(cli.RAP || 0) }}
{{ chambreClientSearch ? 'Aucun client trouvé' : 'Chargement...' }}
✓ Client sélectionné :
{{ chambreSelectedClient.NomClient }} Chambre: {{ chambreSelectedClient.chambre }} RAP: {{ formatPrice(chambreSelectedClient.RAP || 0) }}
Gestion des Banques
Banque Adresse 💳 Taux % Actions
Aucune banque enregistrée
+ Ajouter une nouvelle banque

Transfert de commande

Transférer la commande de {{ selectedTable ? selectedTable.label : '' }} {{ transfertTargetTable.label || transfertTargetTable.NomTable }}

1. Choisir la table destination :

2. Choisir la commande destination :

Aucune commande sur cette table. Transfert direct...

📝 Motif du Transfert

Transfert vers : {{ transfertTargetTable ? transfertTargetTable.NomTable : '' }}

🔐 Accès Administrateur

Cette remise % sera figée dans T_Commande_Tables.RemisePr Cette remise en Ar sera figée dans T_Commande_Tables.RemiseVal
{{ adminAuthError }}

📝 Motif d'annulation

➖ Diminuer la quantité

Article :
{{ decrementQteItemName }}
Quantité actuelle : {{ decrementQteCurrent }}
La ligne redeviendra ré-imprimable en cuisine après validation.

Offert - Articles gratuits

Sélectionnez les articles à offrir (prix passé à 0) :

Désignation Qté Prix original
{{ item.name }} {{ item.quantity }} {{ formatPrice(item.price * item.quantity) }}

Listes des Appareils Connecter

Nom Serveur (Appareil) ID Appareil Active Action
{{ dev.NomAppareil }} {{ dev.IDDevice }} {{ dev.active ? '☑' : '☐' }} {{ dev.active ? 'Oui' : 'Non' }}
Aucun appareil enregistré

Votre Adresse IP : {{ serverAddresses }}

📝 Paramètres de l'Appareil

Identité
Périphériques
Lecteur Code Barre
Imprimante
Type de Caisse
Abonnement (lecture seule)

L'abonnement s'active uniquement depuis l'application VBA (Form_F_Activation).

🎁 Création d'un Groupe de Promotion

(toujours True à la validation)
Produits du Groupe
Code Barre / Recherche Désignation Action
{{ ligne.nomProduit }} — sélectionnez un produit —

📂 Promotion Globale Famille Fils

Nom Famille Fils
Période de la Promotion
Date du Début Date Fin
Remise % Action
Aucune promotion par famille fils. Cliquez « + Ajouter une ligne ».

⚠ La promotion par famille s'applique uniquement aux produits qui ne sont PAS déjà dans un groupe de promotion personnalisée.

⚠ Clients avec Points de Fidélité

Ces clients ont accumulé des points selon les anciens paramètres. Modifier les règles peut affecter leurs avantages. Vous pouvez exporter cette liste en CSV pour les avertir.
{{ clientsAvecPointsList.length }} client(s)
Nom Client Contact Points Fréquence CA Réalisé
{{ c.NomClient }} {{ c.ContactClient || '—' }} {{ c.PointClient }} {{ c.FrequenceDAchat }} {{ formatPrice(c.CARealiser) }} Ar

🔧 Promotions Orphelines — Restauration

Que sont les « promotions orphelines » ?
Des produits ont encore RemiseGlobaleFils > 0 alors qu'aucune promotion active ne les couvre. Cela arrive quand une promotion expire mais que la restauration automatique des prix échoue.

💡 La formule de restauration est : PrixDeVente × 100 ÷ (100 − RemiseGlobaleFils)
Total produits orphelins
{{ promoOrphelinsData.total }}
📂 Famille « {{ f.NomFamille }} »
{{ f.count }} produit{{ f.count > 1 ? 's' : '' }} concerné{{ f.count > 1 ? 's' : '' }}
Produit Prix Actuel Remise % Prix après resto.
{{ p.NomProduit }} {{ formatPrice(p.PrixDeVente) }} Ar {{ p.RemiseGlobaleFils }} % {{ formatPrice(p.PrixDeVente * 100 / (100 - p.RemiseGlobaleFils)) }} Ar
✓ Aucun produit orphelin. Toutes les remises sont cohérentes.

🔍 Diagnostic — Famille « {{ promoFilsDiag.nomFamille }} »

Total produits
{{ promoFilsDiag.stats.total }}
Actifs
{{ promoFilsDiag.stats.actifs }}
Sans groupe perso
{{ promoFilsDiag.stats.sansGroupePerso }}
Remise appliquée
{{ promoFilsDiag.stats.avecRemiseAppliquee }}
Sans remise
{{ promoFilsDiag.stats.sansRemise }}
⚠ Aucun produit n'a NomFamille = « {{ promoFilsDiag.nomFamille }} »
Familles ressemblantes (LIKE) :
  • « {{ f.NomFamille }} » ({{ f.NbProduits }} produit{{ f.NbProduits > 1 ? 's' : '' }})
→ Vérifiez le NomFamille (Famille Fils) des produits concernés dans la fiche Produit. Une différence de casse, espace ou suffixe suffit pour empêcher le match.
Produit Famille Père Prix Vente Remise % Groupe Perso ? Actif
{{ p.NomProduit }} {{ p.NomFamillePere || '—' }} {{ formatPrice(p.PrixDeVente) }} Ar {{ p.RemiseGlobaleFils }} % ⚠ Oui Non {{ p.ProduitActive ? '✓' : '✗' }}

💡 Légende : « Groupe Perso = Oui » signifie que ce produit appartient déjà à un groupe de promotion personnalisée — la promo par famille NE l'affectera PAS (logique VBA).

{{ promoFilsDiag.stats.avecRemiseAppliquee }} produit(s) ont encore une remise active (RemiseGlobaleFils > 0). Si la promotion a expiré sans restaurer les prix, utilisez ce bouton pour réparer.

📋 Détail — {{ detailGroupePromo.NomGroupe }}

ID Groupe : {{ detailGroupePromo.IDGroupeProm }}
Remise : -{{ detailGroupePromo.RemiseAppliquer }} %
Du : {{ detailGroupePromo.DteDebut ? new Date(detailGroupePromo.DteDebut).toLocaleDateString('fr-FR') : '—' }}
Au : {{ detailGroupePromo.DteFin ? new Date(detailGroupePromo.DteFin).toLocaleDateString('fr-FR') : '—' }}
Validation : {{ detailGroupePromo.Active ? 'Activée' : 'Inactive' }}
Remise appliquée ? {{ detailGroupePromo.Execute ? 'Oui' : 'Pas encore' }}
Produits ({{ (detailGroupePromo.Produits || []).length }})
Code Barre Nom Produit Prix Actuel Remise
{{ p.CodeBarre || '—' }} {{ p.NomProduit }} {{ formatPrice(p.PrixDeVente) }} -{{ p.RemiseGlobaleFils || 0 }} %
Aucun produit dans ce groupe.

🔒 {{ supervisorOverride.titre }}

{{ supervisorOverride.message }}

⚠ {{ supervisorOverride.error }}

{{ qrCodeTitre || 'QR Code' }}

QR Code
{{ qrCodeData }}

QR généré localement (aucune connexion Internet requise).

Appareil Mobile Autoriser

Activation Appareil

ID Logiciel
{{ activationDeviceIDLog }}
Scannez ce code avec l'application GS.activator pour activer votre abonnement.

💵 Dépense de Caisse

Chargement...
{{ clotureCaisse.user || loggedInUser }} {{ detailVirementMode === 'detail' ? 'Rapport Paiement Virement' : 'Somme des Virements par Banque' }}
{{ clotureCaisse.user || loggedInUser }} Rapport Paiement Chèque
Banque Type Propriétaire N° Chèque Facture Montant
Chargement...
Aucun chèque trouvé
{{ c.Banque }} {{ c.Type }} {{ c.Proprietaire }} {{ c.Numero }} {{ c.IDVente }} {{ formatMontant(c.Montant) }} Ar
Total {{ formatMontant(detailChequeTotal) }} Ar

💬 Commentaire Cuisine

{{ commentaireCuisineItem.name }}
Cuisson : {{ commentaireCuisineItem.cuisson }}
Accompagnement : {{ commentaireCuisineItem.accompagnement }}
Commentaire : {{ commentaireCuisineItem.manualComment }}
Aucun commentaire

Commande En Cours

Nom du Produit Qté Montant Table Commande Serveur
Chargement...
Aucune commande en cours
{{ cmd.NomProduit }} {{ cmd.SommeDeQteVendu }} {{ formatPrice(cmd.MontantTotal) }} {{ cmd.NomTable }} {{ cmd.Commande }} {{ cmd.Serveur }}
{{ commandeEnCoursFiltered.length }} ligne(s)
Total: {{ commandeEnCoursFiltered.reduce((s, l) => s + parseFloat(l.MontantTotal || 0), 0).toLocaleString('fr-FR') }} Ar

Afficheur Client

{{ afficheurLine1 }}
{{ afficheurLine2 }}