adding http repos for endpoint splitting
This commit is contained in:
parent
7c718360d8
commit
341e254071
7 changed files with 362 additions and 261 deletions
|
@ -13,6 +13,8 @@
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||||
//
|
//
|
||||||
|
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
namespace Wonky.Client.Helpers;
|
namespace Wonky.Client.Helpers;
|
||||||
|
|
||||||
public class VatUtils
|
public class VatUtils
|
||||||
|
@ -22,18 +24,24 @@ public class VatUtils
|
||||||
|
|
||||||
public static bool ValidateFormat(string countryCode, string vatNumber)
|
public static bool ValidateFormat(string countryCode, string vatNumber)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(vatNumber) || string.IsNullOrWhiteSpace(countryCode))
|
if (string.IsNullOrWhiteSpace(vatNumber) || string.IsNullOrWhiteSpace(countryCode) || !IsDigitsOnly(vatNumber))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
var sanitisedVat = SanitizeVatNumber(vatNumber);
|
||||||
|
|
||||||
return countryCode.ToUpperInvariant() switch
|
return countryCode.ToUpperInvariant() switch
|
||||||
{
|
{
|
||||||
"DK" => ValidateFormatDk(vatNumber),
|
"DK" => ValidateFormatDk(sanitisedVat),
|
||||||
"NO" => ValidateFormatNo(vatNumber),
|
"NO" => ValidateFormatNo(sanitisedVat),
|
||||||
"SE" => ValidateFormatSe(vatNumber),
|
"SE" => ValidateFormatSe(sanitisedVat),
|
||||||
_ => false
|
_ => false
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool IsDigitsOnly(string check)
|
||||||
|
{
|
||||||
|
return check.All(c => c is >= '0' and <= '9');
|
||||||
|
}
|
||||||
private static bool ValidateFormatDk(string vatNumber)
|
private static bool ValidateFormatDk(string vatNumber)
|
||||||
{
|
{
|
||||||
// https://wiki.scn.sap.com/wiki/display/CRM/Denmark
|
// https://wiki.scn.sap.com/wiki/display/CRM/Denmark
|
||||||
|
@ -42,12 +50,11 @@ public class VatUtils
|
||||||
// C8 check-digit MOD11
|
// C8 check-digit MOD11
|
||||||
// C1 > 0
|
// C1 > 0
|
||||||
// R = (2*C1 + 7*C2 + 6*C3 + 5*C4 + 4*C5 + 3*C6 + 2*C7 + C8)
|
// R = (2*C1 + 7*C2 + 6*C3 + 5*C4 + 4*C5 + 3*C6 + 2*C7 + C8)
|
||||||
var vatToCheck = SanitizeVatNumber(vatNumber);
|
if (vatNumber.Length != 8)
|
||||||
if (vatToCheck.Length != 8)
|
|
||||||
return false;
|
return false;
|
||||||
if ((int)char.GetNumericValue(vatToCheck[0]) < 1 || vatToCheck.Length > 8)
|
if ((int)char.GetNumericValue(vatNumber[0]) < 1 || vatNumber.Length > 8)
|
||||||
return false;
|
return false;
|
||||||
return ValidateMod11(vatToCheck);
|
return ValidateMod11(vatNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ValidateFormatNo(string vatNumber)
|
private static bool ValidateFormatNo(string vatNumber)
|
||||||
|
@ -57,10 +64,9 @@ public class VatUtils
|
||||||
// C1..C8 random 0 to 9
|
// C1..C8 random 0 to 9
|
||||||
// C9 check-digit MOD11
|
// C9 check-digit MOD11
|
||||||
// C10 C11 C12 chars == MVA
|
// C10 C11 C12 chars == MVA
|
||||||
var vatToCheck = SanitizeVatNumber(vatNumber);
|
if (vatNumber.Length != 9)
|
||||||
if (vatToCheck.Length != 9)
|
|
||||||
return false;
|
return false;
|
||||||
return long.Parse(vatToCheck) != 0 && ValidateMod11(vatNumber);
|
return long.Parse(vatNumber) != 0 && ValidateMod11(vatNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ValidateFormatSe(string vatNumber)
|
private static bool ValidateFormatSe(string vatNumber)
|
||||||
|
@ -72,7 +78,7 @@ public class VatUtils
|
||||||
// Si = int(Ci/5) + (Ci*2)MOD10)
|
// Si = int(Ci/5) + (Ci*2)MOD10)
|
||||||
// https://www.skatteverket.se/skatter/mervardesskattmoms/momsregistreringsnummer.4.18e1b10334ebe8bc80002649.html
|
// https://www.skatteverket.se/skatter/mervardesskattmoms/momsregistreringsnummer.4.18e1b10334ebe8bc80002649.html
|
||||||
// C11 C12 == 01 (De två sista siffrorna är alltid 01)
|
// C11 C12 == 01 (De två sista siffrorna är alltid 01)
|
||||||
var vatToCheck = SanitizeVatNumber(vatNumber);
|
var vatToCheck = vatNumber;
|
||||||
if (vatToCheck.Length < 10 || long.Parse(vatToCheck) == 0)
|
if (vatToCheck.Length < 10 || long.Parse(vatToCheck) == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -104,8 +110,7 @@ public class VatUtils
|
||||||
|
|
||||||
private static string SanitizeVatNumber(string vatNumber)
|
private static string SanitizeVatNumber(string vatNumber)
|
||||||
{
|
{
|
||||||
vatNumber = vatNumber.ToUpperInvariant();
|
return vatNumber.ToUpperInvariant()
|
||||||
return vatNumber
|
|
||||||
.Replace(" ", "")
|
.Replace(" ", "")
|
||||||
.Replace("-", "")
|
.Replace("-", "")
|
||||||
.Replace("DK", "")
|
.Replace("DK", "")
|
||||||
|
|
|
@ -26,4 +26,7 @@ public interface ICrmCompanyHttpRepository
|
||||||
Task<string> CreateCompany(CompanyDto model);
|
Task<string> CreateCompany(CompanyDto model);
|
||||||
Task<bool> UpdateCompany(string companyId, CompanyDto model);
|
Task<bool> UpdateCompany(string companyId, CompanyDto model);
|
||||||
Task<bool> DeleteCompany(string companyId);
|
Task<bool> DeleteCompany(string companyId);
|
||||||
|
Task<CompanyDto> UpdateCrmData(string companyId, CompanyDto model);
|
||||||
|
Task<CompanyDto> UpdateErpData(string companyId, CompanyDto model);
|
||||||
|
Task<CompanyDto> UpdateCompanyVat(string companyId, string vatNumber);
|
||||||
}
|
}
|
|
@ -115,10 +115,9 @@ public class CrmCompanyHttpRepository : ICrmCompanyHttpRepository
|
||||||
{
|
{
|
||||||
var response = await _client.PutAsJsonAsync($"{_conf.CrmCustomers}/{companyId}", model);
|
var response = await _client.PutAsJsonAsync($"{_conf.CrmCustomers}/{companyId}", model);
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
Console.WriteLine(content);
|
|
||||||
return response.IsSuccessStatusCode;
|
return response.IsSuccessStatusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Delete company
|
/// Delete company
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -129,4 +128,48 @@ public class CrmCompanyHttpRepository : ICrmCompanyHttpRepository
|
||||||
var response = await _client.DeleteAsync($"{_conf.CrmCustomers}/{companyId}");
|
var response = await _client.DeleteAsync($"{_conf.CrmCustomers}/{companyId}");
|
||||||
return response.IsSuccessStatusCode;
|
return response.IsSuccessStatusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update Company CRM properties
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="companyId"></param>
|
||||||
|
/// <param name="model"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<CompanyDto> UpdateCrmData(string companyId, CompanyDto model)
|
||||||
|
{
|
||||||
|
var response = await _client.PutAsJsonAsync($"{_conf.CrmCustomers}/{companyId}/crmData", model, _options);
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
return string.IsNullOrWhiteSpace(content) ? new CompanyDto() : JsonSerializer.Deserialize<CompanyDto>(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update Company ERP properties
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="companyId"></param>
|
||||||
|
/// <param name="model"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<CompanyDto> UpdateErpData(string companyId, CompanyDto model)
|
||||||
|
{
|
||||||
|
var response = await _client.PutAsJsonAsync($"{_conf.CrmCustomers}/{companyId}/erpData", model, _options);
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
return string.IsNullOrWhiteSpace(content) ? new CompanyDto() : JsonSerializer.Deserialize<CompanyDto>(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update company VAT number
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="companyId"></param>
|
||||||
|
/// <param name="vatNumber"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<CompanyDto> UpdateCompanyVat(string companyId, string vatNumber)
|
||||||
|
{
|
||||||
|
var model = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
{ "VatNumber", vatNumber }
|
||||||
|
};
|
||||||
|
var response = await _client.PutAsJsonAsync($"{_conf.CrmCustomers}/{companyId}/vat", model, _options);
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
return string.IsNullOrWhiteSpace(content) ? new CompanyDto() : JsonSerializer.Deserialize<CompanyDto>(content);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -29,230 +29,236 @@
|
||||||
<h4>Ring til kontoret. Denne konto er spærret med kode '@Company.Blocked'</h4>
|
<h4>Ring til kontoret. Denne konto er spærret med kode '@Company.Blocked'</h4>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="card">
|
<div class="alert bg-dark text-white">
|
||||||
<div class="card-header bg-dark text-white">
|
|
||||||
<h3>@Company.Name</h3>
|
<h3>@Company.Name</h3>
|
||||||
</div>
|
</div>
|
||||||
@if (Dk)
|
<EditForm EditContext="ErpContext" OnValidSubmit="SubmitUpdate">
|
||||||
{
|
|
||||||
<div class="card-body">
|
|
||||||
<VatAddressInputComponent Address="CompanyVatAddress" OnValidSubmit="GetInfoFromAddress"/>
|
|
||||||
@if (VatInfos.Any())
|
|
||||||
{
|
|
||||||
<table class="table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">CVR ORG</th>
|
|
||||||
<th scope="col">Navn</th>
|
|
||||||
<th scope="col">Status</th>
|
|
||||||
<th scope="col"></th>
|
|
||||||
<th scope="col"></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var info in VatInfos)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<td class="align-middle">@info.VatNumber</td>
|
|
||||||
<td class="align-middle">@info.Name</td>
|
|
||||||
<td class="align-middle">@info.States[^1].State</td>
|
|
||||||
<td class="align-middle">
|
|
||||||
<button class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber, true))">OVERFØR</button>
|
|
||||||
</td>
|
|
||||||
<td class="align-middle">
|
|
||||||
<button class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber, false))">CVR/VAT</button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
<EditForm EditContext="CompanyContext" OnValidSubmit="SubmitUpdate">
|
|
||||||
<DataAnnotationsValidator/>
|
<DataAnnotationsValidator/>
|
||||||
<div class="card-body">
|
<div class="row mb-1">
|
||||||
<div class="row mb-1">
|
<label for="name" class="col-sm-1 col-form-label-sm">Navn</label>
|
||||||
<label for="note" class="col-sm-1 col-form-label-sm">OBS</label>
|
<div class="col-sm-5">
|
||||||
<div class="col-sm-9">
|
<InputText id="name" class="form-control" @bind-Value="Company.Name"/>
|
||||||
@if (string.IsNullOrWhiteSpace(Company.Note))
|
<ValidationMessage For="@(() => Company.Name)"></ValidationMessage>
|
||||||
{
|
|
||||||
<InputText name="note" id="note" class="form-control" @bind-Value="Company.Note"/>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<InputText name="note" id="note" class="form-control bg-warning text-black" @bind-Value="Company.Note"/>
|
|
||||||
}
|
|
||||||
<ValidationMessage For="@(() => Company.Note)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<label for="attention" class="col-sm-1 col-form-label-sm">Att.</label>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<InputText id="attention" class="form-control" @bind-Value="Company.Attention"/>
|
||||||
|
<ValidationMessage For="@(() => Company.Attention)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row mb-1">
|
<div class="row mb-1">
|
||||||
<label for="vatNumber" class="col-sm-1 col-form-label-sm">MomsNr</label>
|
<label for="address1" class="col-sm-1 col-form-label-sm">Adresse</label>
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-5">
|
||||||
<div class="input-group">
|
<InputText id="address1" class="form-control" @bind-Value="Company.Address1"/>
|
||||||
<span class="input-group-text">
|
<ValidationMessage For="@(() => Company.Address1)"></ValidationMessage>
|
||||||
<DisplayStateComponent StateClass="@VatState"/>
|
|
||||||
</span>
|
|
||||||
<InputText id="vatNumber" class="form-control" @bind-Value="Company.VatNumber"/>
|
|
||||||
<ValidationMessage For="@(() => Company.VatNumber)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<label for="account" class="col-sm-1 col-form-label-sm">Konto</label>
|
|
||||||
<div class="col-sm-4">
|
|
||||||
<input id="account" type="text" class="form-control" readonly value="@Company.Account"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<label for="address2" class="col-sm-1 col-form-label-sm">Adresse</label>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<InputText id="address2" class="form-control" @bind-Value="Company.Address2"/>
|
||||||
|
<ValidationMessage For="@(() => Company.Address2)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row mb-1">
|
<div class="row mb-1">
|
||||||
<label for="name" class="col-sm-1 col-form-label-sm">Navn</label>
|
<label for="zipCode" class="col-sm-1 col-form-label-sm">PostNr</label>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-2">
|
||||||
<InputText id="name" class="form-control" @bind-Value="Company.Name"/>
|
<InputText id="zipCode" class="form-control" @bind-Value="Company.ZipCode"/>
|
||||||
<ValidationMessage For="@(() => Company.Name)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.ZipCode)"></ValidationMessage>
|
||||||
</div>
|
|
||||||
<label for="attention" class="col-sm-1 col-form-label-sm">Att.</label>
|
|
||||||
<div class="col-sm-3">
|
|
||||||
<InputText id="attention" class="form-control" @bind-Value="Company.Attention"/>
|
|
||||||
<ValidationMessage For="@(() => Company.Attention)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<label for="city" class="col-sm-1 col-form-label-sm">Bynavn</label>
|
||||||
<div class="row mb-1">
|
<div class="col-sm-6">
|
||||||
<label for="address1" class="col-sm-1 col-form-label-sm">Adresse</label>
|
<InputText id="city" class="form-control" @bind-Value="Company.City"/>
|
||||||
<div class="col-sm-5">
|
<ValidationMessage For="@(() => Company.City)"></ValidationMessage>
|
||||||
<InputText id="address1" class="form-control" @bind-Value="Company.Address1"/>
|
|
||||||
<ValidationMessage For="@(() => Company.Address1)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
<label for="address2" class="col-sm-1 col-form-label-sm">Adresse</label>
|
|
||||||
<div class="col-sm-3">
|
|
||||||
<InputText id="address2" class="form-control" @bind-Value="Company.Address2"/>
|
|
||||||
<ValidationMessage For="@(() => Company.Address2)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-1">
|
|
||||||
<label for="zipCode" class="col-sm-1 col-form-label-sm">PostNr</label>
|
|
||||||
<div class="col-sm-2">
|
|
||||||
<InputText id="zipCode" class="form-control" @bind-Value="Company.ZipCode"/>
|
|
||||||
<ValidationMessage For="@(() => Company.ZipCode)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
<label for="city" class="col-sm-1 col-form-label-sm">Bynavn</label>
|
|
||||||
<div class="col-sm-6">
|
|
||||||
<InputText id="city" class="form-control" @bind-Value="Company.City"/>
|
|
||||||
<ValidationMessage For="@(() => Company.City)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row mb-1">
|
<div class="row mb-1">
|
||||||
<label for="phone" class="col-sm-1 col-form-label-sm">Telefon</label>
|
<label for="phone" class="col-sm-1 col-form-label-sm">Telefon</label>
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
<InputText id="phone" class="form-control" @bind-Value="Company.Phone"/>
|
<InputText id="phone" class="form-control" @bind-Value="Company.Phone"/>
|
||||||
<ValidationMessage For="@(() => Company.Phone)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.Phone)"></ValidationMessage>
|
||||||
</div>
|
|
||||||
<label for="mobile" class="col-sm-1 col-form-label-sm">Mobil</label>
|
|
||||||
<div class="col-sm-4">
|
|
||||||
<InputText id="mobile" class="form-control" @bind-Value="Company.Mobile"/>
|
|
||||||
<ValidationMessage For="@(() => Company.Mobile)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<label for="mobile" class="col-sm-1 col-form-label-sm">Mobil</label>
|
||||||
<div class="row mb-1">
|
<div class="col-sm-4">
|
||||||
<label for="email" class="col-sm-1 col-form-label-sm">Epost</label>
|
<InputText id="mobile" class="form-control" @bind-Value="Company.Mobile"/>
|
||||||
<div class="col-sm-9">
|
<ValidationMessage For="@(() => Company.Mobile)"></ValidationMessage>
|
||||||
<InputText id="email" class="form-control" @bind-Value="Company.Email"/>
|
|
||||||
<ValidationMessage For="@(() => Company.Email)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<hr/>
|
</div>
|
||||||
<div class="row mb-1">
|
|
||||||
<label for="nextVisit" class="col-sm-1 col-form-label-sm">Næste besøg</label>
|
<div class="row mb-1">
|
||||||
<div class="col-sm-3">
|
<label for="email" class="col-sm-1 col-form-label-sm">Epost</label>
|
||||||
<div class="input-group">
|
<div class="col-sm-9">
|
||||||
<span class="input-group-text">
|
<InputText id="email" class="form-control" @bind-Value="Company.Email"/>
|
||||||
<DisplayStateComponent StateClass="@VisitState"/>
|
<ValidationMessage For="@(() => Company.Email)"></ValidationMessage>
|
||||||
</span>
|
|
||||||
<InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<label for="lastVisit" class="col-sm-1 col-form-label-sm">Sidse besøg</label>
|
|
||||||
<div class="col-sm-3">
|
|
||||||
<InputDate id="lastVisit" class="form-control" @bind-Value="@LastVisit"/>
|
|
||||||
</div>
|
|
||||||
<label for="interval" class="col-sm-2 col-form-label-sm">Uge Interval</label>
|
|
||||||
<div class="col-sm-2">
|
|
||||||
<InputNumber id="interval" class="form-control" @bind-Value="Company.Interval"/>
|
|
||||||
<ValidationMessage For="@(() => Company.Interval)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-1">
|
|
||||||
<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="row">
|
|
||||||
<div class="col">Stilling</div>
|
|
||||||
<div class="col">Navn</div>
|
|
||||||
<div class="col">Direkte</div>
|
|
||||||
<div class="col text-end">
|
|
||||||
<i class="bi-plus-circle"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@if (Contacts.Any())
|
|
||||||
{
|
|
||||||
@foreach (var contact in Contacts)
|
|
||||||
{
|
|
||||||
<div class="list-group-item list-group-item-action" @onclick="() => OpenContact(contact)">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col">@contact.JobTitle</div>
|
|
||||||
<div class="col">@contact.FirstName @contact.LastName</div>
|
|
||||||
<div class="col">@contact.PhoneDirect</div>
|
|
||||||
<div class="col text-end">
|
|
||||||
<i class="bi-pencil"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<label for="crmNotes" class="col-sm-1 col-form-label-sm">Noter</label>
|
|
||||||
<div class="col-sm-4">
|
|
||||||
<InputTextArea id="crmNotes" class="form-control" style="height: 100%;" @bind-Value="Company.CrmNotes"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card-footer">
|
|
||||||
<div class="row mb-2">
|
|
||||||
<div class="col">
|
<hr/>
|
||||||
<a class="btn btn-light border-dark d-block" href="/companies/@Company.CompanyId/invoices">Faktura</a>
|
|
||||||
|
@* vat context *@
|
||||||
|
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="vatNumber" class="col-sm-1 col-form-label-sm">MomsNr</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text">
|
||||||
|
<DisplayStateComponent StateClass="@VatState"/>
|
||||||
|
</span>
|
||||||
|
<InputText id="vatNumber" class="form-control" @bind-Value="Company.VatNumber"/>
|
||||||
|
<ValidationMessage For="@(() => Company.VatNumber)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
</div>
|
||||||
<a class="btn btn-light border-dark d-block" href="/companies/@Company.CompanyId/activities">Besøg</a>
|
<label for="account" class="col-sm-1 col-form-label-sm">Konto</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<input id="account" type="text" class="form-control" readonly value="@Company.Account"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* erp context *@
|
||||||
|
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="note" class="col-sm-1 col-form-label-sm">OBS</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
@if (string.IsNullOrWhiteSpace(Company.Note))
|
||||||
|
{
|
||||||
|
<InputText name="note" id="note" class="form-control" @bind-Value="Company.Note"/>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<InputText name="note" id="note" class="form-control bg-warning text-black" @bind-Value="Company.Note"/>
|
||||||
|
}
|
||||||
|
<ValidationMessage For="@(() => Company.Note)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="nextVisit" class="col-sm-1 col-form-label-sm">Næste besøg</label>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text">
|
||||||
|
<DisplayStateComponent StateClass="@VisitState"/>
|
||||||
|
</span>
|
||||||
|
<InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
</div>
|
||||||
<a class="btn btn-light border-dark d-block" href="/companies/@Company.CompanyId/h/i">Produkter</a>
|
<label for="lastVisit" class="col-sm-1 col-form-label-sm">Sidse besøg</label>
|
||||||
</div>
|
<div class="col-sm-3">
|
||||||
<div class="col d-block">
|
<InputDate id="lastVisit" class="form-control" @bind-Value="@LastVisit"/>
|
||||||
<button type="submit" class="btn btn-light border-dark d-block" disabled="@(Working)">Gem</button>
|
</div>
|
||||||
@if (Company.HasFolded == 1)
|
<label for="interval" class="col-sm-2 col-form-label-sm">Uge Interval</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<InputNumber id="interval" class="form-control" @bind-Value="Company.Interval"/>
|
||||||
|
<ValidationMessage For="@(() => Company.Interval)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-1">
|
||||||
|
<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="row">
|
||||||
|
<div class="col-sm-4">Stilling</div>
|
||||||
|
<div class="col-sm-4">Navn</div>
|
||||||
|
<div class="col-sm-3">Direkte</div>
|
||||||
|
<div class="col-sm-1 text-end">
|
||||||
|
<i class="bi-plus-circle"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if (Contacts.Any())
|
||||||
{
|
{
|
||||||
<button type="button" class="btn btn-warning" onclick="@ForceActivity">Aktiver besøg</button>
|
@foreach (var contact in Contacts)
|
||||||
|
{
|
||||||
|
<div class="list-group-item list-group-item-action" @onclick="() => OpenContact(contact)">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4">@contact.JobTitle</div>
|
||||||
|
<div class="col-sm-4">@contact.FirstName @contact.LastName</div>
|
||||||
|
<div class="col-sm-3">@contact.PhoneDirect</div>
|
||||||
|
<div class="col-sm-1 text-end">
|
||||||
|
<i class="bi-pencil"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
</div>
|
||||||
<ActivityButton ActionLink="@ActionLink"
|
<label for="crmNotes" class="col-sm-1 col-form-label-sm">Noter</label>
|
||||||
ButtonText="Besøg"
|
<div class="col-sm-4">
|
||||||
ButtonType="primary"
|
<InputTextArea id="crmNotes" class="form-control" style="height: 100%;" @bind-Value="Company.CrmNotes"/>
|
||||||
Enabled="@EnableActivity">
|
</div>
|
||||||
</ActivityButton>
|
</div>
|
||||||
</div>
|
|
||||||
|
<div class="row mt-3 mb-2">
|
||||||
|
<div class="col">
|
||||||
|
<a class="btn btn-light border-dark d-block" href="/companies/@Company.CompanyId/invoices">Faktura</a>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<a class="btn btn-light border-dark d-block" href="/companies/@Company.CompanyId/activities">Besøg</a>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<a class="btn btn-light border-dark d-block" href="/companies/@Company.CompanyId/h/i">Produkter</a>
|
||||||
|
</div>
|
||||||
|
<div class="col d-block">
|
||||||
|
<button type="submit" class="btn btn-light border-dark d-block" disabled="@(Working)">Gem</button>
|
||||||
|
@if (Company.HasFolded == 1)
|
||||||
|
{
|
||||||
|
<button type="button" class="btn btn-warning" onclick="@ForceActivity">Aktiver besøg</button>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<ActivityButton ActionLink="@ActionLink"
|
||||||
|
ButtonText="Besøg"
|
||||||
|
ButtonType="primary"
|
||||||
|
Enabled="@EnableActivity">
|
||||||
|
</ActivityButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</EditForm>
|
</EditForm>
|
||||||
</div>
|
|
||||||
|
@if (Dk)
|
||||||
|
{
|
||||||
|
<div class="alert alert-light border-dark">
|
||||||
|
<h3>CVR adresse kontrol</h3>
|
||||||
|
<div class="row mt-2">
|
||||||
|
<VatAddressInputComponent Address="CompanyVatAddress" OnValidSubmit="GetInfoFromAddress"/>
|
||||||
|
@if (VatInfos.Any())
|
||||||
|
{
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">CVR ORG</th>
|
||||||
|
<th scope="col">Navn</th>
|
||||||
|
<th scope="col">Status</th>
|
||||||
|
<th scope="col"></th>
|
||||||
|
<th scope="col"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach (var info in VatInfos)
|
||||||
|
{
|
||||||
|
<tr>
|
||||||
|
<td class="align-middle">@info.VatNumber</td>
|
||||||
|
<td class="align-middle">@info.Name</td>
|
||||||
|
<td class="align-middle">@info.States[^1].State</td>
|
||||||
|
<td class="align-middle">
|
||||||
|
<button class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber, true))">OVERFØR</button>
|
||||||
|
</td>
|
||||||
|
<td class="align-middle">
|
||||||
|
<button class="btn btn-primary" @onclick="@(() => SelectCompany(info.VatNumber, false))">CVR/VAT</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -260,4 +266,4 @@ else
|
||||||
}
|
}
|
||||||
|
|
||||||
<VatLookupDkModal VatAddress="CompanyVatAddress" OnSelectedCompany="OnSelectedCompany" @ref="VatLookupPopup"/>
|
<VatLookupDkModal VatAddress="CompanyVatAddress" OnSelectedCompany="OnSelectedCompany" @ref="VatLookupPopup"/>
|
||||||
<ContactModal ParamContact="@SelectedContact" CompanyName="@Company.Name" @ref="ContactPopup" OnSaveClicked="SaveContact" OnDeleteClicked="DeleteContact" />
|
<ContactModal ParamContact="@SelectedContact" CompanyName="@Company.Name" @ref="ContactPopup" OnSaveClicked="SaveContact" OnDeleteClicked="DeleteContact"/>
|
|
@ -50,7 +50,8 @@ public partial class CrmCompanyViewPage : IDisposable
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
private readonly JsonSerializerOptions _options = new () { PropertyNameCaseInsensitive = true };
|
private readonly JsonSerializerOptions _options = new () { PropertyNameCaseInsensitive = true };
|
||||||
private CompanyDto Company { get; set; } = new();
|
private CompanyDto Company { get; set; } = new();
|
||||||
private EditContext CompanyContext { get; set; }
|
private EditContext ErpContext { get; set; }
|
||||||
|
private EditContext CrmContext { get; set; }
|
||||||
private List<VirkRegInfo> VatInfos { get; set; } = new();
|
private List<VirkRegInfo> VatInfos { get; set; } = new();
|
||||||
private VirkRegInfo CompanyRegInfo { get; set; } = new();
|
private VirkRegInfo CompanyRegInfo { get; set; } = new();
|
||||||
private DateTime LastVisit { get; set; }
|
private DateTime LastVisit { get; set; }
|
||||||
|
@ -129,9 +130,10 @@ public partial class CrmCompanyViewPage : IDisposable
|
||||||
ValidVat = Company.ValidVat == 1; // flag set if company has a valid vatNumber
|
ValidVat = Company.ValidVat == 1; // flag set if company has a valid vatNumber
|
||||||
VatState = Company.ValidVat == 1 ? "the-good" : "no-vat"; // assign css class
|
VatState = Company.ValidVat == 1 ? "the-good" : "no-vat"; // assign css class
|
||||||
}
|
}
|
||||||
CompanyContext = new EditContext(Company);
|
ErpContext = new EditContext(Company);
|
||||||
CompanyContext.OnFieldChanged += HandleFieldChanged;
|
ErpContext.OnFieldChanged += HandleFieldChanged;
|
||||||
CompanyContext.OnValidationStateChanged += ValidationChanged;
|
ErpContext.OnValidationStateChanged += ValidationChanged;
|
||||||
|
|
||||||
|
|
||||||
await SyncCompanyHistory();
|
await SyncCompanyHistory();
|
||||||
Contacts = await ContactRepo.GetContacts(CompanyId);
|
Contacts = await ContactRepo.GetContacts(CompanyId);
|
||||||
|
@ -185,10 +187,13 @@ public partial class CrmCompanyViewPage : IDisposable
|
||||||
if (!VatUtils.ValidateFormat(Company.CountryCode, Company.VatNumber))
|
if (!VatUtils.ValidateFormat(Company.CountryCode, Company.VatNumber))
|
||||||
{
|
{
|
||||||
FormInvalid = true;
|
FormInvalid = true;
|
||||||
|
ValidVat = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FormInvalid = !CompanyContext.Validate();
|
FormInvalid = !ErpContext.Validate();
|
||||||
|
ValidVat = true;
|
||||||
|
EnableActivity = 1;
|
||||||
}
|
}
|
||||||
if(VatUpdated == 0 && e.FieldIdentifier.FieldName != "Note" && e.FieldIdentifier.FieldName != "CrmNotes")
|
if(VatUpdated == 0 && e.FieldIdentifier.FieldName != "Note" && e.FieldIdentifier.FieldName != "CrmNotes")
|
||||||
IsDirty = 1;
|
IsDirty = 1;
|
||||||
|
@ -199,48 +204,75 @@ public partial class CrmCompanyViewPage : IDisposable
|
||||||
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
|
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
|
||||||
{
|
{
|
||||||
FormInvalid = false;
|
FormInvalid = false;
|
||||||
CompanyContext.OnFieldChanged -= HandleFieldChanged;
|
ErpContext.OnFieldChanged -= HandleFieldChanged;
|
||||||
CompanyContext.OnValidationStateChanged -= ValidationChanged;
|
ErpContext.OnValidationStateChanged -= ValidationChanged;
|
||||||
|
|
||||||
CompanyContext = new EditContext(Company);
|
ErpContext = new EditContext(Company);
|
||||||
|
|
||||||
FormInvalid = CompanyContext.Validate();
|
FormInvalid = ErpContext.Validate();
|
||||||
|
|
||||||
CompanyContext.OnFieldChanged += HandleFieldChanged;
|
ErpContext.OnFieldChanged += HandleFieldChanged;
|
||||||
CompanyContext.OnValidationStateChanged += ValidationChanged;
|
ErpContext.OnValidationStateChanged += ValidationChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SubmitUpdate()
|
private async Task<bool> UpdateCrmData()
|
||||||
|
{
|
||||||
|
Toaster.ShowInfo("Vent venligst ...", "Opdaterer CRM data");
|
||||||
|
|
||||||
|
Working = true;
|
||||||
|
|
||||||
|
Company.LastVisit = $"{LastVisit:yyyy-MM-dd}";
|
||||||
|
Company.NextVisit = $"{NextVisit:yyyy-MM-dd}";
|
||||||
|
Company.IsHidden = 0;
|
||||||
|
|
||||||
|
Company = await CompanyRepo.UpdateCompanyVat(CompanyId, Company.VatNumber);
|
||||||
|
StateHasChanged();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<bool> UpdateErpData()
|
||||||
{
|
{
|
||||||
Working = true;
|
Working = true;
|
||||||
|
|
||||||
|
Toaster.ShowInfo("Vent venligst ...", "Opdaterer Erp data");
|
||||||
|
Company = await CompanyRepo.UpdateCompanyVat(CompanyId, Company.VatNumber);
|
||||||
|
StateHasChanged();
|
||||||
|
|
||||||
|
Working = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<bool> UpdateVatNumber()
|
||||||
|
{
|
||||||
// simple format validation if CRM indicates invalid vatNumber
|
// simple format validation if CRM indicates invalid vatNumber
|
||||||
if (!VatUtils.ValidateFormat(Company.CountryCode, Company.VatNumber))
|
if (!VatUtils.ValidateFormat(Company.CountryCode, Company.VatNumber))
|
||||||
{
|
{
|
||||||
Toaster.ShowError($"CVR/VAT/ORG nummer mangler eller er ugyldig.");
|
Toaster.ShowError($"CVR/VAT/ORG nummer mangler eller er ugyldig.");
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Working = true;
|
||||||
|
|
||||||
|
Toaster.ShowInfo("Vent venligst ...", "Opdaterer Moms Nr");
|
||||||
|
Company = await CompanyRepo.UpdateCompanyVat(CompanyId, Company.VatNumber);
|
||||||
|
StateHasChanged();
|
||||||
|
|
||||||
|
Working = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SubmitUpdate()
|
||||||
|
{
|
||||||
|
if (!await UpdateCrmData())
|
||||||
|
{
|
||||||
|
Toaster.ShowError("CRM data opdatering fejlede.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Toaster.ShowInfo("Vent venligst ....");
|
|
||||||
//_hideButtons = true;
|
if (!await UpdateErpData())
|
||||||
Company.LastVisit = $"{LastVisit:yyyy-MM-dd}";
|
{
|
||||||
Company.NextVisit = $"{NextVisit:yyyy-MM-dd}";
|
Toaster.ShowError("ERP data opdatering fejlede.");
|
||||||
Company.IsHidden = 0;
|
}
|
||||||
|
|
||||||
// flag if backend should update ERP system
|
|
||||||
Company.UpdateErpVat = VatUpdated;
|
|
||||||
|
|
||||||
// flag base info has changed
|
|
||||||
Company.IsDirty = IsDirty;
|
|
||||||
|
|
||||||
var success = await CompanyRepo.UpdateCompany(CompanyId, Company );
|
|
||||||
|
|
||||||
Toaster.ShowSuccess("Opdatering er afsendt. Der går nogle minutter inden data er opdateret.");
|
|
||||||
Company = await CompanyRepo.GetCompanyById(Company.CompanyId);
|
|
||||||
Company.ValidVat = 1;
|
|
||||||
EnableActivity = 1;
|
|
||||||
Working = false;
|
|
||||||
Toaster.ClearAll();
|
|
||||||
StateHasChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task GetInfoFromAddress(VatAddress address)
|
private async Task GetInfoFromAddress(VatAddress address)
|
||||||
|
@ -291,7 +323,8 @@ public partial class CrmCompanyViewPage : IDisposable
|
||||||
private void CallVatLookupModal()
|
private void CallVatLookupModal()
|
||||||
{
|
{
|
||||||
VatLookupPopup.Show();
|
VatLookupPopup.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnSelectedCompany(VirkRegInfo regInfo)
|
private void OnSelectedCompany(VirkRegInfo regInfo)
|
||||||
{
|
{
|
||||||
ValidVat = regInfo.States[0].State.ToLower() == "normal";
|
ValidVat = regInfo.States[0].State.ToLower() == "normal";
|
||||||
|
@ -312,7 +345,7 @@ public partial class CrmCompanyViewPage : IDisposable
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Company.VatNumber = CompanyRegInfo.VatNumber;
|
Company.VatNumber = CompanyRegInfo.VatNumber;
|
||||||
VatUpdated = 1;
|
Company = CompanyRepo.UpdateCompanyVat(CompanyId, Company.VatNumber).Result;
|
||||||
}
|
}
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
@ -338,7 +371,7 @@ public partial class CrmCompanyViewPage : IDisposable
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Company.VatNumber = CompanyRegInfo.VatNumber;
|
Company.VatNumber = CompanyRegInfo.VatNumber;
|
||||||
VatUpdated = 1;
|
Company = CompanyRepo.UpdateCompanyVat(CompanyId, Company.VatNumber).Result;
|
||||||
}
|
}
|
||||||
// empty list
|
// empty list
|
||||||
VatInfos = new List<VirkRegInfo>();
|
VatInfos = new List<VirkRegInfo>();
|
||||||
|
@ -348,7 +381,7 @@ public partial class CrmCompanyViewPage : IDisposable
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
Interceptor.DisposeEvent();
|
Interceptor.DisposeEvent();
|
||||||
CompanyContext.OnFieldChanged -= HandleFieldChanged;
|
ErpContext.OnFieldChanged -= HandleFieldChanged;
|
||||||
CompanyContext.OnValidationStateChanged -= ValidationChanged;
|
ErpContext.OnValidationStateChanged -= ValidationChanged;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -29,7 +29,7 @@
|
||||||
<DataAnnotationsValidator/>
|
<DataAnnotationsValidator/>
|
||||||
<InputText type="hidden" @bind-Value="@Contact.CompanyId"/>
|
<InputText type="hidden" @bind-Value="@Contact.CompanyId"/>
|
||||||
<InputText type="hidden" @bind-Value="@Contact.ContactId"/>
|
<InputText type="hidden" @bind-Value="@Contact.ContactId"/>
|
||||||
<div class="row">
|
<div class="row g-3">
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<label for="firstName">Fornavn</label>
|
<label for="firstName">Fornavn</label>
|
||||||
<InputText id="firstName" class="form-control" @bind-Value="Contact.FirstName"/>
|
<InputText id="firstName" class="form-control" @bind-Value="Contact.FirstName"/>
|
||||||
|
@ -50,6 +50,18 @@
|
||||||
<InputText id="phone" class="form-control" @bind-Value="Contact.PhoneDirect"/>
|
<InputText id="phone" class="form-control" @bind-Value="Contact.PhoneDirect"/>
|
||||||
<ValidationMessage For="@(() => Contact.PhoneDirect)"></ValidationMessage>
|
<ValidationMessage For="@(() => Contact.PhoneDirect)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<label for="email">Epost</label>
|
||||||
|
<InputText id="email" class="form-control" @bind-Value="Contact.Email" />
|
||||||
|
<ValidationMessage For="@(() => Contact.Email)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<label for="mobile">Mobil</label>
|
||||||
|
<InputText id="mobile" class="form-control" @bind-Value="Contact.Mobile" />
|
||||||
|
<ValidationMessage For="@(() => Contact.Mobile)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-3">
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
@if (string.IsNullOrWhiteSpace(Contact.ContactId))
|
@if (string.IsNullOrWhiteSpace(Contact.ContactId))
|
||||||
{
|
{
|
||||||
|
@ -59,7 +71,6 @@
|
||||||
{
|
{
|
||||||
<button type="button" class="btn btn-danger" @onclick="DeleteContact">Slet</button>
|
<button type="button" class="btn btn-danger" @onclick="DeleteContact">Slet</button>
|
||||||
}
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6 text-end">
|
<div class="col-sm-6 text-end">
|
||||||
<button type="submit" class="btn btn-primary">Gem</button>
|
<button type="submit" class="btn btn-primary">Gem</button>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
{
|
{
|
||||||
"appInfo": {
|
"appInfo": {
|
||||||
"name": "Wonky Client",
|
"name": "Wonky Client",
|
||||||
"version": "0.45.1",
|
"version": "0.46.1",
|
||||||
"rc": true,
|
"rc": true,
|
||||||
"sandBox": false,
|
"sandBox": false,
|
||||||
"image": "grumpy-coder.png"
|
"image": "grumpy-coder.png"
|
||||||
},
|
},
|
||||||
"apiConfig": {
|
"apiConfig": {
|
||||||
"innoBaseUrl": "https://zeta.innotec.dk",
|
"innoBaseUrl": "https://dev.innotec.dk",
|
||||||
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
|
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
|
||||||
"glsId": "",
|
"glsId": "",
|
||||||
"serviceVirk": "api/v2/services/virk",
|
"serviceVirk": "api/v2/services/virk",
|
||||||
|
|
Loading…
Reference in a new issue