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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow