WIP: office create order

This commit is contained in:
Frede Hundewadt 2023-03-02 12:42:19 +01:00
parent 3d4f463927
commit 1cbc87381d
3 changed files with 121 additions and 5 deletions

View file

@ -54,7 +54,7 @@ public class CountryActivityRepository : ICountryActivityRepository
/// </summary>
/// <param name="activityId"></param>
/// <returns></returns>
public async Task<ActivityDto> GetActivity(string activityId)
public async Task<ActivityDto> RequestActivity(string activityId)
{
var activity = await _client
.GetFromJsonAsync<ActivityDto>($"{_api.CrmActivities}/{activityId}");
@ -76,4 +76,13 @@ public class CountryActivityRepository : ICountryActivityRepository
? new List<ReportItemView>()
: JsonSerializer.Deserialize<List<ReportItemView>>(content, _options);
}
public async Task<ApiResponseView> 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<ApiResponseView>(content, _options);
}
}

View file

@ -29,7 +29,7 @@ public interface ICountryActivityRepository
/// </summary>
/// <param name="activityId"></param>
/// <returns></returns>
Task<ActivityDto> GetActivity(string activityId);
Task<ActivityDto> RequestActivity(string activityId);
/// <summary>
/// Get activities for customer Id
@ -37,4 +37,6 @@ public interface ICountryActivityRepository
/// <param name="customerId"></param>
/// <returns></returns>
Task<List<ReportItemView>> RequestActivityList(string customerId);
Task<ApiResponseView> CreatePhoneOrder(string customerId, ActivityDto activity);
}

View file

@ -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<OfficeOrderCreatePage> 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<ActivityLineDto>();
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");
}