Na elke succesvolle verzending via het Peppol-netwerk ontvangt Mercator een ontvangstbevestiging (ACK) van het netwerk. Dit geldt voor uitgaande facturen en creditnota’s, evenals voor verzonden antwoorden op facturen.
In een klassieke configuratie zijn deze ontvangstbevestigingen niet zichtbaar in de PeppolBox, om overbelasting te vermijden. Na het verzenden van bijvoorbeeld honderden klantenfacturen worden immers evenveel ontvangstbevestigingen verwacht. Bij ontvangst van deze ACK’s in de PeppolBox zal Mercator proberen ze automatisch te archiveren. Indien de automatische archivering niet kon worden uitgevoerd, kan dit manueel via de knop "C" in de PeppolBox.
👉 Ontvangstbevestigingen op uitgaande facturen worden opgeslagen als een factuurantwoord. In de grid zijn ze herkenbaar aan een pictogram met een schild en het symbool “gevalideerd”. Via de knop “zoom” kan de inhoud van de ontvangstbevestiging worden bekeken.
👉 Ontvangstbevestigingen op verzonden antwoorden worden gekoppeld aan dat antwoord. Zodra deze koppeling is uitgevoerd, verschijnt onderaan het antwoord een extra knop: “Open ontvangstbevestiging”.
✅ Deze ACK is een technisch transportbewijs tussen access points. Het bewijst:
- dat het bericht technisch correct was;
- dat het verzonden bericht niet werd gewijzigd;
- dat het correct werd afgeleverd bij het Peppol-access point van de bestemmeling.
❌ Wat het niet bewijst:
- dat de factuur werd aanvaard;
- dat de factuur werd geboekt;
- dat de factuur juridisch geldig is;
- dat de factuur effectief in het ERP-systeem van de klant is aangekomen.
De query’s voor archivering kunnen worden aangepast via een PeppolBox customizer die de interface IStringUpdater of IStringUpdaterWidhtContextInfo implementeert. Aangezien deze SQL-query’s soms moeilijk te achterhalen zijn, worden ze hieronder weergegeven:
Herkenning van een ACK op factuur - creditnota
select top 1 id,journal,piece,cli.c_nom as nom from PIEDS_V (NOLOCK) inner join CLI (NOLOCK) on (cli.c_id=pieds_v.id_cli) where (type=1) and (date>@date_min) and (PEPPOL_RESPONSE like '<Digiteal>{{\"Id\":\"{id}%')
<ID>PEPPOLBOX_TRANSPORT_ACK_FINDSOURCE</ID> Herkenning van een ACK op self-billing
select top 1 id,journal,piece,fou.f_nom as nom from PIEDS_A (NOLOCK) inner join FOU (NOLOCK) on (fou.f_id=pieds_a.id_fou) where (type=1) and (date>@date_min) and (PEPPOL_RESPONSE like '<Digiteal>{{\"Id\":\"{id}%')
<ID>PEPPOLBOX_TRANSPORT_ACK_FINDSOURCE</ID> Herkenning van een ACK op InvoiceResponse
if exists (select * from PEPPPOL_INVOICERESPONSES_SENT where id_ubl=@id_ubl) select cast(1 as bit) as ret else select cast(0 as bit) as ret
/*<ID>PEPPOLBOX_SEARCH_INVOICERESPONSE_SENT</ID>*/
Archivering van een ACK op factuur - creditnota
insert into PEPPPOL_INVOICERESPONSES_RECEIVED (id,moment,id_doc,journal_doc,piece_doc,peppol_id_from,peppol_id_to,info,content,is_ack)
select id,moment,id_doc,journal_doc,piece_doc,peppol_id_from,peppol_id_to,info,content,1 from #PEPPPOL_INVOICERESPONSES_RECEIVED_TMP t
where not exists(select * from PEPPPOL_INVOICERESPONSES_RECEIVED where id=t.id)
drop table #PEPPPOL_INVOICERESPONSES_RECEIVED_TMP
/*<ID>PEPPOLBOX_NEW_ACK_ON_INVOICE</ID>*/ Archivering van een ACK op InvoiceResponse
update PEPPPOL_INVOICERESPONSES_SENT set ack=t.ack from #PEPPPOL_INVOICERESPONSES_SENT_TMP t where (t.id_ubl=pepppol_invoiceresponses_sent.id_ubl)
drop table #PEPPPOL_INVOICERESPONSES_SENT_TMP
/*<ID>PEPPOLBOX_NEW_ACK_ON_RESPONSE</ID>*/
Hieronder een voorbeeld van een customizer die deze mogelijkheden tot aanpassing van SQL-query’s benut. Dit beantwoordt aan volgende business case: de PeppolBox bevindt zich in een autonome boekhouding en de ontvangstbevestigingen moeten worden doorgestuurd naar de commerciële beheeromgeving, waarvan de databank MERCATORXXXXXX is. (Deze customizer wordt geplaatst in de Mercator van de autonome boekhouding.)
namespace PeppolBox
{
public class Customizer : MercatorUi.ICustomizers.IStringUpdater
{
public string StringUpdate(string s)
{
s = s.Replace("from PEPPPOL_INVOICERESPONSES_RECEIVED where", "from MERCATORXXXXXX.dbo.PEPPPOL_INVOICERESPONSES_RECEIVED where")
.Replace("into PEPPPOL_INVOICERESPONSES_RECEIVED ", "into MERCATORXXXXXX.dbo.PEPPPOL_INVOICERESPONSES_RECEIVED ");
string id = Api.StrExtract(s, "<ID>", "</ID>");
if (id == "PEPPOLBOX_TRANSPORT_ACK_FINDSOURCE")
s = s.Replace("PIEDS_V (NOLOCK)", "MERCATORXXXXXX.dbo.PIEDS_V (NOLOCK) pieds_v");
return s;
}
}
}