Good morning,
I am managing a development, and we are working on an enhancement to be able to generate the SalesPackingSlip with the tax values also shown for each line. The way I am retrieving it right now is the following:
AmountMST taxAmount;
TaxValue taxPct;
str taxCodes;
container taxInfo = this.getSalesLineTaxInfoFromPackingSlip(
custPackingSlipTrans.custPackingslipJour(),
custPackingSlipTrans,
salesLine);
taxAmount = conPeek(taxInfo, 1);
taxPct = conPeek(taxInfo, 2);
taxCodes = conPeek(taxInfo, 3);
if (!taxCodes)
{
taxInfo = this.getSalesLineTaxInfo(salesLine);
taxAmount = conPeek(taxInfo, 1);
taxPct = conPeek(taxInfo, 2);
}
_addingRecord.addCalculatedField('FRITaxAmount', taxAmount);
_addingRecord.addCalculatedField('FRITaxValue', taxPct);
_addingRecord.addCalculatedField('FRITaxCode', taxCodes);
//////////////////////////////////////////////////////////////////////////////////
private container getSalesLineTaxInfo(SalesLine _salesLine)
{
AmountMST taxAmount = 0;
TaxValue taxPct = 0;
if (!_salesLine.RecId)
{
return [taxAmount, taxPct];
}
TaxGroup taxGroup = _salesLine.TaxGroup;
TaxItemGroup taxItemGroup = _salesLine.TaxItemGroup;
CurrencyCode currencyCode = _salesLine.CurrencyCode;
if (!taxGroup || !currencyCode)
{
SalesTable salesTable = SalesTable::find(_salesLine.SalesId);
if (!taxGroup)
{
taxGroup = salesTable.TaxGroup;
}
if (!currencyCode)
{
currencyCode = salesTable.CurrencyCode;
}
}
if (!taxItemGroup)
{
return [taxAmount, taxPct];
}
if (!taxGroup || !taxItemGroup || !currencyCode)
{
return [taxAmount, taxPct];
}
AmountCur baseAmountCur = _salesLine.LineAmount;
if (!baseAmountCur)
{
return [taxAmount, taxPct];
}
TransDate transDate = systemDateGet();
TaxAmountCur taxAmountCur = Tax::calcTaxAmount(
taxGroup,
taxItemGroup,
transDate,
currencyCode,
baseAmountCur,
TaxModuleType::Sales);
taxAmount = abs(taxAmountCur);
taxPct = round(abs(taxAmountCur) / abs(baseAmountCur) * 100, 2);
return [taxAmount, taxPct];
}
private container getSalesLineTaxInfoFromPackingSlip(
CustPackingSlipJour _custPackingSlipJour,
CustPackingSlipTrans _custPackingSlipTrans,
SalesLine _salesLine)
{
AmountMST taxAmount = 0;
TaxValue taxPct = 0;
str taxCodes = '';
if (!_custPackingSlipJour.RecId || !_custPackingSlipTrans.RecId || !_salesLine.RecId)
{
return [taxAmount, taxPct, taxCodes];
}
TaxSales taxSales = this.getCachedTaxSalesForPackingSlip(_custPackingSlipJour);
if (!taxSales)
{
return [taxAmount, taxPct, taxCodes];
}
taxSales.showTaxesSourceSingleLine(tableNum(SalesLine), _salesLine.RecId, true);
TmpTaxWorkTrans tmpTaxWorkTrans = taxSales.tmpTaxWorkTrans();
AmountCur taxAmountCur = 0;
AmountCur taxBaseAmountCur = 0;
Set taxCodeSet = new Set(Types::String);
while select tmpTaxWorkTrans
where tmpTaxWorkTrans.SourceTableId == tableNum(SalesLine)
&& tmpTaxWorkTrans.SourceRecId == _salesLine.RecId
{
taxAmountCur += tmpTaxWorkTrans.TaxAmount;
taxBaseAmountCur += tmpTaxWorkTrans.TaxBaseAmount;
if (tmpTaxWorkTrans.TaxCode)
{
taxCodeSet.add(tmpTaxWorkTrans.TaxCode);
}
}
taxAmount = abs(taxAmountCur);
taxCodes = this.joinSet(taxCodeSet, ';');
taxPct = taxBaseAmountCur ? round(abs(taxAmountCur) / abs(taxBaseAmountCur) * 100, 2) : 0;
return [taxAmount, taxPct, taxCodes];
}
private TaxSales getCachedTaxSalesForPackingSlip(CustPackingSlipJour _custPackingSlipJour)
{
Map cache = new Map(Types::String, Types::Class);
str key = strFmt('%1|%2', _custPackingSlipJour.DataAreaId, _custPackingSlipJour.RecId);
if (cache.exists(key))
{
return cache.lookup(key);
}
TaxSales taxSales = null;
SalesParmTable salesParmTable = SalesParmTable::findSalesId(_custPackingSlipJour.SalesId, _custPackingSlipJour.ParmId);
if (salesParmTable.RecId)
{
SalesParmUpdate salesParmUpdate = salesParmTable.salesParmUpdate();
SalesTotals salesTotals = SalesTotals::construct(
salesParmTable,
salesParmUpdate.SpecQty,
salesParmUpdate.SumBy,
salesParmUpdate.ParmId,
salesParmUpdate.SumSalesId,
DocumentStatus::PackingSlip);
salesTotals.calc();
taxSales = salesTotals.tax();
}
cache.insert(key, taxSales);
return taxSales;
}
private str joinSet(Set _set, str _separator)
{
if (!_set)
{
return '';
}
SetEnumerator se = _set.getEnumerator();
str result = '';
while (se.moveNext())
{
str value = se.current();
if (!value)
{
continue;
}
result = result ? strFmt('%1%2%3', result, _separator, value) : value;
}
return result;
}
I am having many issues with the DDP generation part, as they are taking too long to be generated. Do you have any tips to improve this development?
In the end, the idea is that for each line, the system calculates the TaxCode. With that TaxCode, it should retrieve the tax amount for each line, and it should also calculate the taxes applied to each line.