minor refactor and cosmetics on company view page
This commit is contained in:
parent
666b9b0df3
commit
c0db6b4fad
4 changed files with 169 additions and 112 deletions
|
@ -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"/>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue