diff --git a/Wonky.Client/HttpRepository/CountryActivityRepository.cs b/Wonky.Client/HttpRepository/CountryActivityRepository.cs index 17dfd589..933ffce9 100644 --- a/Wonky.Client/HttpRepository/CountryActivityRepository.cs +++ b/Wonky.Client/HttpRepository/CountryActivityRepository.cs @@ -54,7 +54,7 @@ public class CountryActivityRepository : ICountryActivityRepository /// /// /// - public async Task GetActivity(string activityId) + public async Task RequestActivity(string activityId) { var activity = await _client .GetFromJsonAsync($"{_api.CrmActivities}/{activityId}"); @@ -76,4 +76,13 @@ public class CountryActivityRepository : ICountryActivityRepository ? new List() : JsonSerializer.Deserialize>(content, _options); } + + public async Task CreatePhoneOrder(string customerId, ActivityDto activity) + { + var response = await _client.PostAsJsonAsync($"{_api.OfficeCustomers}/{activity.CountryCode}/id/{customerId}/activities", activity); + var content = await response.Content.ReadAsStringAsync(); + return string.IsNullOrWhiteSpace(content) + ? new ApiResponseView { Code = 0, Id = "", IsSuccess = false, Message = "Ukendt fejl er opstået." } + : JsonSerializer.Deserialize(content, _options); + } } \ No newline at end of file diff --git a/Wonky.Client/HttpRepository/ICountryActivityRepository.cs b/Wonky.Client/HttpRepository/ICountryActivityRepository.cs index e0b24e71..1f7401a2 100644 --- a/Wonky.Client/HttpRepository/ICountryActivityRepository.cs +++ b/Wonky.Client/HttpRepository/ICountryActivityRepository.cs @@ -29,7 +29,7 @@ public interface ICountryActivityRepository /// /// /// - Task GetActivity(string activityId); + Task RequestActivity(string activityId); /// /// Get activities for customer Id @@ -37,4 +37,6 @@ public interface ICountryActivityRepository /// /// Task> RequestActivityList(string customerId); + + Task CreatePhoneOrder(string customerId, ActivityDto activity); } \ No newline at end of file diff --git a/Wonky.Client/Pages/OfficeOrderCreatePage.razor.cs b/Wonky.Client/Pages/OfficeOrderCreatePage.razor.cs index c5af48eb..64735614 100644 --- a/Wonky.Client/Pages/OfficeOrderCreatePage.razor.cs +++ b/Wonky.Client/Pages/OfficeOrderCreatePage.razor.cs @@ -16,13 +16,16 @@ using System.Globalization; using System.Text.Json; +using Blazored.Toast.Services; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Forms; +using Wonky.Client.Helpers; using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpRepository; using Wonky.Client.Models; using Wonky.Client.OverlayOffice; using Wonky.Client.OverlayOrderCreate; +using Wonky.Client.Services; using Wonky.Client.Shared; using Wonky.Entity.DTO; using Wonky.Entity.Views; @@ -35,12 +38,15 @@ public partial class OfficeOrderCreatePage : IDisposable // -------------------------------------------------------------------- // injected services [Inject] public ILogger Logger { get; set; } + [Inject] public IToastService Toaster { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public ICountryCatalogRepository Catalog { get; set; } [Inject] public ICountryCustomerRepository CustomerRepo { get; set; } [Inject] public ICountryCustomerHistoryRepository HistoryRepo { get; set; } [Inject] public ICountryActivityRepository ActivityRepo { get; set; } [Inject] public ISystemUserRepository UserRepo { get; set; } + [Inject] public NavigationManager Navigator { get; set; } + [Inject] public IUserInfoService UserInfoService { get; set; } // -------------------------------------------------------------------- // parameters @@ -53,6 +59,7 @@ public partial class OfficeOrderCreatePage : IDisposable private readonly JsonSerializerOptions _options = new() {PropertyNameCaseInsensitive = true}; // class objects private CompanyDto Company { get; set; } = new(); + private UserManagerEditView UserInfo { get; set; } = new(); private SalesItemView SelectedItem { get; set; } = new(); private ActivityDto Activity { get; set; } = new(); private UserManagerEditView SalesRep { get; set; } = new(); @@ -64,7 +71,7 @@ public partial class OfficeOrderCreatePage : IDisposable private string Quantity { get; set; } = "1"; private string Price { get; set; } = "0"; private string Discount { get; set; } = "0"; - private bool ReportClosed { get; set; } + // private bool ReportClosed { get; set; } private bool PoFormInvalid { get; set; } = true; private bool Working { get; set; } = true; @@ -87,6 +94,7 @@ public partial class OfficeOrderCreatePage : IDisposable Interceptor.RegisterEvent(); Interceptor.RegisterBeforeSendEvent(); + UserInfo = await UserInfoService.GetUserInfo(); // setup edit context ActivityContext = new EditContext(Activity); ActivityContext.OnFieldChanged += HandleFieldChanged; @@ -142,12 +150,13 @@ public partial class OfficeOrderCreatePage : IDisposable Activity.BcId = Company.BcId; Activity.CompanyId = Company.CompanyId; Activity.SalesRepId = Company.SalesRepId; - + // setting up activity properties Activity.ActivityStatusEnum = "noSale"; Activity.VisitTypeEnum = "recall"; Activity.ActivityTypeEnum = "phone"; Activity.ActivityStatusEnum = "order"; + Activity.OurRef = $"T:{UserInfo.FirstName}"; // Initialize date variable SelectedDate = DateTime.Now; @@ -220,8 +229,104 @@ public partial class OfficeOrderCreatePage : IDisposable InventoryListOverlay.Show(); } - private void CreateActivity() + private async Task CreateActivity() { + // avoid duplication + if (Working) + return; + // validate customer address1 + // - this is a required input + if (string.IsNullOrWhiteSpace(Activity.Address1)) + { + Toaster.ShowError("Kunde adresse er ufuldstændig."); + return; + } + + // validate org number + // - this is a required input + // - must validate according to country rules. + if (!VatUtils.ValidateFormat(Company.CountryCode, Activity.VatNumber)) + { + Toaster.ShowError("Firma registreringsnummer er ikke korrekt."); + return; + } + + // validate input according to status + switch (Activity.ActivityStatusEnum) + { + // don't accept order with no lines + case "order" when DraftProvider.Draft.Items.Count == 0: + Toaster.ShowError("Ved bestilling skal der være en eller flere linjer i kladden."); + return; + // phone number is required if first time customer + case "order" when Company.Account is "NY" or "" && string.IsNullOrWhiteSpace(Activity.Phone): + Toaster.ShowError("Ved bestilling til ny kunde skal telefon nummer angives."); + return; + // verify email address is a valid address + case "quote" when !Utils.IsValidEmail(Activity.Email): + Toaster.ShowError("Ved tilbud skal en gyldig email adresse angives."); + return; + } + + // raise working flag + Working = true; + + // reset selected item + SelectedItem = new SalesItemView(); + // // check if phone number need to be updated + // if (OldPhone != Activity.Phone) + // { + // Company.Phone = Activity.Phone; + // Activity.OrderMessage = $"Telefonnr. opdateret.\n{Activity.OrderMessage}"; + // await CompanyRepo.UpdateErpData(Company.CompanyId, Company); + // } + + // begin assembling activity + Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}"; + if (Activity.Express) + Activity.OurRef = $"E{Activity.OurRef}"; + // begin lines + Activity.Lines = new List(); + var ln = 0; + if (DraftProvider.Draft.Items.Count != 0) + { + var lines = DraftProvider.Draft.Items.Select(item => new ActivityLineDto + { + Price = item.Price, + Discount = item.Discount, + LineAmount = item.LineTotal, + Qty = item.Quantity, + Sku = item.Item.Sku, + Text = item.Item.Name, + ShortName = item.Item.ShortName, + LineNumber = ++ln, + Sas = item.Sas, + Location = item.Item.Location + }) + .ToList(); + Activity.Lines = lines; + } + + // debug logging + Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity)); + // post to api + var result = await ActivityRepo.CreatePhoneOrder(Company.CompanyId, Activity); + // debug logging + Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result)); + // show result message + if (result.IsSuccess) + { + Toaster.ShowSuccess($"{result.Message}", "Telefon Ordre oprettet"); + await DeleteDraft(); + Navigator.NavigateTo($"/office/customers/{CompanyId}/orders/{result.Id}"); + Working = false; + return; + } + + // lower working flag + Working = false; + // show error message + Toaster.ShowError(result.Message, "ORDRE FEJL"); }