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> GetTable(Expression>? whereCond = null) where T : new() => localDb.Get(whereCond); public async Task> GetClienti(WhereCondContact? whereCond) { List 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(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> GetProspect(WhereCondContact? whereCond) { List 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(x => (whereCond.PartIva != null && x.PartIva.Equals(whereCond.PartIva)) || (whereCond.PartIva == null) ); } return prospect; } public async Task> GetContact(WhereCondContact? whereCond, DateTime? lastSync) { List? contactList; List? 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(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(x => (whereCond.PartIva != null && x.PartIva.Equals(whereCond.PartIva)) || (whereCond.PartIva == null) ); } // Mappa i contatti var contactMapper = mapper.Map>(contactList); // Mappa i prospects var prospectMapper = mapper.Map>(prospectList); contactMapper.AddRange(prospectMapper); return contactMapper; } public async Task GetSpecificContact(string codAnag, bool isContact) { if (isContact) { var contact = (await localDb.Get(x => x.CodAnag != null && x.CodAnag.Equals(codAnag))) .LastOrDefault(); return contact == null ? null : mapper.Map(contact); } else { var contact = (await localDb.Get(x => x.CodPpro != null && x.CodPpro.Equals(codAnag))) .LastOrDefault(); return contact == null ? null : mapper.Map(contact); } } public async Task> GetActivityTryLocalDb(WhereCondActivity whereCond) { var activities = await localDb.Get(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> GetActivity(WhereCondActivity whereCond, bool useLocalDb) { List? 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> MapActivity(List? activities) { if (activities == null) return []; var codJcomList = activities .Select(x => x.CodJcom) .Where(x => !string.IsNullOrEmpty(x)) .Distinct().ToList(); var jtbComtList = await localDb.Get(x => codJcomList.Contains(x.CodJcom)); var codAnagList = activities .Select(x => x.CodAnag) .Where(x => !string.IsNullOrEmpty(x)) .Distinct().ToList(); IDictionary? 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(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(List? entityList) { return Task.Run(() => { if (entityList == null) return; _ = localDb.InsertOrUpdate(entityList); }); } public Task InsertOrUpdate(List listToSave) => localDb.InsertOrUpdate(listToSave); public Task InsertOrUpdate(T objectToSave) => localDb.InsertOrUpdate([objectToSave]); public async Task DeleteProspect(string codPpro) { var persRifList = await GetTable(x => x.CodPpro!.Equals(codPpro)); if (!persRifList.IsNullOrEmpty()) { foreach (var persRif in persRifList) { await localDb.Delete(persRif); } } var ptbPros = (await GetTable(x => x.CodPpro!.Equals(codPpro))).FirstOrDefault(); if (ptbPros != null) { await localDb.Delete(ptbPros); } } public Task Delete(T objectToDelete) => localDb.Delete(objectToDelete); public async Task DeleteActivity(ActivityDTO activity) { await localDb.Delete( (await GetTable(x => x.ActivityId.Equals(activity.ActivityId))).Last() ); } public Task ClearDb() => localDb.ResetDb(); }