In this blog, we will explore how to create and post an hour journal using X++ code. I have taken examples from a staging table, where we can utilize the data to create hour journals using the following method.
public boolean createHourJournal(DaxHourStaging stagingData)
{
ProjJournalTableData JournalTableData;
ProjJournalTransData journalTransData;
ProjJournalTable journalTable, journalTableUpdate;
ProjJournalTrans journalTrans;
ProjTable projTable;
ProjInvoiceTable projInvoiceTable;
NumberSeq numberSeq;
ProjJournalCheckPost jourPost;
ProjQtyEmpl qty;
JournalNumOfLines numOfLines;
DataAreaId company = '';
journalNum = '';
DaxHourStaging stagingDataHour;
boolean ret = false;
while select stagingDataHour
where stagingDataHour.InvoiceNumber == stagingData.InvoiceNumber
&& stagingDataHour.TransID == stagingData.TransID
&& stagingDataHour.TransactionType == DAXTransactionType::Hour
&& stagingDataHour.DAXProcessedUnprocessed == DAXProcessedUnprocessed::UnProcessed
&& stagingDataHour.Type == DAXType::Invoice
{
select crosscompany projTable
where projTable.DAXTransID == stagingDataHour.TransID;
changecompany(projTable.DataAreaId)
{
company = projTable.DataAreaId;
if (!journalNum)
{
journalTableData = JournalTableData::newTable(journalTable);
journalTransData = journalTableData.journalStatic().newJournalTransData(journalTrans, journalTableData);
journalTable.clear();
journalTable.JournalId = journalTableData.nextJournalId();
journalTable.JournalType = ProjJournalType::Hour;
journalTable.JournalNameId = ProjParameters::find().EmplJournalNameId;
journalTable.initFromProjJournalName(ProjJournalName::find(journalTable.JournalNameId));
journalTable.insert();
journalNum = journalTable.JournalId;
}
ResourceView ResResourcesListView;
ResResourceIdentifier ResResourceIdentifier;
ResourceCategoryView ResourceCategoryView;
WrkCtrTable wrkctrTable;
str resourceId = '';
str resourceCompany = '';
HcmWorker hcmWorker;
HcmEmployment hcmEmployment;
utcdatetime now = DateTimeUtil::utcNow();
CompanyInfo companyInfo;
select firstonly ResResourcesListView
where ResResourcesListView.ResourceId == stagingDataHour.DAXologyResourceId
&& ResResourcesListView.ResourceCompanyId == projTable.DataAreaId;
if (!ResResourcesListView.RecId)
{
select ValidTimeState(now) hcmEmployment
join hcmWorker
where hcmWorker.RecId == hcmEmployment.Worker
&& hcmWorker.PersonnelNumber == stagingDataHour.DAXologyResourceId
join companyInfo where companyInfo.RecId == hcmEmployment.LegalEntity;
if (hcmWorker.RecId)
{
resourceId = hcmWorker.PersonnelNumber;
resourceCompany = companyInfo.DataArea;
}
}
select firstonly ResResourceIdentifier
where ResResourceIdentifier.RecId == ResResourcesListView.RecId;
journalTableData.initFromJournalName(journalTableData.journalStatic().findJournalName(ProjJournalTable::find(journalNum).JournalNameId));
journalTrans.clear();
journalTransData.initFromJournalTable();
projInvoiceTable = projTable.projInvoice();
journalTrans.setTransDate();
journalTrans.TransDate = stagingDataHour.TransDate;
journalTrans.ProjTransDate = stagingDataHour.TransDate;
journalTrans.ProjId = projTable.ProjId;
journalTrans.Qty = stagingDataHour.Quantity;
journalTrans.DAXInvoiceId = stagingDataHour.InvoiceNumber;
journalTrans.DAXInvoiceDate = stagingDataHour.InvoiceDate;
journalTrans.DAXTransactionId = stagingDataHour.TransactionId;
journalTrans.CategoryId = ProjParameters::find().EmplCategory;
// journalTrans.Resource = ResResourceIdentifier.RefRecId;
journalTrans.Worker = ResResourcesListView.Worker;
journalTrans.LinePropertyId = 'Chargeable';
//journalTrans.DAXResourceCompany = resourceCompany;
journalTrans.DAXWrkCtrId = stagingDataHour.DAXologyResourceId;
journalTrans.DAXResourceName = stagingDataHour.DAXologyResourceName;
journalTrans.DAXologyRoleName = stagingDataHour.DAXologyRoleName;
journalTrans.Txt = stagingDataHour.Description;
journalTrans.CurrencyId = projInvoiceTable.CurrencyId;
journalTrans.DefaultDimension = projTable.DefaultDimension;
journalTrans.TaxGroupId = ProjParameters::taxGroupInvoice(projTable.ProjId);
journalTrans.SalesPrice = stagingDataHour.SalesPrice;
InventTableModule inventTableModule;
select inventTableModule
where inventTableModule.ItemId == InventTable::find(DAX_ProjectHourJournalCreateService::getDimensionValueFromDefaultDimension(projTable.DefaultDimension)).ItemId
&& inventTableModule.ModuleType == ModuleInventPurchSales::Sales;
journalTrans.TaxItemGroupId = inventTableModule.TaxItemGroupId;
numberSeq = NumberSeq::newGetVoucherFromId(journalTable.VoucherNumberSequenceTable, false);
journalTrans.Voucher = numberSeq.voucher();
journalTransData.create();
if (TaxParameters::checkTaxParameters_IN())
{
ProjJournalTransTaxExtensionIN projJournalTransHourTaxExtensionIN = null;
projJournalTransHourTaxExtensionIN = ProjJournalTransTaxExtensionIN::findByProjJournalTrans(journalTrans.RecId);
if (!projJournalTransHourTaxExtensionIN.RecId)
{
projJournalTransHourTaxExtensionIN.initValue();
projJournalTransHourTaxExtensionIN.ProjJournalTrans = journalTrans.RecId;
projJournalTransHourTaxExtensionIN.AssessableValueTransactionCurrency = journalTrans.Qty * journalTrans.SalesPrice;
projJournalTransHourTaxExtensionIN.insert();
}
}
}
}
try
{
changecompany(projTable.DataAreaId)
{
if (journalNum)
{
jourPost = ProjJournalCheckPost::newJournalCheckPost(true,true,JournalCheckPostType::Post,tableNum(ProjJournalTable), journalNum);
jourPost.run();
ret = true;
ProjJournalTrans projJournalTrans;
ProjJournalTable projJournalTabeUpd;
projJournalTabeUpd = ProjJournalTable::find(journalNum,true);
select count(RecId), sum(Qty) from projJournalTrans
where projJournalTrans.JournalId == journalNum;
projJournalTabeUpd.NumOfLines = int642int(projJournalTrans.RecId);
projJournalTabeUpd.ProjQty = projJournalTrans.Qty;
projJournalTabeUpd.update();
DaxHourStaging stagingGlobalUpd;
update_recordset stagingGlobalUpd setting DAXProcessedUnprocessed = DAXProcessedUnprocessed::Processed
where stagingGlobalUpd.InvoiceNumber == stagingData.InvoiceNumber
&& stagingGlobalUpd.OrderItemId == stagingData.OrderItemId
&& stagingGlobalUpd.TransactionType == DAXTransactionType::Hour;
}
}
}
catch
{
//Posting exception
}
finally
{
// Can go with an final update here
}
return ret;
}Thanks !!