acumatica
Calcolo del trasporto
Ricerca…
introduzione
Acumatica ERP consente di gestire le merci per controllare meglio eventuali costi e ricavi aggiuntivi sulle transazioni di vendita. L'importo del trasporto che addebiti ai tuoi clienti potrebbe includere non solo le spese di spedizione della tua azienda da parte dei vettori, ma anche le spese di assicurazione, gestione e imballaggio definite dai termini di spedizione e di trasporto premium.
Sovraccarico importo del trasporto in spedizione e fattura
Fuori dagli schemi Acumatica consente di creare e gestire l'elenco dei termini di spedizione nel sistema. I termini di spedizione vengono utilizzati per definire i costi di spedizione, imballaggio e gestione, a seconda dell'importo della spedizione.
In questo esempio mostrerò come calcolare l'importo del trasporto per una spedizione in base all'ammontare dell'ordine di vendita, il che consentirebbe agli utenti di creare più spedizioni per ordine di vendita con gli stessi termini di spedizione applicati automaticamente a tutte le spedizioni.
CalcoloSpedizioni
La classe FreightCalculator
è responsabile del calcolo dei costi di trasporto e dei termini di trasporto. Ai fini di questo esempio, il nostro interesse sarà solo attorno al metodo 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);
}
...
}
Sia le schermate Ordini di vendita che Spedizioni utilizzano la classe FreightCalculator
per calcolare l'importo del trasporto in base rispettivamente all'ordine di vendita e all'importo della spedizione:
Ordini di vendita
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);
...
}
...
}
Spedizioni
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);
...
}
...
}
Importo di trasporto prevalente
Per personalizzare il modo in cui Acumatica calcola la quantità di merci nella schermata Spedizioni dichiarerò la classe FreightCalculatorCst
ereditata da FreightCalculator
e sovrascrivo il metodo 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);
}
}
Successivamente, implementerò un'estensione per SOShipmentEntry
BLC e sostituirò il metodo CreateFreightCalculator
per sostituire FreightCalculator
con la mia classe FreightCalculatorCst
personalizzata nella schermata Spedizioni :
public class SOShipmentEntryExt : PXGraphExtension<SOShipmentEntry>
{
[PXOverride]
public FreightCalculator CreateFreightCalculator()
{
return new FreightCalculatorCst(Base);
}
}
Comprensione dell'implementazione della classe FreightCalculatorCst nell'esempio sopra
Nel metodo GetFreightTerms
override GetFreightTerms
importo dell'ordine di vendita anziché l'importo della spedizione per richiamare il metodo GetFreightTerms
base e ricevere i termini di spedizione:
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;
}
Ovviamente, è possibile utilizzare l'importo dell'ordine di vendita solo per calcolare l'importo del trasporto per le spedizioni, che soddisfano solo 1 ordine. Se una spedizione soddisfa diversi ordini, dovremmo seguire il comportamento del prodotto di base e calcolare l'importo del trasporto in base all'importo della spedizione. Per controllare il numero di ordini di spedizione soddisfa, ho usato SelectWindowed
metodo sul OrderList
visualizzazione dei dati e chiesto prime 2 ordini soddisfatte dalla spedizione corrente. Avrei potuto richiedere tutti gli ordini eseguiti dalla spedizione, ma ciò richiederebbe molto più tempo per eseguire e restituire molti record del necessario per verificare se è possibile utilizzare l'importo dell'ordine di vendita anziché l'importo della spedizione per calcolare il trasporto.