Friday, 15 December 2023

Check report Layout in D365 FO

Check report Layout customization

http://insidedax.blogspot.com/2019/10/d365-modifying-check-report-along-with.html


/// <summary>

/// This calss is a extension class for ChequeController.

/// </summary>

[ExtensionOf(classStr(ChequeController))]

final class UTTChequeController_Extension

{

    /// <summary>

    /// If the checkFormType is USStyle we calling the new report design

    /// </summary>

    /// <param name = "_chequeFormType"> CheckFormtype </param>

    /// <param name = "_bankChequeLayout"> BankChequeLayout buffer</param>

    /// <returns>It returns the type of report design</returns>

    protected str determineReportMenuOutput(ChequeFormType _chequeFormType, BankChequeLayout _bankChequeLayout)

    {

        chequeReport = next determineReportMenuOutput( _chequeFormType,  _bankChequeLayout);


        switch (_chequeFormType)

        {

            case ChequeFormType::USStyle:

                chequeReport = ssrsReportStr(UTTCheque_US, Report);

                break;

        }

        return chequeReport;

    }


}



/// <summary>

/// This class is a extension class for CheqqueDP

/// </summary>

[ExtensionOf (classStr(ChequeDP))]

final class UTTChequeDP_Extension

{


    /// <summary>

    /// Address needs to populate in a single line

    /// </summary>

    protected void populateChequeTmp()

