get invoice id on return SO d365fo x++

 get invoice id on return SO d365fo x++

Code:

[ExtensionOf(classStr(SalesCopying))]
final class SalesCopying_Class_Extension
{

    protected void copyLine(SalesLine _salesLine, SalesLineCopyFromSource _salesLineCopyFromSource)
    {
        next copyLine(_salesLine, _salesLineCopyFromSource);

        
            TmpFrmVirtual sourceline = _salesLineCopyFromSource.parmTmpFrmVirtualLine();
            if (sourceline.TableNum == tableNum(CustInvoiceTrans) && _salesLine)
            {
                CustInvoiceTrans CustInvoiceTrans = CustInvoiceTrans::findRecId(sourceline.RecordNo);
                ttsbegin;
                _salesLine.selectForUpdate(true);
                _salesLine.DSAInvoiceId = CustInvoiceTrans.InvoiceId;
                _salesLine.update();
                ttscommit;
            }
        

    }

}
[ExtensionOf(formStr(SalesCopying))]
final class SalesCopying_Form_Extension
{
    void writeTmpFrmVirtual(
        TmpFrmVirtual _tmpFrmVirtual,
        TableId _tableId,
        RecId _recId,
        Num _id,
        LineNum _lineNum,
        TransDate _transDate,
        Qty _qty,
        PdsCWInventQty _pdsCWQty)
    {
        if (_tableId == tablenum(CustInvoiceTrans))
        {
            CustInvoiceTrans CustInvoiceTrans = CustInvoiceTrans::findRecId(_recId);
            _tmpFrmVirtual.DSAInvoiceId = CustInvoiceTrans.InvoiceId;
        }
        
        next writeTmpFrmVirtual(_tmpFrmVirtual, _tableId, _recId, _id, _lineNum, _transDate, _qty, _pdsCWQty);
    }

}
[ExtensionOf(tableStr(SalesLine))]
final class SalesLine_DSAqeesa_Table_Extension
{

    public boolean  validateWrite(boolean _skipCreditLimitCheck)
    {
        boolean         ok = true;
        DSA_FinancialDimensionsMandatory    finDimMandatory;
        Defaultdimensionview                dimensionViewtoCheck;
        DSADimensionSetup                   DimensionSetup;

        ok = next validateWrite(_skipCreditLimitCheck);

        //MA comment
        //If record exsit and defined FinDim are not set
        if(DSProposedCustomizations::isValid(DSProposedCustomization::MandatoryFinDim))
        {
            //if (this.RecId)
            //{
                //Commented by JS, 2024/09/18, Due to Change solution
                //while select * from finDimMandatory
                //{
                //    Name dimName;

                //    dimName = finDimMandatory.DimensionAttributeName;

                //    select * from dimensionViewtoCheck
                //    where dimensionViewtoCheck.DefaultDimension == this.DefaultDimension
                //        && dimensionViewtoCheck.Name == dimName;

                //    if(!dimensionViewtoCheck)
                //    {
                //        ok = checkFailed(strFmt("@DSALabel:DSA000265", dimName));
                //    }
                //}

                //Code by JS, 2024/09/18, Mandatory financial Dimension

                if(this.RecId)
                {
                    while
                    select  DimensionSetup
                    where DimensionSetup.SalesOrder == NoYes::Yes
                    notexists join dimensionViewtoCheck
                    where dimensionViewtoCheck.DefaultDimension == this.DefaultDimension
                    && dimensionViewtoCheck.Name == DimensionSetup.Name
                    {
                        checkFailed(strFmt("@DSALabel:DSA000265", DimensionSetup.Name));
                        ok = false;
                    }
                }
                
            //}
        }
        return ok;
    }

    public display real lineCostAmount()
    {
        return this.calcCostAmount(this.QtyOrdered); 
    }

    public display real lineCostAmount2()
    {
        return (this.CostPrice * this.QtyOrdered);
    }

    public display DSAAllocationStatus getAllocationStatus()
    {
        DSAAllocationStatus allocationStatus;
        SalesQty allocatedQty = this.movementReservPhysicalUnit();

        if (this.SalesStatus == SalesStatus::Invoiced || this.SalesStatus == SalesStatus::Delivered || allocatedQty == this.SalesQty)
        {
            allocationStatus = DSAAllocationStatus::Allocated;
        }
        else if (allocatedQty > 0 && allocatedQty < this.SalesQty)
        {
            allocationStatus = DSAAllocationStatus::PartiallyAllocated;
        }
        else
        {
            allocationStatus = DSAAllocationStatus::NotAllocated;
        }

        return allocationStatus;
    }

    /*public display real lineCostPrice()
    {
        return this.calculateCostPrice(this.InventDimId);     
    }*/

