Files
StandManager/StandManager/Components/Pages/Management/Clienti_Import.razor

137 lines
5.2 KiB
Plaintext

@using ClosedXML.Excel
@using Microsoft.EntityFrameworkCore
@using StandManager.Model
@attribute [Authorize]
@rendermode InteractiveServer
@inject AuthenticationStateProvider auth
<RadzenStack Gap="1rem" class="rz-m-12">
<RadzenProgressBar Value="@counter" Max="@clientiTotali" Unit="@counterLabel" AriaLabel="" />
</RadzenStack>
@code {
[CascadingParameter] private Dialog _dialog { get; set; }
[Parameter] public UploadChangeEventArgs args { get; set; }
private int clientiTotali { 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<ClienteExcelViewModel>(usedRange.RowCount() - 1);
foreach (var row in usedRange.RowsUsed().Skip(1))
rows.Add(new ClienteExcelViewModel(row));
var ragioniSociali = rows.Select(r => new { Rid = r.CodCli, RagioneSociale = r.RagSocCliente }).Distinct().ToList();
clientiTotali = ragioniSociali.Count;
counterLabel = " di " + clientiTotali;
foreach (var cliente in ragioniSociali)
{
var righeCliente = rows.Where(r => r.CodCli == cliente.Rid).ToList();
var clienteDb = await _managerService.ClienteService.RicercaPer(
x => x.Rid == cliente.Rid && x.Eliminato == false,
includi: x => x.Include(i => i.Destinazioni),
solaLettura: false) ?? new Cliente();
clienteDb = await mapCliente(clienteDb, righeCliente);
await _managerService.ClienteService.Salva(clienteDb, idClaim);
counter += 1;
StateHasChanged();
}
ms.Close();
_dialogService.Close();
}
private async Task<Cliente> mapCliente(Cliente model, List<ClienteExcelViewModel> rows)
{
var idClaim = await MembershipUtils.GetUserId(auth);
var firstRow = rows.First();
model.Rid = firstRow.CodCli;
model.RagioneSociale = firstRow.RagSocCliente;
model.PartitaIva = firstRow.PartitaIva;
var capoArea = await _managerService.UtenteService.RicercaPer(filtro: x => x.CodiceAgente == firstRow.CapoArea && x.Eliminato == false, solaLettura: false) ?? new Utente();
capoArea = await mapCapoArea(capoArea, firstRow);
if (capoArea.Id == Guid.Empty) capoArea.Password = "";
var savedCapoArea = await _managerService.UtenteService.Salva(capoArea, idClaim);
model.CapoareaId = savedCapoArea.Id;
var agente = await _managerService.UtenteService.RicercaPer(filtro: x => x.CodiceAgente == firstRow.Agente && x.Eliminato == false, solaLettura: false) ?? new Utente();
agente = await mapAgente(agente, firstRow, model.CapoareaId);
if (agente.Id == Guid.Empty) agente.Password = "";
var savedAgente = await _managerService.UtenteService.Salva(agente, idClaim);
model.AgenteId = savedAgente.Id;
// TODO: Problema nel salvataggio delle destinazioni
model.Destinazioni ??= new();
foreach (var destinazioneRiga in rows)
{
var destinazione = model.Destinazioni.FirstOrDefault(x => x.Rid == destinazioneRiga.CodDes) ?? new Destinazione();
destinazione = await mapDestinazione(destinazione, model.Id, destinazioneRiga, model.AgenteId);
if (destinazione.Id == Guid.Empty)
model.Destinazioni.Add(destinazione);
}
return model;
}
private async Task<Destinazione> mapDestinazione(Destinazione model, Guid clienteId, ClienteExcelViewModel row, Guid? agenteId)
{
model.Rid = row.CodDes;
model.RagioneSociale = row.RagSocDestinazione;
model.PartitaIva = row.PartitaIva;
model.ClienteId = clienteId;
model.Indirizzo = $"{row.Indirizzo} {row.NumeroCivico}";
model.Cap = row.Cap;
model.Citta = row.Comune;
model.Email = row.MailFatturazione;
model.EmailInvito = row.MailFatturazione;
model.NumeroTelefono = row.Telefono;
model.AgenteId = agenteId;
return model;
}
private async Task<Utente> mapCapoArea(Utente model, ClienteExcelViewModel row)
{
model.Username = row.DescrizioneCapoArea;
model.CodiceAgente = row.CapoArea;
model.Nome = row.DescrizioneCapoArea;
model.Cognome = "";
model.Email = "";
return model;
}
private async Task<Utente> mapAgente(Utente model, ClienteExcelViewModel row, Guid? capoareaId)
{
model.Username = row.DescrizioneAgente;
model.CodiceAgente = row.Agente;
model.Nome = row.DescrizioneAgente;
model.Cognome = "";
model.Email = "";
model.CapoareaId = capoareaId;
return model;
}
}