added phone / express

This commit is contained in:
Frede Hundewadt 2022-08-15 06:35:15 +02:00
parent e2bbb9e238
commit b8c354958e
29 changed files with 102 additions and 102 deletions

View file

@ -1,13 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/modules.xml
/contentModel.xml
/projectSettingsUpdater.xml
/.idea.Wonky.Client.iml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="com.jetbrains.rider.android.RiderAndroidMiscFileCreationComponent">
<option name="ENSURE_MISC_FILE_EXISTS" value="true" />
</component>
</project>

View file

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=Venligst/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View file

@ -27,6 +27,8 @@
<th scope="col">Note</th>
<th class="text-end" scope="col">sas</th>
<th class="text-end" scope="col">Beløb</th>
<th class="text-center" scope="col">T</th>
<th class="text-center" scope="col">H</th>
</tr>
</thead>
<tbody>
@ -40,6 +42,8 @@
<td>@activity.OfficeNote</td>
<td class="text-end">@activity.SasAmount</td>
<td class="text-end">@(activity.StatusTypeEnum == "Quote" ? 0 : activity.OrderAmount)</td>
<td class="text-center">@if(activity.OurRef.Contains("T:")){<i class="oi oi-phone"></i>}</td>
<td class="text-center">@if(activity.Express){<i class="oi oi-flash"></i>}</td>
</tr>
}
<tr>

View file

@ -19,3 +19,4 @@
@using Wonky.Client.Components
<PageTitle>Inno Web CRM</PageTitle>

View file

@ -47,7 +47,6 @@ public partial class LandingComponentAdmin : IDisposable
private Preferences _prefs { get; set; } = new();
private string _workDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
private string _today { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
private List<TaskItemDto>? _taskItems { get; set; } = new();
protected override async Task OnInitializedAsync()
@ -58,45 +57,6 @@ public partial class LandingComponentAdmin : IDisposable
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
//await GetTaskItems(_workDate);
await GetAllTasks();
}
private async Task GetAllTasks()
{
_taskItems = await _taskItemRepo.GetTaskList();
}
private async Task OnCompleteTask(string taskItemId)
{
await _preferenceService.SetWorkDate(DateTime.Now);
var item = _taskItems.Find(x => x.TaskItemId == taskItemId);
_navigator.NavigateTo($"/companies/{item.ReferenceId}/activities/new");
}
private async Task GetTaskItems(string workDate)
{
_workDate = workDate;
_taskItems = new List<TaskItemDto>();
_taskItems = await _taskItemRepo.GetTaskList(workDate);
}
private async Task OnTaskCompleted(string taskItemId)
{
var item = _taskItems.Find(x => x.TaskItemId == taskItemId);
item.IsCompleted = true;
await _taskItemRepo.UpdateTaskItem(taskItemId, item);
_taskItems.Remove(item);
_toast.ShowInfo("Opgaven er markeret som udført.");
}
private async Task OnDeleteConfirmed(string taskItemId)
{
var item = _taskItems.First(x => x.TaskItemId == taskItemId);
_taskItems.Remove(item);
await _taskItemRepo.DeleteTaskItem(taskItemId);
_toast.ShowInfo("Opgaven er slettet.");
}
public void Dispose()

View file

@ -22,6 +22,10 @@
<thead>
<tr class="bg-light text-black">
<th colspan="4">
@if (ReportItem.Express)
{
<h2 class="text-center">TELEFONORDRE</h2>
}
<h2 class="text-center">@ReportItem.Company.Name</h2>
</th>
</tr>

View file

@ -49,9 +49,12 @@
<div class="col-md-4">
<h4>Kundenavn</h4>
</div>
<div class="col-md-4">
<div class="col-md-3">
<h4>Postnr. Bynavn</h4>
</div>
<div class="col-md-1 text-center">
<h4>H</h4>
</div>
<div class="col-md-2">
<h4>Status</h4>
</div>
@ -67,9 +70,15 @@
<div class="col-md-4">
@order.Company.Name
</div>
<div class="col-md-4">
<div class="col-md-3">
@order.Company.ZipCode @order.Company.City
</div>
<div class="col-md-1 text-center">
@if (order.Express)
{
<i class="oi oi-flash"></i>
}
</div>
<div class="col-md-2">
@switch (order.ProcessStatusEnum.ToLower())
{

View file

@ -92,8 +92,8 @@ namespace Wonky.Client.HttpInterceptors
switch (e.Response.StatusCode)
{
case HttpStatusCode.NotFound:
message = "Der var ingen data ...";
_toast.ShowInfo(message);
// message = "Der var ingen data ...";
// _toast.ShowInfo(message);
break;
case HttpStatusCode.BadRequest:
// message = "Der er et problem med data ...";
@ -102,7 +102,7 @@ namespace Wonky.Client.HttpInterceptors
case HttpStatusCode.Unauthorized:
ClearInfo();
_navigation.NavigateTo($"/login/{currDoc}");
message = "Login skal fornyes ...";
message = "Venligst login ...";
_toast.ShowWarning(message);
break;
case HttpStatusCode.InternalServerError:
@ -118,7 +118,7 @@ namespace Wonky.Client.HttpInterceptors
private async void ClearInfo()
{
await _storage.RemoveItemsAsync(new List<string> {"_xa", "_xr", "_xe", "_xu"});
await _storage.ClearAsync();
}
}
}

View file

@ -24,5 +24,6 @@ namespace Wonky.Client.HttpRepository;
public interface ISalesItemHttpRepository
{
Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(CatalogPagingParams pagingParameters);
Task<SalesItemView> GetSalesItem(string id);
Task<SalesItemView> GetSalesItemId(string salesItemId);
Task<SalesItemView> GetSalesVariantId(string variantId);
}

View file

@ -77,10 +77,17 @@ public class SalesItemHttpRepository : ISalesItemHttpRepository
return pagingResponse;
}
public async Task<SalesItemView> GetSalesItem(string id)
public async Task<SalesItemView> GetSalesItemId(string salesItemId)
{
var salesItem = await _client
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.CrmCatalog}/{id}");
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.CrmCatalog}/{salesItemId}");
return salesItem ?? new SalesItemView();
}
public async Task<SalesItemView> GetSalesVariantId(string variantId)
{
var salesItem = await _client
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.CrmCatalog}/variant/{variantId}");
return salesItem ?? new SalesItemView();
}
}

View file

@ -76,30 +76,33 @@ public partial class ActivityNewVisitPage : IDisposable
protected override async Task OnParametersSetAsync()
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
_prefs = await _userPrefs.GetPreferences();
if (!string.IsNullOrWhiteSpace(_prefs.WorkDate))
_workDate = DateTime.Parse(_prefs.WorkDate);
_selectedDate = $"{_workDate:yyyy-MM-dd}";
// raise flag if report is closed
_reportClosdd = await _reportRepo.ReportExist(_selectedDate);
}
protected override async Task OnInitializedAsync()
{
_editContext = new EditContext(_draft);
_editContext.OnFieldChanged += HandleFieldChanged;
_editContext.OnValidationStateChanged += ValidationChanged;
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
_draft.ActivityDate = $"{_workDate:yyyy-MM-dd}" ;
_ux = await _storage.GetItemAsync<UserInfoView>("_xu");
// get company
_company = await _companyRepo.GetCompanyById(CompanyId);
// variable to validate if customer needs phone number update
_phone = _company.Phone;
if (string.IsNullOrWhiteSpace(_company.Phone)
@ -146,9 +149,11 @@ public partial class ActivityNewVisitPage : IDisposable
private async Task SelectSku(SelectedSku sku)
{
// fetch selected item
_selectedItem = await _itemRepo.GetSalesItem(sku.ItemId);
// get selected item
if (string.IsNullOrWhiteSpace(sku.ItemId))
return;
_selectedItem = await _itemRepo.GetSalesItemId(sku.ItemId);
ShowItem = true;
Price = sku.Rate;
Quantity = sku.Quantity;
@ -156,11 +161,6 @@ public partial class ActivityNewVisitPage : IDisposable
StateHasChanged();
}
private void CallHistoryModal()
{
_historyModal.Show();
}
private void CallPriceHistoryModal()
{
_priceHistoryModal.Show();
@ -168,6 +168,9 @@ public partial class ActivityNewVisitPage : IDisposable
private void SelectPrice(decimal price)
{
if (price == 0)
return;
Price = price.ToString("N2", CultureInfo.InvariantCulture);
StateHasChanged();
}
@ -205,13 +208,16 @@ public partial class ActivityNewVisitPage : IDisposable
}
HideButtons = true;
_draft.ActivityDate = _prefs.WorkDate;
_draft.ActivityDate = $"{_workDate:yyyy-MM-dd}";
_draft.OurRef = _draft.ActivityTypeEnum switch
{
"phone" => $"T:{_ux.FullName.Split(" ")[0]}",
"onSite" => $"B:{_ux.FullName.Split(" ")[0]}",
_ => ""
};
if (_draft.ActivityTypeEnum == "phone" && _draft.Express)
_draft.OurRef = $"E{_draft.OurRef}";
_draft.Lines = new List<ActivityLineDto>();
var ln = 0;
if (DraftStateProvider.Draft.Items.Count != 0)
@ -235,12 +241,13 @@ public partial class ActivityNewVisitPage : IDisposable
{
_company.Phone = _draft.Phone;
await _companyRepo.UpdateCompany(_company.CompanyId, _company);
_toast.ShowInfo("Kunde telefon nummer er opdateret.");
// _toast.ShowInfo("Kunde telefon nummer er opdateret.");
}
// post to api
var result = await _activityRepo.CreateActivity(_draft);
// show result message
_toast.ShowSuccess($"{result.Message}.");
_selectedItem = new SalesItemView();
await DraftStateProvider.DeleteDraftAsync();
_navigator.NavigateTo($"/companies");
}
@ -292,6 +299,12 @@ public partial class ActivityNewVisitPage : IDisposable
|| _poFormInvalid
|| DraftStateProvider.Draft.Items.Count == 0
|| (_draft.ActivityStatusEnum == "offer" && string.IsNullOrWhiteSpace(_draft.Email));
if (_draft.YourRef.Length > 35 || _draft.ReferenceNumber.Length > 20)
{
_poFormInvalid = true;
return;
}
if (InvalidActivity)
{

View file

@ -110,14 +110,14 @@
<div class="row mb-3">
<label for="newPasswd" class="col-md-2 col-form-label">Ny</label>
<div class="col-md-10">
<InputText id="newPasswd" type="password" class="form-control" @bind-Value="@_passwords.NewPassword"/>
<InputText id="newPasswd" class="form-control" @bind-Value="@_passwords.NewPassword"/>
<ValidationMessage For="@(() => _passwords.NewPassword)"></ValidationMessage>
</div>
</div>
<div class="row mb-3">
<label for="verifyPasswd" class="col-md-2 col-form-label">Bekræft</label>
<div class="col-md-10">
<InputText id="verifyPasswd" type="password" class="form-control" @bind-Value="@_passwords.ConfirmPassword"/>
<InputText id="verifyPasswd" class="form-control" @bind-Value="@_passwords.ConfirmPassword"/>
<ValidationMessage For="@(() => _passwords.ConfirmPassword)"></ValidationMessage>
</div>
</div>

View file

@ -193,7 +193,7 @@
<a class="btn btn-light border-dark d-block" href="/companies">Oversigt</a>
</div>
<div class="col">
<a class="btn btn-light border-dark d-block" href="/companies/@_company.CompanyId/workplaces">Kemi</a>
@* <a class="btn btn-light border-dark d-block" href="/companies/@_company.CompanyId/workplaces">Kemi</a> *@
</div>
<div class="col">
<a class="btn btn-light border-dark d-block" href="/companies/@_company.CompanyId/h/i">Produktkøb</a>

View file

@ -35,7 +35,7 @@ public partial class KrvItemViewPage : IDisposable
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
_item = await _itemRepo.GetSalesItem(SalesItemId);
_item = await _itemRepo.GetSalesVariantId(SalesItemId);
}
/// <summary>

View file

@ -102,7 +102,7 @@ public partial class OfficeNewOrderPage : IDisposable
private async Task SelectSku(SelectedSku sku)
{
ShowItem = true;
_selectedItem = await _itemRepo.GetSalesItem(sku.ItemId);
_selectedItem = await _itemRepo.GetSalesVariantId(sku.ItemId);
Price = sku.Rate;
Quantity = sku.Quantity;
}

View file

@ -26,6 +26,10 @@
<thead>
<tr>
<th colspan="4">
@if (_order.Express)
{
<h2 class="text-center fw-bold">HASTE ORDRE</h2>
}
<h2 class="text-center">@_order.Company.Name</h2>
</th>
</tr>

View file

@ -32,6 +32,6 @@
<div class="content d-none d-print-block">
@Body
</div>
<BlazoredToasts Position="ToastPosition.BottomCenter" Timeout="2"/>
<BlazoredToasts Position="ToastPosition.BottomCenter" Timeout="3"/>
</main>
</div>

View file

@ -65,7 +65,7 @@
<div class="text-sm-end me-1">@rate.Quantity</div>
<div class="text-sm-end me-1">@rate.Rate</div>
<div>
<a class="btn btn-primary btn-sm" data-bs-dismiss="modal" @onclick="@(() => SelectItem(item.ItemId, rate.Quantity, rate.Rate))">
<a class="btn btn-primary btn-sm" data-bs-dismiss="modal" @onclick="@(() => SelectItem(item.SalesItemId, rate.Quantity, rate.Rate))">
<i class="oi oi-plus"></i>
</a>
</div>

View file

@ -41,9 +41,10 @@ public partial class PriceListModal : IDisposable
{
_preferences = await _preferenceService.GetPreferences();
_paging.OrderBy = _preferences.ItemSort;
_paging.SearchColumn = _preferences.ItemSort;
_paging.PageSize = Convert.ToInt32((_preferences.PageSize));
_paging.SearchColumn = _preferences.ItemSearch;
_paging.PageSize = Convert.ToInt32(_preferences.PageSize);
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
await GetSalesItems();
}

View file

@ -36,6 +36,9 @@ public partial class ProductPriceHistoryModal
protected override async Task OnParametersSetAsync()
{
if (string.IsNullOrWhiteSpace(ItemSku))
return;
History = await _historyRepo.FetchHistory(CompanyId, ItemSku);
if (History.Any())
{

View file

@ -11,10 +11,10 @@
<PackageReference Include="Blazored.LocalStorage" Version="4.2.0" />
<PackageReference Include="Blazored.Toast" Version="3.2.2" />
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="6.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="6.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.7" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="6.0.8" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="6.0.8" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="6.0.8" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="6.0.8" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" />

View file

@ -1,13 +1,13 @@
{
"appInfo": {
"name": "Wonky Client",
"version": "0.10.72",
"rc": false,
"version": "0.10.84",
"rc": true,
"sandBox": false,
"image": "grumpy-coder.png"
},
"apiConfig": {
"innoBaseUrl": "https://staging.innotec.dk",
"innoBaseUrl": "https://app.innotec.dk",
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
"glsId": "",
"serviceVirk": "api/v2/services/virk",

View file

@ -113,10 +113,12 @@ namespace Wonky.Entity.DTO
/// </summary>
[Required(ErrorMessage = "Vælg aktivitetstype")]
public string ActivityTypeEnum { get; set; } = "";
/// <summary>
/// Flag express order
/// </summary>
public bool Express { get; set; }
/// <summary>
/// Activity status enum as string
/// </summary>

View file

@ -29,7 +29,10 @@ public class ReportItemView
/// Closed sale
/// </summary>
public bool Closed { get; set; }
/// <summary>
/// express flag
/// </summary>
public bool Express { get; set; }
/// <summary>
/// ESales number
/// </summary>

View file

@ -17,7 +17,8 @@ namespace Wonky.Entity.Views;
public class SalesItemView
{
public string ItemId { get; set; } = "";
public string SalesItemId { get; set; } = "";
public string VariantId { get; set; } = "";
public string Name { get; set; } = "";
public string Sku { get; set; } = "";
public string ShortName { get; set; } = "";

View file

@ -20,7 +20,7 @@ namespace Wonky.Entity.Views;
public class UserInfoView
{
[JsonPropertyName("id")] public string Id { get; set; } = "";
[JsonPropertyName("Advisor")] public string Advisor { get; set; } = "";
[JsonPropertyName("advisor")] public string Advisor { get; set; } = "";
[JsonPropertyName("companyId")] public string CrmCompanyKey { get; set; } = "";
[JsonPropertyName("countryCode")] public string CountryCode { get; set; } = "";
[JsonPropertyName("countryName")] public string CountryName { get; set; } = "";

View file

@ -59,4 +59,8 @@ public class WarehouseOrderView
/// Current process status
/// </summary>
public string ProcessStatusEnum { get; set; } = "";
/// <summary>
/// express flag
/// </summary>
public bool Express { get; set; }
}