Files
ayanova7/source/bizobjects/AyaLib/GZTW.AyaNova.BLL/WorkorderItemLabor.cs
2018-06-29 19:47:36 +00:00

1031 lines
30 KiB
C#

///////////////////////////////////////////////////////////
// WorkorderItemLabor.cs
// Implementation of Class WorkorderItemLabor
// CSLA type: Editable Child
// Created on: 07-Jun-2004 8:41:48 AM
// Object design: Joyce
// Coded: John 21-July-2004
///////////////////////////////////////////////////////////
using System;
using System.Data;
using CSLA.Data;
using GZTW.Data;
using CSLA;
using System.Threading;
using CSLA.Security;
namespace GZTW.AyaNova.BLL
{
/// <summary>
/// Labor object for <see cref="WorkorderItem"/> object's <see cref="WorkorderItemLabors"/> collection
/// </summary>
[Serializable]
public class WorkorderItemLabor : BusinessBase {
#region Attributes
private bool bReadOnly;
private Guid mID;
private SmartDate mCreated;
private SmartDate mModified;
private Guid mCreator;
private Guid mModifier;
private Guid mWorkorderItemID;
private Guid mUserID;
private SmartDate mServiceStartDate;
private SmartDate mServiceStopDate;
private Guid mServiceRateID;
private string mServiceDetails="";
private decimal mServiceRateQuantity;
private decimal mNoChargeQuantity;
//------------------
private Guid mServiceBankID;
private Guid mTaxRateSaleID;
#endregion
#region Constructor
/// <summary>
/// Private constructor to prevent direct instantiation
/// </summary>
private WorkorderItemLabor()
{
//Set to read / write initially so that properties
//can be set
bReadOnly=false;
//Child object
MarkAsChild();
//New ID
mID = Guid.NewGuid();
if (AyaBizUtils.GlobalSettings.LaborSchedUserDfltTimeSpan > 0)//case 816
{
mServiceStartDate = new SmartDate(DBUtil.CurrentWorkingDateTime);
mServiceStopDate = new SmartDate(DBUtil.CurrentWorkingDateTime.AddMinutes(AyaBizUtils.GlobalSettings.LaborSchedUserDfltTimeSpan));
mServiceRateQuantity = (decimal)(mServiceStopDate.Date - mServiceStartDate.Date).TotalHours;
}
else
{
mServiceStartDate = new SmartDate();
mServiceStopDate = new SmartDate();
}
//Set record history to defaults
mCreated = new SmartDate(DBUtil.CurrentWorkingDateTime);
mModified=new SmartDate();
mCreator=Guid.Empty;
mModifier=Guid.Empty;
mServiceBankID=Guid.Empty;
mTaxRateSaleID=AyaBizUtils.GlobalSettings.TaxRateSaleID;
}
#endregion
#region Business properties
/// <summary>
/// Applies this labor entry to service bank
/// and sets ServiceBankID
/// </summary>
/// <param name="tid">Populate TypeAndID object (the client or unit or headoffice)</param>
/// <param name="ServiceRate">Rate currency per unit for banked currency calcs</param>
/// <param name="Description">Descriptive text to enter in service bank
/// (255 char - the localized text length of O.WorkorderItemLabor which is inserted automatically before description)</param>
public void ApplyToServiceBank(TypeAndID tid, decimal ServiceRate, string Description)
{
if(mServiceBankID!=Guid.Empty)
throw new System.ApplicationException
(LocalizedTextTable.GetLocalizedTextDirect("WorkorderItemLabor.Label.UI.ReBankWarning"));
ServiceBank s = ServiceBank.NewItem();
s.AppliesToRootObjectID=tid.ID;
s.AppliesToRootObjectType=tid.RootObjectType;
s.Currency=-(ServiceRate*this.mServiceRateQuantity);
s.Incidents=-1;
s.Hours=-(this.mServiceRateQuantity);
s.Description=LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderItemLabor") + " ("+Description+")";
s.EffectiveDate=this.mServiceStopDate.DBValue;
s.SourceRootObjectID=this.ID;
s.SourceRootObjectType=RootObjectTypes.WorkorderItemLabor;
s.Save();
mServiceBankID=s.ID;
MarkDirty();
}
//case 1975
/// <summary>
/// Determines automaticaly the most correct service rate and
/// the most correct object's bank to apply this
/// labor entry to and does so.
///
/// NOTE: silently returns regardless if banking was done or
/// if nothing to bank or no bankable object is found or there is already a service bank ID set
/// (there is no exception thrown in these logical non-bankable conditions)
///
/// Callers who need to confirm can check ServiceBankID after this method call which
/// will be set if bank entry was made otherwise it will remain Guid.Empty
/// </summary>
/// <param name="w">Parent workorder (required for autodiscovery of bank and rate)</param>
public void ApplyToServiceBankAuto(Workorder w)
{
TypeAndID bankableObject = w.BankableResolved(mWorkorderItemID);
if (bankableObject == null || bankableObject.RootObjectType == RootObjectTypes.Nothing)
return;
if (mServiceRateID == Guid.Empty) return;
if (mServiceRateQuantity == 0) return;
if (mServiceBankID != Guid.Empty) return;
RatePickList.RatePickListInfo theRate = RatePickList.GetListOfOneSpecificRate(mServiceRateID)[0];
decimal dCharge = theRate.Charge;
//case 1190
//Check if already banked
Guid gPriorBank = ServiceBankCheckAlreadyBanked.GetBankID(mID, RootObjectTypes.WorkorderItemLabor);
if (gPriorBank != Guid.Empty)
{
//case 1189 flag the labor record
ApplyServiceBankID(gPriorBank);
}
else
ApplyToServiceBank(bankableObject, dCharge, LocalizedTextTable.GetLocalizedTextDirect("O.Workorder") + " " + w.WorkorderService.ServiceNumber.ToString());
}
//case 1189
/// <summary>
/// Used to resolve an issue that can arise when a user applys to service bank but then doesn't save workorder
/// Won't actually bank because it's already banked but will tag this record with the correct
/// service bank ID from the prior banking
///
/// ID is retrieve by using the methods in ServiceBankCheckAlreadyBanked class
/// </summary>
/// <param name="serviceBankID"></param>
public void ApplyServiceBankID(Guid serviceBankID)
{
if (mServiceBankID != serviceBankID)
{
mServiceBankID = serviceBankID;
MarkDirty();
}
}
/// <summary>
/// UI convenience property (read only)
/// </summary>
public bool IsBanked
{
get {
return mServiceBankID != Guid.Empty;
}
}
/// <summary>
/// ID of service bank record created from this labor record
/// Is set when apply service bank is called
/// </summary>
public Guid ServiceBankID
{
get
{
return mServiceBankID;
}
}
/// <summary>
/// Get internal id number Read only property because it's set internally, not
/// externally
/// </summary>
public Guid ID
{
get
{
return mID;
}
}
/// <summary>
/// Get created date
///
///
/// </summary>
public string Created
{
get
{
return mCreated.ToString();
}
}
/// <summary>
/// Get modified date
///
///
/// </summary>
public string Modified
{
get
{
return mModified.ToString();
}
}
/// <summary>
/// Get user record ID of person who created this record
///
///
/// </summary>
public Guid Creator
{
get
{
return mCreator;
}
}
/// <summary>
/// Get user ID of person who modified this record
///
///
/// </summary>
public Guid Modifier
{
get
{
return mModifier;
}
}
/// <summary>
///<see cref="User"/> who performed the labor
/// </summary>
public Guid UserID
{
get
{
return mUserID;
}
set
{
if(bReadOnly)
ThrowSetError();
else
{
if(mUserID!=value)
{
mUserID = value;
MarkDirty();
}
}
}
}
/// <summary>
/// Quantity to be billed
/// </summary>
public decimal ServiceRateQuantity
{
get
{
return mServiceRateQuantity;
}
set
{
if(bReadOnly)
ThrowSetError();
else
{
if(mServiceRateQuantity!=value)
{
mServiceRateQuantity = value;
MarkDirty();
}
}
}
}
/// <summary>
/// Free quantity for tracking and reporting purposes
/// </summary>
public decimal NoChargeQuantity
{
get
{
return mNoChargeQuantity;
}
set
{
if(bReadOnly)
ThrowSetError();
else
{
if(mNoChargeQuantity!=value)
{
mNoChargeQuantity = value;
MarkDirty();
}
}
}
}
/// <summary>
/// Start date / time of service (DBValue)
/// </summary>
public object ServiceStartDate
{
get
{
return mServiceStartDate.DBValue;
}
set
{
if(bReadOnly)
ThrowSetError();
else
{
if (!AyaBizUtils.SmartDateEquals(mServiceStartDate, value)) //Case 298
{
mServiceStartDate.DBValue = value;
//autocomplete time
if (!mServiceStartDate.IsEmpty && mServiceStopDate.IsEmpty && (AyaBizUtils.GlobalSettings.LaborSchedUserDfltTimeSpan != 0))
mServiceStopDate.Date = mServiceStartDate.Date.AddMinutes(AyaBizUtils.GlobalSettings.LaborSchedUserDfltTimeSpan);//case 816
//not empty Start date is not valid without stop date
BrokenRules.Assert("ServiceStopDateRequired","Error.Object.RequiredFieldEmpty,WorkorderItemLabor.Label.ServiceStopDate","ServiceStartDate",!mServiceStartDate.IsEmpty && mServiceStopDate.IsEmpty);
//Is stop date valid now?
BrokenRules.Assert("ServiceStartDateRequired","Error.Object.RequiredFieldEmpty,WorkorderItemLabor.Label.ServiceStartDate","ServiceStopDate",!mServiceStopDate.IsEmpty && mServiceStartDate.IsEmpty);
if(!mServiceStopDate.IsEmpty&&!mServiceStartDate.IsEmpty)
{
BrokenRules.Assert("ServiceStartDateBeforeStopDate","Error.Object.StartDateAfterEndDate",
"ServiceStartDate",mServiceStartDate.CompareTo(mServiceStopDate)>-1);
}
MarkDirty();
}
}
}
}
/// <summary>
/// End date / time of service (DBValue)
/// </summary>
public object ServiceStopDate
{
get
{
return mServiceStopDate.DBValue;
}
set
{
if(bReadOnly)
ThrowSetError();
else
{
if (!AyaBizUtils.SmartDateEquals(mServiceStopDate, value)) //Case 298
{
mServiceStopDate.DBValue = value;
//autocomplete time
if (!mServiceStopDate.IsEmpty && mServiceStartDate.IsEmpty && (AyaBizUtils.GlobalSettings.LaborSchedUserDfltTimeSpan != 0))
mServiceStartDate.Date = mServiceStopDate.Date.AddMinutes(-AyaBizUtils.GlobalSettings.LaborSchedUserDfltTimeSpan);//case 816
//Not empty Stop date is not valid without start date
BrokenRules.Assert("ServiceStartDateRequired","Error.Object.RequiredFieldEmpty,WorkorderItemLabor.Label.ServiceStartDate","ServiceStopDate",!mServiceStopDate.IsEmpty && mServiceStartDate.IsEmpty);
//Rule needs to be checked here even though it's to do with start date because it can be broken
//there but can only be unbroken here so it needs to be checked in both places...
//Is start date valid now?
BrokenRules.Assert("ServiceStopDateRequired","Error.Object.RequiredFieldEmpty,WorkorderItemLabor.Label.ServiceStopDate","ServiceStartDate",!mServiceStartDate.IsEmpty && mServiceStopDate.IsEmpty);
if(!mServiceStopDate.IsEmpty&&!mServiceStartDate.IsEmpty)
{
//this is working code from scheduled user
//BrokenRules.Assert("StartDateBeforeStopDate", "Error.Object.StartDateAfterEndDate",
// "StartDate", mStartDate.CompareTo(mStopDate) > -1);
//originally it was this before working on case 2013
//BrokenRules.Assert("ServiceStartDateBeforeStopDate","Error.Object.StartDateAfterEndDate,ServiceStartDate",
// mServiceStartDate.CompareTo(mServiceStopDate)>-1);
BrokenRules.Assert("ServiceStartDateBeforeStopDate", "Error.Object.StartDateAfterEndDate","ServiceStartDate",
mServiceStartDate.CompareTo(mServiceStopDate) > -1);
}
MarkDirty();
}
}
}
}
#region PM accessible versions of start and stop date
internal DateTime dtServiceStartDate
{
get
{
return mServiceStartDate.Date;
}
set
{
if(mServiceStartDate.Date!=value)
{
mServiceStartDate.Date = value;
//not empty Start date is not valid without stop date
BrokenRules.Assert("ServiceStopDateRequired","Error.Object.RequiredFieldEmpty,WorkorderItemLabor.Label.ServiceStopDate","ServiceStartDate",!mServiceStartDate.IsEmpty && mServiceStopDate.IsEmpty);
//Is stop date valid now?
BrokenRules.Assert("ServiceStartDateRequired","Error.Object.RequiredFieldEmpty,WorkorderItemLabor.Label.ServiceStartDate","ServiceStopDate",!mServiceStopDate.IsEmpty && mServiceStartDate.IsEmpty);
if(!mServiceStopDate.IsEmpty&&!mServiceStartDate.IsEmpty)
{
BrokenRules.Assert("ServiceStartDateBeforeStopDate","Error.Object.StartDateAfterEndDate",
"ServiceStartDate",mServiceStartDate.CompareTo(mServiceStopDate)>-1);
}
MarkDirty();
}
}
}
internal DateTime dtServiceStopDate
{
get
{
return mServiceStopDate.Date;
}
set
{
if(mServiceStopDate.Date!=value)
{
mServiceStopDate.Date = value;
//Not empty Stop date is not valid without start date
BrokenRules.Assert("ServiceStartDateRequired","Error.Object.RequiredFieldEmpty,WorkorderItemLabor.Label.ServiceStartDate","ServiceStopDate",!mServiceStopDate.IsEmpty && mServiceStartDate.IsEmpty);
//Rule needs to be checked here even though it's to do with start date because it can be broken
//there but can only be unbroken here so it needs to be checked in both places...
//Is start date valid now?
BrokenRules.Assert("ServiceStopDateRequired","Error.Object.RequiredFieldEmpty,WorkorderItemLabor.Label.ServiceStopDate","ServiceStartDate",!mServiceStartDate.IsEmpty && mServiceStopDate.IsEmpty);
if(!mServiceStopDate.IsEmpty&&!mServiceStartDate.IsEmpty)
{
BrokenRules.Assert("ServiceStartDateBeforeStopDate","Error.Object.StartDateAfterEndDate,ServiceStartDate",mServiceStartDate.CompareTo(mServiceStopDate)>-1);
}
MarkDirty();
}
}
}
#endregion pm accessible
/// <summary>
/// ID of <see cref="Rate"/>
/// </summary>
public Guid ServiceRateID
{
get
{
return mServiceRateID;
}
set
{
if(bReadOnly)
ThrowSetError();
else
{
if(mServiceRateID!=value)
{
mServiceRateID = value;
MarkDirty();
}
}
}
}
/// <summary>
/// Details of service performed, prints on reports given to customers
/// </summary>
public string ServiceDetails
{
get
{
return mServiceDetails;
}
set
{
if(bReadOnly)
ThrowSetError();
else
{
if(mServiceDetails!=value)
{
mServiceDetails = value;
MarkDirty();
}
}
}
}
/// <summary>
/// Guid ID of parent <see cref="WorkorderItem"/> object
/// </summary>
public Guid WorkorderItemID
{
get
{
return mWorkorderItemID;
}
// set
// {
// if(bReadOnly)
// ThrowSetError();
// else
// {
// if(mWorkorderItemID!=value)
// {
// mWorkorderItemID = value;
// MarkDirty();
//
// }
// }
// }
}
/// <summary>
/// <see cref="TaxCode"/> ID
/// </summary>
public Guid TaxRateSaleID
{
get
{
return mTaxRateSaleID;
}
set
{
if(bReadOnly)
ThrowSetError();
else
{
if(mTaxRateSaleID!=value)
{
mTaxRateSaleID = value;
MarkDirty();
}
}
}
}
/// <summary>
/// Called by parent collection object
/// when called in turn by workorder object that is read only due to
/// security or closed or service completed
/// </summary>
/// <param name="RO">Either true or the rights allowed for the current user</param>
public void SetReadOnly(bool RO)
{
bReadOnly=RO;
}
/// <summary>
/// Throw an error when a read only user
/// tries to set a property
/// (this should normally never be called unless someone is using the developer api since the UI
/// should prevent it from happening initially)
/// </summary>
private void ThrowSetError()
{
throw new System.Security.SecurityException
(
string.Format
(
LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToChange"),
LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderItemLabor")
)
);
}
#endregion
#region Searching
/// <summary>
/// Returns a search result object based on search terms
/// for the ID specified
/// </summary>
/// <param name="ID"></param>
/// <param name="searchTerms"></param>
/// <returns></returns>
public static SearchResult GetSearchResult(Guid ID, string[]searchTerms)
{
//case 1387
if (Workorder.RightsToWorkorder(WorkorderIDFetcher.GetWorkorderByRelative(RootObjectTypes.WorkorderItemLabor, ID)) < SecurityLevelTypes.ReadOnly)
return new SearchResult();
SearchResult sr=new SearchResult();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
SafeDataReader dr = null;
try
{
//Case 88 changes
//"SELECT aID, aCreator, aModifier, aCreated, aModified, aServiceDetails " +
// "FROM aWorkorderItemLabor WHERE (aID " +
// "= @ID)"
dr=DBUtil.GetReaderFromSQLString(
"SELECT AWORKORDERITEMLABOR.aID, AWORKORDERITEMLABOR.aCreator, " +
" AWORKORDERITEMLABOR.aModifier, AWORKORDERITEMLABOR.aCreated, " +
" AWORKORDERITEMLABOR.aModified, AWORKORDERITEMLABOR.aServiceDetails, " +
"AWORKORDERSERVICE.ASERVICENUMBER, " +
" AWORKORDERQUOTE.AQUOTENUMBER, AWORKORDERPREVENTIVEMAINTENANCE.APREVENTIVEMAINTENANCENUMBER, " +
" ACLIENT.ANAME AS ACLIENTNAME, aClient.aRegionID AS ACLIENTREGION, AWORKORDER.aWorkorderType " +
"FROM AWORKORDERITEMLABOR INNER JOIN AWORKORDERITEM " +
"ON AWORKORDERITEMLABOR.AWORKORDERITEMID = AWORKORDERITEM.AID " +
"LEFT OUTER " +
"JOIN AWORKORDER ON AWORKORDERITEM.AWORKORDERID = " +
"AWORKORDER.AID LEFT OUTER JOIN ACLIENT ON AWORKORDER.ACLIENTID " +
"= ACLIENT.AID LEFT OUTER JOIN AWORKORDERPREVENTIVEMAINTENANCE " +
"ON AWORKORDER.AID = " +
"AWORKORDERPREVENTIVEMAINTENANCE.AWORKORDERID LEFT OUTER JOIN " +
"AWORKORDERQUOTE ON AWORKORDER.AID = AWORKORDERQUOTE.AWORKORDERID " +
"LEFT OUTER JOIN AWORKORDERSERVICE " +
"ON AWORKORDER.AID = AWORKORDERSERVICE.AWORKORDERID " +
"WHERE (AWORKORDERITEMLABOR.aID = @ID)"
,ID);
if(!dr.Read())
return new SearchResult();//DBUtil.ThrowFetchError("SearchResult for WorkorderItemLaborID: " + ID.ToString());
if (!AyaBizUtils.InYourRegion(dr.GetGuid("ACLIENTREGION"))) return new SearchResult();//case 58
//Case 88 parse out workorder type and prepare description field accordingly
WorkorderTypes workorderType = (WorkorderTypes)dr.GetInt16("aWorkorderType");
switch (workorderType)
{
case WorkorderTypes.Service:
sr.Description = LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderService") + " " + dr.GetInt32("aServiceNumber").ToString() + " " + dr.GetString("ACLIENTNAME");
break;
case WorkorderTypes.Quote:
sr.Description = LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderQuote") + " " + dr.GetInt32("AQUOTENUMBER").ToString() + " " + dr.GetString("ACLIENTNAME");
break;
case WorkorderTypes.PreventiveMaintenance:
sr.Description = LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderPreventiveMaintenance") + " " + dr.GetInt32("APREVENTIVEMAINTENANCENUMBER").ToString() + " " + dr.GetString("ACLIENTNAME");
break;
}
// sr.Description="";
sb.Append(dr.GetString("aServiceDetails"));
sr.Created=DBUtil.ToLocal(dr.GetSmartDate("aCreated"));
sr.Modified=DBUtil.ToLocal(dr.GetSmartDate("aModified"));
sr.Creator=dr.GetGuid("aCreator");
sr.Modifier=dr.GetGuid("aModifier");
}
finally
{
if(dr!=null) dr.Close();
}
//Formulate results
ExtractAndRank er = new ExtractAndRank();
er.Process(sb.ToString().Trim(),searchTerms);
sr.Extract=er.Extract;
sr.Rank=er.Ranking;
sr.AncestorRootObjectID=ID;
sr.AncestorRootObjectType=RootObjectTypes.WorkorderItemLabor;
return sr;
}
#endregion
#region System.object overrides
/// <summary>
///
/// </summary>
/// <returns></returns>
public override string ToString()
{
return "WorkorderItemLabor" + mID.ToString();
}
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public override bool Equals(Object obj)
{
if ( obj == null || GetType ( ) != obj.GetType ( ) ) return false;
WorkorderItemLabor c=(WorkorderItemLabor)obj;
return mID==c.mID;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public override int GetHashCode()
{
return ("WorkorderItemLabor"+mID).GetHashCode();
}
#endregion
#region Static methods
/// <summary>
/// New item
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
internal static WorkorderItemLabor NewItem(WorkorderItem obj)
{
//case 1387
if (AyaBizUtils.IsGenerator || ((obj.mHeaderRights > SecurityLevelTypes.ReadOnly) &&
(AyaBizUtils.Right("Object.WorkorderItemLabor") > (int)SecurityLevelTypes.ReadOnly)))
{
WorkorderItemLabor child = new WorkorderItemLabor();
child.mWorkorderItemID=obj.ID;
return child;
}
else
throw new System.Security.SecurityException(
string.Format(
LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToCreate"),
LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderItemLabor")));
}
/// <summary>
/// Get Item
/// </summary>
/// <param name="dr"></param>
/// <param name="obj"></param>
/// <returns></returns>
internal static WorkorderItemLabor GetItem(SafeDataReader dr, WorkorderItem obj)
{
//case 1387
if ((obj.mHeaderRights > SecurityLevelTypes.NoAccess) &&
(AyaBizUtils.Right("Object.WorkorderItemLabor") > (int)SecurityLevelTypes.NoAccess))
{
WorkorderItemLabor child = new WorkorderItemLabor();
child.Fetch(dr);
return child;
}
else
throw new System.Security.SecurityException(
string.Format(
LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToRetrieve"),
LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderItemLabor")));
}
#endregion
#region DAL DATA ACCESS
#region Fetch
/// <summary>
///
/// </summary>
/// <param name="dr"></param>
protected void Fetch(SafeDataReader dr)
{
//Standard fields
mCreated=DBUtil.ToLocal(dr.GetSmartDate("aCreated"));
mModified=DBUtil.ToLocal(dr.GetSmartDate("aModified"));
mCreator=dr.GetGuid("aCreator");
mModifier=dr.GetGuid("aModifier");
mID=dr.GetGuid("aID");
//WorkorderItemLabor fields
mNoChargeQuantity=dr.GetDecimal("aNoChargeQuantity");
mServiceDetails=dr.GetString("aServiceDetails");
mServiceRateID=dr.GetGuid("aServiceRateID");
mServiceRateQuantity=dr.GetDecimal("aServiceRateQuantity");
//Important: use property not internal field
//for properties with rules
mServiceStartDate=DBUtil.ToLocal(dr.GetSmartDate("aServiceStartDate"));
mServiceStopDate=DBUtil.ToLocal(dr.GetSmartDate("aServiceStopDate"));
mUserID=dr.GetGuid("aUserID");
mWorkorderItemID=dr.GetGuid("aWorkorderItemID");
mServiceBankID=dr.GetGuid("aServiceBankID");
mTaxRateSaleID=dr.GetGuid("aTaxRateSaleID");
//Get access rights level
bReadOnly=AyaBizUtils.Right("Object.WorkorderItemLabor")<(int)SecurityLevelTypes.ReadWrite;
MarkOld();
}
#endregion fetch
#region Add / Update
/// <summary>
/// Update child
/// </summary>
/// <param name="obj"></param>
/// <param name="tr"></param>
internal void Update(WorkorderItem obj,IDbTransaction tr)
{
//No need to update if there is nothing changed
if(!this.IsDirty) return;
// If not a new record, check if record was modified
//by another user since original retrieval:
if(!IsNew)
DBUtil.CheckSafeToUpdateInsideTransaction(this.mModified.Date,this.mID,"aWorkorderItemLabor",tr);//case 1960
//DBUtil.CheckSafeToUpdate(this.mModified.Date, this.mID, "aWorkorderItemLabor");//was this before case 1960
#region Delete
if(IsDeleted)
{
if(!IsNew)
{
//Make a reversing entry in the service bank
if(this.mServiceBankID!=Guid.Empty)
ServiceBank.ReverseItem(mServiceBankID,tr);
DBCommandWrapper cmDelete = DBUtil.GetCommandFromSQL("DELETE FROM aWorkorderItemLabor WHERE aID=@ID;");
cmDelete.AddInParameter("@ID",DbType.Guid,this.mID);
DBUtil.DB.ExecuteNonQuery(cmDelete, tr);
DBUtil.RemoveKeywords(tr,RootObjectTypes.WorkorderItemLabor,this.mID);
}
MarkNew();
return;
}
#endregion
#region Add / Update
//get modification time temporarily, if update succeeds then
//set to this time
System.DateTime dtModified = DBUtil.CurrentWorkingDateTime;
DBCommandWrapper cm = null;
if(IsNew)//Add or update?
cm=DBUtil.GetCommandFromSQL(
"INSERT INTO aWorkorderItemLabor (aWorkorderItemID, aID, " +
"aUserID, aServiceStartDate, aServiceStopDate, " +
"aServiceRateID, aServiceDetails, aServiceRateQuantity, " +
"aNoChargeQuantity, aCreated,aModified,aCreator,aModifier, aServiceBankID, aTaxRateSaleID) " +
"VALUES (@WorkorderItemID,@ID,@UserID, " +
"@ServiceStartDate,@ServiceStopDate, @ServiceRateID, " +
"@ServiceDetails,@ServiceRateQuantity,@NoChargeQuantity, " +
"@Created,@Modified,@CurrentUserID,@CurrentUserID,@ServiceBankID,@TaxRateSaleID)"
);
else
cm=DBUtil.GetCommandFromSQL(
"UPDATE aWorkorderItemLabor SET aWorkorderItemID=@WorkorderItemID, " +
"aID=@ID, aUserID=@UserID, aServiceStartDate=@ServiceStartDate, " +
"aServiceStopDate=@ServiceStopDate, " +
"aServiceRateID=@ServiceRateID, aServiceDetails=@ServiceDetails, " +
"aServiceRateQuantity=@ServiceRateQuantity, " +
"aNoChargeQuantity=@NoChargeQuantity, " +
"aModifier=@CurrentUserID, aModified=@Modified, " +
"aServiceBankID=@ServiceBankID, aTaxRateSaleID=@TaxRateSaleID WHERE " +
"aID=@ID"
);
//WorkorderItemLabor specific
cm.AddInParameter("@ID",DbType.Guid,mID);
cm.AddInParameter("@WorkorderItemID",DbType.Guid,mWorkorderItemID);
cm.AddInParameter("@NoChargeQuantity",DbType.Decimal,mNoChargeQuantity);
cm.AddLargeStringInParameter("@ServiceDetails",mServiceDetails);
cm.AddInParameter("@ServiceRateID",DbType.Guid,mServiceRateID);
cm.AddInParameter("@ServiceRateQuantity",DbType.Decimal,mServiceRateQuantity);
cm.AddInParameter("@ServiceStartDate",DbType.DateTime,DBUtil.ToUTC(mServiceStartDate).DBValue);
cm.AddInParameter("@ServiceStopDate",DbType.DateTime,DBUtil.ToUTC(mServiceStopDate).DBValue);
cm.AddInParameter("@UserID",DbType.Guid,mUserID);
cm.AddInParameter("@ServiceBankID",DbType.Guid,mServiceBankID);
cm.AddInParameter("@TaxRateSaleID",DbType.Guid,mTaxRateSaleID);
//standard parameters
cm.AddInParameter("@CurrentUserID",DbType.Guid, CurrentUserID);
cm.AddInParameter("@Created",DbType.DateTime, DBUtil.ToUTC(mCreated.Date));
cm.AddInParameter("@Modified",DbType.DateTime, DBUtil.ToUTC(dtModified));
DBUtil.DB.ExecuteNonQuery(cm, tr);
//Process keywords
DBUtil.ProcessKeywords(tr,this.mID,RootObjectTypes.WorkorderItemLabor,IsNew,AyaBizUtils.Break(false,mServiceDetails));
MarkOld();//db is now synched with object
//Successful update so
//change modification time to match
this.mModified.Date=dtModified;
#endregion
}
#endregion add / update
#endregion
}//end WorkorderItemLabor
}//end namespace GZTW.AyaNova.BLL