minor refactor and cosmetics on company view page

This commit is contained in:
Frede Hundewadt 2022-11-24 08:36:41 +01:00
parent 666b9b0df3
commit c0db6b4fad
4 changed files with 169 additions and 112 deletions

View file

@ -33,7 +33,7 @@
<h4>Ring til kontoret. Denne konto er spærret med kode '@Company.Blocked'</h4>
</div>
}
<div class="alert bg-dark text-white">
<div class="row pt-2 mb-2 rounded rounded-2 bg-dark text-white">
<h3>@Company.Name</h3>
</div>
// erp context
@ -98,7 +98,7 @@
<button type="button" class="btn btn-primary" disabled="@(Company.HasFolded == 0)" onclick="@ForceActivity">Aktiver besøg</button>
</div>
<div class="col-sm-2 text-end">
<button type="button" class="btn btn-primary" onclick="@UpdateErpData" disabled="@(Working)">Gem ERP data</button>
<button type="button" class="btn btn-primary" onclick="@UpdateErpData" disabled="@(Working)">Gem STAM data</button>
</div>
@* account *@
@ -119,11 +119,11 @@
</div>
@* vat lookup *@
<div class="col-sm-2 text-end">
<button type="button" class="btn btn-primary" @onclick="CallVatLookupModal">CVR opslag</button>
<button type="button" class="btn btn-primary" @onclick="OpenVatLookupModal">Firma opslag</button>
</div>
@* save vat number *@
<div class="col-sm-2 text-end">
<button type="button" class="btn btn-primary" @onclick="UpdateVatNumber">Gem Moms Nr</button>
<button type="button" class="btn btn-primary" @onclick="UpdateVatNumber">Gem MOMS Nr</button>
</div>
</div>
@ -173,7 +173,7 @@
<label for="contacts" class="col-sm-1 col-form-label-sm">Kontakt</label>
<div id="contacts" class="col-sm-6">
<div class="list-group">
<div class="list-group-item list-group-item-action" @onclick="() => OpenContact(DefaultContact)">
<div class="list-group-item list-group-item-action bg-dark text-white" @onclick="() => OpenContactPopup(DefaultContact)">
<div class="row">
<div class="col-sm-4">Stilling</div>
<div class="col-sm-4">Navn</div>
@ -187,7 +187,7 @@
{
@foreach (var contact in Contacts)
{
<div class="list-group-item list-group-item-action" @onclick="() => OpenContact(contact)">
<div class="list-group-item list-group-item-action" @onclick="() => OpenContactPopup(contact)">
<div class="row">
<div class="col-sm-4">@contact.JobTitle</div>
<div class="col-sm-4">@contact.FirstName @contact.LastName</div>
@ -235,6 +235,6 @@ else
}
<VatLookupDkModal VatAddress="CompanyVatAddress" EntityName="@Company.Name" VatNumber="@Company.VatNumber"
@ref="VatLookupPopup" OnSelectedCompany="SelectCompanyCallback" />
@ref="VatLookupPopup" OnSelectedCompany="SelectedCompanyCallback" />
<ContactModal ParamContact="@SelectedContact" CompanyName="@Company.Name"
@ref="ContactPopup" OnSaveClicked="SaveContactCallback" OnDeleteClicked="DeleteContactCallback"/>
@ref="ContactPopup" OnSaveClicked="ContactCallback" OnDeleteClicked="DeleteContactCallback"/>

View file

@ -58,35 +58,54 @@ public partial class CrmCompanyViewPage : IDisposable
private int EnableActivity { get; set; } = 1;
private string ActionLink { get; set; } = "";
private bool Working { get; set; } = true;
private bool countryIsDk { get; set; } = true;
private bool CountryIsDk { get; set; } = true;
private List<ContactDto> Contacts { get; set; } = new();
private VatLookupDkModal VatLookupPopup { get; set; } = new();
private ContactDto SelectedContact { get; set; } = new();
private ContactDto DefaultContact { get; set; } = new();
private ContactModal ContactPopup { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
protected override async Task OnInitializedAsync()
{
DefaultContact = new ContactDto { CompanyId = CompanyId, ContactId = "", FirstName = ""};
var ux = await Storage.GetItemAsync<UserInfoView>("_xu");
CountryCode = ux.CountryCode;
countryIsDk = ux.CountryCode.ToLower() == "dk";
Company = await CompanyRepo.GetCompanyById(CompanyId);
// fetch user info from local storage
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
CountryCode = UserInfo.CountryCode.ToLower();
CountryIsDk = CountryCode == "dk";
// setup interceptor
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
// fetch company from backend
await GetCompany(CompanyId);
// initialize default contact
DefaultContact = new ContactDto { CompanyId = CompanyId, ContactId = "", FirstName = ""};
// setup form context
ErpContext = new EditContext(Company);
// assign event handlers to context
ErpContext.OnFieldChanged += HandleFieldChanged;
ErpContext.OnValidationStateChanged += ValidationChanged;
// call background task to sync backend with erp
await SyncCompanyHistory(CompanyId, Company.HistorySync);
// call background task to fetch contacts
await GetContacts(CompanyId);
// remove loading image
Working = false;
}
/// <summary>
/// Get company by id
/// </summary>
/// <param name="companyId"></param>
private async Task GetCompany(string companyId)
{
Company = await CompanyRepo.GetCompanyById(companyId);
CurrentVat = Company.VatNumber;
Company.CountryCode = ux.CountryCode.ToLower();
Company.CountryCode = UserInfo.CountryCode.ToLower();
// internal flag
EnableActivity = Company.ValidVat;
// override if canvas which has account property as empty string or "NY"
if (Company.Account == "NY" || string.IsNullOrWhiteSpace(Company.Account))
EnableActivity = 1;
// prepare address for lookup
if (countryIsDk)
CompanyVatAddress = PrepareVatAddress(Company);
// visit interval init
if (Company.Interval == 0)
Company.Interval = 8;
@ -120,90 +139,109 @@ public partial class CrmCompanyViewPage : IDisposable
// vat state css class
VatState = Company.ValidVat == 1 ? "the-good" : "no-vat"; // assign css class
}
// initialize form context
ErpContext = new EditContext(Company);
// assign event handlers
ErpContext.OnFieldChanged += HandleFieldChanged;
ErpContext.OnValidationStateChanged += ValidationChanged;
// ensure crm has been synced with erp
await SyncCompanyHistory();
// load contacts
Contacts = await ContactRepo.GetContacts(CompanyId);
// remove loading image
Working = false;
// create search address from address
if (CountryIsDk)
CompanyVatAddress = PrepareVatAddress(Company);
}
/// <summary>
/// Change enable activity state
/// Fetch contacts from backend
/// </summary>
private void ForceActivity()
/// <param name="companyId"></param>
private async Task GetContacts(string companyId)
{
EnableActivity = EnableActivity == 0 ? 1 : 0;
// load contacts
Contacts = await ContactRepo.GetContacts(companyId);
Contacts = Contacts.OrderBy(x => x.FirstName).ToList();
}
private void OpenContact(ContactDto contact)
/// <summary>
/// Show Vat Lookup modal
/// </summary>
private void OpenVatLookupModal()
{
VatLookupPopup.Show();
}
/// <summary>
/// Modal callback to update company properties
/// </summary>
/// <param name="regInfo"></param>
private void SelectedCompanyCallback(VirkRegInfo regInfo)
{
Logger.LogDebug("CrmCompanyView => SelectCompanyCallback => {}", JsonSerializer.Serialize(regInfo));
// this can be removed in favor of the new data returned from updating the VatNumber
ValidVat = regInfo.States[0].State.ToLower() == "normal";
Company.HasFolded = ValidVat ? 1 : 0;
EnableActivity = ValidVat ? 1 : 0;
VatState = regInfo.States[0].State.ToLower() == "normal" ? "the-good" : "the-dead";
// set new properties
if (regInfo.SyncAll)
{
Company.Name = regInfo.Name;
Company.Address1 = regInfo.Address;
Company.Address2 = regInfo.CoName;
Company.ZipCode = regInfo.ZipCode;
Company.City = regInfo.City;
}
Company.VatNumber = regInfo.VatNumber;
}
/// <summary>
/// Open contact edit popup
/// </summary>
/// <param name="contact"></param>
private void OpenContactPopup(ContactDto contact)
{
// object to pass on to the popup
SelectedContact = contact;
// show the popup
ContactPopup.Show();
}
private async Task SaveContactCallback(ContactDto contact)
/// <summary>
/// Save contact callback
/// </summary>
/// <param name="contact"></param>
private async Task ContactCallback(ContactDto contact)
{
// write contact to debug log
Logger.LogDebug("CompanyView => SaveContactCallback <= {}", JsonSerializer.Serialize(contact));
if (string.IsNullOrWhiteSpace(contact.ContactId))
{
Console.WriteLine("create");
// new contact created
Logger.LogDebug("create");
// post contact with backend
await ContactRepo.CreateContact(contact);
}
else
{
Console.WriteLine("update");
// contact modified
Logger.LogDebug("update");
// put contact to backend
await ContactRepo.UpdateContact(contact);
}
Contacts = await ContactRepo.GetContacts(CompanyId);
// reset selected contact
SelectedContact = new ContactDto();
// reload contacts from backend
await GetContacts(CompanyId);
}
/// <summary>
/// Delete contact callback
/// </summary>
/// <param name="contactId"></param>
private async Task DeleteContactCallback(string contactId)
{
Logger.LogDebug("delete {}", contactId);
// send delete request to backend
await ContactRepo.DeleteContact(CompanyId, contactId);
Contacts = await ContactRepo.GetContacts(CompanyId);
// reset selected contact
SelectedContact = new ContactDto();
// reload contacts from backend
await GetContacts(CompanyId);
}
private async Task SyncCompanyHistory()
{
await HistoryRepo.RpcSyncErpToCrm(CompanyId, Company.HistorySync);
}
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
{
NextVisit = LastVisit.AddDays(Company.Interval * 7);
// simple validation of VAT format
if (!VatUtils.ValidateFormat(Company.CountryCode, Company.VatNumber))
{
ValidVat = false;
}
else
{
ValidVat = true;
EnableActivity = 1;
}
StateHasChanged();
}
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
{
ErpContext.OnFieldChanged -= HandleFieldChanged;
ErpContext.OnValidationStateChanged -= ValidationChanged;
ErpContext = new EditContext(Company);
ErpContext.OnFieldChanged += HandleFieldChanged;
ErpContext.OnValidationStateChanged += ValidationChanged;
}
/// <summary>
/// Update CRM data
/// </summary>
@ -213,7 +251,7 @@ public partial class CrmCompanyViewPage : IDisposable
if (Working)
return;
Working = true;
Toaster.ShowInfo("Vent venligst ...", "Opdaterer CRM data");
Toaster.ShowInfo("Vent venligst ...", "OPDATERER CRM DATA");
Company.LastVisit = $"{LastVisit:yyyy-MM-dd}";
Company.NextVisit = $"{NextVisit:yyyy-MM-dd}";
Company.IsHidden = 0;
@ -234,7 +272,7 @@ public partial class CrmCompanyViewPage : IDisposable
if (Working)
return;
Working = true;
Toaster.ShowInfo("Vent venligst ...", "Opdaterer Erp data");
Toaster.ShowInfo("Vent venligst ...", "OPDATERER STAM DATA");
var result = await CompanyRepo.UpdateErpData(CompanyId, Company);
if (!string.IsNullOrWhiteSpace(result.Name))
{
@ -301,39 +339,57 @@ public partial class CrmCompanyViewPage : IDisposable
}
/// <summary>
/// Show Vat Lookup modal
/// Rpc call to sync backend with ERP system
/// </summary>
private void CallVatLookupModal()
private async Task SyncCompanyHistory(string companyId, string syncDate)
{
VatLookupPopup.Show();
}
/// <summary>
/// Modal callback to update company properties
/// </summary>
/// <param name="regInfo"></param>
private void SelectCompanyCallback(VirkRegInfo regInfo)
{
Logger.LogDebug($"CrmCompanyView => SelectCompanyCallback => {JsonSerializer.Serialize(regInfo)}");
// this can be removed in favor of the new data returned from updating the VatNumber
ValidVat = regInfo.States[0].State.ToLower() == "normal";
Company.HasFolded = ValidVat ? 1 : 0;
EnableActivity = ValidVat ? 1 : 0;
VatState = regInfo.States[0].State.ToLower() == "normal" ? "the-good" : "the-dead";
if (regInfo.SyncAll)
{
Company.Name = regInfo.Name;
Company.Address1 = regInfo.Address;
Company.Address2 = regInfo.CoName;
Company.ZipCode = regInfo.ZipCode;
Company.City = regInfo.City;
}
Company.VatNumber = regInfo.VatNumber;
// send rpc request to backend
await HistoryRepo.RpcSyncErpToCrm(companyId, syncDate);
}
/// <summary>
/// Change activity enabled state
/// </summary>
private void ForceActivity()
{
EnableActivity = EnableActivity == 0 ? 1 : 0;
}
/// <summary>
/// Context field change event callback
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
{
NextVisit = LastVisit.AddDays(Company.Interval * 7);
// avoid nesting if by assuming ValidVat is false
ValidVat = false;
// set ValidVat true if validation succeed
if (VatUtils.ValidateFormat(Company.CountryCode, Company.VatNumber))
{
ValidVat = true;
EnableActivity = 1;
}
StateHasChanged();
}
/// <summary>
/// Context validation change event callback
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
{
ErpContext.OnFieldChanged -= HandleFieldChanged;
ErpContext.OnValidationStateChanged -= ValidationChanged;
ErpContext = new EditContext(Company);
ErpContext.OnFieldChanged += HandleFieldChanged;
ErpContext.OnValidationStateChanged += ValidationChanged;
}
/// <summary>
/// Dispose
/// </summary>

View file

@ -34,9 +34,9 @@
<tr>
<th scope="col">CVR ORG</th>
<th scope="col">Navn</th>
<th scope="col">PostBy</th>
<th scope="col">Status</th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col" colspan="2">Overføres</th>
</tr>
</thead>
<tbody>
@ -45,12 +45,13 @@
<tr>
<td class="align-middle">@info.VatNumber</td>
<td class="align-middle">@info.Name</td>
<td class="align-middle">@info.ZipCode @info.City</td>
<td class="align-middle">@info.States[^1].State</td>
<td class="align-middle">
<button type="button" class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber, true))">OVERFØR</button>
<button type="button" class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber, true))">Alle data</button>
</td>
<td class="align-middle">
<button type="button" class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber, false))">CVR/VAT</button>
<button type="button" class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber, false))">Moms Nr</button>
</td>
</tr>
}

View file

@ -1,13 +1,13 @@
{
"appInfo": {
"name": "Wonky Client",
"version": "0.50.2",
"version": "0.51.1",
"rc": false,
"sandBox": false,
"image": "grumpy-coder.png"
},
"apiConfig": {
"innoBaseUrl": "https://zeta.innotec.dk",
"innoBaseUrl": "https://eta.innotec.dk",
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
"glsId": "",
"serviceVirk": "api/v2/services/virk",