price list

This commit is contained in:
Frede Hundewadt 2022-12-07 14:58:03 +01:00
parent 88039cd8f5
commit ecd1b61c88
15 changed files with 232 additions and 220 deletions

View file

@ -23,7 +23,7 @@
<th colspan="4"> <th colspan="4">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<h2>Innotec Prisliste</h2> <h2>Innotec Prisliste - @CountryName</h2>
</div> </div>
<div class="col-sm-2 text-end"> <div class="col-sm-2 text-end">
<button type="button" class="d-print-none btn btn-primary mx-3" onclick="window.print();"><i class="bi-printer"></i> Udskriv</button> <button type="button" class="d-print-none btn btn-primary mx-3" onclick="window.print();"><i class="bi-printer"></i> Udskriv</button>

View file

@ -24,4 +24,5 @@ namespace Wonky.Client.Components;
public partial class CatalogTablePrintComponent public partial class CatalogTablePrintComponent
{ {
[Parameter] public List<SalesItemView> ItemList { get; set; } = new(); [Parameter] public List<SalesItemView> ItemList { get; set; } = new();
[Parameter] public string CountryName { get; set; } = "";
} }

View file

@ -25,5 +25,5 @@ public interface ICrmHistoryHttpRepository
Task<List<ProductInventoryView>> FetchInventory(string companyId); Task<List<ProductInventoryView>> FetchInventory(string companyId);
Task<List<ProductHistoryView>> FetchHistory(string companyId); Task<List<ProductHistoryView>> FetchHistory(string companyId);
Task<List<ProductHistoryView>> FetchHistory(string companyId, string sku); Task<List<ProductHistoryView>> FetchHistory(string companyId, string sku);
Task<string> RpcSyncErpToCrm(string companyId, string syncDate, string etag); Task<string> ErpInvoiceToCrmRpc(string companyId, string syncDate);
} }

View file

@ -96,7 +96,7 @@ public class CrmCompanyHttpRepository : ICrmCompanyHttpRepository
public async Task<CompanyDto> GetCompanyById(string companyId) public async Task<CompanyDto> GetCompanyById(string companyId)
{ {
return await _client.GetFromJsonAsync<CompanyDto>($"{_conf.CrmCustomers}/{companyId}"); return await _client.GetFromJsonAsync<CompanyDto>($"{_conf.CrmCustomers}/{companyId}", _options);
} }
/// <summary> /// <summary>
@ -106,7 +106,7 @@ public class CrmCompanyHttpRepository : ICrmCompanyHttpRepository
/// <returns>company id</returns> /// <returns>company id</returns>
public async Task<string> CreateCompany(CompanyDto model) public async Task<string> CreateCompany(CompanyDto model)
{ {
var response = await _client.PostAsJsonAsync($"{_conf.CrmCustomers}", model); var response = await _client.PostAsJsonAsync($"{_conf.CrmCustomers}", model, _options);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<CompanyDto>(content, _options); var result = JsonSerializer.Deserialize<CompanyDto>(content, _options);
return result.CompanyId; return result.CompanyId;

View file

@ -114,10 +114,13 @@ public class CrmHistoryHttpRepository : ICrmHistoryHttpRepository
/// </summary> /// </summary>
/// <param name="companyId"></param> /// <param name="companyId"></param>
/// <param name="syncDate"></param> /// <param name="syncDate"></param>
/// <param name="etag"></param>
/// <returns>date string</returns> /// <returns>date string</returns>
public async Task<string> RpcSyncErpToCrm(string companyId, string syncDate, string etag) public async Task<string> ErpInvoiceToCrmRpc(string companyId, string syncDate)
{ {
return await _client.GetStringAsync($"{_api.CrmCustomers}/{companyId}/{_api.CrmRpcSyncExt}/{syncDate}?etag={etag}"); var x =await _client.GetAsync($"{_api.CrmCustomers}/{companyId}/{_api.CrmRpcSyncExt}/{syncDate}");
if (!x.IsSuccessStatusCode)
return "";
var content = await x.Content.ReadAsStringAsync();
return content;
} }
} }

View file

@ -39,14 +39,14 @@
<PageSizeComponent OnChanged="SetPageSize"/> <PageSizeComponent OnChanged="SetPageSize"/>
</div> </div>
<div class="col-sm-10"> <div class="col-sm-10">
<PaginationComponent MetaData="_metaData" Spread="2" SelectedPage="SetSelectedPage"/> <PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SetSelectedPage"/>
</div> </div>
<div class="col-sm-2 text-end"> <div class="col-sm-2 text-end">
<a class="btn btn-secondary" href="/price-catalog/print"><i class="bi-printer"></i> Udskriv</a> <a class="btn btn-secondary" href="/price-catalog/print"><i class="bi-printer"></i> Udskriv</a>
</div> </div>
</div> </div>
</div> </div>
<CatalogTableComponent ItemList="_items"/> <CatalogTableComponent ItemList="Items"/>
@if (Working) @if (Working)
{ {
<WorkingThreeDots /> <WorkingThreeDots />

View file

@ -34,83 +34,84 @@ public partial class CatalogPage : IDisposable
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public ICatalogHttpRepository ItemRepo { get; set; } [Inject] public ICatalogHttpRepository ItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; } [Inject] public UserPrefService PrefService { get; set; }
private List<SalesItemView> _items { get; set; } = new(); private List<SalesItemView> Items { get; set; } = new();
private MetaData _metaData { get; set; } = new(); private MetaData MetaInfo { get; set; } = new();
private CatalogPagingParams _paging = new(); private CatalogPagingParams PageParams = new();
private UserPref _userPref = new(); private UserPref Prefs = new();
private UserInfoView _user { get; set; } = new(); private UserInfoView UserInfo { get; set; } = new();
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
_userPref = await UserPrefService.GetPreferences(); Prefs = await PrefService.GetPreferences();
_user = await Storage.GetItemAsync<UserInfoView>("_xu"); UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
_paging.CountryCode = _user.CountryCode; PageParams.CountryCode = UserInfo.CountryCode;
_paging.OrderBy = _userPref.ItemSort; PageParams.OrderBy = Prefs.ItemSort;
_paging.SearchColumn = _userPref.ItemSearch; PageParams.SearchColumn = Prefs.ItemSearch;
_paging.PageSize = Convert.ToInt32(_userPref.PageSize); PageParams.PageSize = Convert.ToInt32(Prefs.PageSize);
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
await FetchSalesItems(); await FetchSalesItems();
} }
private async Task SetSearchPhrase(string searchTerm) private async Task SetSearchPhrase(string searchTerm)
{ {
_items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageNumber = 1; PageParams.PageNumber = 1;
_paging.SearchTerm = searchTerm; PageParams.SearchTerm = searchTerm;
await FetchSalesItems(); await FetchSalesItems();
} }
private async Task SetPageSize(string pageSize) private async Task SetPageSize(string pageSize)
{ {
_items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageSize = Convert.ToInt32(pageSize); PageParams.PageSize = Convert.ToInt32(pageSize);
_paging.PageNumber = 1; PageParams.PageNumber = 1;
await FetchSalesItems(); await FetchSalesItems();
} }
private async Task SetSearchCol(string columnName) private async Task SetSearchCol(string columnName)
{ {
_items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageNumber = 1; PageParams.PageNumber = 1;
_paging.SearchColumn = columnName; PageParams.SearchColumn = columnName;
await FetchSalesItems(); await FetchSalesItems();
} }
private async Task SetSortCol(string orderBy) private async Task SetSortCol(string orderBy)
{ {
_items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.OrderBy = orderBy; PageParams.OrderBy = orderBy;
await FetchSalesItems(); await FetchSalesItems();
} }
private async Task SetSelectedPage(int page) private async Task SetSelectedPage(int page)
{ {
_items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageNumber = page; PageParams.PageNumber = page;
await FetchSalesItems(); await FetchSalesItems();
} }
private async Task SetGroupCol(string groupFilter) private async Task SetGroupCol(string groupFilter)
{ {
_items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageNumber = 1; PageParams.PageNumber = 1;
_paging.SelectGroup = groupFilter; PageParams.SelectGroup = groupFilter;
await FetchSalesItems(); await FetchSalesItems();
} }
private async Task FetchSalesItems() private async Task FetchSalesItems()
{ {
Working = true; Working = true;
var pagingResponse = await ItemRepo.GetSalesItemsPaged(_paging); var pagingResponse = await ItemRepo.GetSalesItemsPaged(PageParams);
Working = false; Working = false;
_items = pagingResponse.Items!; Items = pagingResponse.Items!;
_metaData = pagingResponse.MetaData; MetaInfo = pagingResponse.MetaData;
} }

