project QadFinancials > class BDInvoice > method GenerateSEPAReference

Description

generate the SEPA reference based on a key


Parameters


icKeyToGenerateinputcharacterKey To Generate
ocSEPAPaymentReferenceoutputcharactergenerate SEPA Payment Reference
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


QadFinancials
method BDInvoice.ValidateComponentAllPostTSMNumber

QadFitnesse
method BDInvoice.ApiGenerateSEPAReference


program code (program5/bdinvoice.p)

    /* remove the spaces, put it in capitals */
    assign icKeyToGenerate = replace(icKeyToGenerate, ' ', '')
           icKeyToGenerate = caps(icKeyToGenerate)
           viLength        = length(icKeyToGenerate,"CHARACTER").
            
    /* Convert all characters to numeric */
    do viIndex = 1 to viLength on error undo, throw:
        case index("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ", substring (icKeyToGenerate,viIndex,1,"CHARACTER")):
            when 1  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "1".
            when 2  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "2".
            when 3  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "3".
            when 4  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "4".
            when 5  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "5".
            when 6  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "6".
            when 7  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "7".
            when 8  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "8".
            when 9  then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "9".
            when 10 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "0".
            when 11 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "10".
            when 12 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "11".
            when 13 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "12".
            when 14 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "13".
            when 15 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "14".
            when 16 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "15".
            when 17 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "16".
            when 18 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "17".
            when 19 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "18".
            when 20 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "19".
            when 21 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "20".
            when 22 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "21".
            when 23 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "22".
            when 24 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "23".
            when 25 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "24".
            when 26 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "25".
            when 27 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "26".
            when 28 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "27".
            when 29 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "28".
            when 30 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "29".
            when 31 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "30".
            when 32 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "31".
            when 33 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "32".
            when 34 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "33".
            when 35 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "34".
            when 36 then assign vcSEPAPaymentReference = vcSEPAPaymentReference + "35".        
        end case.
    end. /* do viIndex = 1 to viLength: */
    
    /* add the numeric value of the character RF, 2715, and '00' to the  */
    /* right-hand end of the creditor reference                          */
    assign vcSEPAPaymentReference = vcSEPAPaymentReference + "271500".
    
    /* A valid creditor reference must be a modulus of 97.                */
    /* Modulo 97 of vcPaymentReference should result in 1 to be a valid reference number              */
    /* The OpenEdge Modulo function will automatically try to convert to integer, which might not fit */
    /* So we will have to do the calculation ourselves                                                */
    /* subtract the remainder from 98, and if the result is less than 10  */
    /* insert a leading zero. The result is the two check digits.         */
    /* In order to correctly represent the complete RF Creditor Reference */
    /* on an invoice, the code 'RF' and the check digits should be        */
    /* inserted at the left-hand end of the creditor reference            */
    assign viPaymentReferenceModulo97  = decimal(vcSEPAPaymentReference) - (truncate(decimal(vcSEPAPaymentReference) / 97, 0) * 97)
           viResult                    = 98 - viPaymentReferenceModulo97
           vcSEPAPaymentReference      = if viResult < 10
                                         then "RF" + "0" + string(viResult) + icKeyToGenerate
                                         else "RF" +       string(viResult) + icKeyToGenerate
           no-error. /* add no-error because of decimal function */
          
    /* ================================================ */
    /* Split payment reference in blocks of four digits */
    /* ================================================ */
    assign viLength = length(vcSEPAPaymentReference,"CHARACTER").
    do viPosition = 1 to viLength by 1 on error undo, throw:    
        assign ocSEPAPaymentReference = ocSEPAPaymentReference + substring(vcSEPAPaymentReference, viPosition, 1, "CHARACTER").
        if viPosition modulo 4 = 0
        then assign ocSEPAPaymentReference = ocSEPAPaymentReference + " ".                
    end. /* do viPosition = 1 to length(vcSEPAPaymentReference,"CHARACTER") by 1: */