crm: code refactoring

This commit is contained in:
Alexey Bannov 2021-05-17 17:50:55 +03:00
parent f1ca0971fd
commit bbe1f1f205
15 changed files with 292 additions and 323 deletions

View File

@ -268,11 +268,11 @@ namespace ASC.CRM.Api
var customField = new CustomField
{
EntityType = entityTypeObj,
FieldType = (CustomFieldType)fieldType,
Type = (CustomFieldType)fieldType,
ID = id,
Mask = mask,
Label = label,
Position = position
SortOrder = position
};
_daoFactory.GetCustomFieldDao().EditItem(customField);

View File

@ -36,6 +36,7 @@ using ASC.CRM.Core.EF;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
namespace ASC.CRM.Core.Dao
@ -62,7 +63,7 @@ namespace ASC.CRM.Core.Dao
public List<CurrencyRate> GetAll()
{
var rates = CrmDbContext.CurrencyRate.Where(x => x.TenantId == TenantID).ToList();
var rates = Query(CrmDbContext.CurrencyRate).ToList();
return _mapper.Map<List<DbCurrencyRate>, List<CurrencyRate>>(rates);
}
@ -71,68 +72,54 @@ namespace ASC.CRM.Core.Dao
{
var entity = CrmDbContext.CurrencyRate.Find(id);
if (entity.TenantId != TenantID) return null;
return _mapper.Map<CurrencyRate>(entity);
}
public CurrencyRate GetByCurrencies(string fromCurrency, string toCurrency)
{
return _mapper.Map<CurrencyRate>(CrmDbContext.CurrencyRate.FirstOrDefault(x => x.TenantId == TenantID && String.Compare(x.FromCurrency, fromCurrency, true) == 0 &&
String.Compare(x.ToCurrency, toCurrency, true) == 0));
var dbEntity = Query(CrmDbContext.CurrencyRate).FirstOrDefault(x =>
string.Compare(x.FromCurrency, fromCurrency, true) == 0 &&
string.Compare(x.ToCurrency, toCurrency, true) == 0);
return _mapper.Map<CurrencyRate>(dbEntity);
}
public int SaveOrUpdate(CurrencyRate currencyRate)
public int SaveOrUpdate(CurrencyRate entity)
{
if (String.IsNullOrEmpty(currencyRate.FromCurrency) || String.IsNullOrEmpty(currencyRate.ToCurrency) || currencyRate.Rate < 0)
if (String.IsNullOrEmpty(entity.FromCurrency) || String.IsNullOrEmpty(entity.ToCurrency) || entity.Rate < 0)
throw new ArgumentException();
if (currencyRate.ID > 0 && currencyRate.Rate == 0)
return Delete(currencyRate.ID);
if (entity.ID > 0 && entity.Rate == 0)
return Delete(entity.ID);
if (CrmDbContext.CurrencyRate.Where(x => x.Id == currencyRate.ID).Any())
{
var itemToInsert = new DbCurrencyRate
{
FromCurrency = currencyRate.FromCurrency.ToUpper(),
ToCurrency = currencyRate.ToCurrency.ToUpper(),
Rate = currencyRate.Rate,
CreateBy = _securityContext.CurrentAccount.ID,
CreateOn = DateTime.UtcNow,
LastModifedBy = _securityContext.CurrentAccount.ID,
LastModifedOn = DateTime.UtcNow,
TenantId = TenantID
};
var dbEntity = new DbCurrencyRate
{
Id = entity.ID,
FromCurrency = entity.FromCurrency.ToUpper(),
ToCurrency = entity.ToCurrency.ToUpper(),
Rate = entity.Rate,
CreateOn = entity.CreateOn == DateTime.MinValue ? DateTime.UtcNow : entity.CreateOn,
CreateBy = entity.CreateBy == Guid.Empty ? _securityContext.CurrentAccount.ID : entity.CreateBy,
LastModifedOn = DateTime.UtcNow,
LastModifedBy = _securityContext.CurrentAccount.ID,
TenantId = TenantID
};
CrmDbContext.CurrencyRate.Add(itemToInsert);
CrmDbContext.SaveChanges();
CrmDbContext.Update(dbEntity);
CrmDbContext.SaveChanges();
currencyRate.ID = itemToInsert.Id;
}
else
{
var itemToUpdate = CrmDbContext.CurrencyRate.FirstOrDefault(x => x.Id == currencyRate.ID);
itemToUpdate.FromCurrency = currencyRate.FromCurrency.ToUpper();
itemToUpdate.ToCurrency = currencyRate.ToCurrency.ToUpper();
itemToUpdate.Rate = currencyRate.Rate;
itemToUpdate.LastModifedBy = _securityContext.CurrentAccount.ID;
itemToUpdate.LastModifedOn = DateTime.UtcNow;
itemToUpdate.TenantId = TenantID;
CrmDbContext.Update(itemToUpdate);
CrmDbContext.SaveChanges();
}
return currencyRate.ID;
return dbEntity.Id;
}
public int Delete(int id)
{
if (id <= 0) throw new ArgumentException();
var dbEntity = CrmDbContext.CurrencyRate.Find(id);
var itemToDelete = new DbCurrencyRate { Id = id };
CrmDbContext.Remove(dbEntity);
CrmDbContext.CurrencyRate.Attach(itemToDelete);
CrmDbContext.CurrencyRate.Remove(itemToDelete);
CrmDbContext.SaveChanges();
return id;
@ -142,8 +129,8 @@ namespace ASC.CRM.Core.Dao
{
using var tx = CrmDbContext.Database.BeginTransaction();
var items = CrmDbContext.CurrencyRate.Where(x => x.TenantId == TenantID);
var items = Query(CrmDbContext.CurrencyRate).AsNoTracking();
CrmDbContext.RemoveRange(items);
foreach (var rate in rates)

View File

@ -43,6 +43,7 @@ using ASC.Web.CRM.Core.Search;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
@ -53,14 +54,15 @@ namespace ASC.CRM.Core.Dao
[Scope]
public class CustomFieldDao : AbstractDao
{
private TenantUtil _tenantUtil;
private FactoryIndexerFieldValue _factoryIndexer;
private readonly TenantUtil _tenantUtil;
private readonly FactoryIndexerFieldValue _factoryIndexer;
public CustomFieldDao(
DbContextManager<CrmDbContext> dbContextManager,
TenantManager tenantManager,
SecurityContext securityContext,
TenantUtil tenantUtil,
FactoryIndexerFieldValue factoryIndexer,
IOptionsMonitor<ILog> logger,
ICache ascCache,
IMapper mapper
@ -73,6 +75,7 @@ namespace ASC.CRM.Core.Dao
mapper)
{
_tenantUtil = tenantUtil;
_factoryIndexer = factoryIndexer;
}
@ -100,41 +103,34 @@ namespace ASC.CRM.Core.Dao
SetFieldValueInDb(entityType, entityID, fieldID, fieldValue);
}
private void SetFieldValueInDb(EntityType entityType, int entityID, int fieldID, String fieldValue)
private void SetFieldValueInDb(EntityType entityType, int entityID, int fieldID, string fieldValue)
{
if (!_supportedEntityType.Contains(entityType))
throw new ArgumentException();
fieldValue = fieldValue.Trim();
var itemToDelete = Query(CrmDbContext.FieldValue)
.Where(x => x.EntityId == entityID && x.EntityType == entityType && x.FieldId == fieldID);
var dbEntity = Query(CrmDbContext.FieldValue)
.FirstOrDefault(x => x.EntityId == entityID &&
x.EntityType == entityType &&
x.FieldId == fieldID);
CrmDbContext.FieldValue.RemoveRange(itemToDelete);
CrmDbContext.SaveChanges();
if (!String.IsNullOrEmpty(fieldValue))
if (string.IsNullOrEmpty(fieldValue))
{
var lastModifiedOn = _tenantUtil.DateTimeToUtc(_tenantUtil.DateTimeNow());
_factoryIndexer.Delete(dbEntity);
var dbFieldValue = new DbFieldValue
{
EntityId = entityID,
Value = fieldValue,
FieldId = fieldID,
EntityType = entityType,
LastModifedOn = lastModifiedOn,
LastModifedBy = _securityContext.CurrentAccount.ID,
TenantId = TenantID
};
CrmDbContext.Add(dbFieldValue);
CrmDbContext.SaveChanges();
var id = dbFieldValue.Id;
_factoryIndexer.Index(dbFieldValue);
CrmDbContext.Remove(dbEntity);
}
else
{
dbEntity.Value = fieldValue;
dbEntity.LastModifedOn = _tenantUtil.DateTimeToUtc(_tenantUtil.DateTimeNow());
dbEntity.LastModifedBy = _securityContext.CurrentAccount.ID;
_factoryIndexer.Index(dbEntity);
}
CrmDbContext.SaveChanges();
}
private string GetValidMask(CustomFieldType customFieldType, String mask)
@ -224,7 +220,7 @@ namespace ASC.CRM.Core.Dao
{
_logger.Error(ex);
throw ex;
throw;
}
}
return JsonConvert.SerializeObject(resultMask);
@ -234,11 +230,12 @@ namespace ASC.CRM.Core.Dao
{
if (!_supportedEntityType.Contains(entityType) || String.IsNullOrEmpty(label))
throw new ArgumentException();
var resultMask = GetValidMask(customFieldType, mask);
var sortOrder = Query(CrmDbContext.FieldDescription).Select(x => x.SortOrder).Max() + 1;
var itemToInsert = new DbFieldDescription
var dbEntity = new DbFieldDescription
{
Label = label,
Type = customFieldType,
@ -248,11 +245,11 @@ namespace ASC.CRM.Core.Dao
TenantId = TenantID
};
CrmDbContext.FieldDescription.Add(itemToInsert);
CrmDbContext.FieldDescription.Add(dbEntity);
CrmDbContext.SaveChanges();
return itemToInsert.Id;
return dbEntity.Id;
}
public String GetValue(EntityType entityType, int entityID, int fieldID)
@ -317,7 +314,7 @@ namespace ASC.CRM.Core.Dao
public void EditItem(CustomField customField)
{
if (String.IsNullOrEmpty(customField.Label))
if (string.IsNullOrEmpty(customField.Label))
throw new ArgumentException();
if (HaveRelativeLink(customField.ID))
@ -367,7 +364,7 @@ namespace ASC.CRM.Core.Dao
{
_logger.Error(ex);
throw ex;
throw;
}
var itemToUpdate = Query(CrmDbContext.FieldDescription).FirstOrDefault(x => x.Id == customField.ID);
@ -375,37 +372,37 @@ namespace ASC.CRM.Core.Dao
itemToUpdate.Label = customField.Label;
itemToUpdate.Mask = customField.Mask;
CrmDbContext.Update(itemToUpdate);
CrmDbContext.SaveChanges();
}
else
{
var resultMask = GetValidMask(customField.FieldType, customField.Mask);
var resultMask = GetValidMask(customField.Type, customField.Mask);
var itemToUpdate = Query(CrmDbContext.FieldDescription).FirstOrDefault(x => x.Id == customField.ID);
itemToUpdate.Label = customField.Label;
itemToUpdate.Type = customField.FieldType;
itemToUpdate.Type = customField.Type;
itemToUpdate.Mask = customField.Mask;
CrmDbContext.Update(itemToUpdate);
CrmDbContext.SaveChanges();
}
}
public void ReorderFields(int[] fieldID)
public void ReorderFields(int[] ids)
{
for (int index = 0; index < fieldID.Length; index++)
var tx = CrmDbContext.Database.BeginTransaction();
for (int index = 0; index < ids.Length; index++)
{
var itemToUpdate = Query(CrmDbContext.FieldDescription).FirstOrDefault(x => x.Id == fieldID[index]);
var dbEntity = CrmDbContext.FieldDescription.Find(ids[index]);
itemToUpdate.SortOrder = index;
CrmDbContext.Update(itemToUpdate);
dbEntity.SortOrder = index;
CrmDbContext.SaveChanges();
}
tx.Commit();
}
private bool HaveRelativeLink(int fieldID)
@ -509,13 +506,17 @@ namespace ASC.CRM.Core.Dao
if (!includeEmptyFields)
sqlQuery = sqlQuery.Where(x => x.y != null || x.x.Type == CustomFieldType.Heading);
return sqlQuery.ToList().ConvertAll(x => ToCustomField(x.x, x.y));
}
public CustomField GetFieldDescription(int fieldID)
public CustomField GetFieldDescription(int id)
{
return ToCustomField(Query(CrmDbContext.FieldDescription).FirstOrDefault(x => x.Id == fieldID));
var dbEntity = CrmDbContext.FieldDescription.Find(id);
if (dbEntity.TenantId != TenantID) return null;
return _mapper.Map<CustomField>(dbEntity);
}
public List<CustomField> GetFieldsDescription(EntityType entityType)
@ -523,7 +524,8 @@ namespace ASC.CRM.Core.Dao
if (!_supportedEntityType.Contains(entityType))
throw new ArgumentException();
var sqlQuery = Query(CrmDbContext.FieldDescription);
var sqlQuery = Query(CrmDbContext.FieldDescription)
.AsNoTracking();
if (entityType == EntityType.Company || entityType == EntityType.Person)
{
@ -534,26 +536,27 @@ namespace ASC.CRM.Core.Dao
sqlQuery = sqlQuery.Where(x => x.EntityType == entityType);
}
return sqlQuery.ToList().ConvertAll(x => ToCustomField(x));
var dbEntities = sqlQuery.ToList();
return _mapper.Map<List<DbFieldDescription>, List<CustomField>>(dbEntities);
}
public void DeleteField(int fieldID)
public void DeleteField(int id)
{
//if (HaveRelativeLink(fieldID))
// throw new ArgumentException();
if (HaveRelativeLink(id))
throw new ArgumentException();
var tx = CrmDbContext.Database.BeginTransaction();
var fieldDescription = new DbFieldDescription { Id = fieldID };
var dbFieldDescription = CrmDbContext.FieldDescription.Find(id);
CrmDbContext.FieldDescription.Attach(fieldDescription);
CrmDbContext.FieldDescription.Remove(fieldDescription);
CrmDbContext.Remove(dbFieldDescription);
var fieldValue = Query(CrmDbContext.FieldValue).FirstOrDefault(x => x.FieldId == fieldID);
var dbFieldValue = Query(CrmDbContext.FieldValue).FirstOrDefault(x => x.FieldId == id);
_factoryIndexer.Delete(fieldValue);
_factoryIndexer.Delete(dbFieldValue);
CrmDbContext.Remove(fieldValue);
CrmDbContext.Remove(dbFieldValue);
CrmDbContext.SaveChanges();
@ -561,22 +564,11 @@ namespace ASC.CRM.Core.Dao
}
public CustomField ToCustomField(DbFieldDescription dbFieldDescription,
DbFieldValue dbFieldValue = null)
DbFieldValue dbFieldValue = null)
{
if (dbFieldDescription == null) return null;
var customField = _mapper.Map<CustomField>(dbFieldDescription);
var customField = new CustomField
{
ID = dbFieldDescription.Id,
EntityType = dbFieldDescription.EntityType,
FieldType = dbFieldDescription.Type,
Label = dbFieldDescription.Label,
Mask = dbFieldDescription.Mask,
Position = dbFieldDescription.SortOrder
};
if (dbFieldValue != null)
if (customField != null && dbFieldValue != null)
{
customField.Value = dbFieldValue.Value;
customField.EntityID = dbFieldValue.EntityId;

View File

@ -58,12 +58,12 @@ namespace ASC.CRM.Core.Dao
[Scope]
public class DealDao : AbstractDao
{
private BundleSearch _bundleSearch;
private FilesIntegration _filesIntegration;
private FactoryIndexerDeal _factoryIndexer;
private TenantUtil _tenantUtil;
private CrmSecurity _crmSecurity;
private AuthorizationManager _authorizationManager;
private readonly BundleSearch _bundleSearch;
private readonly FilesIntegration _filesIntegration;
private readonly FactoryIndexerDeal _factoryIndexer;
private readonly TenantUtil _tenantUtil;
private readonly CrmSecurity _crmSecurity;
private readonly AuthorizationManager _authorizationManager;
public DealDao(DbContextManager<CrmDbContext> dbContextManager,
TenantManager tenantManager,
@ -71,6 +71,8 @@ namespace ASC.CRM.Core.Dao
CrmSecurity crmSecurity,
FactoryIndexerDeal factoryIndexer,
FilesIntegration filesIntegration,
TenantUtil tenantUtil,
AuthorizationManager authorizationManager,
IOptionsMonitor<ILog> logger,
ICache ascCache,
IMapper mapper,
@ -87,6 +89,8 @@ namespace ASC.CRM.Core.Dao
_filesIntegration = filesIntegration;
_bundleSearch = bundleSearch;
_mapper = mapper;
_tenantUtil = tenantUtil;
_authorizationManager = authorizationManager;
}
@ -137,6 +141,7 @@ namespace ASC.CRM.Core.Dao
deal.ID = result;
_factoryIndexer.Index(Query(CrmDbContext.Deals).Where(x => x.Id == deal.ID).FirstOrDefault());
return result;
@ -190,7 +195,9 @@ namespace ASC.CRM.Core.Dao
tx.Commit();
foreach (var deal in Query(CrmDbContext.Deals).Where(x => result.Contains(x.Id)))
var dbDeals = Query(CrmDbContext.Deals).Where(x => result.Contains(x.Id));
foreach (var deal in dbDeals)
{
_factoryIndexer.Index(deal);
}
@ -209,7 +216,10 @@ namespace ASC.CRM.Core.Dao
// AddMember(deal.ID, deal.ContactID);
var itemToUpdate = Query(CrmDbContext.Deals).Single(x => x.Id == deal.ID);
var itemToUpdate = CrmDbContext.Deals.Find(deal.ID);
if (itemToUpdate.TenantId != TenantID)
throw new ArgumentException();
itemToUpdate.Title = deal.Title;
itemToUpdate.Description = deal.Description;
@ -222,18 +232,15 @@ namespace ASC.CRM.Core.Dao
itemToUpdate.DealMilestoneProbability = deal.DealMilestoneProbability;
itemToUpdate.ExpectedCloseDate = deal.ExpectedCloseDate;
itemToUpdate.PerPeriodValue = deal.PerPeriodValue;
itemToUpdate.ActualCloseDate = _tenantUtil.DateTimeToUtc(deal.ActualCloseDate);
itemToUpdate.LastModifedOn = _tenantUtil.DateTimeToUtc(_tenantUtil.DateTimeNow());
itemToUpdate.LastModifedBy = _securityContext.CurrentAccount.ID;
CrmDbContext.Update(itemToUpdate);
CrmDbContext.SaveChanges();
_factoryIndexer.Index(itemToUpdate);
}
public int GetDealsCount()
{
return GetDealsCount(String.Empty, Guid.Empty, 0, null, 0, null, null, DateTime.MinValue, DateTime.MinValue);
@ -730,16 +737,19 @@ namespace ASC.CRM.Core.Dao
return _mapper.Map<List<DbDeal>, List<Deal>>(dbDeals).FindAll(_crmSecurity.CanAccessTo);
}
public Deal DeleteDeal(int dealID)
public Deal DeleteDeal(int id)
{
if (dealID <= 0) return null;
if (id <= 0) return null;
var deal = GetByID(dealID);
var deal = GetByID(id);
if (deal == null) return null;
_crmSecurity.DemandDelete(deal);
_factoryIndexer.Delete(Query(CrmDbContext.Deals).Where(x => x.Id == dealID).Single());
var dbEntity = CrmDbContext.Deals.Find(id);
_factoryIndexer.Delete(dbEntity);
// Delete relative keys
_cache.Remove(new Regex(TenantID.ToString(CultureInfo.InvariantCulture) + "deals.*"));
@ -752,6 +762,7 @@ namespace ASC.CRM.Core.Dao
public List<Deal> DeleteBatchDeals(int[] dealID)
{
var deals = GetDeals(dealID).FindAll(_crmSecurity.CanDelete).ToList();
if (!deals.Any()) return deals;
// Delete relative keys
@ -764,12 +775,14 @@ namespace ASC.CRM.Core.Dao
public List<Deal> DeleteBatchDeals(List<Deal> deals)
{
deals = deals.FindAll(_crmSecurity.CanDelete).ToList();
if (!deals.Any()) return deals;
// Delete relative keys
_cache.Remove(new Regex(TenantID.ToString(CultureInfo.InvariantCulture) + "deals.*"));
DeleteBatchDealsExecute(deals);
return deals;
}
@ -778,13 +791,15 @@ namespace ASC.CRM.Core.Dao
if (deals == null || !deals.Any()) return;
var dealID = deals.Select(x => x.ID).ToArray();
object[] filesIDs;
var tagdao = _filesIntegration.DaoFactory.GetTagDao<int>();
var tagNames = Query(CrmDbContext.RelationshipEvent)
.Where(x => x.HaveFiles && dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity)
.Select(x => string.Format("RelationshipEvent_{0}", x.Id)).ToArray();
.Select(x => string.Format("RelationshipEvent_{0}", x.Id))
.ToArray();
filesIDs = tagdao.GetTags(tagNames, TagType.System).Where(t => t.EntryType == FileEntryType.File).Select(t => t.EntryId).ToArray();
@ -792,19 +807,29 @@ namespace ASC.CRM.Core.Dao
CrmDbContext.RemoveRange(Query(CrmDbContext.FieldValue)
.AsNoTracking()
.Where(x => dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity)
);
CrmDbContext.RemoveRange(CrmDbContext.EntityContact.Where(x => dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity));
CrmDbContext.RemoveRange(CrmDbContext.EntityContact
.AsNoTracking()
.Where(x => dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity));
CrmDbContext.RemoveRange(Query(CrmDbContext.RelationshipEvent)
.AsNoTracking()
.Where(x => dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity));
CrmDbContext.RemoveRange(Query(CrmDbContext.Tasks).Where(x => dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity));
CrmDbContext.RemoveRange(Query(CrmDbContext.Tasks)
.AsNoTracking()
.Where(x => dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity));
CrmDbContext.RemoveRange(CrmDbContext.EntityTags.Where(x => dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity));
CrmDbContext.RemoveRange(CrmDbContext.EntityTags
.AsNoTracking()
.Where(x => dealID.Contains(x.EntityId) && x.EntityType == EntityType.Opportunity));
CrmDbContext.RemoveRange(Query(CrmDbContext.Deals).Where(x => dealID.Contains(x.Id)));
CrmDbContext.RemoveRange(Query(CrmDbContext.Deals)
.AsNoTracking()
.Where(x => dealID.Contains(x.Id)));
tx.Commit();
@ -854,19 +879,17 @@ namespace ASC.CRM.Core.Dao
/// <summary>
/// Test method
/// </summary>
/// <param name="opportunityid"></param>
/// <param name="id"></param>
/// <param name="creationDate"></param>
public void SetDealCreationDate(int opportunityid, DateTime creationDate)
public void SetDealCreationDate(int id, DateTime creationDate)
{
var dbDeal = new DbDeal
{
Id = opportunityid,
CreateOn = _tenantUtil.DateTimeToUtc(creationDate),
TenantId = TenantID
};
var dbEntity = CrmDbContext.Deals.Find(id);
if (dbEntity.TenantId != TenantID)
throw new ArgumentException();
dbEntity.CreateOn = _tenantUtil.DateTimeToUtc(creationDate);
CrmDbContext.Attach(dbDeal);
CrmDbContext.Entry(dbDeal).Property(x => x.CreateOn).IsModified = true;
CrmDbContext.SaveChanges();
// Delete relative keys
@ -876,19 +899,17 @@ namespace ASC.CRM.Core.Dao
/// <summary>
/// Test method
/// </summary>
/// <param name="opportunityid"></param>
/// <param name="id"></param>
/// <param name="lastModifedDate"></param>
public void SetDealLastModifedDate(int opportunityid, DateTime lastModifedDate)
public void SetDealLastModifedDate(int id, DateTime lastModifedDate)
{
var dbDeal = new DbDeal
{
Id = opportunityid,
LastModifedOn = _tenantUtil.DateTimeToUtc(lastModifedDate),
TenantId = TenantID
};
var dbEntity = CrmDbContext.Deals.Find(id);
if (dbEntity.TenantId != TenantID)
throw new ArgumentException();
dbEntity.LastModifedOn = _tenantUtil.DateTimeToUtc(lastModifedDate);
CrmDbContext.Attach(dbDeal);
CrmDbContext.Entry(dbDeal).Property(x => x.LastModifedOn).IsModified = true;
CrmDbContext.SaveChanges();
// Delete relative keys

View File

@ -43,6 +43,7 @@ using ASC.CRM.Resources;
using AutoMapper;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
#endregion
@ -116,18 +117,13 @@ namespace ASC.CRM.Core.Dao
public int Create(DealMilestone item)
{
if (String.IsNullOrEmpty(item.Title) || String.IsNullOrEmpty(item.Color))
throw new ArgumentException();
int id;
using var tx = CrmDbContext.Database.BeginTransaction();
if (item.SortOrder == 0)
item.SortOrder = Query(CrmDbContext.DealMilestones).Select(x => x.SortOrder).Max() + 1;
var itemToAdd = new DbDealMilestone
var dbEntity = new DbDealMilestone
{
Title = item.Title,
Description = item.Description,
@ -138,27 +134,21 @@ namespace ASC.CRM.Core.Dao
TenantId = TenantID
};
CrmDbContext.DealMilestones.Add(itemToAdd);
CrmDbContext.DealMilestones.Add(dbEntity);
CrmDbContext.SaveChanges();
id = itemToAdd.Id;
tx.Commit();
return id;
return dbEntity.Id;
}
public void ChangeColor(int id, String newColor)
{
var itemToUpdate = new DbDealMilestone
{
Id = id,
Color = newColor,
TenantId = TenantID
};
var dbEntity = CrmDbContext.DealMilestones.Find(id);
if (dbEntity.TenantId != TenantID)
throw new ArgumentException();
dbEntity.Color = newColor;
CrmDbContext.Attach(itemToUpdate);
CrmDbContext.Entry(itemToUpdate).Property(x => x.Color).IsModified = true;
CrmDbContext.SaveChanges();
}
@ -167,24 +157,24 @@ namespace ASC.CRM.Core.Dao
if (HaveContactLink(item.ID))
throw new ArgumentException(String.Format("{0}. {1}.", CRMErrorsResource.BasicCannotBeEdited, CRMErrorsResource.DealMilestoneHasRelatedDeals));
var itemToUpdate = Query(CrmDbContext.DealMilestones)
.FirstOrDefault(x => x.Id == item.ID);
var dbEntity = CrmDbContext.DealMilestones.Find(item.ID);
itemToUpdate.Title = item.Title;
itemToUpdate.Description = item.Description;
itemToUpdate.Color = item.Color;
itemToUpdate.Probability = item.Probability;
itemToUpdate.Status = item.Status;
if (dbEntity.TenantId != TenantID)
throw new ArgumentException();
CrmDbContext.DealMilestones.Update(itemToUpdate);
dbEntity.Title = item.Title;
dbEntity.Description = item.Description;
dbEntity.Color = item.Color;
dbEntity.Probability = item.Probability;
dbEntity.Status = item.Status;
CrmDbContext.SaveChanges();
}
public bool HaveContactLink(int dealMilestoneID)
public bool HaveContactLink(int id)
{
return Query(CrmDbContext.Deals)
.Any(x => x.DealMilestoneId == dealMilestoneID);
.Any(x => x.DealMilestoneId == id);
}
public void Delete(int id)
@ -192,23 +182,24 @@ namespace ASC.CRM.Core.Dao
if (HaveContactLink(id))
throw new ArgumentException(String.Format("{0}. {1}.", CRMErrorsResource.BasicCannotBeDeleted, CRMErrorsResource.DealMilestoneHasRelatedDeals));
var dbDealMilestones = new DbDealMilestone
{
Id = id,
TenantId = TenantID
};
var dbEntity = CrmDbContext.DealMilestones.Find(id);
CrmDbContext.DealMilestones.Remove(dbDealMilestones);
if (dbEntity.TenantId != TenantID)
throw new ArgumentException();
CrmDbContext.DealMilestones.Remove(dbEntity);
CrmDbContext.SaveChanges();
}
public DealMilestone GetByID(int id)
{
var dbDealMilestone = Query(CrmDbContext.DealMilestones).FirstOrDefault(x => x.Id == id);
var dbEntity = CrmDbContext.DealMilestones.Find(id);
return _mapper.Map<DbDealMilestone, DealMilestone>(dbDealMilestone);
if (dbEntity.TenantId != TenantID)
throw new ArgumentException();
return _mapper.Map<DbDealMilestone, DealMilestone>(dbEntity);
}
public Boolean IsExist(int id)
@ -219,6 +210,7 @@ namespace ASC.CRM.Core.Dao
public List<DealMilestone> GetAll(int[] id)
{
var result = Query(CrmDbContext.DealMilestones)
.AsNoTracking()
.OrderBy(x => x.SortOrder)
.Where(x => id.Contains(x.Id)).ToList();
@ -228,11 +220,11 @@ namespace ASC.CRM.Core.Dao
public List<DealMilestone> GetAll()
{
var result = Query(CrmDbContext.DealMilestones)
.AsNoTracking()
.OrderBy(x => x.SortOrder)
.ToList();
return _mapper.Map<List<DbDealMilestone>, List<DealMilestone>>(result);
}
}
}

View File

@ -47,7 +47,6 @@ using ASC.Web.CRM.Core.Search;
using AutoMapper;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
@ -79,7 +78,6 @@ namespace ASC.CRM.Core.Dao
public InvoiceDao(
DbContextManager<CrmDbContext> dbContextManager,
TenantManager tenantManager,
SecurityContext securityContext,
FactoryIndexerInvoice factoryIndexer,
IOptionsMonitor<ILog> logger,
@ -111,9 +109,9 @@ namespace ASC.CRM.Core.Dao
return IsExistFromDb(invoiceID);
}
public Boolean IsExistFromDb(int invoiceID)
public Boolean IsExistFromDb(int id)
{
return Query(CrmDbContext.Invoices).Where(x => x.Id == invoiceID).Any();
return Query(CrmDbContext.Invoices).Where(x => x.Id == id).Any();
}
public Boolean IsExist(string number)
@ -139,8 +137,9 @@ namespace ASC.CRM.Core.Dao
public List<Invoice> GetByID(int[] ids)
{
var dbInvoices = Query(CrmDbContext.Invoices)
.Where(x => ids.Contains(x.Id))
.ToList();
.AsNoTracking()
.Where(x => ids.Contains(x.Id))
.ToList();
return _mapper.Map<List<DbInvoice>, List<Invoice>>(dbInvoices);
}
@ -152,12 +151,19 @@ namespace ASC.CRM.Core.Dao
public Invoice GetByIDFromDb(int id)
{
return _mapper.Map<Invoice>(Query(CrmDbContext.Invoices).FirstOrDefault(x => x.Id == id));
var dbEntity = CrmDbContext.Invoices.Find(id);
if (dbEntity.TenantId != TenantID)
throw new ArgumentException();
return _mapper.Map<Invoice>(dbEntity);
}
public Invoice GetByNumber(string number)
{
return _mapper.Map<Invoice>(Query(CrmDbContext.Invoices).FirstOrDefault(x => x.Number == number));
var dbEntity = Query(CrmDbContext.Invoices).FirstOrDefault(x => x.Number == number);
return _mapper.Map<Invoice>(dbEntity);
}
public Invoice GetByFileId(Int32 fileID)
@ -403,6 +409,7 @@ namespace ASC.CRM.Core.Dao
if (ids == null || !ids.Any()) return new List<Invoice>();
var dbInvoices = Query(CrmDbContext.Invoices)
.AsNoTracking()
.Where(x => ids.Contains(x.Id))
.ToList();
@ -420,8 +427,10 @@ namespace ASC.CRM.Core.Dao
if (entityType == EntityType.Opportunity)
{
var sqlQuery = Query(CrmDbContext.Invoices).Where(x => x.EntityId == entityID && x.EntityType == entityType)
.ToList();
var sqlQuery = Query(CrmDbContext.Invoices)
.AsNoTracking()
.Where(x => x.EntityId == entityID && x.EntityType == entityType)
.ToList();
return _mapper.Map<List<DbInvoice>, List<Invoice>>(sqlQuery)
.FindAll(_crmSecurity.CanAccessTo);
@ -441,8 +450,10 @@ namespace ASC.CRM.Core.Dao
if (contactID <= 0)
return result;
var dbInvoices = Query(CrmDbContext.Invoices).Where(x => x.ContactId == contactID)
.ToList();
var dbInvoices = Query(CrmDbContext.Invoices)
.AsNoTracking()
.Where(x => x.ContactId == contactID)
.ToList();
return _mapper.Map<List<DbInvoice>, List<Invoice>>(dbInvoices)
.FindAll(_crmSecurity.CanAccessTo);
@ -491,6 +502,8 @@ namespace ASC.CRM.Core.Dao
var result = SaveOrUpdateInvoiceInDb(invoice);
_factoryIndexer.Index(Query(CrmDbContext.Invoices).Where(x => x.Id == invoice.ID).Single());
return result;
@ -506,81 +519,40 @@ namespace ASC.CRM.Core.Dao
invoice.ExchangeRate <= 0 ||
String.IsNullOrEmpty(invoice.Terms))
throw new ArgumentException();
invoice.PurchaseOrderNumber = !String.IsNullOrEmpty(invoice.PurchaseOrderNumber) ? invoice.PurchaseOrderNumber : String.Empty;
if (!IsExistFromDb(invoice.ID))
var dbEntity = new DbInvoice
{
if (IsExistFromDb(invoice.Number))
throw new ArgumentException();
Id = invoice.ID,
Status = invoice.Status,
Number = invoice.Number,
IssueDate = _tenantUtil.DateTimeToUtc(invoice.IssueDate),
TemplateType = invoice.TemplateType,
ContactId = invoice.ContactID,
ConsigneeId = invoice.ConsigneeID,
EntityType = invoice.EntityType,
EntityId = invoice.EntityID,
DueDate = _tenantUtil.DateTimeToUtc(invoice.DueDate),
Language = invoice.Language,
Currency = invoice.Currency,
ExchangeRate = invoice.ExchangeRate,
PurchaseOrderNumber = invoice.PurchaseOrderNumber,
Terms = invoice.Terms,
Description = invoice.Description,
JsonData = invoice.JsonData,
FileId = invoice.FileID,
CreateOn = invoice.CreateOn == DateTime.MinValue ? DateTime.UtcNow : invoice.CreateOn,
CreateBy = _securityContext.CurrentAccount.ID,
LastModifedOn = DateTime.UtcNow,
LastModifedBy = _securityContext.CurrentAccount.ID,
TenantId = TenantID
};
var itemToInsert = new DbInvoice
{
Status = invoice.Status,
Number = invoice.Number,
IssueDate = _tenantUtil.DateTimeToUtc(invoice.IssueDate),
TemplateType = invoice.TemplateType,
ContactId = invoice.ContactID,
ConsigneeId = invoice.ConsigneeID,
EntityType = invoice.EntityType,
EntityId = invoice.EntityID,
DueDate = _tenantUtil.DateTimeToUtc(invoice.DueDate),
Language = invoice.Language,
Currency = invoice.Currency,
ExchangeRate = invoice.ExchangeRate,
PurchaseOrderNumber = invoice.PurchaseOrderNumber,
Terms = invoice.Terms,
Description = invoice.Description,
JsonData = invoice.JsonData,
FileId = invoice.FileID,
CreateOn = invoice.CreateOn == DateTime.MinValue ? DateTime.UtcNow : invoice.CreateOn,
CreateBy = _securityContext.CurrentAccount.ID,
LastModifedOn = invoice.CreateOn == DateTime.MinValue ? DateTime.UtcNow : invoice.CreateOn,
LastModifedBy = _securityContext.CurrentAccount.ID,
TenantId = TenantID
};
dbEntity.PurchaseOrderNumber = !String.IsNullOrEmpty(invoice.PurchaseOrderNumber) ? invoice.PurchaseOrderNumber : String.Empty;
CrmDbContext.Invoices.Add(itemToInsert);
CrmDbContext.Update(dbEntity);
CrmDbContext.SaveChanges();
CrmDbContext.SaveChanges();
invoice.ID = itemToInsert.Id;
}
else
{
var itemToUpdate = Query(CrmDbContext.Invoices).FirstOrDefault(x => x.Id == invoice.ID);
var oldInvoice = _mapper.Map<Invoice>(itemToUpdate);
_crmSecurity.DemandEdit(oldInvoice);
itemToUpdate.Status = invoice.Status;
itemToUpdate.IssueDate = _tenantUtil.DateTimeToUtc(invoice.IssueDate);
itemToUpdate.TemplateType = invoice.TemplateType;
itemToUpdate.ContactId = invoice.ContactID;
itemToUpdate.ConsigneeId = invoice.ConsigneeID;
itemToUpdate.EntityType = invoice.EntityType;
itemToUpdate.EntityId = invoice.EntityID;
itemToUpdate.DueDate = _tenantUtil.DateTimeToUtc(invoice.DueDate);
itemToUpdate.Language = invoice.Language;
itemToUpdate.Currency = invoice.Currency;
itemToUpdate.ExchangeRate = invoice.ExchangeRate;
itemToUpdate.PurchaseOrderNumber = invoice.PurchaseOrderNumber;
itemToUpdate.Description = invoice.Description;
itemToUpdate.JsonData = null;
itemToUpdate.FileId = 0;
itemToUpdate.LastModifedOn = DateTime.UtcNow;
itemToUpdate.LastModifedBy = _securityContext.CurrentAccount.ID;
itemToUpdate.TenantId = TenantID;
CrmDbContext.SaveChanges();
}
return invoice.ID;
return dbEntity.Id;
}
public Invoice UpdateInvoiceStatus(int invoiceid, InvoiceStatus status)
@ -756,12 +728,11 @@ namespace ASC.CRM.Core.Dao
tx.Commit();
dbInvoicesQuery.ToList().ForEach(invoice => _factoryIndexer.Delete(invoice));
}
private IQueryable<DbInvoice> GetDbInvoceByFilters(
ICollection<int> exceptIDs,
String searchText,
string searchText,
InvoiceStatus? status,
DateTime issueDateFrom,
DateTime issueDateTo,
@ -771,7 +742,8 @@ namespace ASC.CRM.Core.Dao
int entityID,
String currency)
{
var sqlQuery = Query(CrmDbContext.Invoices);
var sqlQuery = Query(CrmDbContext.Invoices)
.AsNoTracking();
if (entityID > 0)
{
@ -880,15 +852,16 @@ namespace ASC.CRM.Core.Dao
/// <summary>
/// Test method
/// </summary>
/// <param name="invoiceId"></param>
/// <param name="id"></param>
/// <param name="creationDate"></param>
public void SetInvoiceCreationDate(int invoiceId, DateTime creationDate)
public void SetInvoiceCreationDate(int id, DateTime creationDate)
{
var itemToUpdate = Query(CrmDbContext.Invoices).FirstOrDefault(x => x.Id == invoiceId);
var dbEntity = CrmDbContext.Invoices.Find(id);
var entity = _mapper.Map<Invoice>(dbEntity);
itemToUpdate.CreateOn = _tenantUtil.DateTimeToUtc(creationDate);
dbEntity.CreateOn = _tenantUtil.DateTimeToUtc(creationDate);
CrmDbContext.Invoices.Update(itemToUpdate);
CrmDbContext.SaveChanges();
// Delete relative keys
@ -898,15 +871,17 @@ namespace ASC.CRM.Core.Dao
/// <summary>
/// Test method
/// </summary>
/// <param name="invoiceId"></param>
/// <param name="id"></param>
/// <param name="lastModifedDate"></param>
public void SetInvoiceLastModifedDate(int invoiceId, DateTime lastModifedDate)
public void SetInvoiceLastModifedDate(int id, DateTime lastModifedDate)
{
var itemToUpdate = Query(CrmDbContext.Invoices).FirstOrDefault(x => x.Id == invoiceId);
var dbEntity = CrmDbContext.Invoices.Find(id);
itemToUpdate.LastModifedOn = _tenantUtil.DateTimeToUtc(lastModifedDate);
var entity = _mapper.Map<Invoice>(dbEntity);
CrmDbContext.Invoices.Update(itemToUpdate);
_crmSecurity.DemandAccessTo(entity);
dbEntity.LastModifedOn = _tenantUtil.DateTimeToUtc(lastModifedDate);
CrmDbContext.SaveChanges();

View File

@ -72,19 +72,19 @@ namespace ASC.CRM.Core.Dao
_crmSecurity = crmSecurity;
}
public Boolean IsExist(int invoiceItemID)
public Boolean IsExist(int id)
{
return IsExistInDb(invoiceItemID);
return IsExistInDb(id);
}
public Boolean IsExistInDb(int invoiceItemID)
public Boolean IsExistInDb(int id)
{
return Query(CrmDbContext.InvoiceItem).Any(x => x.Id == invoiceItemID);
return Query(CrmDbContext.InvoiceItem).Any(x => x.Id == id);
}
public Boolean CanDelete(int invoiceItemID)
public Boolean CanDelete(int id)
{
return Query(CrmDbContext.InvoiceLine).Any(x => x.InvoiceItemId == invoiceItemID);
return Query(CrmDbContext.InvoiceLine).Any(x => x.InvoiceItemId == id);
}
public List<InvoiceItem> GetAll()

View File

@ -29,30 +29,32 @@
using System;
using System.Runtime.Serialization;
using ASC.Common.Mapping;
using ASC.CRM.Core.EF;
using ASC.CRM.Core.Enums;
using ASC.CRM.Mapping;
using AutoMapper;
using DocuSign.eSign.Model;
#endregion
namespace ASC.CRM.Core.Entities
{
[DataContract]
public class CustomField : DomainObject
public class CustomField : DomainObject, IMapFrom<DbFieldDescription>
{
[DataMember(Name = "entity_type")]
public EntityType EntityType { get; set; }
[DataMember(Name = "entity_id")]
public int EntityID { get; set; }
public String Label { get; set; }
public String Value { get; set; }
public CustomFieldType FieldType { get; set; }
public int Position { get; set; }
public CustomFieldType Type { get; set; }
public int SortOrder { get; set; }
public String Mask { get; set; }
public override int GetHashCode()
{
return string.Format("{0}|{1}|{2}|{3}|{4}", GetType().FullName, ID, EntityID, Label, (int)FieldType).GetHashCode();
return string.Format("{0}|{1}|{2}|{3}|{4}", GetType().FullName, ID, EntityID, Label, (int)Type).GetHashCode();
}
}
}

View File

@ -29,11 +29,11 @@ namespace ASC.CRM.Mapping
{
Id = source.ID,
EntityId = source.EntityID,
FieldType = source.FieldType,
FieldType = source.Type,
FieldValue = source.Value,
Label = source.Label,
Mask = source.Mask,
Position = source.Position,
Position = source.SortOrder,
RelativeItemsCount = _daoFactory.GetCustomFieldDao().GetContactLinkCount(source.EntityType, source.ID)
};

View File

@ -248,7 +248,7 @@ namespace ASC.Web.CRM.HttpHandlers
customField.EntityType == EntityType.Company && isCompany ||
customField.EntityType == EntityType.Person && !isCompany)) continue;
if (customField.FieldType == CustomFieldType.CheckBox)
if (customField.Type == CustomFieldType.CheckBox)
{
fieldValue = fieldValue == "on" || fieldValue == "true" ? "true" : "false";
}

View File

@ -583,7 +583,7 @@ namespace ASC.Web.CRM.Classes
fieldsDescription.ForEach(
item =>
{
if (item.FieldType == CustomFieldType.Heading) return;
if (item.Type == CustomFieldType.Heading) return;
dataTable.Columns.Add(
new DataColumn
@ -820,7 +820,7 @@ namespace ASC.Web.CRM.Classes
customFieldDao.GetFieldsDescription(EntityType.Opportunity).ForEach(
item =>
{
if (item.FieldType == CustomFieldType.Heading) return;
if (item.Type == CustomFieldType.Heading) return;
dataTable.Columns.Add(new DataColumn
{
@ -939,7 +939,7 @@ namespace ASC.Web.CRM.Classes
customFieldDao.GetFieldsDescription(EntityType.Case).ForEach(
item =>
{
if (item.FieldType == CustomFieldType.Heading) return;
if (item.Type == CustomFieldType.Heading) return;
dataTable.Columns.Add(new DataColumn
{

View File

@ -92,7 +92,7 @@ namespace ASC.Web.CRM.Classes
EntityID = objCases.ID,
EntityType = EntityType.Case,
ID = fieldID,
Value = field.FieldType == CustomFieldType.CheckBox ? (propertyValue == "on" || propertyValue == "true" ? "true" : "false") : propertyValue
Value = field.Type == CustomFieldType.CheckBox ? (propertyValue == "on" || propertyValue == "true" ? "true" : "false") : propertyValue
});
}

View File

@ -519,7 +519,7 @@ namespace ASC.Web.CRM.Classes
EntityID = contact.ID,
EntityType = contact is Person ? EntityType.Person : EntityType.Company,
ID = fieldID,
Value = field.FieldType == CustomFieldType.CheckBox ? (propertyValue == "on" || propertyValue == "true" ? "true" : "false") : propertyValue
Value = field.Type == CustomFieldType.CheckBox ? (propertyValue == "on" || propertyValue == "true" ? "true" : "false") : propertyValue
});
}
}

View File

@ -257,7 +257,7 @@ namespace ASC.Web.CRM.Classes
EntityID = obj.ID,
EntityType = EntityType.Opportunity,
ID = fieldID,
Value = field.FieldType == CustomFieldType.CheckBox ? (propertyValue == "on" || propertyValue == "true" ? "true" : "false") : propertyValue
Value = field.Type == CustomFieldType.CheckBox ? (propertyValue == "on" || propertyValue == "true" ? "true" : "false") : propertyValue
});
}
}

View File

@ -1082,10 +1082,10 @@ namespace ASC.Web.CRM.Classes
foreach (var customField in customFields)
{
if (customField.FieldType == CustomFieldType.SelectBox) continue;
if (customField.FieldType == CustomFieldType.CheckBox) continue;
if (customField.Type == CustomFieldType.SelectBox) continue;
if (customField.Type == CustomFieldType.CheckBox) continue;
if (customField.FieldType == CustomFieldType.Heading)
if (customField.Type == CustomFieldType.Heading)
{
if (!String.IsNullOrEmpty(customField.Label))
category = customField.Label;