fix - customer phone number

This commit is contained in:
Frede Hundewadt 2023-05-02 12:29:26 +02:00
parent dc434e22f0
commit c3f39d1b94
16 changed files with 428 additions and 135 deletions

View file

@ -21,7 +21,7 @@
@if (Inventory.Any()) @if (Inventory.Any())
{ {
<div class="list-group mt-2"> <div class="list-group mt-2">
<div class="list-group-item"> <div class="list-group-item d-print-none">
<div class="row"> <div class="row">
<div class="col-sm-4" style="cursor: pointer;" @onclick="() => SortProducts(ProductSort.Desc)"><i class="bi-sort-alpha-down"></i> Navn <i class="bi-sort-alpha-up-alt"></i></div> <div class="col-sm-4" style="cursor: pointer;" @onclick="() => SortProducts(ProductSort.Desc)"><i class="bi-sort-alpha-down"></i> Navn <i class="bi-sort-alpha-up-alt"></i></div>
<div class="col-sm-3" style="cursor: pointer;" @onclick="() => SortProducts(ProductSort.Sku)"><i class="bi-sort-alpha-down"></i> Varenr <i class="bi-sort-alpha-up-alt"></i></div> <div class="col-sm-3" style="cursor: pointer;" @onclick="() => SortProducts(ProductSort.Sku)"><i class="bi-sort-alpha-down"></i> Varenr <i class="bi-sort-alpha-up-alt"></i></div>
@ -50,10 +50,10 @@
<div class="col-sm-2 text-center"> <div class="col-sm-2 text-center">
@product.Quantity @product.Quantity
</div> </div>
<div class="col-sm-2"> <div class="col-sm-2 d-print-none">
<a class="btn btn-info d-block" type="button" @onclick="() => CallShowReorderModal(product.Sku)"><i class="bi-cart"></i> Genbestil</a> <a class="btn btn-info d-block" type="button" @onclick="() => CallShowReorderModal(product.Sku)"><i class="bi-cart"></i> Genbestil</a>
</div> </div>
<div class="col-sm-1" @onclick="() => ProductCheck(product.Sku)"> <div class="col-sm-1 d-print-none" @onclick="() => ProductCheck(product.Sku)">
<input type="checkbox" class="btn-check" id="btn-@product.Sku.Replace(",", "")" autocomplete="off"/> <input type="checkbox" class="btn-check" id="btn-@product.Sku.Replace(",", "")" autocomplete="off"/>
@if (product.Check) @if (product.Check)
{ {

View file

@ -37,7 +37,9 @@ public partial class CustomerInventoryListComponent
{ {
if(Inventory.Any()) if(Inventory.Any())
Inventory = Inventory.OrderBy(x => x.Description).ToList(); Inventory = Inventory.OrderBy(x => x.Description).ToList();
} }
private void SortProducts(ProductSort column) private void SortProducts(ProductSort column)
{ {
Descending = !Descending; Descending = !Descending;
@ -78,12 +80,14 @@ public partial class CustomerInventoryListComponent
} }
} }
private async Task CallShowReorderModal(string sku) private async Task CallShowReorderModal(string sku)
{ {
await ProductCheck(sku); await ProductCheck(sku);
await OnReorderSelected.InvokeAsync(sku); await OnReorderSelected.InvokeAsync(sku);
} }
private async Task ProductCheck(string sku) private async Task ProductCheck(string sku)
{ {
var x = Inventory.First(x => x.Sku == sku); var x = Inventory.First(x => x.Sku == sku);

View file

@ -62,20 +62,31 @@ public partial class OfficeCountryCustomerListComponent
private async Task ShowInvoiceList(string companyId) private async Task ShowInvoiceList(string companyId)
{ {
// check for console manipulation // check for console manipulation
if (!Utils.Validate(ValidateType.Id, companyId)) return; if (!Utils.Validate(ValidateType.Id, companyId))
{
return;
}
SelectedCompany = CompanyList.First(x => x.CompanyId == companyId); SelectedCompany = CompanyList.First(x => x.CompanyId == companyId);
// call erp to crm sync before requesting invoices // call erp to crm sync before requesting invoices
var newSyncDate = await HistoryRepo.RequestErpToCrmSync(CountryCode, companyId, SelectedCompany.HistorySync); var newSyncDate = await HistoryRepo.RequestErpToCrmSync(CountryCode, companyId, SelectedCompany.HistorySync);
await Task.Delay(500); await Task.Delay(500);
InvoiceList = await HistoryRepo.GetInvoiceList(CountryCode, companyId); InvoiceList = await HistoryRepo.GetInvoiceList(CountryCode, companyId);
if(!string.IsNullOrWhiteSpace(newSyncDate)) SelectedCompany.HistorySync = newSyncDate; if (!string.IsNullOrWhiteSpace(newSyncDate))
{
SelectedCompany.HistorySync = newSyncDate;
}
InvoiceListOverlay.Show(); InvoiceListOverlay.Show();
} }
private async Task ShowActivityList(string companyId) private async Task ShowActivityList(string companyId)
{ {
// check for console manipulation // check for console manipulation
if (!Utils.Validate(ValidateType.Id, companyId)) return; if (!Utils.Validate(ValidateType.Id, companyId))
{
return;
}
SelectedCompany = CompanyList.First(x => x.CompanyId == companyId); SelectedCompany = CompanyList.First(x => x.CompanyId == companyId);
ActivityList = await CustomerActivityRepo.GetActivityList(companyId); ActivityList = await CustomerActivityRepo.GetActivityList(companyId);
ActivityListOverlay.Show(); ActivityListOverlay.Show();
@ -84,20 +95,29 @@ public partial class OfficeCountryCustomerListComponent
private async Task ShowInventory(string companyId) private async Task ShowInventory(string companyId)
{ {
// check for console manipulation // check for console manipulation
if (!Utils.Validate(ValidateType.Id, companyId)) return; if (!Utils.Validate(ValidateType.Id, companyId))
{
return;
}
SelectedCompany = CompanyList.First(x => x.CompanyId == companyId); SelectedCompany = CompanyList.First(x => x.CompanyId == companyId);
// call erp to crm sync before requesting products // call erp to crm sync before requesting products
var newSyncDate = await HistoryRepo.RequestErpToCrmSync(CountryCode, companyId, SelectedCompany.HistorySync); var newSyncDate = await HistoryRepo.RequestErpToCrmSync(CountryCode, companyId, SelectedCompany.HistorySync);
await Task.Delay(500); await Task.Delay(500);
if(!string.IsNullOrWhiteSpace(newSyncDate)) SelectedCompany.HistorySync = newSyncDate; if (!string.IsNullOrWhiteSpace(newSyncDate))
{
SelectedCompany.HistorySync = newSyncDate;
}
ProductList = await HistoryRepo.GetInventory(SelectedCompany.CountryCode, SelectedCompany.CompanyId); ProductList = await HistoryRepo.GetInventory(SelectedCompany.CountryCode, SelectedCompany.CompanyId);
ProductListOverlay.Show(); ProductListOverlay.Show();
} }
private async Task ShowOrder(string companyId) private void ShowOrder(string companyId)
{ {
// check for console manipulation // check for console manipulation
if (!Utils.Validate(ValidateType.Id, companyId)) return; if (!Utils.Validate(ValidateType.Id, companyId))
{
return;
}
SelectedCompany = CompanyList.First(x => x.CompanyId == companyId); SelectedCompany = CompanyList.First(x => x.CompanyId == companyId);
} }
} }

View file

@ -51,7 +51,7 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository
} }
/// <summary> /// <summary>
/// Get a list of CRM customers (SalesRep) /// SalesRep => Get a list of CRM customers
/// </summary> /// </summary>
/// <param name="pagingParameters"></param> /// <param name="pagingParameters"></param>
/// <returns>A paged response defined by pagingParameters</returns> /// <returns>A paged response defined by pagingParameters</returns>
@ -90,17 +90,23 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository
} }
/// <summary> /// <summary>
/// Get CRM customer by Id (SalesRep) /// SalesRep => Get CRM customer by Id
/// </summary> /// </summary>
/// <param name="companyId"></param> /// <param name="companyId"></param>
/// <returns>A CRM Company entity</returns> /// <returns>A CRM Company entity</returns>
public async Task<CompanyDto> GetCompanyById(string companyId) public async Task<CompanyDto> GetCompanyById(string companyId)
{ {
return await _client.GetFromJsonAsync<CompanyDto>($"{_conf.CrmCustomers}/{companyId}", _options); var result = await _client.GetAsync($"{_conf.CrmCustomers}/{companyId}");
var content = await result.Content.ReadAsStringAsync();
if (!result.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
{
return new CompanyDto();
}
return JsonSerializer.Deserialize<CompanyDto>(content, _options) ?? new CompanyDto();
} }
/// <summary> /// <summary>
/// Create Customer (SalesRep) /// SalesRep => Create Customer
/// </summary> /// </summary>
/// <param name="company"></param> /// <param name="company"></param>
/// <returns>The Id of the entity</returns> /// <returns>The Id of the entity</returns>
@ -113,7 +119,7 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository
} }
/// <summary> /// <summary>
/// Delete the CRM customer (SalesRep) /// SalesRep => Delete the CRM customer
/// </summary> /// </summary>
/// <param name="companyId"></param> /// <param name="companyId"></param>
/// <returns>true/false to define success</returns> /// <returns>true/false to define success</returns>
@ -124,7 +130,7 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository
} }
/// <summary> /// <summary>
/// Update CRM customer properties (SalesRep) /// SalesRep => Update CRM customer properties
/// </summary> /// </summary>
/// <param name="companyId"></param> /// <param name="companyId"></param>
/// <param name="company"></param> /// <param name="company"></param>
@ -146,7 +152,7 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository
} }
/// <summary> /// <summary>
/// Update ERP customer properties (SalesRep) /// SalesRep => Update ERP customer properties
/// </summary> /// </summary>
/// <param name="companyId"></param> /// <param name="companyId"></param>
/// <param name="company"></param> /// <param name="company"></param>
@ -172,7 +178,7 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository
} }
/// <summary> /// <summary>
/// Update customer Vat Number (SalesRep) /// SalesRep => Update customer Vat Number
/// </summary> /// </summary>
/// <param name="companyId"></param> /// <param name="companyId"></param>
/// <param name="vatNumber"></param> /// <param name="vatNumber"></param>
@ -190,10 +196,4 @@ public class AdvisorCustomerRepository : IAdvisorCustomerRepository
return JsonSerializer.Deserialize<CompanyDto>(content) return JsonSerializer.Deserialize<CompanyDto>(content)
?? new CompanyDto { Name = "ERROR", VatNumber = vatNumber, CrmNotes = $"FEJL: {content}" }; ?? new CompanyDto { Name = "ERROR", VatNumber = vatNumber, CrmNotes = $"FEJL: {content}" };
} }
// public async Task<bool> ToggleVisibility(string companyId, bool hide)
// {
// var response = await _client.PostAsync($"{_conf.CrmCustomers}/{companyId}/toggle?hide={hide}", null);
// return response.IsSuccessStatusCode;
// }
} }

