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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow