U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Elektronische factureren met Peppol

0000002697     -      05-10-2022

Mercator 10.0 of hoger laat ons toe om facturen uit het commercieel beheer te verzenden in een elektronisch formaat 

XML > UBL (Invoice/Credit Note) > EN16931 > BIS 3.0 Billing

Om te beschikken over deze functionaliteit, moet men kolom C_EINVOICE1 char(30) in de tabel CLI toevoegen.

alter table CLI add C_EINVOICE1 char(30) not null default ''
Daarna volstaat het om de klantenfiche aan te passen en een ComboBox toe te voegen die dit veld gebruikt als bron. Mercator voegt automatisch volgend element toe in het menu "Bestand".

 

Dit menu laat ons toe om facturen te verzenden indien er aan de volgende voorwaarden werd voldaan.

  • Het veld C_EINVOICE1 voor de huidige klant bevat  BIS3 via Peppol
  • De factuur/credit nota is reeds opgeslagen en is dus zeker genummerd.
  • Het BTW-regime is niet gelijk aan "BTW inbegrepen" (het BTW-nummer van de klant moet vervolledigd worden).
  • Het document heeft geen korting op hoofdingsniveau
  • De referenties zijn volledig
  • Een afdrukmodel met minstens één PDF-duplicaat is opgenomen in het XML-bestand.
  • De bankrekening van de afzender wordt weergegeven in het veld "Bank" van het menu "Tools > Identificatie" onder de vorm van IBAN:BIC

 

Een bestand aangemaakt door Mercator is toevertrouwd aan Digiteal  alvorens het geleverd wordt aan de ontvanger via het Peppol-netwerk. Om over deze functionaliteit te beschikken moet je:

  • de PEPPOL optie in de Mercator-voucher hebben
  • de optie "Peppol-toegangsprovider" op Digiteal zetten (id = PEPPOL_PRV)
  • de informatie invullen in "Tools > Setup > Digiteal identificatie".
    • In dit scherm worden de velden "Peppol ID" automatisch ingevuld op basis van het btw-nummer en het land. Ze kunnen niet worden gewijzigd.
    • Als tijdens de registratie een of meer Peppol-ID's een fout opleveren, moet u contact opnemen met de Mercator-support die een handmatige registratie zal uitvoeren.

Deze functionaliteit maakt de overdracht van bestanden volledig transparant voor de gebruiker.

Standaard produceert Mercator een bestand conform met de hieronder beschreven normen. Het biedt een basis van mogelijkheden:

  • Indien de leverklant gebruikt wordt (ID_CLI_LIV) en verschillend is van de facturatieklant, zal Mercator een blok "cac:Delivery" plaatsen met het adres van de leverklant.
  • Voor een factuur, wordt het veld "Referentie" gebruikt om het veld "cac:OrderReference" aan te vullen (purchase order no - bestelnummer).
  • Voor een creditnota wordt veld "cac:InvoiceDocumentReference" als referentie gebruikt, dit verwijst naar de referentie van de factuur waarop de credit nota betrekking heeft.
  • De volgende regimes zijn gekend: Normaal, vrijgesteld, medecontractant en EEG en worden correct verwerkt wat betreft het uitwisselen van de BTW-informatie.
  • De verschillende PDF-duplicaten uit Mercator worden toegevoegd als "cbc:EmbeddedDocumentBinaryObject". Het is verplicht om minstens één PDF-duplicaat toe te voegen.
  • De OGM die eventueel gekoppeld is aan een factuur wordt gebruikt als "cbc:InstructionID" en "cbc:PaymentID"
  • Verzendkosten kunnen afzonderlijk vermeld worden als "cac:Allowancecharge" in de header. Hiervoor moet men de optie EINV_PORT aanvullen met het S_ID van het artikel "Verzendkosten".
  • Een korting wordt behandeld als "cac:AllowanceCharge" in de header.
  • De kortingen op lijnniveau worden beheerd als "cac:AllowanceCharge", inclusief optionele kortingen 2,3 en 4.
  • De serienummers en lotnummers zijn meegenomen in het blok "cac:ItemInstance"

Het is essentieel om goed te begrijpen dat al het personalisatiewerk van het document uitgevoerd in het afdrukmodel ook zal moeten toegepast worden in het elektronisch model. Zoals bij een geprinte factuur zal dit gedaan worden in de customizer van Mercator.

Hiervoor beschikt de BillingEngine over 3 events:

  • EinvNodeAdding: tijdens het toevoegen van elke node in de XML-structuur. Door de property e.Cancel op true te plaatsen, hebben we de mogelijkheid om een node niet toe te voegen.
  • EinvNodeAdded: wanneer een node toegevoegd wordt aan de XML-tree
  • EinvFileCreating: wanneer de gehele XML-tree klaar is net alvorens het XML-bestand gegenereerd wordt. De property e.FileName laat ons toe om de naam van het bestand dat geproduceerd zal worden te wijzigen.

De geproduceerde bestanden moeten voldoen aan de standaard-normen die gesteld zijn door Peppol: zie het toepasselijk document voor facturen.

Op deze pagina tonen we enkele voorbeeld-instellingen.


De code hieronder kan in een knop op het scherm van de facturen/credit nota’s geplaatst worden. Dit laat ons toe om de status van het verzenden van het huidig document te bekomen.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorController;
using System.Windows.Forms;
using MercatorExtensions;
using MercatorUi;
using System.Data.SqlClient;

// <CompileWithRoslyn />

namespace MercatorUi.MovableControls.ButtonsCodes
{
    public static class Script
    {
        public static void Exec(MercatorUi.MovableControls.MovableButton clickedButton)
        {
            // enter your customized code here
            Forms.Billing.BillingForm billingForm = (Forms.Billing.BillingForm)clickedButton.Form;
            string peppol_response = Api.StrExtract(billingForm.BillingEngine.PiedsVRecord.PEPPOL_RESPONSE, "<Digiteal>", "</Digiteal>");
            if (peppol_response == "")
            {
                MercatorUi.Dialogs.Stop("Dit document is nooit naar het Peppol-netwerk gestuurd!");
                return;
            }
            MercatorTunnel.Digiteal.CreatePeppolInvoiceResponse createPeppolInvoiceResponse = Api.JsonConvertDeserializeObject<MercatorTunnel.Digiteal.CreatePeppolInvoiceResponse>(peppol_response);
            Dialogs.Stop("Id = " + createPeppolInvoiceResponse.Id
                       + "\r\n" + createPeppolInvoiceResponse.Moment.ToShortDateString() + " " + createPeppolInvoiceResponse.Moment.ToShortTimeString());
        }
    }
}

 

Onderstaande code blijft geldig voor oude zendingen gedaan via Ibanity:

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorController;
using System.Windows.Forms;
using MercatorExtensions;
using MercatorUi;
using System.Data.SqlClient;

// <CompileWithRoslyn />

namespace MercatorUi.MovableControls.ButtonsCodes
{
    public static class Script
    {
        public static void Exec(MercatorUi.MovableControls.MovableButton clickedButton)
        {
            // enter your customized code here
            Forms.Billing.BillingForm billingForm = (Forms.Billing.BillingForm)clickedButton.Form;
            string peppol_response = Api.StrExtract(billingForm.BillingEngine.PiedsVRecord.PEPPOL_RESPONSE, "<Ibanity>", "</Ibanity>");
            if (peppol_response == "")
            {
                MercatorUi.Dialogs.Stop("Dit document is nooit naar het Peppol-netwerk gestuurd!");
                return;
            }
            MercatorUi.Ibanity.CreatePeppolInvoiceResponse createPeppolInvoiceResponse = Api.JsonConvertDeserializeObject<MercatorUi.Ibanity.CreatePeppolInvoiceResponse>(peppol_response);
            MercatorUi.Ibanity.GetPeppolInvoiceResponse r = MercatorUi.Ibanity.PeppolInvoiceUploadStatus(createPeppolInvoiceResponse.data.id, out string error);
            if (error != null)
                Dialogs.Stop(error);
            else
                Dialogs.Stop("Statut = " + (r.data.attributes.status == null ? "onbepaald" : r.data.attributes.status)
                    + (!string.IsNullOrEmpty(r.data.attributes.transmissionId) ? "\r\n" + r.data.attributes.transmissionId : "")
                    + ((r.data.attributes.errors != null) && (r.data.attributes.errors.Count > 0) ? "\r\nFoutcode = " + r.data.attributes.errors[0].code + "\r\n" + r.data.attributes.errors[0].detail : "")
                    );
        }
    }
}

 

Onderstaande code blijft geldig voor oude zendingen gedaan via CodaBox:

Zoom
// enter your customized code here
Forms.Billing.BillingForm billingForm = (Forms.Billing.BillingForm)clickedButton.Form;
string peppol_response = Api.StrExtract(billingForm.BillingEngine.PiedsVRecord.PEPPOL_RESPONSE, "<CodaBox>", "</CodaBox>");
if (peppol_response == "")
{
    MercatorUi.Dialogs.Stop("Dit document is nooit naar het Peppol-netwerk gestuurd");
    return;
}
Forms.Billing.BillingCodaBox.Classes.UploadStatus status = Api.JsonConvertDeserializeObject<Forms.Billing.BillingCodaBox.Classes.UploadStatus>(peppol_response);
Forms.Billing.BillingCodaBox.CodaBox codaBox = new Forms.Billing.BillingCodaBox.CodaBox();
status = codaBox.GetStatus(status.id);
if (status == null)
    Dialogs.Stop(codaBox.Errors.ToString());
else
    Dialogs.Stop("Status = " + (status.sent_state == null ? "Onbepaald" : status.sent_state) + (!string.IsNullOrEmpty(status.sent_reason_state) ? "\r\n" + status.sent_reason_state : ""));