Générer automatiquement une écriture comptable de vente par code

0000002038     -      04/11/2025

La programmation décrite ici montre comment créer une écriture comptable de vente par code. Elle met essentiellement en oeuvre un objet BookingEngine, qui est la représentation abstraite (indépendante de l'interface utilisateur) d'une écriture comptable et qui contient toute une série de méthodes l'élevant au statut de moteur d'écriture comptable.

Il faut noter que si la séquence utilisée est dotée d'un customizer, celui-ci sera aussi activé et utilisé par le moteur dans ce code. Pour information, si on ne souhaite pas qu'un code de customizer s'exécute lorsqu'on n'est pas dans l'interface utilisateur, il faut ajouter ce test :

Zoom
if (bookingEngine.BookingForm != null)
{
}

Le code repris ci-dessous ajoute une écriture comptable de vente, dans le journal VENc, pour le client dont le C_ID est "MERCATOR" et pour un total TTC de 1210 EUR, avec 2 lignes d'imputation :

  • sur le compte 700000, 1100 EUR à 21 % de TVA
  • sur le compte 700010, -100 EUR à 21 % de TVA
Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorUi;

namespace MyNameSpace
{
    public class Class1 : MercatorUi.Interfaces.IExec
    {

        public void Main()
        {
            using (MercatorUi.Engine.Cpta.BookingEngine bookingEngine = MercatorUi.Engine.Cpta.BookingEngine.InitNew(1, "VENc")) // 1 = vente, le second paramètre = journal
            {
                if (!string.IsNullOrEmpty(bookingEngine.LastError))
                {
                    Dialogs.Stop("Init BookingEngine : " + bookingEngine.LastError);
                    return;
                }
                if (!bookingEngine.ApplyCustomerSupplier("MERCATOR"))
                {
                    Dialogs.Stop("ApplyCustomerSupplier : " + bookingEngine.LastError);
                    return;
                }

                // informations de PIEDS_C
                bookingEngine.PiedsCRecord.REGIME = MercatorDatabase.RegimesEnum.Normal; // ligne facultative car le régime est initialisé par ApplyCustomerSupplier
                bookingEngine.PiedsCRecord.DATE = new DateTime(2012, 1, 15);
                bookingEngine.PeriodFromDate(bookingEngine.PiedsCRecord.DATE); // adaptation de la période en fonction de la date
                bookingEngine.PiedsCRecord.ECHEANCE = Api.AddDate(bookingEngine.PiedsCRecord.DATE, bookingEngine.CliRecord.C_PAIEM); // calcul de la date d'échéance en fonction du délai de paiement repris dans la fiche client
                bookingEngine.PiedsCRecord.REFERENCE = "Ecriture générée par code";
                bookingEngine.PiedsCRecord.HEADERTOTAL = 1210;

                // ajout des lignes
                MercatorUi.Sig.Sig sig_gen = MercatorUi.Sig._SigsStatic.SigByModule(MercatorUi.Sig._SigEnum.GEN); // sera nécessaire pour indiquer qu'on va insérer un compte général
                string id_tva = MercatorController.xFunctions.xLookUpString("TVACODES", "CODE_F", "21", "ID"); // on doit manipuler uniquement des ID de code TVA

                int n = bookingEngine.AppendLine(); // initialise une nouvelle ligne et renvoie le n° de la ligne créée
                if (!bookingEngine.InsertAccount(sig_gen, "700000", bookingEngine.LIGNES_C.Rows[n]))
                {
                    Dialogs.Stop("InsertAccount 1 : " + bookingEngine.LastError);
                    return;
                }
                bookingEngine.LignesCRecords[n].TOT_DV = 1100;
                bookingEngine.LignesCRecords[n].SIGNE = "C"; // ligne facultative car le signe est initialisé par AppendLine
                bookingEngine.LignesCRecords[n].ID_TVA = id_tva;
                bookingEngine.LignesCRecords[n].TVA_DV = 231;

                n = bookingEngine.AppendLine(); // initialise une nouvelle ligne et renvoie le n° de la ligne créée
                if (!bookingEngine.InsertAccount(sig_gen, "700010", bookingEngine.LIGNES_C.Rows[n]))
                {
                    Dialogs.Stop("InsertAccount 2 : " + bookingEngine.LastError);
                    return;
                }
                bookingEngine.LignesCRecords[n].TOT_DV = 100;
                bookingEngine.LignesCRecords[n].SIGNE = "D";
                bookingEngine.LignesCRecords[n].ID_TVA = id_tva;
                bookingEngine.LignesCRecords[n].TVA_DV = 21;


                // sauvegarde
                if (!bookingEngine.Save())
                {
                    Dialogs.Stop("Save : " + bookingEngine.LastError);
                    return;
                }
                Dialogs.Stop(string.Format("L'écriture a été sauvegardée sous le numéro {0}.", bookingEngine.SavedNumber));
            }
        }
    }
}

Remarque : pour que ce module fonctionne, vous devez disposer de l'option ENGB (Engine sur Bookings)


Le code ci-dessous est une adaptation du code précédent qui montre comment modifier la période comptable si la période correspondant à la date a déjà fait l'objet d'une O.D. de régularisation.

Zoom
bookingEngine.PiedsCRecord.DATE = …;
bookingEngine.PeriodFromDate(bookingEngine.PiedsCRecord.DATE);
object periode = Api.ZselectDirect(Globals.RepData,
      "declare @max_per_regul char(6) \r\n"
    + "select @max_per_regul = isnull(max(periode), '') from PIEDS_C (NOLOCK) inner join sequenc (NOLOCK) on (pieds_c.journal=sequenc.journal) where (sequenc.type=4) and (sequenc.subtype=6) \r\n"
    + "if @max_per_regul >= @periode \r\n"
    + "    select @periode = min(num) from PERIODES where (debut<>fin) and (num > @max_per_regul) \r\n"
    + "if @periode is null \r\n"
    + "    RAISERROR('Aucune période comptable trouvée après la dernière période de régularisation !',16,1) \r\n"
    + "select @periode as periode", new MercatorSqlParam("@periode", bookingEngine.PiedsCRecord.PERIODE, SqlDbType.Char));

if (periode == null)
{
    Dialogs.Stop(Api.LastError);
    return;
}
bookingEngine.PiedsCRecord.PERIODE = periode.ToString();


Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)