Verstuur bonnetjes en facturen via de Exact Online App naar Lyanthe

Voor het verwerken van bonnetjes en facturen kan gebruik gemaakt worden van de diensten van Lyanthe. De Lyanthe-app werkt niet altijd even soepel, en daarom zullen ondernemers soms ook de Exact Online-app aangeboden krijgen door hun accountant. Met de Exact Online-app kan een ondernemer makkelijker gegevens aanleveren dan via de Lyanthe-app. Bovendien is er dan maar één app die de ondernemer nodig heeft om samen te werken met zijn accountant in plaats van twee apps; dat is meer gebruiksvriendelijk.

Voor het automatisch doorsturen van facturen en bonnetjes per e-mail van de in Exact Online geuploade documenten kan het volgende SQL-script elk uur gebruikt worden door accountants en administratiekantoren om de documenten van de te boeken facturen door te sturen naar Lyanthe.

Dit script verzamelt eerst alle niet-definitieve berichten in de digitale brievenbus van een geselecteerd deel van de administraties. Vervolgens wordt elke PDF afzonderlijk doorgestuurd, zodat voor de gebruikers van de Exact Online er sprake is van een volledig geautomatiseerd werkproces: zonder menselijke interventie of menselijke handelingen zal dit script alle bonnetjes uit het gekoppeld boekhoudpakket Exact Online verder leiden naar Lyanthe. De automatische aanlevering zorgt er voor dat de administratie tijdig de betalingen kan verrichten en de financiële situatie ook uit de boekhouding blijkt.

Dit script heeft de volgende beperkingen:

  • In een Excel-bestand of database tabel dient per Division een e-mailadres bij Lyanthe opgegeven te worden. Dit e-mailadres kan toegevoegd worden via een join bij de insert op smtp@mail.
  • Er dient een maximale leeftijd opgegeven te worden en/of een lijst van verwerkte berichten via een join voor de te bestuderen berichten om het volume beperkt te houden. De Exact Online API voor berichten kent momenteel geen mogelijkheid om automatisch berichten af te vinken als zijnde verwerkt.

SQL-code versturen Exact Online documenten naar Lyanthe

De volgende code stuurt de bonnen en facturen door vanuit het accountancy-abonnement op Exact Online naar Lyanthe:

--
-- Send mail message attachments from Exact Online App to Lyanthe.
--

local define OUT_PATH "${system:userdocumentsdirectory}"

select to_char(sysdate, 'YYYYMMDDHH24MISS') timestamp

local define TIMESTAMP "${outcome:0,0}"

begin
  --
  -- Select companies of the subscription
  -- associated with the user of accountant.
  --
  use 
  select sdn.Code
  from   Me me
  join   SystemDivisions sdn
  where  sdn.Status = 1
  and    sdn.Customer = me.UserCustomerId
  ;
  --
  -- Configure email sending.
  --
  set smtp-max-parallel@mail 4;
  set smtp-minimum-deliver-duration-ms@mail 1000;
  set smtp-host-address@mail "acme-com.mail.protection.outlook.com";
  set smtp-user-name@mail "john.doe@acme.com";
  set smtp-password@mail "secret";
  set [mail-from-name]@mail "ACME";
  set [mail-from-email]@mail "john.doe@acme.com";
  set [mail-body-html]@mail false;
  --
  -- Set deviating port when necessary.
  --
  --set smtp-host-port-number@mail 25;
  set smtp-enable-ssl@mail true;
  --
  -- Place files to send in table.
  --
  -- Join_set is used to avoid downloading all message attachment
  -- files from all years for the join when only querying a few thousand
  -- messages.
  --
  create or replace table DocumentsToSend@InMemoryStorage
  as
  select /*+ join_set(mat, MailMessageId, 100000) */
         mrd.Division
  ,      mrd.DivisionLabel
  ,      mrd.ID
  ,      mrd.Created
  ,      mrd.RecipientMailbox
  ,      mrd.RecipientStatus
  ,      mrd.SenderMailbox
  ,      mrd.Subject
  ,      mat.AttachmentFileName
  ,      mat.TypeDescription
  ,      mat.AttachmentFromUrl
  ,      length(mat.AttachmentFromUrl) lengte
  from   MailMessagesReceived mrd
  join   MailMessageAttachments mat
  on     mat.MailMessageID = mrd.ID
  and    mat.Type != 20 /* No UBL 2.0. */
  where  mrd.RecipientStatus in (20 /* Open. */, 25 /* Prepared. */, 30 /* Approved. */, 40 /* Realized. */)
  order
  by     mrd.Division
  ,      mrd.Created
  ;
  --
  -- Send documents to Lyanthe.
  --
  insert into smtp@mail
  ( toEmail
  , ccEmail
  , bccEmail
  , subject
  , body
  , attachment1Contents
  , attachment1Name
  , attachment1MimeType
  , origSystemReference
  )
  select 'catchall@lyanthe.nl'
         toEmail
  ,      cast(null as varchar2)
         ccEmail
  ,      cast(null as varchar2)
         bccEmail
  ,      coalesce(subject, 'no subject') subject
  ,      'Mail doorgestuurd vanaf Exact Online App naar Lyanthe' 
         || chr(13) || chr(10)
         || chr(13) || chr(10)
         || 'Betreft: ' || Subject
         || chr(13) || chr(10)
         || 'Ontvangen op: ' || to_char(Created, 'DD-MM-YYYY HH24:MI:SS')
         || chr(13) || chr(10)
         || 'Ontvangen in: ' || RecipientMailbox
         || chr(13) || chr(10)
         || 'Ontvangen voor: ' || DivisionLabel
         || chr(13) || chr(10)
         || 'Verzonden door: ' || SenderMailbox
         body
  ,      AttachmentFromUrl
         attachment1Contents
  ,      AttachmentFileName
         attachment1Name
  ,      cast(null as varchar2)
         attachment1MimeType
  ,      to_char(Division) || '-' || to_char(ID)
  from   DocumentsToSend@InMemoryStorage
  ;
end;

--
-- Register work done in Excel log file, including
-- origSystemReference. When materialized into a database table,
-- the work done can be used to skip message attachments already 
-- forwarded.
--
select * except attachment1Contents
from   smtp@mail
order
by     id

local export results as "${OUT_PATH}\acme-doorsturen-lyanthe-${TIMESTAMP}.xlsx" format xlsx include headers