From e338e7d253e3c2fd8e6bdf5fb948b1d1e3639b88 Mon Sep 17 00:00:00 2001 From: MarcoE Date: Fri, 14 Nov 2025 09:58:52 +0100 Subject: [PATCH 1/5] Fix caricamenti in Modal Activity --- .../Components/SingleElements/Modal/ActivityForm.razor | 3 +++ 1 file changed, 3 insertions(+) diff --git a/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor b/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor index b91ab32..7811692 100644 --- a/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor +++ b/salesbook.Shared/Components/SingleElements/Modal/ActivityForm.razor @@ -460,7 +460,10 @@ Users = await ManageData.GetTable(); if (!ActivityModel.UserName.IsNullOrEmpty()) + { SelectedUser = Users.FindLast(x => x.UserName.Equals(ActivityModel.UserName)); + await InvokeAsync(StateHasChanged); + } if (!IsNew && Id != null) ActivityFileList = await IntegryApiService.GetActivityFile(Id); From 3fd5410bf52ab24e883c0af66ccd88399e43d9d6 Mon Sep 17 00:00:00 2001 From: MarcoE Date: Fri, 14 Nov 2025 12:40:17 +0100 Subject: [PATCH 2/5] Aggiunta versione app a video --- salesbook.Maui/Core/System/GenericSystemService.cs | 8 ++++++++ salesbook.Maui/MauiProgram.cs | 3 +++ salesbook.Shared/Components/Pages/Login.razor | 4 +++- salesbook.Shared/Components/Pages/PersonalInfo.razor | 9 +++++++-- salesbook.Shared/Components/Pages/SyncPage.razor | 3 +++ .../Components/SingleElements/AppVersion.razor | 6 ++++++ .../Components/SingleElements/AppVersion.razor.css | 11 +++++++++++ .../Core/Interface/System/IGenericSystemService.cs | 6 ++++++ 8 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 salesbook.Maui/Core/System/GenericSystemService.cs create mode 100644 salesbook.Shared/Components/SingleElements/AppVersion.razor create mode 100644 salesbook.Shared/Components/SingleElements/AppVersion.razor.css create mode 100644 salesbook.Shared/Core/Interface/System/IGenericSystemService.cs diff --git a/salesbook.Maui/Core/System/GenericSystemService.cs b/salesbook.Maui/Core/System/GenericSystemService.cs new file mode 100644 index 0000000..022f53d --- /dev/null +++ b/salesbook.Maui/Core/System/GenericSystemService.cs @@ -0,0 +1,8 @@ +using salesbook.Shared.Core.Interface.System; + +namespace salesbook.Maui.Core.System; + +public class GenericSystemService : IGenericSystemService +{ + public string GetCurrentAppVersion() => AppInfo.VersionString; +} \ No newline at end of file diff --git a/salesbook.Maui/MauiProgram.cs b/salesbook.Maui/MauiProgram.cs index e1bf355..7430936 100644 --- a/salesbook.Maui/MauiProgram.cs +++ b/salesbook.Maui/MauiProgram.cs @@ -7,6 +7,7 @@ using MudBlazor.Services; using MudExtensions.Services; using salesbook.Maui.Core.RestClient.IntegryApi; using salesbook.Maui.Core.Services; +using salesbook.Maui.Core.System; using salesbook.Maui.Core.System.Network; using salesbook.Maui.Core.System.Notification; using salesbook.Maui.Core.System.Notification.Push; @@ -16,6 +17,7 @@ using salesbook.Shared.Core.Dto.PageState; using salesbook.Shared.Core.Helpers; using salesbook.Shared.Core.Interface; using salesbook.Shared.Core.Interface.IntegryApi; +using salesbook.Shared.Core.Interface.System; using salesbook.Shared.Core.Interface.System.Network; using salesbook.Shared.Core.Interface.System.Notification; using salesbook.Shared.Core.Messages.Activity.Copy; @@ -102,6 +104,7 @@ namespace salesbook.Maui builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); _ = typeof(System.Runtime.InteropServices.SafeHandle); diff --git a/salesbook.Shared/Components/Pages/Login.razor b/salesbook.Shared/Components/Pages/Login.razor index fd39faf..756401c 100644 --- a/salesbook.Shared/Components/Pages/Login.razor +++ b/salesbook.Shared/Components/Pages/Login.razor @@ -1,8 +1,10 @@ @page "/login" @using salesbook.Shared.Components.Layout.Spinner +@using salesbook.Shared.Core.Interface.System @using salesbook.Shared.Core.Services @inject IUserAccountService UserAccountService @inject AppAuthenticationStateProvider AuthenticationStateProvider +@inject IGenericSystemService GenericSystemService @if (Spinner) { @@ -34,7 +36,7 @@ else diff --git a/salesbook.Shared/Components/Pages/PersonalInfo.razor b/salesbook.Shared/Components/Pages/PersonalInfo.razor index 719bf67..7ff2873 100644 --- a/salesbook.Shared/Components/Pages/PersonalInfo.razor +++ b/salesbook.Shared/Components/Pages/PersonalInfo.razor @@ -1,6 +1,7 @@ @page "/PersonalInfo" @attribute [Authorize] @using salesbook.Shared.Components.Layout +@using salesbook.Shared.Components.SingleElements @using salesbook.Shared.Core.Authorization.Enum @using salesbook.Shared.Core.Interface @using salesbook.Shared.Core.Interface.System.Network @@ -16,7 +17,8 @@
- + @UtilityString.ExtractInitials(UserSession.User.Fullname) @@ -24,7 +26,8 @@ @UserSession.User.Fullname @if (UserSession.User.KeyGroup is not null) { - @(((KeyGroupEnum)UserSession.User.KeyGroup).ConvertToHumanReadable()) + @(((KeyGroupEnum)UserSession.User.KeyGroup).ConvertToHumanReadable()) }
@@ -113,6 +116,8 @@
+ + } @code { diff --git a/salesbook.Shared/Components/Pages/SyncPage.razor b/salesbook.Shared/Components/Pages/SyncPage.razor index 1597d9f..3cd0968 100644 --- a/salesbook.Shared/Components/Pages/SyncPage.razor +++ b/salesbook.Shared/Components/Pages/SyncPage.razor @@ -1,12 +1,15 @@ @page "/sync" @page "/sync/{DateFilter}" @using salesbook.Shared.Components.Layout.Spinner +@using salesbook.Shared.Components.SingleElements @using salesbook.Shared.Core.Interface @inject ISyncDbService syncDb @inject IManageDataService manageData + + @code { [Parameter] public string? DateFilter { get; set; } diff --git a/salesbook.Shared/Components/SingleElements/AppVersion.razor b/salesbook.Shared/Components/SingleElements/AppVersion.razor new file mode 100644 index 0000000..0b76be2 --- /dev/null +++ b/salesbook.Shared/Components/SingleElements/AppVersion.razor @@ -0,0 +1,6 @@ +@using salesbook.Shared.Core.Interface.System +@inject IGenericSystemService GenericSystemService + +
+ @($"v{GenericSystemService.GetCurrentAppVersion()}") +
\ No newline at end of file diff --git a/salesbook.Shared/Components/SingleElements/AppVersion.razor.css b/salesbook.Shared/Components/SingleElements/AppVersion.razor.css new file mode 100644 index 0000000..e4baf00 --- /dev/null +++ b/salesbook.Shared/Components/SingleElements/AppVersion.razor.css @@ -0,0 +1,11 @@ +.app-version{ + width: 100%; + display: flex; + justify-content: center; + margin: 8px 0; +} + +.app-version span{ + font-size: smaller; + color: var(--mud-palette-gray-darker); +} \ No newline at end of file diff --git a/salesbook.Shared/Core/Interface/System/IGenericSystemService.cs b/salesbook.Shared/Core/Interface/System/IGenericSystemService.cs new file mode 100644 index 0000000..865e0b1 --- /dev/null +++ b/salesbook.Shared/Core/Interface/System/IGenericSystemService.cs @@ -0,0 +1,6 @@ +namespace salesbook.Shared.Core.Interface.System; + +public interface IGenericSystemService +{ + string GetCurrentAppVersion(); +} \ No newline at end of file From a91e08f162faa30a007d12b4ecf4fd7d8aa1e194 Mon Sep 17 00:00:00 2001 From: MarcoE Date: Fri, 14 Nov 2025 15:59:09 +0100 Subject: [PATCH 3/5] Aggiunta sync giornaliera delle commesse --- salesbook.Shared/Components/Pages/Home.razor | 8 ++++++ .../Components/Pages/SyncPage.razor | 27 ++++++++++--------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/salesbook.Shared/Components/Pages/Home.razor b/salesbook.Shared/Components/Pages/Home.razor index 028a2d8..cdf0185 100644 --- a/salesbook.Shared/Components/Pages/Home.razor +++ b/salesbook.Shared/Components/Pages/Home.razor @@ -23,6 +23,7 @@ { var lastSyncDate = LocalStorage.Get("last-sync"); var syncAllData = lastSyncDate.Equals(DateTime.MinValue) || (DateTime.Now - lastSyncDate).TotalDays >= 7; + var syncCodJcom = lastSyncDate.Day != DateTime.Now.Day; if (!FormFactor.IsWeb() && NetworkService.ConnectionAvailable && syncAllData) { @@ -31,6 +32,13 @@ return; } + if (syncCodJcom && !syncAllData) + { + var returnPath = System.Web.HttpUtility.UrlEncode("/"); + NavigationManager.NavigateTo($"/sync/{DateTime.Today:yyyy-MM-dd}?path={returnPath}"); + return; + } + NetworkService.ConnectionAvailable = NetworkService.IsNetworkAvailable(); await LoadNotification(); diff --git a/salesbook.Shared/Components/Pages/SyncPage.razor b/salesbook.Shared/Components/Pages/SyncPage.razor index 3cd0968..7c93c2a 100644 --- a/salesbook.Shared/Components/Pages/SyncPage.razor +++ b/salesbook.Shared/Components/Pages/SyncPage.razor @@ -3,8 +3,8 @@ @using salesbook.Shared.Components.Layout.Spinner @using salesbook.Shared.Components.SingleElements @using salesbook.Shared.Core.Interface -@inject ISyncDbService syncDb -@inject IManageDataService manageData +@inject ISyncDbService SyncDb +@inject IManageDataService ManageData @@ -15,13 +15,15 @@ private Dictionary Elements { get; set; } = new(); - private bool _hasStarted = false; - private int _completedCount = 0; + private bool _hasStarted; + private int _completedCount; protected override void OnInitialized() { Elements["Commesse"] = false; - Elements["Impostazioni"] = false; + + if (DateFilter is null) + Elements["Impostazioni"] = false; } protected override async Task OnAfterRenderAsync(bool firstRender) @@ -31,9 +33,7 @@ _hasStarted = true; if (DateFilter is null) - { - await manageData.ClearDb(); - } + await ManageData.ClearDb(); await Task.WhenAll( RunAndTrack(SetCommesse), @@ -61,7 +61,7 @@ private async Task SetCommesse() { - await Task.Run(async () => { await syncDb.GetAndSaveCommesse(DateFilter); }); + await Task.Run(async () => { await SyncDb.GetAndSaveCommesse(DateFilter); }); Elements["Commesse"] = true; StateHasChanged(); @@ -69,10 +69,13 @@ private async Task SetSettings() { - await Task.Run(async () => { await syncDb.GetAndSaveSettings(DateFilter); }); + if (DateFilter is null) + { + await Task.Run(async () => { await SyncDb.GetAndSaveSettings(DateFilter); }); - Elements["Impostazioni"] = true; - StateHasChanged(); + Elements["Impostazioni"] = true; + StateHasChanged(); + } } } \ No newline at end of file From e4b252f301b638af24f60a24ad2efa5f4482d200 Mon Sep 17 00:00:00 2001 From: MarcoE Date: Mon, 17 Nov 2025 11:11:05 +0100 Subject: [PATCH 4/5] Migliorato caricamento clienti --- .../Core/Services/ManageDataService.cs | 94 ++++++++++++------- .../Components/Pages/PersonalInfo.razor | 4 +- .../Core/Services/PreloadService.cs | 13 ++- 3 files changed, 74 insertions(+), 37 deletions(-) diff --git a/salesbook.Maui/Core/Services/ManageDataService.cs b/salesbook.Maui/Core/Services/ManageDataService.cs index faa35d8..a9c240e 100644 --- a/salesbook.Maui/Core/Services/ManageDataService.cs +++ b/salesbook.Maui/Core/Services/ManageDataService.cs @@ -90,14 +90,22 @@ public class ManageDataService( public async Task> GetContact(WhereCondContact? whereCond, DateTime? lastSync) { - List? contactList; - List? prospectList; whereCond ??= new WhereCondContact(); + // Ottengo liste locali + var contactList = await localDb.Get(x => + (whereCond.FlagStato != null && x.FlagStato == whereCond.FlagStato) || + (whereCond.PartIva != null && x.PartIva == whereCond.PartIva) || + (whereCond.PartIva == null && whereCond.FlagStato == null) + ); + + var prospectList = await localDb.Get(x => + (whereCond.PartIva != null && x.PartIva == whereCond.PartIva) || + (whereCond.PartIva == null) + ); + if (networkService.ConnectionAvailable) { - var response = new UsersSyncResponseDTO(); - var clienti = await integryApiService.RetrieveAnagClie( new CRMAnagRequestDTO { @@ -109,10 +117,6 @@ public class ManageDataService( } ); - response.AnagClie = clienti.AnagClie; - response.VtbDest = clienti.VtbDest; - response.VtbCliePersRif = clienti.VtbCliePersRif; - var prospect = await integryApiService.RetrieveProspect( new CRMProspectRequestDTO { @@ -122,38 +126,62 @@ public class ManageDataService( FilterDate = lastSync } ); + + _ = UpdateDbUsers(new UsersSyncResponseDTO + { + AnagClie = clienti.AnagClie, + VtbDest = clienti.VtbDest, + VtbCliePersRif = clienti.VtbCliePersRif, + PtbPros = prospect.PtbPros, + PtbProsRif = prospect.PtbProsRif + }); - response.PtbPros = prospect.PtbPros; - response.PtbProsRif = prospect.PtbProsRif; + if (lastSync != null) + { + contactList = MergeLists( + contactList, + clienti.AnagClie, + x => x.CodAnag + ); - _ = 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) - ); + prospectList = MergeLists( + prospectList, + prospect.PtbPros, + x => x.CodPpro + ); + } + else + { + contactList = clienti.AnagClie; + prospectList = prospect.PtbPros; + } } // Mappa i contatti var contactMapper = mapper.Map>(contactList); - // Mappa i prospects + // Mappa i prospect var prospectMapper = mapper.Map>(prospectList); contactMapper.AddRange(prospectMapper); return contactMapper; } + + private static List? MergeLists(List? localList, List? apiList, Func keySelector) + { + if (localList == null || apiList == null) return null; + + var dictionary = localList.ToDictionary(keySelector); + + foreach (var apiItem in apiList) + { + var key = keySelector(apiItem); + dictionary[key] = apiItem; + } + + return dictionary.Values.ToList(); + } public async Task GetSpecificContact(string codAnag, bool isContact) { @@ -240,7 +268,7 @@ public class ManageDataService( .Distinct().ToList(); IDictionary? distinctUser = null; - + if (userListState.AllUsers != null) { distinctUser = userListState.AllUsers @@ -251,7 +279,8 @@ public class ManageDataService( var returnDto = activities .Select(activity => { - if (activity.CodJcom is "0000" && userSession.ProfileDb != null && userSession.ProfileDb.Equals("smetar", StringComparison.OrdinalIgnoreCase)) + if (activity.CodJcom is "0000" && userSession.ProfileDb != null && + userSession.ProfileDb.Equals("smetar", StringComparison.OrdinalIgnoreCase)) { activity.CodJcom = null; } @@ -263,8 +292,7 @@ public class ManageDataService( var minuteBefore = activity.EstimatedTime.Value - activity.AlarmTime.Value; dto.MinuteBefore = (int)Math.Abs(minuteBefore.TotalMinutes); - dto.NotificationDate = dto.MinuteBefore == 0 ? - activity.EstimatedTime : activity.AlarmTime; + dto.NotificationDate = dto.MinuteBefore == 0 ? activity.EstimatedTime : activity.AlarmTime; } if (activity.CodJcom != null) @@ -281,7 +309,7 @@ public class ManageDataService( string? ragSoc; if (distinctUser != null && (distinctUser.TryGetValue(activity.CodAnag, out ragSoc) || - distinctUser.TryGetValue(activity.CodAnag, out ragSoc))) + distinctUser.TryGetValue(activity.CodAnag, out ragSoc))) { dto.Cliente = ragSoc; } @@ -343,7 +371,7 @@ public class ManageDataService( public async Task DeleteProspect(string codPpro) { var persRifList = await GetTable(x => x.CodPpro!.Equals(codPpro)); - + if (!persRifList.IsNullOrEmpty()) { foreach (var persRif in persRifList) diff --git a/salesbook.Shared/Components/Pages/PersonalInfo.razor b/salesbook.Shared/Components/Pages/PersonalInfo.razor index 7ff2873..e0810c7 100644 --- a/salesbook.Shared/Components/Pages/PersonalInfo.razor +++ b/salesbook.Shared/Components/Pages/PersonalInfo.razor @@ -88,7 +88,7 @@ FullWidth="true" StartIcon="@Icons.Material.Outlined.Sync" Size="Size.Medium" - OnClick="() => UpdateDb()" + OnClick="@(() => UpdateDb())" Variant="Variant.Outlined"> Sincronizza @@ -154,6 +154,8 @@ private void UpdateDb(bool withData = false) { + LocalStorage.Remove("last-user-sync"); + var absoluteUri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri); var pathAndQuery = absoluteUri.Segments.Length > 1 ? absoluteUri.PathAndQuery : null; diff --git a/salesbook.Shared/Core/Services/PreloadService.cs b/salesbook.Shared/Core/Services/PreloadService.cs index 1915d5e..38feba2 100644 --- a/salesbook.Shared/Core/Services/PreloadService.cs +++ b/salesbook.Shared/Core/Services/PreloadService.cs @@ -1,4 +1,6 @@ -using salesbook.Shared.Core.Dto; +using IntegryApiClient.Core.Domain.Abstraction.Contracts.Storage; +using Java.Sql; +using salesbook.Shared.Core.Dto; using salesbook.Shared.Core.Dto.Contact; using salesbook.Shared.Core.Dto.PageState; using salesbook.Shared.Core.Dto.Users; @@ -6,7 +8,7 @@ using salesbook.Shared.Core.Interface; namespace salesbook.Shared.Core.Services; -public class PreloadService(IManageDataService manageData, UserListState userState) +public class PreloadService(IManageDataService manageData, ILocalStorage localStorage, UserListState userState) { public async Task PreloadUsersAsync() { @@ -14,8 +16,11 @@ public class PreloadService(IManageDataService manageData, UserListState userSta return; userState.IsLoading = true; + + DateTime? lastSync = localStorage.Get("last-user-sync"); + lastSync = lastSync.Equals(DateTime.MinValue) ? null : lastSync; - var users = await manageData.GetContact(new WhereCondContact { FlagStato = "A" }); + var users = await manageData.GetContact(new WhereCondContact { FlagStato = "A" }, lastSync); var sorted = users .Where(u => !string.IsNullOrWhiteSpace(u.RagSoc)) @@ -27,6 +32,8 @@ public class PreloadService(IManageDataService manageData, UserListState userSta userState.FilteredGroupedUserList = userState.GroupedUserList; userState.AllUsers = users; + localStorage.Set("last-user-sync", DateTime.Now); + userState.NotifyUsersLoaded(); } From 032dd78c8c1525fde1b73efc4f92ae2cb53f9cdc Mon Sep 17 00:00:00 2001 From: MarcoE Date: Mon, 17 Nov 2025 11:14:37 +0100 Subject: [PATCH 5/5] -> v2.2.0 (24) --- salesbook.Maui/salesbook.Maui.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/salesbook.Maui/salesbook.Maui.csproj b/salesbook.Maui/salesbook.Maui.csproj index cd056de..aeadbe4 100644 --- a/salesbook.Maui/salesbook.Maui.csproj +++ b/salesbook.Maui/salesbook.Maui.csproj @@ -29,8 +29,8 @@ it.integry.salesbook - 2.1.5 - 23 + 2.2.0 + 24 14.2