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
Post a Comment