acumatica
Vracht berekening
Zoeken…
Invoering
Met Acumatica ERP kunt u vracht beheren om eventuele extra kosten en opbrengsten op verkooptransacties beter te beheersen. Het vrachtbedrag dat u uw klanten in rekening brengt, kan niet alleen de vracht zijn die uw bedrijf in rekening wordt gebracht door vervoerders, maar ook verzekerings-, behandelings- en verpakkingskosten die worden bepaald door uw verzendvoorwaarden en premium vracht.
Vrachtbedrag in zending en factuur overschrijven
Standaard biedt Acumatica de mogelijkheid om de lijst met verzendvoorwaarden in het systeem te maken en bij te houden. Verzendvoorwaarden worden gebruikt om de verzend-, verpakkings- en behandelingskosten te definiëren, afhankelijk van het verzendbedrag.
In dit voorbeeld laat ik zien hoe het vrachtbedrag voor een zending wordt berekend op basis van het verkooporderbedrag, waarmee gebruikers meerdere zendingen per verkooporder kunnen maken met dezelfde verzendvoorwaarden die automatisch op alle zendingen worden toegepast.
FreightCalculator
De klasse FreightCalculator
is verantwoordelijk voor de berekening van FreightCalculator
. Voor dit voorbeeld zal onze interesse alleen liggen bij de methode GetFreightTerms
:
public class FreightCalculator
{
...
protected virtual ShipTermsDetail GetFreightTerms(string shipTermsID, decimal? lineTotal)
{
return PXSelect<ShipTermsDetail,
Where<ShipTermsDetail.shipTermsID, Equal<Required<SOOrder.shipTermsID>>,
And<ShipTermsDetail.breakAmount, LessEqual<Required<SOOrder.lineTotal>>>>,
OrderBy<Desc<ShipTermsDetail.breakAmount>>>.Select(graph, shipTermsID, lineTotal);
}
...
}
Zowel de schermen Verkooporders als Verzendingen gebruiken de klasse FreightCalculator
om het FreightCalculator
te berekenen op basis van respectievelijk het verkooporder- en het verzendingsbedrag:
Verkooporders
public class SOOrderEntry : PXGraph<SOOrderEntry, SOOrder>, PXImportAttribute.IPXPrepareItems
{
...
public virtual FreightCalculator CreateFreightCalculator()
{
return new FreightCalculator(this);
}
...
protected virtual void SOOrder_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
...
PXResultset<SOLine> res = Transactions.Select();
FreightCalculator fc = CreateFreightCalculator();
fc.CalcFreight<SOOrder, SOOrder.curyFreightCost, SOOrder.curyFreightAmt>(sender, (SOOrder)e.Row, res.Count);
...
}
...
}
zendingen
public class SOShipmentEntry : PXGraph<SOShipmentEntry, SOShipment>
{
...
protected virtual FreightCalculator CreateFreightCalculator()
{
return new FreightCalculator(this);
}
...
protected virtual void SOShipment_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
...
PXResultset<SOShipLine> res = Transactions.Select();
...
FreightCalculator fc = CreateFreightCalculator();
fc.CalcFreight<SOShipment, SOShipment.curyFreightCost, SOShipment.curyFreightAmt>(sender, (SOShipment)e.Row, res.Count);
...
}
...
}
Hoger vrachtbedrag
Om aan te passen hoe Acumatica het vrachtbedrag op het scherm Verzendingen berekent, zal ik de FreightCalculatorCst
klasse geërfd van FreightCalculator
en de GetFreightTerms
methode overschrijven:
public class FreightCalculatorCst : FreightCalculator
{
public FreightCalculatorCst(PXGraph graph)
: base(graph)
{
}
protected override ShipTermsDetail GetFreightTerms(string shipTermsID, decimal? lineTotal)
{
if (graph is SOShipmentEntry)
{
var shipmentEntry = graph as SOShipmentEntry;
int orderCount = 0;
decimal? lineTotalTemp = null;
foreach (PXResult<SOOrderShipment, SOOrder, CurrencyInfo, SOAddress, SOContact, SOOrderType> orderRec in
shipmentEntry.OrderList.SelectWindowed(0, 2))
{
orderCount++;
SOOrder order = (SOOrder)orderRec;
if (orderCount == 1)
lineTotalTemp = order.LineTotal;
else
break;
}
if (orderCount == 1)
{
lineTotal = lineTotalTemp;
}
}
return base.GetFreightTerms(shipTermsID, lineTotal);
}
}
Daarna zal ik een uitbreiding voor het implementeren SOShipmentEntry
BLC en override CreateFreightCalculator
methode te vervangen FreightCalculator
met mijn aangepaste FreightCalculatorCst
klas op het scherm Zendingen:
public class SOShipmentEntryExt : PXGraphExtension<SOShipmentEntry>
{
[PXOverride]
public FreightCalculator CreateFreightCalculator()
{
return new FreightCalculatorCst(Base);
}
}
Inzicht in de implementatie van de klasse FreightCalculatorCst in het bovenstaande voorbeeld
In de overschreven GetFreightTerms
methode gebruik ik het bedrag van de verkooporder in plaats van het GetFreightTerms
om de basis GetFreightTerms
methode op te roepen en verzendvoorwaarden te ontvangen:
foreach (PXResult<SOOrderShipment, SOOrder, CurrencyInfo, SOAddress, SOContact, SOOrderType> orderRec in
shipmentEntry.OrderList.SelectWindowed(0, 2))
{
orderCount++;
SOOrder order = (SOOrder)orderRec;
if (orderCount == 1)
lineTotalTemp = order.LineTotal;
else
break;
}
if (orderCount == 1)
{
lineTotal = lineTotalTemp;
}
Het is duidelijk dat het alleen mogelijk is om het verkooporderbedrag te gebruiken om het vrachtbedrag te berekenen voor zendingen die slechts 1 order vervullen. Als een zending meerdere bestellingen vervult, moeten we het basisproductgedrag volgen en het vrachtbedrag berekenen op basis van het verzendbedrag. Om het aantal bestellingen te controleren dat ik heb verzonden, gebruikte ik de SelectWindowed
methode in de gegevensweergave OrderList
en vroeg ik om de eerste 2 bestellingen die door de huidige verzending waren uitgevoerd. Ik had alle bestellingen kunnen aanvragen die door de zending zijn uitgevoerd, maar dit zou aanzienlijk meer tijd kosten om uit te voeren en naar veel records terug te sturen dan nodig was om te controleren of het verkooporderbedrag kan worden gebruikt in plaats van het verzendbedrag om de vracht te berekenen.