generated from Integry/Template_NetMauiBlazorHybrid
375 lines
12 KiB
C#
375 lines
12 KiB
C#
using AutoMapper;
|
|
using salesbook.Shared.Core.Dto;
|
|
using salesbook.Shared.Core.Dto.Activity;
|
|
using salesbook.Shared.Core.Dto.Contact;
|
|
using salesbook.Shared.Core.Dto.PageState;
|
|
using salesbook.Shared.Core.Entity;
|
|
using salesbook.Shared.Core.Helpers;
|
|
using salesbook.Shared.Core.Helpers.Enum;
|
|
using salesbook.Shared.Core.Interface;
|
|
using salesbook.Shared.Core.Interface.IntegryApi;
|
|
using salesbook.Shared.Core.Interface.System.Network;
|
|
using System.Linq.Expressions;
|
|
using IntegryApiClient.Core.Domain.Abstraction.Contracts.Account;
|
|
|
|
namespace salesbook.Maui.Core.Services;
|
|
|
|
public class ManageDataService(
|
|
LocalDbService localDb,
|
|
IMapper mapper,
|
|
UserListState userListState,
|
|
IIntegryApiService integryApiService,
|
|
INetworkService networkService,
|
|
IUserSession userSession
|
|
) : IManageDataService
|
|
{
|
|
public Task<List<T>> GetTable<T>(Expression<Func<T, bool>>? whereCond = null) where T : new() =>
|
|
localDb.Get(whereCond);
|
|
|
|
public async Task<List<AnagClie>> GetClienti(WhereCondContact? whereCond)
|
|
{
|
|
List<AnagClie> clienti = [];
|
|
whereCond ??= new WhereCondContact();
|
|
whereCond.OnlyContact = true;
|
|
|
|
if (networkService.ConnectionAvailable)
|
|
{
|
|
var response = await integryApiService.RetrieveAnagClie(
|
|
new CRMAnagRequestDTO
|
|
{
|
|
CodAnag = whereCond.CodAnag,
|
|
FlagStato = whereCond.FlagStato,
|
|
PartIva = whereCond.PartIva,
|
|
ReturnPersRif = !whereCond.OnlyContact
|
|
}
|
|
);
|
|
|
|
clienti = response.AnagClie ?? [];
|
|
}
|
|
else
|
|
{
|
|
clienti = await localDb.Get<AnagClie>(x =>
|
|
(whereCond.FlagStato != null && x.FlagStato.Equals(whereCond.FlagStato)) ||
|
|
(whereCond.PartIva != null && x.PartIva.Equals(whereCond.PartIva)) ||
|
|
(whereCond.PartIva == null && whereCond.FlagStato == null)
|
|
);
|
|
}
|
|
|
|
return clienti;
|
|
}
|
|
|
|
public async Task<List<PtbPros>> GetProspect(WhereCondContact? whereCond)
|
|
{
|
|
List<PtbPros> prospect = [];
|
|
whereCond ??= new WhereCondContact();
|
|
whereCond.OnlyContact = true;
|
|
|
|
if (networkService.ConnectionAvailable)
|
|
{
|
|
var response = await integryApiService.RetrieveProspect(
|
|
new CRMProspectRequestDTO
|
|
{
|
|
CodPpro = whereCond.CodAnag,
|
|
PartIva = whereCond.PartIva,
|
|
ReturnPersRif = !whereCond.OnlyContact
|
|
}
|
|
);
|
|
|
|
prospect = response.PtbPros ?? [];
|
|
}
|
|
else
|
|
{
|
|
prospect = await localDb.Get<PtbPros>(x =>
|
|
(whereCond.PartIva != null && x.PartIva.Equals(whereCond.PartIva)) ||
|
|
(whereCond.PartIva == null)
|
|
);
|
|
}
|
|
|
|
return prospect;
|
|
}
|
|
|
|
public async Task<List<ContactDTO>> GetContact(WhereCondContact? whereCond, DateTime? lastSync)
|
|
{
|
|
List<AnagClie>? contactList;
|
|
List<PtbPros>? prospectList;
|
|
whereCond ??= new WhereCondContact();
|
|
|
|
if (networkService.ConnectionAvailable)
|
|
{
|
|
var response = new UsersSyncResponseDTO();
|
|
|
|
var clienti = await integryApiService.RetrieveAnagClie(
|
|
new CRMAnagRequestDTO
|
|
{
|
|
CodAnag = whereCond.CodAnag,
|
|
FlagStato = whereCond.FlagStato,
|
|
PartIva = whereCond.PartIva,
|
|
ReturnPersRif = !whereCond.OnlyContact,
|
|
FilterDate = lastSync
|
|
}
|
|
);
|
|
|
|
response.AnagClie = clienti.AnagClie;
|
|
response.VtbDest = clienti.VtbDest;
|
|
response.VtbCliePersRif = clienti.VtbCliePersRif;
|
|
|
|
var prospect = await integryApiService.RetrieveProspect(
|
|
new CRMProspectRequestDTO
|
|
{
|
|
CodPpro = whereCond.CodAnag,
|
|
PartIva = whereCond.PartIva,
|
|
ReturnPersRif = !whereCond.OnlyContact,
|
|
FilterDate = lastSync
|
|
}
|
|
);
|
|
|
|
response.PtbPros = prospect.PtbPros;
|
|
response.PtbProsRif = prospect.PtbProsRif;
|
|
|
|
_ = UpdateDbUsers(response);
|
|
|
|
contactList = clienti.AnagClie;
|
|
prospectList = prospect.PtbPros;
|
|
}
|
|
else
|
|
{
|
|
contactList = await localDb.Get<AnagClie>(x =>
|
|
(whereCond.FlagStato != null && x.FlagStato.Equals(whereCond.FlagStato)) ||
|
|
(whereCond.PartIva != null && x.PartIva.Equals(whereCond.PartIva)) ||
|
|
(whereCond.PartIva == null && whereCond.FlagStato == null)
|
|
);
|
|
prospectList = await localDb.Get<PtbPros>(x =>
|
|
(whereCond.PartIva != null && x.PartIva.Equals(whereCond.PartIva)) ||
|
|
(whereCond.PartIva == null)
|
|
);
|
|
}
|
|
|
|
// Mappa i contatti
|
|
var contactMapper = mapper.Map<List<ContactDTO>>(contactList);
|
|
|
|
// Mappa i prospects
|
|
var prospectMapper = mapper.Map<List<ContactDTO>>(prospectList);
|
|
|
|
contactMapper.AddRange(prospectMapper);
|
|
|
|
return contactMapper;
|
|
}
|
|
|
|
public async Task<ContactDTO?> GetSpecificContact(string codAnag, bool isContact)
|
|
{
|
|
if (isContact)
|
|
{
|
|
var contact = (await localDb.Get<AnagClie>(x => x.CodAnag != null && x.CodAnag.Equals(codAnag)))
|
|
.LastOrDefault();
|
|
|
|
return contact == null ? null : mapper.Map<ContactDTO>(contact);
|
|
}
|
|
else
|
|
{
|
|
var contact = (await localDb.Get<PtbPros>(x => x.CodPpro != null && x.CodPpro.Equals(codAnag)))
|
|
.LastOrDefault();
|
|
|
|
return contact == null ? null : mapper.Map<ContactDTO>(contact);
|
|
}
|
|
}
|
|
|
|
public async Task<List<ActivityDTO>> GetActivityTryLocalDb(WhereCondActivity whereCond)
|
|
{
|
|
var activities = await localDb.Get<StbActivity>(x =>
|
|
(whereCond.ActivityId != null && x.ActivityId != null && whereCond.ActivityId.Equals(x.ActivityId)) ||
|
|
(whereCond.Start != null && whereCond.End != null && x.EffectiveTime == null &&
|
|
x.EstimatedTime >= whereCond.Start && x.EstimatedTime <= whereCond.End) ||
|
|
(x.EffectiveTime >= whereCond.Start && x.EffectiveTime <= whereCond.End) ||
|
|
(whereCond.ActivityId == null && (whereCond.Start == null || whereCond.End == null))
|
|
);
|
|
|
|
if (activities.IsNullOrEmpty() && networkService.ConnectionAvailable)
|
|
{
|
|
activities = await integryApiService.RetrieveActivity(
|
|
new CRMRetrieveActivityRequestDTO
|
|
{
|
|
StarDate = whereCond.Start,
|
|
EndDate = whereCond.End,
|
|
ActivityId = whereCond.ActivityId
|
|
}
|
|
);
|
|
|
|
_ = UpdateDb(activities);
|
|
}
|
|
else return [];
|
|
|
|
return await MapActivity(activities);
|
|
}
|
|
|
|
public async Task<List<ActivityDTO>> GetActivity(WhereCondActivity whereCond, bool useLocalDb)
|
|
{
|
|
List<StbActivity>? activities;
|
|
|
|
if (networkService.ConnectionAvailable && !useLocalDb)
|
|
{
|
|
activities = await integryApiService.RetrieveActivity(
|
|
new CRMRetrieveActivityRequestDTO
|
|
{
|
|
StarDate = whereCond.Start,
|
|
EndDate = whereCond.End,
|
|
ActivityId = whereCond.ActivityId
|
|
}
|
|
);
|
|
|
|
_ = UpdateDb(activities);
|
|
}
|
|
else return await GetActivityTryLocalDb(whereCond);
|
|
|
|
return await MapActivity(activities);
|
|
}
|
|
|
|
public async Task<List<ActivityDTO>> MapActivity(List<StbActivity>? activities)
|
|
{
|
|
if (activities == null) return [];
|
|
|
|
var codJcomList = activities
|
|
.Select(x => x.CodJcom)
|
|
.Where(x => !string.IsNullOrEmpty(x))
|
|
.Distinct().ToList();
|
|
|
|
var jtbComtList = await localDb.Get<JtbComt>(x => codJcomList.Contains(x.CodJcom));
|
|
|
|
var codAnagList = activities
|
|
.Select(x => x.CodAnag)
|
|
.Where(x => !string.IsNullOrEmpty(x))
|
|
.Distinct().ToList();
|
|
|
|
IDictionary<string, string?>? distinctUser = null;
|
|
|
|
if (userListState.AllUsers != null)
|
|
{
|
|
distinctUser = userListState.AllUsers
|
|
.Where(x => codAnagList.Contains(x.CodContact))
|
|
.ToDictionary(x => x.CodContact, x => x.RagSoc);
|
|
}
|
|
|
|
var returnDto = activities
|
|
.Select(activity =>
|
|
{
|
|
if (activity.CodJcom is "0000" && userSession.ProfileDb != null && userSession.ProfileDb.Equals("smetar", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
activity.CodJcom = null;
|
|
}
|
|
|
|
var dto = mapper.Map<ActivityDTO>(activity);
|
|
|
|
if (activity is { AlarmTime: not null, EstimatedTime: not null })
|
|
{
|
|
var minuteBefore = activity.EstimatedTime.Value - activity.AlarmTime.Value;
|
|
dto.MinuteBefore = (int)Math.Abs(minuteBefore.TotalMinutes);
|
|
|
|
dto.NotificationDate = dto.MinuteBefore == 0 ?
|
|
activity.EstimatedTime : activity.AlarmTime;
|
|
}
|
|
|
|
if (activity.CodJcom != null)
|
|
{
|
|
dto.Category = ActivityCategoryEnum.Commessa;
|
|
}
|
|
else
|
|
{
|
|
dto.Category = activity.CodAnag != null ? ActivityCategoryEnum.Interna : ActivityCategoryEnum.Memo;
|
|
}
|
|
|
|
if (dto.Category != ActivityCategoryEnum.Memo && activity.CodAnag != null)
|
|
{
|
|
string? ragSoc;
|
|
|
|
if (distinctUser != null && (distinctUser.TryGetValue(activity.CodAnag, out ragSoc) ||
|
|
distinctUser.TryGetValue(activity.CodAnag, out ragSoc)))
|
|
{
|
|
dto.Cliente = ragSoc;
|
|
}
|
|
}
|
|
|
|
dto.Commessa = jtbComtList.Find(x => x.CodJcom.Equals(dto.CodJcom));
|
|
return dto;
|
|
})
|
|
.ToList();
|
|
|
|
return returnDto;
|
|
}
|
|
|
|
private Task UpdateDbUsers(UsersSyncResponseDTO response)
|
|
{
|
|
return Task.Run(async () =>
|
|
{
|
|
try
|
|
{
|
|
if (response.AnagClie != null)
|
|
{
|
|
await localDb.InsertOrUpdate(response.AnagClie);
|
|
|
|
if (response.VtbDest != null) await localDb.InsertOrUpdate(response.VtbDest);
|
|
if (response.VtbCliePersRif != null) await localDb.InsertOrUpdate(response.VtbCliePersRif);
|
|
}
|
|
|
|
if (response.PtbPros != null)
|
|
{
|
|
await localDb.InsertOrUpdate(response.PtbPros);
|
|
|
|
if (response.PtbProsRif != null) await localDb.InsertOrUpdate(response.PtbProsRif);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine(e.Message);
|
|
SentrySdk.CaptureException(e);
|
|
throw;
|
|
}
|
|
});
|
|
}
|
|
|
|
private Task UpdateDb<T>(List<T>? entityList)
|
|
{
|
|
return Task.Run(() =>
|
|
{
|
|
if (entityList == null) return;
|
|
_ = localDb.InsertOrUpdate(entityList);
|
|
});
|
|
}
|
|
|
|
public Task InsertOrUpdate<T>(List<T> listToSave) =>
|
|
localDb.InsertOrUpdate(listToSave);
|
|
|
|
public Task InsertOrUpdate<T>(T objectToSave) =>
|
|
localDb.InsertOrUpdate<T>([objectToSave]);
|
|
|
|
public async Task DeleteProspect(string codPpro)
|
|
{
|
|
var persRifList = await GetTable<PtbProsRif>(x => x.CodPpro!.Equals(codPpro));
|
|
|
|
if (!persRifList.IsNullOrEmpty())
|
|
{
|
|
foreach (var persRif in persRifList)
|
|
{
|
|
await localDb.Delete(persRif);
|
|
}
|
|
}
|
|
|
|
var ptbPros = (await GetTable<PtbPros>(x => x.CodPpro!.Equals(codPpro))).FirstOrDefault();
|
|
|
|
if (ptbPros != null)
|
|
{
|
|
await localDb.Delete(ptbPros);
|
|
}
|
|
}
|
|
|
|
public Task Delete<T>(T objectToDelete) =>
|
|
localDb.Delete(objectToDelete);
|
|
|
|
public async Task DeleteActivity(ActivityDTO activity)
|
|
{
|
|
await localDb.Delete(
|
|
(await GetTable<StbActivity>(x => x.ActivityId.Equals(activity.ActivityId))).Last()
|
|
);
|
|
}
|
|
|
|
public Task ClearDb() =>
|
|
localDb.ResetDb();
|
|
} |