@using salesbook.Shared.Core.Dto @using salesbook.Shared.Components.Layout @using salesbook.Shared.Core.Interface @using salesbook.Shared.Components.Layout.Overlay @using salesbook.Shared.Core.Entity @using salesbook.Shared.Components.SingleElements.BottomSheet @using salesbook.Shared.Core.Dto.Contact @using salesbook.Shared.Core.Interface.IntegryApi @using salesbook.Shared.Core.Interface.System.Network @inject IManageDataService ManageData @inject INetworkService NetworkService @inject IIntegryApiService IntegryApiService @inject IDialogService Dialog
Nazione @if (Nazioni.IsNullOrEmpty()) { Nessuna nazione trovata } else { @foreach (var nazione in Nazioni) { @($"{nazione.Descrizione}") } }
P. IVA
Cod. Fiscale
Tipo cliente
@if (!IsView) {
Cerca indirizzo
}
Indirizzo
CAP
Città
Provincia
PEC
E-Mail
Telefono
Agente
@if (IsNew) {
@if (!PersRifList.IsNullOrEmpty()) { foreach (var item in PersRifList!.Select((p, index) => new { p, index })) { @item.p.PersonaRif } }
} @if (IsNew) {
Persona di riferimento
} else { @if (NetworkService.ConnectionAvailable && !ContactModel.IsContact) {
Converti in cliente
} }
@if (VatAlreadyRegistered) { Chiudi } else { Aggiungi }
@code { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } [Parameter] public ContactDTO? OriginalModel { get; set; } private ContactDTO ContactModel { get; set; } = new(); private List? VtbTipi { get; set; } private List? PersRifList { get; set; } private List? Nazioni { get; set; } private List Users { get; set; } = []; private bool IsNew => OriginalModel is null; private bool IsView => !NetworkService.ConnectionAvailable; private string? LabelSave { get; set; } //Overlay for save private bool VisibleOverlay { get; set; } private bool SuccessAnimation { get; set; } //MessageBox private MudMessageBox CheckVat { get; set; } private string VatMessage { get; set; } = ""; private bool VatAlreadyRegistered { get; set; } //BottomSeath 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; _ = LoadData(); LabelSave = IsNew ? "Aggiungi" : null; } private async Task Save() { VisibleOverlay = true; StateHasChanged(); var requestDto = new CRMCreateContactRequestDTO { TipoAnag = ContactModel.IsContact ? "C" : "P", Cliente = ContactModel, PersRif = PersRifList, CodVage = ContactModel.CodVage }; var response = await IntegryApiService.SaveContact(requestDto); switch (response) { case null: VisibleOverlay = false; StateHasChanged(); return; case {AnagClie: null, PtbPros: not null}: await ManageData.InsertOrUpdate(response.PtbPros); await ManageData.InsertOrUpdate(response.PtbProsRif); break; case { AnagClie: not null, PtbPros: null }: await ManageData.InsertOrUpdate(response.AnagClie); await ManageData.InsertOrUpdate(response.VtbCliePersRif); break; default: VisibleOverlay = false; StateHasChanged(); return; } SuccessAnimation = true; StateHasChanged(); await Task.Delay(1250); MudDialog.Close(response); } private Task LoadData() { return Task.Run(async () => { 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(); } Users = await ManageData.GetTable(x => x.KeyGroup == 5); Nazioni = await ManageData.GetTable(); VtbTipi = await ManageData.GetTable(); }); } private void OnAfterChangeValue() { if (!IsNew) { LabelSave = !OriginalModel.Equals(ContactModel) ? "Aggiorna" : null; } } private Task NewPersRif() => OpenPersRifForm(null, null); private async Task OpenPersRifForm(int? index, PersRifDTO? persRif) { var result = await ModalHelpers.OpenPersRifForm(Dialog, persRif); if (result is { Canceled: false, Data: not null } && result.Data.GetType() == typeof(PersRifDTO)) { if (index != null) OnRemovePersRif(index.Value); PersRifList ??= []; PersRifList.Add((PersRifDTO)result.Data); } } private void OnRemovePersRif(int index) { if (PersRifList is null || index < 0 || index >= PersRifList.Count) return; PersRifList.RemoveAt(index); StateHasChanged(); } private async Task OnAfterChangePIva() { CheckVatResponseDTO? response = null; var error = false; VisibleOverlay = true; StateHasChanged(); var nazione = Nazioni?.Find(x => x.CodNazioneAlpha2.Equals(ContactModel.Nazione) || x.CodNazioneIso.Equals(ContactModel.Nazione) || x.Nazione.Equals(ContactModel.Nazione) ); if (nazione == null) return; var pIva = ContactModel.PartIva.Trim(); var clie = (await ManageData.GetClienti(new WhereCondContact {PartIva = pIva})).LastOrDefault(); if (clie == null) { var pros = (await ManageData.GetProspect(new WhereCondContact {PartIva = pIva})).LastOrDefault(); if (pros == null) { if (nazione.ChkPartIva) { if (!IsView) { try { response = await IntegryApiService.CheckVat(new CheckVatRequestDTO { CountryCode = nazione.CodNazioneAlpha2, VatNumber = pIva }); VatMessage = $"La p.Iva ({pIva}) corrisponde a:

{response.RagSoc}
{response.CompleteAddress}

Si desidera aggiungere questi dati nel form?"; VatAlreadyRegistered = false; } catch (Exception e) { Snackbar.Clear(); Snackbar.Add(e.Message, Severity.Error); error = true; } } else { Snackbar.Clear(); Snackbar.Add("La ricerca della partita iva non è al momento disponibile", Severity.Warning); error = true; } } else { Snackbar.Clear(); Snackbar.Add("La ricerca della partita iva non è abilitata per questa nazione", Severity.Warning); error = true; } } else { VatMessage = $"Prospect ({pros.CodPpro}) già censito con la p.iva: {pIva} - {pros.RagSoc}"; VatAlreadyRegistered = true; } } else { VatMessage = $"Cliente ({clie.CodAnag}) già censito con la p.iva: {pIva} - {clie.RagSoc}"; VatAlreadyRegistered = true; } VisibleOverlay = false; StateHasChanged(); if (!error) { var result = await CheckVat.ShowAsync(); if (result is true && response != null) { ContactModel.RagSoc = response.RagSoc; ContactModel.Indirizzo = response.Indirizzo; ContactModel.Cap = response.Cap; ContactModel.Citta = response.Citta; ContactModel.Prov = response.Prov; } } OnAfterChangeValue(); } private void OnAddressSet() { ContactModel.Citta = Address.Citta; ContactModel.Indirizzo = Address.Indirizzo; ContactModel.Prov = Address.Prov; ContactModel.Cap = Address.Cap; } private async Task ConvertProspectToContact() { 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); } }