wip - admin print report with orders

This commit is contained in:
Frede Hundewadt 2022-07-01 17:32:20 +02:00
parent 9d161671a0
commit 831959c258
34 changed files with 334 additions and 293 deletions

View file

@ -19,13 +19,13 @@
{
<table class="table table-bordered d-print-table table-striped">
<thead>
<tr class="bg-black opacity-75 text-white border-bottom">
<tr class="bg-dark text-white opacity-75 border-bottom">
<th scope="col">Kunde</th>
<th scope0="col">Bynavn</th>
<th scope="col">Bynavn</th>
<th scope="col">Demo</th>
<th scope="col">Salg</th>
<th scope="col">Notat</th>
<th></th>
<th scope="col">Note</th>
<th class="text-end" scope="col">sas</th>
<th class="text-end" scope="col">Beløb</th>
</tr>
</thead>
@ -33,14 +33,20 @@
@foreach (var activity in Activities)
{
<tr>
<td>@activity.ViewCompany.Name, @activity.ViewCompany.ZipCity</td>
<td>@activity.Company.Name</td>
<td>@activity.Company.City</td>
<td>@activity.Demo</td>
<td>@activity.SalesResume</td>
<td>@activity.Sales</td>
<td>@activity.OfficeNote</td>
<td class="text-end">@activity.</td>
<td class="text-end">@(activity.Closed ? @activity.OrderAmount : 0)</td>
<td class="text-end">@activity.SasAmount</td>
<td class="text-end">@(activity.StatusTypeEnum == "Quote" ? 0 : activity.OrderAmount)</td>
</tr>
}
<tr>
<td colspan="5"></td>
<td class="text-end">Total</td>
<td class="text-end">@Activities.Sum(x => x.OrderAmount)</td>
</tr>
</tbody>
</table>
}

View file

@ -5,5 +5,5 @@ namespace Wonky.Client.Components;
public partial class ActivityTableComponent
{
[Parameter] public List<ActivityReportView> Activities { get; set; }
[Parameter] public List<ActivityListItemView> Activities { get; set; }
}

View file

@ -14,6 +14,6 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
*@
<div>
<img class="spinner pe-3" src="loader.gif" alt="Venter på svar ..."/> Afventer server ...
<div class="spinner-border text-warning" role="status">
<span class="visually-hidden">Loading...</span>
</div>

View file

@ -19,7 +19,7 @@
<thead>
<tr class="bg-dark text-white opacity-75 border-bottom">
<th></th>
<th class="text-center" colspan="2" scope="col">Dagens Demo @(Report.NewDemoCount + Report.RecallDemoCount)</th>
<th class="text-center" colspan="2" scope="col">Dagens Demo @(ReportData.NewDemoCount + ReportData.RecallDemoCount)</th>
<th class="text-center border-end" colspan="2" scope="col">Dagens Resultat</th>
<th class="text-center" colspan="4" scope="col">Måneds Resultat</th>
</tr>
@ -38,47 +38,47 @@
</tr>
<tr>
<th scope="row">N</th>
<td class="text-end">@Report.NewVisitCount</td>
<td class="text-end">@Report.NewDemoCount</td>
<td class="text-end">@Report.NewSaleCount</td>
<td class="text-end border-end">@Report.NewTurnover</td>
<td class="text-end">@Report.NewVisitCountMonth</td>
<td class="text-end">@Report.NewDemoCountMonth</td>
<td class="text-end">@Report.NewSaleCountMonth</td>
<td class="text-end">@Report.NewTurnoverMonth</td>
<td class="text-end">@ReportData.NewVisitCount</td>
<td class="text-end">@ReportData.NewDemoCount</td>
<td class="text-end">@ReportData.NewSaleCount</td>
<td class="text-end border-end">@ReportData.NewTurnover</td>
<td class="text-end">@ReportData.NewVisitCountMonth</td>
<td class="text-end">@ReportData.NewDemoCountMonth</td>
<td class="text-end">@ReportData.NewSaleCountMonth</td>
<td class="text-end">@ReportData.NewTurnoverMonth</td>
</tr>
<tr>
<th scope="row">R</th>
<td class="text-end">@Report.RecallVisitCount</td>
<td class="text-end">@Report.RecallDemoCount</td>
<td class="text-end">@Report.RecallSaleCount</td>
<td class="text-end border-end">@Report.RecallTurnover</td>
<td class="text-end">@Report.RecallVisitCountMonth</td>
<td class="text-end">@Report.RecallDemoCountMonth</td>
<td class="text-end">@Report.RecallSaleCountMonth</td>
<td class="text-end">@Report.RecallTurnoverMonth</td>
<td class="text-end">@ReportData.RecallVisitCount</td>
<td class="text-end">@ReportData.RecallDemoCount</td>
<td class="text-end">@ReportData.RecallSaleCount</td>
<td class="text-end border-end">@ReportData.RecallTurnover</td>
<td class="text-end">@ReportData.RecallVisitCountMonth</td>
<td class="text-end">@ReportData.RecallDemoCountMonth</td>
<td class="text-end">@ReportData.RecallSaleCountMonth</td>
<td class="text-end">@ReportData.RecallTurnoverMonth</td>
</tr>
<tr>
<th scope="row">SAS</th>
<td class="bg-light"></td>
<td class="bg-light"></td>
<td class="text-end">@Report.SasCount</td>
<td class="text-end border-end">@Report.SasTurnover</td>
<td class="text-end">@ReportData.SasCount</td>
<td class="text-end border-end">@ReportData.SasTurnover</td>
<td class="bg-light"></td>
<td class="bg-light"></td>
<td class="text-end">@Report.SasCountMonth</td>
<td class="text-end">@Report.SasTurnoverMonth</td>
<td class="text-end">@ReportData.SasCountMonth</td>
<td class="text-end">@ReportData.SasTurnoverMonth</td>
</tr>
<tr>
<th scope="row">TOTAL</th>
<td class="text-end">@Report.TotalVisitCount</td>
<td class="text-end">@Report.TotalDemoCount</td>
<td class="text-end">@Report.TotalSaleCount</td>
<td class="text-end border-end">@Report.TotalTurnover</td>
<td class="text-end">@Report.TotalVisitCountMonth</td>
<td class="text-end">@Report.TotalDemoCountMonth</td>
<td class="text-end">@Report.TotalSaleCountMonth</td>
<td class="text-end">@Report.TotalTurnoverMonth</td>
<td class="text-end">@ReportData.TotalVisitCount</td>
<td class="text-end">@ReportData.TotalDemoCount</td>
<td class="text-end">@ReportData.TotalSaleCount</td>
<td class="text-end border-end">@ReportData.TotalTurnover</td>
<td class="text-end">@ReportData.TotalVisitCountMonth</td>
<td class="text-end">@ReportData.TotalDemoCountMonth</td>
<td class="text-end">@ReportData.TotalSaleCountMonth</td>
<td class="text-end">@ReportData.TotalTurnoverMonth</td>
</tr>
</tbody>
</table>

