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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow