/// <summary> /// Calculate End Date based on start date and qty /// </summary> /// <param name="ctx"></param> /// <param name="startDate"></param> /// <param name="C_UOM_ID"></param> /// <param name="qty"></param> /// <returns>end date</returns> public static DateTime?GetEndDate(Ctx ctx, DateTime?startDate, int C_UOM_ID, Decimal?qty) { //GregorianCalendar endDate = new GregorianCalendar(); DateTime?endDate = new DateTime(); //endDate.setTime(startDate); endDate = startDate; int minutes = MUOMConversion.ConvertToMinutes(ctx, C_UOM_ID, qty); //endDate.add(Calendar.MINUTE, minutes); //endDate.AddMinutes((Double)minutes); endDate = endDate.Value.AddMinutes(minutes); //DateTime retValue = new DateTime(endDate.getTimeInMillis()); DateTime?retValue = endDate; //log.config( "TimeUtil.getEndDate", "Start=" + startDate // + ", Qty=" + qty + ", End=" + retValue); return(retValue); }
/// <summary> /// Get Divide Rate FROM product UOM to entered UOM and round. /// </summary> /// <param name="ctx"></param> /// <param name="M_Product_ID"></param> /// <param name="C_UOM_To_ID"></param> /// <returns>divisor or null</returns> public static Decimal?GetProductRateFrom(Ctx ctx, int M_Product_ID, int C_UOM_To_ID) { MUOMConversion[] rates = GetProductConversions(ctx, M_Product_ID); if (rates.Length == 0) { _log.Fine("getProductRateFrom - none found"); return(null); } for (int i = 0; i < rates.Length; i++) { MUOMConversion rate = rates[i]; if (rate.GetC_UOM_To_ID() == C_UOM_To_ID) { return(rate.GetDivideRate()); } } _log.Fine("None applied"); return(null); }
/// <summary> /// Before Save /// </summary> /// <param name="newRecord">new</param> /// <returns>true if can be saved</returns> protected override bool BeforeSave(bool newRecord) { Decimal VA024_ProvisionPrice = 0; MInventory inventory = new MInventory(GetCtx(), GetM_Inventory_ID(), Get_Trx()); MProduct product = MProduct.Get(GetCtx(), GetM_Product_ID()); if (newRecord && _isManualEntry) { // Product requires ASI if (GetM_AttributeSetInstance_ID() == 0) { if (product.GetM_AttributeSet_ID() != 0) { MAttributeSet mas = MAttributeSet.Get(GetCtx(), product.GetM_AttributeSet_ID()); //uncomment by Amit on behalf of Mandeep 7-3-2016 //if (mas.IsInstanceAttribute() // && (mas.IsMandatory() || mas.IsMandatoryAlways())) if (mas.IsMandatory() || mas.IsMandatoryAlways()) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "M_AttributeSetInstance_ID")); return(false); } } } // No ASI } // new or manual // not to create Internal use Inventory with -ve qty -- but during reversal system will create record with -ve qty // duing reversal -- ReversalDoc_ID contain refernce o orignal record id if (IsInternalUse() && Get_ColumnIndex("ReversalDoc_ID") > 0 && GetReversalDoc_ID() == 0 && GetQtyInternalUse() < 0) { log.SaveError("", Msg.GetMsg(GetCtx(), "VIS_CantbeNegative")); return(false); } // Set Line No if (GetLine() == 0) { String sql = "SELECT COALESCE(MAX(Line),0)+10 AS DefaultValue FROM M_InventoryLine WHERE M_Inventory_ID=" + GetM_Inventory_ID(); int ii = DataBase.DB.GetSQLValue(Get_TrxName(), sql); SetLine(ii); } // SI_0644.1 : Enforce UOM Precision - Rounding Quantities if (newRecord || Is_ValueChanged("QtyInternalUse")) { SetQtyInternalUse(GetQtyInternalUse()); } // change to set Converted Quantity in Internal Use Qty and AsonDateQty and difference qty if there is differnce in UOM of Base Product and UOM Selected on line if (newRecord || Is_ValueChanged("QtyEntered") || Is_ValueChanged("C_UOM_ID")) { Decimal?qty = Util.GetValueOfDecimal(Get_Value("QtyEntered")); if (product.GetC_UOM_ID() != Util.GetValueOfInt(Get_Value("C_UOM_ID"))) { qty = MUOMConversion.ConvertProductFrom(GetCtx(), GetM_Product_ID(), Util.GetValueOfInt(Get_Value("C_UOM_ID")), Util.GetValueOfDecimal(Get_Value("QtyEntered"))); if (IsInternalUse()) { SetQtyInternalUse(qty); } else { SetAsOnDateCount(qty); SetDifferenceQty(qty); } } } // SI_0644 - As on date and difference should be according to the precision of UOM attached. if (newRecord || Is_ValueChanged("AsOnDateCount")) { if (product != null) { int precision = product.GetUOMPrecision(); SetAsOnDateCount(Decimal.Round(GetAsOnDateCount(), precision, MidpointRounding.AwayFromZero)); } } // SI_0644 - As on date and difference should be according to the precision of UOM attached. if (newRecord || Is_ValueChanged("DifferenceQty")) { if (product != null) { int precision = product.GetUOMPrecision(); SetDifferenceQty(Decimal.Round(GetDifferenceQty(), precision, MidpointRounding.AwayFromZero)); } } // SI_0682_1 Need to update the reserved qty on requisition line by internal use line save aslo and should work as work in inventory move. if (Env.IsModuleInstalled("DTD001_") && IsInternalUse()) { qtyReserved = Util.GetValueOfDecimal(Get_ValueOld("QtyInternalUse")); } int M_Warehouse_ID = 0; MWarehouse wh = null; string qry = "select m_warehouse_id from m_locator where m_locator_id=" + GetM_Locator_ID(); M_Warehouse_ID = Util.GetValueOfInt(DB.ExecuteScalar(qry, null, Get_TrxName())); wh = MWarehouse.Get(GetCtx(), M_Warehouse_ID); qry = "SELECT QtyOnHand FROM M_Storage where m_locator_id=" + GetM_Locator_ID() + " and m_product_id=" + GetM_Product_ID(); if (GetM_AttributeSetInstance_ID() != 0) { qry += " AND M_AttributeSetInstance_ID=" + GetM_AttributeSetInstance_ID(); } OnHandQty = Convert.ToDecimal(DB.ExecuteScalar(qry, null, Get_TrxName())); // when record is in completed & closed stage - then no need to check qty availablity in warehouse if (wh.IsDisallowNegativeInv() == true && (!(inventory.GetDocStatus() == "CO" || inventory.GetDocStatus() == "CL" || inventory.GetDocStatus() == "RE" || inventory.GetDocStatus() == "VO"))) { #region DisallowNegativeInv = True if (!IsInternalUse() && GetDifferenceQty() > 0) { if ((OnHandQty - GetDifferenceQty()) < 0) { log.SaveError("Info", product.GetName() + ", " + Msg.GetMsg(GetCtx(), "VIS_InsufficientQty") + OnHandQty); return(false); } } else if (IsInternalUse()) { if ((OnHandQty - GetQtyInternalUse()) < 0) { log.SaveError("Info", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "VIS_InsufficientQty") + OnHandQty); return(false); } } #endregion } // Enforce Qty UOM if (newRecord || Is_ValueChanged("QtyCount")) { SetQtyCount(GetQtyCount()); } // InternalUse Inventory if (IsInternalUse() && Env.Signum(GetQtyInternalUse()) == 0) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "QtyInternalUse")); return(false); } if (Env.Signum(GetQtyInternalUse()) != 0) { if (!INVENTORYTYPE_ChargeAccount.Equals(GetInventoryType())) { SetInventoryType(INVENTORYTYPE_ChargeAccount); } // if (GetC_Charge_ID() == 0) { log.SaveError("Error", Msg.GetMsg(GetCtx(), "InternalUseNeedsCharge")); return(false); } } else if (INVENTORYTYPE_ChargeAccount.Equals(GetInventoryType())) { if (GetC_Charge_ID() == 0) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "C_Charge_ID")); return(false); } } else if (GetC_Charge_ID() != 0) { SetC_Charge_ID(0); } // Set AD_Org to parent if not charge if (GetC_Charge_ID() == 0) { SetAD_Org_ID(GetParent().GetAD_Org_ID()); } // By Amit for Obsolete Inventory - 25-May-2016 if (Env.IsModuleInstalled("VA024_")) { //MInventory inventory = new MInventory(GetCtx(), GetM_Inventory_ID(), Get_Trx()); //shipment and Return to vendor if (inventory.IsInternalUse() || (!inventory.IsInternalUse() && (GetQtyBook() - GetQtyCount()) > 0)) { try { string qry1 = @"SELECT SUM(o.VA024_UnitPrice) FROM VA024_t_ObsoleteInventory o WHERE o.IsActive = 'Y' AND o.M_Product_ID = " + GetM_Product_ID() + @" and ( o.M_AttributeSetInstance_ID = " + GetM_AttributeSetInstance_ID() + @" OR o.M_AttributeSetInstance_ID IS NULL )" + " AND o.AD_Org_ID = " + GetAD_Org_ID(); //+" AND M_Warehouse_ID = " + inventory.GetM_Warehouse_ID(); VA024_ProvisionPrice = Util.GetValueOfDecimal(DB.ExecuteScalar(qry1, null, Get_Trx())); if (!inventory.IsInternalUse() && (GetQtyBook() - GetQtyCount()) > 0) { SetVA024_UnitPrice(Util.GetValueOfDecimal(VA024_ProvisionPrice * (GetQtyBook() - GetQtyCount()))); } else { SetVA024_UnitPrice(Util.GetValueOfDecimal(VA024_ProvisionPrice * GetQtyInternalUse())); } if (!inventory.IsInternalUse() && (GetQtyBook() - GetQtyCount()) > 0) { qry1 = @"SELECT (ct.currentcostprice - " + VA024_ProvisionPrice + ") * " + (GetQtyBook() - GetQtyCount()); } else { qry1 = @"SELECT (ct.currentcostprice - " + VA024_ProvisionPrice + ") * " + GetQtyInternalUse(); } qry1 += @" FROM m_product p INNER JOIN va024_t_obsoleteinventory oi ON p.m_product_id = oi.M_product_ID INNER JOIN m_product_category pc ON pc.m_product_category_ID = p.m_product_category_ID INNER JOIN AD_client c ON c.AD_Client_ID = p.Ad_Client_ID INNER JOIN AD_ClientInfo ci ON c.AD_Client_ID = ci.Ad_Client_ID INNER JOIN m_cost ct ON ( p.M_Product_ID = ct.M_Product_ID AND ci.C_AcctSchema1_ID = ct.C_AcctSchema_ID ) INNER JOIN c_acctschema asch ON (asch.C_AcctSchema_ID = ci.C_AcctSchema1_ID) INNER JOIN va024_obsoleteinvline oil ON oil.va024_obsoleteinvline_ID = oi.va024_obsoleteinvline_ID "; qry1 += @" WHERE ct.AD_Org_ID = CASE WHEN ( pc.costinglevel IS NOT NULL AND pc.costinglevel = 'O') THEN " + GetAD_Org_ID() + @" WHEN ( pc.costinglevel IS NOT NULL AND (pc.costinglevel = 'C' OR pc.costinglevel = 'B')) THEN 0 WHEN (pc.costinglevel IS NULL AND asch.costinglevel = 'O') THEN " + GetAD_Org_ID() + @" WHEN ( pc.costinglevel IS NULL AND (asch.costinglevel = 'C' OR asch.costinglevel = 'B')) THEN 0 END AND ct.m_costelement_id = CASE WHEN ( pc.costingmethod IS NOT NULL AND pc.costingmethod != 'C') THEN (SELECT MIN(m_costelement_id) FROM m_costelement WHERE m_costelement.costingmethod =pc.costingmethod AND m_costelement.Ad_Client_ID = oi.ad_client_id ) WHEN ( pc.costingmethod IS NOT NULL AND pc.costingmethod = 'C' ) THEN pc.m_costelement_id WHEN ( pc.costingmethod IS NULL AND asch.costingmethod != 'C') THEN (SELECT MIN(m_costelement_id) FROM m_costelement WHERE m_costelement.costingmethod = asch.costingmethod AND m_costelement.Ad_Client_ID = oi.ad_client_id ) WHEN ( pc.costingmethod IS NULL AND asch.costingmethod = 'C') THEN asch.m_costelement_id END AND NVL(ct.M_Attributesetinstance_ID , 0) = CASE WHEN ( pc.costinglevel IS NOT NULL AND pc.costinglevel = 'B') THEN " + GetM_AttributeSetInstance_ID() + @" WHEN ( pc.costinglevel IS NOT NULL AND (pc.costinglevel = 'C' OR pc.costinglevel = 'O')) THEN 0 WHEN ( pc.costinglevel IS NULL AND asch.costinglevel = 'B') THEN " + GetM_AttributeSetInstance_ID() + @" WHEN ( pc.costinglevel IS NULL AND (asch.costinglevel = 'C' OR asch.costinglevel = 'O')) THEN 0 END AND p.M_Product_ID = " + GetM_Product_ID(); SetVA024_CostPrice(Util.GetValueOfDecimal(DB.ExecuteScalar(qry1, null, Get_Trx()))); } catch { } } } return(true); }
/// <summary> /// Process Confirmation Line. /// - Update InOut Line /// </summary> /// <param name="isSOTrx">sales order</param> /// <param name="confirmType">type</param> /// <returns>success</returns> public Boolean ProcessLine(bool isSOTrx, String confirmType) { MInOutLine line = GetLine(); // Customer if (MInOutConfirm.CONFIRMTYPE_CustomerConfirmation.Equals(confirmType)) { line.SetConfirmedQty(GetConfirmedQty()); } // Drop Ship else if (MInOutConfirm.CONFIRMTYPE_DropShipConfirm.Equals(confirmType)) { } // Pick or QA else if (MInOutConfirm.CONFIRMTYPE_PickQAConfirm.Equals(confirmType)) { line.SetTargetQty(GetTargetQty()); line.SetMovementQty(GetConfirmedQty()); // Entered NOT changed line.SetPickedQty(GetConfirmedQty()); // line.SetScrappedQty(GetScrappedQty()); } // Ship or Receipt else if (MInOutConfirm.CONFIRMTYPE_ShipReceiptConfirm.Equals(confirmType)) { //Arpit if (GetDifferenceQty() > 0) { GetCtx().SetContext("DifferenceQty_", VAdvantage.Utility.Util.GetValueOfString(GetDifferenceQty())); } MProduct _pro = new MProduct(GetCtx(), line.GetM_Product_ID(), Get_TrxName()); if (_pro.GetC_UOM_ID() != line.GetC_UOM_ID()) { decimal?pc = null; pc = MUOMConversion.ConvertProductFrom(GetCtx(), line.GetM_Product_ID(), GetC_UOM_ID(), GetTargetQty()); line.SetTargetQty(Util.GetValueOfDecimal(pc)); //TargetQty Decimal qty = GetConfirmedQty(); Boolean isReturnTrx = line.GetParent().IsReturnTrx(); /* In PO receipts and SO Returns, we have the responsibility * for scrapped quantity */ if ((!isSOTrx && !isReturnTrx) || (isSOTrx && isReturnTrx)) { qty = Decimal.Add(qty, GetScrappedQty()); } pc = MUOMConversion.ConvertProductFrom(GetCtx(), line.GetM_Product_ID(), GetC_UOM_ID(), qty); line.SetMovementQty(Util.GetValueOfDecimal(pc)); //MovementQty pc = MUOMConversion.ConvertProductFrom(GetCtx(), line.GetM_Product_ID(), GetC_UOM_ID(), GetScrappedQty()); line.SetScrappedQty(Util.GetValueOfDecimal(pc)); //ScrappedQty pc = MUOMConversion.ConvertProductFrom(GetCtx(), line.GetM_Product_ID(), GetC_UOM_ID(), GetConfirmedQty()); line.SetConfirmedQty(Util.GetValueOfDecimal(pc)); //confirm Qty } else { line.SetTargetQty(GetTargetQty()); Decimal qty = GetConfirmedQty(); Boolean isReturnTrx = line.GetParent().IsReturnTrx(); /* In PO receipts and SO Returns, we have the responsibility * for scrapped quantity */ if ((!isSOTrx && !isReturnTrx) || (isSOTrx && isReturnTrx)) { qty = Decimal.Add(qty, GetScrappedQty()); } line.SetMovementQty(qty); // Entered NOT changed // line.SetScrappedQty(GetScrappedQty()); // vikas 12/28/2015 Mantis Issue (0000335) line.SetConfirmedQty(GetConfirmedQty()); } } // Vendor else if (MInOutConfirm.CONFIRMTYPE_VendorConfirmation.Equals(confirmType)) { line.SetConfirmedQty(GetConfirmedQty()); } return(line.Save(Get_TrxName())); }
/// <summary> /// Before Save /// </summary> /// <param name="newRecord">new</param> /// <returns>true</returns> protected override Boolean BeforeSave(Boolean newRecord) { Decimal VA024_ProvisionPrice = 0; MProduct product = MProduct.Get(GetCtx(), GetM_Product_ID()); // chck pallet Functionality applicable or not bool isContainrApplicable = MTransaction.ProductContainerApplicable(GetCtx()); // Get Old Value of AttributeSetInstance_ID _mvlOldAttId = Util.GetValueOfInt(Get_ValueOld("M_AttributeSetInstance_ID")); // Set Line No if (GetLine() == 0) { String sql = "SELECT COALESCE(MAX(Line),0)+10 AS DefaultValue FROM M_MovementLine WHERE M_Movement_ID=" + GetM_Movement_ID(); int ii = DataBase.DB.GetSQLValue(Get_TrxName(), sql); SetLine(ii); } // JID_0775: System is not checking on move line that the attribute set instance is mandatory. if (GetM_AttributeSetInstance_ID() == 0) { if (product != null && product.GetM_AttributeSet_ID() != 0) { MAttributeSet mas = MAttributeSet.Get(GetCtx(), product.GetM_AttributeSet_ID()); if (mas.IsMandatory() || mas.IsMandatoryAlways()) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "M_AttributeSetInstance_ID")); return(false); } } } // Check Locator For Header Warehouse MMovement mov = new MMovement(GetCtx(), GetM_Movement_ID(), Get_TrxName()); MLocator loc = new MLocator(GetCtx(), GetM_Locator_ID(), Get_TrxName()); Tuple <string, string, string> aInfo = null; if (Env.HasModulePrefix("DTD001_", out aInfo)) { if (mov.GetDTD001_MWarehouseSource_ID() == loc.GetM_Warehouse_ID()) { } else { String sql = "SELECT M_Locator_ID FROM M_Locator WHERE M_Warehouse_ID=" + mov.GetDTD001_MWarehouseSource_ID() + " AND IsDefault = 'Y'"; int ii = DataBase.DB.GetSQLValue(Get_TrxName(), sql); SetM_Locator_ID(ii); } } // when we try to move product from container to container which are in same locator then no need to check this case if (GetM_Locator_ID() == GetM_LocatorTo_ID() && (Get_ColumnIndex("M_ProductContainer_ID") > 0 && Get_ColumnIndex("Ref_M_ProductContainerTo_ID") > 0 && !(GetM_ProductContainer_ID() > 0 || GetRef_M_ProductContainerTo_ID() > 0))) { log.SaveError("Error", Msg.ParseTranslation(GetCtx(), "'From @M_Locator_ID@' and '@M_LocatorTo_ID@' cannot be same."));//change message according to requirement return(false); } if (Env.Signum(GetMovementQty()) == 0 && Util.GetValueOfInt(GetTargetQty()) == 0) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "MovementQty")); return(false); } Tuple <String, String, String> mInfo = null; if (Env.HasModulePrefix("DTD001_", out mInfo)) { if (!newRecord && Util.GetValueOfInt(Get_ValueOld("M_Product_ID")) != GetM_Product_ID()) { log.SaveError("Message", Msg.GetMsg(GetCtx(), "DTD001_ProdNotChanged")); return(false); } if (!newRecord && Util.GetValueOfInt(Get_ValueOld("M_Locator_ID")) != GetM_Locator_ID()) { log.SaveError("Message", Msg.GetMsg(GetCtx(), "DTD001_LocatorNotChanged")); return(false); } if (!newRecord && Util.GetValueOfInt(Get_ValueOld("M_RequisitionLine_ID")) != GetM_RequisitionLine_ID()) { log.SaveError("Message", Msg.GetMsg(GetCtx(), "DTD001_ReqNotChanged")); return(false); } } //if (Util.GetValueOfInt(DB.ExecuteScalar("SELECT COUNT(AD_MODULEINFO_ID) FROM AD_MODULEINFO WHERE PREFIX='VA203_'", null, null)) > 0) if (Env.IsModuleInstalled("VA203_")) { if (GetM_RequisitionLine_ID() > 0) { MRequisitionLine reqline = new MRequisitionLine(GetCtx(), GetM_RequisitionLine_ID(), Get_Trx()); // Trx used to handle query stuck problem if (GetM_AttributeSetInstance_ID() != reqline.GetM_AttributeSetInstance_ID()) { log.SaveError("Message", Msg.GetMsg(GetCtx(), "VA203_AttributeInstanceMustBeSame")); return(false); } } } // IF Doc Status = InProgress then No record Save MMovement move = new MMovement(GetCtx(), GetM_Movement_ID(), Get_Trx()); // Trx used to handle query stuck problem if (newRecord && move.GetDocStatus() == "IP") { log.SaveError("Message", Msg.GetMsg(GetCtx(), "DTD001_CannotCreate")); return(false); } // Qty Precision if (newRecord || Is_ValueChanged("QtyEntered")) { SetQtyEntered(GetQtyEntered()); } // change to set Converted Quantity in Movement quantity if there is differnce in UOM of Base Product and UOM Selected on line if (newRecord || Is_ValueChanged("QtyEntered") || Is_ValueChanged("C_UOM_ID")) { Decimal?qty = Util.GetValueOfDecimal(Get_Value("QtyEntered")); if (product.GetC_UOM_ID() != Util.GetValueOfInt(Get_Value("C_UOM_ID"))) { SetMovementQty(MUOMConversion.ConvertProductFrom(GetCtx(), GetM_Product_ID(), Util.GetValueOfInt(Get_Value("C_UOM_ID")), Util.GetValueOfDecimal(Get_Value("QtyEntered")))); } } // Qty Precision if (newRecord || Is_ValueChanged("QtyEntered")) { SetMovementQty(GetMovementQty()); } string qry; if (!mov.IsProcessing() || newRecord) { MWarehouse wh = null; MWarehouse whTo = null; wh = MWarehouse.Get(GetCtx(), mov.GetDTD001_MWarehouseSource_ID()); whTo = MWarehouse.Get(GetCtx(), MLocator.Get(GetCtx(), GetM_LocatorTo_ID()).GetM_Warehouse_ID()); qry = "SELECT NVL(SUM(NVL(QtyOnHand,0)),0) AS QtyOnHand FROM M_Storage where m_locator_id=" + GetM_Locator_ID() + " and m_product_id=" + GetM_Product_ID(); if (GetDTD001_AttributeNumber() == null || GetM_AttributeSetInstance_ID() > 0) { qry += " AND NVL(M_AttributeSetInstance_ID , 0) =" + GetM_AttributeSetInstance_ID(); } OnHandQty = Convert.ToDecimal(DB.ExecuteScalar(qry)); qry = "SELECT NVL(SUM(NVL(QtyOnHand,0)),0) AS QtyOnHand FROM M_Storage where m_locator_id=" + GetM_LocatorTo_ID() + " and m_product_id=" + GetM_Product_ID(); qry += " AND NVL(M_AttributeSetInstance_ID, 0) =" + GetM_AttributeSetInstance_ID(); OnHandQtyTo = Convert.ToDecimal(DB.ExecuteScalar(qry)); // SI_0635 : System is giving error of insufficient qty if disallow is true in TO warehouse and false in From warehouse // when record is in completed & closed stage - then no need to check qty availablity in warehouse if ((wh.IsDisallowNegativeInv() || whTo.IsDisallowNegativeInv()) && (!(move.GetDocStatus() == "CO" || move.GetDocStatus() == "CL" || move.GetDocStatus() == "RE" || move.GetDocStatus() == "VO"))) { // pick container current qty from transaction based on locator / product / ASI / Container / Movement Date if (isContainrApplicable && Get_ColumnIndex("M_ProductContainer_ID") >= 0) { // qry = @"SELECT SUM(t.ContainerCurrentQty) keep (dense_rank last ORDER BY t.MovementDate, t.M_Transaction_ID) AS CurrentQty FROM m_transaction t // INNER JOIN M_Locator l ON t.M_Locator_ID = l.M_Locator_ID WHERE t.MovementDate <= " + GlobalVariable.TO_DATE(move.GetMovementDate(), true) + // " AND t.AD_Client_ID = " + GetAD_Client_ID() + // @" AND t.M_Locator_ID = " + (move.IsReversal() && GetMovementQty() < 0 ? GetM_LocatorTo_ID() : GetM_Locator_ID()) + // " AND t.M_Product_ID = " + GetM_Product_ID() + " AND NVL(t.M_AttributeSetInstance_ID,0) = " + GetM_AttributeSetInstance_ID() + // " AND NVL(t.M_ProductContainer_ID, 0) = " + (move.IsReversal() && !IsMoveFullContainer() && GetMovementQty() < 0 ? GetRef_M_ProductContainerTo_ID() : GetM_ProductContainer_ID()); // containerQty = Util.GetValueOfDecimal(DB.ExecuteScalar(qry.ToString(), null, null)); // dont use Transaction here - otherwise impact goes wrong on completion // qry = @"SELECT SUM(t.ContainerCurrentQty) keep (dense_rank last ORDER BY t.MovementDate, t.M_Transaction_ID) AS CurrentQty FROM m_transaction t // INNER JOIN M_Locator l ON t.M_Locator_ID = l.M_Locator_ID WHERE t.MovementDate <= " + GlobalVariable.TO_DATE(move.GetMovementDate(), true) + // " AND t.AD_Client_ID = " + GetAD_Client_ID() + // @" AND t.M_Locator_ID = " + (move.IsReversal() && GetMovementQty() < 0 ? GetM_Locator_ID() : GetM_LocatorTo_ID()) + // " AND t.M_Product_ID = " + GetM_Product_ID() + " AND NVL(t.M_AttributeSetInstance_ID,0) = " + GetM_AttributeSetInstance_ID() + // " AND NVL(t.M_ProductContainer_ID, 0) = " + (move.IsReversal() && !IsMoveFullContainer() && GetMovementQty() < 0 ? GetM_ProductContainer_ID() : GetRef_M_ProductContainerTo_ID()); // containerQtyTo = Util.GetValueOfDecimal(DB.ExecuteScalar(qry.ToString(), null, null)); // dont use Transaction here - otherwise impact goes wrong on completion qry = @"SELECT DISTINCT First_VALUE(t.ContainerCurrentQty) OVER (PARTITION BY t.M_Product_ID, t.M_AttributeSetInstance_ID ORDER BY t.MovementDate DESC, t.M_Transaction_ID DESC) AS CurrentQty FROM m_transaction t INNER JOIN M_Locator l ON t.M_Locator_ID = l.M_Locator_ID WHERE t.MovementDate <= " + GlobalVariable.TO_DATE(move.GetMovementDate(), true) + " AND t.AD_Client_ID = " + GetAD_Client_ID() + @" AND t.M_Locator_ID = " + GetM_Locator_ID() + " AND t.M_Product_ID = " + GetM_Product_ID() + " AND NVL(t.M_ProductContainer_ID, 0) = " + GetM_ProductContainer_ID(); // In Case of Attribute Number do not check qty with attribute from storage if (GetDTD001_AttributeNumber() == null || GetM_AttributeSetInstance_ID() > 0) { qry += " AND NVL(M_AttributeSetInstance_ID , 0) =" + GetM_AttributeSetInstance_ID(); } containerQty = Util.GetValueOfDecimal(DB.ExecuteScalar(qry.ToString(), null, null)); // dont use Transaction here - otherwise impact goes wrong on completion qry = @"SELECT DISTINCT First_VALUE(t.ContainerCurrentQty) OVER (PARTITION BY t.M_Product_ID, t.M_AttributeSetInstance_ID ORDER BY t.MovementDate DESC, t.M_Transaction_ID DESC) AS CurrentQty FROM m_transaction t INNER JOIN M_Locator l ON t.M_Locator_ID = l.M_Locator_ID WHERE t.MovementDate <= " + GlobalVariable.TO_DATE(move.GetMovementDate(), true) + " AND t.AD_Client_ID = " + GetAD_Client_ID() + @" AND t.M_Locator_ID = " + GetM_LocatorTo_ID() + " AND t.M_Product_ID = " + GetM_Product_ID() + " AND NVL(t.M_AttributeSetInstance_ID,0) = " + GetM_AttributeSetInstance_ID() + " AND NVL(t.M_ProductContainer_ID, 0) = " + GetRef_M_ProductContainerTo_ID(); containerQtyTo = Util.GetValueOfDecimal(DB.ExecuteScalar(qry.ToString(), null, null)); // dont use Transaction here - otherwise impact goes wrong on completion } if (wh.IsDisallowNegativeInv() && (OnHandQty - GetMovementQty()) < 0) { // check for From Locator log.SaveError("Info", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "VIS_InsufficientQty") + OnHandQty); return(false); } else if (isContainrApplicable && wh.IsDisallowNegativeInv() && Get_ColumnIndex("M_ProductContainer_ID") >= 0 && (containerQty - GetMovementQty()) < 0) { // check container qty - for From Locator log.SaveError("Info", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "VIS_InsufficientQtyContainer") + containerQty); return(false); } else if (whTo.IsDisallowNegativeInv() && (OnHandQtyTo + GetMovementQty()) < 0) { // check for To Locator log.SaveError("Info", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "VIS_InsufficientQty") + OnHandQtyTo); return(false); } else if (isContainrApplicable && whTo.IsDisallowNegativeInv() && Get_ColumnIndex("M_ProductContainer_ID") >= 0 && (containerQtyTo + GetMovementQty()) < 0) { // check for To Locator log.SaveError("Info", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "VIS_InsufficientQtyContainerTo") + containerQtyTo); return(false); } } } if (Env.IsModuleInstalled("DTD001_")) { // not used this variable, that why commented //qry = "SELECT NVL(SUM(NVL(QtyOnHand,0)- qtyreserved),0) AS QtyAvailable FROM M_Storage where m_locator_id=" + GetM_Locator_ID() + " and m_product_id=" + GetM_Product_ID(); //if (GetM_AttributeSetInstance_ID() != 0) //{ // qry += " AND NVL(M_AttributeSetInstance_ID , 0) = " + GetM_AttributeSetInstance_ID(); //} //qtyAvailable = Convert.ToDecimal(DB.ExecuteScalar(qry)); qtyReserved = Util.GetValueOfDecimal(Get_ValueOld("MovementQty")); //if (wh.IsDisallowNegativeInv() == true) //{ // if ((qtyAvailable < (GetMovementQty() - qtyReserved))) // { // log.SaveError("Message", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "DTD001_QtyNotAvailable")); // return false; // } //} } //By Amit - 17-April-2017 if (Env.IsModuleInstalled("VA024_")) { // checking are we moving product from one warehouse to other warehouse if (Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT CASE WHEN ((SELECT CASE WHEN o.IsLegalEntity = 'Y' THEN w.AD_Org_ID ELSE (SELECT AD_Org_ID FROM AD_Org WHERE Ad_Org_id = o.LegalEntityOrg ) END FROM m_warehouse w INNER JOIN ad_org o ON o.AD_Org_ID = w.AD_Org_ID WHERE w.m_warehouse_id = m.DTD001_MWarehouseSource_ID)) = (SELECT CASE WHEN o2.IsLegalEntity = 'Y' THEN w2.AD_Org_ID ELSE (SELECT AD_Org_ID FROM AD_Org WHERE Ad_Org_id = o2.LegalEntityOrg) END FROM m_warehouse w2 INNER JOIN ad_org o2 ON o2.AD_Org_ID = w2.AD_Org_ID WHERE M_Warehouse_ID = m.M_Warehouse_ID ) THEN 0 ELSE (SELECT ad_org_id FROM m_warehouse WHERE M_Warehouse_ID = m.M_Warehouse_ID ) END AS result FROM m_movement m WHERE m_movement_id = " + GetM_Movement_ID(), null, Get_Trx())) > 0) { string qry1 = @"SELECT SUM(o.VA024_UnitPrice) FROM VA024_t_ObsoleteInventory o WHERE o.IsActive = 'Y' AND o.M_Product_ID = " + GetM_Product_ID() + @" and ( o.M_AttributeSetInstance_ID = " + GetM_AttributeSetInstance_ID() + @" OR o.M_AttributeSetInstance_ID IS NULL )" + " AND o.AD_Org_ID = " + GetAD_Org_ID(); VA024_ProvisionPrice = Util.GetValueOfDecimal(DB.ExecuteScalar(qry1, null, Get_Trx())); SetVA024_UnitPrice(Util.GetValueOfDecimal(VA024_ProvisionPrice * GetMovementQty())); // is used to get cost of binded cost method / costing level of primary accounting schema Decimal cost = MCost.GetproductCosts(move.GetAD_Client_ID(), move.GetAD_Org_ID(), GetM_Product_ID(), GetM_AttributeSetInstance_ID(), Get_Trx(), move.GetDTD001_MWarehouseSource_ID()); SetVA024_CostPrice((cost - VA024_ProvisionPrice) * GetMovementQty()); } } // Mandatory Instance if (GetM_AttributeSetInstanceTo_ID() == 0) { if (GetM_AttributeSetInstance_ID() != 0) // Set to from { SetM_AttributeSetInstanceTo_ID(GetM_AttributeSetInstance_ID()); } else { if (Env.HasModulePrefix("DTD001_", out mInfo)) { //MProduct product = GetProduct(); if (product != null && product.GetM_AttributeSet_ID() != 0) { //MAttributeSet mas = MAttributeSet.Get(GetCtx(), product.GetM_AttributeSet_ID()); //if (mas.IsInstanceAttribute() // && (mas.IsMandatory() || mas.IsMandatoryAlways())) //{ // log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "M_AttributeSetInstanceTo_ID")); // return false; //} // Code Addeded by Bharat as Discussed with Mukesh Sir if (String.IsNullOrEmpty(GetDTD001_AttributeNumber())) { return(true); } else { if (GetDTD001_AttributeNumber() == "" || GetDTD001_AttributeNumber() == null) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "DTD001_AttributeNumber")); return(false); } } //JID_1422: Check No Of Attributes Are Equal To Quantity Or Less Than int Count = CountAttributes(GetDTD001_AttributeNumber()); if (Count != GetQtyEntered()) { if (Count > GetQtyEntered()) { log.SaveError("DTD001_MovementAttrbtGreater", ""); return(false); } else { log.SaveError("DTD001_MovementAttrbtLess", ""); return(false); } } } else { if (product != null) { if (product.GetM_AttributeSet_ID() == 0 && (GetDTD001_AttributeNumber() == "" || GetDTD001_AttributeNumber() == null)) { return(true); } else { //log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "DTD001_AttributeNumber")); //ShowMessage.Info("a", true, "Product is not of Attribute Type", null); log.SaveError("Product is not of Attribute Type", Msg.GetElement(GetCtx(), "DTD001_AttributeNumber")); return(false); } //Check No Of Attributes Are Equal To Quantity Or Less Than //int Count = CountAttributes(GetDTD001_AttributeNumber()); //if (Count != GetMovementQty()) //{ // if (Count > GetMovementQty()) // { // log.SaveError("Error", Msg.GetMsg(GetCtx(), "DTD001_MovementAttrbtGreater")); // return false; // } // else // { // log.SaveError("Error", Msg.GetMsg(GetCtx(), "DTD001_MovementAttrbtLess")); // return false; // } //} } } } else { //MProduct product = GetProduct(); if (product != null && product.GetM_AttributeSet_ID() != 0) { MAttributeSet mas = MAttributeSet.Get(GetCtx(), product.GetM_AttributeSet_ID()); if (mas.IsInstanceAttribute() && (mas.IsMandatory() || mas.IsMandatoryAlways())) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "M_AttributeSetInstanceTo_ID")); return(false); } } } } } // ASI return(true); }
/// <summary> /// Before Save /// </summary> /// <param name="newRecord">new</param> /// <returns>true</returns> protected override Boolean BeforeSave(Boolean newRecord) { Decimal VA024_ProvisionPrice = 0; MProduct product = MProduct.Get(GetCtx(), GetM_Product_ID()); // By vikas // Get Old Value of AttributeSetInstance_ID _mvlOldAttId = Util.GetValueOfInt(Get_ValueOld("M_AttributeSetInstance_ID")); // Set Line No if (GetLine() == 0) { String sql = "SELECT COALESCE(MAX(Line),0)+10 AS DefaultValue FROM M_MovementLine WHERE M_Movement_ID=" + GetM_Movement_ID(); int ii = DataBase.DB.GetSQLValue(Get_TrxName(), sql); SetLine(ii); } // Check Locator For Header Warehouse MMovement mov = new MMovement(GetCtx(), GetM_Movement_ID(), Get_TrxName()); MLocator loc = new MLocator(GetCtx(), GetM_Locator_ID(), Get_TrxName()); Tuple <string, string, string> aInfo = null; if (Env.HasModulePrefix("DTD001_", out aInfo)) { if (mov.GetDTD001_MWarehouseSource_ID() == loc.GetM_Warehouse_ID()) { } else { String sql = "SELECT M_Locator_ID FROM M_Locator WHERE M_Warehouse_ID=" + mov.GetDTD001_MWarehouseSource_ID() + " AND IsDefault = 'Y'"; int ii = DataBase.DB.GetSQLValue(Get_TrxName(), sql); SetM_Locator_ID(ii); } } if (GetM_Locator_ID() == GetM_LocatorTo_ID()) { log.SaveError("Error", Msg.ParseTranslation(GetCtx(), "'From @M_Locator_ID@' and '@M_LocatorTo_ID@' cannot be same."));//change message according to requirement return(false); } if (Env.Signum(GetMovementQty()) == 0 && Util.GetValueOfInt(GetTargetQty()) == 0) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "MovementQty")); return(false); } //Amit Tuple <String, String, String> mInfo = null; if (Env.HasModulePrefix("DTD001_", out mInfo)) { if (!newRecord && Util.GetValueOfInt(Get_ValueOld("M_Product_ID")) != GetM_Product_ID()) { log.SaveError("Message", Msg.GetMsg(GetCtx(), "DTD001_ProdNotChanged")); return(false); } if (!newRecord && Util.GetValueOfInt(Get_ValueOld("M_Locator_ID")) != GetM_Locator_ID()) { log.SaveError("Message", Msg.GetMsg(GetCtx(), "DTD001_LocatorNotChanged")); return(false); } if (!newRecord && Util.GetValueOfInt(Get_ValueOld("M_RequisitionLine_ID")) != GetM_RequisitionLine_ID()) { log.SaveError("Message", Msg.GetMsg(GetCtx(), "DTD001_ReqNotChanged")); return(false); } } //if (Util.GetValueOfInt(DB.ExecuteScalar("SELECT COUNT(AD_MODULEINFO_ID) FROM AD_MODULEINFO WHERE PREFIX='VA203_'", null, null)) > 0) if (Env.IsModuleInstalled("VA203_")) { if (GetM_RequisitionLine_ID() > 0) { MRequisitionLine reqline = new MRequisitionLine(GetCtx(), GetM_RequisitionLine_ID(), Get_Trx()); // Trx used to handle query stuck problem if (GetM_AttributeSetInstance_ID() != reqline.GetM_AttributeSetInstance_ID()) { log.SaveError("Message", Msg.GetMsg(GetCtx(), "VA203_AttributeInstanceMustBeSame")); return(false); } } } // IF Doc Status = InProgress then No record Save MMovement move = new MMovement(GetCtx(), GetM_Movement_ID(), Get_Trx()); // Trx used to handle query stuck problem if (newRecord && move.GetDocStatus() == "IP") { log.SaveError("Message", Msg.GetMsg(GetCtx(), "DTD001_CannotCreate")); return(false); } // change to set Converted Quantity in Movement quantity if there is differnce in UOM of Base Product and UOM Selected on line if (newRecord || Is_ValueChanged("QtyEntered") || Is_ValueChanged("C_UOM_ID")) { Decimal?qty = Util.GetValueOfDecimal(Get_Value("QtyEntered")); if (product.GetC_UOM_ID() != Util.GetValueOfInt(Get_Value("C_UOM_ID"))) { SetMovementQty(MUOMConversion.ConvertProductFrom(GetCtx(), GetM_Product_ID(), Util.GetValueOfInt(Get_Value("C_UOM_ID")), Util.GetValueOfDecimal(Get_Value("QtyEntered")))); } } // Qty Precision if (newRecord || Is_ValueChanged("QtyEntered")) { SetMovementQty(GetMovementQty()); } MWarehouse wh = null; MWarehouse whTo = null; //string qry = "select m_warehouse_id from m_locator where m_locator_id=" + GetM_Locator_ID(); //M_Warehouse_ID = Util.GetValueOfInt(DB.ExecuteScalar(qry)); wh = MWarehouse.Get(GetCtx(), mov.GetDTD001_MWarehouseSource_ID()); whTo = MWarehouse.Get(GetCtx(), mov.GetM_Warehouse_ID()); string qry = "SELECT NVL(SUM(NVL(QtyOnHand,0)),0) AS QtyOnHand FROM M_Storage where m_locator_id=" + GetM_Locator_ID() + " and m_product_id=" + GetM_Product_ID(); if (GetM_AttributeSetInstance_ID() != 0) { qry += " AND M_AttributeSetInstance_ID=" + GetM_AttributeSetInstance_ID(); } OnHandQty = Convert.ToDecimal(DB.ExecuteScalar(qry)); qry = "SELECT NVL(SUM(NVL(QtyOnHand,0)),0) AS QtyOnHand FROM M_Storage where m_locator_id=" + GetM_LocatorTo_ID() + " and m_product_id=" + GetM_Product_ID(); if (GetM_AttributeSetInstance_ID() != 0) { qry += " AND M_AttributeSetInstance_ID=" + GetM_AttributeSetInstance_ID(); } OnHandQtyTo = Convert.ToDecimal(DB.ExecuteScalar(qry)); // SI_0635 : System is giving error of insufficient qty if disallow is true in TO warehouse and false in From warehouse // when record is in completed & closed stage - then no need to check qty availablity in warehouse if ((wh.IsDisallowNegativeInv() || whTo.IsDisallowNegativeInv()) && (!(move.GetDocStatus() == "CO" || move.GetDocStatus() == "CL" || move.GetDocStatus() == "RE" || move.GetDocStatus() == "VO"))) { if (wh.IsDisallowNegativeInv() && (OnHandQty - GetMovementQty()) < 0) { // check for From Locator log.SaveError("Info", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "VIS_InsufficientQty") + OnHandQty); return(false); } else if (whTo.IsDisallowNegativeInv() && (OnHandQtyTo + GetMovementQty()) < 0) { // check for To Locator log.SaveError("Info", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "VIS_InsufficientQty") + OnHandQtyTo); return(false); } } if (Env.HasModulePrefix("DTD001_", out mInfo)) { qry = "SELECT NVL(SUM(NVL(QtyOnHand,0)- qtyreserved),0) AS QtyAvailable FROM M_Storage where m_locator_id=" + GetM_Locator_ID() + " and m_product_id=" + GetM_Product_ID(); if (GetM_AttributeSetInstance_ID() != 0) { qry += " AND M_AttributeSetInstance_ID=" + GetM_AttributeSetInstance_ID(); } qtyAvailable = Convert.ToDecimal(DB.ExecuteScalar(qry)); qtyReserved = Util.GetValueOfDecimal(Get_ValueOld("MovementQty")); //if (wh.IsDisallowNegativeInv() == true) //{ // if ((qtyAvailable < (GetMovementQty() - qtyReserved))) // { // log.SaveError("Message", product.GetName() + " , " + Msg.GetMsg(GetCtx(), "DTD001_QtyNotAvailable")); // return false; // } //} } //By Amit - 17-April-2017 if (Env.IsModuleInstalled("VA024_")) { // checking are we moving product from one warehouse to other warehouse if (Util.GetValueOfInt(DB.ExecuteScalar(@"SELECT CASE WHEN ((SELECT CASE WHEN o.IsLegalEntity = 'Y' THEN w.AD_Org_ID ELSE (SELECT AD_Org_ID FROM AD_Org WHERE Ad_Org_id = o.LegalEntityOrg ) END FROM m_warehouse w INNER JOIN ad_org o ON o.AD_Org_ID = w.AD_Org_ID WHERE w.m_warehouse_id = m.DTD001_MWarehouseSource_ID)) = (SELECT CASE WHEN o2.IsLegalEntity = 'Y' THEN w2.AD_Org_ID ELSE (SELECT AD_Org_ID FROM AD_Org WHERE Ad_Org_id = o2.LegalEntityOrg) END FROM m_warehouse w2 INNER JOIN ad_org o2 ON o2.AD_Org_ID = w2.AD_Org_ID WHERE M_Warehouse_ID = m.M_Warehouse_ID ) THEN 0 ELSE (SELECT ad_org_id FROM m_warehouse WHERE M_Warehouse_ID = m.M_Warehouse_ID ) END AS result FROM m_movement m WHERE m_movement_id = " + GetM_Movement_ID(), null, Get_Trx())) > 0) { MMovement inventory = new MMovement(GetCtx(), GetM_Movement_ID(), Get_Trx()); try { string qry1 = @"SELECT SUM(o.VA024_UnitPrice) FROM VA024_t_ObsoleteInventory o WHERE o.IsActive = 'Y' AND o.M_Product_ID = " + GetM_Product_ID() + @" and ( o.M_AttributeSetInstance_ID = " + GetM_AttributeSetInstance_ID() + @" OR o.M_AttributeSetInstance_ID IS NULL )" + " AND o.AD_Org_ID = " + GetAD_Org_ID(); VA024_ProvisionPrice = Util.GetValueOfDecimal(DB.ExecuteScalar(qry1, null, Get_Trx())); SetVA024_UnitPrice(Util.GetValueOfDecimal(VA024_ProvisionPrice * GetMovementQty())); qry1 = @"SELECT (ct.currentcostprice - " + VA024_ProvisionPrice + ") * " + GetMovementQty(); qry1 += @" FROM m_product p INNER JOIN va024_t_obsoleteinventory oi ON p.m_product_id = oi.M_product_ID INNER JOIN m_product_category pc ON pc.m_product_category_ID = p.m_product_category_ID INNER JOIN AD_client c ON c.AD_Client_ID = p.Ad_Client_ID INNER JOIN AD_ClientInfo ci ON c.AD_Client_ID = ci.Ad_Client_ID INNER JOIN m_cost ct ON ( p.M_Product_ID = ct.M_Product_ID AND ci.C_AcctSchema1_ID = ct.C_AcctSchema_ID ) INNER JOIN c_acctschema asch ON (asch.C_AcctSchema_ID = ci.C_AcctSchema1_ID) INNER JOIN va024_obsoleteinvline oil ON oil.va024_obsoleteinvline_ID = oi.va024_obsoleteinvline_ID "; qry1 += @" WHERE ct.AD_Org_ID = CASE WHEN ( pc.costinglevel IS NOT NULL AND pc.costinglevel = 'O') THEN " + GetAD_Org_ID() + @" WHEN ( pc.costinglevel IS NOT NULL AND (pc.costinglevel = 'C' OR pc.costinglevel = 'B')) THEN 0 WHEN (pc.costinglevel IS NULL AND asch.costinglevel = 'O') THEN " + GetAD_Org_ID() + @" WHEN ( pc.costinglevel IS NULL AND (asch.costinglevel = 'C' OR asch.costinglevel = 'B')) THEN 0 END AND ct.m_costelement_id = CASE WHEN ( pc.costingmethod IS NOT NULL AND pc.costingmethod != 'C') THEN (SELECT MIN(m_costelement_id) FROM m_costelement WHERE m_costelement.costingmethod =pc.costingmethod AND m_costelement.Ad_Client_ID = oi.ad_client_id ) WHEN ( pc.costingmethod IS NOT NULL AND pc.costingmethod = 'C' ) THEN pc.m_costelement_id WHEN ( pc.costingmethod IS NULL AND asch.costingmethod != 'C') THEN (SELECT MIN(m_costelement_id) FROM m_costelement WHERE m_costelement.costingmethod = asch.costingmethod AND m_costelement.Ad_Client_ID = oi.ad_client_id ) WHEN ( pc.costingmethod IS NULL AND asch.costingmethod = 'C') THEN asch.m_costelement_id END AND NVL(ct.M_Attributesetinstance_ID , 0) = CASE WHEN ( pc.costinglevel IS NOT NULL AND pc.costinglevel = 'B') THEN " + GetM_AttributeSetInstance_ID() + @" WHEN ( pc.costinglevel IS NOT NULL AND (pc.costinglevel = 'C' OR pc.costinglevel = 'O')) THEN 0 WHEN ( pc.costinglevel IS NULL AND asch.costinglevel = 'B') THEN " + GetM_AttributeSetInstance_ID() + @" WHEN ( pc.costinglevel IS NULL AND (asch.costinglevel = 'C' OR asch.costinglevel = 'O')) THEN 0 END AND p.M_Product_ID = " + GetM_Product_ID(); SetVA024_CostPrice(Util.GetValueOfDecimal(DB.ExecuteScalar(qry1, null, Get_Trx()))); } catch { } } } // Mandatory Instance if (GetM_AttributeSetInstanceTo_ID() == 0) { if (GetM_AttributeSetInstance_ID() != 0) // Set to from { SetM_AttributeSetInstanceTo_ID(GetM_AttributeSetInstance_ID()); } else { if (Env.HasModulePrefix("DTD001_", out mInfo)) { //MProduct product = GetProduct(); if (product != null && product.GetM_AttributeSet_ID() != 0) { //MAttributeSet mas = MAttributeSet.Get(GetCtx(), product.GetM_AttributeSet_ID()); //if (mas.IsInstanceAttribute() // && (mas.IsMandatory() || mas.IsMandatoryAlways())) //{ // log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "M_AttributeSetInstanceTo_ID")); // return false; //} // Code Addeded by Bharat as Discussed with Mukesh Sir if (String.IsNullOrEmpty(GetDTD001_AttributeNumber())) { return(true); } else { if (GetDTD001_AttributeNumber() == "" || GetDTD001_AttributeNumber() == null) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "DTD001_AttributeNumber")); return(false); } } } else { if (product != null) { if (product.GetM_AttributeSet_ID() == 0 && (GetDTD001_AttributeNumber() == "" || GetDTD001_AttributeNumber() == null)) { return(true); } else { //log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "DTD001_AttributeNumber")); //ShowMessage.Info("a", true, "Product is not of Attribute Type", null); log.SaveError("Product is not of Attribute Type", Msg.GetElement(GetCtx(), "DTD001_AttributeNumber")); return(false); } //Check No Of Attributes Are Equal To Quantity Or Less Than int Count = CountAttributes(GetDTD001_AttributeNumber()); if (Count != GetMovementQty()) { if (Count > GetMovementQty()) { log.SaveError("Error", Msg.GetMsg(GetCtx(), "DTD001_MovementAttrbtGreater")); return(false); } else { log.SaveError("Error", Msg.GetMsg(GetCtx(), "DTD001_MovementAttrbtLess")); return(false); } } } } } else { //MProduct product = GetProduct(); if (product != null && product.GetM_AttributeSet_ID() != 0) { MAttributeSet mas = MAttributeSet.Get(GetCtx(), product.GetM_AttributeSet_ID()); if (mas.IsInstanceAttribute() && (mas.IsMandatory() || mas.IsMandatoryAlways())) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "M_AttributeSetInstanceTo_ID")); return(false); } } } } } // ASI return(true); }
/* * Before Save * @param newRecord new * @return true */ protected override bool BeforeSave(bool newRecord) { try { MProduct product = MProduct.Get(GetCtx(), GetM_Product_ID()); if (GetLine() == 0) { String sql = "SELECT COALESCE(MAX(Line),0)+10 FROM M_RequisitionLine WHERE M_Requisition_ID=@param1"; int ii = DataBase.DB.GetSQLValue(Get_TrxName(), sql, GetM_Requisition_ID()); SetLine(ii); } // Check Product_ID or charge_id for before save if (GetM_Product_ID() == 0 && GetC_Charge_ID() == 0) { log.SaveError("VIS_NOProductOrCharge", ""); return(false); } // change to set Converted Quantity in Movement quantity if there is differnce in UOM of Base Product and UOM Selected on line if (GetM_Product_ID() > 0 && Get_ColumnIndex("QtyEntered") > 0 && (newRecord || Is_ValueChanged("QtyEntered") || Is_ValueChanged("C_UOM_ID"))) { Decimal?qty = Util.GetValueOfDecimal(Get_Value("QtyEntered")); if (product.GetC_UOM_ID() != Util.GetValueOfInt(Get_Value("C_UOM_ID"))) { SetQty(MUOMConversion.ConvertProductFrom(GetCtx(), GetM_Product_ID(), Util.GetValueOfInt(Get_Value("C_UOM_ID")), Util.GetValueOfDecimal(Get_Value("QtyEntered")))); } } //QtyEntered should not be zero if (Util.GetValueOfInt(Get_Value("QtyEntered")) == 0) { log.SaveError("FillMandatory", Msg.GetElement(GetCtx(), "Quantity")); return(false); } // SI_0657_3 - precision of Qty should be according to the precision of UOM attached. if (newRecord || Is_ValueChanged("Qty")) { if (product != null) { int precision = product.GetUOMPrecision(); SetQty(Decimal.Round(GetQty(), precision, MidpointRounding.AwayFromZero)); } } // Product & ASI - Charge if (GetM_Product_ID() != 0 && GetC_Charge_ID() != 0) { SetC_Charge_ID(0); } if (GetM_AttributeSetInstance_ID() != 0 && GetC_Charge_ID() != 0) { SetM_AttributeSetInstance_ID(0); } // if (GetPriceActual().CompareTo(Env.ZERO) == 0) { SetPrice(); } // Set Line Net Amount if not calculated if (GetLineNetAmt().CompareTo(Env.ZERO) == 0) { SetLineNetAmt(); } } catch { } return(true); }
} // getDayTimeSlots /** * Create Time Slots */ private void CreateTimeSlots() { // development error if (_typeName == null) { throw new ArgumentNullException("ResourceTypeName not set"); } List <MAssignmentSlot> list = new List <MAssignmentSlot>(); MUOM.Get(_ctx, _C_UOM_ID); int minutes = MUOMConversion.ConvertToMinutes(_ctx, _C_UOM_ID, Env.ONE); log.Config("Minutes=" + minutes); // if (minutes > 0 && minutes < 60 * 24) { // Set Start Time // GregorianCalendar cal = new GregorianCalendar(); // cal.setTime(m_startDate); // cal.set(Calendar.HOUR_OF_DAY, 0); // cal.set(Calendar.MINUTE, 0); // cal.set(Calendar.SECOND, 0); // cal.set(Calendar.MILLISECOND, 0); DateTime cal = new DateTime(_startDate.Value.Year, _startDate.Value.Month, _startDate.Value.Day); // // we have slots - create first if (_slotStartTime != null) { long start = cal.Ticks; // cal.getTimeInMillis(); cal = TimeUtil.GetDayTime(_startDate, _slotStartTime); // set to start time // cal.set(Calendar.SECOND, 0); // cal.set(Calendar.MILLISECOND, 0); list.Add(new MAssignmentSlot(start, cal.Ticks)); } // // Set End Time // GregorianCalendar calEnd = new GregorianCalendar(); DateTime calEnd; if (_slotEndTime != null) { calEnd = TimeUtil.GetDayTime(_startDate, _slotEndTime); //calEnd.set(Calendar.SECOND, 0); // // calEnd.set(Calendar.MILLISECOND, 0); } else // No Slot - all day { // calEnd.setTime(m_startDate); // calEnd.set(Calendar.HOUR_OF_DAY, 0); // calEnd.set(Calendar.MINUTE, 0); // calEnd.set(Calendar.SECOND, 0); // calEnd.set(Calendar.MILLISECOND, 0); calEnd = new DateTime(_startDate.Value.Year, _startDate.Value.Month, _startDate.Value.Day, 0, 0, 0, 0); calEnd = calEnd.AddDays(1); } ////System.out.println("Start=" + new Timestamp(cal.getTimeInMillis())); ////System.out.println("Endt=" + new Timestamp(calEnd.getTimeInMillis())); // // Set end Slot Time // GregorianCalendar calEndSlot = new GregorianCalendar(); DateTime calEndSlot = new DateTime(cal.Ticks); // calEndSlot.setTime(cal.getTime()); calEndSlot = calEndSlot.AddMinutes(minutes); while (cal < calEnd) { list.Add(new MAssignmentSlot(cal.Ticks, calEndSlot.Ticks)); // // Next Slot cal = cal.AddMinutes(minutes); calEndSlot = calEndSlot.AddMinutes(minutes); } // // create last slot //calEndSlot.setTime(cal.getTime()); calEndSlot = new DateTime(cal.Year, cal.Month, cal.Day, 0, 0, 0, 0); // calEndSlot.set(Calendar.HOUR_OF_DAY, 0); // calEndSlot.set(Calendar.MINUTE, 0); // calEndSlot.set(Calendar.SECOND, 0); // calEndSlot.set(Calendar.MILLISECOND, 0); // calEndSlot.add(Calendar.DAY_OF_YEAR, 1); // 00:00 next day calEndSlot = calEndSlot.AddDays(1); list.Add(new MAssignmentSlot(cal.Ticks, calEndSlot.Ticks)); } else // Day, .... { list.Add(new MAssignmentSlot(TimeUtil.GetDay(_startDate), TimeUtil.GetNextDay(_startDate))); } // _timeSlots = new MAssignmentSlot[list.Count]; _timeSlots = list.ToArray(); } // createTimeSlots
/************************************************************************** * Get Assignments for timeframe. * <pre> * - Resource is Active and Available * - Resource UnAvailability * - NonBusinessDay * - ResourceType Available * </pre> * @param S_Resource_ID resource * @param start_Date start date * @param end_Date optional end date, need to provide qty to calculate it * @param qty optional qty in ResourceType UOM - ignored, if end date is not null * @param getAll if true return all errors * @param trxName transaction * @return Array of existing Assigments or null - if free */ //@SuppressWarnings("unchecked") public MAssignmentSlot[] GetAssignmentSlots(int S_Resource_ID, DateTime?start_Date, DateTime?end_Date, Decimal?qty, bool getAll, Trx trxName) { log.Config(start_Date.ToString()); if (_S_Resource_ID != S_Resource_ID) { GetBaseInfo(S_Resource_ID); } // List <MAssignmentSlot> list = new List <MAssignmentSlot>(); MAssignmentSlot ma = null; if (!_isAvailable) { ma = new MAssignmentSlot(EARLIEST, LATEST, Msg.GetMsg(_ctx, "ResourceNotAvailable"), "", MAssignmentSlot.STATUS_NotAvailable); if (!getAll) { return new MAssignmentSlot[] { ma } } ; list.Add(ma); } _startDate = start_Date; _endDate = end_Date; if (_endDate == null) { _endDate = MUOMConversion.GetEndDate(_ctx, _startDate, _C_UOM_ID, qty); } log.Fine("- EndDate=" + _endDate); // Resource Unavailability ------------------------------------------- // log.fine( "- Unavailability -"); String sql = "SELECT Description, DateFrom, DateTo " + "FROM S_ResourceUnavailable " + "WHERE S_Resource_ID=@1" // #1 + " AND DateTo >= @2" // #2 start + " AND DateFrom <= @3" // #3 end + " AND IsActive='Y'"; IDataReader dr = null; System.Data.SqlClient.SqlParameter[] param = null; try { // log.fine( sql, "ID=" + S_Resource_ID + ", Start=" + m_startDate + ", End=" + m_endDate); param = new System.Data.SqlClient.SqlParameter[3]; param[0] = new System.Data.SqlClient.SqlParameter("@1", _S_Resource_ID); param[1] = new System.Data.SqlClient.SqlParameter("@2", _startDate); param[2] = new System.Data.SqlClient.SqlParameter("@3", _endDate); dr = DataBase.DB.ExecuteReader(sql, param, trxName); while (dr.Read()) { ma = new MAssignmentSlot(TimeUtil.GetDay(dr.GetDateTime(1)), TimeUtil.GetNextDay(dr.GetDateTime(2)), // user entered date need to convert to not including end time Msg.GetMsg(_ctx, "ResourceUnAvailable"), dr.GetString(1), MAssignmentSlot.STATUS_UnAvailable); // log.fine( "- Unavailable", ma); if (getAll) { CreateDaySlot(list, ma); } else { list.Add(ma); } } dr.Close(); dr = null; param = null; } catch (Exception e) { if (dr != null) { dr.Close(); } dr = null; param = null; log.Log(Level.SEVERE, sql, e); ma = new MAssignmentSlot(EARLIEST, LATEST, Msg.GetMsg(_ctx, "ResourceUnAvailable"), e.ToString(), MAssignmentSlot.STATUS_UnAvailable); } if (ma != null && !getAll) { return new MAssignmentSlot[] { ma } } ; // NonBusinessDay ---------------------------------------------------- // log.fine( "- NonBusinessDay -"); // "WHERE TRUNC(Date1) BETWEEN TRUNC(?) AND TRUNC(?)" causes // ORA-00932: inconsistent datatypes: expected NUMBER got TIMESTAMP sql = MRole.GetDefault(_ctx, false).AddAccessSQL( "SELECT Name, Date1 FROM C_NonBusinessDay " + "WHERE TRUNC(Date1,'DD') BETWEEN @1 AND @2", "C_NonBusinessDay", false, false); // not qualified - RO try { DateTime?startDay = TimeUtil.GetDay(_startDate); DateTime?endDay = TimeUtil.GetDay(_endDate); // log.fine( sql, "Start=" + startDay + ", End=" + endDay); param = new System.Data.SqlClient.SqlParameter[2]; param[0] = new System.Data.SqlClient.SqlParameter("@1", startDay); param[1] = new System.Data.SqlClient.SqlParameter("@2", endDay); dr = DataBase.DB.ExecuteReader(sql, param, trxName); while (dr.Read()) { ma = new MAssignmentSlot(TimeUtil.GetDay(dr.GetDateTime(1)), TimeUtil.GetNextDay(dr.GetDateTime(1)), // user entered date need to convert to not including end time Msg.GetMsg(_ctx, "NonBusinessDay"), dr.GetString(0), MAssignmentSlot.STATUS_NonBusinessDay); log.Finer("- NonBusinessDay " + ma); list.Add(ma); } dr.Close(); dr = null; param = null; } catch (Exception e) { if (dr != null) { dr.Close(); dr = null; } param = null; log.Log(Level.SEVERE, sql, e); ma = new MAssignmentSlot(EARLIEST, LATEST, Msg.GetMsg(_ctx, "NonBusinessDay"), e.ToString(), MAssignmentSlot.STATUS_NonBusinessDay); } if (ma != null && !getAll) { return new MAssignmentSlot[] { ma } } ; // ResourceType Available -------------------------------------------- // log.fine( "- ResourceTypeAvailability -"); sql = "SELECT Name, IsTimeSlot,TimeSlotStart,TimeSlotEnd, " // 1..4 + "IsDateSlot,OnMonday,OnTuesday,OnWednesday," // 5..8 + "OnThursday,OnFriday,OnSaturday,OnSunday " // 9..12 + "FROM S_ResourceType " + "WHERE S_ResourceType_ID=@1"; try { param = new System.Data.SqlClient.SqlParameter[1]; param[0] = new System.Data.SqlClient.SqlParameter("@1", _S_ResourceType_ID); dr = DataBase.DB.ExecuteReader(sql, param, trxName); if (dr.Read()) { _typeName = dr.GetString(0); // TimeSlot if ("Y".Equals(dr.GetString(1))) { _slotStartTime = TimeUtil.GetDayTime(_startDate, dr.GetDateTime(2)); _slotEndTime = TimeUtil.GetDayTime(_endDate, dr.GetDateTime(3)); if (TimeUtil.InRange(_startDate, _endDate, _slotStartTime, _slotEndTime)) { ma = new MAssignmentSlot(_slotStartTime, _slotEndTime, Msg.GetMsg(_ctx, "ResourceNotInSlotTime"), _typeName, MAssignmentSlot.STATUS_NotInSlotTime); if (getAll) { CreateTimeSlot(list, dr.GetDateTime(2), dr.GetDateTime(3)); } } } // TimeSlot // DaySlot if ("Y".Equals(dr.GetString(4))) { if (TimeUtil.InRange(_startDate, _endDate, "Y".Equals(dr.GetString(5)), "Y".Equals(dr.GetString(6)), // Mo..Tu "Y".Equals(dr.GetString(7)), "Y".Equals(dr.GetString(8)), "Y".Equals(dr.GetString(9)), // We..Fr "Y".Equals(dr.GetString(10)), "Y".Equals(dr.GetString(11)))) { ma = new MAssignmentSlot(_startDate, _endDate, Msg.GetMsg(_ctx, "ResourceNotInSlotDay"), _typeName, MAssignmentSlot.STATUS_NotInSlotDay); if (getAll) { CreateDaySlot(list, "Y".Equals(dr.GetString(5)), "Y".Equals(dr.GetString(6)), // Mo..Tu "Y".Equals(dr.GetString(7)), "Y".Equals(dr.GetString(8)), "Y".Equals(dr.GetString(9)), // We..Fr "Y".Equals(dr.GetString(10)), "Y".Equals(dr.GetString(11))); } } } // DaySlot } dr.Close(); dr = null; param = null; } catch (Exception e) { if (dr != null) { dr.Close(); dr = null; } param = null; log.Log(Level.SEVERE, sql, e); ma = new MAssignmentSlot(EARLIEST, LATEST, Msg.GetMsg(_ctx, "ResourceNotInSlotDay"), e.ToString(), MAssignmentSlot.STATUS_NonBusinessDay); } if (ma != null && !getAll) { return new MAssignmentSlot[] { ma } } ; // Assignments ------------------------------------------------------- sql = "SELECT S_ResourceAssignment_ID " + "FROM S_ResourceAssignment " + "WHERE S_Resource_ID=@1" // #1 + " AND AssignDateTo >= @2" // #2 start + " AND AssignDateFrom <= @3" // #3 end + " AND IsActive='Y'"; try { param = new System.Data.SqlClient.SqlParameter[3]; param[0] = new System.Data.SqlClient.SqlParameter("@1", _S_Resource_ID); param[1] = new System.Data.SqlClient.SqlParameter("@2", _startDate); param[2] = new System.Data.SqlClient.SqlParameter("@3", _endDate); dr = DataBase.DB.ExecuteReader(sql, param, trxName); while (dr.Read()) { MResourceAssignment mAssignment = new MResourceAssignment(_ctx, Utility.Util.GetValueOfInt(dr[0]), trxName); ma = new MAssignmentSlot(mAssignment); if (!getAll) { break; } list.Add(ma); } dr.Close(); dr = null; } catch (Exception e) { log.Log(Level.SEVERE, sql, e); ma = new MAssignmentSlot(EARLIEST, LATEST, Msg.Translate(_ctx, "S_R"), e.ToString(), MAssignmentSlot.STATUS_NotConfirmed); } if (ma != null && !getAll) { return new MAssignmentSlot[] { ma } } ; /*********************************************************************/ // fill m_timeSlots (required for layout) CreateTimeSlots(); // Clean list - date range List <MAssignmentSlot> clean = new List <MAssignmentSlot>(list.Count); for (int i = 0; i < list.Count; i++) { MAssignmentSlot mas = (MAssignmentSlot)list[i]; if ((mas.GetStartTime().Equals(_startDate) || mas.GetStartTime() > _startDate) && (mas.GetEndTime().Equals(_endDate)) || mas.GetEndTime() < _endDate) { clean.Add(mas); } } // Delete Unavailability TimeSlots when all day assigments exist MAssignmentSlot[] sorted = new MAssignmentSlot[clean.Count]; sorted = clean.ToArray(); Array.Sort(sorted); // sorted by start/end date list.Clear(); // used as day list clean.Clear(); // cleaned days DateTime?sortedDay = null; for (int i = 0; i < sorted.Length; i++) { if (sortedDay == null) { sortedDay = TimeUtil.GetDay(sorted[i].GetStartTime()); } if (sortedDay.Equals(TimeUtil.GetDay(sorted[i].GetStartTime()))) { list.Add(sorted[i]); } else { // process info list -> clean LayoutSlots(list, clean); // prepare next list.Clear(); list.Add(sorted[i]); sortedDay = TimeUtil.GetDay(sorted[i].GetStartTime()); } } // process info list -> clean LayoutSlots(list, clean); // Return MAssignmentSlot[] retValue = new MAssignmentSlot[clean.Count]; retValue = clean.ToArray(); Array.Sort(retValue); // sorted by start/end date return(retValue); } // getAssignmentSlots
/// <summary> /// Get Product Conversions (cached) /// </summary> /// <param name="ctx"></param> /// <param name="M_Product_ID"></param> /// <returns>array of conversions</returns> public static MUOMConversion[] GetProductConversions(Ctx ctx, int M_Product_ID) { if (M_Product_ID == 0) { return(new MUOMConversion[0]); } int key = M_Product_ID; MUOMConversion[] result = (MUOMConversion[])_conversionProduct[key]; if (result != null) { return(result); } List <MUOMConversion> list = new List <MUOMConversion>(); // String sql = "SELECT * FROM C_UOM_Conversion c " + "WHERE c.M_Product_ID=" + M_Product_ID + " AND EXISTS (SELECT * FROM M_Product p " + "WHERE c.M_Product_ID=p.M_Product_ID AND c.C_UOM_ID=p.C_UOM_ID)" + " AND c.IsActive='Y'"; DataTable dt = null; IDataReader idr = null; DataTable dt1 = null; IDataReader idr1 = null; try { idr = DB.ExecuteReader(sql, null, null); dt = new DataTable(); dt.Load(idr); idr.Close(); foreach (DataRow dr in dt.Rows) { list.Add(new MUOMConversion(ctx, dr, null)); } if (list.Count == 0) { sql = "SELECT * FROM C_UOM_Conversion c " + "WHERE EXISTS (SELECT * FROM M_Product p " + "WHERE c.C_UOM_ID=p.C_UOM_ID AND p.M_Product_ID=" + M_Product_ID + ")" + " AND c.IsActive='Y'"; idr1 = DB.ExecuteReader(sql, null, null); dt1 = new DataTable(); dt1.Load(idr1); idr1.Close(); foreach (DataRow dr1 in dt1.Rows) { list.Add(new MUOMConversion(ctx, dr1, null)); } } } catch (Exception e) { if (idr != null) { idr.Close(); idr = null; } if (idr1 != null) { idr1.Close(); idr1 = null; } _log.Log(Level.SEVERE, sql, e); } finally { if (idr != null) { idr.Close(); idr = null; } if (idr1 != null) { idr1.Close(); idr1 = null; } dt = null; dt1 = null; } // Add default conversion if (list.Count == 0) { MUOMConversion defRate = new MUOMConversion(MProduct.Get(ctx, M_Product_ID)); list.Add(defRate); } // Convert & save result = new MUOMConversion[list.Count]; result = list.ToArray(); _conversionProduct.Add(key, result); _log.Fine("GetProductConversions - M_Product_ID=" + M_Product_ID + " #" + result.Length); return(result); }
/** * Set Qty * @param windowNo window * @param columnName column */ private void SetQty(int windowNo, String columnName) { int M_Product_ID = GetM_Product_ID(); log.Log(Level.WARNING, "qty - init - M_Product_ID=" + M_Product_ID); Decimal MovementQty, QtyEntered; int C_UOM_To_ID = GetC_UOM_ID(); // No Product if (M_Product_ID == 0) { QtyEntered = GetQtyEntered(); SetMovementQty(QtyEntered); } // UOM Changed - convert from Entered -> Product else if (columnName.Equals("C_UOM_ID")) { QtyEntered = GetQtyEntered(); //Decimal QtyEntered1 = QtyEntered.setScale(MUOM.GetPrecision(GetCtx(), C_UOM_To_ID), Decimal.ROUND_HALF_UP); Decimal QtyEntered1 = Decimal.Round(QtyEntered, MUOM.GetPrecision(GetCtx(), C_UOM_To_ID), MidpointRounding.AwayFromZero); if (QtyEntered.CompareTo(QtyEntered1) != 0) { log.Fine("Corrected QtyEntered Scale UOM=" + C_UOM_To_ID + "; QtyEntered=" + QtyEntered + "->" + QtyEntered1); QtyEntered = QtyEntered1; SetQtyEntered(QtyEntered); } MovementQty = (Decimal)MUOMConversion.ConvertProductFrom(GetCtx(), M_Product_ID, C_UOM_To_ID, QtyEntered); if (MovementQty == null) { MovementQty = QtyEntered; } bool conversion = QtyEntered.CompareTo(MovementQty) != 0; log.Fine("UOM=" + C_UOM_To_ID + ", QtyEntered=" + QtyEntered + " -> " + conversion + " MovementQty=" + MovementQty); //p_changeVO.setContext(getCtx(), windowNo, "UOMConversion", conversion); SetMovementQty(MovementQty); } // No UOM defined else if (C_UOM_To_ID == 0) { QtyEntered = GetQtyEntered(); SetMovementQty(QtyEntered); } // QtyEntered changed - calculate MovementQty else if (columnName.Equals("QtyEntered")) { QtyEntered = GetQtyEntered(); Decimal QtyEntered1 = Decimal.Round(QtyEntered, MUOM.GetPrecision(GetCtx(), C_UOM_To_ID), MidpointRounding.AwayFromZero); if (QtyEntered.CompareTo(QtyEntered1) != 0) { log.Fine("Corrected QtyEntered Scale UOM=" + C_UOM_To_ID + "; QtyEntered=" + QtyEntered + "->" + QtyEntered1); QtyEntered = QtyEntered1; SetQtyEntered(QtyEntered); } MovementQty = (Decimal)MUOMConversion.ConvertProductFrom(GetCtx(), M_Product_ID, C_UOM_To_ID, QtyEntered); if (MovementQty == null) { MovementQty = QtyEntered; } bool conversion = QtyEntered.CompareTo(MovementQty) != 0; log.Fine("UOM=" + C_UOM_To_ID + ", QtyEntered=" + QtyEntered + " -> " + conversion + " MovementQty=" + MovementQty); //p_changeVO.setContext(getCtx(), windowNo, "UOMConversion", conversion); SetMovementQty(MovementQty); } // MovementQty changed - calculate QtyEntered (should not happen) else if (columnName.Equals("MovementQty")) { MovementQty = GetMovementQty(); int precision = MProduct.Get(GetCtx(), M_Product_ID).GetUOMPrecision(); //Decimal MovementQty1 = MovementQty.setScale(precision, Decimal.ROUND_HALF_UP); Decimal MovementQty1 = Decimal.Round(MovementQty, precision, MidpointRounding.AwayFromZero);// Env.Scale(MovementQty); if (MovementQty.CompareTo(MovementQty1) != 0) { log.Fine("Corrected MovementQty " + MovementQty + "->" + MovementQty1); MovementQty = MovementQty1; SetMovementQty(MovementQty); } QtyEntered = (Decimal)MUOMConversion.ConvertProductTo(GetCtx(), M_Product_ID, C_UOM_To_ID, MovementQty); if (QtyEntered == null) { QtyEntered = MovementQty; } bool conversion = MovementQty.CompareTo(QtyEntered) != 0; log.Fine("UOM=" + C_UOM_To_ID + ", MovementQty=" + MovementQty + " -> " + conversion + " QtyEntered=" + QtyEntered); //p_changeVO.setContext(getCtx(), windowNo, "UOMConversion", conversion); SetQtyEntered(QtyEntered); } // RMA : Check qty returned is more than qty shipped bool IsReturnTrx = GetParent().IsReturnTrx(); if (M_Product_ID != 0 && IsReturnTrx) { int oLine_ID = GetC_OrderLine_ID(); MOrderLine oLine = new MOrderLine(GetCtx(), oLine_ID, null); if (oLine.Get_ID() != 0) { int orig_IOLine_ID = oLine.GetOrig_InOutLine_ID(); if (orig_IOLine_ID != 0) { MInOutLine orig_IOLine = new MInOutLine(GetCtx(), orig_IOLine_ID, null); Decimal shippedQty = orig_IOLine.GetMovementQty(); MovementQty = GetMovementQty(); if (shippedQty.CompareTo(MovementQty) < 0) { if (GetCtx().IsSOTrx(windowNo)) { // p_changeVO.addError(Msg.getMsg(getCtx(), "QtyShippedLessThanQtyReturned", shippedQty)); } else { // p_changeVO.addError(Msg.getMsg(getCtx(), "QtyReceivedLessThanQtyReturned", shippedQty)); } SetMovementQty(shippedQty); MovementQty = shippedQty; QtyEntered = (Decimal)MUOMConversion.ConvertProductTo(GetCtx(), M_Product_ID, C_UOM_To_ID, MovementQty); if (QtyEntered == null) { QtyEntered = MovementQty; } SetQtyEntered(QtyEntered); log.Fine("QtyEntered : " + QtyEntered.ToString() + "MovementQty : " + MovementQty.ToString()); } } } } }