수색…


소개

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 메서드를 사용하고 현재 발송물에 의해 수행 된 처음 두 주문을 요청했습니다. 발송물에 의해 수행 된 모든 주문을 요청할 수 있었지만,화물을 계산하기 위해 발송 금액 대신 판매 주문 금액을 사용할 수 있는지 확인하는 데 필요한 것보다 많은 레코드를 실행하고 반환하는 데 훨씬 더 많은 시간이 소요되었습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow