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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow