137 lines
5.2 KiB
Plaintext
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;
|
|
}
|
|
}
|