Excel Import into D365 using x++ code
using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using OfficeOpenXml.Table;
using OfficeOpenXml.ExcelRange;
using OfficeOpenXml.ExcelPackage;
/// <summary>
/// Customer invoice journal excel import
/// </summary>
class CustInvoiceJournalExcelImport
{
int currentRow = 1;
int coloumn = 1;
ExcelWorksheets worksheets;
ExcelWorksheet worksheet;
OfficeOpenXml.ExcelRange cells;
OfficeOpenXml.ExcelRange cell;
#OCCRetryCount
CustInvoiceTable CustInvoiceTable;
CustInvoiceLineImport CustInvoiceLineImport;
public static void main(Args _args)
{
FormRun formRun = _args.caller();
CustInvoiceJournalExcelImport custInvoiceJournalExcelImport = new CustInvoiceJournalExcelImport();
custInvoiceJournalExcelImport.importExcel();
formRun.dataSource().research(true);
formRun.dataSource().refresh();
}
/// <summary>
/// Assigning posting profile
/// </summary>
/// <param name = "custTable">
/// custTable buffer
/// </param>
/// <param name = "billingType">
/// billingType
/// </param>
public void populatePostingProfile(CustTable custTable, BillingType billingType)
{
PostingRulesForDebtorAccnts postingRulesForDebtorAccnts;
select firstonly PostingProfile from postingRulesForDebtorAccnts
where postingRulesForDebtorAccnts.AccountType == custTable.AccountType
&& ((postingRulesForDebtorAccnts.SubType == custTable.SubType)
|| (postingRulesForDebtorAccnts.SubType == SubType::None))
&& postingRulesForDebtorAccnts.BillingType == billingType
&& ((postingRulesForDebtorAccnts.AccountNum == custTable.AccountNum)
|| (postingRulesForDebtorAccnts.AccountNum == ''));
CustInvoiceLineImport.PostingProfile = postingRulesForDebtorAccnts.PostingProfile;
}
/// <summary>
/// Assigning default values based on TCAccount
/// </summary>
/// <param name = "tCAccountId">
/// Account id
/// </param>
/// <param name = "custTable">
/// custTable buffer
/// </param>
public void populatetCAccountRelatedFields(TCAccountId tCAccountId,CustTable custTable)
{
PropertyUnit propertyUnit;
BillingUsageType BillingUsageType;
BillingUsageClass BillingUsageClass;
propertyUnit = PropertyUnit::findBySchemaAccount(CustInvoiceLineImport.TCAccountId,false);
CustInvoiceLineImport.AccountType = custTable.AccountType;
CustInvoiceLineImport.PaymTermId = custTable.PaymTermId;
CustInvoiceLineImport.SubType = custTable.SubType;
CustInvoiceLineImport.SchemeAccNo = propertyUnit.SchemeAccountId;
//CustInvoiceLineImport.DefaultDimension = custTable.DefaultDimension;
select firstonly Number from BillingUsageType
where BillingUsageType.RecId == propertyUnit.UsageType;
if (BillingUsageType.Number)
{
CustInvoiceLineImport.UsageType = BillingUsageType.Number;
}
select firstonly Number from BillingUsageClass
where BillingUsageClass.RecId == propertyUnit.UsageClassR;
if (BillingUsageClass.Number)
{
CustInvoiceLineImport.UsageClass = BillingUsageClass.Number;
}
}
/// <summary>
/// Assigning default values based on Billing classification
/// </summary>
/// <param name = "billingClassification">
/// BillingClassification
/// </param>
/// <param name = "itemGSTGroup">
/// itemGSTGroup
/// </param>
/// <param name = "custTable">
/// custTable buffer
/// </param>
public void populateBillingClassificationDetails(BillingClassification billingClassification, TaxItemGroup itemGSTGroup, CustTable custTable)
{
CustBillingClassification custBillingClassification;
CustBillingClassificationCode custBillingClassificationCode;
CustBillingCode custBillingCode;
CustBillingCodeVersion custBillingCodeVersion;
CustBillingCodeLedgerAccount custBillingCodeLedgerAccount;
custBillingClassification = CustBillingClassification::findByBillingClassification(billingClassification);
CustInvoiceLineImport.BillingType = custBillingClassification.BillingType;
select firstonly CustBillingCode from custBillingClassificationCode
where custBillingClassificationCode.CustBillingClassification == custBillingClassification.RecId
join BillingCode,Description,RecId from custBillingCode
where custBillingCode.RecId == custBillingClassificationCode.CustBillingCode
join RecId,TaxItemGroupHeading from custBillingCodeVersion
where custBillingCodeVersion.CustBillingCode == custBillingCode.RecId
join LedgerDimension, RecId from custBillingCodeLedgerAccount
order by custBillingCodeLedgerAccount.RecId
where custBillingCodeLedgerAccount.CustBillingCodeVersion == custBillingCodeVersion.RecId;
if (custBillingCodeLedgerAccount.RecId)
{
CustInvoiceLineImport.ItemGSTGroup = itemGSTGroup ? itemGSTGroup : custBillingCodeVersion.TaxItemGroupHeading;
this.populatePostingProfile(custTable,CustInvoiceLineImport.BillingType);
}
if (!CustInvoiceLineImport.ItemGSTGroup)
CustInvoiceLineImport.ItemGSTGroup = itemGSTGroup;
if (!CustInvoiceLineImport.BillingCode && (CustInvoiceLineImport.AccountType == AccountType::SCC ||
CustInvoiceLineImport.AccountType == AccountType::Void))
{
this.populateBillingCode(CustInvoiceLineImport);
}
}
/// <summary>
/// Assigning default values based on BillingCode
/// </summary>
/// <param name = "billingCode">
/// BillingCode
/// </param>
/// <param name = "itemGSTGroup">
/// itemGSTGroup
/// </param>
/// <param name = "custTable">
/// custTable buffer
/// </param>
public void populateBillingCodeDetails(BillingCode billingCode, TaxItemGroup itemGSTGroup, CustTable custTable)
{
CustBillingClassification custBillingClassification;
CustBillingClassificationCode custBillingClassificationCode;
CustBillingCode custBillingCode;
CustBillingCodeVersion custBillingCodeVersion;
CustBillingCodeLedgerAccount custBillingCodeLedgerAccount;
custBillingCode = CustBillingCode::findBillingCode(billingCode);
select firstonly CustBillingClassification from custBillingClassificationCode
where custBillingClassificationCode.CustBillingCode == custBillingCode.RecId
join BillingClassification,Billingtype from custBillingClassification
where CustBillingClassification.RecId == custBillingClassificationCode.CustBillingClassification
join TaxItemGroupHeading from custBillingCodeVersion
where custBillingCodeVersion.CustBillingCode == custBillingCode.RecId
join firstonly LedgerDimension, RecId from custBillingCodeLedgerAccount
order by custBillingCodeLedgerAccount.RecId
where custBillingCodeLedgerAccount.CustBillingCodeVersion == custBillingCodeVersion.RecId;
if (custBillingCodeLedgerAccount.RecId)
{
CustInvoiceLineImport.LedgerDimension = LedgerDefaultAccountHelper::getDefaultAccountFromLedgerDimension(custBillingCodeLedgerAccount.LedgerDimension);
if (CustInvoiceLineImport.BillingClassification == "")
CustInvoiceLineImport.BillingClassification = custBillingClassification.BillingClassification;
if (CustInvoiceLineImport.BillingType == "")
CustInvoiceLineImport.BillingType = custBillingClassification.BillingType;
if (CustInvoiceLineImport.ItemGSTGroup == "")
CustInvoiceLineImport.ItemGSTGroup = itemGSTGroup ? itemGSTGroup : custBillingCodeVersion.TaxItemGroupHeading;
if (CustInvoiceLineImport.PostingProfile == "")
{
this.populatePostingProfile(custTable,CustInvoiceLineImport.BillingType);
}
CustInvoiceLineImport.Description = custBillingCode.Description;
this.setBillingCodeDefaults(custBillingCode,custTable,CustInvoiceLineImport);
}
}
public void populateBillingCode(CustInvoiceLineImport invoiceLineImport)
{
SCCMasterRatesParameters sccMasterRatesParameters;
SCCRecoveredRatesParameters sccRecoveredRatesParameters;
sccMasterRatesParameters = SCCMasterRatesParameters::find(BillingUsageClass::findNumber(invoiceLineImport.UsageClass,false).RecId,BillingUsageType::findTCNumber(invoiceLineImport.UsageType,false).RecId);
if (sccMasterRatesParameters)
{
if (sccMasterRatesParameters && invoiceLineImport.SubType == SubType::Rented || invoiceLineImport.SubType == SubType::HDBRented || invoiceLineImport.SubType == SubType::NEARented)
{
CustInvoiceLineImport.BillingCode = sccMasterRatesParameters.AdjForRentalUnits;
CustInvoiceLineImport.modifiedField(fieldNum(CustInvoiceLineImport,BillingCode));
}
else if (sccMasterRatesParameters && invoiceLineImport.SubType == SubType::Sold || invoiceLineImport.SubType == SubType::HDBSold || invoiceLineImport.SubType == SubType::NEASold)
{
CustInvoiceLineImport.BillingCode = sccMasterRatesParameters.AdjForSoldUnits;
CustInvoiceLineImport.modifiedField(fieldNum(CustInvoiceLineImport,BillingCode));
}
}
else
{
sccRecoveredRatesParameters = SCCRecoveredRatesParameters::find(BillingUsageClass::findNumber(invoiceLineImport.UsageClass,false).RecId,BillingUsageType::findTCNumber(invoiceLineImport.UsageType,false).RecId);
if (sccRecoveredRatesParameters && invoiceLineImport.SubType == SubType::Rented || invoiceLineImport.SubType == SubType::HDBRented || invoiceLineImport.SubType == SubType::NEARented)
{
CustInvoiceLineImport.BillingCode = sccRecoveredRatesParameters.AdjForRentalUnits;
CustInvoiceLineImport.modifiedField(fieldNum(CustInvoiceLineImport,BillingCode));
}
else if (sccRecoveredRatesParameters && invoiceLineImport.SubType == SubType::Sold || invoiceLineImport.SubType == SubType::HDBSold || invoiceLineImport.SubType == SubType::NEASold)
{
CustInvoiceLineImport.BillingCode = sccRecoveredRatesParameters.AdjForSoldUnits;
CustInvoiceLineImport.modifiedField(fieldNum(CustInvoiceLineImport,BillingCode));
}
}
}
public static void validateInvoiceLines(CustInvoiceJourBatchId custInvoiceJourBatchId)
{
CustInvoiceLineImport CustInvoiceLineImport;
BillingTypeMaster billingTypeMaster;
Query query;
QueryRun queryRun;
QueryBuildDataSource custInvoiceLineImportQbds;
query = new Query();
custInvoiceLineImportQbds = query.addDataSource(tableNum(CustInvoiceLineImport));
custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, CustInvoiceJourBatchId)).value(queryValue(custInvoiceJourBatchId));
custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, IsValidated)).value(Sysquery::value(NoYes::No));
queryRun = new QueryRun(query);
while (queryRun.next())
{
CustInvoiceLineImport = queryRun.get(tableNum(CustInvoiceLineImport));
if (!CustInvoiceLineImport.TransDate || !CustInvoiceLineImport.BillingPeriodDate)
{
CustInvoiceLineImport.Log += "@S:ValidateInvoiceDate";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!CustTable::exist(CustInvoiceLineImport.TCAccountId))
{
CustInvoiceLineImport.Log += "@S:ValidateTCAccount";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!CustInvoiceLineImport.BillingClassification)
{
CustInvoiceLineImport.Log += "@S:ValidateBillingClassification";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (CustInvoiceLineImport.BillingClassification && !CustBillingClassification::findBillingClassification(CustInvoiceLineImport.BillingClassification).AllowedInCustInvJour)
{
CustInvoiceLineImport.Log += strFmt("@S:BillingClassificationIsNotAllowed",CustInvoiceLineImport.BillingClassification);
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!CustInvoiceLineImport.BillingType)
{
CustInvoiceLineImport.Log += "@S:BillingType";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!CustInvoiceLineImport.BillingCode || !CustInvoiceLineImport.Description)
{
CustInvoiceLineImport.Log += "@S:ValidateBillingCode";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!CustInvoiceLineImport.LedgerDimension)
{
CustInvoiceLineImport.Log += "@S:ValidateMainAccount";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!CustInvoiceLineImport.DefaultDimension)
{
CustInvoiceLineImport.Log += "@S:ValidateFinDimensions";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!CustInvoiceLineImport.AmountCurDebit)
{
CustInvoiceLineImport.Log += "@S:ValidateCreditDebitAmount";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!CustInvoiceLineImport.ItemGSTGroup || !CustInvoiceLineImport.PostingProfile)
{
CustInvoiceLineImport.Log += "@S:ValidateItemGSTAndPostingProfile";
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (!TaxItemGroupHeading::find(CustInvoiceLineImport.ItemGSTGroup))
{
CustInvoiceLineImport.Log += strFmt("@Payroll:TheValue1InField2IsNotFoundInTheRelatedTable3", CustInvoiceLineImport.ItemGSTGroup, "@S:ItemGSTGroup", tableId2pname(tableNum(TaxItemGroupHeading)));
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
if (CustInvoiceLineImport.BillingType && CustInvoiceLineImport.AccountType)
{
if(CustInvoiceLineImport.AccountType == AccountType::SCC || CustInvoiceLineImport.AccountType == AccountType::Void ||
CustInvoiceLineImport.AccountType == AccountType::TOL || CustInvoiceLineImport.AccountType == AccountType::LUCS ||
CustInvoiceLineImport.AccountType == AccountType::OtherDebitors)
{
select firstonly billingTypeMaster
where billingTypeMaster.BillingType == CustInvoiceLineImport.BillingType
&& billingTypeMaster.AllowedAccountType == AllowedAccountType::Blank;
if (billingTypeMaster)
{
CustInvoiceLineImport.Log += strFmt("@S:BlankAllowedAccountTypeValidation",AllowedAccountType::Blank);
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
}
else if(CustInvoiceLineImport.AccountType == AccountType::SCC || CustInvoiceLineImport.AccountType == AccountType::Void ||
CustInvoiceLineImport.AccountType == AccountType::TOL)
{
select firstonly billingTypeMaster
where billingTypeMaster.BillingType == CustInvoiceLineImport.BillingType
&& billingTypeMaster.AllowedAccountType == AllowedAccountType::SCCVoidTOL;
if (billingTypeMaster)
{
CustInvoiceLineImport.Log += strFmt("@S:AllowedAccountTypeValidation",AllowedAccountType::SCCVoidTOL);
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
}
else if(CustInvoiceLineImport.AccountType == AccountType::LUCS)
{
select firstonly billingTypeMaster
where billingTypeMaster.BillingType == CustInvoiceLineImport.BillingType
&& billingTypeMaster.AllowedAccountType == AllowedAccountType::LUCS;
if (billingTypeMaster)
{
CustInvoiceLineImport.Log += strFmt("@S:AllowedAccountTypeValidation",AllowedAccountType::LUCS);
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
}
else if(CustInvoiceLineImport.AccountType == AccountType::OtherDebitors)
{
select firstonly billingTypeMaster
where billingTypeMaster.BillingType == CustInvoiceLineImport.BillingType
&& billingTypeMaster.AllowedAccountType == AllowedAccountType::OtherDebtors;
if (billingTypeMaster)
{
CustInvoiceLineImport.Log += strFmt("@S:AllowedAccountTypeValidation",AllowedAccountType::OtherDebtors);
CustInvoiceLineImport.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLineImport.ImportStatus = ImportStatus::Error;
}
}
}
CustInvoiceLineImport.selectForUpdate(true);
if (!CustInvoiceLineImport.Log)
{
CustInvoiceLineImport.IsValidated = NoYes::Yes;
}
else
{
CustInvoiceLineImport.IsValidated = NoYes::No;
}
CustInvoiceLineImport.doUpdate();
}
}
public static void createInvoiceLines(CustInvoiceJourBatchId custInvoiceJourBatchId)
{
CustInvoiceLineImport CustInvoiceLineImport,updCustInvoiceLineImport;
CustInvoiceLine CustInvoiceLine;
Query query;
QueryRun queryRun;
QueryBuildDataSource custInvoiceLineImportQbds;
RecordInsertList recordInsertListInvoiceLine = null;
recordInsertListInvoiceLine = new RecordInsertList(tableNum(CustInvoiceLine));
query = new Query();
custInvoiceLineImportQbds = query.addDataSource(tableNum(CustInvoiceLineImport));
custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, CustInvoiceJourBatchId)).value(queryValue(custInvoiceJourBatchId));
custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, IsValidated)).value(Sysquery::value(NoYes::Yes));
custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, ImportStatus)).value(SysQuery::value(ImportStatus::Success));
custInvoiceLineImportQbds.addRange(fieldNum(CustInvoiceLineImport, IsLineCreated)).value(Sysquery::value(NoYes::No));
queryRun = new QueryRun(query);
while (queryRun.next())
{
CustInvoiceLine = null;
CustInvoiceLineImport = queryRun.get(tableNum(CustInvoiceLineImport));
CustInvoiceLine.initValue();
CustInvoiceLine.initFromCustInvoiceTable(CustInvoiceTable::find(custInvoiceJourBatchId,false));
CustInvoiceLine.TransDate = CustInvoiceLineImport.TransDate;
CustInvoiceLine.BillingPeriodDate = CustInvoiceLineImport.BillingPeriodDate;
CustInvoiceLine.AccountType = CustInvoiceLineImport.AccountType;
CustInvoiceLine.TCAccountId = CustInvoiceLineImport.TCAccountId;
CustInvoiceLine.BillingType = CustInvoiceLineImport.BillingType;
CustInvoiceLine.BillingCode = CustInvoiceLineImport.BillingCode;
CustInvoiceLine.BillingClassification = CustInvoiceLineImport.BillingClassification;
CustInvoiceLine.Description = CustInvoiceLineImport.Description;
CustInvoiceLine.AmountCurDebit = CustInvoiceLineImport.AmountCurDebit;
CustInvoiceLine.GSTGroup = CustInvoiceLineImport.GSTGroup;
CustInvoiceLine.GSTAmount = CustInvoiceLineImport.GSTAmount;
CustInvoiceLine.TotalAmount = CustInvoiceLineImport.TotalAmount;
CustInvoiceLine.InvoiceId = CustInvoiceLineImport.InvoiceId;
CustInvoiceLine.PaymTermId = CustInvoiceLineImport.PaymTermId;
CustInvoiceLine.DefaultDimension = CustInvoiceLineImport.DefaultDimension;
CustInvoiceLine.PostingProfile = CustInvoiceLineImport.PostingProfile;
CustInvoiceLine.LedgerDimension = CustInvoiceLineImport.LedgerDimension;
CustInvoiceLine.ItemGSTGroup = CustInvoiceLineImport.ItemGSTGroup;
CustInvoiceLine.LineNum = CustInvoiceLineImport.LineNum;
CustInvoiceLine.Log = CustInvoiceLineImport.Log;
CustInvoiceLine.SourceDocumentLine = CustInvoiceLineImport.SourceDocumentLine;
CustInvoiceLine.SourceDocumentHeader = CustInvoiceLineImport.SourceDocumentHeader;
CustInvoiceLine.SchemeAccNo = CustInvoiceLineImport.SchemeAccNo;
CustInvoiceLine.SubType = CustInvoiceLineImport.SubType;
CustInvoiceLine.UsageType = CustInvoiceLineImport.UsageClass;
CustInvoiceLine.UsageClass = CustInvoiceLineImport.UsageClass;
recordInsertListInvoiceLine.add(CustInvoiceLine);
update_recordset updCustInvoiceLineImport
setting IsLineCreated = NoYes::Yes
where updCustInvoiceLineImport.CustInvoiceJourBatchId == CustInvoiceLineImport.CustInvoiceJourBatchId
&& updCustInvoiceLineImport.LineNum == CustInvoiceLineImport.LineNum;
}
recordInsertListInvoiceLine.insertDatabase();
}
/// <summary>
/// To Genearte the default financial dimension from individual display value.
/// _activity, _division, _fund, _precinct, _project, _property
/// </summary>
/// <param name = "_fund">Fund</param>
/// <param name = "_division">Division</param>
/// <param name = "_precinct">Precinct</param>
/// <param name = "_property">Property</param>
/// <param name = "_activity">Activity</param>
/// <param name = "_project">Project</param>
/// <returns>DimensionDefault</returns>
public static DimensionDefault createDefaultDimension( DimensionValue _fund,
DimensionValue _division,
DimensionValue _precinct,
DimensionValue _property,
DimensionValue _activity,
DimensionValue _project)
{
DimensionAttributeValueSetStorage valueSetStorage = new DimensionAttributeValueSetStorage();
DimensionDefault result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
container conAttr = LedgerDimensionHelper::getDimensionNameTID();
container conValue = [_activity, _division, _fund, _precinct, _project, _property];
str dimValue;
for (i = 1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
dimensionAttributeValue = dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,true);
valueSetStorage.addItem(dimensionAttributeValue);
}
}
//It reutrns the value of type DimensionDefault
result = valueSetStorage.save();
return result;
}
/// <summary>
/// Read the excel file
/// </summary>
protected void importExcel()
{
try
{
this.readData();
}
catch (Exception::Deadlock)
{
if (xSession::currentRetryCount() >= #RetryNum)
{
throw Exception::Deadlock;
}
else
{
retry;
}
}
catch (Exception::UpdateConflict)
{
if (appl.ttsLevel() == 0)
{
if (xSession::currentRetryCount() >= #RetryNum)
{
throw Exception::UpdateConflictNotRecovered;
}
else
{
retry;
}
}
else
{
throw Exception::UpdateConflict;
}
}
catch (Exception::CLRError)
{
this.logCLRException();
}
catch (Exception::Error)
{
throw error(infolog.text());
}
}
private void logCLRException()
{
System.Exception ex = ClrInterop::getLastException();
if (ex != null)
{
ApplicationUnhandledExceptionLogger::logCLRException(ex);
str errorMessage = ex.Message;
// If an inner exception exists, display this error message as it is the original exception message
// which is more useful
if (ex.InnerException != null)
{
errorMessage = ex.InnerException.Message;
}
throw error(errorMessage);
}
}
/// <summary>
/// Reads the excel data and insert into staging
/// </summary>
protected void readData()
{
System.IO.Stream stream;
DialogGroup dlgUploadGroup;
FileUploadBuild fileUploadBuild;
FormBuildControl formBuildControl;
TransDate invoiceDate;
BillingPeriodDate billingPeriodDate;
Description description;
TCAccountId tcAccountId;
BillingClassification billingClassification;
BillingCode billingCode;
AmountCurDebit amountCurDebit;
Amount totalAmount;
TaxItemGroup itemGSTGroup;
str fund,division,precinct,property,activity,project;
NumberSeq numberSeq;
CustTable custTable;
boolean header = true;
int insertedRecord = 0;
real lineNum = 1.00;
Dialog dialog = new Dialog("@S:ImportCustInvoiceJour");
dlgUploadGroup = dialog.addGroup("@SYS54759");
formBuildControl = dialog.formBuildDesign().control(dlgUploadGroup.name());
fileUploadBuild = formBuildControl.addControlEx(classstr(FileUpload), 'Upload');
fileUploadBuild.style(FileUploadStyle::MinimalWithFilename);
fileUploadBuild.fileTypesAccepted('.xlsx');
RecordInsertList recordInsertListCustInvoiceLineImport = null;
recordInsertListCustInvoiceLineImport = new RecordInsertList(tableNum(CustInvoiceLineImport));
if (dialog.run() && dialog.closedOk())
{
FileUpload fileUploadControl;
FileUploadTemporaryStorageResult fileUploadResult;
fileUploadControl = dialog.formRun().control(dialog.formRun().controlId('Upload'));
fileUploadResult = fileUploadControl.getFileUploadResult();
if (fileUploadResult != null && fileUploadResult.getUploadStatus())
{
stream = fileUploadResult.openResult();
using (ExcelPackage Package = new ExcelPackage(stream))
{
int rowCount, i,columncount;
Package.Load(stream);
worksheet = package.get_Workbook().get_Worksheets().get_Item(1);
OfficeOpenXml.ExcelRange range = worksheet.Cells;
rowCount = (worksheet.Dimension.End.Row) - (worksheet.Dimension.Start.Row) + 1;
columncount = (worksheet.Dimension.End.Column);
try
{
ttsbegin;
for (i = 2; i<= rowCount; i++)
{
invoiceDate = range.get_Item(i, 1).value;
billingPeriodDate = range.get_Item(i, 2).value;
description = range.get_Item(i, 3).value;
tcAccountId = range.get_Item(i, 4).value;
billingClassification = range.get_Item(i, 5).value;
billingCode = range.get_Item(i, 6).value;
amountCurDebit = range.get_Item(i, 7).value;
totalAmount = range.get_Item(i, 8).value;
itemGSTGroup = range.get_Item(i, 9).value;
fund = range.get_Item(i, 10).value;
division = range.get_Item(i, 11).value;
precinct = range.get_Item(i, 12).value;
property = range.get_Item(i, 13).value;
activity = range.get_Item(i, 14).value;
project = range.get_Item(i, 15).value;
if (header)
{
CustInvoiceTable = null;
CustInvoiceTable.initValue();
ttsbegin;
numberSeq = NumberSeq::newGetNum(CustInvoiceTable::numRefCustInvJourBatchId());
CustInvoiceTable.CustInvoiceJourBatchId = numberSeq.num();
numberSeq.used();
ttscommit;
CustInvoiceTable.Description = description;
CustInvoiceTable.insert();
header = false;
}
CustInvoiceLineImport = null;
CustInvoiceLineImport.initValue();
CustInvoiceLineImport.initFromCustInvoiceTable(CustInvoiceTable);
CustInvoiceLineImport.TransDate = invoiceDate;
CustInvoiceLineImport.BillingPeriodDate = billingPeriodDate ? billingPeriodDate : CustInvoiceLineImport.TransDate;
lineNum++;
CustInvoiceLineImport.LineNum = lineNum;
custTable = CustTable::find(tcAccountId,false);
if (custTable)
{
CustInvoiceLineImport.TCAccountId = tcAccountId;
if (fund || division || precinct || property || activity || project)
{
CustInvoiceLineImport.DefaultDimension = FERHelper::createDefaultDimension(fund,division,precinct,property,activity,project);
}
this.populatetCAccountRelatedFields(CustInvoiceLineImport.TCAccountId,custTable);
}
if (billingClassification)
{
CustInvoiceLineImport.BillingClassification = billingClassification;
this.populateBillingClassificationDetails(CustInvoiceLineImport.BillingClassification,itemGSTGroup,custTable);
}
if (billingCode)
{
CustInvoiceLineImport.BillingCode = billingCode;
this.populateBillingCodeDetails(CustInvoiceLineImport.BillingCode,itemGSTGroup,custTable);
}
if (!totalAmount && amountCurDebit)
{
CustInvoiceLineImport.AmountCurDebit = amountCurDebit;
CustInvoiceLineImport.GSTAmount = decRound(CustInvoiceLineImport.AmountCurDebit * (TownCouncil::TaxPercentValue(CustInvoiceLineImport.GSTGroup,CustInvoiceLineImport.ItemGSTGroup,CustInvoiceLineImport.TransDate)/100),2);
CustInvoiceLineImport.TotalAmount = decRound(CustInvoiceLineImport.AmountCurDebit + CustInvoiceLineImport.GSTAmount,2);
}
if (totalAmount && (amountCurDebit || !amountCurDebit))
{
CustInvoiceLineImport.TotalAmount = totalAmount;
real gstValue = TownCouncil::TaxPercentValue(CustInvoiceLineImport.GSTGroup,CustInvoiceLineImport.ItemGSTGroup,CustInvoiceLineImport.TransDate);
CustInvoiceLineImport.AmountCurDebit = decRound((100/(100+gstValue))*CustInvoiceLineImport.TotalAmount,2);
CustInvoiceLineImport.GSTAmount = decRound(CustInvoiceLineImport.TotalAmount - CustInvoiceLineImport.AmountCurDebit,2);
}
recordInsertListCustInvoiceLineImport.add(CustInvoiceLineImport);
insertedRecord++;
}
recordInsertListCustInvoiceLineImport.insertDatabase();
ttscommit;
}
catch (Exception::CLRError)
{
//checkFailed(strfmt("@S:CommunicationImportValidation",customerNumber,i));
}
Args args = new Args(formStr(CustInvoiceLineImport));
FormRun formRun;
FormDataSource formDataSource = new FormDataSource();
formRun = ClassFactory.formRunClass(args);
formRun.init();
formDataSource = formRun.dataSource();
formRun.run();
formDataSource.filter(fieldNum(CustInvoiceLineImport,CustInvoiceJourBatchId),CustInvoiceTable.CustInvoiceJourBatchId);
formRun.detach();
info(strFmt("@S:CustomerInvoiceJourImportText",insertedRecord, CustInvoiceTable.CustInvoiceJourBatchId));
}
}
else
{
error("@S:FBSErrorReadingExcelFile");
}
}
}
public void setBillingCodeDefaults(CustBillingCode _custBillingCode, CustTable _custTable, CustInvoiceLineImport invoiceLineImport)
{
CustBillingCodeLedgerAccount custBillingCodeLedgerAccount;
CustBillingCodeVersion custBillingCodeVersion;
custBillingCodeVersion = CustBillingCodeVersion::findByDate(_custBillingCode.RecId, invoiceLineImport.TransDate);
custBillingCodeLedgerAccount = this.getCustBillingCodeLedgerAccount(custBillingCodeVersion);
if ( custBillingCodeLedgerAccount.RecId )
{
//if (custBillingCodeVersion.UseDimensionsFromLine && invoiceLineImport.DefaultDimension == 0)
if (custBillingCodeVersion.UseDimensionsFromLine)
{
invoiceLineImport.DefaultDimension = LedgerDimensionDefaultFacade::serviceMergeDefaultDimensions(
LedgerDimensionFacade::getDefaultDimensionFromLedgerDimension(custBillingCodeLedgerAccount.LedgerDimension),
invoiceLineImport.DefaultDimension,
_custTable.DefaultDimension);
}
}
}
protected CustBillingCodeLedgerAccount getCustBillingCodeLedgerAccount(CustBillingCodeVersion _custBillingCodeVersion)
{
CustBillingCodeLedgerAccount custBillingCodeLedgerAccount;
select firstonly custBillingCodeLedgerAccount
order by custBillingCodeLedgerAccount.RecId
where custBillingCodeLedgerAccount.CustBillingCodeVersion == _custBillingCodeVersion.RecId;
return custBillingCodeLedgerAccount;
}
}
Comments
Post a Comment