Generate Free Text Invoice QR Code in d365fo x++

Generate Free Text Invoice QR Code in d365fo x++

Code:

using Microsoft.Dynamics.ApplicationSuite.QRCode;
using QR = QRCoder;
class FreeTextInvoiceQRCode
{

    int                     qrCodeByteArrIndex;
    System.Byte[]           qrCodeByteArray;
    private static DSSLFreeTextInvoiceQRCode objGAZTQRCode;

    private void new()
    {
    }

    public static DSSLFreeTextInvoiceQRCode construct()
    {
        return (objGAZTQRCode) ? objGAZTQRCode : new DSSLFreeTextInvoiceQRCode();
    }

    public container generate(str _companyName, str _companyVat, utcdatetime _postedDateTime, real _vatAmount, real _amountIncVat)
    {
        str                                 strCompanyName, strVATNum, strDateTime, strTotalVATAmount, strTotalAmountIncVAT, strQrCodeBase64, strTime;
        int                                 intCompanyName, intVATNum, intDateTime, intTotalVATAmount, intTotalAmountIncVAT;
        int                                 qrByteArrayLength;
        container                           con;
        System.Text.Encoding                encodingUTF8;
        ;
        
        encodingUTF8 = System.Text.Encoding::get_UTF8();
        qrCodeByteArrIndex = 0;
        
        strCompanyName          = _companyName;
        strVATNum               = _companyVat;
        strTime                 = time2Str(DateTimeUtil::time(_postedDateTime), TimeSeparator::Colon, TimeSeparator::Colon);
        strDateTime             = date2Str(DateTimeUtil::date(_postedDateTime), 321, DateDay::Digits2,DateSeparator::Hyphen, DateMonth::Digits2, DateSeparator::Hyphen, DateYear::Digits4)+"T"+strTime+"Z";
        strTotalVATAmount       = strRem(strfmt("%1", _vatAmount),",");
        strTotalAmountIncVAT    = strRem(strfmt("%1", _amountIncVat),",");
        
        intCompanyName          = this.getStringBtyeLength(strCompanyName);
        intVATNum               = this.getStringBtyeLength(strVATNum);
        intDateTime             = this.getStringBtyeLength(strDateTime);
        intTotalVATAmount       = this.getStringBtyeLength(strTotalVATAmount);
        intTotalAmountIncVAT    = this.getStringBtyeLength(strTotalAmountIncVAT);
        
        qrByteArrayLength = intCompanyName + intVATNum + intDateTime + intTotalVATAmount + intTotalAmountIncVAT + 10;
        
        qrCodeByteArray = new System.Byte[qrByteArrayLength](); //initialize global byte array as per length of all TLV structures plus 2 chars per each struct for TL.
        
        this.qrCodeFillByteArray(1, intCompanyName,         encodingUTF8.GetBytes(strCompanyName));
        this.qrCodeFillByteArray(2, intVATNum,              encodingUTF8.GetBytes(strVATNum));
        this.qrCodeFillByteArray(3, intDateTime,            encodingUTF8.GetBytes(strDateTime));
        this.qrCodeFillByteArray(4, intTotalAmountIncVAT,   encodingUTF8.GetBytes(strTotalAmountIncVAT));
        this.qrCodeFillByteArray(5, intTotalVATAmount,      encodingUTF8.GetBytes(strTotalVATAmount));
        
        strQrCodeBase64 = System.Convert::ToBase64String(qrCodeByteArray);

        con = this.getQRImageDataFromBase64(strQrCodeBase64);
        
        return con;
    }

    private void qrCodeFillByteArray(int _tag, int _length, System.Byte[] _byteArrayStr)
    {
        int counter;
        int objectLength;
        
        qrCodeByteArray.SetValue( System.Convert::ToByte(_tag), qrCodeByteArrIndex);
        qrCodeByteArrIndex++;
        qrCodeByteArray.SetValue(System.Convert::ToByte(_length), qrCodeByteArrIndex);
        qrCodeByteArrIndex++;
        
        objectLength = CLRInterOp::getAnyTypeForObject(_byteArrayStr.get_Length());
                
        for (counter=0; counter < objectLength; counter++)
        {
            qrCodeByteArray.SetValue(_byteArrayStr.GetValue(counter), qrCodeByteArrIndex);
            qrCodeByteArrIndex++;
        }
    }

    private int getStringBtyeLength(str _rawString)
    {
        int length;
        System.Text.Encoding  encodingUTF8;
        System.Byte[]         byteArrayStr;
        ;
        
        encodingUTF8 = System.Text.Encoding::get_UTF8();
        byteArrayStr = encodingUTF8.GetBytes(_rawString);
        length = CLRInterOp::getAnyTypeForObject(byteArrayStr.get_Length());
        
        return length;
    }

    private container getQRImageDataFromBase64(str _base64String)
    {
        container qrImageData;
        System.Drawing.Bitmap bm;
        Encoder qrCodeEncoder = new Encoder();
        ;

        qrCodeEncoder.ErrorCorrectionLevel = ErrorCorrectionLevel::High;
        qrCodeEncoder.Version = 15;
        bm = qrCodeEncoder.Encode(_base64String);

        try
        {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            {
                bm.Save(stream, System.Drawing.Imaging.ImageFormat::Png);
                qrImageData =  Binary::constructFromMemoryStream(stream).getContainer();
            }
        }
        catch (Exception::CLRError)
        {
        }

        return qrImageData;
    }

}

Comments

Popular posts from this blog

D365FO – AX – X++ –Refresh, Reread, Research, and ExecuteQuery

Create Inventory Journal through Code in D365FO X++

SalesLine Reservation in D365fo x++