code cleanup
This commit is contained in:
parent
54daf9c054
commit
c13252da37
156 changed files with 2533 additions and 951 deletions
|
@ -36,5 +36,4 @@ else
|
|||
if (!string.IsNullOrWhiteSpace(CompanyId))
|
||||
ActionLink = ActionLink.Replace("$ID$", CompanyId);
|
||||
}
|
||||
|
||||
}
|
|
@ -21,6 +21,6 @@ namespace Wonky.Client.Components;
|
|||
public partial class AdvisorActivityListComponent
|
||||
{
|
||||
[Parameter] public List<ReportItemView> ActivityList { get; set; } = new();
|
||||
[Inject] private NavigationManager Navigator { get; set; }
|
||||
// [Inject] private NavigationManager Navigator { get; set; }
|
||||
|
||||
}
|
|
@ -70,4 +70,5 @@ else
|
|||
{
|
||||
<div>Ingen data</div>
|
||||
}
|
||||
|
||||
<InformationModal BodyMessage="@InfoMessage"/>
|
|
@ -24,6 +24,7 @@ using Wonky.Client.Shared;
|
|||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components
|
||||
{
|
||||
|
@ -33,9 +34,9 @@ namespace Wonky.Client.Components
|
|||
[Parameter] public EventCallback<string> OnDelete { get; set; }
|
||||
[Parameter] public EventCallback<string> OnSelect { get; set; }
|
||||
[Inject] private NavigationManager Navigator { get; set; }
|
||||
[Inject] private IJSRuntime Js { get; set; }
|
||||
[Inject] private IJSRuntime JsRuntime { get; set; }
|
||||
|
||||
private Lazy<IJSObjectReference> BsTooltip = new();
|
||||
private Lazy<IJSObjectReference> BsTooltip { get; set; } = new();
|
||||
|
||||
private InformationModal InformationModal { get; set; } = new();
|
||||
private string InfoMessage { get; set; } = "";
|
||||
|
|
|
@ -30,7 +30,7 @@ using Wonky.Entity.Models;
|
|||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
public partial class LandingComponentAdvisor
|
||||
public partial class AdvisorLandingComponent
|
||||
{
|
||||
[Inject] private UserProfileService ProfileService { get; set; }
|
||||
|
|
@ -13,10 +13,10 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Text.RegularExpressions;
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Services;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
|
|
|
@ -13,10 +13,7 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Blazored.Toast.Services;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Models;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Services;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Services;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
|
||||
@using Wonky.Client.OverlayCustomer
|
||||
<div class="list-group">
|
||||
<div class="list-group-item">
|
||||
<div class="row">
|
||||
|
@ -72,4 +72,4 @@
|
|||
}
|
||||
</div>
|
||||
|
||||
<CustomerActivityViewModalOverlay ReportItem="Activity" @ref="ActivityViewOverlay"/>
|
||||
<CustomerActivityViewOverlay ReportItem="Activity" @ref="ActivityViewOverlay"/>
|
|
@ -13,22 +13,16 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Globalization;
|
||||
using System.Runtime.InteropServices;
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Client.OverlayCustomer;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
public partial class CustomerVisitListComponent
|
||||
public partial class CustomerActivityListComponent
|
||||
{
|
||||
[Parameter] public List<ReportItemView> Activities { get; set; } = new();
|
||||
private CustomerActivityViewModalOverlay ActivityViewOverlay { get; set; } = new();
|
||||
private CustomerActivityViewOverlay ActivityViewOverlay { get; set; } = new();
|
||||
|
||||
private ReportItemView Activity { get; set; } = new();
|
||||
|
||||
|
@ -37,5 +31,4 @@ public partial class CustomerVisitListComponent
|
|||
Activity = Activities.First(x => x.ActivityId == activityId);
|
||||
ActivityViewOverlay.Show();
|
||||
}
|
||||
|
||||
}
|
|
@ -23,7 +23,7 @@
|
|||
@if (Inventory.Any())
|
||||
{
|
||||
<div class="list-group mt-2">
|
||||
<div class="list-group-item bg-dark text-white">
|
||||
<div class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="col-sm-4" style="cursor: pointer;" @onclick="() => SortProducts(PSort.Desc)"><i class="bi-sort-alpha-down"></i> Navn <i class="bi-sort-alpha-up-alt"></i></div>
|
||||
<div class="col-sm-3" style="cursor: pointer;" @onclick="() => SortProducts(PSort.Sku)"><i class="bi-sort-alpha-down"></i> Varenr <i class="bi-sort-alpha-up-alt"></i></div>
|
||||
|
@ -45,7 +45,6 @@
|
|||
<span class="visually-hidden">Produktet er udgået</span>
|
||||
}
|
||||
</div>
|
||||
@* @product.Description <span class="fw-bold text-sm-start">@(product.Discontinued ? "(UDGÅET)" : "")</span> *@
|
||||
</div>
|
||||
<div class="col-sm-3">
|
||||
@product.Sku
|
||||
|
|
|
@ -13,17 +13,13 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Globalization;
|
||||
using System.Runtime.InteropServices;
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
public partial class CustomerInventoryListComponent
|
||||
{
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
//
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
@if (ProductList.Any())
|
||||
{
|
||||
<div class="list-group mt-2">
|
||||
<div class="list-group-item bg-dark text-white">
|
||||
<div class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="col-sm-4" style="cursor: pointer;" @onclick="() => SortProducts(PSort.Desc)"><i class="bi-sort-alpha-down"></i> Navn <i class="bi-sort-alpha-up-alt"></i></div>
|
||||
<div class="col-sm-3" style="cursor: pointer;" @onclick="() => SortProducts(PSort.Sku)"><i class="bi-sort-alpha-down"></i> Varenr <i class="bi-sort-alpha-up-alt"></i></div>
|
||||
|
|
|
@ -13,15 +13,11 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Globalization;
|
||||
using System.Runtime.InteropServices;
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
public partial class CustomerProductCheckListComponent
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
{
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr class="bg-black text-white rounded-2 opacity-75">
|
||||
<tr class="rounded-2 border border-1">
|
||||
<th scope="col">
|
||||
Dato
|
||||
</th>
|
||||
|
|
|
@ -15,10 +15,10 @@
|
|||
//
|
||||
|
||||
|
||||
using System.Security.AccessControl;
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Services;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@ using System.Timers;
|
|||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Services;
|
||||
using Timer = System.Timers.Timer;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components
|
||||
{
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Services;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components
|
||||
{
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
@using Wonky.Client.Components;
|
||||
@using Wonky.Client.Helpers;
|
||||
|
||||
@using Wonky.Client.OverlayOffice
|
||||
@if (CompanyList.Any())
|
||||
{
|
||||
<div class="row d-flex g-3">
|
||||
|
@ -52,13 +52,13 @@
|
|||
<div class="card-footer">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<button class="btn btn-danger" disabled>Faktura</button>
|
||||
<button class="btn btn-danger" @onclick="() => ShowInvoiceList(company.CompanyId)" >Faktura</button>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button class="btn btn-warning" disabled>Aktivitet</button>
|
||||
<button class="btn btn-warning" @onclick="() => ShowActivityList(company.CompanyId)" >Aktivitet</button>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button class="btn btn-success" disabled>Produkt</button>
|
||||
<button class="btn btn-success" @onclick="() => ShowProductList(company.CompanyId)">Produkt</button>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button class="btn btn-primary" disabled >Bestilling</button>
|
||||
|
@ -74,12 +74,8 @@ else
|
|||
{
|
||||
<div>Ingen data</div>
|
||||
}
|
||||
@*
|
||||
<CustomerInvoiceListModalOverlay CustomerInvoices="Invoices" @ref="InvoiceListOverlay" />
|
||||
|
||||
<CustomerActivityListModalOverlay Activities="Activities" CompanyName="@CompanyName" @ref="ActivityListOverlay" />
|
||||
|
||||
<CustomerInventoryListModalOverlay CompanyName="@CompanyName" CompanyId="@CompanyId" CountryCode="@CountryCode"
|
||||
OnInventorySelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay" />
|
||||
*@
|
||||
<OfficeCustomerInvoiceListOverlay Company="@SelectedCompany" CustomerInvoices="@InvoiceViewList" @ref="InvoiceListOverlay" />
|
||||
<OfficeCustomerActivityListOverlay Activities="ActivityList" Company="SelectedCompany" @ref="ActivityListOverlay" />
|
||||
<OfficeCustomerProductListOverlay Company="SelectedCompany" ProductList="ProductList" @ref="ProductListOverlay" />
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
|
@ -14,13 +13,12 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Helpers;
|
||||
using Wonky.Client.Services;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.OverlayOffice;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components
|
||||
{
|
||||
|
@ -29,19 +27,54 @@ namespace Wonky.Client.Components
|
|||
[Parameter] public List<CompanyDto> CompanyList { get; set; } = new();
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
|
||||
private CustomerInvoiceListModalOverlay InvoiceListOverlay { get; set; } = new();
|
||||
private CustomerInventoryListModalOverlay InventoryListOverlay { get; set; } = new();
|
||||
private CustomerActivityListModalOverlay ActivityListOverlay { get; set; } = new();
|
||||
[Inject] public ICountryCustomerHistoryRepository HistoryRepo { get; set; }
|
||||
[Inject] public ICountryActivityRepository ActivityRepo { get; set; }
|
||||
|
||||
private OfficeCustomerInvoiceListOverlay InvoiceListOverlay { get; set; } = new();
|
||||
private OfficeCustomerActivityListOverlay ActivityListOverlay { get; set; } = new();
|
||||
private OfficeCustomerProductListOverlay ProductListOverlay { get; set; } = new();
|
||||
|
||||
private string CompanyName { get; set; } = "";
|
||||
private string CompanyId { get; set; } = "";
|
||||
private InvoiceListView Invoices { get; set; } = new();
|
||||
private List<ReportItemView> Activities { get; set; } = new();
|
||||
private List<ProductHistoryView> Inventory { get; set; } = new();
|
||||
private string LastSync { get; set; } = "";
|
||||
|
||||
private InvoiceListView InvoiceViewList { get; set; } = new();
|
||||
private List<ReportItemView> ActivityList { get; set; } = new();
|
||||
private List<ProductInventoryView> ProductList { get; set; } = new();
|
||||
private CompanyDto SelectedCompany { get; set; } = new();
|
||||
|
||||
private void OnInventoryCallback()
|
||||
{
|
||||
}
|
||||
|
||||
private async Task ShowInvoiceList(string companyId)
|
||||
{
|
||||
// call erp to crm sync before requesting invoices
|
||||
// get company last sync from company list
|
||||
SelectedCompany = CompanyList.Find(x => x.CompanyId == companyId);
|
||||
var newSyncDate = await HistoryRepo.InvoiceErpToCrmRpc(CountryCode, companyId, SelectedCompany.HistorySync);
|
||||
await Task.Delay(500);
|
||||
InvoiceViewList = await HistoryRepo.FetchInvoiceList(CountryCode, companyId);
|
||||
SelectedCompany.HistorySync = newSyncDate;
|
||||
InvoiceListOverlay.Show();
|
||||
}
|
||||
|
||||
private async Task ShowActivityList(string companyId)
|
||||
{
|
||||
// call erp to crm sync before requesting invoices
|
||||
// get company last sync from company list
|
||||
SelectedCompany = CompanyList.Find(x => x.CompanyId == companyId);
|
||||
ActivityList = await ActivityRepo.GetCustomerActivities(companyId);
|
||||
ActivityListOverlay.Show();
|
||||
}
|
||||
|
||||
private async Task ShowProductList(string companyId)
|
||||
{
|
||||
// call erp to crm sync before requesting invoices
|
||||
// get company last sync from company list
|
||||
SelectedCompany = CompanyList.Find(x => x.CompanyId == companyId);
|
||||
ProductList = await HistoryRepo.FetchInventory(SelectedCompany.CountryCode, SelectedCompany.CompanyId);
|
||||
ProductListOverlay.Show();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
@using Wonky.Client.OverlayOffice
|
||||
<div class="list-group">
|
||||
<div class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h4>Dato</h4>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h4>Demo</h4>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h4>Salg</h4>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h4>Ordre Note</h4>
|
||||
</div>
|
||||
<div class="col">
|
||||
<h4>Ordre Note</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (Activities.Any())
|
||||
{
|
||||
@foreach (var activity in Activities)
|
||||
{
|
||||
<div class="list-group-item list-group-item-action" style="cursor: pointer" @onclick="() => ShowVisitOverlay(activity.ActivityId)">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
@activity.OrderDate
|
||||
</div>
|
||||
<div class="col">
|
||||
@activity.Demo
|
||||
</div>
|
||||
<div class="col">
|
||||
@activity.Sales
|
||||
</div>
|
||||
<div class="col">
|
||||
@activity.OfficeNote
|
||||
</div>
|
||||
<div class="col">
|
||||
@activity.CrmNote
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
Ingen data
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<OfficeCustomerActivityViewOverlay Activity="Activity" @ref="ActivityViewOverlay"/>
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.OverlayOffice;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
public partial class OfficeCustomerActivityListComponent
|
||||
{
|
||||
[Parameter] public List<ReportItemView> Activities { get; set; } = new();
|
||||
private OfficeCustomerActivityViewOverlay ActivityViewOverlay { get; set; } = new();
|
||||
|
||||
private ReportItemView Activity { get; set; } = new();
|
||||
|
||||
private void ShowVisitOverlay(string activityId)
|
||||
{
|
||||
Activity = Activities.First(x => x.ActivityId == activityId);
|
||||
ActivityViewOverlay.Show();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
|
||||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
|
||||
@using Wonky.Client.Models
|
||||
@using System.ComponentModel.Design
|
||||
<div class="row">
|
||||
|
||||
@if (Inventory.Any())
|
||||
{
|
||||
<div class="list-group mt-2">
|
||||
<div class="list-group-item bg-dark text-white">
|
||||
<div class="row">
|
||||
<div class="col-sm-4" style="cursor: pointer;" @onclick="() => SortProducts(PSort.Desc)"><i class="bi-sort-alpha-down"></i> Navn <i class="bi-sort-alpha-up-alt"></i></div>
|
||||
<div class="col-sm-3" style="cursor: pointer;" @onclick="() => SortProducts(PSort.Sku)"><i class="bi-sort-alpha-down"></i> Varenr <i class="bi-sort-alpha-up-alt"></i></div>
|
||||
<div class="col-sm-2 text-center" style="cursor: pointer;" @onclick="() => SortProducts(PSort.Qty)"><i class="bi-sort-numeric-down"></i> Antal <i class="bi-sort-numeric-up-alt"></i></div>
|
||||
<div class="col-sm-2"></div>
|
||||
<div class="col-sm-1"></div>
|
||||
</div>
|
||||
</div>
|
||||
@foreach (var product in Inventory)
|
||||
{
|
||||
<div class="list-group-item">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-sm-4">
|
||||
<div class="position-relative">
|
||||
@product.Description
|
||||
@if (product.Discontinued)
|
||||
{
|
||||
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">Udgået</span>
|
||||
<span class="visually-hidden">Produktet er udgået</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-3">
|
||||
@product.Sku
|
||||
</div>
|
||||
<div class="col-sm-2 text-center">
|
||||
@product.Quantity
|
||||
</div>
|
||||
<div class="col-sm-2">
|
||||
<a class="btn btn-info d-block" type="button" @onclick="() => CallShowReorderModal(product.Sku)"><i class="bi-cart"></i> Genbestil</a>
|
||||
</div>
|
||||
<div class="col-sm-1" @onclick="() => ProductCheck(product.Sku)">
|
||||
<input type="checkbox" class="btn-check" id="btn-@product.Sku.Replace(",", "")" autocomplete="off"/>
|
||||
@if (product.Check)
|
||||
{
|
||||
<label class="btn btn-success" for="btn-@product.Sku.Replace(",", "")">
|
||||
<i class="bi-check"></i>
|
||||
</label>
|
||||
}
|
||||
else
|
||||
{
|
||||
<label class="btn btn-warning" for="btn-@product.Sku.Replace(",", "")">
|
||||
<i class="bi-dash"></i>
|
||||
</label>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>Ingen data</div>
|
||||
}
|
||||
</div>
|
|
@ -0,0 +1,86 @@
|
|||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
public partial class OfficeCustomerInventoryListComponent
|
||||
{
|
||||
[Inject] private ILocalStorageService Storage { get; set; }
|
||||
// Parameters
|
||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
[Parameter] public EventCallback<string> OnReorderSelected { get; set; }
|
||||
|
||||
// private variables
|
||||
private bool Descending { get; set; }
|
||||
|
||||
private void SortProducts(PSort column)
|
||||
{
|
||||
Descending = !Descending;
|
||||
switch (column)
|
||||
{
|
||||
case PSort.Desc:
|
||||
if (Descending)
|
||||
{
|
||||
Inventory = Inventory.OrderByDescending(x => x.Description).ToList();
|
||||
break;
|
||||
}
|
||||
Inventory = Inventory.OrderBy(x => x.Description).ToList();
|
||||
break;
|
||||
case PSort.Sku:
|
||||
if (Descending)
|
||||
{
|
||||
Inventory = Inventory.OrderByDescending(x => x.Sku).ToList();
|
||||
break;
|
||||
}
|
||||
Inventory = Inventory.OrderBy(x => x.Sku).ToList();
|
||||
break;
|
||||
case PSort.Qty:
|
||||
if (Descending)
|
||||
{
|
||||
Inventory = Inventory.OrderByDescending(x => x.Quantity).ToList();
|
||||
break;
|
||||
}
|
||||
Inventory = Inventory.OrderBy(x => x.Quantity).ToList();
|
||||
break;
|
||||
case PSort.None:
|
||||
break;
|
||||
case PSort.Abbr:
|
||||
break;
|
||||
default:
|
||||
Inventory = Inventory.OrderByDescending(x => x.Quantity).ToList();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task CallShowReorderModal(string sku)
|
||||
{
|
||||
await ProductCheck(sku);
|
||||
await OnReorderSelected.InvokeAsync(sku);
|
||||
}
|
||||
|
||||
private async Task ProductCheck(string sku)
|
||||
{
|
||||
var x = Inventory.First(x => x.Sku == sku);
|
||||
x.Check = !x.Check;
|
||||
await Storage.SetItemAsync($"{CompanyId}-products", Inventory);
|
||||
}
|
||||
}
|
|
@ -29,11 +29,9 @@
|
|||
<i class="bi-activity"></i> Sælgere
|
||||
</a>
|
||||
</AuthorizeView>
|
||||
@*
|
||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
|
||||
<i class="bi-building"></i> Tlf.Ordre
|
||||
</a>
|
||||
*@
|
||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/dk">
|
||||
<i class="bi-file-spreadsheet"></i> Priser
|
||||
</a>
|
||||
|
@ -52,11 +50,9 @@
|
|||
<i class="bi-activity"></i> Sælgere
|
||||
</a>
|
||||
</AuthorizeView>
|
||||
@*
|
||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
|
||||
<i class="bi-phone"></i> Tlf.Ordre
|
||||
</a>
|
||||
*@
|
||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/no">
|
||||
<i class="bi-file-spreadsheet"></i> Priser
|
||||
</a>
|
||||
|
@ -75,11 +71,9 @@
|
|||
<i class="bi-activity"></i> Sælgere
|
||||
</a>
|
||||
</AuthorizeView>
|
||||
@*
|
||||
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
|
||||
<i class="bi-phone"></i> Tlf.Ordre
|
||||
</a>
|
||||
*@
|
||||
<a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/se">
|
||||
<i class="bi-file-spreadsheet"></i> Priser
|
||||
</a>
|
|
@ -28,9 +28,10 @@ using Wonky.Client.Shared;
|
|||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Models;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
public partial class LandingComponentOffice
|
||||
public partial class OfficeLandingComponent
|
||||
{
|
||||
[Inject] private UserProfileService ProfileService { get; set; }
|
||||
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.Services;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components
|
||||
{
|
||||
|
|
|
@ -15,15 +15,15 @@
|
|||
//
|
||||
*@
|
||||
|
||||
<i style="font-size:1.3em;" class="bi-@_icon @StateClass"></i>
|
||||
<i style="font-size:1.3em;" class="bi-@Icon @StateClass"></i>
|
||||
|
||||
@code{
|
||||
[Parameter] public string StateClass { get; set; } = "";
|
||||
private string _icon { get; set; } = "";
|
||||
private string Icon { get; set; } = "";
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
_icon = StateClass switch
|
||||
Icon = StateClass switch
|
||||
{
|
||||
"the-fast" => "lightning-charge",
|
||||
"the-good" => "file-earmark",
|
||||
|
|
|
@ -15,13 +15,12 @@
|
|||
|
||||
using Blazored.Toast.Services;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Models;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
public partial class CatalogListComponent
|
||||
public partial class ProductPriceListComponent
|
||||
{
|
||||
[Parameter] public List<SalesItemView> ItemList { get; set; } = new();
|
||||
[Inject] private IToastService ToastService { get; set; }
|
|
@ -42,19 +42,29 @@
|
|||
foreach (var quote in Quotes)
|
||||
{
|
||||
<div class="list-group-item list-group-item-action">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-4">
|
||||
@quote.Company.Name
|
||||
</div>
|
||||
<di class="col-sm-2">
|
||||
<div class="col-sm-2">
|
||||
@quote.OrderDate
|
||||
</di>
|
||||
</div>
|
||||
<div class="col-sm-3">
|
||||
<button type="button" class="btn btn-outline-dark me-2" @onclick="() => SetQuote(quote.ESalesNumber, QStatus.Lose)"><i class="bi-trash-fill"></i></button>
|
||||
<button type="button" class="btn btn-outline-dark me-2" @onclick="() => SetQuote(quote.ESalesNumber, QStatus.Archive)"><i class="bi-archive-fill"></i></button>
|
||||
<button type="button" class="btn btn-outline-dark me-2" @onclick="() => SetQuote(quote.ESalesNumber, QStatus.Note)"><i class="bi-tag-fill"></i></button>
|
||||
<button type="button" class="btn btn-outline-dark me-2" @onclick="() => SetQuote(quote.ESalesNumber, QStatus.Lose)">
|
||||
<i class="bi-trash-fill"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-dark me-2" @onclick="() => SetQuote(quote.ESalesNumber, QStatus.Archive)">
|
||||
<i class="bi-archive-fill"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-dark me-2" @onclick="() => SetQuote(quote.ESalesNumber, QStatus.Note)">
|
||||
<i class="bi-tag-fill"></i>
|
||||
</button>
|
||||
@if (quote.QuoteStatusEnum == "None")
|
||||
{
|
||||
<button type="button" class="btn btn-success" @onclick="() => SetQuote(quote.ESalesNumber, QStatus.Win)"><i class="bi-cart-fill"></i></button>
|
||||
<button type="button" class="btn btn-success" @onclick="() => SetQuote(quote.ESalesNumber, QStatus.Win)">
|
||||
<i class="bi-cart-fill"></i>
|
||||
</button>
|
||||
}
|
||||
</div>
|
||||
<div class="col-sm-1 text-center">
|
||||
|
@ -79,7 +89,9 @@
|
|||
</div>
|
||||
<div class="col-sm-2 text-center">
|
||||
<a class="btn btn-outline-dark d-block" style="font-family:monospace;font-size: 14px;"
|
||||
href="/advisor/customers/@quote.Company.CompanyId/quotes/@quote.ActivityId">@quote.ESalesNumber</a>
|
||||
href="/advisor/customers/@quote.Company.CompanyId/quotes/@quote.ActivityId">
|
||||
@quote.ESalesNumber
|
||||
</a>
|
||||
</div>
|
||||
@if (!string.IsNullOrWhiteSpace(quote.OfficeNote))
|
||||
{
|
||||
|
@ -104,4 +116,3 @@
|
|||
<div class="list-group-item">Ingen data</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
|
|
|
@ -23,11 +23,11 @@ public partial class QuoteListComponent
|
|||
{
|
||||
[Parameter]
|
||||
public List<ReportItemView> Quotes { get; set; } = new();
|
||||
[Parameter] public EventCallback<QCallbackArgs> OnChangedCallback { get; set; }
|
||||
[Parameter] public EventCallback<QuoteCallbackArgs> OnChangedCallback { get; set; }
|
||||
|
||||
private async Task SetQuote(string eSalesNumber, QStatus status)
|
||||
{
|
||||
var args = new QCallbackArgs()
|
||||
var args = new QuoteCallbackArgs()
|
||||
{
|
||||
ESalesNumber = eSalesNumber,
|
||||
Status = status
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
//
|
||||
*@
|
||||
|
||||
<EditForm EditContext="_editContext">
|
||||
<EditForm EditContext="VatAddressContext">
|
||||
<DataAnnotationsValidator/>
|
||||
<div class="row mb-2">
|
||||
<label for="streetName" class="col-sm-1 col-form-label-sm">Vejnavn</label>
|
||||
|
|
|
@ -17,22 +17,24 @@ using System.ComponentModel.DataAnnotations;
|
|||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Wonky.Client.Models;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
public partial class VatAddressInputComponent
|
||||
{
|
||||
[Parameter] public VatAddress Address { get; set; }
|
||||
private EditContext _editContext { get; set; }
|
||||
private VatAddress _address { get; set; }
|
||||
[Parameter] public VatAddress Address { get; set; } = new();
|
||||
[Parameter] public EventCallback<VatAddress> OnValidSubmit { get; set; }
|
||||
private EditContext VatAddressContext { get; set; }
|
||||
private VatAddress VatAddress { get; set; } = new();
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
_address = Address;
|
||||
_editContext = new EditContext(_address);
|
||||
VatAddress = Address;
|
||||
VatAddressContext = new EditContext(VatAddress);
|
||||
}
|
||||
private async Task SubmitForm()
|
||||
{
|
||||
await OnValidSubmit.InvokeAsync(_address);
|
||||
await OnValidSubmit.InvokeAsync(VatAddress);
|
||||
}
|
||||
|
||||
}
|
|
@ -15,13 +15,13 @@
|
|||
//
|
||||
*@
|
||||
|
||||
<EditForm Model="_companyName">
|
||||
<EditForm Model="ThisCompanyName">
|
||||
<DataAnnotationsValidator/>
|
||||
<div class="row mb-2">
|
||||
<label for="companyName" class="col-sm-1 col-form-label-sm">Navn</label>
|
||||
<div class="col-sm-9">
|
||||
<InputText id="companyName" class="form-control" @bind-Value="@_companyName"/>
|
||||
<ValidationMessage For="@(() => _companyName)"/>
|
||||
<InputText id="companyName" class="form-control" @bind-Value="@ThisCompanyName"/>
|
||||
<ValidationMessage For="@(() => ThisCompanyName)"/>
|
||||
</div>
|
||||
<div class="col-sm-2 text-end">
|
||||
<button class="btn btn-primary" type="button" @onclick="SubmitForm">HENT</button>
|
||||
|
|
|
@ -22,15 +22,15 @@ namespace Wonky.Client.Components;
|
|||
public partial class VatCompanyNameInputComponent
|
||||
{
|
||||
[Parameter] public string CompanyName { get; set; } = "";
|
||||
[Required(ErrorMessage = "Navn kan ikke være tomt")] private string _companyName { get; set; } = "";
|
||||
[Required(ErrorMessage = "Navn kan ikke være tomt")] private string ThisCompanyName { get; set; } = "";
|
||||
[Parameter] public EventCallback<string> OnValidSubmit { get; set; }
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
_companyName = CompanyName;
|
||||
ThisCompanyName = CompanyName;
|
||||
}
|
||||
private async Task SubmitForm()
|
||||
{
|
||||
await OnValidSubmit.InvokeAsync(_companyName);
|
||||
await OnValidSubmit.InvokeAsync(ThisCompanyName);
|
||||
}
|
||||
}
|
|
@ -22,7 +22,7 @@ namespace Wonky.Client.Components;
|
|||
public partial class WarehouseListComponent
|
||||
{
|
||||
[Parameter] public string Header { get; set; } = "";
|
||||
[Parameter] public List<WarehouseOrderView>? OrderList { get; set; }
|
||||
[Parameter] public List<WarehouseOrderView> OrderList { get; set; } = new();
|
||||
[Parameter] public bool ReadyToShip { get; set; }
|
||||
[Parameter] public EventCallback<PStatus> OnGetStatus { get; set; }
|
||||
[Parameter] public EventCallback OnSetShipped { get; set; }
|
||||
|
|
|
@ -19,6 +19,7 @@ using Blazored.LocalStorage;
|
|||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Wonky.Client.Services;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Components;
|
||||
|
||||
|
@ -27,14 +28,12 @@ public partial class WorkDateComponent : IDisposable
|
|||
/// <summary>
|
||||
/// User preference service
|
||||
/// </summary>
|
||||
[Inject]
|
||||
public UserProfileService Profiles { get; set; }
|
||||
[Inject] public UserProfileService Profiles { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// OnChanged callback function
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public EventCallback<string> OnChangedCallback { get; set; }
|
||||
[Parameter] public EventCallback<string> OnChangedCallback { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// work date context holding the edit value
|
||||
|
@ -49,7 +48,7 @@ public partial class WorkDateComponent : IDisposable
|
|||
/// <summary>
|
||||
/// user preferences
|
||||
/// </summary>
|
||||
private UserProfile _profiles = new();
|
||||
private UserProfile Profile { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// Component Initialization
|
||||
|
@ -58,10 +57,10 @@ public partial class WorkDateComponent : IDisposable
|
|||
{
|
||||
WorkDateContext = new EditContext(SelectedDate);
|
||||
Profiles.OnChange += ProfileServiceOnOnChange;
|
||||
_profiles = await Profiles.GetPreferences();
|
||||
SelectedDate = string.IsNullOrWhiteSpace(_profiles.WorkDate)
|
||||
Profile = await Profiles.GetPreferences();
|
||||
SelectedDate = string.IsNullOrWhiteSpace(Profile.WorkDate)
|
||||
? DateTime.Now
|
||||
: DateTime.Parse(_profiles.WorkDate);
|
||||
: DateTime.Parse(Profile.WorkDate);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -84,7 +83,7 @@ public partial class WorkDateComponent : IDisposable
|
|||
/// <param name="newUserProfile"></param>
|
||||
private void ProfileServiceOnOnChange(UserProfile newUserProfile)
|
||||
{
|
||||
_profiles = newUserProfile;
|
||||
Profile = newUserProfile;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
|
@ -23,6 +22,35 @@ namespace Wonky.Client.Helpers;
|
|||
/// </summary>
|
||||
public static class Utils
|
||||
{
|
||||
/// <summary>
|
||||
/// validate password to contain a-z and A-Z and 0-9
|
||||
/// </summary>
|
||||
/// <param name="toValidate"></param>
|
||||
/// <returns></returns>
|
||||
public static bool ValidatePasswd(string toValidate, int length)
|
||||
{
|
||||
if (toValidate.Length < length)
|
||||
return false;
|
||||
|
||||
var validConditions = 0;
|
||||
if (toValidate.Any(c => c is >= 'a' and <= 'z'))
|
||||
{
|
||||
validConditions++;
|
||||
}
|
||||
|
||||
if (toValidate.Any(c => c is >= 'A' and <= 'Z'))
|
||||
{
|
||||
validConditions++;
|
||||
}
|
||||
|
||||
if (toValidate.Any(c => c is >= '0' and <= '9'))
|
||||
{
|
||||
validConditions++;
|
||||
}
|
||||
|
||||
return validConditions == 3;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// return Country Name from countryCode
|
||||
/// </summary>
|
||||
|
|
40
Wonky.Client/HttpInterfaces/ICountryActivityRepository.cs
Normal file
40
Wonky.Client/HttpInterfaces/ICountryActivityRepository.cs
Normal file
|
@ -0,0 +1,40 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.HttpInterfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Interface Activity CRM Http repository
|
||||
/// </summary>
|
||||
public interface ICountryActivityRepository
|
||||
{
|
||||
/// <summary>
|
||||
/// Get activity data by id
|
||||
/// </summary>
|
||||
/// <param name="activityId"></param>
|
||||
/// <returns></returns>
|
||||
Task<ActivityDto> GetActivity(string activityId);
|
||||
|
||||
/// <summary>
|
||||
/// Get activities for customer Id
|
||||
/// </summary>
|
||||
/// <param name="customerId"></param>
|
||||
/// <returns></returns>
|
||||
Task<List<ReportItemView>> GetCustomerActivities(string customerId);
|
||||
}
|
|
@ -28,14 +28,21 @@ public interface ISystemUserRepository
|
|||
/// Get Advisors (Office)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<List<UserManagerListView>> GetAdvisors();
|
||||
Task<List<UserManagerListView>> GetUsers();
|
||||
|
||||
/// <summary>
|
||||
/// Get Advisor Info for given userId
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
Task<WebUserInfoView> GetAdvisorInfo(string userId);
|
||||
Task<UserManagerEditView> GetUserInfo(string userId);
|
||||
|
||||
/// <summary>
|
||||
/// Update Advisor using userId and updated data
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
Task<UserManagerEditView> CreateUser(UserManagerEditView model);
|
||||
|
||||
/// <summary>
|
||||
/// Update Advisor using userId and updated data
|
||||
|
@ -43,28 +50,14 @@ public interface ISystemUserRepository
|
|||
/// <param name="userId"></param>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
Task UpdateAdvisor(string userId, UserUpdateDto model);
|
||||
Task UpdateUserInfo(string userId, UserManagerEditView model);
|
||||
|
||||
/// <summary>
|
||||
/// Get Administrative Users
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<List<UserManagerListView>> GetAdminUsers();
|
||||
|
||||
/// <summary>
|
||||
/// Get Admin Info for giver userId
|
||||
/// Delete the user with id
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
Task<UserInfoDto> GetAdminUserInfo(string userId);
|
||||
|
||||
/// <summary>
|
||||
/// Update Admin user using userId and updated data
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
Task UpdateAdminUser(string userId, UserUpdateDto model);
|
||||
Task DeleteUser(string userId);
|
||||
|
||||
/// <summary>
|
||||
/// Set new user password
|
||||
|
|
77
Wonky.Client/HttpInterfaces/ISystemUserRepositoryGen1.cs
Normal file
77
Wonky.Client/HttpInterfaces/ISystemUserRepositoryGen1.cs
Normal file
|
@ -0,0 +1,77 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.HttpInterfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Interface for User handling over http
|
||||
/// </summary>
|
||||
public interface ISystemUserRepositoryGen1
|
||||
{
|
||||
/// <summary>
|
||||
/// Get Advisors (Office)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<List<UserManagerListView>> GetUsers();
|
||||
|
||||
/// <summary>
|
||||
/// Get Advisor Info for given userId
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
Task<WebUserInfoView> GetAdvisorInfo(string userId);
|
||||
|
||||
/// <summary>
|
||||
/// Update Advisor using userId and updated data
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
Task UpdateAdvisor(string userId, UserUpdateDto model);
|
||||
|
||||
/// <summary>
|
||||
/// Get Administrative Users
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<List<UserManagerListView>> GetAdminUsers();
|
||||
|
||||
/// <summary>
|
||||
/// Get Admin Info for giver userId
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
Task<UserInfoDto> GetAdminUserInfo(string userId);
|
||||
|
||||
/// <summary>
|
||||
/// Update Admin user using userId and updated data
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
Task UpdateAdminUser(string userId, UserUpdateDto model);
|
||||
|
||||
/// <summary>
|
||||
/// Set new user password
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="newPasswd"></param>
|
||||
/// <param name="confirmPasswd"></param>
|
||||
/// <returns></returns>
|
||||
Task ResetUserPassword(string userId, string newPasswd, string confirmPasswd);
|
||||
}
|
80
Wonky.Client/HttpRepository/CountryActivityRepository.cs
Normal file
80
Wonky.Client/HttpRepository/CountryActivityRepository.cs
Normal file
|
@ -0,0 +1,80 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Entity.Configuration;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.HttpRepository;
|
||||
|
||||
/// <summary>
|
||||
/// Implementing Interface Activity CRM Http repository
|
||||
/// </summary>
|
||||
public class CountryActivityRepository : ICountryActivityRepository
|
||||
{
|
||||
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
|
||||
{
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
|
||||
private readonly NavigationManager _navigation;
|
||||
private readonly ILogger<CountryActivityRepository> _logger;
|
||||
private readonly HttpClient _client;
|
||||
private readonly ApiConfig _api;
|
||||
|
||||
public CountryActivityRepository(HttpClient client,
|
||||
ILogger<CountryActivityRepository> logger,
|
||||
NavigationManager navigation, IOptions<ApiConfig> configuration)
|
||||
{
|
||||
_client = client;
|
||||
_logger = logger;
|
||||
_navigation = navigation;
|
||||
_api = configuration.Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get activity data by id
|
||||
/// </summary>
|
||||
/// <param name="activityId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<ActivityDto> GetActivity(string activityId)
|
||||
{
|
||||
var activity = await _client
|
||||
.GetFromJsonAsync<ActivityDto>($"{_api.CrmActivities}/{activityId}");
|
||||
return activity ?? new ActivityDto();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get activities for customer Id
|
||||
/// </summary>
|
||||
/// <param name="customerId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<ReportItemView>> GetCustomerActivities(string customerId)
|
||||
{
|
||||
var response = await _client.GetAsync($"{_api.CrmActivities}/company/{customerId}");
|
||||
var content = await response.Content.ReadAsStringAsync();
|
||||
if (!response.IsSuccessStatusCode)
|
||||
return new List<ReportItemView>();
|
||||
return string.IsNullOrWhiteSpace(content)
|
||||
? new List<ReportItemView>()
|
||||
: JsonSerializer.Deserialize<List<ReportItemView>>(content, _options);
|
||||
}
|
||||
}
|
|
@ -73,13 +73,20 @@ public class CountryCustomerHistoryRepository : ICountryCustomerHistoryRepositor
|
|||
/// <returns></returns>
|
||||
public async Task<InvoiceView> FetchInvoice(string countryCode, string companyId, string invoiceId)
|
||||
{
|
||||
return await _client
|
||||
.GetFromJsonAsync<InvoiceView>($"{_api.OfficeCustomers}/{countryCode}/{companyId}/invoices/{invoiceId}", _options);
|
||||
var response = await _client
|
||||
.GetAsync($"{_api.OfficeCustomers}/{countryCode}/{companyId}/invoices/{invoiceId}");
|
||||
if (!response.IsSuccessStatusCode) return new InvoiceView();
|
||||
var content = await response.Content.ReadAsStringAsync();
|
||||
|
||||
return response.IsSuccessStatusCode
|
||||
? JsonSerializer.Deserialize<InvoiceView>(content, _options)
|
||||
: new InvoiceView();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fetch inventory from given customer
|
||||
/// </summary>
|
||||
/// <param name="countryCode"></param>
|
||||
/// <param name="companyId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<ProductInventoryView>> FetchInventory(string countryCode, string companyId)
|
||||
|
@ -96,6 +103,7 @@ public class CountryCustomerHistoryRepository : ICountryCustomerHistoryRepositor
|
|||
/// <summary>
|
||||
/// Fetch History for given customer
|
||||
/// </summary>
|
||||
/// <param name="countryCode"></param>
|
||||
/// <param name="companyId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<ProductHistoryView>> FetchHistory(string countryCode, string companyId)
|
||||
|
@ -113,6 +121,7 @@ public class CountryCustomerHistoryRepository : ICountryCustomerHistoryRepositor
|
|||
/// <summary>
|
||||
/// Fetch history for given customer and a given product
|
||||
/// </summary>
|
||||
/// <param name="countryCode"></param>
|
||||
/// <param name="companyId"></param>
|
||||
/// <param name="sku"></param>
|
||||
/// <returns></returns>
|
||||
|
@ -130,6 +139,7 @@ public class CountryCustomerHistoryRepository : ICountryCustomerHistoryRepositor
|
|||
/// <summary>
|
||||
/// RPC call to initiate remote server sync for given customer
|
||||
/// </summary>
|
||||
/// <param name="countryCode"></param>
|
||||
/// <param name="companyId"></param>
|
||||
/// <param name="syncDate"></param>
|
||||
/// <returns></returns>
|
|
@ -50,9 +50,9 @@ public class SystemUserRepository : ISystemUserRepository
|
|||
/// Get Advisors (Office)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<UserManagerListView>> GetAdvisors()
|
||||
public async Task<List<UserManagerListView>> GetUsers()
|
||||
{
|
||||
return await _client.GetFromJsonAsync<List<UserManagerListView>>(_api.OfficeAdvisors);
|
||||
return await _client.GetFromJsonAsync<List<UserManagerListView>>(_api.UserManager);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -60,9 +60,29 @@ public class SystemUserRepository : ISystemUserRepository
|
|||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebUserInfoView> GetAdvisorInfo(string userId)
|
||||
public async Task<UserManagerEditView> GetUserInfo(string userId)
|
||||
{
|
||||
return await _client.GetFromJsonAsync<WebUserInfoView>($"{_api.OfficeAdvisors}/{userId}");
|
||||
return await _client.GetFromJsonAsync<UserManagerEditView>($"{_api.UserManager}/{userId}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update Advisor using userId and updated data
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<UserManagerEditView> CreateUser(UserManagerEditView model)
|
||||
{
|
||||
var result = await _client.PostAsJsonAsync($"{_api.UserManager}", model, _options);
|
||||
if (!result.IsSuccessStatusCode)
|
||||
return new UserManagerEditView();
|
||||
try
|
||||
{
|
||||
return await result.Content.ReadFromJsonAsync<UserManagerEditView>();
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new UserManagerEditView();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -71,39 +91,17 @@ public class SystemUserRepository : ISystemUserRepository
|
|||
/// <param name="userId"></param>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public async Task UpdateAdvisor(string userId, UserUpdateDto model)
|
||||
public async Task UpdateUserInfo(string userId, UserManagerEditView model)
|
||||
{
|
||||
await _client.PutAsJsonAsync($"{_api.OfficeAdvisors}/{userId}", model, _options);
|
||||
await _client.PutAsJsonAsync($"{_api.UserManager}/{userId}", model, _options);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Administrative Users
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<UserManagerListView>> GetAdminUsers()
|
||||
{
|
||||
return await _client.GetFromJsonAsync<List<UserManagerListView>>(_api.OfficeUsers);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Admin Info for giver userId
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<UserInfoDto> GetAdminUserInfo(string userId)
|
||||
public async Task DeleteUser(string userId)
|
||||
{
|
||||
return await _client.GetFromJsonAsync<UserInfoDto>($"{_api.OfficeUsers}/{userId}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update Admin user using userId and updated data
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public async Task UpdateAdminUser(string userId, UserUpdateDto model)
|
||||
{
|
||||
await _client.PutAsJsonAsync($"{_api.OfficeUsers}/{userId}", model, _options);
|
||||
await _client.DeleteAsync($"{_api.UserManager}/{userId}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -117,6 +115,6 @@ public class SystemUserRepository : ISystemUserRepository
|
|||
{
|
||||
var passwd = new Dictionary<string, string>
|
||||
{ { "newPassword", newPasswd }, { "confirmPassword", confirmPasswd } };
|
||||
await _client.PostAsJsonAsync($"{_api.OfficeUserPasswd}/{userId}", passwd, _options);
|
||||
await _client.PostAsJsonAsync($"{_api.UserManager}/passwd/{userId}", passwd, _options);
|
||||
}
|
||||
}
|
122
Wonky.Client/HttpRepository/SystemUserRepositoryGen1.cs
Normal file
122
Wonky.Client/HttpRepository/SystemUserRepositoryGen1.cs
Normal file
|
@ -0,0 +1,122 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Entity.Configuration;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.HttpRepository;
|
||||
|
||||
public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1
|
||||
{
|
||||
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
|
||||
{
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
|
||||
private readonly NavigationManager _navigation;
|
||||
private ILogger<SystemUserRepositoryGen1> _logger;
|
||||
private readonly HttpClient _client;
|
||||
private readonly ApiConfig _api;
|
||||
|
||||
public SystemUserRepositoryGen1(HttpClient client, ILogger<SystemUserRepositoryGen1> logger,
|
||||
NavigationManager navigation, IOptions<ApiConfig> configuration)
|
||||
{
|
||||
_client = client;
|
||||
_logger = logger;
|
||||
_navigation = navigation;
|
||||
_api = configuration.Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Advisors (Office)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<UserManagerListView>> GetUsers()
|
||||
{
|
||||
return await _client.GetFromJsonAsync<List<UserManagerListView>>(_api.OfficeAdvisors);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Advisor Info for given userId
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<WebUserInfoView> GetAdvisorInfo(string userId)
|
||||
{
|
||||
return await _client.GetFromJsonAsync<WebUserInfoView>($"{_api.OfficeAdvisors}/{userId}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update Advisor using userId and updated data
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public async Task UpdateAdvisor(string userId, UserUpdateDto model)
|
||||
{
|
||||
await _client.PutAsJsonAsync($"{_api.OfficeAdvisors}/{userId}", model, _options);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Administrative Users
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<UserManagerListView>> GetAdminUsers()
|
||||
{
|
||||
return await _client.GetFromJsonAsync<List<UserManagerListView>>(_api.OfficeUsers);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get Admin Info for giver userId
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<UserInfoDto> GetAdminUserInfo(string userId)
|
||||
{
|
||||
return await _client.GetFromJsonAsync<UserInfoDto>($"{_api.OfficeUsers}/{userId}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update Admin user using userId and updated data
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public async Task UpdateAdminUser(string userId, UserUpdateDto model)
|
||||
{
|
||||
await _client.PutAsJsonAsync($"{_api.OfficeUsers}/{userId}", model, _options);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set new user password
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="newPasswd"></param>
|
||||
/// <param name="confirmPasswd"></param>
|
||||
/// <returns></returns>
|
||||
public async Task ResetUserPassword(string userId, string newPasswd, string confirmPasswd)
|
||||
{
|
||||
var passwd = new Dictionary<string, string>
|
||||
{ { "newPassword", newPasswd }, { "confirmPassword", confirmPasswd } };
|
||||
await _client.PostAsJsonAsync($"{_api.UserManagerSetPasswd}/{userId}", passwd, _options);
|
||||
}
|
||||
}
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
namespace Wonky.Client.Models;
|
||||
|
||||
public class QCallbackArgs
|
||||
public class QuoteCallbackArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// ESalesNumber
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
//
|
||||
*@
|
||||
@using Wonky.Client.Components
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
|
||||
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
|
||||
<div class="modal-content">
|
||||
|
@ -24,7 +23,7 @@
|
|||
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<CustomerVisitListComponent Activities="Activities"/>
|
||||
<CustomerActivityListComponent Activities="Activities"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -14,18 +14,12 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Shared;
|
||||
namespace Wonky.Client.OverlayCustomer;
|
||||
|
||||
public partial class CustomerActivityListModalOverlay
|
||||
public partial class CustomerActivityListOverlay
|
||||
{
|
||||
[Parameter] public string CompanyName { get; set; } = "";
|
||||
[Parameter] public List<ReportItemView> Activities { get; set; } = new();
|
|
@ -14,19 +14,12 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.HttpRepository;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Services;
|
||||
using Wonky.Entity.Requests;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Shared;
|
||||
namespace Wonky.Client.OverlayCustomer;
|
||||
|
||||
public partial class CustomerActivityViewModalOverlay
|
||||
public partial class CustomerActivityViewOverlay
|
||||
{
|
||||
[Parameter] public ReportItemView ReportItem { get; set; } = new();
|
||||
private string _modalDisplay = "";
|
|
@ -33,4 +33,5 @@
|
|||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
||||
<CustomerInventoryReorderModalOverlay CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnInventorySelected" @ref="CustomerInventoryReorderOverlay" />
|
||||
|
||||
<CustomerInventoryReorderOverlay CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnInventorySelected" @ref="ReorderOverlay" />
|
|
@ -0,0 +1,86 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.OverlayCustomer;
|
||||
|
||||
public partial class CustomerInventoryListOverlay : IDisposable
|
||||
{
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
|
||||
[Inject] private ILogger<CustomerInventoryListOverlay> Logger { get; set; }
|
||||
|
||||
[Parameter] public string CompanyName { get; set; } = "";
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
||||
|
||||
[Parameter] public EventCallback<DraftItem> OnInventorySelected { get; set; }
|
||||
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
||||
private CompanyDto Company { get; set; } = new();
|
||||
private List<ProductInventoryView> ProductList { get; set; } = new();
|
||||
private DraftItem DraftItem { get; set; } = new();
|
||||
private SalesItemView SalesItem { get; set; } = new();
|
||||
private CustomerInventoryReorderOverlay ReorderOverlay { get; set; } = new();
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private async Task OnReorderCallback(string sku)
|
||||
{
|
||||
SalesItem = await CatalogRepo.GetSalesItemSku(CountryCode.ToLower(), sku);
|
||||
ReorderOverlay.Show();
|
||||
}
|
||||
|
||||
private async Task OnSelectedItem(DraftItem draftItem)
|
||||
{
|
||||
await OnInventorySelected.InvokeAsync(draftItem);
|
||||
Hide();
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
_modalDisplay = "block;";
|
||||
_showBackdrop = true;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void Hide()
|
||||
{
|
||||
_modalDisplay = "none;";
|
||||
_showBackdrop = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Interceptor.DisposeEvent();
|
||||
}
|
||||
|
||||
}
|
|
@ -16,17 +16,14 @@
|
|||
|
||||
using System.Globalization;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.HttpRepository;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Services;
|
||||
using Wonky.Entity.Requests;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Shared;
|
||||
namespace Wonky.Client.OverlayCustomer;
|
||||
|
||||
public partial class CustomerInventoryReorderModalOverlay
|
||||
public partial class CustomerInventoryReorderOverlay
|
||||
{
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
[Parameter] public SalesItemView SalesItem { get; set; } = new();
|
|
@ -32,7 +32,6 @@
|
|||
</div>
|
||||
</div>
|
||||
<CustomerInvoiceListComponent OnShowInvoice="@CallInvoiceModal" CompanyId="@Company.CompanyId" InvoiceList="@Invoices"/>
|
||||
<CustomerInvoiceViewModalOverlay CompanyId="@Company.CompanyId" InvoiceId="@InvoiceId" @ref="CustomerInvoiceView" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -41,3 +40,5 @@
|
|||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
||||
|
||||
<CustomerInvoiceViewOverlay CompanyId="@Company.CompanyId" InvoiceId="@InvoiceId" @ref="CustomerInvoiceView" />
|
|
@ -16,17 +16,17 @@
|
|||
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Shared;
|
||||
namespace Wonky.Client.OverlayCustomer;
|
||||
|
||||
public partial class CustomerInvoiceListModalOverlay
|
||||
public partial class CustomerInvoiceListOverlay
|
||||
{
|
||||
[Parameter] public InvoiceListView CustomerInvoices { get; set; } = new();
|
||||
|
||||
[Inject] private ILogger<CustomerInvoiceListModalOverlay> Logger { get; set; }
|
||||
private CustomerInvoiceViewModalOverlay CustomerInvoiceView { get; set; } = new();
|
||||
[Inject] private ILogger<CustomerInvoiceListOverlay> Logger { get; set; }
|
||||
private CustomerInvoiceViewOverlay CustomerInvoiceView { get; set; } = new();
|
||||
private string InvoiceId { get; set; } = "";
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
|
@ -14,19 +14,15 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.HttpRepository;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Services;
|
||||
using Wonky.Entity.Requests;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Shared;
|
||||
namespace Wonky.Client.OverlayCustomer;
|
||||
|
||||
public partial class CustomerInvoiceViewModalOverlay : IDisposable
|
||||
public partial class CustomerInvoiceViewOverlay : IDisposable
|
||||
{
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
[Parameter] public string InvoiceId { get; set; } = "";
|
|
@ -0,0 +1,36 @@
|
|||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
@using Wonky.Client.Components
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
|
||||
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3 class="modal-title">@Company.Name - Aktivitet oversigt</h3>
|
||||
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
@* activity list *@
|
||||
<OfficeCustomerActivityListComponent Activities="Activities"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (_showBackdrop)
|
||||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.OverlayOffice;
|
||||
|
||||
public partial class OfficeCustomerActivityListOverlay
|
||||
{
|
||||
[Parameter] public CompanyDto Company { get; set; } = new();
|
||||
[Parameter] public List<ReportItemView> Activities { get; set; } = new();
|
||||
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
||||
|
||||
public void Show()
|
||||
{
|
||||
_modalDisplay = "block;";
|
||||
_showBackdrop = true;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void Hide()
|
||||
{
|
||||
_modalDisplay = "none;";
|
||||
_showBackdrop = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
|
||||
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="card-title mb-2">
|
||||
<h3>Besøg - @Activity.Company.Name</h3>
|
||||
</div>
|
||||
<div class="row g-3">
|
||||
<label for="date" class="col-form-label-sm col-sm-1">Dato</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="date" class="form-control" type="text" value="@Activity.CreateTimestamp" readonly/>
|
||||
</div>
|
||||
|
||||
<label for="account" class="col-form-label-sm col-sm-1">Konto</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="account" class="form-control" type="text" value="@Activity.Company.Account" readonly/>
|
||||
</div>
|
||||
|
||||
<label for="vatNumber" class="col-form-label-sm col-sm-1">Cvr Org</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="vatNumber" class="form-control" type="text" value="@Activity.Company.VatNumber" readonly/>
|
||||
</div>
|
||||
|
||||
<label for="eSalesNumber" class="col-form-label-sm col-sm-1">EOrdre</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="eSalesNumber" class="form-control" type="text" value="@Activity.ESalesNumber" readonly/>
|
||||
</div>
|
||||
|
||||
<label for="ourRef" class="col-form-label-sm col-sm-1">Vor Ref.</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="ourRef" class="form-control" type="text" value="@Activity.OurRef" readonly/>
|
||||
</div>
|
||||
<hr/>
|
||||
<label for="referenceNumber" class="col-form-label-sm col-sm-1">Rekv.</label>
|
||||
<div class="col-sm-3">
|
||||
<input id="referenceNumber" class="form-control" type="text" value="@Activity.ReferenceNumber" readonly/>
|
||||
</div>
|
||||
|
||||
<label for="yourRef" class="col-form-label-sm col-sm-1">Kunde Ref.</label>
|
||||
<div class="col-sm-7">
|
||||
<input id="yourRef" class="form-control" type="text" value="@Activity.YourRef" readonly/>
|
||||
</div>
|
||||
|
||||
<label for="officeNote" class="col-form-label-sm col-sm-1">Ordre Note</label>
|
||||
<div class="col-sm-5">
|
||||
<textarea id="officeNote" class="form-control" value="@Activity.OfficeNote" readonly=""/>
|
||||
</div>
|
||||
|
||||
<label for="crmNote" class="col-form-label-sm col-sm-1">Crm Note</label>
|
||||
<div class="col-sm-5">
|
||||
<textarea id="crmNote" class="form-control" value="@Activity.CrmNote" readonly=""/>
|
||||
</div>
|
||||
<hr/>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Varenr</th>
|
||||
<th scope="col">Beskrivelse</th>
|
||||
<th class="text-end" scope="col">Antal</th>
|
||||
<th class="text-end" scope="col">Pris</th>
|
||||
<th class="text-end" scope="col">Rabat</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var line in Activity.Lines)
|
||||
{
|
||||
<tr>
|
||||
<td>@line.Sku</td>
|
||||
<td>@line.Description</td>
|
||||
<td class="text-end">@line.Quantity</td>
|
||||
<td class="text-end">@line.Price</td>
|
||||
<td class="text-end">@line.Discount</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (_showBackdrop)
|
||||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.OverlayOffice;
|
||||
|
||||
public partial class OfficeCustomerActivityViewOverlay
|
||||
{
|
||||
[Parameter] public ReportItemView Activity { get; set; } = new();
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
||||
|
||||
public void Show()
|
||||
{
|
||||
_modalDisplay = "block;";
|
||||
_showBackdrop = true;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void Hide()
|
||||
{
|
||||
_modalDisplay = "none;";
|
||||
_showBackdrop = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
@using Wonky.Client.Components
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
|
||||
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3 class="modal-title">@CompanyName - Produktoversigt</h3>
|
||||
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
@* product list *@
|
||||
<OfficeCustomerInventoryListComponent OnReorderSelected="OnReorderCallback" CompanyId="@CompanyId" Inventory="@Inventory"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (_showBackdrop)
|
||||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
||||
@* reorder overlay *@
|
||||
<OfficeCustomerInventoryReorderOverlay CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnInventorySelected" @ref="ReorderOverlay" />
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
|
@ -14,37 +13,37 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Shared;
|
||||
namespace Wonky.Client.OverlayOffice;
|
||||
|
||||
public partial class CustomerInventoryListModalOverlay : IDisposable
|
||||
public partial class OfficeCustomerInventoryListOverlay : IDisposable
|
||||
{
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private ICountryCatalogRepository Catalog { get; set; }
|
||||
[Inject] private ILogger<CustomerInventoryListModalOverlay> Logger { get; set; }
|
||||
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
|
||||
[Inject] private ILogger<OfficeCustomerInventoryListOverlay> Logger { get; set; }
|
||||
|
||||
|
||||
[Parameter] public string CompanyName { get; set; } = "";
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
||||
|
||||
[Parameter] public EventCallback<DraftItem> OnInventorySelected { get; set; }
|
||||
|
||||
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
||||
private CompanyDto _company { get; set; } = new();
|
||||
private List<ProductInventoryView> _inventory { get; set; } = new();
|
||||
private DraftItem DraftItem { get; set; } = new();
|
||||
private SalesItemView SalesItem { get; set; } = new();
|
||||
private CustomerInventoryReorderModalOverlay CustomerInventoryReorderOverlay { get; set; } = new();
|
||||
private OfficeCustomerInventoryReorderOverlay ReorderOverlay { get; set; } = new();
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
|
@ -55,8 +54,8 @@ public partial class CustomerInventoryListModalOverlay : IDisposable
|
|||
|
||||
private async Task OnReorderCallback(string sku)
|
||||
{
|
||||
SalesItem = await Catalog.GetSalesItemSku(CountryCode.ToLower(), sku);
|
||||
CustomerInventoryReorderOverlay.Show();
|
||||
SalesItem = await CatalogRepo.GetSalesItemSku(CountryCode.ToLower(), sku);
|
||||
ReorderOverlay.Show();
|
||||
}
|
||||
|
||||
private async Task OnSelectedItem(DraftItem draftItem)
|
||||
|
@ -83,5 +82,4 @@ public partial class CustomerInventoryListModalOverlay : IDisposable
|
|||
{
|
||||
Interceptor.DisposeEvent();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
@using Wonky.Client.Components
|
||||
@using Wonky.Client.Helpers
|
||||
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
|
||||
@* <div class="modal-dialog modal-dialog-scrollable modal-fullscreen-lg-down modal-xl modal-lg"> *@
|
||||
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h4 class="modal-title">@SalesItem.Name @SalesItem.Sku (@SalesItem.BoxSize stk/colli)</h4>
|
||||
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
@if (SalesItem.Discontinued)
|
||||
{
|
||||
<h3>Udgået produkt</h3>
|
||||
}
|
||||
else
|
||||
{
|
||||
@* draft line ----------------------------------------------------- *@
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<table id="draft-line" class="table table-bordered">
|
||||
<thead>
|
||||
<tr class="bg-dark text-white">
|
||||
<th scope="col" colspan="6">BESTILLING</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="col">Antal</th>
|
||||
<th scope="col">Pris</th>
|
||||
<th scope="col">Rabat</th>
|
||||
<th class="align-content-center justify-content-center" scope="col">SAS</th>
|
||||
<th scope="col"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="align-middle">
|
||||
<input type="number" class="form-control" @bind-value="@SelectedItem.Quantity"/>
|
||||
</td>
|
||||
<td class="align-middle">
|
||||
<div class="input-group">
|
||||
<input type="number" class="form-control" @bind-value="@SelectedItem.Price"/>
|
||||
</div>
|
||||
</td>
|
||||
<td class="align-middle">
|
||||
<input type="number" class="form-control" @bind-value="@SelectedItem.Discount"/>
|
||||
</td>
|
||||
<td class="align-middle align-content-center justify-content-center">
|
||||
<input type="checkbox" class="form-check" @bind-value="@SelectedItem.Sas"/>
|
||||
</td>
|
||||
<td class="align-middle">
|
||||
<button type="button" class="btn btn-warning text-nowrap d-block" @onclick="@(() => SendToOrder(SelectedItem))">BESTIL</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@* end draft line ------------------------------------------------- *@
|
||||
@* price list item ------------------------------------------------ *@
|
||||
<div class="row align-middle">
|
||||
@foreach (var rate in SalesItem.Rates)
|
||||
{
|
||||
<div class="col">
|
||||
<a type="button" class="btn btn-primary btn-sm" data-bs-dismiss="modal" @onclick="@(() => SelectPrice(rate.Quantity, rate.Rate))">
|
||||
@rate.Quantity <i class="bi-at"></i> @rate.Rate/stk
|
||||
</a>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@* end price list item -------------------------------------------- *@
|
||||
}
|
||||
|
||||
@* product history ------------------------------------------------ *@
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Dato</th>
|
||||
<th scope="col">Antal</th>
|
||||
<th scope="col">Rabat</th>
|
||||
<th scope="col">Pris</th>
|
||||
<th scope="col"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var entry in History)
|
||||
{
|
||||
<tr>
|
||||
<td class="align-middle">@entry.DeliveryDate</td>
|
||||
<td class="align-middle">@entry.Quantity</td>
|
||||
<td class="align-middle">@entry.Discount</td>
|
||||
<td class="align-middle">@entry.Price</td>
|
||||
<td class="align-middle">
|
||||
@if (!SalesItem.Discontinued)
|
||||
{
|
||||
<button type="button" class="btn btn-primary btn-sm" data-bs-dismiss="modal" @onclick="() => SelectHistory(entry)"><i class="bi-plus"></i> VÆLG</button>
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
@* end product history -------------------------------------------- *@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (_showBackdrop)
|
||||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Globalization;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.OverlayOffice;
|
||||
|
||||
public partial class OfficeCustomerInventoryReorderOverlay
|
||||
{
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
[Parameter] public SalesItemView SalesItem { get; set; } = new();
|
||||
[Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
|
||||
[Parameter] public EventCallback<DraftItem> OnSelected { get; set; }
|
||||
private List<ProductHistoryView>? History { get; set; } = new();
|
||||
private DraftItem SelectedItem { get; set; } = new();
|
||||
private string ProductName { get; set; } = "";
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
||||
private bool ShowDraft { get; set; }
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(SalesItem.Sku))
|
||||
return;
|
||||
|
||||
History = await HistoryRepo.FetchHistory(CompanyId, SalesItem.Sku);
|
||||
if (!History.Any())
|
||||
await Task.Delay(1000);
|
||||
SelectedItem.Item = SalesItem;
|
||||
SelectedItem.Discount = 0;
|
||||
SelectedItem.Quantity = 1;
|
||||
if(SalesItem.Rates.Any())
|
||||
SelectedItem.Price = decimal.Parse(SalesItem.Rates[0].Rate, CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
private async Task SendToOrder(DraftItem item)
|
||||
{
|
||||
SelectedItem = new DraftItem();
|
||||
await OnSelected.InvokeAsync(item);
|
||||
Hide();
|
||||
}
|
||||
|
||||
private void SelectPrice(string quantity, string rate)
|
||||
{
|
||||
SelectedItem.Discount = 0;
|
||||
SelectedItem.Price = decimal.Parse(rate, CultureInfo.InvariantCulture);
|
||||
SelectedItem.Quantity = int.Parse(quantity);
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void SelectHistory(ProductHistoryView item)
|
||||
{
|
||||
SelectedItem.Discount = item.Discount;
|
||||
SelectedItem.Price = item.Price;
|
||||
SelectedItem.Quantity = item.Quantity;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
_modalDisplay = "block;";
|
||||
_showBackdrop = true;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void Hide()
|
||||
{
|
||||
SelectedItem = new DraftItem();
|
||||
_modalDisplay = "none;";
|
||||
_showBackdrop = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
@using Wonky.Client.Components
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
|
||||
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
|
||||
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Faktura</h5>
|
||||
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
|
||||
<div class="row pt-2 pb-1 rounded-2 bg-dark text-white">
|
||||
<div class="col-sm-6">
|
||||
<h4 class="pt-1">@Company.Name</h4>
|
||||
</div>
|
||||
</div>
|
||||
@* component listing invoices*@
|
||||
<CustomerInvoiceListComponent OnShowInvoice="@CallInvoiceModal" CompanyId="@Company.CompanyId" InvoiceList="@Invoices"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (_showBackdrop)
|
||||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
||||
|
||||
@* overlay showing one invoice*@
|
||||
<OfficeCustomerInvoiceViewOverlay CountryCode="@Company.CountryCode" CompanyId="@Company.CompanyId" InvoiceId="@InvoiceId" @ref="OfficeCustomerInvoiceView" />
|
|
@ -0,0 +1,72 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.OverlayOffice;
|
||||
|
||||
public partial class OfficeCustomerInvoiceListOverlay
|
||||
{
|
||||
[Parameter] public InvoiceListView CustomerInvoices { get; set; } = new();
|
||||
[Parameter] public CompanyDto Company { get; set; } = new();
|
||||
// dependency injection
|
||||
[Inject] private ILogger<OfficeCustomerInvoiceListOverlay> Logger { get; set; }
|
||||
private string InvoiceId { get; set; } = "";
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
||||
private OfficeCustomerInvoiceViewOverlay OfficeCustomerInvoiceView { get; set; } = new();
|
||||
private List<InvoiceListItemView> Invoices { get; set; } = new();
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
// extract company from customer invoices
|
||||
Logger.LogDebug("CustomerInvoiceListOverlay => company => {}", JsonSerializer.Serialize(Company));
|
||||
// if there is invoices -> order by document date
|
||||
if (CustomerInvoices.Invoices.Any())
|
||||
Invoices = CustomerInvoices.Invoices.OrderByDescending(x => x.DocumentDate).ToList();
|
||||
Logger.LogDebug("invoices => {}", JsonSerializer.Serialize(Invoices));
|
||||
}
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void CallInvoiceModal(string invoiceId)
|
||||
{
|
||||
InvoiceId = invoiceId;
|
||||
OfficeCustomerInvoiceView.Show();
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
_modalDisplay = "block;";
|
||||
_showBackdrop = true;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void Hide()
|
||||
{
|
||||
_modalDisplay = "none;";
|
||||
_showBackdrop = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
@using Wonky.Client.Components
|
||||
@using Wonky.Client.Helpers
|
||||
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
|
||||
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Faktura</h5>
|
||||
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
@if (!string.IsNullOrWhiteSpace(Invoice.Company.Name))
|
||||
{
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row">Dato</th>
|
||||
<td>@Invoice.DocumentDate</td>
|
||||
<th scope="row">Faktura nr.</th>
|
||||
<td>@Invoice.DocumentNumber</td>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Konto</th>
|
||||
<td>@Invoice.Account</td>
|
||||
<th scope="row">Moms Nr.</th>
|
||||
<td>@Invoice.VatNumber</td>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Eordre</th>
|
||||
<td>@Invoice.ESalesNumber</td>
|
||||
<th scope="row">Vores Ref.</th>
|
||||
<td>@Invoice.OurRef</td>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Rekv.</th>
|
||||
<td>@Invoice.ReferenceNumber</td>
|
||||
<th scope="row">Deres Ref.</th>
|
||||
<td>@Invoice.YourRef</td>
|
||||
<th scope="row">Pakke nr.</th>
|
||||
<td>@Invoice.TrackingNumber</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Notat</th>
|
||||
<td class="fw-bold" colspan="5">@Invoice.OrderNote</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Varenr</th>
|
||||
<th scope="col">Beskrivelse</th>
|
||||
<th class="text-end" scope="col">Antal</th>
|
||||
<th class="text-end" scope="col">Pris</th>
|
||||
<th class="text-end" scope="col">Rabat</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var line in Invoice.Lines)
|
||||
{
|
||||
<tr>
|
||||
<td>@line.Sku</td>
|
||||
<td>@line.Text</td>
|
||||
<td class="text-end">@line.Qty</td>
|
||||
<td class="text-end">@line.Price</td>
|
||||
<td class="text-end">@line.Discount</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span>Ingen data</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (_showBackdrop)
|
||||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.OverlayOffice;
|
||||
|
||||
public partial class OfficeCustomerInvoiceViewOverlay : IDisposable
|
||||
{
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
[Parameter] public string InvoiceId { get; set; } = "";
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private ICountryCustomerHistoryRepository HistoryRepo { get; set; }
|
||||
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
||||
private InvoiceView Invoice { get; set; } = new();
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(InvoiceId))
|
||||
{
|
||||
Invoice = await HistoryRepo.FetchInvoice( CountryCode, CompanyId, InvoiceId);
|
||||
}
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
_modalDisplay = "block;";
|
||||
_showBackdrop = true;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void Hide()
|
||||
{
|
||||
_modalDisplay = "none;";
|
||||
_showBackdrop = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
public void Dispose() => Interceptor.DisposeEvent();
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
@*
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
*@
|
||||
@using Wonky.Client.Components
|
||||
|
||||
<div class="modal" tabindex="-1" role="dialog" style="display:@_modalDisplay">
|
||||
<div class="modal-dialog modal-dialog-scrollable modal-fullscreen">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3 class="modal-title">@Company.Name - Produktoversigt</h3>
|
||||
<button type="button" class="btn-close" @onclick="Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
@* product list *@
|
||||
<CustomerInventoryListComponent OnReorderSelected="OnReorderCallback" CompanyId="@Company.CompanyId" Inventory="@ProductList"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if (_showBackdrop)
|
||||
{
|
||||
<div class="modal-backdrop fade show"></div>
|
||||
}
|
||||
@* reorder overlay *@
|
||||
<OfficeCustomerInventoryReorderOverlay CompanyId="@Company.CompanyId" SalesItem="SalesItem" OnSelected="OnInventorySelected" @ref="ReorderOverlay" />
|
|
@ -0,0 +1,83 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
// published by the Free Software Foundation, either version 3 of the
|
||||
// License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.OverlayOffice;
|
||||
|
||||
public partial class OfficeCustomerProductListOverlay : IDisposable
|
||||
{
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
|
||||
[Inject] private ILogger<OfficeCustomerProductListOverlay> Logger { get; set; }
|
||||
|
||||
[Parameter] public CompanyDto Company { get; set; }
|
||||
[Parameter] public List<ProductInventoryView> ProductList { get; set; } = new();
|
||||
[Parameter] public EventCallback<DraftItem> OnInventorySelected { get; set; }
|
||||
|
||||
private string _modalDisplay = "";
|
||||
private bool _showBackdrop;
|
||||
private CompanyDto _company { get; set; } = new();
|
||||
private List<ProductInventoryView> _inventory { get; set; } = new();
|
||||
private DraftItem DraftItem { get; set; } = new();
|
||||
private SalesItemView SalesItem { get; set; } = new();
|
||||
private OfficeCustomerInventoryReorderOverlay ReorderOverlay { get; set; } = new();
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private async Task OnReorderCallback(string sku)
|
||||
{
|
||||
SalesItem = await CatalogRepo.GetSalesItemSku(Company.CountryCode.ToLower(), sku);
|
||||
ReorderOverlay.Show();
|
||||
}
|
||||
|
||||
private async Task OnSelectedItem(DraftItem draftItem)
|
||||
{
|
||||
await OnInventorySelected.InvokeAsync(draftItem);
|
||||
Hide();
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
_modalDisplay = "block;";
|
||||
_showBackdrop = true;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void Hide()
|
||||
{
|
||||
_modalDisplay = "none;";
|
||||
_showBackdrop = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Interceptor.DisposeEvent();
|
||||
}
|
||||
|
||||
}
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Wonky.Client.Components
|
||||
@using Wonky.Client.OverlayCustomer
|
||||
@attribute [Authorize(Roles = "Advisor")]
|
||||
@page "/advisor/customers/{CompanyId}/activities/new"
|
||||
|
||||
|
@ -336,23 +337,23 @@ else
|
|||
</div>
|
||||
}
|
||||
|
||||
<ConfirmWorkDateModalOverlay BodyMessage="@PromptDateConfirm"
|
||||
OnOkClicked="WorkDateConfirmCallback" @ref="WorkDateOverlay"/>
|
||||
<ConfirmWorkDateModal BodyMessage="@PromptDateConfirm"
|
||||
OnOkClicked="WorkDateConfirmCallback" @ref="ConfirmWorkDate"/>
|
||||
|
||||
<PriceCatalogModalOverlay CountryCode="@Company.CountryCode.ToLower()"
|
||||
<PriceCatalogOverlay CountryCode="@Company.CountryCode.ToLower()"
|
||||
OnSelected="PriceListCallback" @ref="CatalogOverlay"/>
|
||||
|
||||
<ProductHistoryModalOverlay CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku" @ref="ProductOverlay"/>
|
||||
<ProductHistoryOverlay CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku" @ref="ProductOverlay"/>
|
||||
|
||||
<ProductPriceHistoryModal CompanyId="@CompanyId" Sku="@SelectedItem.Sku"
|
||||
OnSelected="PriceHistoryCallback" @ref="PriceModalOverlay"/>
|
||||
<ProductPriceHistoryOverlay CompanyId="@CompanyId" Sku="@SelectedItem.Sku"
|
||||
OnSelected="PriceHistoryCallback" @ref="PriceOverlay"/>
|
||||
|
||||
<ConfirmProductCheckModalOverlay BodyMessage="" CompanyId="@CompanyId" Products="CheckList"
|
||||
OnOkClicked="ConfirmProductCheckCallback" @ref="ProductCheckOverlay" />
|
||||
<ProductCheckConfirmationOverlay BodyMessage="" CompanyId="@CompanyId" Products="CheckList"
|
||||
OnOkClicked="ConfirmProductCheckCallback" @ref="ConfirmationCheckOverlay" />
|
||||
|
||||
<CustomerInvoiceListModalOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceListOverlay" />
|
||||
<CustomerInvoiceListOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceListOverlay" />
|
||||
|
||||
<CustomerInventoryListModalOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
|
||||
<CustomerInventoryListOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
|
||||
OnInventorySelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay" />
|
||||
|
||||
<CustomerActivityListModalOverlay Activities="Activities" CompanyName="@Company.Name" @ref="ActivityListOverlay" />
|
||||
<CustomerActivityListOverlay Activities="Activities" CompanyName="@Company.Name" @ref="ActivityListOverlay" />
|
|
@ -18,36 +18,38 @@ using System.Globalization;
|
|||
using System.Text.Json;
|
||||
using Blazored.LocalStorage;
|
||||
using Blazored.Toast.Services;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.Models;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Wonky.Client.Helpers;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.OverlayCustomer;
|
||||
using Wonky.Client.Services;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
public partial class AdvisorActivityCreatePage : IDisposable
|
||||
{
|
||||
// Services
|
||||
[Inject] private ILogger<AdvisorActivityCreatePage> Logger { get; set; }
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private UserProfileService Profiles { get; set; }
|
||||
[Inject] private IToastService Toaster { get; set; }
|
||||
[Inject] private NavigationManager Navigator { get; set; }
|
||||
[Inject] private ILocalStorageService Storage { get; set; }
|
||||
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
|
||||
[Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; }
|
||||
[Inject] private IAdvisorActivityRepository ActivityRepo { get; set; }
|
||||
[Inject] private IAdvisorReportRepository ReportRepo { get; set; }
|
||||
[Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
|
||||
[Inject] public ILogger<AdvisorActivityCreatePage> Logger { get; set; }
|
||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] public UserProfileService ProfileService { get; set; }
|
||||
[Inject] public IToastService Toaster { get; set; }
|
||||
[Inject] public NavigationManager Navigator { get; set; }
|
||||
[Inject] public ILocalStorageService Storage { get; set; }
|
||||
[Inject] public ICountryCatalogRepository CatalogRepo { get; set; }
|
||||
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; }
|
||||
[Inject] public IAdvisorActivityRepository ActivityRepo { get; set; }
|
||||
[Inject] public IAdvisorReportRepository ReportRepo { get; set; }
|
||||
[Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
|
||||
|
||||
[CascadingParameter] private DraftStateProvider DraftProvider { get; set; } = new();
|
||||
[Parameter] public string CompanyId { get; set; }
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
|
||||
// variables
|
||||
private readonly JsonSerializerOptions _options = new() {PropertyNameCaseInsensitive = true};
|
||||
|
@ -72,14 +74,14 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
|||
private string PromptDateConfirm { get; set; } = "";
|
||||
|
||||
// OVERLAY PAGES
|
||||
private PriceCatalogModalOverlay CatalogOverlay { get; set; } = new();
|
||||
private ProductHistoryModalOverlay ProductOverlay { get; set; } = new();
|
||||
private ProductPriceHistoryModalOverlay PriceModalOverlay { get; set; } = new();
|
||||
private ConfirmWorkDateModalOverlay WorkDateOverlay { get; set; } = new();
|
||||
private ConfirmProductCheckModalOverlay ProductCheckOverlay { get; set; } = new();
|
||||
private CustomerInvoiceListModalOverlay InvoiceListOverlay { get; set; } = new();
|
||||
private CustomerInventoryListModalOverlay InventoryListOverlay { get; set; } = new();
|
||||
private CustomerActivityListModalOverlay ActivityListOverlay { get; set; } = new();
|
||||
private PriceCatalogOverlay CatalogOverlay { get; set; } = new();
|
||||
private ProductHistoryOverlay ProductOverlay { get; set; } = new();
|
||||
private ProductPriceHistoryOverlay PriceOverlay { get; set; } = new();
|
||||
private ConfirmWorkDateModal ConfirmWorkDate { get; set; } = new();
|
||||
private ProductCheckConfirmationOverlay ConfirmationCheckOverlay { get; set; } = new();
|
||||
private CustomerInvoiceListOverlay InvoiceListOverlay { get; set; } = new();
|
||||
private CustomerInventoryListOverlay InventoryListOverlay { get; set; } = new();
|
||||
private CustomerActivityListOverlay ActivityListOverlay { get; set; } = new();
|
||||
private List<ProductInventoryView> Inventory { get; set; } = new();
|
||||
private List<ProductInventoryView> CheckList { get; set; } = new();
|
||||
private InvoiceListView CompanyInvoices { get; set; } = new();
|
||||
|
@ -102,7 +104,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
|||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
// User Preferences
|
||||
UserProfile = await Profiles.GetPreferences();
|
||||
UserProfile = await ProfileService.GetPreferences();
|
||||
// User Info
|
||||
SalesRep = await Storage.GetItemAsync<UserInfoView>("_xu");
|
||||
// Fetch Customer from http
|
||||
|
@ -152,7 +154,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
|||
if (!UserProfile.DateConfirmed)
|
||||
{
|
||||
PromptDateConfirm = $"Aktiviteter oprettes med dato {SelectedDate.ToShortDateString()}. Er dette OK?";
|
||||
WorkDateOverlay.Show();
|
||||
ConfirmWorkDate.Show();
|
||||
}
|
||||
// Lines may already have been added from the company inventory page
|
||||
if (DraftProvider.Draft.DraftType == "order")
|
||||
|
@ -297,12 +299,12 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
|||
}
|
||||
|
||||
// Show CheckList modal
|
||||
ProductCheckOverlay.Show();
|
||||
ConfirmationCheckOverlay.Show();
|
||||
}
|
||||
|
||||
private async Task ConfirmProductCheckCallback()
|
||||
{
|
||||
ProductCheckOverlay.Hide();
|
||||
ConfirmationCheckOverlay.Hide();
|
||||
await CreateActivity();
|
||||
foreach (var item in CheckList)
|
||||
{
|
||||
|
@ -317,8 +319,8 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
|||
/// </summary>
|
||||
private async Task WorkDateConfirmCallback()
|
||||
{
|
||||
await Profiles.SetDateConfirmed(true);
|
||||
WorkDateOverlay.Hide();
|
||||
await ProfileService.SetDateConfirmed(true);
|
||||
ConfirmWorkDate.Hide();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
|
@ -363,7 +365,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
|||
private void ShowPriceHistoryOverlay()
|
||||
{
|
||||
if(ShowItem)
|
||||
PriceModalOverlay.Show();
|
||||
PriceOverlay.Show();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -21,19 +21,20 @@ using Wonky.Client.HttpInterceptors;
|
|||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Services;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
public partial class AdvisorActivityTodayListPage : IDisposable
|
||||
{
|
||||
[Inject] private UserProfileService UserProfileService { get; set; }
|
||||
[Inject] private UserProfileService ProfileService { get; set; }
|
||||
[Inject] private ILogger<AdvisorActivityTodayListPage> Logger { get; set; }
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private NavigationManager Navigator { get; set; }
|
||||
[Inject] private IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
|
||||
[Inject] private IAdvisorReportRepository AdvisorReportRepo { get; set; }
|
||||
[Inject] private IAdvisorActivityRepository ActivityRepo { get; set; }
|
||||
[Inject] private IAdvisorReportRepository ReportRepo { get; set; }
|
||||
[Inject] private IToastService Toaster { get; set; }
|
||||
private ReportStatusView? ReportStatusView { get; set; } = new();
|
||||
private ReportStatusView ReportStatusView { get; set; } = new();
|
||||
private UserProfile UserProfile { get; set; } = new();
|
||||
private DateTime SelectedDate { get; set; }
|
||||
private bool ReportExist { get; set; }
|
||||
|
@ -43,9 +44,9 @@ public partial class AdvisorActivityTodayListPage : IDisposable
|
|||
{
|
||||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
UserProfile = await UserProfileService.GetPreferences();
|
||||
UserProfile = await ProfileService.GetPreferences();
|
||||
SelectedDate = string.IsNullOrWhiteSpace(UserProfile.WorkDate) ? DateTime.Now : DateTime.Parse(UserProfile.WorkDate);
|
||||
ReportExist = await AdvisorReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
|
||||
ReportExist = await ReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
|
||||
await GetActivities($"{SelectedDate:yyyy-MM-dd}");
|
||||
Working = false;
|
||||
}
|
||||
|
@ -56,8 +57,8 @@ public partial class AdvisorActivityTodayListPage : IDisposable
|
|||
Toaster.ShowInfo("Vent nogle sekunder for data", "HENTER DATA");
|
||||
SelectedDate = DateTime.Parse(workDate);
|
||||
ReportStatusView = new ReportStatusView();
|
||||
ReportExist = await AdvisorReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
|
||||
ReportStatusView = await AdvisorActivityRepo.GetActivities($"{SelectedDate:yyyy-MM-dd}");
|
||||
ReportExist = await ReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
|
||||
ReportStatusView = await ActivityRepo.GetActivities($"{SelectedDate:yyyy-MM-dd}");
|
||||
Logger.LogDebug("Activities => {}", JsonSerializer.Serialize(ReportStatusView));
|
||||
Working = false;
|
||||
Toaster.ClearAll();
|
||||
|
|
|
@ -22,6 +22,7 @@ using Wonky.Client.HttpInterceptors;
|
|||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<CustomerVisitListComponent Activities="Activities" />
|
||||
<CustomerActivityListComponent Activities="ActivityList" />
|
||||
}
|
||||
@if (Working)
|
||||
{
|
||||
|
|
|
@ -20,23 +20,24 @@ using Wonky.Client.HttpInterceptors;
|
|||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
public partial class AdvisorCustomerActivityListPage : IDisposable
|
||||
{
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
[Inject] private HttpInterceptorService _interceptor { get; set; }
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
|
||||
[Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; }
|
||||
private List<ReportItemView> Activities { get; set; } = new();
|
||||
private List<ReportItemView> ActivityList { get; set; } = new();
|
||||
private CompanyDto Company { get; set; } = new();
|
||||
private bool Working { get; set; } = true;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
_interceptor.RegisterEvent();
|
||||
_interceptor.RegisterBeforeSendEvent();
|
||||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
|
||||
Company = await CompanyRepo.GetCompanyById(CompanyId);
|
||||
await GetActivities();
|
||||
|
@ -46,14 +47,14 @@ public partial class AdvisorCustomerActivityListPage : IDisposable
|
|||
private async Task GetActivities()
|
||||
{
|
||||
Working = true;
|
||||
Activities = await AdvisorActivityRepo.GetCustomerActivities(CompanyId);
|
||||
if(Activities.Any())
|
||||
Activities = Activities.OrderByDescending(x => x.OrderDate).ToList();
|
||||
ActivityList = await AdvisorActivityRepo.GetCustomerActivities(CompanyId);
|
||||
if(ActivityList.Any())
|
||||
ActivityList = ActivityList.OrderByDescending(x => x.OrderDate).ToList();
|
||||
Working = false;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_interceptor.DisposeEvent();
|
||||
Interceptor.DisposeEvent();
|
||||
}
|
||||
}
|
|
@ -143,12 +143,13 @@
|
|||
</div>
|
||||
</EditForm>
|
||||
|
||||
<VatLookupDkModal VatAddress="CompanyVatAddress" EntityName="@Company.Name" VatNumber="@Company.VatNumber"
|
||||
@ref="VatLookupPopup" OnSelectedCompany="SelectCompanyCallback"/>
|
||||
|
||||
@if (Working)
|
||||
{
|
||||
<WorkingThreeDots />
|
||||
}
|
||||
|
||||
<VatLookupDkModal VatAddress="CompanyVatAddress" EntityName="@Company.Name" VatNumber="@Company.VatNumber"
|
||||
@ref="VatLookupPopup" OnSelectedCompany="SelectCompanyCallback"/>
|
||||
|
||||
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as
|
||||
|
@ -17,17 +16,18 @@
|
|||
using System.Text.Json;
|
||||
using Blazored.LocalStorage;
|
||||
using Blazored.Toast.Services;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.Services;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Services;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Models;
|
||||
using Wonky.Entity.Requests;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages
|
||||
{
|
||||
|
@ -40,6 +40,7 @@ namespace Wonky.Client.Pages
|
|||
[Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; }
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private VatInfoLookupService VatService { get; set; }
|
||||
|
||||
private EditContext CompanyContext { get; set; }
|
||||
private CompanyDto Company { get; set; } = new();
|
||||
private VirkRegInfo CompanyRegInfo { get; set; } = new();
|
||||
|
@ -47,12 +48,11 @@ namespace Wonky.Client.Pages
|
|||
private VatAddress CompanyVatAddress { get; set; } = new();
|
||||
private VatLookupDkModal VatLookupPopup { get; set; } = new();
|
||||
|
||||
private bool FormInvalid = true;
|
||||
private string RegState = "";
|
||||
private bool FormInvalid { get; set; } = true;
|
||||
private string RegState { get; set; } = "";
|
||||
private DateTime LastVisit { get; set; }
|
||||
private DateTime NextVisit { get; set; }
|
||||
private bool Dk { get; set; } = true;
|
||||
private bool ShowInfos = true;
|
||||
private bool Working { get; set; }
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
|
@ -75,7 +75,6 @@ namespace Wonky.Client.Pages
|
|||
|
||||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -85,44 +84,6 @@ namespace Wonky.Client.Pages
|
|||
{
|
||||
VatLookupPopup.Show();
|
||||
}
|
||||
private async Task GetInfoFromName(string entityName)
|
||||
{
|
||||
Toaster.ShowInfo("Vent for firma info ...");
|
||||
VatInfos = await VatService
|
||||
.QueryVirkRegistry(new VirkParams {EntityName = entityName});
|
||||
if (!VatInfos.Any())
|
||||
{
|
||||
Toaster.ShowError($"Firma med navn '{entityName}' findes ikke.");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task GetInfoFromAddress(VatAddress address)
|
||||
{
|
||||
ShowInfos = true;
|
||||
Toaster.ShowInfo("Vent for adresse info ...");
|
||||
VatInfos = await VatService.QueryVirkRegistry(
|
||||
new VirkParams
|
||||
{
|
||||
StreetName = address.StreetName,
|
||||
HouseNumber = address.HouseNumber,
|
||||
ZipCode = address.ZipCode
|
||||
});
|
||||
if (!VatInfos.Any())
|
||||
{
|
||||
Toaster.ShowWarning($"Ingen data for adresse ...");
|
||||
}
|
||||
}
|
||||
private async Task GetInfoFromVat(string vatNumber)
|
||||
{
|
||||
ShowInfos = true;
|
||||
Toaster.ShowInfo("Vent for firma info ...");
|
||||
VatInfos = await VatService
|
||||
.QueryVirkRegistry(new VirkParams {VatNumber = vatNumber});
|
||||
if (!VatInfos.Any())
|
||||
{
|
||||
Toaster.ShowError($"Firma med CVR '{vatNumber}' findes ikke.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Modal callback to update company properties
|
||||
|
@ -142,23 +103,10 @@ namespace Wonky.Client.Pages
|
|||
Company.ZipCode = regInfo.ZipCode;
|
||||
Company.City = regInfo.City;
|
||||
}
|
||||
|
||||
Company.VatNumber = regInfo.VatNumber;
|
||||
}
|
||||
|
||||
private void SelectCompany(string vatNumber)
|
||||
{
|
||||
ShowInfos = false;
|
||||
CompanyRegInfo = (from x in VatInfos where x.VatNumber == vatNumber select x).First();
|
||||
RegState = CompanyRegInfo.States[^1].State == "NORMAL" ? "the-good" : "the-ugly";
|
||||
Company.Name = CompanyRegInfo.Name;
|
||||
Company.Address1 = CompanyRegInfo.Address;
|
||||
Company.Address2 = CompanyRegInfo.CoName;
|
||||
Company.ZipCode = CompanyRegInfo.ZipCode;
|
||||
Company.City = CompanyRegInfo.City;
|
||||
Company.VatNumber = CompanyRegInfo.VatNumber;
|
||||
Company.ValidVat = 1;
|
||||
StateHasChanged();
|
||||
}
|
||||
private async Task SubmitCompanyForm()
|
||||
{
|
||||
Working = true;
|
||||
|
@ -195,8 +143,10 @@ namespace Wonky.Client.Pages
|
|||
{
|
||||
FormInvalid = !CompanyContext.Validate();
|
||||
}
|
||||
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
|
||||
{
|
||||
FormInvalid = true;
|
||||
|
@ -219,4 +169,3 @@ namespace Wonky.Client.Pages
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
*@
|
||||
|
||||
@using Wonky.Client.Components
|
||||
@using Wonky.Client.OverlayCustomer
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@page "/advisor/customers/{CompanyId}/h/i"
|
||||
@attribute [Authorize(Roles = "Advisor")]
|
||||
|
@ -34,9 +35,9 @@
|
|||
|
||||
<CustomerInventoryListComponent OnReorderSelected="OnReorderCallback" CompanyId="@CompanyId" Inventory="@Inventory"/>
|
||||
|
||||
<CustomerInventoryReorderModalOverlay OnSelected="@OnSelectedItem" CompanyId="@CompanyId" SalesItem="@SalesItem" @ref="CustomerInventoryReorderOverlay"/>
|
||||
|
||||
@if (Working)
|
||||
{
|
||||
<WorkingThreeDots/>
|
||||
}
|
||||
|
||||
<CustomerInventoryReorderOverlay OnSelected="@OnSelectedItem" CompanyId="@CompanyId" SalesItem="@SalesItem" @ref="ReorderOverlay"/>
|
||||
|
|
|
@ -21,21 +21,23 @@ using Microsoft.AspNetCore.Components;
|
|||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.OverlayCustomer;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
public partial class AdvisorCustomerInventoryListPage : IDisposable
|
||||
{
|
||||
[Inject] private IAdvisorCustomerHistoryRepository CustomerHistory { get; set; }
|
||||
[Inject] private IAdvisorCustomerRepository Customers { get; set; }
|
||||
[Inject] private IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
|
||||
[Inject] private IAdvisorCustomerRepository CustomerREpo { get; set; }
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private IToastService Toaster { get; set; }
|
||||
[Inject] private ILogger<AdvisorCustomerInventoryListPage> Logger { get; set; }
|
||||
[Inject] private ILocalStorageService Storage { get; set; }
|
||||
[Inject] private ICountryCatalogRepository Catalog { get; set; }
|
||||
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
|
||||
|
||||
[CascadingParameter] public DraftStateProvider DraftStateProvider { get; set; } = new();
|
||||
[Parameter] public string CompanyId { get; set; } = "";
|
||||
|
@ -45,7 +47,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
|||
private CompanyDto Company { get; set; } = new();
|
||||
private bool Working { get; set; } = true;
|
||||
private SalesItemView SalesItem { get; set; } = new();
|
||||
private CustomerInventoryReorderModalOverlay CustomerInventoryReorderOverlay { get; set; } = new();
|
||||
private CustomerInventoryReorderOverlay ReorderOverlay { get; set; } = new();
|
||||
private List<ProductInventoryView> Inventory { get; set; } = new();
|
||||
|
||||
|
||||
|
@ -54,7 +56,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
|||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
|
||||
Company = await Customers.GetCompanyById(CompanyId);
|
||||
Company = await CustomerREpo.GetCompanyById(CompanyId);
|
||||
|
||||
// fetch product inventory
|
||||
await FetchProductInventory();
|
||||
|
@ -65,8 +67,8 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
|||
private async Task OnReorderCallback(string sku)
|
||||
{
|
||||
// fetch item from http repo
|
||||
SalesItem = await Catalog.GetSalesItemSku(Company.CountryCode.ToLower(), sku);
|
||||
CustomerInventoryReorderOverlay.Show();
|
||||
SalesItem = await CatalogRepo.GetSalesItemSku(Company.CountryCode.ToLower(), sku);
|
||||
ReorderOverlay.Show();
|
||||
}
|
||||
|
||||
private async Task OnSelectedItem(DraftItem draftItem)
|
||||
|
@ -93,7 +95,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
|||
}
|
||||
Logger.LogDebug("pulling products from backend");
|
||||
// fetch product history
|
||||
Inventory = await CustomerHistory.FetchInventory(CompanyId);
|
||||
Inventory = await HistoryRepo.FetchInventory(CompanyId);
|
||||
// default sort order by description
|
||||
if (Inventory.Any())
|
||||
Inventory = Inventory.OrderBy(x => x.Description).ToList();
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
*@
|
||||
@using Wonky.Client.Components
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Wonky.Client.OverlayCustomer
|
||||
@page "/advisor/customers/{CompanyId}/invoices"
|
||||
@attribute [Authorize(Roles = "Advisor")]
|
||||
<PageTitle>Faktura Oversigt for @Company.Name</PageTitle>
|
||||
|
@ -33,10 +34,11 @@
|
|||
</div>
|
||||
</div>
|
||||
<CustomerInvoiceListComponent OnShowInvoice="CallInvoiceModal" CompanyId="@_companyId" InvoiceList="@CompanyInvoices.Invoices"/>
|
||||
<CustomerInvoiceViewModalOverlay CompanyId="@_companyId" InvoiceId="@InvoiceId" @ref="CustomerInvoiceView" />
|
||||
}
|
||||
|
||||
@if (Working)
|
||||
{
|
||||
<WorkingThreeDots />
|
||||
}
|
||||
|
||||
<CustomerInvoiceViewOverlay CompanyId="@_companyId" InvoiceId="@InvoiceId" @ref="CustomerInvoiceView" />
|
|
@ -20,9 +20,10 @@ using Blazored.Toast.Services;
|
|||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Shared;
|
||||
using Wonky.Client.OverlayCustomer;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
|
@ -37,7 +38,7 @@ public partial class AdvisorCustomerInvoiceListPage : IDisposable
|
|||
[Inject] private ILogger<AdvisorCustomerInvoiceListPage> Logger { get; set; }
|
||||
private InvoiceListView CompanyInvoices { get; set; } = new();
|
||||
private CompanyDto Company { get; set; } = new();
|
||||
private CustomerInvoiceViewModalOverlay CustomerInvoiceView { get; set; } = new();
|
||||
private CustomerInvoiceViewOverlay CustomerInvoiceView { get; set; } = new();
|
||||
private string InvoiceId { get; set; } = "";
|
||||
private bool Working { get; set; }
|
||||
private bool AllSet { get; set; }
|
||||
|
|
|
@ -39,13 +39,6 @@
|
|||
data-bs-toggle="button" aria-pressed="@IncludeFolded" @onclick="OnFoldedClick">
|
||||
@ButtonFoldedText
|
||||
</button>
|
||||
|
||||
@*
|
||||
<div class="form-check">
|
||||
<input type="checkbox" id="folded" class="form-check-input" checked="@IncludeFolded" @onclick="OnFoldedClick" >
|
||||
<label for="folded" class="form-check-label">Ophørte</label>
|
||||
</div>
|
||||
*@
|
||||
</div>
|
||||
<div class="col-sm-8">
|
||||
<PaginationComponent MetaData="PageData" Spread="2" SelectedPage="SelectedPage"/>
|
||||
|
@ -56,7 +49,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<AdvisorCustomerListComponent CompanyList="Companies" OnDelete="DeleteCompany" />
|
||||
<AdvisorCustomerListComponent CompanyList="CompanyList" OnDelete="DeleteCompany" />
|
||||
|
||||
@if (Working)
|
||||
{
|
||||
|
|
|
@ -15,13 +15,14 @@
|
|||
//
|
||||
|
||||
using Blazored.LocalStorage;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Services;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Requests;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages
|
||||
{
|
||||
|
@ -32,7 +33,7 @@ namespace Wonky.Client.Pages
|
|||
[Inject] private IAdvisorCustomerRepository CompanyRepo { get; set; }
|
||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private NavigationManager Navigator { get; set; }
|
||||
private List<CompanyDto> Companies { get; set; } = new();
|
||||
private List<CompanyDto> CompanyList { get; set; } = new();
|
||||
private UserProfile Profiles { get; set; } = new();
|
||||
private UserInfoView UserInfo { get; set; } = new();
|
||||
private string SavedSearch { get; set; } = "";
|
||||
|
@ -73,7 +74,7 @@ namespace Wonky.Client.Pages
|
|||
Working = true;
|
||||
IncludeFolded = !IncludeFolded;
|
||||
ButtonFoldedText = IncludeFolded ? "Vis Aktive" : "Vis Ophørte";
|
||||
Companies = new List<CompanyDto>();
|
||||
CompanyList = new List<CompanyDto>();
|
||||
Paging.PageNumber = 1;
|
||||
Paging.HasFolded = IncludeFolded ? 1 : 0;
|
||||
await FetchCustomers();
|
||||
|
@ -81,21 +82,21 @@ namespace Wonky.Client.Pages
|
|||
|
||||
private async Task SelectedPage(int page)
|
||||
{
|
||||
Companies = new List<CompanyDto>();
|
||||
CompanyList = new List<CompanyDto>();
|
||||
Paging.PageNumber = page;
|
||||
await FetchCustomers();
|
||||
}
|
||||
|
||||
private async Task SetSearchCol(string searchColumn)
|
||||
{
|
||||
Companies = new List<CompanyDto>();
|
||||
CompanyList = new List<CompanyDto>();
|
||||
Paging.SearchColumn = searchColumn;
|
||||
Paging.PageNumber = 1;
|
||||
await FetchCustomers();
|
||||
}
|
||||
private async Task SetPageSize(string pageSize)
|
||||
{
|
||||
Companies = new List<CompanyDto>();
|
||||
CompanyList = new List<CompanyDto>();
|
||||
Paging.PageSize = Convert.ToInt32(pageSize);
|
||||
Paging.PageNumber = 1;
|
||||
await FetchCustomers();
|
||||
|
@ -103,7 +104,7 @@ namespace Wonky.Client.Pages
|
|||
|
||||
private async Task SetSearchPhrase(string searchTerm)
|
||||
{
|
||||
Companies = new List<CompanyDto>();
|
||||
CompanyList = new List<CompanyDto>();
|
||||
Paging.PageNumber = 1;
|
||||
Paging.SearchTerm = searchTerm;
|
||||
await FetchCustomers();
|
||||
|
@ -111,7 +112,7 @@ namespace Wonky.Client.Pages
|
|||
|
||||
private async Task SetSortCol(string orderBy)
|
||||
{
|
||||
Companies = new List<CompanyDto>();
|
||||
CompanyList = new List<CompanyDto>();
|
||||
Paging.OrderBy = orderBy;
|
||||
await FetchCustomers();
|
||||
}
|
||||
|
@ -122,9 +123,9 @@ namespace Wonky.Client.Pages
|
|||
/// <param name="companyId"></param>
|
||||
private async Task DeleteCompany(string companyId)
|
||||
{
|
||||
Companies = new List<CompanyDto>();
|
||||
CompanyList = new List<CompanyDto>();
|
||||
await CompanyRepo.DeleteCompany(companyId);
|
||||
if (Paging.PageNumber > 1 && Companies.Count == 1)
|
||||
if (Paging.PageNumber > 1 && CompanyList.Count == 1)
|
||||
Paging.PageNumber--;
|
||||
await FetchCustomers();
|
||||
}
|
||||
|
@ -136,12 +137,12 @@ namespace Wonky.Client.Pages
|
|||
Working = false;
|
||||
if (pageRes.Items.Any())
|
||||
{
|
||||
Companies = pageRes.Items;
|
||||
CompanyList = pageRes.Items;
|
||||
PageData = pageRes.MetaData;
|
||||
}
|
||||
else
|
||||
{
|
||||
Companies = new List<CompanyDto>();
|
||||
CompanyList = new List<CompanyDto>();
|
||||
PageData = new MetaData();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -242,12 +242,12 @@
|
|||
</EditForm>
|
||||
}
|
||||
|
||||
<VatLookupDkModal VatAddress="CompanyVatAddress" EntityName="@Company.Name" VatNumber="@Company.VatNumber"
|
||||
@ref="VatLookupPopup" OnSelectedCompany="SelectedCompanyCallback" />
|
||||
<ContactModal ParamContact="@SelectedContact" CompanyName="@Company.Name"
|
||||
@ref="ContactPopup" OnSaveClicked="WriteContactCallback" OnDeleteClicked="DeleteContactCallback"/>
|
||||
|
||||
@if (Working)
|
||||
{
|
||||
<WorkingThreeDots />
|
||||
}
|
||||
|
||||
<VatLookupDkModal VatAddress="CompanyVatAddress" EntityName="@Company.Name" VatNumber="@Company.VatNumber"
|
||||
@ref="VatLookupPopup" OnSelectedCompany="SelectedCompanyCallback" />
|
||||
<ContactModal ParamContact="@SelectedContact" CompanyName="@Company.Name"
|
||||
@ref="ContactPopup" OnSaveClicked="WriteContactCallback" OnDeleteClicked="DeleteContactCallback"/>
|
||||
|
|
|
@ -18,10 +18,10 @@ using System.Text.Json;
|
|||
using System.Text.RegularExpressions;
|
||||
using Blazored.LocalStorage;
|
||||
using Blazored.Toast.Services;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Wonky.Client.Helpers;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Client.Services;
|
||||
|
@ -29,6 +29,7 @@ using Wonky.Client.Shared;
|
|||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Models;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
|
@ -44,6 +45,7 @@ public partial class AdvisorCustomerViewPage : IDisposable
|
|||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||
[Inject] private VatInfoLookupService VatService { get; set; }
|
||||
[Inject] private ILocalStorageService Storage { get; set; }
|
||||
|
||||
private readonly JsonSerializerOptions _options = new () { PropertyNameCaseInsensitive = true };
|
||||
private CompanyDto Company { get; set; } = new();
|
||||
private EditContext ErpContext { get; set; }
|
||||
|
@ -142,7 +144,7 @@ public partial class AdvisorCustomerViewPage : IDisposable
|
|||
|
||||
// remove loading image
|
||||
Working = false;
|
||||
|
||||
await Task.Delay(100);
|
||||
await RequestErpUpdate();
|
||||
}
|
||||
|
||||
|
@ -151,7 +153,7 @@ public partial class AdvisorCustomerViewPage : IDisposable
|
|||
if(Working)
|
||||
return;
|
||||
Working = true;
|
||||
await HistoryRepo.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync);
|
||||
Company.HistorySync = await HistoryRepo.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync);
|
||||
Working = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<QuoteListComponent Quotes="_quotes" OnChangedCallback="UpdateQuoteCallback" />
|
||||
<QuoteListComponent Quotes="FilteredQuotes" OnChangedCallback="UpdateQuoteCallback" />
|
||||
|
||||
@if (Working)
|
||||
{
|
||||
|
|
|
@ -22,6 +22,7 @@ using Wonky.Client.HttpInterceptors;
|
|||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
|
@ -32,8 +33,8 @@ public partial class AdvisorQuoteListPage : IDisposable
|
|||
[Inject] private ILogger<AdvisorQuoteListPage> Logger { get; set; }
|
||||
[Inject] private IToastService Toaster { get; set; }
|
||||
[Inject] private ILocalStorageService Storage { get; set; }
|
||||
private List<ReportItemView> Quotes { get; set; } = new();
|
||||
private List<ReportItemView> _quotes { get; set; } = new();
|
||||
private List<ReportItemView> QuoteList { get; set; } = new();
|
||||
private List<ReportItemView> FilteredQuotes { get; set; } = new();
|
||||
private bool Working { get; set; }
|
||||
private QStatus QFilter { get; set; } = QStatus.NoteOpen;
|
||||
|
||||
|
@ -42,34 +43,34 @@ public partial class AdvisorQuoteListPage : IDisposable
|
|||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
Working = true;
|
||||
Quotes = await AdvisorActivityRepo.GetQuotes();
|
||||
await Storage.SetItemAsync("quotes", Quotes.OrderBy(x => x.Company.Name));
|
||||
QuoteList = await AdvisorActivityRepo.GetQuotes();
|
||||
await Storage.SetItemAsync("quotes", QuoteList.OrderBy(x => x.Company.Name));
|
||||
Working = false;
|
||||
// filter quotes - if any - default to QStatus.NoteOpen
|
||||
if (Quotes.Any())
|
||||
if (QuoteList.Any())
|
||||
await FilterQuotes(QFilter);
|
||||
}
|
||||
|
||||
private async Task FilterQuotes(QStatus status)
|
||||
{
|
||||
QFilter = status;
|
||||
Quotes = await Storage.GetItemAsync<List<ReportItemView>>("quotes");
|
||||
_quotes = QFilter switch
|
||||
QuoteList = await Storage.GetItemAsync<List<ReportItemView>>("quotes");
|
||||
FilteredQuotes = QFilter switch
|
||||
{
|
||||
QStatus.None => Quotes.Where(x => x.QuoteStatusEnum is "None").ToList(),
|
||||
QStatus.Lose => Quotes.Where(x => x.QuoteStatusEnum is "Lose").ToList(),
|
||||
QStatus.Archive => Quotes.Where(x => x.QuoteStatusEnum is "Archive").ToList(),
|
||||
QStatus.Note => Quotes.Where(x => x.QuoteStatusEnum is "Note").ToList(),
|
||||
QStatus.NoteOpen => Quotes.Where(x => x.QuoteStatusEnum is "Note" or "None").ToList(),
|
||||
_ => Quotes.ToList()
|
||||
QStatus.None => QuoteList.Where(x => x.QuoteStatusEnum is "None").ToList(),
|
||||
QStatus.Lose => QuoteList.Where(x => x.QuoteStatusEnum is "Lose").ToList(),
|
||||
QStatus.Archive => QuoteList.Where(x => x.QuoteStatusEnum is "Archive").ToList(),
|
||||
QStatus.Note => QuoteList.Where(x => x.QuoteStatusEnum is "Note").ToList(),
|
||||
QStatus.NoteOpen => QuoteList.Where(x => x.QuoteStatusEnum is "Note" or "None").ToList(),
|
||||
_ => QuoteList.ToList()
|
||||
};
|
||||
}
|
||||
|
||||
private async Task UpdateQuoteCallback(QCallbackArgs args)
|
||||
private async Task UpdateQuoteCallback(QuoteCallbackArgs args)
|
||||
{
|
||||
Working = true;
|
||||
// find the quote to update
|
||||
var quote = Quotes.First(x => x.ESalesNumber == args.ESalesNumber);
|
||||
var quote = QuoteList.First(x => x.ESalesNumber == args.ESalesNumber);
|
||||
if (args.Status == QStatus.Win)
|
||||
quote.OrderDate = $"{DateTime.Now:yyyy-MM-dd}";
|
||||
quote.QuoteStatusEnum = Utils.EnumToString(args.Status);
|
||||
|
@ -77,13 +78,13 @@ public partial class AdvisorQuoteListPage : IDisposable
|
|||
var response = await AdvisorActivityRepo.UpdateQuoteStatus(quote);
|
||||
Toaster.ShowInfo($"{response.Message}", $"HTTP STATUS {response.Code}");
|
||||
// clear and reload quotes
|
||||
Quotes = new List<ReportItemView>();
|
||||
QuoteList = new List<ReportItemView>();
|
||||
await Storage.RemoveItemAsync("quotes");
|
||||
Quotes = await AdvisorActivityRepo.GetQuotes();
|
||||
QuoteList = await AdvisorActivityRepo.GetQuotes();
|
||||
// store quotes in local storage
|
||||
await Storage.SetItemAsync("quotes", Quotes.OrderBy(x => x.Company.Name));
|
||||
await Storage.SetItemAsync("quotes", QuoteList.OrderBy(x => x.Company.Name));
|
||||
// filter quotes - if any - based on active filter
|
||||
if(Quotes.Any())
|
||||
if(QuoteList.Any())
|
||||
await FilterQuotes(QFilter);
|
||||
Working = false;
|
||||
// signal page state changed
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
@attribute [Authorize(Roles = "Advisor")]
|
||||
@page "/advisor/reports/new"
|
||||
|
||||
<PageTitle>Opret Dagsrapport for @_workDate</PageTitle>
|
||||
<PageTitle>Opret Dagsrapport for @ThisWorkDate</PageTitle>
|
||||
|
||||
@* report header *@
|
||||
<div class="row sticky-top bg-dark text-white rounded-2 mb-2 py-2 align-items-center">
|
||||
|
@ -76,11 +76,11 @@
|
|||
Report.Figures.KmMorning = Profiles.KmMorning;
|
||||
<td>
|
||||
<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"/>
|
||||
</td>
|
||||
<td>
|
||||
<input type="time" id="checkOut" class="form-control"
|
||||
@bind-Value="_checkOut" @bind-Value:event="oninput" @onchange="OnTimeChanged"/>
|
||||
@bind-Value="CheckOut" @bind-Value:event="oninput" @onchange="OnTimeChanged"/>
|
||||
</td>
|
||||
}
|
||||
<td class="text-end">
|
||||
|
@ -192,9 +192,10 @@
|
|||
<AdvisorReportActivityLedgerComponent ReportData="Report.Figures" />
|
||||
</div>
|
||||
</EditForm>
|
||||
<ConfirmationModal BodyMessage="@Prompt" OnOkClicked="ConfirmReportCallback" OnCancelClicked="OnCancelCallback" @ref="ConfirmReportModal"/>
|
||||
|
||||
@if (Working)
|
||||
{
|
||||
<WorkingThreeDots />
|
||||
}
|
||||
|
||||
<ConfirmationModal BodyMessage="@Prompt" OnOkClicked="ConfirmReportCallback" OnCancelClicked="OnCancelCallback" @ref="ConfirmReportModal"/>
|
||||
|
|
|
@ -25,6 +25,7 @@ using Wonky.Client.Services;
|
|||
using Wonky.Client.Shared;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
#pragma warning disable CS8618
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
|
@ -40,21 +41,21 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
private EditContext ReportContext { get; set; }
|
||||
private ReportDto Report { get; set; } = new();
|
||||
private List<ReportItemView> Activities { get; set; } = new();
|
||||
private ReportFiguresDto InitialValues { get; set; }
|
||||
private ReportFiguresDto InitialValues { get; set; } = new();
|
||||
private UserProfile Profiles { get; set; } = new();
|
||||
private bool FormInvalid { get; set; } = true;
|
||||
private bool NoFigures { get; set; } = true;
|
||||
private bool Working { get; set; }
|
||||
private DateTime _workDate { get; set; }
|
||||
private TimeOnly _checkIn { get; set; } = new(12, 0);
|
||||
private TimeOnly _checkOut { get; set; } = new(12, 0);
|
||||
private DateTime ThisWorkDate { get; set; }
|
||||
private TimeOnly CheckIn { get; set; } = new(12, 0);
|
||||
private TimeOnly CheckOut { get; set; } = new(12, 0);
|
||||
private DateTime BeginLeave { get; set; } = DateTime.Now;
|
||||
private DateTime EndLeave { get; set; } = DateTime.Now;
|
||||
private ConfirmationModal ConfirmReportModal { get; set; }
|
||||
private string Prompt { get; set; } = "";
|
||||
private string WorkDate { get; set; } = "";
|
||||
private int currKmMonth { get; set; }
|
||||
private int currKmPrivate { get; set; }
|
||||
private int CurrKmMonth { get; set; }
|
||||
private int CurrKmPrivate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// OnInitialized
|
||||
|
@ -75,23 +76,23 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
WorkDate = Profiles.WorkDate;
|
||||
if (string.IsNullOrWhiteSpace(WorkDate))
|
||||
{
|
||||
_workDate = DateTime.Now;
|
||||
WorkDate = $"{_workDate:yyyy-MM-dd}";
|
||||
await ProfileService.SetWorkDate(_workDate);
|
||||
ThisWorkDate = DateTime.Now;
|
||||
WorkDate = $"{ThisWorkDate:yyyy-MM-dd}";
|
||||
await ProfileService.SetWorkDate(ThisWorkDate);
|
||||
}
|
||||
else
|
||||
{
|
||||
_workDate = DateTime.Parse(WorkDate);
|
||||
ThisWorkDate = DateTime.Parse(WorkDate);
|
||||
}
|
||||
|
||||
if(await AdvisorReportRepo.ReportExist(WorkDate))
|
||||
Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
|
||||
Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}");
|
||||
|
||||
BeginLeave = _workDate;
|
||||
EndLeave = _workDate;
|
||||
BeginLeave = ThisWorkDate;
|
||||
EndLeave = ThisWorkDate;
|
||||
|
||||
Report.FromDateTime = $"{_workDate:yyyy-MM-dd'T'12:00:00}";
|
||||
Report.ToDateTime = $"{_workDate:yyyy-MM-dd'T'12:00:00}";
|
||||
Report.FromDateTime = $"{ThisWorkDate:yyyy-MM-dd'T'12:00:00}";
|
||||
Report.ToDateTime = $"{ThisWorkDate:yyyy-MM-dd'T'12:00:00}";
|
||||
|
||||
Report.Figures.KmMorning = 0;
|
||||
Report.Figures.KmEvening = 0;
|
||||
|
@ -122,13 +123,13 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
|
||||
var data = await AdvisorReportRepo.InitializeReportData(WorkDate);
|
||||
if(data.ReportClosed)
|
||||
Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
|
||||
Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}");
|
||||
|
||||
Report.Figures = data.ReportData;
|
||||
InitialValues = data.ReportData;
|
||||
Activities = data.ReportItems;
|
||||
currKmMonth = data.ReportData.DistanceMonth;
|
||||
currKmPrivate = data.ReportData.DistancePrivate;
|
||||
CurrKmMonth = data.ReportData.DistanceMonth;
|
||||
CurrKmPrivate = data.ReportData.DistancePrivate;
|
||||
if (Report.DayTypeEnum.ToLower().Contains("leave"))
|
||||
{
|
||||
// ensure no distances in calculation
|
||||
|
@ -154,8 +155,8 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
// Console.WriteLine($"e FieldName => {e.FieldIdentifier.FieldName}");
|
||||
FormInvalid = !ReportContext.Validate();
|
||||
Report.Figures.Distance = Report.Figures.KmEvening - Report.Figures.KmMorning;
|
||||
Report.Figures.DistanceMonth = Report.Figures.Distance + currKmMonth;
|
||||
Report.Figures.DistancePrivateMonth = Report.Figures.DistancePrivate + currKmPrivate;
|
||||
Report.Figures.DistanceMonth = Report.Figures.Distance + CurrKmMonth;
|
||||
Report.Figures.DistancePrivateMonth = Report.Figures.DistancePrivate + CurrKmPrivate;
|
||||
if (Report.Figures.Distance is > 1000 or < 0)
|
||||
{
|
||||
Toaster.ShowError($"Kørte km for rapporten er '{Report.Figures.Distance}'. Er du sikker på at det er rigtigt?", "KM tal");
|
||||
|
@ -195,7 +196,7 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
await ProfileService.SetKmMorning(0);
|
||||
// reset date confirmed
|
||||
await ProfileService.SetDateConfirmed(false);
|
||||
Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
|
||||
Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -229,8 +230,8 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
}
|
||||
else
|
||||
{
|
||||
checkIn = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkIn.Hour, _checkIn.Minute, 0);
|
||||
checkOut = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkOut.Hour, _checkOut.Minute, 0);
|
||||
checkIn = new DateTime(ThisWorkDate.Year, ThisWorkDate.Month, ThisWorkDate.Day, CheckIn.Hour, CheckIn.Minute, 0);
|
||||
checkOut = new DateTime(ThisWorkDate.Year, ThisWorkDate.Month, ThisWorkDate.Day, CheckOut.Hour, CheckOut.Minute, 0);
|
||||
}
|
||||
// assign a workday number if the day is marked as salesDay
|
||||
Report.SalesDayNumber = Report.DayTypeEnum == "sales" ? Report.Figures.SalesDayCount + 1 : 0;
|
||||
|
@ -238,7 +239,7 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
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);
|
||||
|
||||
Logger.LogDebug("_workDate => {workDate}", $"{_workDate:yyyy-MM-dd}");
|
||||
Logger.LogDebug("_workDate => {workDate}", $"{ThisWorkDate:yyyy-MM-dd}");
|
||||
Logger.LogDebug("_report => {report}", JsonSerializer.Serialize(Report));
|
||||
|
||||
if (Report.DayTypeEnum is "leave" or "sickLeave")
|
||||
|
@ -246,8 +247,8 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
// reset distance calculation
|
||||
Report.Figures.KmEvening = 0;
|
||||
Report.Figures.KmMorning = 0;
|
||||
Report.Figures.DistanceMonth = currKmMonth;
|
||||
Report.Figures.DistancePrivateMonth = currKmPrivate;
|
||||
Report.Figures.DistanceMonth = CurrKmMonth;
|
||||
Report.Figures.DistancePrivateMonth = CurrKmPrivate;
|
||||
}
|
||||
|
||||
// pop confirmation
|
||||
|
@ -255,7 +256,7 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
var warning = Report.Figures.KmEvening - Report.Figures.KmMorning > 1000 ?
|
||||
$"Kørte km for rapporten er '{Report.Figures.KmEvening - Report.Figures.KmMorning}'. Er du sikker på at det er rigtigt?<br/>" : "";
|
||||
|
||||
Prompt = $"{warning}<br/>Gem rapport for {_workDate.ToLongDateString()}?";
|
||||
Prompt = $"{warning}<br/>Gem rapport for {ThisWorkDate.ToLongDateString()}?";
|
||||
|
||||
ConfirmReportModal.Show();
|
||||
}
|
||||
|
@ -265,10 +266,10 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
/// </summary>
|
||||
private void OnTimeChanged()
|
||||
{
|
||||
var f = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkIn.Hour, _checkIn.Minute,0);
|
||||
var f = new DateTime(ThisWorkDate.Year, ThisWorkDate.Month, ThisWorkDate.Day, CheckIn.Hour, CheckIn.Minute,0);
|
||||
Report.FromDateTime = $"{f:yyyy-MM-dd'T'HH:mm}";
|
||||
|
||||
var t = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkOut.Hour, _checkOut.Minute,0);
|
||||
var t = new DateTime(ThisWorkDate.Year, ThisWorkDate.Month, ThisWorkDate.Day, CheckOut.Hour, CheckOut.Minute,0);
|
||||
Report.ToDateTime = $"{t:yyyy-MM-dd'T'HH:mm}";
|
||||
}
|
||||
|
||||
|
@ -279,7 +280,7 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
private void SetWorkDateCallback(string workDate)
|
||||
{
|
||||
WorkDate = workDate;
|
||||
_workDate = DateTime.Parse(workDate);
|
||||
ThisWorkDate = DateTime.Parse(workDate);
|
||||
|
||||
NoFigures = true;
|
||||
Report.Figures = new ReportFiguresDto();
|
||||
|
@ -292,8 +293,8 @@ public partial class AdvisorReportCreatePage : IDisposable
|
|||
Report.Figures.DistanceMonth = 0;
|
||||
Report.Figures.DistancePrivate = 0;
|
||||
Report.Figures.DistancePrivateMonth = 0;
|
||||
Report.FromDateTime = $"{_workDate:yyyy-MM-dd'T'12:00}";
|
||||
Report.ToDateTime = $"{_workDate:yyyy-MM-dd'T'12:00}";
|
||||
Report.FromDateTime = $"{ThisWorkDate:yyyy-MM-dd'T'12:00}";
|
||||
Report.ToDateTime = $"{ThisWorkDate:yyyy-MM-dd'T'12:00}";
|
||||
}
|
||||
|
||||
private void OnCancelCallback()
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue