| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437 |
- /*------------------------------------------------------------------------
- File : demoSwissQrCode.p
- Purpose :
- Syntax :
- Description :
- Author(s) : javier.garcia
- Created : Wed Sep 23 15:51:17 CEST 2020
- Notes :
- ----------------------------------------------------------------------*/
- /* *************************** Definitions ************************** */
- BLOCK-LEVEL ON ERROR UNDO, THROW.
- USING src.ch.adprime.swissQR.SwissQrHandler FROM PROPATH.
- USING src.ch.adprime.swissQR.beans.Address FROM PROPATH.
- USING src.ch.adprime.swissQR.beans.Bill FROM PROPATH.
- USING src.ch.adprime.swissQR.beans.Format FROM PROPATH.
- USING src.ch.adprime.swissQR.beans.SwissQr FROM PROPATH.
- USING src.ch.adprime.swissQR.incl.Language FROM PROPATH.
- USING src.ch.adprime.communication.FileHandler FROM PROPATH.
- DEFINE INPUT PARAMETER iphAufko AS HANDLE NO-UNDO.
- DEFINE INPUT PARAMETER ipcFileName AS CHARACTER NO-UNDO.
- DEFINE VARIABLE ii AS INTEGER NO-UNDO.
- DEFINE VARIABLE cQRIBAN AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cFirma AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cName AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cZusatz AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cStrasse AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cStrNr AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cLkz AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cPlz AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cOrt AS CHARACTER NO-UNDO.
- DEFINE VARIABLE lBetrag AS LOGICAL NO-UNDO.
- DEFINE VARIABLE PZReferenz AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
- DEFINE VARIABLE hFeld AS HANDLE NO-UNDO.
- DEFINE VARIABLE iBank AS INTEGER NO-UNDO.
- DEFINE VARIABLE iKnrStart AS INTEGER NO-UNDO.
- DEFINE VARIABLE iKnrLang AS INTEGER NO-UNDO.
- DEFINE VARIABLE iFnrStart AS INTEGER NO-UNDO.
- DEFINE VARIABLE iFnrLang AS INTEGER NO-UNDO.
- DEFINE VARIABLE iSprcd AS INTEGER NO-UNDO.
- { swissqr/propertiesSwissQR.i }
- DEFINE VARIABLE oSwissQrHandler AS SwissQrHandler NO-UNDO.
- DEFINE VARIABLE oSwissQr AS SwissQr NO-UNDO.
- DEFINE VARIABLE oBill AS Bill NO-UNDO.
- DEFINE VARIABLE oCreditor AS Address NO-UNDO.
- DEFINE VARIABLE oDebitor AS Address NO-UNDO.
- DEFINE VARIABLE oFormat AS Format NO-UNDO.
- DEFINE VARIABLE opErrorMessage AS CHARACTER NO-UNDO.
- DEFINE VARIABLE opDataBuffer AS MEMPTR NO-UNDO.
- DEFINE VARIABLE opFormat AS CHARACTER NO-UNDO.
- DEFINE VARIABLE opReference AS CHARACTER NO-UNDO.
- DEFINE VARIABLE retVal AS LOGICAL NO-UNDO.
- DEFINE VARIABLE cAccount AS CHARACTER NO-UNDO.
- DEFINE VARIABLE fAmount AS DECIMAL NO-UNDO.
- DEFINE VARIABLE cCurrency AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cBillInformation AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cReference AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cUnstructuredMessage AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cAddressLine1Cred AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cAddressLine2Cred AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cCityCred AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cCountryCodeCred AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cHouseNoCred AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cNameCred AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cPostalCodeCred AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cStreetCred AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cAddressLine1Deb AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cAddressLine2Deb AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cCityDeb AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cCountryCodeDeb AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cHouseNoDeb AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cNameDeb AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cPostalCodeDeb AS CHARACTER NO-UNDO.
- DEFINE VARIABLE cStreetDeb AS CHARACTER NO-UNDO.
- DEFINE BUFFER bAdresse FOR Adresse.
- DEFINE TEMP-TABLE tAufko LIKE Aufko
- FIELD iRecid AS RECID
- FIELD lBetrag AS LOGICAL.
- DEFINE VARIABLE htAufko AS HANDLE NO-UNDO.
- htAufko = TEMP-TABLE tAufko:DEFAULT-BUFFER-HANDLE.
- /* ******************** Preprocessor Definitions ******************** */
- /* *************************** Main Block *************************** */
- MAINBLOCK:
- DO WHILE TRUE:
- CREATE tAufko.
- htAufko:BUFFER-COPY(iphAufko).
- FIND Steuer NO-LOCK
- WHERE Steuer.Firma = tAufko.Firma.
-
- cURL_API-QrCode = DYNAMIC-FUNCTION ('getFehlwert':U, tAufko.Firma, 'HTTP_QRCODE') NO-ERROR.
- cKeyName_API-QrCode = DYNAMIC-FUNCTION ('getFehlwert':U, tAufko.Firma, 'KEYNAME_QRCODE') NO-ERROR.
- cApiKey_API-QrCode = DYNAMIC-FUNCTION ('getFehlwert':U, tAufko.Firma, 'API_KEY_QRCODE') NO-ERROR.
-
- FIND bAdresse NO-LOCK
- WHERE bAdresse.Firma = tAufko.Firma
- AND bAdresse.Knr = tAufko.Fak_Knr NO-ERROR.
- IF NOT AVAILABLE bAdresse THEN RETURN.
- iSprcd = bAdresse.Sprcd.
-
- FIND Debst NO-LOCK
- WHERE Debst.Firma = tAufko.Firma
- AND Debst.Knr = tAufko.Fak_Knr NO-ERROR.
- iBank = Debst.BESR_Art.
-
- FIND Bankst NO-LOCK
- WHERE Bankst.Bank = iBank NO-ERROR.
- IF NOT AVAILABLE Bankst THEN
- DO:
- IF iBank = 0 THEN
- DO:
- iBank = 1.
- FIND Bankst NO-LOCK
- WHERE Bankst.Bank = iBank NO-ERROR.
- END.
- END.
- IF NOT AVAILABLE Bankst THEN
- DO:
- FIND FIRST Bankst NO-LOCK NO-ERROR.
- END.
- IF NOT AVAILABLE Bankst THEN RETURN.
- /* ------------------ */
- /* Kreditor-Adresse */
- /* ------------------ */
- FIND Steuer NO-LOCK WHERE Steuer.Firma = tAufko.Firma.
-
- cFirma = Steuer.Firma1.
- cZusatz = Steuer.Firma2.
- iKnrStart = INTEGER(SUBSTRING(STRING(Steuer.St07,'9999'),01,02)).
- iKnrLang = INTEGER(SUBSTRING(STRING(Steuer.St07,'9999'),03,02)).
- iFnrStart = INTEGER(SUBSTRING(STRING(Steuer.St08,'9999'),01,02)).
- iFnrLang = INTEGER(SUBSTRING(STRING(Steuer.St08,'9999'),03,02)).
-
- ii = NUM-ENTRIES(Steuer.Strasse, ' ').
- IF ii > 1 THEN cStrNr = ENTRY(ii, Steuer.Strasse, ' ').
-
- IF cStrNr = '' THEN cStrasse = Steuer.Strasse.
- ELSE cStrasse = TRIM(REPLACE(Steuer.Strasse, cStrNr, '')).
-
- ii = NUM-ENTRIES(Steuer.Ort, ' ').
- IF ii > 1 THEN cPlz = ENTRY(1, Steuer.Ort, ' ').
-
- IF cPlz = '' THEN cOrt = Steuer.Ort.
- ELSE cOrt = TRIM(REPLACE(Steuer.Ort, cPlz, '')).
-
- IF cLkz = '' THEN cLkz = 'CH'.
- /* ---------------------- */
- /* Debitor-/Kunden-Adresse */
- /* ---------------------- */
- DO WHILE TRUE:
- IF tAufko.Adr[04] = '' AND
- tAufko.Adr[05] = '' THEN /* Keine Adresse im Auftrag vorhanden */
- DO:
- IF bAdresse.Firma1 <> '' THEN cName = TRIM(SUBSTRING(bAdresse.Firma1 + ' ' + bAdresse.Firma2,01,40)).
- ELSE cName = TRIM(SUBSTRING(bAdresse.Vorname + ' ' + bAdresse.Name ,01,40)).
- ASSIGN
- cAddressLine1Deb = ''
- cAddressLine2Deb = ''
- cCityDeb = bAdresse.Ort
- cCountryCodeDeb = bAdresse.Lkz
- cHouseNoDeb = ''
- cNameDeb = cName
- cPostalCodeDeb = bAdresse.Plz
- cStreetDeb = bAdresse.Strasse.
-
- ii = NUM-ENTRIES(cStreetDeb, ' ').
- IF ii > 1 THEN cHouseNoDeb = ENTRY(ii, cStreetDeb, ' ').
-
- IF cHouseNoDeb <> '' THEN cStreetDeb = TRIM(REPLACE(cStreetDeb, cHouseNoDeb, '')).
-
- LEAVE.
- END.
-
- ELSE
- DO: /* Adresse im Auftrag erfasst */
- ASSIGN
- cAddressLine1Deb = ''
- cAddressLine2Deb = ''
- cCityDeb = tAufko.Adresse[05]
- cCountryCodeDeb = bAdresse.Lkz
- cHouseNoDeb = ''
- cPostalCodeDeb = ''
- cStreetDeb = tAufko.Adresse[04].
- DO ii = 1 TO 3:
- IF tAufko.Adr[ii] = '' THEN NEXT.
- cNameDeb = tAufko.Adresse[ii].
- LEAVE.
- END.
-
- ii = NUM-ENTRIES(cStreetDeb, ' ').
- IF ii > 1 THEN cHouseNoDeb = ENTRY(ii, cStreetDeb, ' ').
-
- IF cHouseNoDeb <> '' THEN cStreetDeb = TRIM(REPLACE(cStreetDeb, cHouseNoDeb, '')).
-
- ii = NUM-ENTRIES(cCityDeb, ' ').
- IF ii > 1 THEN cPostalCodeDeb = ENTRY(1, cCityDeb, ' ').
-
- IF cPostalCodeDeb <> '' THEN cCityDeb = TRIM(REPLACE(cCityDeb, cPostalCodeDeb, '')).
- LEAVE.
- END.
-
- LEAVE.
- END.
- FIND Kondi NO-LOCK
- WHERE Kondi.Sprcd = bAdresse.Sprcd
- AND Kondi.Kond = tAufko.Kond NO-ERROR.
- lBetrag = (IF tAufko.Auf_Tot > 0 THEN TRUE ELSE FALSE).
- IF AVAILABLE Kondi THEN
- DO:
- IF Kondi.Skonto[01] <> 0 OR
- Kondi.Skonto[02] <> 0 THEN lBetrag = FALSE.
- END.
-
- hFeld = htAufko:BUFFER-FIELD('lBetrag') NO-ERROR.
- IF VALID-HANDLE(hFeld) THEN
- DO:
- IF hFeld:BUFFER-VALUE BEGINS 'n' THEN lBetrag = FALSE.
- END.
- PZReferenz = FILL('0', 26).
- SUBSTRING(PZReferenz,01) = STRING(Bank.BESR-Konto,'99999999999999').
- cString = FILL('9', iKnrLang).
- SUBSTRING(PZReferenz,iKnrStart) = STRING(tAufko.Fak_Knr,cString).
- cString = FILL('9', iFnrLang).
- SUBSTRING(PZReferenz,iFnrStart) = STRING(tAufko.Faknr ,cString).
- RUN PRUEFZIFFER ( INPUT-OUTPUT PZReferenz, OUTPUT cReference ).
- cString = SUBSTITUTE('&1;&2;&3;&4;&5;&6', cFirma, cStrasse, cStrNr, cLkz, cPlz, cOrt).
- cFileName = SUBSTITUTE('&1&2_&3', cPathQRCodes, 'QR_CODE', STRING(tAufko.Faknr,'9999999')).
- ASSIGN
- fAmount = (IF lBetrag THEN tAufko.Auf_Tot ELSE 0.00)
- cCurrency = tAufko.Frw
- cBillInformation = ''
- cUnstructuredMessage = SUBSTITUTE('Faktura &1', TRIM(STRING(tAufko.Faknr,"zzzzzz9"))).
- cAccount = REPLACE(Bankst.QR-IBAN, ' ', '').
- ASSIGN
- cAddressLine1Cred = '' /*cZusatz*/
- cAddressLine2Cred = ''
- cCityCred = cOrt
- cCountryCodeCred = cLkz
- cHouseNoCred = cStrNr
- cNameCred = cFirma
- cPostalCodeCred = cPlz
- cStreetCred = cStrasse.
-
- IF lDebug THEN
- MESSAGE cFirma SKIP cZusatz SKIP cStrasse '-' cStrNr SKIP
- clkz '-' cPlz '-' cOrt
- VIEW-AS ALERT-BOX.
- // Setup bill
- oBill = NEW Bill().
- oBill:cAccount = cAccount.
- oBill:cCurrency = cCurrency.
- oBill:cReference = cReference.
- oBill:cUnstructuredMessage = cUnstructuredMessage.
- IF lBetrag THEN oBill:fAmount = fAmount.
- IF lDebug THEN
- MESSAGE cNameDeb SKIP cStreetDeb SKIP cHouseNoDeb SKIP cCountryCodeDeb SKIP cpostalcodedeb SKIP ccitydeb SKIP
- cNamecred SKIP cStreetcred SKIP cHouseNocred SKIP cCountryCodecred SKIP cpostalcodecred SKIP ccitycred SKIP
- caccount SKIP famount SKIP ccurrency SKIP cbillinformation SKIP creference SKIP
- VIEW-AS ALERT-BOX.
- // Set creditor
- oCreditor = NEW Address(
- INPUT cAddressLine1Cred,
- INPUT cAddressLine2Cred,
- INPUT cCityCred,
- INPUT cCountryCodeCred,
- INPUT cHouseNoCred,
- INPUT cNameCred,
- INPUT cPostalCodeCred,
- INPUT cStreetCred).
- // Set debtor
- oDebitor = NEW Address(
- INPUT cAddressLine1Deb,
- INPUT cAddressLine2Deb,
- INPUT cCityDeb,
- INPUT cCountryCodeDeb,
- INPUT cHouseNoDeb,
- INPUT cNameDeb,
- INPUT cPostalCodeDeb,
- INPUT cStreetDeb).
- // Set Format Props
- oFormat = NEW Format().
- oFormat:iResoluation = 300.
- /*oFormat:eLanguage = LANGUAGE:EN. */
- /*oFormat:eFormatTyp = FormatTyp:JPG. */
- /*oFormat:ePositionBill = PositionBill:END_OF_DOCUMENT. */
- /*oFormat:eOutputSize = OutputSize:QR_BILL_WITH_HORIZONTAL_LINE.*/
- CASE Steuer.Fwc10: /* Installation/Kunde */
- WHEN 'LaTorre' THEN DO:
- CASE iSprcd:
- WHEN 2 THEN iSprcd = 3.
- WHEN 3 THEN iSprcd = 2.
- WHEN 4 THEN iSprcd = 5.
- END CASE.
- END.
- END CASE.
- CASE iSprcd:
- WHEN 1 THEN
- oFormat:eLanguage = LANGUAGE:DE.
- WHEN 2 THEN
- oFormat:eLanguage = LANGUAGE:FR.
- WHEN 3 THEN
- oFormat:eLanguage = LANGUAGE:IT.
- WHEN 5 THEN
- oFormat:eLanguage = LANGUAGE:EN.
- END.
- /* lDebug = TRUE.*/
- oSwissQr = NEW SwissQr(INPUT oBill, INPUT oCreditor, INPUT oDebitor, INPUT oFormat ).
- oSwissQrHandler = NEW SwissQrHandler(INPUT cURL_API-QrCode, INPUT cKeyName_API-QrCode, INPUT cApiKey_API-QrCode, INPUT lDebug).
- retVal = oSwissQrHandler:getSwissQrBill(
- INPUT oSwissQR,
- OUTPUT opErrorMessage,
- OUTPUT opDataBuffer,
- OUTPUT opFormat,
- OUTPUT opReference).
- IF lDebug THEN
- MESSAGE "ENDE: " retVal SKIP
- 'Message' operrormessage SKIP
- 'Format' opformat SKIP
- 'Referenz' opreference
- VIEW-AS ALERT-BOX.
- IF retVal THEN
- DO:
- retVal = FileHandler:saveFile(
- INPUT "",
- INPUT ipcFileName,
- INPUT opFormat,
- INPUT opDataBuffer,
- OUTPUT opErrorMessage).
- END.
- LEAVE.
- END.
-
- /* ********************** Internal Procedures *********************** */
- PROCEDURE PRUEFZIFFER:
- /* ------------------------------------------------------------------------- */
- /* Prufziffer MODULO 10, Rekursiv (27 Stellig Ref.-Nr.) */
- /* ------------------------------------------------------------------------- */
- /* */
- /* Uebergabe Variable: 1. String Betrag (12-stellig) */
- /* 2. String Referenz (27-stellig) */
- /* 3. String Teilnehmernummer ( 9-stellig) */
- /* */
- /* Erstellung der VESR-Codierzeile */
- /* */
- /*---------------------------------------------------------------------------*/
- DEFINE INPUT-OUTPUT PARAMETER PZReferenz AS CHARACTER FORMAT "x(27)".
- DEFINE OUTPUT PARAMETER VSZeile AS CHARACTER FORMAT "x(58)".
-
- DEFINE VARIABLE l1 AS INTEGER.
- DEFINE VARIABLE l2 AS INTEGER.
- DEFINE VARIABLE l3 AS INTEGER.
- DEFINE VARIABLE PZ AS INTEGER.
- DEFINE VARIABLE x1 AS INTEGER.
- DEFINE VARIABLE x2 AS INTEGER.
- DEFINE VARIABLE x3 AS INTEGER.
- DEFINE VARIABLE VMOD10 AS CHARACTER FORMAT "x(11)" EXTENT 11.
- VMOD10[01] = "09468271350".
- VMOD10[02] = "94682713509".
- VMOD10[03] = "46827135098".
- VMOD10[04] = "68271350947".
- VMOD10[05] = "82713509466".
- VMOD10[06] = "27135094685".
- VMOD10[07] = "71350946824".
- VMOD10[08] = "13509468273".
- VMOD10[09] = "35094682712".
- VMOD10[10] = "50946827131".
- l1 = 12.
- l2 = 26.
- l3 = 08.
- DO WHILE l2 = 26:
- x2 = 1.
- x1 = INT(SUBSTRING(PZReferenz,01 ,01)).
- x2 = INT(SUBSTRING(VMOD10[x2],x1 + 1,01)).
- DO x3 = 2 TO 26:
- x1 = INT(SUBSTRING(PZReferenz ,x3 ,01)).
- x2 = INT(SUBSTRING(VMOD10[x2 + 1],x1 + 1,01)).
- END.
- PZ = INT(SUBSTRING(VMOD10[x2 + 1],11,1)).
- SUBSTRING(PZReferenz,27) = STRING(PZ,"9").
- LEAVE.
- END.
-
- VSZeile = PZReferenz.
- END PROCEDURE.
|