Modifier le rapport printer.closecash dans uniCenta oPOS

Modifier le rapport printer.closecash dans uniCenta oPOS

1. Présentation

Le fichier printer.closecash.xml permet de définir le contenu et la mise en page du ticket de clôture de caisse dans uniCenta oPOS.
Par défaut, ce ticket reste basique. En le personnalisant, on peut en faire un véritable outil de contrôle : suivi par caissier, par shift, analyse des paiements, TVA, annulations et ventes détaillées.


2. Fichier et technologie utilisés

  • Fichier :
    unicentaopos/reports/printer.closecash.xml
  • Moteur : Apache Velocity
  • Format : XML + directives Velocity (#if, #foreach, variables $payments)

3. Prérequis

  • Accès au répertoire d’installation de uniCenta
  • Droits administrateur
  • Sauvegarde du fichier original avant modification
  • Imprimante thermique 80 mm (42 caractères recommandés)

4. Restriction d’impression par rôle

On limite l’impression du ticket aux profils autorisés (Administrator / Manager).

#set($user = $payments.printUser())

#if($user == "Administrator" || $user == "Manager")
  <output>
    <ticket>
      ...
    </ticket>
  </output>
#else
  <output><ticket/></output>
#end

5. En-tête du ticket (gestion par shift)

Ajout des informations essentielles pour la traçabilité :

<image>Printer.Ticket.Logo</image>
<line/>
<line/>

<line size="1">
  <text align="center" bold="true" length="42">CLOTURE DE CAISSE</text>
</line>
<line><text>------------------------------------------</text></line>

<line>
  <text align="left" bold="true" length="12">Caissier:</text>
  <text align="left" length="30">${payments.printUser()}</text>
</line>
<line>
  <text align="left" bold="true" length="12">Terminal:</text>
  <text align="left" length="30">${payments.printHost()}</text>
</line>
<line>
  <text align="left" bold="true" length="12">Sequence:</text>
  <text align="left" length="30">${payments.printSequence()}</text>
</line>
<line>
  <text align="left" bold="true" length="12">Periode:</text>
  <text align="left" length="30">${payments.printDateStart()} → ${payments.printDateEnd()}</text>
</line>

<line><text>------------------------------------------</text></line>
<line/>

6. Paiements par type

Section centrale pour le contrôle de caisse.

<line size="1"><text align="center" bold="true" length="42">PAIEMENTS</text></line>
<line>
  <text align="left"  bold="true" length="30">Type</text>
  <text align="right" bold="true" length="12">Montant</text>
</line>
<line><text>------------------------------------------</text></line>

#foreach ($line in $payments.getPaymentLines())
<line>
  <text align="left"  length="30">${line.printType()} ${line.printReason()}</text>
  <text align="right" length="12">${line.printValue()}</text>
</line>
#end

<line><text>------------------------------------------</text></line>
<line>
  <text align="left"  bold="true" length="30">TOTAL PAIEMENTS</text>
  <text align="right" bold="true" length="12">${payments.printPaymentsTotal()}</text>
</line>
<line>
  <text align="left" length="30">Nombre de paiements</text>
  <text align="right" length="12">${payments.printPayments()}</text>
</line>

<line><text>------------------------------------------</text></line>
<line/>

7. Analyse TVA / Taxes

<line size="1"><text align="center" bold="true" length="42">TVA / TAXES</text></line>
<line>
  <text align="left"  bold="true" length="30">Taxe</text>
  <text align="right" bold="true" length="12">Montant</text>
</line>
<line><text>------------------------------------------</text></line>

#foreach ($line in $payments.getSaleLines())
<line>
  <text align="left"  length="30">${line.printTaxName()}</text>
  <text align="right" length="12">${line.printTaxes()}</text>
</line>
#end

<line><text>------------------------------------------</text></line>
<line/>

8. Lignes annulées (produits supprimés)

<line size="1"><text align="center" bold="true" length="42">LIGNES ANNULEES</text></line>
<line>
  <text align="left"  bold="true" length="6">Tkt</text>
  <text align="left"  bold="true" length="12">User</text>
  <text align="left"  bold="true" length="18">Produit</text>
  <text align="right" bold="true" length="6">Qte</text>
</line>
<line><text>------------------------------------------</text></line>

#foreach ($line in $payments.getRemovedProductLines())
<line>
  <text align="left"  length="6">${line.printTicketId()}</text>
  <text align="left"  length="12">${line.printWorkerName()}</text>
  <text align="left"  length="18">${line.printProductName()}</text>
  <text align="right" length="6">${line.printTotalUnits()}</text>
</line>
#end

<line><text>------------------------------------------</text></line>
<line/>

9. Ouvertures tiroir sans vente

<line size="1"><text align="center" bold="true" length="42">TIROIR SANS VENTE</text></line>
<line>
  <text align="left"  bold="true" length="30">Utilisateur</text>
  <text align="right" bold="true" length="12">Ticket</text>
</line>
<line><text>------------------------------------------</text></line>

#foreach ($line in $payments.getDrawerOpenedLines())
<line>
  <text align="left"  length="30">${line.printUserName()}</text>
  <text align="right" length="12">${line.printTicketId()}</text>
</line>
#end

<line><text>------------------------------------------</text></line>
<line/>

10. Ventes par catégorie

<line size="1"><text align="center" bold="true" length="42">VENTES PAR CATEGORIE</text></line>
<line>
  <text align="left"  bold="true" length="22">Categorie</text>
  <text align="right" bold="true" length="8">Qte</text>
  <text align="right" bold="true" length="12">Total</text>
</line>
<line><text>------------------------------------------</text></line>

#foreach ($c in $payments.getCategorySalesLines())
<line>
  <text align="left"  length="22">${c.printCategoryName()}</text>
  <text align="right" length="8">${c.printCategoryUnits()}</text>
  <text align="right" length="12">${c.printCategorySum()}</text>
</line>
#end

<line><text>------------------------------------------</text></line>
<line>
  <text align="left"  bold="true" length="22">TOTAL</text>
  <text align="right" bold="true" length="8">${payments.printCategorySalesTotalUnits()}</text>
  <text align="right" bold="true" length="12">${payments.printCategorySalesTotal()}</text>
</line>

<line><text>------------------------------------------</text></line>
<line/>

11. Ventes par produit (détail)

<line size="1"><text align="center" bold="true" length="42">VENTES PAR PRODUIT</text></line>
<line>
  <text align="left"  bold="true" length="20">Produit</text>
  <text align="right" bold="true" length="6">Qte</text>
  <text align="right" bold="true" length="8">PU HT</text>
  <text align="right" bold="true" length="8">Total</text>
</line>
<line><text>------------------------------------------</text></line>

#foreach ($p in $payments.getProductSalesLines())
<line>
  <text align="left"  length="20">${p.printProductName()}</text>
  <text align="right" length="6">${p.printProductUnits()}</text>
  <text align="right" length="8">${p.printProductPriceNet()}</text>
  <text align="right" length="8">${p.printProductSubValue()}</text>
</line>
#end

<line><text>------------------------------------------</text></line>
<line>
  <text align="left"  bold="true" length="20">TOTAL</text>
  <text align="right" bold="true" length="6">${payments.printProductSalesTotalUnits()}</text>
  <text align="right" bold="true" length="8"></text>
  <text align="right" bold="true" length="8">${payments.printProductSalesTotal()}</text>
</line>

<line><text>------------------------------------------</text></line>
<line/>

12. Synthèse finale (HT / TVA / TTC)

<line size="1"><text align="center" bold="true" length="42">SYNTHESE</text></line>
<line><text>------------------------------------------</text></line>

<line>
  <text align="left"  bold="true" length="30">Sous-total (HT)</text>
  <text align="right" bold="true" length="12">${payments.printSalesBase()}</text>
</line>
<line>
  <text align="left"  bold="true" length="30">Taxes</text>
  <text align="right" bold="true" length="12">${payments.printSalesTaxes()}</text>
</line>
<line>
  <text align="left"  bold="true" length="30">TOTAL GENERAL</text>
  <text align="right" bold="true" length="12">${payments.printSalesTotal()}</text>
</line>

<line><text>------------------------------------------</text></line>
<line/>

13. Pied de ticket

<line>
  <text align="left" length="22" bold="true">Cloture par:</text>
  <text align="left" length="20">${payments.printUser()}</text>
</line>
<line>
  <text align="left" length="22" bold="true">Date fin:</text>
  <text align="left" length="20">${payments.printDateEnd()}</text>
</line>

14. Conclusion

La modification de printer.closecash permet de transformer un ticket standard en rapport de gestion complet, exploitable par le gérant, l’auditeur ou le comptable.
Une mise en page claire, des sections structurées et une gestion par caissier renforcent la fiabilité et la lisibilité de la clôture de caisse.

Télécharger le Code
https://github.com/geekkech/UnicentaOpos-Scripts.git


Comments

No comments yet. Why don’t you start the discussion?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *