diff --git a/TecniStamp/TecniStamp.Service/ComuneIstatService.cs b/TecniStamp/TecniStamp.Service/ComuneIstatService.cs new file mode 100644 index 0000000..ae3f5d4 --- /dev/null +++ b/TecniStamp/TecniStamp.Service/ComuneIstatService.cs @@ -0,0 +1,13 @@ +using OAService.Service.Servizi.Implementazioni; +using TecniStamp.Domain; +using TecniStamp.Service.Interfaces; +using TecniStamp.Service.Repository; + +namespace TecniStamp.Service; + +public class ComuneIstatService : TService, IComuneIstatService +{ + public ComuneIstatService(ITecniStampUnitOfWork unitOfWork) : base(unitOfWork) + { + } +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp.Service/Interfaces/IComuneIstatService.cs b/TecniStamp/TecniStamp.Service/Interfaces/IComuneIstatService.cs new file mode 100644 index 0000000..077467a --- /dev/null +++ b/TecniStamp/TecniStamp.Service/Interfaces/IComuneIstatService.cs @@ -0,0 +1,8 @@ +using OAService.Service.Servizi.Interfacce; +using TecniStamp.Domain; + +namespace TecniStamp.Service.Interfaces; + +public interface IComuneIstatService : ITService +{ +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp.Service/Interfaces/IManagerService.cs b/TecniStamp/TecniStamp.Service/Interfaces/IManagerService.cs index a4ed46d..277a78b 100644 --- a/TecniStamp/TecniStamp.Service/Interfaces/IManagerService.cs +++ b/TecniStamp/TecniStamp.Service/Interfaces/IManagerService.cs @@ -13,4 +13,6 @@ public interface IManagerService IUserService UtenteService { get; set; } IMacchinarioService MacchinarioService { get; set; } ILavorazioneService LavorazioneService { get; set; } + IComuneIstatService ComuneIstatService { get; set; } + IProvinciaIstatService ProvinciaIstatService { get; set; } } \ No newline at end of file diff --git a/TecniStamp/TecniStamp.Service/Interfaces/IProvinciaIstatService.cs b/TecniStamp/TecniStamp.Service/Interfaces/IProvinciaIstatService.cs new file mode 100644 index 0000000..8efeaef --- /dev/null +++ b/TecniStamp/TecniStamp.Service/Interfaces/IProvinciaIstatService.cs @@ -0,0 +1,6 @@ +using OAService.Service.Servizi.Interfacce; +using TecniStamp.Domain; + +namespace TecniStamp.Service.Interfaces; + +public interface IProvinciaIstatService : ITService {} \ No newline at end of file diff --git a/TecniStamp/TecniStamp.Service/ManagerService.cs b/TecniStamp/TecniStamp.Service/ManagerService.cs index a5036d8..3991871 100644 --- a/TecniStamp/TecniStamp.Service/ManagerService.cs +++ b/TecniStamp/TecniStamp.Service/ManagerService.cs @@ -6,7 +6,8 @@ public class ManagerService : IManagerService { public ManagerService(IUserService userService, ISezioneService sezioneService, IPermissionService permissionService, IRuoloService ruoloService, IFeatureService featureService, IMacchinarioService macchinarioService, ICommessaService commessaService, ILavorazioneService lavorazioneService, - IClienteService clienteService, ICommessaPosizioneService commessaPosizioneService, ICommessaPosizioneLavorazioneService commessaPosizioneLavorazioneService) + IClienteService clienteService, ICommessaPosizioneService commessaPosizioneService, ICommessaPosizioneLavorazioneService commessaPosizioneLavorazioneService, + IComuneIstatService comuneIstatService, IProvinciaIstatService provinciaIstatService) { UtenteService = userService; SezioneService = sezioneService; @@ -19,6 +20,8 @@ public class ManagerService : IManagerService ClienteService = clienteService; CommessaPosizioneService = commessaPosizioneService; CommessaPosizioneLavorazioneService = commessaPosizioneLavorazioneService; + ComuneIstatService = comuneIstatService; + ProvinciaIstatService = provinciaIstatService; } public IClienteService ClienteService { get; set; } @@ -32,4 +35,6 @@ public class ManagerService : IManagerService public IUserService UtenteService { get; set; } public IMacchinarioService MacchinarioService { get; set; } public ILavorazioneService LavorazioneService { get; set; } + public IComuneIstatService ComuneIstatService { get; set; } + public IProvinciaIstatService ProvinciaIstatService { get; set; } } \ No newline at end of file diff --git a/TecniStamp/TecniStamp.Service/ProvinciaIstatService.cs b/TecniStamp/TecniStamp.Service/ProvinciaIstatService.cs new file mode 100644 index 0000000..e4ea692 --- /dev/null +++ b/TecniStamp/TecniStamp.Service/ProvinciaIstatService.cs @@ -0,0 +1,14 @@ +using OAService.Service.Servizi.Implementazioni; +using TecniStamp.Domain; +using TecniStamp.Service.Interfaces; +using TecniStamp.Service.Repository; + +namespace StandManager.Service; + +public class ProvinciaIstatService : TService, IProvinciaIstatService +{ + public ProvinciaIstatService(ITecniStampUnitOfWork unitOfWork) : base(unitOfWork) + { + + } +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti.razor index 80694ed..73ba4c1 100644 --- a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti.razor +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Clienti.razor @@ -17,6 +17,10 @@
+ + + + Nuovo Cliente @@ -95,4 +99,46 @@ } } + private async Task onUploadComuni(UploadChangeEventArgs args) + { + var file = args.Files.FirstOrDefault(); + if (file == null || + !file.Name.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) + { + await _dialogService.Alert("Sono supportati solo file Excel .xlsx", "Errore"); + return; + } + try + { + // await using var uploadStream = file.OpenReadStream(10_000_000); + await _dialogService.OpenAsync("Importazione comuni", new Dictionary() { { "args", args } }); + } + catch (Exception ex) + { + var er = ex.Message; + await _dialogService.Alert("Si è verificato un errore durante l'importazione del file.", "Errore"); + } + } + + private async Task onUploadProvince(UploadChangeEventArgs args) + { + var file = args.Files.FirstOrDefault(); + if (file == null || + !file.Name.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) + { + await _dialogService.Alert("Sono supportati solo file Excel .xlsx", "Errore"); + return; + } + try + { + // await using var uploadStream = file.OpenReadStream(10_000_000); + await _dialogService.OpenAsync("Importazione province", new Dictionary() { { "args", args } }); + } + catch (Exception ex) + { + var er = ex.Message; + await _dialogService.Alert("Si è verificato un errore durante l'importazione del file.", "Errore"); + } + } + } \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Comuni_Import.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Comuni_Import.razor new file mode 100644 index 0000000..4946b45 --- /dev/null +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Comuni_Import.razor @@ -0,0 +1,77 @@ +@using ClosedXML.Excel +@using Microsoft.AspNetCore.Authorization +@using Microsoft.EntityFrameworkCore +@using TecniStamp.Model +@using TecniStamp.Domain +@using TecniStamp.Utils +@attribute [Authorize] + +@rendermode InteractiveServer + +@inject AuthenticationStateProvider auth + + + + + +@code { + [CascadingParameter] private Dialog _dialog { get; set; } + [Parameter] public UploadChangeEventArgs args { get; set; } + + private int comuniTotali { get; set; } = 0; + private int counter { get; set; } = 0; + private string counterLabel { get; set; } = string.Empty; + + protected override async Task OnInitializedAsync() + { + base.OnInitializedAsync(); + var file = args.Files.FirstOrDefault(); + await using var uploadStream = file.OpenReadStream(10_000_000); + var idClaim = await MembershipUtils.GetUserId(auth); + + await using var ms = new MemoryStream(); + await uploadStream.CopyToAsync(ms); + ms.Position = 0; + + using var workbook = new XLWorkbook(ms); + var ws = workbook.Worksheet(1); + var usedRange = ws.RangeUsed(); + var rows = new List(usedRange.RowCount() - 1); + + foreach (var row in usedRange.RowsUsed().Skip(1)) + rows.Add(new ComuneIstatExcelViewModel(row)); + + + var comuni = rows.ToList(); + comuniTotali = comuni.Count; + counterLabel = " di " + comuniTotali; + + foreach (var comune in comuni) + { + var comuneDb = await _managerService.ComuneIstatService.RicercaPer( + x => x.Istat == comune.Istat && x.Eliminato == false, + solaLettura: false) ?? new ComuneIstat(); + + comuneDb = await mapComune(comuneDb, comune); + await _managerService.ComuneIstatService.Salva(comuneDb, idClaim); + counter += 1; + StateHasChanged(); + } + + ms.Close(); + _dialogService.Close(); + } + + private async Task mapComune(ComuneIstat model, ComuneIstatExcelViewModel row) + { + model.Istat = row.Istat; + model.Comune = row.Comune; + model.Regione = row.Regione; + model.Provincia = row.Provincia; + model.Prefisso = row.Prefisso; + model.CodFisco = row.CodFisco; + model.ProvinciaIstatId = (await _managerService.ProvinciaIstatService.RicercaPer(filtro: x => x.Sigla == row.Provincia))?.Id; + + return model; + } +} diff --git a/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Province_Import.razor b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Province_Import.razor new file mode 100644 index 0000000..d09afc2 --- /dev/null +++ b/TecniStamp/TecniStamp/Components/Pages/Anagrafiche/Province_Import.razor @@ -0,0 +1,71 @@ +@using ClosedXML.Excel +@using Microsoft.AspNetCore.Authorization +@using TecniStamp.Domain +@using TecniStamp.Model +@using TecniStamp.Utils +@attribute [Authorize] + +@rendermode InteractiveServer + +@inject AuthenticationStateProvider auth + + + + + +@code { + [CascadingParameter] private Dialog _dialog { get; set; } + [Parameter] public UploadChangeEventArgs args { get; set; } + + private int provinceTotali { get; set; } = 0; + private int counter { get; set; } = 0; + private string counterLabel { get; set; } = string.Empty; + + protected override async Task OnInitializedAsync() + { + base.OnInitializedAsync(); + var file = args.Files.FirstOrDefault(); + await using var uploadStream = file.OpenReadStream(10_000_000); + var idClaim = await MembershipUtils.GetUserId(auth); + + await using var ms = new MemoryStream(); + await uploadStream.CopyToAsync(ms); + ms.Position = 0; + + using var workbook = new XLWorkbook(ms); + var ws = workbook.Worksheet(1); + var usedRange = ws.RangeUsed(); + var rows = new List(usedRange.RowCount() - 1); + + foreach (var row in usedRange.RowsUsed().Skip(1)) + rows.Add(new ProvinciaIstatExcelViewModel(row)); + + + var province = rows.ToList(); + provinceTotali = province.Count; + counterLabel = " di " + provinceTotali; + + foreach (var provincia in province) + { + var provinciaDb = await _managerService.ProvinciaIstatService.RicercaPer( + x => x.Sigla == provincia.Sigla && x.Eliminato == false, + solaLettura: false) ?? new ProvinciaIstat(); + + provinciaDb = await mapProvincia(provinciaDb, provincia); + await _managerService.ProvinciaIstatService.Salva(provinciaDb, idClaim); + counter += 1; + StateHasChanged(); + } + + ms.Close(); + _dialogService.Close(); + } + + private async Task mapProvincia(ProvinciaIstat model, ProvinciaIstatExcelViewModel row) + { + model.Sigla = row.Sigla; + model.Provincia = row.Provincia; + + return model; + } +} diff --git a/TecniStamp/TecniStamp/Model/ComuneIstatExcelViewModel.cs b/TecniStamp/TecniStamp/Model/ComuneIstatExcelViewModel.cs new file mode 100644 index 0000000..77790e6 --- /dev/null +++ b/TecniStamp/TecniStamp/Model/ComuneIstatExcelViewModel.cs @@ -0,0 +1,40 @@ +using ClosedXML.Excel; +using TecniStamp.Domain; + +namespace TecniStamp.Model; + +public class ComuneIstatExcelViewModel +{ + public ComuneIstatExcelViewModel() + { + + } + public ComuneIstatExcelViewModel(IXLRangeRow row) + { + Istat = row.Cell(1).GetString(); + Comune = row.Cell(2).GetString(); + Regione = row.Cell(3).GetString(); + Provincia = row.Cell(4).GetString(); + Prefisso = row.Cell(5).GetString(); + CodFisco = row.Cell(6).GetString(); + } + + public Guid Id { get; set; } + public string Istat { get; set; } + public string Comune { get; set; } + public string Regione { get; set; } + public string Provincia { get; set; } + public string Prefisso { get; set; } + public string CodFisco { get; set; } + + public static implicit operator ComuneIstatExcelViewModel(ComuneIstat model) + { + return model == null + ? null + : new ComuneIstatExcelViewModel + { + Id = model.Id, + Comune = model.Comune + }; + } +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Model/ComuneIstatViewModel.cs b/TecniStamp/TecniStamp/Model/ComuneIstatViewModel.cs new file mode 100644 index 0000000..c970666 --- /dev/null +++ b/TecniStamp/TecniStamp/Model/ComuneIstatViewModel.cs @@ -0,0 +1,31 @@ +using TecniStamp.Domain; + +namespace TecniStamp.Model; + +public class ComuneIstatViewModel +{ + public Guid Id { get; set; } + public string Istat { get; set; } + public string Comune { get; set; } + public string Regione { get; set; } + public string Provincia { get; set; } + public string Prefisso { get; set; } + public string CodFisco { get; set; } + public string Info => $"{Comune}"; + + public static implicit operator ComuneIstatViewModel(ComuneIstat model) + { + return model == null + ? null + : new ComuneIstatViewModel() + { + Id = model.Id, + Comune = model.Comune, + Istat = model.Istat, + Regione = model.Regione, + Provincia = model.Provincia, + Prefisso = model.Prefisso, + CodFisco = model.CodFisco + }; + } +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp/Model/ProvinciaIstatExcelViewModel.cs b/TecniStamp/TecniStamp/Model/ProvinciaIstatExcelViewModel.cs new file mode 100644 index 0000000..373ed9b --- /dev/null +++ b/TecniStamp/TecniStamp/Model/ProvinciaIstatExcelViewModel.cs @@ -0,0 +1,15 @@ +using ClosedXML.Excel; + +namespace TecniStamp.Model; + +public class ProvinciaIstatExcelViewModel +{ + public ProvinciaIstatExcelViewModel(IXLRangeRow row) + { + Sigla = row.Cell(1).GetString(); + Provincia = row.Cell(2).GetString(); + } + public string Sigla { get; set; } + public string Provincia { get; set; } + +} diff --git a/TecniStamp/TecniStamp/Model/ProvinciaViewModel.cs b/TecniStamp/TecniStamp/Model/ProvinciaViewModel.cs new file mode 100644 index 0000000..44b56a8 --- /dev/null +++ b/TecniStamp/TecniStamp/Model/ProvinciaViewModel.cs @@ -0,0 +1,23 @@ +using TecniStamp.Domain; + +namespace TecniStamp.Model; + +public class ProvinciaViewModel +{ + public Guid Id { get; set; } + public string Sigla { get; set; } + public string Provincia { get; set; } + public string Info => $"{Sigla} - {Provincia}"; + + public static implicit operator ProvinciaViewModel(ProvinciaIstat model) + { + return model == null + ? null + : new ProvinciaViewModel() + { + Provincia = model.Provincia, + Sigla = model.Sigla, + Id = model.Id + }; + } +} \ No newline at end of file diff --git a/TecniStamp/TecniStamp/TecniStamp.csproj b/TecniStamp/TecniStamp/TecniStamp.csproj index 1382991..dcc08bf 100644 --- a/TecniStamp/TecniStamp/TecniStamp.csproj +++ b/TecniStamp/TecniStamp/TecniStamp.csproj @@ -7,6 +7,7 @@ +