295 lines
9.6 KiB
Plaintext
295 lines
9.6 KiB
Plaintext
@page "/User/{CodContact}/{IsContact:bool}"
|
|
@attribute [Authorize]
|
|
@using AutoMapper
|
|
@using salesbook.Shared.Components.Layout
|
|
@using salesbook.Shared.Core.Entity
|
|
@using salesbook.Shared.Core.Interface
|
|
@using salesbook.Shared.Components.Layout.Spinner
|
|
@using salesbook.Shared.Core.Dto
|
|
@using salesbook.Shared.Components.SingleElements
|
|
@using salesbook.Shared.Core.Dto.JobProgress
|
|
@using salesbook.Shared.Core.Dto.PageState
|
|
@inject IManageDataService ManageData
|
|
@inject IMapper Mapper
|
|
@inject IDialogService Dialog
|
|
@inject IIntegryApiService IntegryApiService
|
|
@inject UserPageState UserState
|
|
|
|
<HeaderLayout BackTo="Indietro" LabelSave="Modifica" OnSave="() => OpenUserForm(Anag)" Back="true" BackOnTop="true" Title="" ShowProfile="false"/>
|
|
|
|
@if (IsLoading)
|
|
{
|
|
<SpinnerLayout FullScreen="true"/>
|
|
}
|
|
else
|
|
{
|
|
<div class="container content">
|
|
<div class="container-primary-info">
|
|
<div class="section-primary-info">
|
|
<MudAvatar Style="height: 70px; width: 70px; font-size: 2rem; font-weight: bold" Color="Color.Secondary">
|
|
@UtilityString.ExtractInitials(Anag.RagSoc)
|
|
</MudAvatar>
|
|
|
|
<div class="personal-info">
|
|
<span class="info-nome">@Anag.RagSoc</span>
|
|
@if (Anag.Indirizzo != null)
|
|
{
|
|
<span class="info-section">@Anag.Indirizzo</span>
|
|
}
|
|
@if (Anag is { Citta: not null, Cap: not null, Prov: not null })
|
|
{
|
|
<span class="info-section">@($"{Anag.Cap} - {Anag.Citta} ({Anag.Prov})")</span>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="divider"></div>
|
|
|
|
<div class="section-info">
|
|
<div class="section-personal-info">
|
|
@if (!string.IsNullOrEmpty(Anag.Telefono))
|
|
{
|
|
<div>
|
|
<span class="info-title">Telefono</span>
|
|
<span class="info-text">
|
|
@Anag.Telefono
|
|
</span>
|
|
</div>
|
|
}
|
|
|
|
@if (!string.IsNullOrEmpty(Anag.PartIva))
|
|
{
|
|
<div>
|
|
<span class="info-title">P. IVA</span>
|
|
<span class="info-text">
|
|
@Anag.PartIva
|
|
</span>
|
|
</div>
|
|
}
|
|
</div>
|
|
|
|
<div class="section-personal-info">
|
|
@if (!string.IsNullOrEmpty(Anag.EMail))
|
|
{
|
|
<div>
|
|
<span class="info-title">E-mail</span>
|
|
<span class="info-text">
|
|
@Anag.EMail
|
|
</span>
|
|
</div>
|
|
}
|
|
|
|
@if (Agente != null)
|
|
{
|
|
<div>
|
|
<span class="info-title">Agente</span>
|
|
<span class="info-text">
|
|
@Agente.FullName
|
|
</span>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<input type="radio" class="tab-toggle" name="tab-toggle" id="tab1" checked>
|
|
<input type="radio" class="tab-toggle" name="tab-toggle" id="tab2">
|
|
|
|
<div class="box">
|
|
<ul class="tab-list">
|
|
<li class="tab-item">
|
|
<label class="tab-trigger" for="tab1">Contatti</label>
|
|
</li>
|
|
<li class="tab-item">
|
|
<label class="tab-trigger" for="tab2">Commesse</label>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- contenuti -->
|
|
<div class="tab-container">
|
|
<div class="tab-content">
|
|
<!-- Contatti -->
|
|
@if (PersRif is { Count: > 0 })
|
|
{
|
|
<div class="container-pers-rif">
|
|
<Virtualize Items="PersRif" Context="person">
|
|
@{
|
|
var index = PersRif.IndexOf(person);
|
|
var isLast = index == PersRif.Count - 1;
|
|
}
|
|
<ContactCard Contact="person"/>
|
|
@if (!isLast)
|
|
{
|
|
<div class="divider"></div>
|
|
}
|
|
</Virtualize>
|
|
</div>
|
|
}
|
|
|
|
<div class="container-button">
|
|
<MudButton Class="button-settings infoText"
|
|
FullWidth="true"
|
|
Size="Size.Medium"
|
|
OnClick="OpenPersRifForm"
|
|
Variant="Variant.Outlined">
|
|
Aggiungi contatto
|
|
</MudButton>
|
|
</div>
|
|
</div>
|
|
<div class="tab-content">
|
|
<!-- Commesse -->
|
|
@if (LoadCommessa)
|
|
{
|
|
<MudProgressLinear Color="Color.Primary" Indeterminate="true" Class="my-7"/>
|
|
}
|
|
else
|
|
{
|
|
@if (Commesse.IsNullOrEmpty())
|
|
{
|
|
<NoDataAvailable Text="Nessuna commessa presente"/>
|
|
}
|
|
else
|
|
{
|
|
<div class="commesse-container">
|
|
<Virtualize Items="Commesse" Context="commessa">
|
|
<CommessaCard Steps="@Steps[commessa.CodJcom]" RagSoc="@Anag.RagSoc" Commessa="commessa"/>
|
|
</Virtualize>
|
|
</div>
|
|
}
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
@code {
|
|
[Parameter] public string CodContact { get; set; }
|
|
[Parameter] public bool IsContact { get; set; }
|
|
|
|
private ContactDTO Anag { get; set; } = new();
|
|
private List<PersRifDTO>? PersRif { get; set; }
|
|
private List<JtbComt>? Commesse { get; set; }
|
|
private StbUser? Agente { get; set; }
|
|
private Dictionary<string, List<CRMJobStepDTO>?> Steps { get; set; } = [];
|
|
|
|
private bool IsLoading { get; set; } = true;
|
|
private bool LoadCommessa { get; set; } = true;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
if (UserState.CodUser != null && UserState.CodUser.Equals(CodContact))
|
|
{
|
|
LoadDataFromSession();
|
|
}
|
|
else
|
|
{
|
|
await LoadData();
|
|
}
|
|
|
|
IsLoading = false;
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async Task LoadData()
|
|
{
|
|
if (IsContact)
|
|
{
|
|
var clie = (await ManageData.GetTable<AnagClie>(x => x.CodAnag.Equals(CodContact))).Last();
|
|
Anag = Mapper.Map<ContactDTO>(clie);
|
|
}
|
|
else
|
|
{
|
|
var pros = (await ManageData.GetTable<PtbPros>(x => x.CodPpro.Equals(CodContact))).Last();
|
|
Anag = Mapper.Map<ContactDTO>(pros);
|
|
}
|
|
|
|
await LoadPersRif();
|
|
_ = LoadCommesse();
|
|
|
|
if (Anag.CodVage != null)
|
|
{
|
|
Agente = (await ManageData.GetTable<StbUser>(x => x.UserCode != null && x.UserCode.Equals(Anag.CodVage))).LastOrDefault();
|
|
}
|
|
|
|
SetDataSession();
|
|
}
|
|
|
|
private void LoadDataFromSession()
|
|
{
|
|
Anag = UserState.Anag;
|
|
PersRif = UserState.PersRif;
|
|
Commesse = UserState.Commesse;
|
|
Agente = UserState.Agente;
|
|
Steps = UserState.Steps;
|
|
|
|
SortCommesse();
|
|
|
|
LoadCommessa = false;
|
|
StateHasChanged();
|
|
}
|
|
|
|
private void SetDataSession()
|
|
{
|
|
UserState.CodUser = CodContact;
|
|
UserState.Anag = Anag;
|
|
UserState.PersRif = PersRif;
|
|
UserState.Agente = Agente;
|
|
UserState.Steps = Steps;
|
|
}
|
|
|
|
private async Task LoadCommesse()
|
|
{
|
|
await Task.Run(async () =>
|
|
{
|
|
Commesse = await ManageData.GetTable<JtbComt>(x => x.CodAnag != null && x.CodAnag.Equals(CodContact));
|
|
UserState.Commesse = Commesse;
|
|
|
|
foreach (var commessa in Commesse)
|
|
{
|
|
var steps = (await IntegryApiService.RetrieveJobProgress(commessa.CodJcom)).Steps;
|
|
Steps.Add(commessa.CodJcom, steps);
|
|
}
|
|
|
|
LoadCommessa = false;
|
|
});
|
|
|
|
SortCommesse();
|
|
StateHasChanged();
|
|
}
|
|
|
|
private void SortCommesse()
|
|
{
|
|
Commesse = Commesse?.OrderBy(x => x.LastUpd.HasValue).ThenBy(x => x.LastUpd).ToList();
|
|
}
|
|
|
|
private async Task LoadPersRif()
|
|
{
|
|
if (IsContact)
|
|
{
|
|
var pers = await ManageData.GetTable<VtbCliePersRif>(x => x.CodAnag.Equals(Anag.CodContact));
|
|
PersRif = Mapper.Map<List<PersRifDTO>>(pers);
|
|
}
|
|
else
|
|
{
|
|
var pers = await ManageData.GetTable<PtbProsRif>(x => x.CodPpro.Equals(Anag.CodContact));
|
|
PersRif = Mapper.Map<List<PersRifDTO>>(pers);
|
|
}
|
|
}
|
|
|
|
private async Task OpenPersRifForm()
|
|
{
|
|
var result = await ModalHelpers.OpenPersRifForm(Dialog, null, Anag, PersRif);
|
|
|
|
if (result is { Canceled: false, Data: not null } && result.Data.GetType() == typeof(PersRifDTO))
|
|
{
|
|
await LoadPersRif();
|
|
}
|
|
}
|
|
|
|
private async Task OpenUserForm(ContactDTO anag)
|
|
{
|
|
var result = await ModalHelpers.OpenUserForm(Dialog, anag);
|
|
}
|
|
|
|
} |