Recherche…


Introduction

Acumatica ERP vous permet de gérer le fret pour mieux contrôler les coûts et revenus supplémentaires sur les transactions de vente. Le montant du fret que vous facturez à vos clients peut inclure non seulement le fret que votre entreprise est facturé par les transporteurs, mais également les frais d’assurance, de manutention et d’emballage définis par vos conditions d’expédition et de fret premium.

Remplacement du montant du fret dans les envois et les factures

Acumatica prêt à l'emploi permet de créer et de maintenir la liste des conditions de livraison dans le système. Les conditions d'expédition sont utilisées pour définir les frais d'expédition, d'emballage et de manutention, en fonction du montant de l'envoi.

Dans cet exemple, je montrerai comment calculer le montant du fret pour un envoi en fonction du montant de la commande client, ce qui permettrait aux utilisateurs de créer plusieurs envois par commande, les mêmes conditions de livraison étant automatiquement appliquées à tous les envois.

FreightCalculator

La classe FreightCalculator est responsable du calcul des coûts de fret et des conditions de fret. Aux fins de cet exemple, notre intérêt ne portera que sur la méthode 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);
    }

    ...
}

Les deux ordres de vente et les écrans Expéditions utilisent FreightCalculator classe pour calculer le montant de fret sur la base de l' ordre de vente et le montant de l' expédition respectivement:

Commandes

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);

        ...
    }

    ...
}

Les envois

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);

        ...
    }

    ...
}

Montant du fret prioritaire

Pour personnaliser la façon dont Acumatica calcule le montant du fret sur l'écran Envois , je déclare la classe FreightCalculatorCst héritée de FreightCalculator et remplace la méthode 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);
    }
}

Après cela, SOShipmentEntry une extension pour le BLC SOShipmentEntry et substituerai la méthode CreateFreightCalculator pour remplacer FreightCalculator par ma classe FreightCalculatorCst personnalisée sur l'écran Envois :

public class SOShipmentEntryExt : PXGraphExtension<SOShipmentEntry>
{
    [PXOverride]
    public FreightCalculator CreateFreightCalculator()
    {
        return new FreightCalculatorCst(Base);
    }
}

Comprendre l'implémentation de la classe FreightCalculatorCst dans l'exemple ci-dessus

Dans la méthode GetFreightTerms remplacée, j'utiliserai le montant de la commande GetFreightTerms au lieu du montant de l'envoi pour appeler la méthode GetFreightTerms base et recevoir les conditions d'expédition:

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;
}

De toute évidence, il est uniquement possible d'utiliser le montant de la commande client pour calculer le montant du fret pour les envois qui ne remplissent qu'une seule commande. Si un envoi remplit plusieurs commandes, nous devons suivre le comportement du produit de base et calculer le montant du fret en fonction du montant de l'envoi. Pour vérifier le nombre de commandes expédition remplit, je SelectWindowed méthode sur la OrderList vue des données et demandé 2 premières commandes effectuées par l'envoi en cours. J'aurais pu demander toutes les commandes remplies par l'envoi, mais cela prendrait beaucoup plus de temps pour exécuter et retourner à de nombreux enregistrements que nécessaire pour vérifier si le montant de la commande client peut être utilisé pour calculer le fret.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow