Facturen uit Easyflex naar Exact Online uploaden in eigen formaat

De volgende code kan gebruikt worden om facturen uit Easyflex te uploaden in Exact Online in het eigen gewenste formaat:

--
-- Verzamel de basisdata uit Easyflex voor de facturen in Exact Online.
--
create or replace table InvoiceLineData@InMemoryStorage
as
select drl.RlBedrijfsnaam EolAccountName
,      drl.RlRegistratienummer
--
-- Vertaal (indien nodig) de relatienummers uit EasyFlex
-- naar Exact Online.
-- Het handigste is beiden gelijkhouden.
--
,      case
       when drl.RlRegistratienummer = 93101210 then '00000004'
       when drl.RlRegistratienummer = 91 then 'A1'
       when drl.RlRegistratienummer = 92 then 'A2'
       when drl.RlRegistratienummer = 93 then 'A3'
       else drl.RlRegistratienummer
       end
       EolAccountCode 
,      drl.FactuurNummer EolInvoiceNumber
--
-- De factuuromschrijving.
--
,      'Gewerkte uren ' || drl.Jaar || '-' || drl.Maand
       EolDescription
,      case
       when drl.Type = 1 
       then '2'
       else '0'
       end
       EolVATCode
--
-- De gewenste artikelcode.
--
,      'Gewerkte uren' EolItemCode
,      drl.RlTarief EolUnitPrice
,      drl.LcNaam 
       || ': ' 
       || drl.FwVoornaam 
       || ' ' 
       || drl.FwAchternaam 
       || ' (' 
       || drl.Functie 
       || ')'
       EolLineDescription
,      drl.RlUren EolQuantity
,      drl.Omzet EolAmountDC
from   Views.DeclaratieRegels@efx drl
--
-- Filter factuurperiode/jaar.
--
where  drl.Jaar = 2023
and    drl.Maand = 10
--
-- Filter specifieke klant.
--
--and    drl.RlRegistratienummer = 93101210

--
-- Vervolgens worden de regels getotaliseerd per combinatie.
-- Hierbij worden meerdere registraties van een medewerker
-- op een aantal dagen samengevoegd op een combinatie
-- van tarief, naam en rol.
--
create or replace table InvoiceDataCompressed@InMemoryStorage
as
select EolAccountCode
,      EolInvoiceNumber
,      EolDescription
,      EolVATCode
,      EolItemCode
,      EolUnitPrice
,      EolLineDescription
,      sum(EolQuantity) EolQuantity
,      sum(EolAmountDC) EolAmountDC
from   InvoiceLineData@InMemoryStorage
group
by     EolAccountCode
,      EolInvoiceNumber
,      EolDescription
,      EolVATCode
,      EolItemCode
,      EolUnitPrice
,      EolLineDescription

--
-- De gecomprimeerde faactuurdata wordt nu omgezet naar
-- factuurregelinformatie voor Exact Online in het XML-formaat.
-- Het XML-formaat levert de hoogste snelheid en is
-- eenvoudiger aanpasbaar mocht een deel van de facturen niet
-- lukken.
--
create or replace table InvoiceLinesXml@InMemoryStorage
as
select EolAccountCode
,      EolInvoiceNumber
,      EolDescription
,      '<InvoiceLine>'
       || '<Item code="' || t.EolItemCode || '"/>'
       || xmlelement('Quantity', t.EolQuantity)
       || '<UnitPrice><Currency code="EUR" />'
       || xmlelement('Value', t.EolUnitPrice)
       || '<VAT code="' || t.EoLVatCode || '"/>'
       || '</UnitPrice>'
       || xmlelement('Description', t.EolLineDescription)
--
-- Eventueel: Total Amount niet automatisch berekenen
-- Eventueel: StartDate en EndDate vullen t.b.v. juiste periode voor
-- omzetbijdrage.
--
       || '</InvoiceLine>'
       LineXml
from   InvoiceDataCompressed@InMemoryStorage t

--
-- Voeg alle regels van 1 factuur samen tot een XML-bericht
-- per factuur.
--
create or replace table InvoicesXml@InMemoryStorage
as
select EolInvoiceNumber
,      '<Invoice>'
-- Eventueel: EolInvoiceNumber opvoeren als vereist factuurnummer.
-- Kies een dagboek naar keuze zoals 95.
       || '<Journal code="95"/>'
       || xmlelement('Description', t.EolDescription)
       || '<OrderedBy code="' || to_char(t.EolAccountCode) || '"/>'
       || '<InvoiceTo code="' || to_char(t.EolAccountCode) || '"/>'
       || t.xml
       || '</Invoice>'
       xml
from   ( select EolAccountCode
         ,      EolInvoiceNumber
         ,      EolDescription
         ,      listagg(Linexml, '') xml
         from   InvoiceLinesXml@inmemorystorage
         group
         by     EolAccountCode
         ,      EolInvoiceNumber
         ,      EolDescription
       ) t

--
-- Upload de facturen in Exact Online, waarbij
-- Invantive automatisch de facturen-XML opknipt
-- voor maximale snelheid en geen storingen
-- door beperkingen gesteld aan de XML door Exact Online.
--
insert into UploadXMLTopics@eol
( orig_system_reference
, topic
, payload
, division_code
, orig_system_group
, fragment_payload_flag
, fragment_max_size_characters
)
select null
       orig_system_reference
,      'Invoices'
       topic
,      xmlformat
       ( '<?xml version="1.0" encoding="UTF-8"?>'
         || '<eExact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="eExact-XML.xsd">'
         || '<Invoices>'
         || xml 
         || '</Invoices>'
         || '</eExact>'
       )
       payload
,      to_char(DIVISIONCODE)
       division_code
,      null
       orig_system_group
,      true
       fragment_payload_flag
,      250000
       fragment_max_size_characters /* Try to split into pieces of 250 KB at most. */
from   ( select listagg(xml, '') xml
         from   InvoicesXml@InMemoryStorage
       )

--
-- Controleer de resultaten.
--
select *
from   uploadxmltopicfragments@eol