View file

@ -21,7 +21,7 @@
@attribute [Authorize(Roles = "Admin,Advisor,Office,Warehouse")] @attribute [Authorize(Roles = "Admin,Advisor,Office,Warehouse")]
<CatalogTablePrintComponent ItemList="Items" /> <CatalogTablePrintComponent ItemList="Items" CountryName="@UserInfo.CountryName" />
@if (Working) @if (Working)
{ {
<WorkingThreeDots/> <WorkingThreeDots/>

View file

@ -34,19 +34,16 @@ public partial class CatalogPrintPage : IDisposable
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public ICatalogHttpRepository ItemRepo { get; set; } [Inject] public ICatalogHttpRepository ItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; }
private List<SalesItemView> Items { get; set; } = new(); private List<SalesItemView> Items { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
await GetSalesItems(); UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
}
private async Task GetSalesItems()
{
Items = await ItemRepo.GetPriceList(); Items = await ItemRepo.GetPriceList();
Working = false; Working = false;
} }

View file

@ -36,13 +36,20 @@ namespace Wonky.Client.Pages
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
private List<CompanyDto> Companies { get; set; } = new(); private List<CompanyDto> Companies { get; set; } = new();
private MetaData PageData { get; set; } = new();
private CompanyPagingParams PageParams = new();
private UserPref Prefs { get; set; } = new(); private UserPref Prefs { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new(); private UserInfoView UserInfo { get; set; } = new();
private string SavedSearch { get; set; } = ""; private string SavedSearch { get; set; } = "";
private bool IncludeFolded { get; set; } private bool IncludeFolded { get; set; }
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
private MetaData PageData { get; set; } = new();
private CompanyPagingParams PageParams { get; set; } = new();
protected override void OnParametersSet()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@ -59,9 +66,6 @@ namespace Wonky.Client.Pages
SavedSearch = string.IsNullOrWhiteSpace(Prefs.CompanyFilterPhrase) ? "" : Prefs.CompanyFilterPhrase; SavedSearch = string.IsNullOrWhiteSpace(Prefs.CompanyFilterPhrase) ? "" : Prefs.CompanyFilterPhrase;
PageParams.SearchTerm = SavedSearch; PageParams.SearchTerm = SavedSearch;
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
// get companies // get companies
await FetchCompanies(); await FetchCompanies();
Working = false; Working = false;
@ -129,12 +133,12 @@ namespace Wonky.Client.Pages
private async Task FetchCompanies() private async Task FetchCompanies()
{ {
Working = true; Working = true;
var pagingResponse = await CompanyRepo.GetCompanies(PageParams); var pageRes = await CompanyRepo.GetCompanies(PageParams);
Working = false; Working = false;
if (pagingResponse.Items.Any()) if (pageRes.Items.Any())
{ {
Companies = pagingResponse.Items; Companies = pageRes.Items;
PageData = pagingResponse.MetaData; PageData = pageRes.MetaData;
} }
else else
{ {

View file

@ -13,7 +13,6 @@
// 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.Runtime.CompilerServices;
using System.Text.Json; using System.Text.Json;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Blazored.LocalStorage; using Blazored.LocalStorage;
@ -66,45 +65,32 @@ public partial class CrmCompanyViewPage : IDisposable
private ContactDto DefaultContact { get; set; } = new(); private ContactDto DefaultContact { get; set; } = new();
private ContactModal ContactPopup { get; set; } = new(); private ContactModal ContactPopup { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new(); private UserInfoView UserInfo { get; set; } = new();
private string Etag { get; set; } = "";
private string _getServerData { get; set; } = "";
[Parameter]
public string RpcDone
{
get => _getServerData;
set
{
if (_getServerData == value)
return;
_getServerData = value;
var x = PrepareCompanyDate().Result;
}
}
private async Task<string> PrepareCompanyDate()
{
// call background task to fetch contacts
await FetchContacts(CompanyId);
return await HistoryRepo.RpcSyncErpToCrm(Company.CompanyId, Company.HistorySync, Etag);
}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
// setup interceptor
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
// initialize default contact
DefaultContact = new ContactDto { CompanyId = CompanyId, ContactId = "", FirstName = ""};
// setup form context
ErpContext = new EditContext(Company);
// assign event handlers to context
ErpContext.OnFieldChanged += HandleFieldChanged;
ErpContext.OnValidationStateChanged += ValidationChanged;
// fetch user info from local storage // fetch user info from local storage
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu"); UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
CountryCode = UserInfo.CountryCode.ToLower(); CountryCode = UserInfo.CountryCode.ToLower();
CountryIsDk = CountryCode == "dk"; CountryIsDk = CountryCode == "dk";
// setup interceptor Logger.LogDebug("companyId => {}", CompanyId);
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Company = await CompanyRepo.GetCompanyById(CompanyId); Company = await CompanyRepo.GetCompanyById(CompanyId);
Etag = Company.Etag;
Company.Etag = Guid.NewGuid().ToString();
if (!string.IsNullOrWhiteSpace(CompanyId)) Logger.LogDebug("company => {}", JsonSerializer.Serialize(Company));
RpcDone = CompanyId;
CurrentVat = Company.VatNumber; CurrentVat = Company.VatNumber;
@ -151,13 +137,8 @@ public partial class CrmCompanyViewPage : IDisposable
if (CountryIsDk) if (CountryIsDk)
CompanyVatAddress = PrepareVatAddress(Company); CompanyVatAddress = PrepareVatAddress(Company);
// initialize default contact
DefaultContact = new ContactDto { CompanyId = CompanyId, ContactId = "", FirstName = ""}; await FetchContacts(CompanyId);
// setup form context
ErpContext = new EditContext(Company);
// assign event handlers to context
ErpContext.OnFieldChanged += HandleFieldChanged;
ErpContext.OnValidationStateChanged += ValidationChanged;
// remove loading image // remove loading image
Working = false; Working = false;
@ -171,7 +152,8 @@ public partial class CrmCompanyViewPage : IDisposable
{ {
// load contacts // load contacts
Contacts = await ContactRepo.GetContacts(companyId); Contacts = await ContactRepo.GetContacts(companyId);
Contacts = Contacts.OrderBy(x => x.FirstName).ToList(); if(Contacts.Any() && Contacts.Count > 1)
Contacts = Contacts.OrderBy(x => x.FirstName).ToList();
} }
/// <summary> /// <summary>
@ -228,18 +210,19 @@ public partial class CrmCompanyViewPage : IDisposable
{ {
Working = true; Working = true;
// write contact to debug log // write contact to debug log
Logger.LogDebug("CompanyView => SaveContactCallback <= {}", JsonSerializer.Serialize(contact)); var jsonContact = JsonSerializer.Serialize(contact);
Logger.LogDebug("CompanyView => SaveContactCallback <= {}", jsonContact);
if (string.IsNullOrWhiteSpace(contact.ContactId)) if (string.IsNullOrWhiteSpace(contact.ContactId))
{ {
// new contact created // new contact created
Logger.LogDebug("create"); Logger.LogDebug("create => {}", jsonContact);
// send post request to backend // send post request to backend
await ContactRepo.CreateContact(contact); await ContactRepo.CreateContact(contact);
} }
else else
{ {
// contact modified // contact modified
Logger.LogDebug("update"); Logger.LogDebug("update => {}", jsonContact);
// send put request to backend // send put request to backend
await ContactRepo.UpdateContact(contact); await ContactRepo.UpdateContact(contact);
} }
@ -326,6 +309,7 @@ public partial class CrmCompanyViewPage : IDisposable
if (!string.IsNullOrWhiteSpace(result.Name)) if (!string.IsNullOrWhiteSpace(result.Name))
{ {
Company = result; Company = result;
StateHasChanged();
} }
Working = false; Working = false;
} }

View file

@ -26,7 +26,7 @@
<WorkDateComponent OnChangedCallback="SetWorkDateCallback"/> <WorkDateComponent OnChangedCallback="SetWorkDateCallback"/>
</div> </div>
<div class="col-sm-4 text-end"> <div class="col-sm-4 text-end">
<AdvisorActivityKmStartComponent/> <AdvisorActivityKmStartComponent disabled/>
</div> </div>
</div> </div>
@ -71,7 +71,7 @@
} }
else else
{ {
Report.Figures.KmMorning = UserPref.KmMorning; Report.Figures.KmMorning = Prefs.KmMorning;
<td> <td>
<input type="time" id="checkIn" class="form-control" <input type="time" id="checkIn" class="form-control"
@bind-Value="_checkIn" @bind-Value:event="oninput" @onchange="OnTimeChanged"/> @bind-Value="_checkIn" @bind-Value:event="oninput" @onchange="OnTimeChanged"/>

View file

@ -35,7 +35,7 @@ namespace Wonky.Client.Pages;
public partial class CrmReportNewPage : IDisposable public partial class CrmReportNewPage : IDisposable
{ {
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; } [Inject] public UserPrefService PrefService { get; set; }
[Inject] public ICrmActivityHttpRepository CrmActivityRepo { get; set; } [Inject] public ICrmActivityHttpRepository CrmActivityRepo { get; set; }
[Inject] public ICrmReportHttpRepository CrmReportRepo { get; set; } [Inject] public ICrmReportHttpRepository CrmReportRepo { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
@ -45,7 +45,7 @@ public partial class CrmReportNewPage : IDisposable
private ReportDto Report { get; set; } = new(); private ReportDto Report { get; set; } = new();
private List<ReportItemView> Activities { get; set; } = new(); private List<ReportItemView> Activities { get; set; } = new();
private ReportFiguresDto InitialValues { get; set; } private ReportFiguresDto InitialValues { get; set; }
private UserPref UserPref { get; set; } = new(); private UserPref Prefs { get; set; } = new();
private bool FormInvalid { get; set; } = true; private bool FormInvalid { get; set; } = true;
private bool NoFigures { get; set; } = true; private bool NoFigures { get; set; } = true;
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
@ -64,16 +64,17 @@ public partial class CrmReportNewPage : IDisposable
{ {
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
ReportContext = new EditContext(Report); ReportContext = new EditContext(Report);
ReportContext.OnFieldChanged += HandleFieldChanged; ReportContext.OnFieldChanged += HandleFieldChanged;
ReportContext.OnValidationStateChanged += ValidationChanged; ReportContext.OnValidationStateChanged += ValidationChanged;
UserPref = await UserPrefService.GetPreferences(); Prefs = await PrefService.GetPreferences();
if (!string.IsNullOrWhiteSpace(UserPref.WorkDate)) if (!string.IsNullOrWhiteSpace(Prefs.WorkDate))
_workDate = DateTime.Parse(UserPref.WorkDate); _workDate = DateTime.Parse(Prefs.WorkDate);
if(await CrmReportRepo.ReportExist(UserPref.WorkDate)) if(await CrmReportRepo.ReportExist(Prefs.WorkDate))
Navigator.NavigateTo($"/sales-reports/view/{UserPref.WorkDate}"); Navigator.NavigateTo($"/sales-reports/view/{Prefs.WorkDate}");
BeginLeave = _workDate; BeginLeave = _workDate;
EndLeave = _workDate; EndLeave = _workDate;
@ -81,6 +82,8 @@ public partial class CrmReportNewPage : IDisposable
Report.FromDateTime = $"{_workDate:yyyy-MM-dd'T'12:00:00}"; Report.FromDateTime = $"{_workDate:yyyy-MM-dd'T'12:00:00}";
Report.ToDateTime = $"{_workDate:yyyy-MM-dd'T'12:00:00}"; Report.ToDateTime = $"{_workDate:yyyy-MM-dd'T'12:00:00}";
Report.Figures.KmMorning = 0;
Report.Figures.KmEvening = 0;
Report.Figures.Distance = 0; Report.Figures.Distance = 0;
Report.Figures.DistancePrivateMonth = 0; Report.Figures.DistancePrivateMonth = 0;
await GetKeyFigures(); await GetKeyFigures();
@ -125,10 +128,17 @@ public partial class CrmReportNewPage : IDisposable
Working = true; Working = true;
var result = await CrmReportRepo.PostReport($"{_workDate:yyyy-MM-dd}", Report); var result = await CrmReportRepo.PostReport($"{_workDate:yyyy-MM-dd}", Report);
if (!result.IsSuccess)
{
Working = false;
Toaster.ShowError($"{result.Message}", $"HTTP Status {result.Code}");
return;
}
// reset km and date confirmation // reset km and date confirmation
// await PreferenceService.SetKmMorning(0); await PrefService.SetKmMorning(0);
// reset date confirmed // reset date confirmed
await UserPrefService.SetDateConfirmed(false); await PrefService.SetDateConfirmed(false);
Navigator.NavigateTo($"/sales-reports/view/{_workDate:yyyy-MM-dd}"); Navigator.NavigateTo($"/sales-reports/view/{_workDate:yyyy-MM-dd}");
} }
/// <summary> /// <summary>
@ -170,16 +180,27 @@ public partial class CrmReportNewPage : IDisposable
// format report date time input // format report date time input
Report.FromDateTime = checkIn.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture); Report.FromDateTime = checkIn.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture);
Report.ToDateTime = checkOut.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture); Report.ToDateTime = checkOut.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture);
// assign final distance numbers // assign final distance numbers
if (Report.DayTypeEnum.ToLower().Contains("leave"))
{
Report.Figures.KmEvening = 0;
Report.Figures.KmMorning = 0;
}
// calculate distance
Report.Figures.Distance = Report.Figures.KmEvening - Report.Figures.KmMorning; Report.Figures.Distance = Report.Figures.KmEvening - Report.Figures.KmMorning;
// add distance to distance month
Report.Figures.DistanceMonth += Report.Figures.Distance; Report.Figures.DistanceMonth += Report.Figures.Distance;
// add private distance to month
Report.Figures.DistancePrivateMonth += Report.Figures.DistancePrivate; Report.Figures.DistancePrivateMonth += Report.Figures.DistancePrivate;
Logger.LogDebug("_workDate => {workDate}", $"{_workDate:yyyy-MM-dd}"); Logger.LogDebug("_workDate => {workDate}", $"{_workDate:yyyy-MM-dd}");
Logger.LogDebug("_report => {report}", JsonSerializer.Serialize(Report)); Logger.LogDebug("_report => {report}", JsonSerializer.Serialize(Report));
// create a prompt
Prompt = Report.Figures.Distance > 1000 ? $"'{Report.Figures.Distance}'KM tal er meget højt. Er du sikker på at det er rigtigt? Gem rapport for {_workDate.ToLongDateString()}?" : $"Gem Rapport for {_workDate.ToLongDateString()}?";
// pop confirmation // pop confirmation
// create a prompt for popup confirmation
Prompt = Report.Figures.Distance > 1000 ? $"'{Report.Figures.Distance}'KM tal er meget højt. Er du sikker på at det er rigtigt? Gem rapport for {_workDate.ToLongDateString()}?" : $"Gem Rapport for {_workDate.ToLongDateString()}?";
ConfirmReportModal.Show(); ConfirmReportModal.Show();
} }
@ -235,8 +256,15 @@ public partial class CrmReportNewPage : IDisposable
InitialValues = data.ReportData; InitialValues = data.ReportData;
Activities = data.ReportItems; Activities = data.ReportItems;
if(!Report.DayTypeEnum.ToLower().Contains("leave")) if (Report.DayTypeEnum.ToLower().Contains("leave"))
Report.Figures.KmMorning = UserPref.KmMorning; {
Report.Figures.KmMorning = 0;
Report.Figures.KmEvening = 0;
}
else
{
Report.Figures.KmMorning = Prefs.KmMorning;
}
NoFigures = false; NoFigures = false;
Working = false; Working = false;

View file

@ -1,7 +1,7 @@
{ {
"appInfo": { "appInfo": {
"name": "Wonky Client", "name": "Wonky Client",
"version": "0.77.1", "version": "0.79.1",
"rc": true, "rc": true,
"sandBox": false, "sandBox": false,
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
@ -14,7 +14,7 @@
"crmProductExt": "history/products", "crmProductExt": "history/products",
"crmReports": "api/v2/crm/advisors/reports", "crmReports": "api/v2/crm/advisors/reports",
"crmActivities": "api/v2/crm/advisors/activities", "crmActivities": "api/v2/crm/advisors/activities",
"crmRpcSyncExt": "invoices/sync", "crmRpcSyncExt": "invoices/rpc",
"crmTasks": "api/v2/crm/advisors/tasks", "crmTasks": "api/v2/crm/advisors/tasks",
"crmWorkplaceExt": "workplaces", "crmWorkplaceExt": "workplaces",
"officeAdvisors": "api/v2/office/users/advisors", "officeAdvisors": "api/v2/office/users/advisors",

View file

@ -22,60 +22,10 @@ namespace Wonky.Entity.DTO;
public class CompanyDto public class CompanyDto
{ {
/// <summary> /// <summary>
/// Name /// Account number
/// </summary>
[Required(ErrorMessage = "Navn skal udfyldes")]
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")]
public string Name { get; set; } = "";
/// <summary>
/// Alert
/// </summary>
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")]
public string Note { get; set; } = "";
/// <summary>
/// Crm note
/// </summary>
public string CrmNotes { get; set; } = "";
/// <summary>
/// Postal code
/// </summary>
[Required(ErrorMessage = "Postnummer skal udfyldes")]
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public string ZipCode { get; set; } = "";
/// <summary>
/// City name
/// </summary>
[Required(ErrorMessage = "Bynavn skal udfyldes")]
[MaxLength(30, ErrorMessage = "Du kan højst bruge 30 tegn")]
public string City { get; set; } = "";
/// <summary>
/// VAT number
/// </summary> /// </summary>
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")] [MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public string VatNumber { get; set; } = ""; public string Account { get; set; } = "";
/// <summary>
/// Company Id
/// </summary>
public string CompanyId { get; set; } = "";
/// <summary>
/// Sales representative entity Id
/// </summary>
public string SalesRepId { get; set; } = "";
/// <summary>
/// SalesRep ERP identifier
/// </summary>
public string SalesRep { get; set; } = "";
/// <summary>
/// Business Central entity Id
/// </summary>
public string BcId { get; set; } = "";
/// <summary> /// <summary>
/// Office address 1 /// Office address 1
@ -89,56 +39,61 @@ public class CompanyDto
[MaxLength(50, ErrorMessage = "Du kan højst bruge 50 tegn")] [MaxLength(50, ErrorMessage = "Du kan højst bruge 50 tegn")]
public string Address2 { get; set; } = ""; public string Address2 { get; set; } = "";
/// <summary>
/// Account number
/// </summary>
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public string Account { get; set; } = "";
/// <summary>
/// Phone number
/// </summary>
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public string Phone { get; set; } = "";
/// <summary>
/// Mobile phone number
/// </summary>
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public string Mobile { get; set; } = "";
/// <summary>
/// Office email
/// </summary>
[MaxLength(80, ErrorMessage = "Du kan højst bruge 80 tegn")]
public string Email { get; set; } = "";
/// <summary> /// <summary>
/// Attention /// Attention
/// </summary> /// </summary>
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")] [MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")]
public string Attention { get; set; } = ""; public string Attention { get; set; } = "";
/// <summary>
/// Business Central entity Id
/// </summary>
public string BcId { get; set; } = "";
/// <summary> /// <summary>
/// ERP block state /// ERP block state
/// </summary> /// </summary>
/// <remarks>Empty string - Customer not blocked</remarks> /// <remarks>Empty string - Customer not blocked</remarks>
public string Blocked { get; set; } = ""; public string Blocked { get; set; } = "";
/// <summary>
/// City name
/// </summary>
[Required(ErrorMessage = "Bynavn skal udfyldes")]
[MaxLength(30, ErrorMessage = "Du kan højst bruge 30 tegn")]
public string City { get; set; } = "";
/// <summary>
/// Company Id
/// </summary>
public string CompanyId { get; set; } = "";
/// <summary> /// <summary>
/// Country code ISO /// Country code ISO
/// </summary> /// </summary>
public string CountryCode { get; set; } = ""; public string CountryCode { get; set; } = "";
/// <summary> /// <summary>
/// Last visit /// Crm note
/// </summary> /// </summary>
public string LastVisit { get; set; } = "2010-01-01"; public string CrmNotes { get; set; } = "";
/// <summary> /// <summary>
/// Next visit /// Office email
/// </summary> /// </summary>
public string NextVisit { get; set; } = "2010-01-01"; [MaxLength(80, ErrorMessage = "Du kan højst bruge 80 tegn")]
public string Email { get; set; } = "";
/// <summary>
/// Value indication if company has shutdown
/// </summary>
/// <value>0 or 1</value>
public int HasFolded { get; set; }
/// <summary>
/// Date for last sync of product history
/// </summary>
public string HistorySync { get; set; } = "";
/// <summary> /// <summary>
/// Interval between visits /// Interval between visits
@ -147,18 +102,57 @@ public class CompanyDto
[Range(1, 52, ErrorMessage = "Angiv interval mellem 1 og 52 uger")] [Range(1, 52, ErrorMessage = "Angiv interval mellem 1 og 52 uger")]
public int Interval { get; set; } = 8; public int Interval { get; set; } = 8;
/// <summary>
/// Value indication if company has shutdown
/// </summary>
/// <value>0 or 1</value>
public int HasFolded { get; set; }
/// <summary> /// <summary>
/// User value for hiding the company is out of business /// User value for hiding the company is out of business
/// </summary> /// </summary>
/// <value>0 or 1</value> /// <value>0 or 1</value>
public int IsHidden { get; set; } public int IsHidden { get; set; }
/// <summary>
/// Last visit
/// </summary>
public string LastVisit { get; set; } = "2010-01-01";
/// <summary>
/// Mobile phone number
/// </summary>
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public string Mobile { get; set; } = "";
/// <summary>
/// Name
/// </summary>
[Required(ErrorMessage = "Navn skal udfyldes")]
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")]
public string Name { get; set; } = "";
/// <summary>
/// Next visit
/// </summary>
public string NextVisit { get; set; } = "2010-01-01";
/// <summary>
/// Alert
/// </summary>
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")]
public string Note { get; set; } = "";
/// <summary>
/// Phone number
/// </summary>
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public string Phone { get; set; } = "";
/// <summary>
/// SalesRep ERP identifier
/// </summary>
public string SalesRep { get; set; } = "";
/// <summary>
/// Sales representative entity Id
/// </summary>
public string SalesRepId { get; set; } = "";
/// <summary> /// <summary>
/// Value indicating the VAT number is valid /// Value indicating the VAT number is valid
/// </summary> /// </summary>
@ -166,18 +160,18 @@ public class CompanyDto
public int ValidVat { get; set; } public int ValidVat { get; set; }
/// <summary> /// <summary>
/// Value indicating if VAT number has changed and should be written to ERP record /// VAT number
/// </summary> /// </summary>
/// <value>0 or 1</value> [MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public int UpdateErpVat { get; set; } public string VatNumber { get; set; } = "";
/// <summary> /// <summary>
/// Date for last sync of product history /// Postal code
/// </summary> /// </summary>
public string HistorySync { get; set; } = ""; [Required(ErrorMessage = "Postnummer skal udfyldes")]
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")]
public string ZipCode { get; set; } = "";
public int IsDirty { get; set; } = 0;
public string Etag { get; set; } = "";
/// <summary> /// <summary>
/// Virtual property indicating if timespan is within the defined interval /// Virtual property indicating if timespan is within the defined interval
/// </summary> /// </summary>