acumatica
운임 계산
수색…
소개
Acumatica ERP를 사용하면화물을 관리하여 판매 거래에 대한 추가 비용과 수익을 효과적으로 통제 할 수 있습니다. 고객에게 청구하는 운임에는 운송인이 회사에 청구하는 운임뿐만 아니라 선적 조건과 보험료로 정의 된 보험, 취급 및 포장 비용이 포함될 수 있습니다.
선적 및 송장에서의화물 금액 무시
Out of the box Acumatica는 시스템의 운송 조건 목록을 작성하고 유지 관리합니다. 운송 조건은 운송량에 따라 운송, 포장 및 취급 비용을 정의하는 데 사용됩니다.
이 예에서는 판매 주문 금액을 기준으로 발송물의 운임을 계산하는 방법을 보여줍니다. 그러면 사용자는 모든 발송물에 동일한 배송 조건이 자동으로 적용되는 판매 주문 당 여러 발송물을 만들 수 있습니다.
FreightCalculator
FreightCalculator
클래스는 운임 및 운임 조건을 계산합니다. 이 예제의 목적을 위해 GetFreightTerms
메서드에 대해서만 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);
}
...
}
판매 주문 및 배송 화면 모두 FreightCalculator
클래스를 사용하여 판매 주문 및 출하 금액을 기준으로 운임 금액을 계산합니다.
판매 주문
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);
...
}
...
}
발송물
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);
...
}
...
}
화물 금액 무시
중인 발송 내가 선언합니다 화면에 Acumatica은화물의 양을 계산하는 방법을 사용자 정의하려면 FreightCalculatorCst
상속 클래스 FreightCalculator
재정의 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);
}
}
그 후 나는에 대한 확장 구현할 SOShipmentEntry
BLC를 재정의 CreateFreightCalculator
대체 방법을 FreightCalculator
내 사용자 정의와 FreightCalculatorCst
중인 발송 화면에서 클래스 :
public class SOShipmentEntryExt : PXGraphExtension<SOShipmentEntry>
{
[PXOverride]
public FreightCalculator CreateFreightCalculator()
{
return new FreightCalculatorCst(Base);
}
}
위 샘플에서 FreightCalculatorCst 클래스의 구현 이해
재정의 된 GetFreightTerms
메소드에서 기본 GetFreightTerms
메소드를 호출하고 운송 조건을 수신하기 위해 선적 금액 대신 판매 주문의 금액을 사용합니다.
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;
}
분명히 판매 주문 금액을 사용하여 출하를위한화물 금액을 계산할 수 있습니다. 이는 1 주문 만 수행합니다. 하나의 선적이 여러 주문을 이행하는 경우 기본 제품 동작을 따르고 선적 금액을 기준으로 운임을 계산해야합니다. 발송 주문 수를 확인하기 위해 OrderList
데이터보기에서 SelectWindowed
메서드를 사용하고 현재 발송물에 의해 수행 된 처음 두 주문을 요청했습니다. 발송물에 의해 수행 된 모든 주문을 요청할 수 있었지만,화물을 계산하기 위해 발송 금액 대신 판매 주문 금액을 사용할 수 있는지 확인하는 데 필요한 것보다 많은 레코드를 실행하고 반환하는 데 훨씬 더 많은 시간이 소요되었습니다.