acumatica
Obliczanie frachtu
Szukaj…
Wprowadzenie
Acumatica ERP umożliwia zarządzanie ładunkami, aby lepiej kontrolować wszelkie dodatkowe koszty i przychody z transakcji sprzedaży. Kwota frachtu, którą obciążysz swoich klientów, może obejmować nie tylko fracht, który Twoja firma obciąża przewoźników, ale także koszty ubezpieczenia, przeładunku i pakowania określone przez warunki wysyłki i fracht premium.
Zastępowanie kwoty frachtu w przesyłce i fakturze
Po wyjęciu z pudełka Acumatica umożliwia tworzenie i utrzymywanie listy warunków wysyłki w systemie. Warunki wysyłki służą do określenia kosztów wysyłki, pakowania i obsługi, w zależności od kwoty wysyłki.
W tym przykładzie pokażę, jak obliczyć kwotę frachtu dla przesyłki na podstawie kwoty zamówienia sprzedaży, co pozwoliłoby użytkownikom na tworzenie wielu przesyłek na zamówienie sprzedaży z takimi samymi warunkami wysyłki automatycznie stosowanymi do wszystkich przesyłek.
FreightCalculator
Klasa FreightCalculator
jest odpowiedzialna za obliczanie kosztów frachtu i warunków frachtu. Na potrzeby tego przykładu nasze zainteresowanie będzie dotyczyło wyłącznie metody 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);
}
...
}
Zarówno ekrany Zamówienia sprzedaży, jak i Przesyłki używają klasy FreightCalculator
do obliczania kwoty frachtu na podstawie odpowiednio zamówienia sprzedaży i kwoty wysyłki:
Zlecenia sprzedaży
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);
...
}
...
}
Przesyłki
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);
...
}
...
}
Zastępowanie kwoty frachtu
Aby dostosować sposób, w jaki Acumatica oblicza kwotę frachtu na ekranie Przesyłki , zadeklaruję klasę FreightCalculatorCst
odziedziczoną po FreightCalculator
i GetFreightTerms
metodę GetFreightTerms
:
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);
}
}
Następnie zaimplementuję rozszerzenie dla SOShipmentEntry
BLC i SOShipmentEntry
metodę CreateFreightCalculator
, aby zastąpić FreightCalculator
moją niestandardową klasą FreightCalculatorCst
na ekranie Przesyłki :
public class SOShipmentEntryExt : PXGraphExtension<SOShipmentEntry>
{
[PXOverride]
public FreightCalculator CreateFreightCalculator()
{
return new FreightCalculatorCst(Base);
}
}
Zrozumienie implementacji klasy FreightCalculatorCst w powyższym przykładzie
W przesłoniętej metodzie GetFreightTerms
kwoty z zamówienia sprzedaży zamiast kwoty wysyłki, aby wywołać podstawową metodę GetFreightTerms
i otrzymać warunki wysyłki:
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;
}
Oczywiście kwoty zamówienia sprzedaży można użyć tylko do obliczenia kwoty frachtu dla przesyłek, które spełniają tylko 1 zamówienie. Jeśli jedna przesyłka zrealizuje kilka zamówień, będziemy musieli śledzić zachowanie produktu podstawowego i obliczyć kwotę frachtu na podstawie kwoty przesyłki. Aby sprawdzić liczbę realizacji zamówień, SelectWindowed
metody OrderList
widoku danych OrderList
i poprosiłem o pierwsze 2 zamówienia zrealizowane przez bieżącą wysyłkę. Mogłem poprosić o wszystkie zamówienia zrealizowane przez przesyłkę, ale wykonanie i powrót do wielu rekordów zajęłoby znacznie więcej czasu, niż było to konieczne, aby sprawdzić, czy zamiast kwoty wysyłki do obliczenia frachtu można użyć kwoty zamówienia sprzedaży.