acumatica
Frachtberechnung
Suche…
Einführung
Mit Acumatica ERP können Sie die Fracht verwalten, um zusätzliche Kosten und Einnahmen aus Verkaufstransaktionen besser zu kontrollieren. Der Frachtbetrag, den Sie Ihren Kunden in Rechnung stellen, umfasst möglicherweise nicht nur die Fracht, die Ihr Unternehmen von den Spediteuren berechnet, sondern auch die durch Ihre Versandbedingungen und Prämienfracht bestimmten Versicherungs-, Bearbeitungs- und Verpackungsgebühren.
Überschreibung des Frachtbetrags in Versand und Rechnung
Acumatica ermöglicht das Erstellen und Verwalten der Liste der Versandbedingungen im System. Versandbedingungen werden verwendet, um die Versand-, Verpackungs- und Bearbeitungskosten in Abhängigkeit von der Versandmenge festzulegen.
In diesem Beispiel werde ich zeigen, wie der Frachtbetrag für eine Sendung anhand des Verkaufsauftragsbetrags berechnet wird. Dadurch können Benutzer mehrere Sendungen pro Verkaufsauftrag erstellen, wobei dieselben Versandbedingungen automatisch für alle Sendungen gelten.
FreightCalculator
Die FreightCalculator
Klasse ist für die Berechnung der Frachtkosten und Frachtbedingungen verantwortlich. In diesem Beispiel liegt unser Interesse nur in der GetFreightTerms
Methode:
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);
}
...
}
Sowohl die Kundenaufträge und die Sendungen Bildschirme nutzen FreightCalculator
Klasse Frachtmenge zu berechnen , basierend auf Kundenauftrag des und Versand der Betrag jeweils:
Verkaufsaufträge
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);
...
}
...
}
Sendungen
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);
...
}
...
}
Frachtbetrag überschreiben
Um anzupassen , wie Acumatica Frachtbetrag berechnet auf die Sendungen Bildschirm werde ich erklären FreightCalculatorCst
Klasse geerbt von FreightCalculator
und außer Kraft setzen GetFreightTerms
Methode:
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);
}
}
Danach werde ich eine Verlängerung für die Umsetzung SOShipmentEntry
BLC und außer Kraft setzen CreateFreightCalculator
Methode zu ersetzen FreightCalculator
mit meiner benutzerdefinierten FreightCalculatorCst
Klasse auf dem Bildschirm Sendungen:
public class SOShipmentEntryExt : PXGraphExtension<SOShipmentEntry>
{
[PXOverride]
public FreightCalculator CreateFreightCalculator()
{
return new FreightCalculatorCst(Base);
}
}
Informationen zur Implementierung der FreightCalculatorCst-Klasse im obigen Beispiel
In der überschriebenen Methode GetFreightTerms
werde ich den Betrag aus dem Verkaufsauftrag anstelle des GetFreightTerms
Methode GetFreightTerms
aufzurufen und die Versandbedingungen zu erhalten:
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;
}
Offensichtlich kann der Kundenauftragsbetrag nur zur Berechnung des Frachtbetrags für Sendungen verwendet werden, die nur eine Bestellung erfüllen. Wenn eine Sendung mehrere Bestellungen erfüllt, müssen wir das Verhalten des Basisprodukts verfolgen und den Frachtbetrag basierend auf dem Versandbetrag berechnen. Um die Anzahl der Bestellungen zu prüfen, die die Lieferung erfüllt, habe ich die SelectWindowed
Methode in der OrderList
verwendet und die ersten 2 Bestellungen angefordert, die von der aktuellen Lieferung erfüllt wurden. Ich hätte alle Bestellungen anfordern können, die von der Sendung erfüllt wurden. Dies würde jedoch erheblich mehr Zeit in Anspruch nehmen und zu vielen Datensätzen zurückkehren als erforderlich, um zu überprüfen, ob der Auftragsbetrag anstelle des Sendebetrags zur Berechnung der Fracht verwendet werden kann.