View file

@ -6,5 +6,5 @@ namespace Wonky.Client.Components;
public partial class ReportActivityLedgerComponent
{
[Parameter]
public NgSalesReport Report { get; set; }
public SalesReportDataViewModel ReportData { get; set; }
}

View file

@ -17,35 +17,36 @@
<table class="table table-bordered table-striped d-print-table">
<thead>
<tr class="bg-dark text-white opacity-75 border-bottom-0">
<th scope="col">
Km Aften
</th>
<th scope="col">
Km Morgen
</th>
<th scope="col">
Km Kørt Dag
</th>
<th scope="col">
Km Kørt Md.
</th>
<th scope="col">
Km Privat
</th>
<th scope="col">
Km Privat Md.
<tr class="bg-dark text-white opacity-75 border-bottom">
<th colspan="2">
Km regnskab
</th>
</tr>
</thead>
<tbody>
<tr>
<td>@Report.KmEvening</td>
<td>@Report.KmMorning</td>
<td>@Report.Distance</td>
<td>@Report.DistanceMonth</td>
<td>@Report.DistancePrivate</td>
<td>@Report.DistancePrivateMonth</td>
<th scope="row">Km Aften</th>
<td>@ReportData.KmEvening</td>
</tr>
<tr>
<th scope="row">Km Morgen</th>
<td>@ReportData.KmMorning</td>
</tr>
<tr>
<th scope="row">Km Kørt Dag</th>
<td>@ReportData.Distance</td>
</tr>
<tr>
<th scope="row">Km Kørt Md.</th>
<td>@ReportData.DistanceMonth</td>
</tr>
<tr>
<th scope="row">Km Privat</th>
<td>@ReportData.DistancePrivate</td>
</tr>
<tr>
<th scope="row">Km Privat Md.</th>
<td>@ReportData.DistancePrivateMonth</td>
</tr>
</tbody>
</table>

View file

@ -6,6 +6,6 @@ namespace Wonky.Client.Components;
public partial class ReportDistanceLedgerComponent
{
[Parameter]
public NgSalesReport Report { get; set; }
public SalesReportDataViewModel ReportData { get; set; }
}

View file

