Files

284 lines
11 KiB
C#

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<String> GetLocationQueryFilter(SbmLocation.Params prm);
public abstract long GetLocationCount(SbmLocation.Params prm);
public abstract List<SbmLocation> GetLocationList(SbmLocation.Params prm);
public abstract DbResultSet ExecuteLocationQuery(List<ColumnDfn> columns, SbmLocation.Params prm);
//-------------------------------------------------------------------
// D a t a V a l u e s
//-------------------------------------------------------------------
/// <summary>
/// Extract and format result set data value where specific handling is required.
/// <para>Where response is an invalid data value, format value using column.FormatValue(values).</para>
/// </summary>
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;
}
//-------------------------------------------------------------------
}
//=======================================================================
}