View file

@ -48,22 +48,50 @@ public class AdvisorWorkplaceRepository : IAdvisorWorkplaceRepository
public async Task<List<WorkplaceListView>> GetWorkplaces(string companyId) public async Task<List<WorkplaceListView>> GetWorkplaces(string companyId)
{ {
var result = await _client.GetFromJsonAsync<List<WorkplaceListView>>( var result = await _client.GetAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}", _options); $"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}");
return result ?? new List<WorkplaceListView>(); var content = await result.Content.ReadAsStringAsync();
if (!result.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
{
return new List<WorkplaceListView>();
}
return JsonSerializer.Deserialize<List<WorkplaceListView>>(content, _options) ?? new List<WorkplaceListView>();
} }
public async Task<WorkplaceDto> GetWorkplace(string companyId, string workplaceId) public async Task<WorkplaceDto> GetWorkplace(string companyId, string workplaceId)
{ {
var result = await _client.GetFromJsonAsync<WorkplaceDto>( var result = await _client.GetAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}", _options); $"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}");
return result ?? new WorkplaceDto(); var content = await result.Content.ReadAsStringAsync();
if (!result.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
{
return new WorkplaceDto();
}
return JsonSerializer.Deserialize<WorkplaceDto>(content, _options) ?? new WorkplaceDto();
} }
public async Task CreateWorkplace(string companyId, WorkplaceDto workplace) public async Task<WorkplaceInventory> GetWorkplaceInventory(string companyId, string workplaceId)
{ {
await _client.PostAsJsonAsync( var result = await _client.GetAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents");
var content = await result.Content.ReadAsStringAsync();
if (!result.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
{
return new WorkplaceInventory();
}
return JsonSerializer.Deserialize<WorkplaceInventory>(content, _options) ?? new WorkplaceInventory();
}
public async Task<string> CreateWorkplace(string companyId, WorkplaceDto workplace)
{
var result = await _client.PostAsJsonAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}", workplace, _options); $"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}", workplace, _options);
var content = await result.Content.ReadAsStringAsync();
// if (!result.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
// {
// return "";
// }
return content;
} }
public async Task UpdateWorkplace(string companyId, WorkplaceDto workplace) public async Task UpdateWorkplace(string companyId, WorkplaceDto workplace)
@ -77,11 +105,4 @@ public class AdvisorWorkplaceRepository : IAdvisorWorkplaceRepository
await _client.DeleteAsync( await _client.DeleteAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}"); $"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}");
} }
public async Task<WorkplaceInventory> GetWorkplaceInventory(string companyId, string workplaceId)
{
var result = await _client.GetFromJsonAsync<WorkplaceInventory>(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents");
return result ?? new WorkplaceInventory();
}
} }

View file

@ -44,7 +44,7 @@ public interface IAdvisorWorkplaceRepository
/// <param name="companyId"></param> /// <param name="companyId"></param>
/// <param name="workplace"></param> /// <param name="workplace"></param>
/// <returns></returns> /// <returns></returns>
Task CreateWorkplace(string companyId, WorkplaceDto workplace); Task<string> CreateWorkplace(string companyId, WorkplaceDto workplace);
/// <summary> /// <summary>
/// Update workplace given the customer id and updated data /// Update workplace given the customer id and updated data

View file

@ -74,7 +74,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
private UserManagerEditView SalesRep { get; set; } = new(); private UserManagerEditView SalesRep { get; set; } = new();
private DateTime SelectedDate { get; set; } private DateTime SelectedDate { get; set; }
private string OldPhone { get; set; } = ""; // private string OldPhone { get; set; } = "";
private string PromptDateConfirm { get; set; } = ""; private string PromptDateConfirm { get; set; } = "";
private string ButtonText { get; set; } = "Gem besøg"; private string ButtonText { get; set; } = "Gem besøg";
private bool OrgWarning { get; set; } private bool OrgWarning { get; set; }
@ -127,19 +127,23 @@ public partial class AdvisorActivityCreatePage : IDisposable
else else
{ {
if (Company.HasFolded == 1) if (Company.HasFolded == 1)
{
// Company has shut down // Company has shut down
Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt."; Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt.";
}
// variable to validate if customer needs phone number update //
OldPhone = Company.Phone; if (Company.CountryCode.ToLower() == "dk"
if (string.IsNullOrWhiteSpace(Company.Phone) && string.IsNullOrWhiteSpace(Company.Phone)
&& !string.IsNullOrWhiteSpace(Company.Account) && !string.IsNullOrWhiteSpace(Company.Account)
&& Company.Account != "NY" && Company.Account.Length > 7) && !Company.Account.StartsWith("NY")
&& Company.Account.Length > 7)
{ {
Company.Phone = Company.Account[..8]; Company.Phone = Company.Account[..8];
} }
Activity.ActivityStatusEnum = "noSale"; Activity.ActivityStatusEnum = "noSale";
Activity.ActivityVisitEnum = Company.Account is "" or "NY" ? "new" : "recall"; Activity.ActivityVisitEnum = string.IsNullOrWhiteSpace(Company.Account)
|| Company.Account.StartsWith("NY")
? "new" : "recall";
} }
// Populate base activity information // Populate base activity information
@ -185,14 +189,17 @@ public partial class AdvisorActivityCreatePage : IDisposable
if (DraftProvider.Draft.DraftType == "order") if (DraftProvider.Draft.DraftType == "order")
{ {
// set dropdown selection accordingly // set dropdown selection accordingly
if(Activity.ActivityTypeEnum != "phone") if (Activity.ActivityTypeEnum != "phone")
{
Activity.ActivityTypeEnum = "onSite"; Activity.ActivityTypeEnum = "onSite";
}
Activity.ActivityStatusEnum = "order"; Activity.ActivityStatusEnum = "order";
PoFormInvalid = false; PoFormInvalid = false;
} }
Working = false; Working = false;
StateHasChanged();
} }
@ -307,7 +314,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
{ {
// get selected item // get selected item
if (string.IsNullOrWhiteSpace(sku.ItemId)) if (string.IsNullOrWhiteSpace(sku.ItemId))
{
return; return;
}
SelectedItem = await CatalogRepo.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId); SelectedItem = await CatalogRepo.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId);
ShowItem = true; ShowItem = true;
Price = sku.Rate; Price = sku.Rate;
@ -319,7 +328,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
private void PriceHistoryCallback(decimal price) private void PriceHistoryCallback(decimal price)
{ {
if (price == 0) if (price == 0)
{
return; return;
}
Price = price.ToString("N2", CultureInfo.InvariantCulture); Price = price.ToString("N2", CultureInfo.InvariantCulture);
StateHasChanged(); StateHasChanged();
} }
@ -369,14 +380,18 @@ public partial class AdvisorActivityCreatePage : IDisposable
private async Task<InvoiceListView> FetchCompanyInvoices() private async Task<InvoiceListView> FetchCompanyInvoices()
{ {
// no need to do for kanvas entry // no need to do for kanvas entry
if (Kanvas) return new InvoiceListView(); if (Kanvas)
{
return new InvoiceListView();
}
// fetch from storage // fetch from storage
var storage = await Storage.GetItemAsStringAsync($"{CompanyId}-invoices"); var storage = await Storage.GetItemAsStringAsync($"{CompanyId}-invoices");
await Task.Delay(500); await Task.Delay(250);
var iDate = await Storage.GetItemAsStringAsync($"{CompanyId}-iDate"); var iDate = await Storage.GetItemAsStringAsync($"{CompanyId}-iDate");
// if we have a list and iDate was today return the list // if we have a list and iDate was today return the list
if (!string.IsNullOrWhiteSpace(storage) && (!string.IsNullOrWhiteSpace(iDate) && if (!string.IsNullOrWhiteSpace(storage)
DateTime.Parse(iDate.Replace("\"", "")) >= DateTime.Now)) && !string.IsNullOrWhiteSpace(iDate)
&& DateTime.Parse(iDate.Replace("\"", "")) >= DateTime.Now)
{ {
Logger.LogDebug("fetching invoices from storage"); Logger.LogDebug("fetching invoices from storage");
Logger.LogDebug("storage contains <= {}", storage); Logger.LogDebug("storage contains <= {}", storage);
@ -401,7 +416,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
{ {
// avoid duplication // avoid duplication
if (Working) if (Working)
{
return; return;
}
Logger.LogDebug("view kanvas activity => {}", JsonSerializer.Serialize(Activity)); Logger.LogDebug("view kanvas activity => {}", JsonSerializer.Serialize(Activity));
switch (Kanvas) switch (Kanvas)
@ -427,7 +444,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Toaster.ShowError("Ved bestilling skal der være en eller flere linjer i kladden."); Toaster.ShowError("Ved bestilling skal der være en eller flere linjer i kladden.");
return; return;
// phone number is required if first time customer // phone number is required if first time customer
case "order" when Company.Account is "NY" or "" && string.IsNullOrWhiteSpace(Activity.Phone): case "order" when Company.Account.StartsWith("NY") || Company.Account.StartsWith("KANVAS") || string.IsNullOrWhiteSpace(Company.Account) && string.IsNullOrWhiteSpace(Activity.Phone):
Toaster.ShowError("Ved bestilling til ny kunde skal telefon nummer angives."); Toaster.ShowError("Ved bestilling til ny kunde skal telefon nummer angives.");
return; return;
// verify email address is a valid address // verify email address is a valid address
@ -435,21 +452,11 @@ public partial class AdvisorActivityCreatePage : IDisposable
Toaster.ShowError("Ved tilbud skal en gyldig email adresse angives."); Toaster.ShowError("Ved tilbud skal en gyldig email adresse angives.");
return; return;
} }
// raise working flag // raise working flag
Working = true; Working = true;
// reset selected item // reset selected item
SelectedItem = new SalesItemView();
// check if phone number need to be updated
if (!Kanvas && OldPhone != Activity.Phone)
{
Company.Phone = Activity.Phone;
Activity.OrderMessage = $"BEMÆRK: {Activity.Phone}\n{Activity.OrderMessage}";
await CompanyRepo.UpdateErpData(Company.CompanyId, Company);
}
// begin assembling activity // begin assembling activity
SelectedItem = new SalesItemView();
// activity date // activity date
Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}"; Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}";
// activity type // activity type
@ -461,7 +468,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
}; };
// if express add 'E' to ourRef // if express add 'E' to ourRef
if (Activity.Express) if (Activity.Express)
{
Activity.OurRef = $"E{Activity.OurRef}"; Activity.OurRef = $"E{Activity.OurRef}";
}
// begin lines // begin lines
Activity.Lines = new List<ActivityLineDto>(); Activity.Lines = new List<ActivityLineDto>();
var ln = 0; var ln = 0;
@ -507,11 +516,18 @@ public partial class AdvisorActivityCreatePage : IDisposable
private void ShowOrgWarning() private void ShowOrgWarning()
{ {
if (Kanvas) return; if (Kanvas)
if (OrgWarning) return; {
return;
}
if (OrgWarning)
{
return;
}
OrgWarning = true; OrgWarning = true;
if (Company.CountryCode.ToLower() == "se" && Utils.StringToDigits(Activity.VatNumber).Length < 10 && if (Company.CountryCode.ToLower() == "se"
Activity.ActivityStatusEnum == "order") && Utils.StringToDigits(Activity.VatNumber).Length < 10
&& Activity.ActivityStatusEnum == "order")
{ {
Toaster.ShowWarning("Org nummer er ufuldstændig. Skal opdateres før bestilling kan sendes. "); Toaster.ShowWarning("Org nummer er ufuldstændig. Skal opdateres før bestilling kan sendes. ");
} }
@ -547,7 +563,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
// add it to the cart // add it to the cart
DraftProvider.Draft.Items.Add(item); DraftProvider.Draft.Items.Add(item);
if (Activity.ActivityStatusEnum != "quote") if (Activity.ActivityStatusEnum != "quote")
{
Activity.ActivityStatusEnum = "order"; Activity.ActivityStatusEnum = "order";
}
// save the item using the CartStateProvider's save method // save the item using the CartStateProvider's save method
await DraftProvider.SaveChangesAsync(); await DraftProvider.SaveChangesAsync();
} }
@ -560,7 +578,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
// save the remaining draft // save the remaining draft
await DraftProvider.SaveChangesAsync(); await DraftProvider.SaveChangesAsync();
if (!DraftProvider.Draft.Items.Any()) if (!DraftProvider.Draft.Items.Any())
{
Activity.ActivityStatusEnum = "noSale"; Activity.ActivityStatusEnum = "noSale";
}
} }
@ -581,15 +601,19 @@ public partial class AdvisorActivityCreatePage : IDisposable
{ {
"nosale" => "Gem Besøg", "nosale" => "Gem Besøg",
"order" => "Send Bestilling", "order" => "Send Bestilling",
"quote" => "Send Tilbud" "quote" => "Send Tilbud",
_ => throw new ArgumentOutOfRangeException()
}; };
// InvalidCanvas = InvalidActivityType; // InvalidCanvas = InvalidActivityType;
InvalidActivity = InvalidActivityType InvalidActivity = InvalidActivityType
|| PoFormInvalid || PoFormInvalid
|| DraftProvider.Draft.Items.Count == 0 || DraftProvider.Draft.Items.Count == 0
|| (Activity.ActivityStatusEnum == "offer" && string.IsNullOrWhiteSpace(Activity.Email)); || (Activity.ActivityStatusEnum == "offer"
if (Activity.YourRef.Length > 35 || Activity.ReferenceNumber.Length > 20 || InvalidActivity) && string.IsNullOrWhiteSpace(Activity.Email));
if (Activity.YourRef.Length > 35
|| Activity.ReferenceNumber.Length > 20
|| InvalidActivity)
{ {
PoFormInvalid = true; PoFormInvalid = true;
return; return;

View file

@ -24,10 +24,10 @@
<div class="col-sm-6"> <div class="col-sm-6">
<h4 class="pt-1">@Company.Name</h4> <h4 class="pt-1">@Company.Name</h4>
</div> </div>
<div class="col-sm-3 align-content-end"> <div class="col-sm-3 align-content-end d-print-none">
<a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId"><i class="bi-arrow-right"></i> Kundekort</a> <a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId"><i class="bi-arrow-right"></i> Kundekort</a>
</div> </div>
<div class="col-sm-3 align-content-end"> <div class="col-sm-3 align-content-end d-print-none">
<a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId/activities/new"><i class="bi-arrow-right"></i> Nyt Besøg</a> <a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId/activities/new"><i class="bi-arrow-right"></i> Nyt Besøg</a>
</div> </div>
</div> </div>

View file

@ -309,15 +309,13 @@
<div class="col-sm-3 d-grid"> <div class="col-sm-3 d-grid">
<button type="button" class="btn btn-danger" @onclick="ToggleVisibility">@ToggleButtonText</button> <button type="button" class="btn btn-danger" @onclick="ToggleVisibility">@ToggleButtonText</button>
</div> </div>
</div> <div class="col text-end">
@if (AppInfo.Value.Rc) @if (AppInfo.Value.Rc)
{ {
<div class="row mt-5"> <a class="btn btn-info" href="@($"/advisor/customers/{CompanyId}/workplaces")">Kemi Dokumentationr</a>
<div class="col-sm-3"> }
<a class="btn btn-info" href="@($"/advisor/customers/{CompanyId}/workplaces")">Arbejdssteder</a>
</div>
</div> </div>
} </div>
} }
</EditForm> </EditForm>
} }