    public display real  movementReservPhysicalUnit()
    {
        DSAInventTransView inventTransView;
        real qty;
        InventTableModule inventTableModule;
        SalesLine salesLine;
        //InventQtyReservPhysical  totalReservedPhysicalQty ;
        //if(this.SalesQty)
        //{
        //    select * from inventTransView where inventTransView.ReferenceId == this.SalesId
        //        && inventTransView.ItemId == this.ItemId
        //        && inventTransView.InventTransId == this.InventTransId
        //        && inventTransView.StatusIssue == StatusIssue::ReservPhysical;

        //    select * from inventTableModule where inventTableModule.ItemId == this.ItemId;


        //    UnitOfMeasureConverter_Product unitConverter  = UnitOfMeasureConverter_Product::construct();
        //    unitConverter.parmProduct(InventTable::find(this.ItemId,true).Product);
        //    unitConverter.parmFromUnitOfMeasure(UnitOfMeasure::unitOfMeasureIdBySymbol(this.SalesUnit));
        //    unitConverter.parmToUnitOfMeasure(UnitOfMeasure::unitOfMeasureIdBySymbol(inventTableModule.UnitId));
        //    unitConverter.parmRoundAbsoluteValue(NoYes::Yes);
        //    unitConverter.parmApplyRounding(NoYes::Yes);

        //    if (unitConverter.convertValue(1) != 0)
        //    {
        //        qty = abs((inventTransView.Qty) / (unitConverter.convertValue(1)));
        //    }
        //    else
        //    {
        //        //qty = abs(inventTransView.Qty);
        //        qty = 0;
        //    }
        //}
        qty = this.reservedPhysical();


        return qty;
    }

    public display real  ShortagePhysicalUnit()
    {
        //real qty;
        //CustPackingSlipTrans custPackingSlipTrans;
        /* // Rakay Shahid -4th October, 2023 - Implementing new solution for shortage qty
        DSAInventTransView inventTransView;
        InventTableModule inventTableModule;
        SalesLine salesLine;
        //InventQtyReservPhysical  totalReservedPhysicalQty ;
        if(this.SalesQty)
        {
            select * from inventTransView where inventTransView.ReferenceId == this.SalesId
                && inventTransView.ItemId == this.ItemId
                && inventTransView.InventTransId == this.InventTransId
                && inventTransView.StatusIssue == StatusIssue::ReservPhysical;

            select * from inventTableModule where inventTableModule.ItemId == this.ItemId;

            UnitOfMeasureConverter_Product unitConverter  = UnitOfMeasureConverter_Product::construct();
            unitConverter.parmProduct(InventTable::find(this.ItemId,true).Product);
            unitConverter.parmFromUnitOfMeasure(UnitOfMeasure::unitOfMeasureIdBySymbol(this.SalesUnit));
            unitConverter.parmToUnitOfMeasure(UnitOfMeasure::unitOfMeasureIdBySymbol(inventTableModule.UnitId));
            unitConverter.parmRoundAbsoluteValue(NoYes::Yes);
            unitConverter.parmApplyRounding(NoYes::Yes);
            // info(strFmt("%1",unitConverter.convertValue(1)));
            qty =  (this.SalesQty) - ((abs(inventTransView.Qty)) / (unitConverter.convertValue(1)));
        }
        */

        //select sum(Qty) from custPackingSlipTrans
        //    where custPackingSlipTrans.InventTransId == this.InventTransId;

        //if (custPackingSlipTrans.Qty)
        //{
        //    qty = this.SalesQty - (this.reservedOnOrder() + this.reservedPhysical() + custPackingSlipTrans.Qty);
        //}
        //else
        //{
        //    qty = this.SalesQty - (this.reservedOnOrder() + this.reservedPhysical());
        //}

        InventTransOrigin           InventTransOrigin;
        InventTrans                 InventTrans;
        InventDim                   InventDim;

        SELECT  InventTransOrigin
        where  InventTransOrigin.InventTransId == this.InventTransId
        && InventTransOrigin.ReferenceId == this.SalesId 
        && InventTransOrigin.ReferenceCategory == InventTransType::Sales

        JOIN sum(Qty)
        from InventTrans
        where InventTransOrigin.RecId == InventTrans.InventTransOrigin
        && InventTrans.StatusIssue == StatusIssue::OnOrder;

        return abs(InventTrans.Qty);
    }

    public void modifiedField(FieldId _fieldId)
    {
        next modifiedField(_fieldId);
        switch(_fieldId)
        {
            case fieldNum(SalesLine, ItemId):
            {
                if(this.ItemId)
                {
                    this.DSAItemUnitCost = this.DSAItemUnitCost();
                }
                break;
            }
            case fieldNum(SalesLine, SalesUnit):
            {
                this.DSAItemUnitCost = this.DSAItemUnitCost();
                break;
            }
        }
    }

    private Amount DSAItemUnitCost()
    {
        InventSum           InventSum           = InventSum::find(this.ItemId, this.InventDimId);
        UnitOfMeasureSymbol UnitOfMeasureSymbol = InventSum.inventUnitId(InventSum);
        Amount              Amount              = this.mcrCalcMarginAlert();

        if(UnitOfMeasureSymbol != this.SalesUnit)
        {
            real ConvertedQty = this.convertQty(1, this.SalesUnit, UnitOfMeasureSymbol, this.ItemId);
            Amount  = Amount * ConvertedQty;
        }

        return Amount;
    }