@ -17,16 +17,46 @@
<table class="table table-bordered table-striped d-print-table">
<thead>
<tr class="bg-black text-white opacity-75 border-bottom">
<th class="w-50" scope="col">Beskrivelse</th>
<th scope="col">Medkørende Supervisor</th>
<tr class="bg-dark text-white opacity-75 border-bottom">
<th colspan="2">
Rapport
</th>
</tr>
</thead>
<tbody>
<tr>
<td>@Report.Description</td>
<td>@Report.SupervisedBy</td>
<th scope="row">Beskrivelse</th>
<td>@ReportData.Description</td>
</tr>
<tr>
<th scope="row">Supervisor</th>
<td>@ReportData.SupervisedBy</td>
</tr>
<tr>
<th scope="row">Dagtype</th>
<td>
@{
switch (ReportData.DayTypeEnum)
{
case "Sales":
<span>Salgsdag: @ReportData.SalesDayNumber</span>
break;
case "SickLeave":
<span>Sygdom</span>
break;
case "Office":
<span>Kontordag</span>
break;
case "Meeting":
<span>Salgsmøde</span>
break;
case "Leave":
<span>Ferie</span>
break;
}
}
</td>
</tr>
</tbody>
</table>

View file

@ -6,6 +6,6 @@ namespace Wonky.Client.Components;
public partial class ReportSummaryComponent
{
[Parameter]
public NgSalesReport Report { get; set; }
public SalesReportDataViewModel ReportData { get; set; }
}

View file

@ -35,9 +35,9 @@ public class AdminReportHttpRepository : IAdminReportHttpRepository
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.AdminAdviserUri}/{userId}/reports");
}
public async Task<NgSalesReportView> GetReport(string userId, string workDate)
public async Task<SalesReportViewModel> GetReport(string userId, string workDate)
{
return await _client.GetFromJsonAsync<NgSalesReportView>($"{_apiConfig.AdminAdviserUri}/{userId}/reports/{workDate}");
return await _client.GetFromJsonAsync<SalesReportViewModel>($"{_apiConfig.AdminAdviserUri}/{userId}/reports/{workDate}");
}
}

View file

@ -7,5 +7,5 @@ namespace Wonky.Client.HttpRepository;
public interface IAdminReportHttpRepository
{
Task<List<NgSalesReportListView>> GetReports(string userId);
Task<NgSalesReportView> GetReport(string userId, string workDate);
Task<SalesReportViewModel> GetReport(string userId, string workDate);
}

View file

@ -8,7 +8,7 @@ public interface IReportHttpRepository
{
Task<bool> ReportExist(string workDate);
Task<List<NgSalesReportListView>> GetReports();
Task<NgSalesReportView> GetReport(string workDate);
Task<SalesReportViewModel> GetReport(string workDate);
Task<ReportInitDto> InitializeReportData(string workDate);
Task<ApiResponseView> PostReport(string workDate, ReportDto reportDto);
}

View file

@ -38,13 +38,13 @@ public class ReportHttpRepository :IReportHttpRepository
{
var result =
await _client
.GetFromJsonAsync<ReportClosedView>($"{_apiConfig.ReportUri}/exist/{workDate}");
.GetFromJsonAsync<SalesReportClosedView>($"{_apiConfig.ReportUri}/exist/{workDate}");
return result.ReportClosed;
}
public async Task<NgSalesReportView> GetReport(string workDate)
public async Task<SalesReportViewModel> GetReport(string workDate)
{
return await _client.GetFromJsonAsync<NgSalesReportView>($"{_apiConfig.ReportUri}/{workDate}");
return await _client.GetFromJsonAsync<SalesReportViewModel>($"{_apiConfig.ReportUri}/{workDate}");
}
public async Task<ReportInitDto> InitializeReportData(string workDate)

View file

