project QadFinancials > class BBill > method GetToBillDInvoice

Description

In BIll Create and Set Bill Date Form, it had a search condition Tab Control. User can setup search condition to query the related DInvoices. This method is created to invoke internal API query to get the DInvoice for those two Forms.


Parameters


itInvoiceDateFrominputdate
itInvoiceDateToinputdate
icDebtorListinputcharacter
icEmployeeCodeinputcharacter
icCurrencyCodeinputcharacter
icInvoiceRefFrominputcharacter
icInvoiceRefToinputcharacter
ilIsAllEntitiesinputlogical
itFixedDueDateinputdate
ilIsOverwriteDueDateinputlogical
icActivityCodeinputcharacter
iiBill_IDinputinteger
iiDInvoice_IDinputinteger
tDInvoiceToBilloutputtemp-table
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program3/bbill.p)

assign oiReturnStatus = -98.
empty temp-table tDInvoiceToBill.
empty temp-table tApiBillingDueDateCache.
if icActivityCode = 'Create' or
   icActivityCode = 'SetBillDate'
then do:
    /* Invoice Ref To can not be null */
    if itInvoiceDateTo = ? then do:
        <M-25 run SetMessage
           (input  trim(#T-45'The Invoice Ref Date To field is mandatory.':255(949971202)T-45#) (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-331703':U (icFcMsgNumber), 
            input  '':U (icFcExplanation), 
            input  '':U (icFcIdentification), 
            input  '':U (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BBill>
        assign oiReturnStatus = -1.
        return.
    end.

    if itInvoiceDateFrom <>? and itInvoiceDateFrom > itInvoiceDateTo then do:
        <M-63 run SetMessage
           (input  trim(#T-52'The date specified in Invoice Ref Date From cannot be later than the date specified in Invoice Ref Date To.':255(573262564)T-52#) (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  string(itInvoiceDateFrom) (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-128307':U (icFcMsgNumber), 
            input  '':U (icFcExplanation), 
            input  '':U (icFcIdentification), 
            input  '':U (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BBill>
        assign oiReturnStatus = -1.
        return.
    end.
    
    if icInvoiceRefFrom <> ?       and 
       icInvoiceRefFrom <> ''      and
       icInvoiceRefTo <> ?         and 
       icInvoiceRefTo <> ''        and
       icInvoiceRefFrom > icInvoiceRefTo
    then do:
          <M-95 run SetMessage
             (input  trim(#T-87'Invoice Ref To cannot precede Invoice Ref From.':255(35124550)T-87#) (icMessage), 
              input  '':U (icArguments), 
              input  '':U (icFieldName), 
              input  '':U (icFieldValue), 
              input  'E':U (icType), 
              input  3 (iiSeverity), 
              input  ? (icRowid), 
              input  'qadfin-737072':U (icFcMsgNumber), 
              input  '':U (icFcExplanation), 
              input  '':U (icFcIdentification), 
              input  '':U (icFcContext), 
              output viFcReturnSuper (oiReturnStatus)) in BBill>
        assign oiReturnStatus = -1.
        return.
    end.
    
    if itFixedDueDate <> ? and (itFixedDueDate > itInvoiceDateTo or (itInvoiceDateFrom <> ? and itFixedDueDate < itInvoiceDateFrom))
    then do:
        <M-34 run SetMessage
           (input  trim(#T-88'The Fixed Bill Date must be within the time period defined in the Invoice Ref Date From-To fields.':255(131295951)T-88#) (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  string(itFixedDueDate) (icFieldValue), 
            input  'E':U (icType), 
            input  3 (iiSeverity), 
            input  ? (icRowid), 
            input  'qadfin-818507':U (icFcMsgNumber), 
            input  '':U (icFcExplanation), 
            input  '':U (icFcIdentification), 
            input  '':U (icFcContext), 
            output viFcReturnSuper (oiReturnStatus)) in BBill>
        assign oiReturnStatus = -1.
        return.
    end.
end.

<M-93 run GetDInvoiceFromBillQuery
   (input  itInvoiceDateFrom (itInvoiceDateFrom), 
    input  itInvoiceDateTo (itInvoiceDateTo), 
    input  icDebtorList (icDebtorList), 
    input  icEmployeeCode (icEmployeeCode), 
    input  icCurrencyCode (icCurrencyCode), 
    input  icInvoiceRefFrom (icInvoiceRefFrom), 
    input  icInvoiceRefTo (icInvoiceRefTo), 
    input  ilIsAllEntities (ilIsAllEntities), 
    input  icActivityCode (icActivityCode), 
    input  iiBill_ID (iiBill_ID), 
    input  iiDInvoice_ID (iiDInvoice_ID), 
    output tInnerQueryDinvoiceForBill (tInnerQueryDinvoiceForBill), 
    output viFcReturnSuper (oiReturnStatus)) in BBill>

if can-find (first tInnerQueryDinvoiceForBill)
THEN DO:
    /* Get DInvoiceVatRetByDInvoiceId */
    for each tInnerQueryDinvoiceForBill where
             tInnerQueryDinvoiceForBill.tcDInvoiceType               <> {&INVOICETYPE-CREDITNOTECORRECTION}   and
             tInnerQueryDinvoiceForBill.tcDInvoiceType               <> {&INVOICETYPE-INVOICECORRECTION}      and
             tInnerQueryDinvoiceForBill.tcPaymentConditionPaymentTyp <> {&PAYMENTCONDITIONPAYMENTTYPE-STAGED} and
            (tInnerQueryDinvoiceForBill.tdDInvoiceBalanceDebitTC  <> 0                                        or
             tInnerQueryDinvoiceForBill.tdDInvoiceBalanceCreditTC <> 0)
            break by tInnerQueryDinvoiceForBill.tiDInvoice_ID:
        
        if first-of (tInnerQueryDinvoiceForBill.tiDInvoice_ID)
        then do:
            if vcDInvoiceIDList = ""
            then do:
                assign vcDInvoiceIDList = string(tInnerQueryDinvoiceForBill.tiDInvoice_ID).
            end.
            else do:
                assign vcDInvoiceIDList = vcDInvoiceIDList + "," + string(tInnerQueryDinvoiceForBill.tiDInvoice_ID).
            end.
            
            /* 40 is the length of Field Name(DInvoiceVat1.DInvoice_ID*/
            viLengthOfQueryString = viLengthOfQueryString + length(string(tInnerQueryDinvoiceForBill.tiDInvoice_ID), "CHARACTER") + 40.
    
            /*To avoid 32K issue for query string, leave 2000 for query skeleton*/
            if viLengthOfQueryString > 8000 then
            do:
    
               /*Just Read the DInvoiceVat record which DInvoiceVatIsAbsRet = true*/
               <Q-35 run DInvoiceVatRetByDInvoiceId (first) (Append) (NoCache)
                  (input vcDInvoiceIDList, (DInvoiceId)
                   output dataset tqDInvoiceVatRetByDInvoiceId) in BDInvoice>
    
               assign vcDInvoiceIDList = ""
                      viLengthOfQueryString = 0.
            end. /* end if viLengthOfQueryString > 8000 */ 
        end. /* end first-of (tInnerQueryDinvoiceForBill.tiDInvoice_ID) */
    end. /* end for each tInnerQueryDinvoiceForBill */
    
    if vcDInvoiceIDList <> "" and vcDInvoiceIDList <> ? then
    do:
       /*When the length of IDList is less than upper limit(9000), 
         or when there exists a remainder of  the division (a/b), execute the query again.*/
       /*Just Read the DInvoiceVat record which DInvoiceVatIsAbsRet = true*/
       <Q-58 run DInvoiceVatRetByDInvoiceId (first) (Append) (NoCache)
          (input vcDInvoiceIDList, (DInvoiceId)
           output dataset tqDInvoiceVatRetByDInvoiceId) in BDInvoice>  
    end. 
    /* End - Get DInvoiceVatRetByDInvoiceId */

    /* Create tDInvoiceToBill */
    for each tInnerQueryDinvoiceForBill where 
        tInnerQueryDinvoiceForBill.tcPaymentConditionPaymentTyp <> {&PAYMENTCONDITIONPAYMENTTYPE-STAGED}
        break by tInnerQueryDinvoiceForBill.tiDInvoice_ID:
        <Q-37 run BillScheduleForDueDate (all) (Read) (NoCache)
           (input tInnerQueryDinvoiceForBill.tcBillScheduleCode, (BillScheduleCode)
            output dataset tqBillScheduleForDueDate) in BBillSchedule>
        find first tqBillScheduleForDueDate no-error.
        if available tqBillScheduleForDueDate then 
        do:
            if tqBillScheduleForDueDate.tcBillScheduleSelectInvBasedOn = {&BILLSCHEDULESELECTINV-INVDATE} then
            do:
                   if (itInvoiceDateFrom <> ? and
                       tInnerQueryDinvoiceForBill.ttDInvoiceDate > itInvoiceDateTo or 
                       tInnerQueryDinvoiceForBill.ttDInvoiceDate < itInvoiceDateFrom) or
                      (itInvoiceDateFrom = ? and
                       itInvoiceDateTo <> ? and 
                       tInnerQueryDinvoiceForBill.ttDInvoiceDate > itInvoiceDateTo) then next.                                   
            end.
            else
            do:
                    if (itInvoiceDateFrom <> ? and
                       tInnerQueryDinvoiceForBill.ttDInvoiceDueDate > itInvoiceDateTo or 
                       tInnerQueryDinvoiceForBill.ttDInvoiceDueDate < itInvoiceDateFrom) or
                      (itInvoiceDateFrom = ? and
                       itInvoiceDateTo <> ? and 
                       tInnerQueryDinvoiceForBill.ttDInvoiceDueDate > itInvoiceDateTo) then next.              
            end.
        end.
            
        assign vlIsRemove = true.

        /* IsOverwriteDueDate is not check and Bill Date is not null */
        if tInnerQueryDinvoiceForBill.ttDInvoiceBillDate <> ? and
           ilIsOverwriteDueDate = no
        then do:
            <M-78 run ApiGetBillingDueDate
               (input  tInnerQueryDinvoiceForBill.ttDInvoiceBillDate (itInvDate), 
                input  tInnerQueryDinvoiceForBill.tcBillScheduleCode (icBillScheduleCode), 
                input  viCompanyId (iiCompanyId), 
                input  tInnerQueryDinvoiceForBill.ttDInvoiceBillDate (itInvDueDate), 
                input  itInvoiceDateFrom (itFilterRefDateFrom), 
                input  itInvoiceDateTo (itFilterRefDateTo), 
                input  true (ilCheckHoliday), 
                input  true (ilIsBillDateExisting), 
                output vlIsRemove (olIsRemove), 
                output vtBillDate (otBillDate), 
                output vtBillDueDate (otBillDueDate), 
                output oiReturnStatus (oiReturnStatus)) in BBill>
        end.
        /* IsOverwriteDueDate and FixedDuedDate is not null */
            else do:

            find first tApiBillingDueDateCache where                     
                 tApiBillingDueDateCache.tiCompanyId = tInnerQueryDinvoiceForBill.tiCompany_ID and                     
                 tApiBillingDueDateCache.tcBillingScheduleCode = tInnerQueryDinvoiceForBill.tcBillScheduleCode and
                 tApiBillingDueDateCache.ttDInvoiceDate = tInnerQueryDinvoiceForBill.ttDInvoiceDate and
                 tApiBillingDueDateCache.ttDInvoiceDueDate = tInnerQueryDinvoiceForBill.ttDInvoiceDueDate no-error.
            if not available tApiBillingDueDateCache then do:
                 if itFixedDueDate <> ? then do:
                     <M-80 run ApiGetBillingDueDate
                        (input  itFixedDueDate (itInvDate), 
                         input  tInnerQueryDinvoiceForBill.tcBillScheduleCode (icBillScheduleCode), 
                         input  viCompanyId (iiCompanyId), 
                         input  itFixedDueDate (itInvDueDate), 
                         input  itInvoiceDateFrom (itFilterRefDateFrom), 
                         input  itInvoiceDateTo (itFilterRefDateTo), 
                         input  true (ilCheckHoliday), 
                         input  false (ilIsBillDateExisting), 
                         output vlIsRemove (olIsRemove), 
                         output vtBillDate (otBillDate), 
                         output vtBillDueDate (otBillDueDate), 
                         output oiReturnStatus (oiReturnStatus)) in BBill>
                     assign vtBillDate = itFixedDueDate
                            vlIsRemove = false.     
                 end.
                else do:
                    <M-28 run ApiGetBillingDueDate
                       (input  tInnerQueryDinvoiceForBill.ttDInvoiceDate (itInvDate), 
                        input  tInnerQueryDinvoiceForBill.tcBillScheduleCode (icBillScheduleCode), 
                        input  viCompanyId (iiCompanyId), 
                        input  tInnerQueryDinvoiceForBill.ttDInvoiceDueDate (itInvDueDate), 
                        input  itInvoiceDateFrom (itFilterRefDateFrom), 
                        input  itInvoiceDateTo (itFilterRefDateTo), 
                        input  true (ilCheckHoliday), 
                        input  false (ilIsBillDateExisting), 
                        output vlIsRemove (olIsRemove), 
                        output vtBillDate (otBillDate), 
                        output vtBillDueDate (otBillDueDate), 
                        output oiReturnStatus (oiReturnStatus)) in BBill>
                 end.
                       
                create tApiBillingDueDateCache.
                assign tApiBillingDueDateCache.tcBillingScheduleCode = tInnerQueryDinvoiceForBill.tcBillScheduleCode
                       tApiBillingDueDateCache.tiCompanyId = tInnerQueryDinvoiceForBill.tiCompany_ID
                       tApiBillingDueDateCache.ttDInvoiceDate = tInnerQueryDinvoiceForBill.ttDInvoiceDate
                       tApiBillingDueDateCache.ttDInvoiceDueDate = tInnerQueryDinvoiceForBill.ttDInvoiceDueDate
                       tApiBillingDueDateCache.ttBillDate = vtBillDate
                       tApiBillingDueDateCache.ttBillDueDate = vtBillDueDate
                       tApiBillingDueDateCache.tlIsRemove = vlIsRemove.
            end. /* if not available tApiBillingDueDateCache then do: */
            else do:
                if tApiBillingDueDateCache.tlIsRemove = false then do:
                    assign vtBillDate    = tApiBillingDueDateCache.ttBillDate
                           vtBillDueDate = tApiBillingDueDateCache.ttBillDueDate
                           vlIsRemove    = false.
                end.
            end.
        end.

        /* DInvoice no need to be removed */
        if vlIsRemove = false
        then do:
            create tDInvoiceToBill.
            buffer-copy tInnerQueryDinvoiceForBill  to tDinvoiceToBill.
            
            /* IsOverwriteDueDate or Bill Date is null */
            if ilIsOverwriteDueDate or tDInvoiceToBill.ttDInvoiceBillDate = ? then
                assign tDInvoiceToBill.ttDInvoiceBillDate                = vtBillDate
                       tDInvoiceToBill.ttBillDueDate             = vtBillDueDate.
            /* IsOverwriteDueDate is not check and Bill Date is not null */
            else assign tDInvoiceToBill.ttBillDueDate             = vtBillDueDate.

            assign tDInvoiceToBill.tlDInvoiceIsSelected      = yes
                   tDInvoiceToBill.tcDInvoiceBalanceCrDt     = if tInnerQueryDinvoiceForBill.tdDInvoiceBalanceCreditTC <> 0 and
                                                                  tInnerQueryDinvoiceForBill.tdDInvoiceBalanceCreditTC <> ?
                                                               then {&CREDITDEBITABBREVIATION-CREDIT}
                                                               else {&CREDITDEBITABBREVIATION-DEBIT}
                   tDInvoiceToBill.tcDInvoiceReference       = string(tInnerQueryDinvoiceForBill.tiPeriodYear)                           + "/":U +
                                                                     tInnerQueryDinvoiceForBill.tcJournalCode                            + "/":U +
                                                                     string(tInnerQueryDinvoiceForBill.tiDInvoiceVoucher, "999999999":U) + "/":U +
                                                                     tInnerQueryDinvoiceForBill.tcDInvoiceDescription
                   tDInvoiceToBill.tdDInvoiceBalance         = if tInnerQueryDinvoiceForBill.tdDInvoiceBalanceCreditTC <> 0 and
                                                                  tInnerQueryDinvoiceForBill.tdDInvoiceBalanceCreditTC <> ?
                                                               then tInnerQueryDinvoiceForBill.tdDInvoiceBalanceCreditTC
                                                               else tInnerQueryDinvoiceForBill.tdDInvoiceBalanceDebitTC
                   tDInvoiceToBill.tdVatBaseTC               = if tInnerQueryDinvoiceForBill.tdDInvoiceVatBaseDebitTC  <> 0 and tInnerQueryDinvoiceForBill.tdDInvoiceVatBaseDebitTC  <> ? then tInnerQueryDinvoiceForBill.tdDInvoiceVatBaseDebitTC  else tInnerQueryDinvoiceForBill.tdDInvoiceVatBaseCreditTC
                   tDInvoiceToBill.tcVatBaseCrDt             = if tInnerQueryDinvoiceForBill.tdDInvoiceVatBaseDebitTC  <> 0 and tInnerQueryDinvoiceForBill.tdDInvoiceVatBaseDebitTC  <> ? then {&CREDITDEBITABBREVIATION-DEBIT}                 else {&CREDITDEBITABBREVIATION-CREDIT}
                   tDInvoiceToBill.tdVatTC                   = if tInnerQueryDinvoiceForBill.tdDInvoiceVatDebitTC      <> 0 and tInnerQueryDinvoiceForBill.tdDInvoiceVatDebitTC      <> ? then tInnerQueryDinvoiceForBill.tdDInvoiceVatDebitTC      else tInnerQueryDinvoiceForBill.tdDInvoiceVatCreditTC
                   tDInvoiceToBill.tcVatCrDt                 = if tInnerQueryDinvoiceForBill.tdDInvoiceVatDebitTC      <> 0 and tInnerQueryDinvoiceForBill.tdDInvoiceVatDebitTC      <> ? then {&CREDITDEBITABBREVIATION-DEBIT}                 else {&CREDITDEBITABBREVIATION-CREDIT}
                   vdInvoiceAmount                           = if tInnerQueryDinvoiceForBill.tdDInvoiceBalanceCreditTC <> 0 and
                                                                  tInnerQueryDinvoiceForBill.tdDInvoiceBalanceCreditTC <> ?
                                                               then tInnerQueryDinvoiceForBill.tdDInvoiceOriginalCreditTC
                                                               else tInnerQueryDinvoiceForBill.tdDInvoiceOriginalDebitTC
                                                                   
                   vdDefaultDiscountAmount                   = 0
                   vdDefaultPaymentAmount                    = 0
                   vdInvoiceTotalTC                          = 0
                   vlProposePayment                          = false
                   vlDInvoiceIsWithOneBank                   = false
                   tDInvoiceToBill.tdDInvoiceBalanceTCSigned = if tDInvoiceToBill.tcDInvoiceBalanceCrDt = {&CREDITDEBITABBREVIATION-CREDIT} 
                                                               then (0 - tDInvoiceToBill.tdDInvoiceBalance)
                                                               else tDInvoiceToBill.tdDInvoiceBalance.
            if tInnerQueryDinvoiceForBill.tcDInvoiceType = {&INVOICETYPE-DEDUCTION}
            then do:
                <Q-86 run GetDeductionDetailByInvoiceID (all) (Read) (NoCache)
                   (input ?, (CompanyId)
                    input tInnerQueryDinvoiceForBill.tiDInvoice_ID, (InvoiceID)
                    output dataset tqGetDeductionDetailByInvoiceID) in BDInvoice>
            
                for each tqGetDeductionDetailByInvoiceID no-lock:
                    assign tDInvoiceToBill.tdDeductionTC             = tDInvoiceToBill.tdDeductionTC + tqGetDeductionDetailByInvoiceID.tdDInvoiceDeductionTC
                           tDInvoiceToBill.tcDeductionCatCode        = if tDInvoiceToBill.tcDeductionCatCode = '':U then tqGetDeductionDetailByInvoiceID.tcDeductionCatCode
                                                                       else trim(#T-27'See details':20(648722267)T-27#)
                           tDInvoiceToBill.tcDInvoiceDeductionStatus = if tDInvoiceToBill.tcDInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-REJECTED} then {&INVOICEDEDUCTSTATUS-REJECTED}
                                                                       else if tDInvoiceToBill.tcDInvoiceDeductionStatus = {&INVOICEDEDUCTSTATUS-REJECTED} then {&INVOICEDEDUCTSTATUS-REJECTED} 
                                                                       else if tDInvoiceToBill.tcDInvoiceDeductionStatus = '':U then tqGetDeductionDetailByInvoiceID.tcDInvoiceDeductionStatus
                                                                       else trim(#T-20'See details':20(648722267)T-20#).
                    
                end. /* end for each tqGetDeductionDetailByInvoiceID */
            end. /* end if tInnerQueryDinvoiceForBill.tcDInvoiceType = {&INVOICETYPE-DEDUCTION} */
    
            if can-find (first tqDInvoiceVatRetByDInvoiceId where 
                           tqDInvoiceVatRetByDInvoiceId.tiDInvoice_ID = tDInvoiceToBill.tiDInvoice_ID)
            then do:
                assign tDInvoiceToBill.tdVatTC = tInnerQueryDinvoiceForBill.tdDInvoiceVatCreditTC - tInnerQueryDinvoiceForBill.tdDInvoiceVatDebitTC.
                empty temp-table tqDInvoiceVatRetByDInvoiceId.
            end.

            if last-of (tInnerQueryDinvoiceForBill.tiDInvoice_ID)
            then do:
                assign vlDInvoiceIsWithOneBank = true.
            end.
            else do:
                <Q-57 run DInvoiceBankByDInvoiceID (all) (Read) (NoCache)
                   (input tInnerQueryDinvoiceForBill.tiDInvoice_ID, (DInvoiceId)
                    output dataset tqDInvoiceBankByDInvoiceID) in BDInvoice>
    
                find tqDInvoiceBankByDInvoiceID no-error.
                if available tqDInvoiceBankByDInvoiceID
                then assign vlDInvoiceIsWithOneBank = true.
            end.
    
            /* Propose payment if there is only one invoice bank or this is the first payment on the invoice */
            if (vlDInvoiceIsWithOneBank or tDInvoiceToBill.tdDInvoiceBalance = vdInvoiceAmount) and
                tInnerQueryDinvoiceForBill.tcPaymentConditionPaymentTyp <> {&PAYMENTCONDITIONPAYMENTTYPE-STAGED}
            then assign vlProposePayment = true.
    
            if vtBillDueDate <= tInnerQueryDinvoiceForBill.ttDInvoiceDiscountDueDate
            then do:
                /****************************************************************************************************************  
                   Calculation of Discount Amount 
                   ==============================
                  1) In case of Discount Tax at Payment = YES
                    Discount Amount =  Invoice amount with Tax * 
                                       ((Invoice amount without Tax ?- Non-discountable amount) / Invoice amount without Tax) * 
                                       Discount %  *
                                      (Invoice open amount / Invoice amount with Tax).
                  2) In case of Discount Tax at Payment = NO
                    Discount Amount = (Invoice amount without Tax - Non-discountable amount) * 
                                      Discount %  *
                                     (Invoice open amount / Invoice amount with Tax).
                *****************************************************************************************************************/         
                                                      
                if tInnerQueryDinvoiceForBill.tlDInvoiceIsDiscTaxAtPaym = true
                then assign vdInvoiceDefaultDiscountAmount = vdInvoiceAmount * 
                                                             (((vdInvoiceAmount - tDInvoiceToBill.tdVatTC) - tDInvoiceToBill.tdDInvoiceNonDiscAmtTC) /
                                                              (vdInvoiceAmount - tDInvoiceToBill.tdVatTC)) * 
                                                             (tInnerQueryDinvoiceForBill.tdPaymentConditionPercentage / 100) *
                                                             (tDInvoiceToBill.tdDInvoiceBalance / vdinvoiceAmount).                   
                
                /* The discount calculation for discount at invoice or no tax discount is the same */
                else assign vdInvoiceDefaultDiscountAmount = ((vdInvoiceAmount - tDInvoiceToBill.tdVatTC) - tDInvoiceToBill.tdDInvoiceNonDiscAmtTC) * 
                                                             (tInnerQueryDinvoiceForBill.tdPaymentConditionPercentage / 100) *                                                     
                                                             (tDInvoiceToBill.tdDInvoiceBalance / vdinvoiceAmount).
                                                                    
            end.
            else assign vdInvoiceDefaultDiscountAmount = 0.
    
            assign vdInvoiceDefaultPaymentAmount  = tDInvoiceToBill.tdDInvoiceBalance - vdInvoiceDefaultDiscountAmount.

            if vlProposePayment = true
            then do:
                assign vdDefaultDiscountAmount = vdDefaultDiscountAmount + vdInvoiceDefaultDiscountAmount *
                                                 tInnerQueryDinvoiceForBill.tdDInvoiceBankToPayTC / tDInvoiceToBill.tdDInvoiceBalance
                       vdDefaultPaymentAmount  = vdDefaultPaymentAmount + vdInvoiceDefaultPaymentAmount *
                                                 tInnerQueryDinvoiceForBill.tdDInvoiceBankToPayTC / tDInvoiceToBill.tdDInvoiceBalance.
            end.
    
            if last-of (tInnerQueryDinvoiceForBill.tiDInvoice_ID)
            then do:
                if vlProposePayment
                then do:
                    assign tDInvoiceToBill.tdDefaultDiscountAmount = <M-66 RoundAmount
                                                                        (input  vdDefaultDiscountAmount (idUnroundedAmount), 
                                                                         input  ? (iiCurrencyID), 
                                                                         input  tDInvoiceToBill.tcCurrencyCode (icCurrencyCode)) in BApplicationProperty>
                           tDInvoiceToBill.tdDefaultPaymentAmount  = <M-48 RoundAmount
                                                                        (input  vdDefaultPaymentAmount (idUnroundedAmount), 
                                                                         input  ? (iiCurrencyID), 
                                                                         input  tDInvoiceToBill.tcCurrencyCode (icCurrencyCode)) in BApplicationProperty>
                           vdInvoiceTotalTC = tDInvoiceToBill.tdDefaultPaymentAmount +
                                              tDInvoiceToBill.tdDefaultDiscountAmount.
    
                    /* Rounding difference compensation between dinvoice OpenAmount vs PaymentAmount */
                    if vlDInvoiceIsWithOneBank and
                      (vdInvoiceTotalTC <> tDInvoiceToBill.tdDInvoiceBalance)
                    then assign tDInvoiceToBill.tdDefaultPaymentAmount = tDInvoiceToBill.tdDefaultPaymentAmount +
                                                                         tDInvoiceToBill.tdDInvoiceBalance - vdInvoiceTotalTC.
                end.
                else assign tDInvoiceToBill.tdDefaultDiscountAmount = 0
                            tDInvoiceToBill.tdDefaultPaymentAmount  = 0.
            end.
        end.
    end.
end.


<Q-23 run GetHolidayByYear (all) (Read) (NoCache)
       (input viCompanyId, (CompanyId)
        input Year(itInvoiceDateTo), (Year)
        output dataset tqGetHolidayByYear) in BHoliday>
find first tqGetHolidayByYear no-error.
if not available tqGetHolidayByYear then do:
  <M-39 run SetMessage
     (input  trim(#T-83'Holidays have not been set up for the whole year.':255(283525564)T-83#) (icMessage), 
      input  '':U (icArguments), 
      input  '':U (icFieldName), 
      input  string(vtLoopDate) (icFieldValue), 
      input  'W':U (icType), 
      input  3 (iiSeverity), 
      input  ? (icRowid), 
      input  'qadfin-499784':U (icFcMsgNumber), 
      input  '':U (icFcExplanation), 
      input  '':U (icFcIdentification), 
      input  '':U (icFcContext), 
      output viFcReturnSuper (oiReturnStatus)) in BBill>
      assign oiReturnStatus = 1.
   leave.    
end.  


if oiReturnStatus < 0 then assign oiReturnStatus = 0.