View file

@ -18,7 +18,8 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@attribute [Authorize(Roles = "Advisor")] @attribute [Authorize(Roles = "Advisor")]
@page "/advisor/customers/{CompanyId}/workplaces" @page "/advisor/customers/{CompanyId}/workplaces"
<PageTitle>@Company.Name arbejdssteder</PageTitle>
<PageTitle>Arbejdssteder - @Company.Name</PageTitle>
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<div class="row"> <div class="row">
@ -26,7 +27,7 @@
<h2>@Company.Name</h2> <h2>@Company.Name</h2>
</div> </div>
<div class="col-sm-2"> <div class="col-sm-2">
<div class="btn btn-primary"><i class="bi-plus-lg"></i> NY</div> <a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces/new"><i class="bi-plus-lg"></i> NY</a>
</div> </div>
<div class="col-sm-2"> <div class="col-sm-2">

View file

@ -19,35 +19,47 @@ using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository; using Wonky.Client.HttpRepository;
using Wonky.Entity.DTO; using Wonky.Entity.DTO;
using Wonky.Entity.Views; using Wonky.Entity.Views;
#pragma warning disable CS8618 #pragma warning disable CS8618
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class AdvisorCustomerWorkplaceListPage : IDisposable public partial class AdvisorCustomerWorkplaceListPage : IDisposable
{ {
[Parameter] public string CompanyId { get; set; } = ""; // ###############################################################
[Inject] public IAdvisorWorkplaceRepository WorkplaceRepo { get; set; } [Inject] public IAdvisorWorkplaceRepository WorkplaceRepo { get; set; }
[Inject] public IAdvisorCustomerRepository CustomerRepo { get; set; } [Inject] public IAdvisorCustomerRepository CustomerRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
// ###############################################################
[Parameter] public string CompanyId { get; set; } = "";
// ###############################################################
private List<WorkplaceListView> Workplaces { get; set; } = new(); private List<WorkplaceListView> Workplaces { get; set; } = new();
private CompanyDto Company { get; set; } = new(); private CompanyDto Company { get; set; } = new();
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Company = await CustomerRepo.GetCompanyById(CompanyId);
Working = false;
}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
Working = true; Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Company = await CustomerRepo.GetCompanyById(CompanyId);
await Task.Delay(150);
Workplaces = await WorkplaceRepo.GetWorkplaces(CompanyId); Workplaces = await WorkplaceRepo.GetWorkplaces(CompanyId);
Working = false; Working = false;
} }
private async Task<List<WorkplaceListView>> GetWorkplaces()
{
return await WorkplaceRepo.GetWorkplaces(CompanyId);
}
public void Dispose() public void Dispose()
{ {
Interceptor.DisposeEvent(); Interceptor.DisposeEvent();

View file

@ -0,0 +1,114 @@
@* Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
*@
@attribute [Authorize(Roles = "Advisor")]
@page "/advisor/customers/{CompanyId}/workplaces/new"
@using Microsoft.AspNetCore.Authorization
<PageTitle>Opret arbejdssted - @Company.Name</PageTitle>
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-sm-10">
<h2>Opret arbejdssted for @Company.Name</h2>
</div>
<div class="col-sm-2">
</div>
</div>
</div>
<div class="card-body">
<EditForm EditContext="FormContext" OnValidSubmit="SubmitWorkplace">
<DataAnnotationsValidator/>
<table class="table">
<thead>
<tr>
<th class="align-middle" colspan="4">
<h3>Stamdata</h3>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="align-middle">Navn</td>
<td class="align-middle">
<InputText id="name" class="form-control" placeholder="plade, auto, klargøring, lab" @bind-Value="Workplace.Name"></InputText>
<ValidationMessage For="@(() => Workplace.Name)"></ValidationMessage>
</td>
<td class="align-middle">Beskrivelse</td>
<td class="align-middle">
<InputText id="description" class="form-control" placeholder="kort beskrivelse" @bind-Value="Workplace.Description"></InputText>
<ValidationMessage For="@(() => Workplace.Description)"></ValidationMessage>
</td>
</tr>
<tr>
<th class="align-middle" colspan="4">
<h3>Placering og Opbevaring</h3>
</th>
</tr>
<tr>
<td class="align-middle">Produkter</td>
<td class="align-middle">
<InputText id="productStorage" class="form-control" placeholder="produkt opbevaring" @bind-Value="Workplace.ProductStorage"></InputText>
<ValidationMessage For="@(() => Workplace.ProductStorage)"></ValidationMessage>
</td>
<td class="align-middle">Øjenskylleflaske</td>
<td class="align-middle">
<InputText id="eyeCleanerLocation" class="form-control" placeholder="placering af øjenskyller" @bind-Value="Workplace.EyeCleanerLocation"></InputText>
<ValidationMessage For="@(() => Workplace.EyeCleanerLocation)"></ValidationMessage>
</td>
</tr>
<tr>
<td class="align-middle">Masker</td>
<td class="align-middle">
<InputText id="maskStorage" class="form-control" placeholder="maske opbevaring" @bind-Value="Workplace.MaskStorage"></InputText>
<ValidationMessage For="@(() => Workplace.MaskStorage)"></ValidationMessage>
</td>
<td class="align-middle">Førstehjælp</td>
<td class="align-middle">
<InputText id="firstAidStorage" class="form-control" placeholder="placering af førstehjælpskasse" @bind-Value="Workplace.FirstAidStorage"></InputText>
<ValidationMessage For="@(() => Workplace.FirstAidStorage)"></ValidationMessage>
</td>
</tr>
<tr>
<td class="align-middle">Handsker</td>
<td class="align-middle">
<InputText id="glovesStorage" class="form-control" placeholder="placering af handsker" @bind-Value="Workplace.GlovesStorage"></InputText>
<ValidationMessage For="@(() => Workplace.GlovesStorage)"></ValidationMessage>
</td>
<td class="align-middle" colspan="2"></td>
</tr>
<tr>
<td class="align-middle">Sikkerhedsbriller</td>
<td class="align-middle">
<InputText id="gogglesStorage" class="form-control" placeholder="opbevaring beskyttelses briller" @bind-Value="Workplace.GogglesStorage"></InputText>
<ValidationMessage For="@(() => Workplace.GogglesStorage)"></ValidationMessage>
</td>
<td class="align-middle">Affald</td>
<td class="align-middle">
<InputText id="wasteDeposit" class="form-control" placeholder="deponering af affald og spild" @bind-Value="Workplace.WasteDeposit"></InputText>
<ValidationMessage For="@(() => Workplace.WasteDeposit)"></ValidationMessage>
</td>
</tr>
</tbody>
</table>
<div class="row mb-2">
<div class="col text-end">
<button type="submit" class="btn btn-success" disabled="@FormInvalid">Gem</button>
</div>
</div>
</EditForm>
</div>
</div>

View file

@ -0,0 +1,107 @@
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using System.Text.Json;
using Blazored.Toast.Services;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Entity.DTO;
namespace Wonky.Client.Pages;
#pragma warning disable CS8618
public partial class AdvisorCustomerWorkplaceNew : IDisposable
{
// ###############################################################
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IAdvisorCustomerRepository CustomerRepo { get; set; }
[Inject] public IAdvisorWorkplaceRepository WorkplaceRepo { get; set; }
[Inject] public IToastService Toaster { get; set; }
[Inject] public ILogger<AdvisorCustomerWorkplaceNew> Logger { get; set; }
// ###############################################################
[Parameter] public string CompanyId { get; set; } = "";
// ###############################################################
private WorkplaceDto Workplace { get; set; } = new();
private EditContext FormContext { get; set; }
private CompanyDto Company { get; set; } = new();
private bool FormInvalid { get; set; } = true;
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
FormContext = new EditContext(Workplace);
FormContext.OnFieldChanged += HandleFieldChanged!;
FormContext.OnValidationStateChanged += ValidationChanged!;
// get company
Company = await GetCompany(CompanyId);
while (string.IsNullOrWhiteSpace(Company.CompanyId))
{
await Task.Delay(150);
}
Working = false;
}
private async Task<CompanyDto> GetCompany(string companyId)
{
return await CustomerRepo.GetCompanyById(companyId);
}
private async Task SubmitWorkplace()
{
Logger.LogDebug("CompanyId {}", JsonSerializer.Serialize(Workplace));
Logger.LogDebug("Workplace {}", JsonSerializer.Serialize(Workplace, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
var result = await WorkplaceRepo.CreateWorkplace(CompanyId, Workplace);
Logger.LogDebug("HTTP result {}", result);
}
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
{
FormInvalid = !FormContext.Validate();
StateHasChanged();
}
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
{
FormInvalid = false;
FormContext.OnFieldChanged -= HandleFieldChanged!;
FormContext.OnValidationStateChanged -= ValidationChanged!;
FormContext = new EditContext(Workplace);
FormContext.OnFieldChanged += HandleFieldChanged!;
FormContext.OnValidationStateChanged += ValidationChanged!;
}
public void Dispose()
{
Interceptor.DisposeEvent();
FormContext.OnFieldChanged -= HandleFieldChanged!;
FormContext.OnValidationStateChanged -= ValidationChanged!;
}
}

View file

@ -28,84 +28,81 @@
<div class="card-body"> <div class="card-body">
<EditForm EditContext="WorkplaceContext" OnValidSubmit="SubmitUpdate"> <EditForm EditContext="WorkplaceContext" OnValidSubmit="SubmitUpdate">
<DataAnnotationsValidator/>
<table class="table"> <table class="table">
<thead> <thead>
<tr>
<th colspan="4">
Stamdata
</th>
</tr>
</thead> </thead>
<tbody> <tbody>
<tr>
<td class="align-middle" colspan="4">
<h3>Stamdata</h3>
</td>
</tr>
<tr> <tr>
<td class="align-middle">Navn</td> <td class="align-middle">Navn</td>
<td class="align-middle"> <td class="align-middle">
<InputText id="name" class="form-control" @bind-Value="Workplace.Name"/> <InputText id="name" class="form-control" placeholder="plade, auto, klargøring, lab" @bind-Value="Workplace.Name"></InputText>
<ValidationMessage For="@(() => Workplace.Name)"></ValidationMessage> <ValidationMessage For="@(() => Workplace.Name)"></ValidationMessage>
</td> </td>
<td class="align-middle">Beskrivelse</td> <td class="align-middle">Beskrivelse</td>
<td class="align-middle"> <td class="align-middle">
<InputText id="description" class="form-control" @bind-Value="Workplace.Description"/> <InputText id="description" class="form-control" placeholder="kort beskrivelse" @bind-Value="Workplace.Description"></InputText>
<ValidationMessage For="@(() => Workplace.Description)"></ValidationMessage> <ValidationMessage For="@(() => Workplace.Description)"></ValidationMessage>
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="align-middle text-center" colspan="4">Placering og Opbevaring</th> <td class="align-middle" colspan="4">
<h3>Placering og Opbevaring</h3>
</td>
</tr> </tr>
<tr> <tr>
<td class="align-middle">Produkter</td> <td class="align-middle">Produkter</td>
<td class="align-middle"> <td class="align-middle">
<InputText id="productStorage" class="form-control" @bind-Value="Workplace.ProductStorage"/> <InputText id="productStorage" class="form-control" placeholder="produkt opbevaring" @bind-Value="Workplace.ProductStorage"></InputText>
<ValidationMessage For="@(() => Workplace.ProductStorage)"></ValidationMessage> <ValidationMessage For="@(() => Workplace.ProductStorage)"></ValidationMessage>
</td> </td>
<td class="align-middle" colspan="2"></td> <td class="align-middle">Øjenskylleflaske</td>
<td class="align-middle">
<InputText id="eyeCleanerLocation" class="form-control" placeholder="placering af øjenskyller" @bind-Value="Workplace.EyeCleanerLocation"></InputText>
<ValidationMessage For="@(() => Workplace.EyeCleanerLocation)"></ValidationMessage>
</td>
</tr> </tr>
<tr> <tr>
<td class="align-middle">Masker</td> <td class="align-middle">Masker</td>
<td class="align-middle"> <td class="align-middle">
<InputText id="maskStorage" class="form-control" @bind-Value="Workplace.MaskStorage"/> <InputText id="maskStorage" class="form-control" placeholder="maske opbevaring" @bind-Value="Workplace.MaskStorage"></InputText>
<ValidationMessage For="@(() => Workplace.MaskStorage)"></ValidationMessage> <ValidationMessage For="@(() => Workplace.MaskStorage)"></ValidationMessage>
</td> </td>
<td class="align-middle">Øjenskylleflaske</td> <td class="align-middle">Førstehjælp</td>
<td class="align-middle"> <td class="align-middle">
<InputText id="eyeCleanerLocation" class="form-control" @bind-Value="Workplace.EyeCleanerLocation"/> <InputText id="firstAidStorage" class="form-control" placeholder="placering af førstehjælpskasse" @bind-Value="Workplace.FirstAidStorage"></InputText>
<ValidationMessage For="@(() => Workplace.EyeCleanerLocation)"></ValidationMessage> <ValidationMessage For="@(() => Workplace.FirstAidStorage)"></ValidationMessage>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="align-middle">Handsker</td> <td class="align-middle">Handsker</td>
<td class="align-middle"> <td class="align-middle">
<InputText id="glovesStorage" class="form-control" @bind-Value="Workplace.GlovesStorage"/> <InputText id="glovesStorage" class="form-control" placeholder="placering af handsker" @bind-Value="Workplace.GlovesStorage"></InputText>
<ValidationMessage For="@(() => Workplace.GlovesStorage)"></ValidationMessage> <ValidationMessage For="@(() => Workplace.GlovesStorage)"></ValidationMessage>
</td> </td>
<td class="align-middle">Førstehjælp</td> <td class="align-middle" colspan="2"></td>
<td class="align-middle">
<InputText id="firstAidStorage" class="form-control" @bind-Value="Workplace.FirstAidStorage"/>
<ValidationMessage For="@(() => Workplace.FirstAidStorage)"></ValidationMessage>
</td>
</tr> </tr>
<tr> <tr>
<td class="align-middle">Sikkerhedsbriller</td> <td class="align-middle">Sikkerhedsbriller</td>
<td class="align-middle"> <td class="align-middle">
<InputText id="gogglesStorage" class="form-control" @bind-Value="Workplace.GogglesStorage"/> <InputText id="gogglesStorage" class="form-control" placeholder="opbevaring beskyttelses briller" @bind-Value="Workplace.GogglesStorage"></InputText>
<ValidationMessage For="@(() => Workplace.GogglesStorage)"></ValidationMessage> <ValidationMessage For="@(() => Workplace.GogglesStorage)"></ValidationMessage>
</td> </td>
<td class="align-middle" colspan="2"></td>
</tr>
<tr>
<td class="align-middle">Affald</td> <td class="align-middle">Affald</td>
<td class="align-middle"> <td class="align-middle">
<InputText id="wasteDeposit" class="form-control" @bind-Value="Workplace.WasteDeposit"/> <InputText id="wasteDeposit" class="form-control" placeholder="deponering af affald og spild" @bind-Value="Workplace.WasteDeposit"></InputText>
<ValidationMessage For="@(() => Workplace.WasteDeposit)"></ValidationMessage> <ValidationMessage For="@(() => Workplace.WasteDeposit)"></ValidationMessage>
</td> </td>
<td class="align-middle" colspan="2"></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="row mb-2"> <div class="row mb-2">
<div class="col-md-4"> <div class="col-md-4">
<button type="button" class="btn btn-danger" disabled @onclick="DeleteWorkplace">Slet</button> <button type="button" class="btn btn-danger" onclick="@DeleteWorkplace">Slet</button>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<button type="submit" class="btn btn-success">Gem</button> <button type="submit" class="btn btn-success">Gem</button>

View file

@ -94,8 +94,9 @@ public partial class SupervisorDocumentNewPage : IDisposable
else else
{ {
Toaster.ShowSuccess("Ok"); Toaster.ShowSuccess("Ok");
Navigator.NavigateTo("/supervisor/advisors/{AdvisorId}/documents/{x.DocumentId}"); Navigator.NavigateTo($"/supervisor/advisors/{AdvisorId}/documents/{x.DocumentId}");
} }
Toaster.ClearAll();
} }
private void HandleFieldChanged(object sender, FieldChangedEventArgs e) private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
@ -107,11 +108,7 @@ public partial class SupervisorDocumentNewPage : IDisposable
StateHasChanged(); StateHasChanged();
} }
/// <summary>
/// Validation change event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e) private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
{ {
FormInvalid = false; FormInvalid = false;
@ -121,14 +118,12 @@ public partial class SupervisorDocumentNewPage : IDisposable
FormContext.OnFieldChanged += HandleFieldChanged!; FormContext.OnFieldChanged += HandleFieldChanged!;
FormContext.OnValidationStateChanged += ValidationChanged!; FormContext.OnValidationStateChanged += ValidationChanged!;
} }
public void Dispose() public void Dispose()
{ {
Interceptor.DisposeEvent(); Interceptor.DisposeEvent();
FormContext.OnFieldChanged -= HandleFieldChanged!; FormContext.OnFieldChanged -= HandleFieldChanged!;
FormContext.OnValidationStateChanged -= ValidationChanged!; FormContext.OnValidationStateChanged -= ValidationChanged!;
} }
} }

View file

@ -1,8 +1,8 @@
{ {
"appInfo": { "appInfo": {
"name": "Wonky Online", "name": "Wonky Online",
"version": "138.5", "version": "139.0",
"rc": false, "rc": true,
"sandBox": false, "sandBox": false,
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
}, },
@ -19,7 +19,7 @@
} }
}, },
"apiConfig": { "apiConfig": {
"baseUrl": "https://zeta.innotec.dk", "baseUrl": "https://dev.innotec.dk",
"catalog": "api/v2/catalog/country", "catalog": "api/v2/catalog/country",
"crmCustomers": "api/v2/crm/companies", "crmCustomers": "api/v2/crm/companies",
"crmInventoryExt": "history/inventory", "crmInventoryExt": "history/inventory",