@ -52,7 +52,7 @@
<div class="col-md-4">
<InputSelect id="statusType" class="form-select" @bind-Value="@_draft.ActivityStatusEnum">
<option value="noSale" selected>Ingen salg</option>
@if (!string.IsNullOrEmpty(_draft.VatNumber) && string.IsNullOrWhiteSpace(_draft.Address1))
@if (!string.IsNullOrEmpty(_draft.VatNumber) && !string.IsNullOrWhiteSpace(_draft.Address1))
{
<option value="order">Bestilling</option>
<option value="quote">Tilbud</option>
@ -118,21 +118,27 @@
</h2>
<div id="catalogBody" class="accordion-collapse collapse" aria-labelledby="catalogHeader" data-bs-parent="#crmActivity">
<div class="accordion-body">
@* Order draft lines *@
<div class="card">
<div class="card-header">
Kladdelinjer <span class="mx-2 draft-expires-msg">Global kladde (udløber efter @(DraftStateProvider.Draft.TimeToLiveInSeconds / 60)m inaktivitet)</span>
</div>
<div class="card-body">
<table class="table table-hover table-striped justify-content-center">
<div class="row">
<div class="col">
@* Order draft lines *@
<table class="table table-hover table-striped table-bordered">
<thead>
<tr>
<tr class="bg-dark text-white">
<th scope="col" colspan="6">
Ordrekladde <span class="mx-2 draft-expires-msg">Global kladde (udløber efter @(DraftStateProvider.Draft.TimeToLiveInSeconds / 60)m inaktivitet)</span>
</th>
<th scope="col" class="text-end">
<button type="button" class="btn btn-danger btn-sm" @onclick="@DeleteDraft" disabled="@(DraftStateProvider.Draft.Items.Count == 0)">Slet kladde</button>
</th>
</tr>
<tr class="bg-dark opacity-75 text-white">
<th scope="col">Navn</th>
<th scope="col" class="text-nowrap">Varenr</th>
<th scope="col" class="text-end">Antal</th>
<th scope="col" class="text-end">Enhedspris</th>
<th scope="col" class="text-end">Linjesum</th>
<th scope="col">&nbsp;</th>
<th scope="col" class="text-end">SAS</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@ -146,119 +152,102 @@
<td class="text-end">@cItem.Quantity</td>
<td class="text-end">@cItem.Price</td>
<td class="text-end">@cItem.LineTotal</td>
<td>
<td class="text-center">
<input type="checkbox" checked="@cItem.Sas" disabled/>
</td>
<td>
<button type="button" class="btn btn-warning" @onclick="@(() => RemoveItem(@cItem))">Slet</button>
<td class="text-end">
<button type="button" class="btn btn-danger" @onclick="@(() => RemoveItem(@cItem))">Slet Linje</button>
</td>
</tr>
}
<tr>
<td></td>
<td></td>
<td></td>
<td class="text-black text-end fw-bold">Total</td>
<td class="text-black text-end fw-bold">@DraftStateProvider.Draft.Total</td>
<td></td>
</tr>
}
<tr>
<td></td>
<td></td>
<td></td>
<td class="text-black text-end fw-bold">Total</td>
<td class="text-black text-end fw-bold">@DraftStateProvider.Draft.Total</td>
<td></td>
</tr>
</tbody>
</table>
<div class="row">
<div class="col">
<button type="button" class="btn btn-danger" @onclick="@DeleteDraft" disabled="@(DraftStateProvider.Draft.Items.Count == 0)">
Slet kladde
</button>
</div>
</div>
</div>
</div>
@* draft line *@
@if (_selectedItem != null && ShowItem)
{
<div class="card mb-3 mt-3">
<div class="card-header bg-dark fw-bold text-white">Kladdelinje</div>
<div class="card-body">
<div class="row">
<div class="col col-md-4 fw-bold">
Varenavn
</div>
<div class="col fw-bold">
Varenr
</div>
<div class="col fw-bold">
Antal
</div>
<div class="col fw-bold">
Pris
</div>
<div class="col">
Rabat
</div>
<div class="col">
SAS
</div>
<div class="col">
</div>
</div>
<div class="row">
<div class="col col-md-4">
@_selectedItem.Name
</div>
<div class="col">
@_selectedItem.Sku
</div>
<div class="col">
<input type="number" class="form-control" @bind-value="@Quantity"/>
</div>
<div class="col">
<input type="number" class="form-control" @bind-value="@Price"/>
</div>
<div class="col">
<input type="number" class="form-control" @bind-value="@Discount"/>
</div>
<div class="col">
<input type="checkbox" class="form-check" @bind-value="@Sas"/>
</div>
<div class="col">
<button type="button" class="btn btn-info" @onclick="@(() => AddItem(_selectedItem))">Læg til</button>
</div>
</div>
</div>
<div class="row">
<div class="col">
@* draft line *@
@if (_selectedItem != null && ShowItem)
{
<table id="draft-line" class="table table-bordered">
<thead>
<tr class="bg-dark text-white">
<th scope="col" colspan="6">Kladdelinje</th>
</tr>
<tr>
<th scope="col">Antal</th>
<th scope="col">Pris</th>
<th scope="col">Rabat</th>
<th scope="col">SAS</th>
<th scope="col">Varenr.</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="number" class="form-control" @bind-value="@Quantity"/>
</td>
<td>
<input type="number" class="form-control" @bind-value="@Price"/>
</td>
<td>
<input type="number" class="form-control" @bind-value="@Discount"/>
</td>
<td>
<input type="checkbox" class="form-check" @bind-value="@Sas"/>
</td>
<td>@_selectedItem.Sku</td>
<td>
<button type="button" class="btn btn-warning text-nowrap d-block" @onclick="@(() => AddItem(_selectedItem))">@_selectedItem.Name</button>
</td>
</tr>
</tbody>
</table>
}
</div>
}
@* catalog *@
<div class="card">
<div class="card-body">
<div class="row mb-2">
<div class="col">
<ItemGroupComponent OnChanged="SetItemGroup"/>
</div>
<div class="row">
<div class="col">
@* catalog *@
<div class="sticky-top bg-success bg-opacity-50 rounded-2 px-3 pt-3">
<div class="row mb-2">
<div class="col">
<ItemGroupComponent OnChanged="SetItemGroup"/>
</div>
<div class="col">
<ItemSearchComponent OnChanged="SetSearchCol"/>
</div>
<div class="col">
<SearchPhraseComponent OnChanged="SetSearchPhrase"/>
</div>
<div class="col">
<ItemSortComponent OnChanged="SetSortCol"/>
</div>
<div class="col">
<PageSizeComponent OnChanged="SetPageSize"></PageSizeComponent>
</div>
</div>
<div class="col">
<ItemSearchComponent OnChanged="SetSearchCol"/>
</div>
<div class="col">
<SearchPhraseComponent OnChanged="SetSearchPhrase"/>
</div>
<div class="col">
<ItemSortComponent OnChanged="SetSortCol"/>
</div>
<div class="col">
<PageSizeComponent OnChanged="SetPageSize"></PageSizeComponent>
<div class="row">
<div class="col">
<PaginationComponent MetaData="_metaData" Spread="2" SelectedPage="SelectedPage"></PaginationComponent>
</div>
</div>
</div>
<div class="row">
<div class="col">
<PaginationComponent MetaData="_metaData" Spread="2" SelectedPage="SelectedPage"></PaginationComponent>
</div>
</div>
@if (_caltalog.Any())
@if (_catalog.Any())
{
<table class="table table-hover table-striped justify-content-center">
<thead>
<tr class="bg-black bg-opacity-50 text-white rounded-2">
<tr class="bg-dark bg-opacity-50 text-white rounded-2">
<th scope="col">Navn</th>
<th scope="col" class="text-nowrap">Varenr</th>
<th scope="col" class="text-nowrap">Fork</th>
@ -266,7 +255,7 @@
</tr>
</thead>
<tbody>
@foreach (var item in _caltalog)
@foreach (var item in _catalog)
{
<tr>
<td>@item.Name</td>
@ -279,9 +268,9 @@
<li class="list-group-item d-flex justify-content-between align-items-end">
<div class="text-sm-start px-2">@rate.Quantity</div>
<div class="text-sm-end">@rate.Rate</div>
<button type="button" class="btn btn-primary btn-sm" @onclick="@(() => SelectItem(item.ItemId, rate.Quantity, rate.Rate))">
<a class="btn btn-primary" href="#draft-line" @onclick="@(() => SelectItem(item.ItemId, rate.Quantity, rate.Rate))">
Vælg
</button>
</a>
</li>
}
</ul>
@ -293,7 +282,7 @@
}
else
{
<AppSpinner/>
<div>Der er ingen data</div>
}
</div>
</div>

