using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr { //======================================================================= // Stock manager - Locations. //======================================================================= partial class SbmStockMgr { //------------------------------------------------------------------- // Utilities. // Associated data. public abstract bool LocationHasMovements(SysId locationId); public abstract bool LocationHasStockLevels(SysId locationId); //------------------------------------------------------------------- // Default Stock Locations. public SysId GetDefaultSalesStockLocation() { ClearErrorState(); SysId salesLocationId = SessionConsole.GetOwnerOption_StockLocation(Sbm.OrgOption_StockLocation.SalesOrderDefault); if (SysId.IsValid(salesLocationId)) { // Check that this location is valid for sales stock. SbmLocation location = GetLocationById(salesLocationId); if (location != null) { /*if (!location.SalesStock || location.Status != SaStatus.Active) //salesLocationId.SetInvalid();*/ } else SysId.IsValid(salesLocationId); } if (!SysId.IsValid(salesLocationId)) { // Use another location manager to ensure that this one is not interferred with. if (StockMgr != null) { // Identify the first created sales location: SbmLocation.Params prmLocation = new SbmLocation.Params(); prmLocation.LocationCategory = Sbm.LocationCategory.Stock; prmLocation.RestrictToSalesStock = true; prmLocation.StatusCat = SbmLocation.StatusCat.ActiveOnly; foreach (SbmLocation location in StockMgr.GetLocationList(prmLocation)) { if (location == null) break; if (location.SalesStock /*&& location.Status == SaStatus.Active*/) { if (!SysId.IsValid(salesLocationId) /*|| salesLocationId > location.Id*/) salesLocationId = location.Id; } } } } return salesLocationId; } public SysId GetDefaultPurchaseStockLocation() { ClearErrorState(); SysId purchaseLocationId = SessionConsole.GetOwnerOption_StockLocation(Sbm.OrgOption_StockLocation.PurchaseOrderDefault); if (SysId.IsValid(purchaseLocationId)) { purchaseLocationId = GetDefaultSalesStockLocation(); } return purchaseLocationId; } //------------------------------------------------------------------- // Retrieve individual locations. //------------------------------------------------------------------- // Item exists. public bool LocationExistsById(SysId locationId) { ClearErrorState(); if (!SysId.IsValid(locationId)) return false; SbmLocation.Params prmLocation = new SbmLocation.Params(); prmLocation.IdsIncluded.Add(locationId); prmLocation.StatusCat = SbmLocation.StatusCat.Any; return GetLocationCount(prmLocation) == 1; } public bool LocationExistsByCode(Sbm.LocationCategory locationCategory, String code) { ClearErrorState(); if ((int)locationCategory > 1 && StringUtil.IsEmpty(code)) return false; SbmLocation.Params prmLocation = new SbmLocation.Params(); prmLocation.LocationCategory = locationCategory; prmLocation.Code = code; prmLocation.StatusCat = SbmLocation.StatusCat.Any; return GetLocationCount(prmLocation) == 1; } //------------------------------------------------------------------- // Get Item. public abstract SbmLocation GetLocation(SbmLocation.Params prm); public SbmLocation GetLocationById(SysId locationId) { ClearErrorState(); if (!SysId.IsValid(locationId)) return null; SbmLocation.Params prmLocation = new SbmLocation.Params(); prmLocation.IdsIncluded.Add(locationId); prmLocation.StatusCat = SbmLocation.StatusCat.Any; return GetLocation(prmLocation); } public SbmLocation GetLocationByCode(Sbm.LocationCategory locationCategory, String code) { ClearErrorState(); if ((int)locationCategory > 1 && StringUtil.IsEmpty(code)) return null; SbmLocation.Params prmLocation = new SbmLocation.Params(); prmLocation.LocationCategory = locationCategory; prmLocation.Code = code; prmLocation.StatusCat = SbmLocation.StatusCat.Any; return GetLocation(prmLocation); } //------------------------------------------------------------------- // Create locations. public abstract SbmLocation CreateLocation(Sbm.LocationCategory locationCategory); //------------------------------------------------------------------- // Validate Location data. public bool IsValidLocation(SbmLocation location) { ClearErrorState(); if (location == null) return SetErrorState(ErrorMessage.ItemNotSpecified); return IsValidLocationData(location.GetData(), new SbmLocation.ErrField()); } public virtual bool IsValidLocationData(SbmLocation.Data data, SbmLocation.ErrField errField) { ClearErrorState(); // Validate the identity. if (errField.AffiliateIdOwner != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.AffiliateIdOwner)) { errField.AffiliateIdOwner = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("invalid owner"); } if (errField.LocationCategory != SacsHierarchyItem.ValidValue.Ignore && (int)data.LocationCategory < 1) { errField.LocationCategory = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("invalid category"); } // Validate the text attributes. if (errField.Code != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Code, "code", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Location_Code), true)) { errField.Code = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Name != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Name, "name", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Location_Name), true)) { errField.Name = SacsHierarchyItem.ValidValue.Invalid; return false; } // Common properties. if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Location_Notes))) { errField.Notes = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Status != SacsHierarchyItem.ValidValue.Ignore) { if (!IsValidValue(data.StatusCode, "status", (long)Internals.GetColTextLen(SbmDbDfn.ColumnIdx.Location_Status), true, true)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!SbmLocation.LocationStatuses.Contains(data.Status)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.InvalidStatus); } } return true; } //------------------------------------------------------------------- // Location database interface. public abstract bool InsertLocation(SbmLocation location, DbUpdateInfo dbUpdateInfo); public abstract bool UpdateLocation(SbmLocation location, DbUpdateInfo dbUpdateInfo); public virtual bool LocationCanBeDeleted(SbmLocation location) { ClearErrorState(); return true; } public abstract bool DeleteLocation(SbmLocation location, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- // Location list. public abstract ColumnDfn GetLocationColumnDfn(SbmLocation.Column columnId, String caption = "", int width = 0); public abstract List GetLocationQueryFilter(SbmLocation.Params prm); public abstract long GetLocationCount(SbmLocation.Params prm); public abstract List GetLocationList(SbmLocation.Params prm); public abstract DbResultSet ExecuteLocationQuery(List columns, SbmLocation.Params prm); //------------------------------------------------------------------- // D a t a V a l u e s //------------------------------------------------------------------- /// /// Extract and format result set data value where specific handling is required. /// Where response is an invalid data value, format value using column.FormatValue(values). /// public DataValue GetLocationDataValue(ColumnDfn column, NamedValue.Map values) { DataValue value = new DataValue(); switch ((SbmLocation.Column)column.Id) { //----------------------------------------------------------- // Location CategoryDesc. case SbmLocation.Column.Category_Desc: { Sbm.LocationCategory locationCategory = (Sbm.LocationCategory)values.GetValue(column.DataName).AsLong(); value = new DataValue(LocationCategories.GetDescForType(locationCategory, ((int)locationCategory).ToString())); break; } //----------------------------------------------------------- // Notes. case SbmLocation.Column.Notes: value = new DataValue(SacsHierarchyItem.FormatForDisplay(values.GetValue(column.DataName).ToString(), 200)); break; // Status. case SbmLocation.Column.Status_Desc: case SbmLocation.Column.Status_Ind: { String statusCode = values.GetValue(column.DataName).ToString(); SaStatus status = SacsSystem.GetStatusForCode(statusCode); if (column.Id == (int)SbmLocation.Column.Status_Desc) value = new DataValue(SacsSystem.GetStatusDescForCode(statusCode)); else if (column.Id == (int)SbmLocation.Column.Status_Ind) value = new DataValue(SbmLocation.GetStatusTriState(status)); break; } //----------------------------------------------------------- // Flags. case SbmLocation.Column.SalesStock_Y: case SbmLocation.Column.SalesStock_Tick: { ushort flags = (ushort)StringUtil.ToInt(values.GetValue(column.DataName).ToString()); bool salesStock = SacsHierarchyItem.GetFlag(flags, SbmLocation.Flag_SalesStock); if (column.Id == (int)SbmLocation.Column.SalesStock_Y) value = new DataValue(salesStock ? "Y" : ""); else value = new DataValue(salesStock); break; } case SbmLocation.Column.CalculateStock_Y: case SbmLocation.Column.CalculateStock_Tick: { ushort flags = (ushort)StringUtil.ToInt(values.GetValue(column.DataName).ToString()); bool calculateStock = SacsHierarchyItem.GetFlag(flags, SbmLocation.Flag_CalculateStock); if (column.Id == (int)SbmLocation.Column.CalculateStock_Y) value = new DataValue(calculateStock ? "Y" : ""); else value = new DataValue(calculateStock); break; } //----------------------------------------------------------- default: value = values.GetValue(column.DataName); break; } return value; } //------------------------------------------------------------------- } //======================================================================= }