acumatica
Calcul du fret
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.