diff --git a/salesbook.Maui/App.xaml.cs b/salesbook.Maui/App.xaml.cs index 641e04a..17778c3 100644 --- a/salesbook.Maui/App.xaml.cs +++ b/salesbook.Maui/App.xaml.cs @@ -1,20 +1,15 @@ -using CommunityToolkit.Mvvm.Messaging; - namespace salesbook.Maui { public partial class App : Application { - private readonly IMessenger _messenger; - - public App(IMessenger messenger) + public App() { InitializeComponent(); - _messenger = messenger; } protected override Window CreateWindow(IActivationState? activationState) { - return new Window(new MainPage(_messenger)); + return new Window(new MainPage()); } } } diff --git a/salesbook.Maui/Core/Services/AttachedService.cs b/salesbook.Maui/Core/Services/AttachedService.cs index 1aa4fe4..5ccdd32 100644 --- a/salesbook.Maui/Core/Services/AttachedService.cs +++ b/salesbook.Maui/Core/Services/AttachedService.cs @@ -7,14 +7,39 @@ public class AttachedService : IAttachedService { public async Task SelectImage() { - var perm = await Permissions.RequestAsync(); - if (perm != PermissionStatus.Granted) return null; + // Richiesta permessi base + var cameraPerm = await Permissions.RequestAsync(); + var storagePerm = await Permissions.RequestAsync(); - var result = await FilePicker.PickAsync(new PickOptions + if (cameraPerm != PermissionStatus.Granted && storagePerm != PermissionStatus.Granted) + return null; + + // Mostro all'utente un popup di scelta + var action = await Application.Current.MainPage.DisplayActionSheet( + "Aggiungi immagine", + "Annulla", + null, + "Scatta foto", + "Scegli dalla galleria"); + + FileResult? result = null; + + try { - PickerTitle = "Scegli un'immagine", - FileTypes = FilePickerFileType.Images - }); + if (action == "Scatta foto") + { + result = await MediaPicker.Default.CapturePhotoAsync(); + } + else if (action == "Scegli dalla galleria") + { + result = await MediaPicker.Default.PickPhotoAsync(); + } + } + catch (Exception ex) + { + Console.WriteLine($"Errore selezione immagine: {ex.Message}"); + return null; + } return result is null ? null : await ConvertToDto(result, AttachedDTO.TypeAttached.Image); } diff --git a/salesbook.Maui/Core/Services/ManageDataService.cs b/salesbook.Maui/Core/Services/ManageDataService.cs index cf6081a..c6dd0ae 100644 --- a/salesbook.Maui/Core/Services/ManageDataService.cs +++ b/salesbook.Maui/Core/Services/ManageDataService.cs @@ -1,22 +1,23 @@ using AutoMapper; -using MudBlazor.Extensions; +using IntegryApiClient.Core.Domain.Abstraction.Contracts.Storage; using salesbook.Shared.Core.Dto; using salesbook.Shared.Core.Dto.Activity; using salesbook.Shared.Core.Dto.Contact; 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 Sentry.Protocol; using System.Linq.Expressions; -using salesbook.Shared.Core.Helpers; +using salesbook.Shared.Core.Dto.PageState; namespace salesbook.Maui.Core.Services; public class ManageDataService( LocalDbService localDb, IMapper mapper, + UserListState userListState, IIntegryApiService integryApiService, INetworkService networkService ) : IManageDataService @@ -86,7 +87,7 @@ public class ManageDataService( return prospect; } - public async Task> GetContact(WhereCondContact? whereCond) + public async Task> GetContact(WhereCondContact? whereCond, DateTime? lastSync) { List? contactList; List? prospectList; @@ -94,26 +95,37 @@ public class ManageDataService( 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 + ReturnPersRif = !whereCond.OnlyContact, + FilterDate = lastSync } ); - _ = UpdateDbUsers(clienti); + + 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 + ReturnPersRif = !whereCond.OnlyContact, + FilterDate = lastSync } ); - _ = UpdateDbUsers(prospect); + + response.PtbPros = prospect.PtbPros; + response.PtbProsRif = prospect.PtbProsRif; + + _ = UpdateDbUsers(response); contactList = clienti.AnagClie; prospectList = prospect.PtbPros; @@ -230,17 +242,20 @@ public class ManageDataService( .Distinct().ToList(); var jtbComtList = await localDb.Get(x => codJcomList.Contains(x.CodJcom)); - var commesseDict = jtbComtList.ToDictionary(x => x.CodJcom, x => x.Descrizione); var codAnagList = activities .Select(x => x.CodAnag) .Where(x => !string.IsNullOrEmpty(x)) .Distinct().ToList(); - var clientList = await localDb.Get(x => codAnagList.Contains(x.CodAnag)); - var distinctClient = clientList.ToDictionary(x => x.CodAnag, x => x.RagSoc); - var prospectList = await localDb.Get(x => codAnagList.Contains(x.CodPpro)); - var distinctProspect = prospectList.ToDictionary(x => x.CodPpro, x => x.RagSoc); + 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 => @@ -269,16 +284,14 @@ public class ManageDataService( { string? ragSoc; - if (distinctClient.TryGetValue(activity.CodAnag, out ragSoc) || - distinctProspect.TryGetValue(activity.CodAnag, out ragSoc)) + if (distinctUser != null && (distinctUser.TryGetValue(activity.CodAnag, out ragSoc) || + distinctUser.TryGetValue(activity.CodAnag, out ragSoc))) { dto.Cliente = ragSoc; } } - dto.Commessa = activity.CodJcom != null && commesseDict.TryGetValue(activity.CodJcom, out var descr) - ? descr - : null; + dto.Commessa = jtbComtList.LastOrDefault(); return dto; }) .ToList(); @@ -322,6 +335,26 @@ public class ManageDataService( 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); diff --git a/salesbook.Maui/MainPage.xaml.cs b/salesbook.Maui/MainPage.xaml.cs index 0b723b4..034b003 100644 --- a/salesbook.Maui/MainPage.xaml.cs +++ b/salesbook.Maui/MainPage.xaml.cs @@ -1,23 +1,10 @@ -using CommunityToolkit.Mvvm.Messaging; -using salesbook.Shared.Core.Messages.Back; - namespace salesbook.Maui { public partial class MainPage : ContentPage { - private readonly IMessenger _messenger; - - public MainPage(IMessenger messenger) + public MainPage() { InitializeComponent(); - _messenger = messenger; } - - protected override bool OnBackButtonPressed() - { - _messenger.Send(new HardwareBackMessage("back")); - return true; - } - } } diff --git a/salesbook.Maui/Platforms/Android/AndroidManifest.xml b/salesbook.Maui/Platforms/Android/AndroidManifest.xml index e38ccd8..7c85307 100644 --- a/salesbook.Maui/Platforms/Android/AndroidManifest.xml +++ b/salesbook.Maui/Platforms/Android/AndroidManifest.xml @@ -14,7 +14,10 @@ + + + diff --git a/salesbook.Maui/Platforms/iOS/Info.plist b/salesbook.Maui/Platforms/iOS/Info.plist index 0c883a2..103dc74 100644 --- a/salesbook.Maui/Platforms/iOS/Info.plist +++ b/salesbook.Maui/Platforms/iOS/Info.plist @@ -39,8 +39,11 @@ NSLocationWhenInUseUsageDescription L'app utilizza la tua posizione per allegarla alle attività. + NSCameraUsageDescription + Questa app necessita di accedere alla fotocamera per scattare foto. + NSPhotoLibraryUsageDescription - Consente di selezionare immagini da allegare alle attività. + Questa app necessita di accedere alla libreria foto. NSPhotoLibraryAddUsageDescription Permette all'app di salvare file o immagini nella tua libreria fotografica se necessario. diff --git a/salesbook.Maui/salesbook.Maui.csproj b/salesbook.Maui/salesbook.Maui.csproj index 9b32639..ba6cf69 100644 --- a/salesbook.Maui/salesbook.Maui.csproj +++ b/salesbook.Maui/salesbook.Maui.csproj @@ -78,8 +78,8 @@ - Apple Distribution: Integry S.r.l. (UNP26J4R89) - + Apple Development: Created via API (5B7B69P4JY) + VS: it.integry.salesbook Development manual @@ -95,16 +95,6 @@ - - - PreserveNewest - - - - - - - @@ -130,16 +120,26 @@ + + + PreserveNewest + + + + + + + - + - - - - - - + + + + + + diff --git a/salesbook.Shared/Components/Layout/HeaderLayout.razor.css b/salesbook.Shared/Components/Layout/HeaderLayout.razor.css index 82cd2a6..c777948 100644 --- a/salesbook.Shared/Components/Layout/HeaderLayout.razor.css +++ b/salesbook.Shared/Components/Layout/HeaderLayout.razor.css @@ -14,6 +14,8 @@ position: relative; } +.header-content > .title { width: 100%; } + .header-content.with-back .page-title { position: absolute; left: 50%; diff --git a/salesbook.Shared/Components/Layout/NavMenu.razor b/salesbook.Shared/Components/Layout/NavMenu.razor index f1634b0..fc379bd 100644 --- a/salesbook.Shared/Components/Layout/NavMenu.razor +++ b/salesbook.Shared/Components/Layout/NavMenu.razor @@ -3,6 +3,7 @@ @using salesbook.Shared.Core.Dto.Activity @using salesbook.Shared.Core.Dto.PageState @using salesbook.Shared.Core.Entity +@using salesbook.Shared.Core.Interface.System.Network @using salesbook.Shared.Core.Messages.Activity.Copy @using salesbook.Shared.Core.Messages.Activity.New @using salesbook.Shared.Core.Messages.Contact @@ -13,6 +14,7 @@ @inject CopyActivityService CopyActivityService @inject NewPushNotificationService NewPushNotificationService @inject NotificationState Notification +@inject INetworkService NetworkService @inject NotificationsLoadedService NotificationsLoadedService
@@ -55,8 +57,8 @@ - Nuovo contatto - Nuova attività + Nuovo contatto + Nuova attività } diff --git a/salesbook.Shared/Components/Layout/NavMenu.razor.css b/salesbook.Shared/Components/Layout/NavMenu.razor.css index e73f065..ecd8bcf 100644 --- a/salesbook.Shared/Components/Layout/NavMenu.razor.css +++ b/salesbook.Shared/Components/Layout/NavMenu.razor.css @@ -9,7 +9,7 @@ .animated-navbar.show-nav { transform: translateY(0); } -.animated-navbar.hide-nav { transform: translateY(100%); } +.animated-navbar.hide-nav { transform: translateY(150%); } .animated-navbar.with-plus { margin-left: 30px; } diff --git a/salesbook.Shared/Components/Pages/Calendar.razor b/salesbook.Shared/Components/Pages/Calendar.razor index 3429e2b..d988e69 100644 --- a/salesbook.Shared/Components/Pages/Calendar.razor +++ b/salesbook.Shared/Components/Pages/Calendar.razor @@ -4,11 +4,13 @@ @using salesbook.Shared.Components.SingleElements @using salesbook.Shared.Components.SingleElements.BottomSheet @using salesbook.Shared.Core.Dto.Activity +@using salesbook.Shared.Core.Dto.PageState @using salesbook.Shared.Core.Interface @using salesbook.Shared.Core.Messages.Activity.New @inject IManageDataService ManageData @inject IJSRuntime JS @inject NewActivityService NewActivity +@inject UserListState UserState @code { - // Modelli per ottimizzazione rendering private record DayData(DateTime Date, string CssClass, bool HasEvents, CategoryData[] EventCategories, string DayName = ""); @@ -221,11 +222,20 @@ PrepareRenderingData(); NewActivity.OnActivityCreated += async activityId => await OnActivityCreated(activityId); + UserState.OnUsersLoaded += async () => await InvokeAsync(LoadData); } protected override async Task OnAfterRenderAsync(bool firstRender) { - if (firstRender) + if (firstRender && UserState.IsLoaded) + { + await LoadData(); + } + } + + private async Task LoadData() + { + if (!_isInitialized) { Filter.User = new HashSet { UserSession.User.Username }; diff --git a/salesbook.Shared/Components/Pages/Home.razor b/salesbook.Shared/Components/Pages/Home.razor index 3830abb..0df4d04 100644 --- a/salesbook.Shared/Components/Pages/Home.razor +++ b/salesbook.Shared/Components/Pages/Home.razor @@ -21,6 +21,8 @@ { protected override async Task OnInitializedAsync() { + NetworkService.ConnectionAvailable = NetworkService.IsNetworkAvailable(); + await LoadNotification(); await CheckAndRequestPermissions(); @@ -54,9 +56,6 @@ private async Task CheckAndRequestPermissions() { await NotificationManager.RequestAccess(); - - // if (BatteryOptimizationManagerService.IsBatteryOptimizationEnabled()) - // BatteryOptimizationManagerService.OpenBatteryOptimizationSettings(_ => { }); } private Task StartSyncUser() diff --git a/salesbook.Shared/Components/Pages/User.razor b/salesbook.Shared/Components/Pages/User.razor index cca91db..072dd64 100644 --- a/salesbook.Shared/Components/Pages/User.razor +++ b/salesbook.Shared/Components/Pages/User.razor @@ -35,7 +35,7 @@ else
- + @UtilityString.ExtractInitials(Anag.RagSoc) @@ -55,41 +55,45 @@ else
@@ -773,7 +777,16 @@ else { var result = await ModalHelpers.OpenUserForm(Dialog, anag); - if (result is { Canceled: false }) + if (result is { Canceled: false, Data: not null } && result.Data.GetType() == typeof(AnagClie)) + { + var clie = (AnagClie)result.Data; + IsContact = true; + CodContact = clie.CodAnag!; + + await LoadAnagAsync(); + SaveDataToSession(); + } + else if (result is { Canceled: false }) { await LoadAnagAsync(); SaveDataToSession(); diff --git a/salesbook.Shared/Components/Pages/User.razor.css b/salesbook.Shared/Components/Pages/User.razor.css index 68f62dd..829a93a 100644 --- a/salesbook.Shared/Components/Pages/User.razor.css +++ b/salesbook.Shared/Components/Pages/User.razor.css @@ -39,9 +39,10 @@ .section-info { display: flex; - justify-content: space-between; flex-direction: row; padding: .4rem 1.2rem .8rem; + flex-wrap: wrap; + justify-content: space-between; } .section-personal-info { diff --git a/salesbook.Shared/Components/SingleElements/Card/ActivityCard.razor b/salesbook.Shared/Components/SingleElements/Card/ActivityCard.razor index 7fa75f1..befcc7d 100644 --- a/salesbook.Shared/Components/SingleElements/Card/ActivityCard.razor +++ b/salesbook.Shared/Components/SingleElements/Card/ActivityCard.razor @@ -1,4 +1,3 @@ -@using salesbook.Shared.Core.Dto @using salesbook.Shared.Core.Dto.Activity @using salesbook.Shared.Core.Entity @using salesbook.Shared.Core.Helpers.Enum @@ -12,7 +11,7 @@ @switch (Activity.Category) { case ActivityCategoryEnum.Commessa: - @Activity.Commessa + @Activity.Commessa?.Descrizione break; case ActivityCategoryEnum.Interna: @Activity.Cliente diff --git a/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor b/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor index c52854c..4f1d798 100644 --- a/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor +++ b/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor @@ -41,7 +41,7 @@
Assegnata a + -
- - Aggiungi allegati - - - @if (!IsNew) - { -
- - + - Duplica + Aggiungi allegati -
+ @if (!IsNew) + { +
- - Elimina - - } -
+ + Duplica + + +
+ + + Elimina + + } +
+ }
@@ -400,6 +404,8 @@ if (!ActivityModel.UserName.IsNullOrEmpty()) SelectedUser = Users.FindLast(x => x.UserName.Equals(ActivityModel.UserName)); + SelectedComessa = ActivityModel.Commessa; + ActivityResult = await ManageData.GetTable(); Clienti = await ManageData.GetClienti(new WhereCondContact { FlagStato = "A" }); Pros = await ManageData.GetProspect(); @@ -513,7 +519,7 @@ if (com != null) { ActivityModel.CodJcom = com.CodJcom; - ActivityModel.Commessa = com.Descrizione; + ActivityModel.Commessa = com; } else { @@ -568,6 +574,8 @@ private void OpenSelectEsito() { + if (IsView) return; + if (!IsNew && (ActivityModel.UserName is null || !ActivityModel.UserName.Equals(UserSession.User.Username))) { Snackbar.Add("Non puoi inserire un esito per un'attività che non ti è stata assegnata.", Severity.Info); diff --git a/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor b/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor index 16f5e69..2427b3d 100644 --- a/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor +++ b/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor @@ -40,6 +40,8 @@ private AttachedDTO? Attached { get; set; } + private bool SelectTypePicture { get; set; } + protected override async Task OnInitializedAsync() { Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter; diff --git a/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor.css b/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor.css index 6eeaddd..9e4e250 100644 --- a/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor.css +++ b/salesbook.Shared/Components/SingleElements/Modal/AddAttached.razor.css @@ -1,7 +1,9 @@ .content.attached { display: flex; - flex-direction: column; gap: 2rem; padding: 1rem; height: unset; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; } diff --git a/salesbook.Shared/Components/SingleElements/Modal/ContactForm.razor b/salesbook.Shared/Components/SingleElements/Modal/ContactForm.razor index 46f9fa9..1eb9ca1 100644 --- a/salesbook.Shared/Components/SingleElements/Modal/ContactForm.razor +++ b/salesbook.Shared/Components/SingleElements/Modal/ContactForm.razor @@ -86,20 +86,19 @@
Tipo cliente - - @if (VtbTipi.IsNullOrEmpty()) - { - Nessun tipo cliente trovato - } - else - { - - @foreach (var tipo in VtbTipi) - { - @($"{tipo.CodVtip} - {tipo.Descrizione}") - } - - } + +
@@ -241,15 +240,19 @@
Agente - - - @foreach (var user in Users) - { - @($"{user.UserCode} - {user.FullName}") - } - + +
@@ -268,9 +271,9 @@
} -
- @if (IsNew) - { + @if (IsNew) + { +
Persona di riferimento - } - else +
+ } + else + { + @if (NetworkService.ConnectionAvailable && !ContactModel.IsContact) { - @if (NetworkService.ConnectionAvailable && !ContactModel.IsContact) - { +
Converti in cliente - } +
} -
+ }
@@ -351,11 +356,17 @@ private bool OpenSearchAddress { get; set; } private IndirizzoDTO Address { get; set; } + //Agente + private StbUser? SelectedUser { get; set; } + + //Type + private VtbTipi? SelectedType { get; set; } + protected override async Task OnInitializedAsync() { Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter; - await LoadData(); + _ = LoadData(); LabelSave = IsNew ? "Aggiungi" : null; } @@ -403,24 +414,27 @@ MudDialog.Close(response); } - private async Task LoadData() + private Task LoadData() { - if (IsNew) + return Task.Run(async () => { - var loggedUser = (await ManageData.GetTable(x => x.UserName.Equals(UserSession.User.Username))).Last(); + if (IsNew) + { + var loggedUser = (await ManageData.GetTable(x => x.UserName.Equals(UserSession.User.Username))).Last(); - ContactModel.IsContact = false; - ContactModel.Nazione = "IT"; - ContactModel.CodVage = loggedUser.UserCode; - } - else - { - ContactModel = OriginalModel!.Clone(); - } + ContactModel.IsContact = false; + ContactModel.Nazione = "IT"; + ContactModel.CodVage = loggedUser.UserCode; + } + else + { + ContactModel = OriginalModel!.Clone(); + } - Users = await ManageData.GetTable(x => x.KeyGroup == 5); - Nazioni = await ManageData.GetTable(); - VtbTipi = await ManageData.GetTable(); + Users = await ManageData.GetTable(x => x.KeyGroup == 5); + Nazioni = await ManageData.GetTable(); + VtbTipi = await ManageData.GetTable(); + }); } private void OnAfterChangeValue() @@ -562,9 +576,83 @@ private async Task ConvertProspectToContact() { - await IntegryApiService.TransferProspect(new CRMTransferProspectRequestDTO + VisibleOverlay = true; + StateHasChanged(); + + var response = await IntegryApiService.TransferProspect(new CRMTransferProspectRequestDTO { CodPpro = ContactModel.CodContact }); + + await ManageData.DeleteProspect(ContactModel.CodContact); + + if (response.AnagClie != null) + await ManageData.InsertOrUpdate(response.AnagClie); + + if (response.VtbCliePersRif != null) + await ManageData.InsertOrUpdate(response.VtbCliePersRif); + + if (response.VtbDest != null) + await ManageData.InsertOrUpdate(response.VtbDest); + + SuccessAnimation = true; + StateHasChanged(); + + await Task.Delay(1250); + MudDialog.Close(response.AnagClie); + } + + private async Task OnUserSelectedAfter() + { + ContactModel.CodVage = SelectedUser?.UserCode; + OnAfterChangeValue(); + } + + private Task> SearchUtentiAsync(string value, CancellationToken token) + { + IEnumerable list; + + if (string.IsNullOrWhiteSpace(value)) + { + list = Users.OrderBy(u => u.FullName).Take(50); + } + else + { + list = Users + .Where(x => x.UserName.Contains(value, StringComparison.OrdinalIgnoreCase) + || x.FullName.Contains(value, StringComparison.OrdinalIgnoreCase)) + .OrderBy(u => u.FullName) + .Take(50); + } + + return Task.FromResult(token.IsCancellationRequested ? [] : list); + } + + private async Task OnTypeSelectedAfter() + { + ContactModel.CodVtip = SelectedType?.CodVtip; + OnAfterChangeValue(); + } + + private Task> SearchTypeAsync(string value, CancellationToken token) + { + IEnumerable list = []; + + if (VtbTipi == null) return Task.FromResult(token.IsCancellationRequested ? [] : list); + + if (string.IsNullOrWhiteSpace(value)) + { + list = VtbTipi.OrderBy(u => u.CodVtip); + } + else + { + list = VtbTipi + .Where(x => x.CodVtip.Contains(value, StringComparison.OrdinalIgnoreCase) + || x.Descrizione.Contains(value, StringComparison.OrdinalIgnoreCase)) + .OrderBy(u => u.CodVtip) + .Take(50); + } + + return Task.FromResult(token.IsCancellationRequested ? [] : list); } } \ No newline at end of file diff --git a/salesbook.Shared/Core/Dto/Activity/ActivityDTO.cs b/salesbook.Shared/Core/Dto/Activity/ActivityDTO.cs index e62cba0..f96e682 100644 --- a/salesbook.Shared/Core/Dto/Activity/ActivityDTO.cs +++ b/salesbook.Shared/Core/Dto/Activity/ActivityDTO.cs @@ -6,7 +6,7 @@ namespace salesbook.Shared.Core.Dto.Activity; public class ActivityDTO : StbActivity { - public string? Commessa { get; set; } + public JtbComt? Commessa { get; set; } public string? Cliente { get; set; } public ActivityCategoryEnum Category { get; set; } public bool Complete { get; set; } diff --git a/salesbook.Shared/Core/Dto/CRMTransferProspectResponseDTO.cs b/salesbook.Shared/Core/Dto/CRMTransferProspectResponseDTO.cs index 863124c..7ce0db3 100644 --- a/salesbook.Shared/Core/Dto/CRMTransferProspectResponseDTO.cs +++ b/salesbook.Shared/Core/Dto/CRMTransferProspectResponseDTO.cs @@ -7,4 +7,10 @@ public class CRMTransferProspectResponseDTO { [JsonPropertyName("anagClie")] public AnagClie? AnagClie { get; set; } + + [JsonPropertyName("vtbDest")] + public List? VtbDest { get; set; } + + [JsonPropertyName("vtbCliePersRif")] + public List? VtbCliePersRif { get; set; } } \ No newline at end of file diff --git a/salesbook.Shared/Core/Dto/PageState/UserListState.cs b/salesbook.Shared/Core/Dto/PageState/UserListState.cs index c1451b0..7088d4d 100644 --- a/salesbook.Shared/Core/Dto/PageState/UserListState.cs +++ b/salesbook.Shared/Core/Dto/PageState/UserListState.cs @@ -6,6 +6,8 @@ public class UserListState { public List? GroupedUserList { get; set; } public List? FilteredGroupedUserList { get; set; } + + public List? AllUsers { get; set; } public bool IsLoaded { get; set; } public bool IsLoading { get; set; } diff --git a/salesbook.Shared/Core/Interface/IManageDataService.cs b/salesbook.Shared/Core/Interface/IManageDataService.cs index 41769d4..993e083 100644 --- a/salesbook.Shared/Core/Interface/IManageDataService.cs +++ b/salesbook.Shared/Core/Interface/IManageDataService.cs @@ -12,7 +12,7 @@ public interface IManageDataService Task> GetClienti(WhereCondContact? whereCond = null); Task> GetProspect(WhereCondContact? whereCond = null); - Task> GetContact(WhereCondContact whereCond); + Task> GetContact(WhereCondContact whereCond, DateTime? lastSync = null); Task GetSpecificContact(string codAnag, bool IsContact); Task> GetActivityTryLocalDb(WhereCondActivity whereCond); @@ -21,6 +21,7 @@ public interface IManageDataService Task InsertOrUpdate(T objectToSave); Task InsertOrUpdate(List listToSave); + Task DeleteProspect(string codPpro); Task Delete(T objectToDelete); Task DeleteActivity(ActivityDTO activity); diff --git a/salesbook.Shared/Core/Services/PreloadService.cs b/salesbook.Shared/Core/Services/PreloadService.cs index 2712494..1915d5e 100644 --- a/salesbook.Shared/Core/Services/PreloadService.cs +++ b/salesbook.Shared/Core/Services/PreloadService.cs @@ -25,6 +25,7 @@ public class PreloadService(IManageDataService manageData, UserListState userSta userState.GroupedUserList = BuildGroupedList(sorted); userState.FilteredGroupedUserList = userState.GroupedUserList; + userState.AllUsers = users; userState.NotifyUsersLoaded(); } diff --git a/salesbook.Shared/salesbook.Shared.csproj b/salesbook.Shared/salesbook.Shared.csproj index 86765d8..cc2dadb 100644 --- a/salesbook.Shared/salesbook.Shared.csproj +++ b/salesbook.Shared/salesbook.Shared.csproj @@ -25,12 +25,12 @@ - - + + - - - + + +
diff --git a/salesbook.Web/Core/Services/ManageDataService.cs b/salesbook.Web/Core/Services/ManageDataService.cs index a9a1b8c..703d7f2 100644 --- a/salesbook.Web/Core/Services/ManageDataService.cs +++ b/salesbook.Web/Core/Services/ManageDataService.cs @@ -24,6 +24,11 @@ public class ManageDataService : IManageDataService throw new NotImplementedException(); } + public Task> GetContact(WhereCondContact whereCond, DateTime? lastSync = null) + { + throw new NotImplementedException(); + } + public Task> GetContact(WhereCondContact whereCond) { throw new NotImplementedException(); @@ -54,6 +59,11 @@ public class ManageDataService : IManageDataService throw new NotImplementedException(); } + public Task DeleteProspect(string codPpro) + { + throw new NotImplementedException(); + } + public Task Delete(T objectToDelete) { throw new NotImplementedException(); diff --git a/salesbook.Web/salesbook.Web.csproj b/salesbook.Web/salesbook.Web.csproj index 78e0477..f23565a 100644 --- a/salesbook.Web/salesbook.Web.csproj +++ b/salesbook.Web/salesbook.Web.csproj @@ -17,9 +17,9 @@ - - - + + +