229 lines
5.4 KiB
C#

using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
using Csla.Validation;
namespace ProjectTracker.Library
{
[Serializable()]
public class ProjectResource :
BusinessBase<ProjectResource>, IHoldRoles
{
#region Business Methods
private int _resourceId;
private string _firstName = string.Empty;
private string _lastName = string.Empty;
private SmartDate _assigned;
private int _role;
private byte[] _timestamp = new byte[8];
[System.ComponentModel.DataObjectField(false, true)]
public int ResourceId
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _resourceId;
}
}
public string FirstName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _firstName;
}
}
public string LastName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _lastName;
}
}
public string FullName
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
if (CanReadProperty("FirstName") &&
CanReadProperty("LastName"))
return string.Format("{0}, {1}", LastName, FirstName);
else
throw new System.Security.SecurityException(
"Property read not allowed");
}
}
public string Assigned
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _assigned.Text;
}
}
public int Role
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty(true);
return _role;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty(true);
if (!_role.Equals(value))
{
_role = value;
PropertyHasChanged();
}
}
}
public Resource GetResource()
{
return Resource.GetResource(_resourceId);
}
protected override object GetIdValue()
{
return _resourceId;
}
#endregion
#region Validation Rules
protected override void AddBusinessRules()
{
ValidationRules.AddRule(
new Csla.Validation.RuleHandler(
Assignment.ValidRole), "Role");
}
#endregion
#region Authorization Rules
protected override void AddAuthorizationRules()
{
AuthorizationRules.AllowWrite(
"Role", "ProjectManager");
}
#endregion
#region Factory Methods
internal static ProjectResource NewProjectResource(int resourceId)
{
return new ProjectResource(
Resource.GetResource(resourceId),
RoleList.DefaultRole());
}
internal static ProjectResource GetResource(SafeDataReader dr)
{
return new ProjectResource(dr);
}
private ProjectResource()
{
MarkAsChild();
}
private ProjectResource(Resource resource, int role)
{
MarkAsChild();
_resourceId = resource.Id;
_lastName = resource.LastName;
_firstName = resource.FirstName;
_assigned.Date = Assignment.GetDefaultAssignedDate();
_role = role;
}
private ProjectResource(SafeDataReader dr)
{
MarkAsChild();
Fetch(dr);
}
#endregion
#region Data Access
private void Fetch(SafeDataReader dr)
{
_resourceId = dr.GetInt32("ResourceId");
_lastName = dr.GetString("LastName");
_firstName = dr.GetString("FirstName");
_assigned = dr.GetSmartDate("Assigned");
_role = dr.GetInt32("Role");
dr.GetBytes("LastChanged", 0, _timestamp, 0, 8);
MarkOld();
}
internal void Insert(Project project)
{
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
_timestamp = Assignment.AddAssignment(
cn, project.Id, _resourceId, _assigned, _role);
MarkOld();
}
}
internal void Update(Project project)
{
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
_timestamp = Assignment.UpdateAssignment(
cn, project.Id, _resourceId, _assigned, _role, _timestamp);
MarkOld();
}
}
internal void DeleteSelf(Project project)
{
// if we're not dirty then don't update the database
if (!this.IsDirty) return;
// if we're new then don't update the database
if (this.IsNew) return;
using (SqlConnection cn = new SqlConnection(Database.PTrackerConnection))
{
cn.Open();
Assignment.RemoveAssignment(cn, project.Id, _resourceId);
MarkNew();
}
}
#endregion
}
}