View file

@ -50,7 +50,7 @@ public partial class ActivityVisitNew : IDisposable
// variables
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions{PropertyNameCaseInsensitive = true};
private SalesItemView _selectedItem { get; set; } = new();
private List<SalesItemView> _caltalog { get; set; } = new();
private List<SalesItemView> _catalog { get; set; } = new();
private MetaData _metaData { get; set; } = new();
private Preferences _prefs { get; set; } = new();
private ActivityDto _draft { get; set; } = new();
@ -194,7 +194,7 @@ public partial class ActivityVisitNew : IDisposable
private void SelectItem(string itemId, string quantity, string price)
{
ShowItem = true;
_selectedItem = (from x in _caltalog where x.ItemId == itemId select x).First();
_selectedItem = (from x in _catalog where x.ItemId == itemId select x).First();
Price = price;
Quantity = quantity;
}
@ -230,14 +230,14 @@ public partial class ActivityVisitNew : IDisposable
}
private async Task SetItemGroup(string groupFilter)
{
_caltalog = new List<SalesItemView>();
_catalog = new List<SalesItemView>();
_paging.PageNumber = 1;
_paging.SelectGroup = groupFilter;
await GetSalesItems();
}
private async Task SetSearchCol(string columnName)
{
_caltalog = new List<SalesItemView>();
_catalog = new List<SalesItemView>();
_paging.PageNumber = 1;
_paging.SearchTerm = "";
_paging.SearchColumn = columnName;
@ -245,27 +245,27 @@ public partial class ActivityVisitNew : IDisposable
}
private async Task SetSortCol(string orderBy)
{
_caltalog = new List<SalesItemView>();
_catalog = new List<SalesItemView>();
_paging.OrderBy = orderBy;
await GetSalesItems();
}
private async Task SetSearchPhrase(string searchTerm)
{
_caltalog = new List<SalesItemView>();
_catalog = new List<SalesItemView>();
_paging.PageNumber = 1;
_paging.SearchTerm = searchTerm;
await GetSalesItems();
}
private async Task SelectedPage(int page)
{
_caltalog = new List<SalesItemView>();
_catalog = new List<SalesItemView>();
_paging.PageNumber = page;
await GetSalesItems();
}
private async Task SetPageSize(string pageSize)
{
_caltalog = new List<SalesItemView>();
_catalog = new List<SalesItemView>();
_paging.PageSize = Convert.ToInt32(pageSize);
_paging.PageNumber = 1;
await GetSalesItems();
@ -274,7 +274,7 @@ public partial class ActivityVisitNew : IDisposable
private async Task GetSalesItems()
{
var response = await _itemRepo.GetSalesItemsPaged(_paging);
_caltalog = response.Items!;
_catalog = response.Items!;
_metaData = response.MetaData;
}

View file

@ -20,7 +20,7 @@
@page "/admin/users/advisers/{CountryCode}/{UserId}/reports/{ReportDate}"
@attribute [Authorize(Roles = "Admin")]
<PageTitle>@_report.Report.Name</PageTitle>
<PageTitle>@_report.ReportData.Name</PageTitle>
<div class="card">
<div class="card-header bg-dark text-white">
@ -31,19 +31,32 @@
<h2 class="workDate">@DateTime.Parse(ReportDate).ToLongDateString()</h2>
}
</div>
<div class="col d-print-none justify-content-center">
<WorkDateComponent OnChanged="GetReport"></WorkDateComponent>
</div>
<div class="col col-sm-1 d-print-none">
<button class="btn btn-warning" type="button" onclick="window.print();">Print</button>
</div>
<div class="col d-none d-print-block text-end">
<h3>@_report.Report.Name</h3>
<h3>@_report.ReportData.Name</h3>
</div>
</div>
</div>
<div class="card-body">
<ReportSummaryComponent Report="_report.Report"></ReportSummaryComponent>
<ActivityTableComponent Activities="_report.Activities"></ActivityTableComponent>
<div class="row">
<div class="col w-75">
<ReportSummaryComponent ReportData="_report.ReportData"></ReportSummaryComponent>
</div>
<div class="col w-25">
<ReportDistanceLedgerComponent ReportData="_report.ReportData"></ReportDistanceLedgerComponent>
</div>
</div>
<div class="row">
<div class="col">
<ActivityTableComponent Activities="_report.Activities"></ActivityTableComponent>
</div>
</div>
<div class="row">
<div class="col">
<ReportActivityLedgerComponent ReportData="_report.ReportData"></ReportActivityLedgerComponent>
</div>
</div>
</div>
</div>