    {

        #Define.Company('MAV')

        #Define.DefaultMAVCompany('1000')

        #Define.EmptySpace(' ')

        #Define.BarCodeSplit('BARCODESPLIT')

        #Define.SlipText('\n\n\n\t                      SEE ENCLOSED FOR DETAILS OF INVOICES PAID.')


        next populateChequeTmp();


        BarcodeCode39 barcode, barCodeSplit;

        barcode      = Barcode::construct(BarcodeType::Code39);

        barCodeSplit = Barcode::construct(BarcodeType::Code39);


        barcode.string(true, (tmpChequePrintout.UTTVendorCompanyID == #Company? #DefaultMAVCompany: tmpChequePrintout.UTTVendorCompanyID)

                            +#EmptySpace+ tmpChequePrintout.UTTVendorID +#EmptySpace+ chequeTmp.ChequeNum);

        barcode.encode();


        barCodeSplit.string(true, #BarCodeSplit);

        barCodeSplit.encode();


        chequeTmp.UTTBarCode            = barcode.barcodeStr();

        chequeTmp.UTTBarCodeStatic      = barCodeSplit.barcodeStr();

        chequeTmp.UTTVendorCompanyName  = tmpChequePrintout.UTTVendorCompanyName;

        chequeTmp.UTTVendorID           = tmpChequePrintout.UTTVendorID;


        int64  invoiceCount = BankChequePaymTrans::getInvoiceCount(chequeTmp.ChequeNum, chequeTmp.AccountId);

        if (invoiceCount > 28)

        {

            chequeTmp.SlipTxt = #SlipText;

        }

    }


}



/// <summary>

/// This class is a extension class for CustVendCheque

/// </summary>

[ExtensionOf(classStr(CustVendCheque))]

final class UTTCustVendCheque_Extension

{

   

    /// <summary>

    /// Check report getting payment notes data not required to polulate in report

    /// </summary>

    /// <param name = "_ledgerJournalTrans"> ledgerJournalTrans table buffer</param>

    /// <returns> returns the empty buffer of paymentNotes </returns>

    protected ChequeSlipTxt formatSlipText(LedgerJournalTrans _ledgerJournalTrans)

    {

        #define.NullValue('')


        _ledgerJournalTrans.PaymentNotes =  next formatSlipText(_ledgerJournalTrans);

        _ledgerJournalTrans.PaymentNotes = #NullValue;

       

        return _ledgerJournalTrans.PaymentNotes;

    }


    /// <summary>

    /// This method is used to return PrintPaymentNotes

    /// </summary>

    /// <param name = "_ledgerJournalTrans">LedgerJournalTrans</param>

    /// <param name = "_bankChequePaymTransLines">Counter</param>

    /// <param name = "_totalBankChequePaymTransLines">Counter</param>

    /// <returns>it return boolean</returns>

    protected boolean shouldPrintPaymentNotes(LedgerJournalTrans _ledgerJournalTrans, Counter _bankChequePaymTransLines, Counter _totalBankChequePaymTransLines)

    {

        boolean             ret;

        ledgerJournalTrans  ledgerJournalTrans = _ledgerJournalTrans;


        ledgerJournalTrans = null;


        ret  =   next shouldprintpaymentNotes(ledgerJournalTrans,_bankChequePaymTransLines,_totalBankChequePaymTransLines);


        return ret;

    }


    /// <summary>

    /// Calculate the remaining total bank check payment transaction lines.

    /// </summary>

    /// <param name = "_totalBankChequePaymTransLines">

    /// The current total of remaining bank cheque payment transaction lines.

    /// </param>

    /// <returns>

    /// The total remaining bank check payment transaction lines.

    /// </returns>

    protected int getRemainingTotalBankChequePaymentTransLines(int _totalBankChequePaymTransLines)

    {

        int totalBankChequePaymTransLines = next getRemainingTotalBankChequePaymentTransLines(_totalBankChequePaymTransLines);


        if (totalBankChequePaymTransLines > 28)

        {

            totalBankChequePaymTransLines = -1;

        }


        return totalBankChequePaymTransLines;

    }


    /// <summary>

    /// Creates the <c>TmpChequePrintout</c> table buffer that contains the information that is required to

    /// create the physical check.

    /// </summary>

    /// <param name="_custVendPaym">

    /// A class that contains the transaction information that is needed for the check.

    /// </param>

    /// <exception cref="M:Exception::Error">

    /// The <c>LedgerJournalACType</c> enumeration value cannot have checks.

    /// </exception>

    public void output(CustVendPaym _custVendPaym)

    {

        vendTable          vendTable;

        LedgerJournalTrans ledgerJournalTrans = _custVendPaym.ledgerJournalTrans();


        next output(_custVendPaym);


        if (ledgerJournalTrans.AccountType == LedgerJournalACType::Vend && ledgerJournalTrans.Company)

        {

            vendTable = VendTable::findByLedgerDimension(ledgerJournalTrans.parmLedgerDimension());


            ttsbegin;

            tmpChequePrintout.selectforupdate(true);

            tmpChequePrintout.UTTVendorCompanyName  = CompanyInfo::findByCompany_IN(ledgerJournalTrans.Company).Name;

            tmpChequePrintout.UTTVendorID           = vendTable.AccountNum;

            tmpChequePrintout.UTTVendorCompanyID    = ledgerJournalTrans.Company;


            if (BankChequeLayout::find(tmpChequePrintout.AccountId).chequeFormType == ChequeFormType::USStyle)

            {

                tmpChequePrintout.AmountTxt = strFmt('***%1', tmpChequePrintout.AmountTxt);

            }

            tmpChequePrintout.update();

            ttscommit;

        }

    }


}


/// <summary>

/// This class is a extension class for CustVendChequeSlipTextCalculator

/// </summary>

[ExtensionOf(classStr(CustVendChequeSlipTextCalculator))]

final class UTTCustVendChequeSlipTextCalculator_Extension

{

    #define.NullValue('')


    /// <summary>

    /// This method is used to get Title information

    /// </summary>

    /// <param name = "_bankChequeTable">BankChequeTable</param>

    /// <param name = "_chequeFormType">ChequeFormType</param>

    /// <returns>container</returns>

    public container determineSlipTextTitleAndEndLinesAdjustmentForChequeFormType(

    BankChequeTable _bankChequeTable,

    ChequeFormType _chequeFormType)

    {

        ChequeSlipTxt   chequeSlipText;

        Counter         endLines;


        [chequeSlipText, endLines] = next determineSlipTextTitleAndEndLinesAdjustmentForChequeFormType(_bankChequeTable,_chequeFormType);


        switch (_chequeFormType)

        {

            case ChequeFormType::USStyle,

                ChequeFormType::ESStyle,

                ChequeFormType::MXStyle,

                ChequeFormType::CAStyle:


                chequeSlipText = #NullValue;

                endLines = 0;

                break;

        }


        return [chequeSlipText, endLines];

    }


    /// <summary>

    /// This method is used to get title end lines

    /// </summary>

    /// <param name = "_bankChequeTable">BankChequeTable</param>

    /// <param name = "_chequeFormType">ChequeFormType</param>

    /// <returns>container</returns>

    public container determineSlipTextTitleAndEndLinesAdjustmentForChequeRecipientType(

        BankChequeTable _bankChequeTable,

        ChequeFormType _chequeFormType)

    {

        ChequeSlipTxt chequeSlipText;

        Counter endLines;


        [chequeSlipText, endLines] = next determineSlipTextTitleAndEndLinesAdjustmentForChequeRecipientType(_bankChequeTable, _chequeFormType);

        switch (_bankChequeTable.RecipientType)

        {

            case BankChequeRecipientType::Vend:

                VendTable vendTable = VendTable::findByCompany(_bankChequeTable.RecipientCompany, _bankChequeTable.RecipientAccountNum);


                if (vendTable)

                {

                    chequeSlipText = #NullValue;

                    endLines = 0;

                }


                break;

        }

        return [chequeSlipText, endLines];

    }


    /// <summary>

    /// Determine slip text title and end lines adjustment for column headers.

    /// </summary>

    /// <param name = "_bankChequeTable">The bank check table.</param>

    /// <param name = "_chequeFormType">The check form type.</param>

    /// <returns>The slip text and the end lines adjustment.</returns>

    public container determineSlipTextTitleAndEndLinesAdjustmentForColumnHeaders(

        BankChequeTable _bankChequeTable,

        ChequeFormType _chequeFormType)

    {

        ChequeSlipTxt   chequeSlipText;

        Counter         endLines;


        [chequeSlipText, endLines]  = next determineSlipTextTitleAndEndLinesAdjustmentForColumnHeaders(_bankChequeTable, _chequeFormType);


        switch (_chequeFormType)

        {

            case ChequeFormType::USStyle,

                ChequeFormType::ESStyle,

                ChequeFormType::MXStyle,

                ChequeFormType::CAStyle,

                ChequeFormType::DEStyle,

                ChequeFormType::UKStyle:


                chequeSlipText = #NullValue;

                chequeSlipText += strFmt(

                    '%1         %2    %3             %4      %5   %6\n\n',

                    "@SYS339127", "@SYS4726", "@SYS35300", "@SYS53072", "@SYS77949", "@SYS6901");

                endLines = -2;

                break;

        }


        return [chequeSlipText, endLines];

    }


    /// <summary>

    /// Align the Total amount in check report

    /// </summary>

    /// <param name = "_args">args</param>

    /// <returns> returns the total amount in a aligned formate</returns>

    protected CustVendChequeSlipTextCalcDeterminSlipTextForTotalReturn determineSlipTextTitleAndEndLinesForSubTotalOrTotal(CustVendChequeSlipTextCalcDeterminSlipTextForTotalParameters _args)

    {

        CustVendChequeSlipTextCalcDeterminSlipTextForTotalReturn totalReturn = CustVendChequeSlipTextCalcDeterminSlipTextForTotalReturn::construct();

       

        totalReturn = next determineSlipTextTitleAndEndLinesForSubTotalOrTotal(_args);

        totalReturn.chequeSlipTxt = '';

        totalReturn.endLines      = -28;


        return totalReturn;

    }


    /// <summary>

    /// This method is used for shouldPrintSubTotal

    /// </summary>

    /// <param name = "_endLines">Counter</param>

    /// <param name = "_bankChequePaymTransLines">Counter</param>

    /// <param name = "_totalBankChequePaymTransLines">Counter</param>

    /// <param name = "_chequeFormType">ChequeFormType</param>

    /// <returns>boolean</returns>

    protected boolean shouldPrintSubTotal(Counter _endLines, Counter _bankChequePaymTransLines, Counter _totalBankChequePaymTransLines, ChequeFormType _chequeFormType)

    {

        boolean shouldPrintSubTotal = next shouldPrintSubTotal(_endLines, _bankChequePaymTransLines, _totalBankChequePaymTransLines, _chequeFormType);

       

        if (_chequeFormType == ChequeFormType::USStyle)

        {

            shouldPrintSubTotal = false;

        }


        return shouldPrintSubTotal;

    }


    /// <summary>

    /// Determine slip text and end lines adjustment for <c>BankChequePaymTrans</c>.

    /// </summary>

    /// <param name = "bankChequePaymTrans">The bank payment transaction.</param>

    /// <returns>The slip text and the end lines adjustment.</returns>

    protected container determineSlipTextAndEndLinesAdjustmentForBankChequePaymTrans(BankChequePaymTrans bankChequePaymTrans)

    {

        ChequeSlipTxt   chequeSlipText;

        VendTrans       vendTrans;

        Counter         endLines;

        BankChequeTable bankChequeTable;


        FromDate        invoiceDate     = bankChequePaymTrans.InvoiceDate;

        CashDiscAmount  cashDiscAmount  = bankChequePaymTrans.CashDiscAmountCur;


        [chequeSlipText, endLines] = next determineSlipTextAndEndLinesAdjustmentForBankChequePaymTrans(bankChequePaymTrans);

       

        bankChequeTable = bankChequeTable::find(bankChequePaymTrans.AccountId, bankChequePaymTrans.ChequeNum);

        switch (bankChequeTable.RecipientType)

        {

            case BankChequeRecipientType::Vend:

                select firstonly Txt from vendTrans

                    where vendTrans.Invoice == bankChequePaymTrans.InvoiceId;


                chequeSlipText = #NullValue;

                chequeSlipText += strFmt('%1 %2 %3 %4 %5 %6\n',

                                strLFix(date2StrUsr(invoiceDate), 12),

                                strLFix(bankChequePaymTrans.InvoiceId, 14),

                                strLFix(vendTrans.Txt, 20),

                                strRFix(num2str(-bankChequePaymTrans.InvoiceAmountCur, 0, 2, -1, -1), 12),

                                strRFix(num2str(cashDiscAmount, 0, 2, -1, -1), 13),

                                strRFix(num2str(-bankChequePaymTrans.PaymentAmountCur, 0, 2, -1, -1), 14));


                endLines = -1;

                break;

        }


        return [chequeSlipText, endLines];

    }


}

No comments:

Post a Comment

workflow business event configuration with power automate flow in d365 FO

  https://www.linkedin.com/pulse/purchase-order-approvals-d365fo-power-automate-ahmed-ali-el-bardisy-jyssf/