    public  Real convertQty(Qty _qty, UnitOfMeasureSymbol _fromUnitId,UnitOfMeasureSymbol _ToUnitId, ItemId _itemId)
    {
        Real   Qty;
        try
        {
            Qty = UnitOfMeasureConverter::convert(_qty, UnitOfMeasure::unitOfMeasureIdBySymbol(_fromUnitId), UnitOfMeasure::unitOfMeasureIdBySymbol(_ToUnitId),NoYes::No,InventTable::itemProduct(_itemId),NoYes::No);
        }
        catch
        {
            Qty = 0;
        }
 
        return Qty;
    }

    private mcrMarginSalesParms getMarginSalesParms(InventDimId _inventDimId)
    {
        MCRMarginSalesParms     mcrMarginSalesParms;
        container               mcrMarginCalcMapKey;
        SalesLine               salesLineMargin;
        
        Map                     mcrMarginCalcMap;
        mcrMarginCalcMap = new Map(Types::Container, Types::Class);

        mcrMarginCalcMapKey = [this.ItemId, _inventDimId, this.CustAccount, this.SalesQty, DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone())];
        if (mcrMarginCalcMap.exists(mcrMarginCalcMapKey))
        {
            mcrMarginSalesParms = mcrMarginCalcMap.lookup(mcrMarginCalcMapKey);
        }
        else
        {
            salesLineMargin = this.createMarginSalesLineBuffer(_inventDimId);

            // Calculate margin
            mcrMarginSalesParms = MCRMarginAlert_Simulation::calcMarginServer(salesLineMargin, DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone()));
            mcrMarginCalcMap.insert(mcrMarginCalcMapKey, mcrMarginSalesParms);
        }

        return mcrMarginSalesParms;
    }

    CostPrice mcrCalcMarginAlert()
    {
        InventDim               _inventDim = this.inventDim();
        InventDimId             inventDimId;
        MCRMarginSalesParms     mcrMarginSalesParms;
        SalesPrice              unitSalesPrice;
        CostPrice               mcrCostPrice;

        if (SalesParameters::find().MCREnableMarginAlert)
        {
            mcrMarginSalesParms = this.getMarginSalesParms(_inventDim.inventDimId);
            mcrCostPrice    = mcrMarginSalesParms.parmCostPrice();
        }
        return mcrCostPrice;
    }

    private SalesLine createMarginSalesLineBuffer(InventDimId _inventDimId)
    {
        SalesLine salesLineMargin;
        CustTable selectedCustTable = CustTable::find(this.CustAccount);

        // Fill a sales line buffer from datasources and trade agreement search
        // From item
        salesLineMargin.ItemId          = this.ItemId;
        salesLineMargin.InventDimId     = _inventDimId;
        salesLineMargin.QtyOrdered      = this.SalesQty;
        salesLineMargin.SalesQty        = this.SalesQty;
        salesLineMargin.SalesUnit       = this.SalesUnit;
        salesLineMargin.ShippingDateRequested = DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());

        // From customer
        salesLineMargin.CurrencyCode    = selectedCustTable.Currency;
        salesLineMargin.CustAccount     = selectedCustTable.AccountNum;

        // Pricing fields
        salesLineMargin.LineAmount      = this.LineAmount;
        salesLineMargin.LineDisc        = this.LineDisc;
        salesLineMargin.LinePercent     = this.LinePercent;
        salesLineMargin.PriceUnit       = this.PriceUnit;
        salesLineMargin.SalesMarkup     = this.SalesMarkup;
        salesLineMargin.SalesPrice      = this.SalesPrice;

        return salesLineMargin;
    }

    /// <summary>
    /// Initializes a <c>SalesLine</c> record from a <c>SalesCreateReleaseOrderLineTmp</c> record.
    /// </summary>
    /// <param name="_salesCreateReleaseOrderLineTmp">
    /// The <c>SalesCreateReleaseOrderLineTmp</c> record from which to initialize the <c>SalesLine</c>
    /// record.
    /// </param>
    public void initFromSalesCreateReleaseOrderLineTmp(SalesCreateReleaseOrderLineTmp _salesCreateReleaseOrderLineTmp)
    {
        next initFromSalesCreateReleaseOrderLineTmp(_salesCreateReleaseOrderLineTmp);

        this.DSAItemUnitCost = _salesCreateReleaseOrderLineTmp.DSAItemUnitCost;
    }

    public display String50 configId()
    {
        return this.inventDim().configId;
    }

    public display String50 styleId()
    {
        return this.inventDim().InventStyleId;
    }

    static void modifyExpectedRetQty(SalesLine    _salesLine,
                                     InventDim    _inventDim,
                                     boolean      _resetPrice)
    {
        _resetPrice = false;
        next modifyExpectedRetQty(_salesLine, _inventDim, _resetPrice);
    }

    protected void initFromTmpFrmVirtual(
        SalesTable              _salesTable,
        TmpFrmVirtual           _tmpFrmVirtual,
        ModuleInventPurchSales  _moduleInventPurchSales)
    {
        this.DSAInvoiceId = _tmpFrmVirtual.DSAInvoiceId;

        next initFromTmpFrmVirtual(_salesTable, _tmpFrmVirtual,  _moduleInventPurchSales);

    }

}

Comments