View file

@ -11,24 +11,21 @@ public partial class AdminSalesReportView
[Parameter] public string UserId { get; set; } = "";
[Parameter] public string CountryCode { get; set; } = "";
[Inject] private IAdminReportHttpRepository _reportRepo { get; set; }
private NgSalesReportView _report { get; set; } = new();
private SalesReportViewModel _report { get; set; } = new();
protected override async Task OnInitializedAsync()
protected override async Task OnParametersSetAsync()
{
if (!string.IsNullOrWhiteSpace(ReportDate))
{
await GetReport(ReportDate);
}
await GetReport(ReportDate);
}
private async Task GetReport(string workDate)
{
ReportDate = workDate;
_report = new NgSalesReportView();
_report = new SalesReportViewModel();
_report = await GetUserReport(UserId, workDate);
}
private async Task<NgSalesReportView> GetUserReport(string userId, string workDate)
private async Task<SalesReportViewModel> GetUserReport(string userId, string workDate)
{
return _report = await _reportRepo.GetReport(userId, workDate);
}

View file

@ -24,13 +24,13 @@
<div class="card">
<div class="card-header bg-dark text-white rounded-2">
<div class="row">
<div class="col justify-content-center">
<div class="col-md-6 justify-content-center">
<h3 class="workDate">@(_workDate.ToLongDateString())</h3>
</div>
<div class="col justify-content-center">
<div class="col-md-4 justify-content-center">
<WorkDateComponent OnChanged="SetWorkDate"></WorkDateComponent>
</div>
<div class="col justify-content-center">
<div class="col-md-2 justify-content-center">
@if (_working)
{
<AppSpinner></AppSpinner>
@ -222,28 +222,32 @@
<table class="table">
<thead>
<tr class="bg-black opacity-75 text-white">
<th scope="col">Besøg</th>
<th scope="col">Kunde</th>
<th scope="col">Bynavn</th>
<th scope="col">Demo</th>
<th scope="col">Salg</th>
<th></th>
<th class="text-end" scope="col">Beløb</th>
<th scope="col">Note</th>
<th scope="col" class="text-end">sas</th>
<th scope="col" class="text-end">Beløb</th>
</tr>
</thead>
<tbody>
@foreach (var activity in _activities)
{
<tr>
<td>@activity.ViewCompany.Name - @activity.ViewCompany.ZipCity</td>
<td>@activity.Company.Name</td>
<td>@activity.Company.City</td>
<td>@activity.Demo</td>
<td>@activity.SalesResume</td>
<td class="align-content-end">@activity.OrderAmount</td>
<td>@activity.Sales</td>
<td>@activity.OfficeNote</td>
<td class="text-end">@activity.SasAmount</td>
<td class="text-end">@activity.OrderAmount</td>
</tr>
}
<tr>
<td></td>
<td></td>
<td>Total</td>
<td class="align-content-end">@_report.Figures.TotalTurnover</td>
<td colspan="5"></td>
<td class="text-end">Total</td>
<td class="text-end">@_activities.Sum(x => x.OrderAmount)</td>
</tr>
</tbody>
</table>

View file

@ -40,7 +40,7 @@ public partial class SalesReportNew : IDisposable
[Inject] private IToastService _toast { get; set; }
private EditContext _editContext { get; set; }
private ReportDto _report { get; set; } = new();
private List<ActivityViewReport> _activities { get; set; } = new();
private List<ActivityListItemView> _activities { get; set; } = new();
private ReportFiguresDto _init { get; set; }
private Preferences _prefs { get; set; } = new();
private bool _formInvalid = true;
@ -118,6 +118,7 @@ public partial class SalesReportNew : IDisposable
checkOut = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkOut.Hour, _checkOut.Minute, 0);
}
_report.SalesDayNumber = _report.DayTypeEnum == "sales" ? _report.Figures.SalesDayCount + 1 : 0;
_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);
@ -151,7 +152,7 @@ public partial class SalesReportNew : IDisposable
_noFigures = true;
_report.Figures = new ReportFiguresDto();
_init = new ReportFiguresDto();
_activities = new List<ActivityViewReport>();
_activities = new List<ActivityListItemView>();
_report.Figures.KmEvening = 0;
_report.Figures.KmMorning = 0;
_report.Figures.Distance = 0;

View file

@ -20,7 +20,7 @@
@page "/sales-reports/view/{ReportDate}"
@attribute [Authorize(Roles = "Adviser,Admin,Supervisor")]
<PageTitle>@_report.Report.Name</PageTitle>
<PageTitle>@_report.ReportData.Name</PageTitle>
<div class="card">
<div class="card-header bg-dark text-white">
@ -38,12 +38,20 @@
<button class="btn btn-warning" type="button" onclick="window.print();">Print</button>
</div>
<div class="col d-none d-print-block text-end">
<h3>@_report.Report.Name</h3>
<h3>@_report.ReportData.Name</h3>
</div>
</div>
</div>
<div class="card-body">
<ReportSummaryComponent Report="_report.Report"></ReportSummaryComponent>
<div class="row">
<div class="col w-75">
<ReportSummaryComponent ReportData="_report.ReportData"></ReportSummaryComponent>
</div>
<div class="col w-25">
<ReportDistanceLedgerComponent ReportData="_report.ReportData"></ReportDistanceLedgerComponent>
</div>
</div>
<ActivityTableComponent Activities="_report.Activities"></ActivityTableComponent>
<ReportActivityLedgerComponent ReportData="_report.ReportData"></ReportActivityLedgerComponent>
</div>
</div>

View file

@ -9,7 +9,7 @@ public partial class SalesReportView
{
[Parameter] public string ReportDate { get; set; }
[Inject] private IReportHttpRepository _reportRepo { get; set; }
private NgSalesReportView _report { get; set; } = new();
private SalesReportViewModel _report { get; set; } = new();
protected override async Task OnInitializedAsync()
{
@ -22,7 +22,7 @@ public partial class SalesReportView
private async Task GetReport(string workDate)
{
ReportDate = workDate;
_report = new NgSalesReportView();
_report = new SalesReportViewModel();
_report = await _reportRepo.GetReport(workDate);
}
}

View file

@ -1,12 +1,12 @@
{
"appInfo": {
"name": "Wonky Client",
"version": "0.8.80",
"version": "0.8.83",
"isBeta": true,
"image": "grumpy-coder.png"
},
"apiConfig": {
"innoBaseUrl": "https://app.innotec.dk",
"innoBaseUrl": "https://dev.innotec.dk",
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
"glsId": "",
"virkUrl": "api/v2/services/virk",

View file

@ -10,6 +10,11 @@ public class ReportDto
/// <remarks>System generated</remarks>
public string Name { get; set; } = "";
/// <summary>
/// Sales day counter
/// </summary>
public int SalesDayNumber { get; set; }
/// <summary>
/// Report description
/// </summary>

View file

@ -5,7 +5,7 @@ public class ReportFiguresDto
/// <summary>
/// Sales day number
/// </summary>
public int SalesDayNumber { get; set; }
public int SalesDayCount { get; set; }
/// <summary>
/// Distance today

View file

@ -1,4 +1,5 @@
using Wonky.Entity.Models;
using Wonky.Entity.Views;
namespace Wonky.Entity.DTO;
@ -17,6 +18,6 @@ public class ReportInitDto
/// <summary>
/// List of activities for report
/// </summary>
public List<ActivityViewReport> Activities { get; set; }
public List<ActivityListItemView> Activities { get; set; }
}

View file

@ -0,0 +1,7 @@
namespace Wonky.Entity.Views;
public class ActivityCompanyView
{
public string Name { get; set; } = "";
public string City { get; set; } = "";
}

View file

@ -1,13 +1,16 @@
using Wonky.Entity.Views;
namespace Wonky.Entity.Views;
namespace Wonky.Entity.DTO;
public class ActivityViewReport
public class ActivityListItemView
{
/// <summary>
/// Company Info in listing
/// </summary>
public ActivityViewCompany ViewCompany { get; set; } = new();
public ActivityCompanyView Company { get; set; } = new();
/// <summary>
/// Processing note to office
/// </summary>
public string OfficeNote { get; set; } = "";
/// <summary>
/// Total amount
@ -49,6 +52,11 @@ public class ActivityViewReport
/// </summary>
public string VisitTypeEnum { get; set; } = "";
/// <summary>
/// Status type enum as string
/// </summary>
public string StatusTypeEnum { get; set; } = "";
/// <summary>
/// Demonstration
/// </summary>
@ -57,6 +65,6 @@ public class ActivityViewReport
/// <summary>
/// Sales resume
/// </summary>
public string SalesResume { get; set; } = "";
public string Sales { get; set; } = "";
}

View file

@ -3,5 +3,5 @@ namespace Wonky.Entity.Views;
public class ActivityListReportView
{
public bool ReportClosed { get; set; }
public List<ActivityReportView> Activities { get; set; } = new();
public List<ActivityListItemView> Activities { get; set; } = new();
}

View file

@ -1,19 +0,0 @@
namespace Wonky.Entity.Views;
public class ActivityReportView
{
public ActivityViewCompany ViewCompany { get; set; } = new();
public string SalesHeadId { get; set; } = "";
public string OfficeNote { get; set; } = "";
public string StatusTypeEnum { get; set; } = "";
public bool Closed { get; set; }
public string OrderDate { get; set; } = "";
public string ReferenceNumber { get; set; } = "";
public string YourRef { get; set; } = "";
public decimal OrderAmount { get; set; }
public decimal SasAmount { get; set; }
public string VisitTypeEnum { get; set; } = "";
public string Demo { get; set; } = "";
public string SalesResume { get; set; } = "";
}

View file

@ -1,11 +0,0 @@
namespace Wonky.Entity.Views;
public class ActivityViewCompany
{
public string CompanyId { get; set; } = "";
public string Account { get; set; } = "";
public string Name { get; set; } = "";
public string ZipCity { get; set; } = "";
public string Phone { get; set; } = "";
public string VatNumber { get; set; } = "";
}

View file

@ -1,7 +0,0 @@
namespace Wonky.Entity.Views;
public class NgSalesReportView
{
public NgSalesReport Report { get; set; } = new();
public List<ActivityReportView> Activities { get; set; } = new ();
}

View file

@ -1,6 +1,6 @@
namespace Wonky.Entity.Views;
public class ReportClosedView
public class SalesReportClosedView
{
public bool ReportClosed { get; set; }
}

View file

@ -1,6 +1,6 @@
namespace Wonky.Entity.Views;
public class NgSalesReport
public class SalesReportDataViewModel
{
public string ReportId { get; set; } = "";
public string ErpUserId { get; set; } = "";
@ -8,10 +8,11 @@ public class NgSalesReport
public string SupervisedBy { get; set; } = "";
public string Description { get; set; } = "";
public string DayTypeEnum { get; set; } = "";
public long ReportDate { get; set; }
public long FromDateTime { get; set; }
public long ToDateTime { get; set; }
public string ReportDate { get; set; } = "";
public string FromDateTime { get; set; } = "";
public string ToDateTime { get; set; } = "";
public bool Closed { get; set; }
public int SalesDayNumber { get; set; }
// workday
public int NewVisitCount { get; set; }
public int RecallVisitCount { get; set; }

View file

@ -0,0 +1,7 @@
namespace Wonky.Entity.Views;
public class SalesReportViewModel
{
public SalesReportDataViewModel ReportData { get; set; } = new();
public List<ActivityListItemView> Activities { get; set; } = new ();
}