built v 0.25.1

This commit is contained in:
Frede Hundewadt 2022-09-29 16:19:10 +02:00
parent dd9f9136d8
commit 4d36e77c5d
15 changed files with 149 additions and 112 deletions

View file

@ -27,10 +27,11 @@ public partial class AdvisorActivityTableComponent
{ {
return processStatus.ToLower() switch return processStatus.ToLower() switch
{ {
"none" => "the-ugly-fg", "express" => "the-fast",
"picked" => "the-bad-fg", "none" => "the-ugly",
"packed" => "the-good-fg", "picked" => "the-bad",
"shipped" => "the-draw-fg", "packed" => "the-good",
"shipped" => "the-draw",
_ => "the-dead" _ => "the-dead"
}; };
} }

View file

@ -27,6 +27,7 @@ public partial class OfficeActivityTableComponent
{ {
return processStatus.ToLower() switch return processStatus.ToLower() switch
{ {
"express" => "the-fast",
"none" => "the-good", "none" => "the-good",
"picked" => "the-bad", "picked" => "the-bad",
"packed" => "the-ugly", "packed" => "the-ugly",

View file

@ -25,6 +25,7 @@
{ {
_icon = StateClass switch _icon = StateClass switch
{ {
"the-fast" => "lightning-charge",
"the-good" => "file-earmark", "the-good" => "file-earmark",
"the-bad" => "file-earmark-check", "the-bad" => "file-earmark-check",
"the-ugly" => "box2-fill", "the-ugly" => "box2-fill",

View file

@ -30,7 +30,7 @@
} }
@if (ReportItem.Express) @if (ReportItem.Express)
{ {
<h2 class="fw-bold text-center"><i class="bi-lightning-charge text-dark" style="font-size: 3rem;"></i> HASTER</h2> <h2 class="fw-bold text-center"><i class="bi-lightning-charge the-fast" style="font-size: 3rem;"></i> HASTER</h2>
} }
@if (ReportItem.VisitTypeEnum.ToLower() == "phone" || ReportItem.OurRef.Contains("T:")) @if (ReportItem.VisitTypeEnum.ToLower() == "phone" || ReportItem.OurRef.Contains("T:"))
{ {
@ -43,7 +43,7 @@
<tbody> <tbody>
<tr> <tr>
<th scope="row">Dato</th> <th scope="row">Dato</th>
<td>@ReportItem.OrderDate</td> <td class="fw-bold">@ReportItem.OrderDate</td>
<th scope="row">Konto</th> <th scope="row">Konto</th>
<td>@ReportItem.Company.Account</td> <td>@ReportItem.Company.Account</td>
</tr> </tr>
@ -120,7 +120,7 @@
<tr> <tr>
<td colspan="4"></td> <td colspan="4"></td>
<td colspan="2"> <td colspan="2">
<h5 class="fw-bold text-center"><i class="bi-lightning-charge text-dark" style="font-size: 1rem;"></i> HASTER</h5> <h5 class="fw-bold text-center"><i class="bi-lightning-charge the-fast" style="font-size: 1rem;"></i> HASTER</h5>
</td> </td>
</tr> </tr>
} }
@ -136,10 +136,10 @@
} }
</div> </div>
@if (ReportItem.Express && ReportItem.ProcessStatusEnum.ToLower() == "none") @if (ReportItem.Express && ReportItem.ProcessStatusEnum == "Express")
{ {
<div class="report-item-express"> <div class="report-item-express">
<i class="bi-lightning-charge text-dark" style="font-size: 11rem;"></i> <i class="bi-lightning-charge the-fast" style="font-size: 11rem;"></i>
</div> </div>
} }

View file

@ -27,5 +27,5 @@ public interface ICrmActivityHttpRepository
Task<ReportStatusView> GetActivities(string activityDate); Task<ReportStatusView> GetActivities(string activityDate);
Task<List<ReportItemView>> GetCustomerActivities(string customerId); Task<List<ReportItemView>> GetCustomerActivities(string customerId);
Task UpdateOfficeNote(ActivityOfficeNote model); Task UpdateOfficeNote(ActivityOfficeNote model);
Task<ApiResponseView> UpdateExpressStatus(string id); Task<ApiResponseView> GetExpressStatus(string id);
} }

View file

@ -5,5 +5,5 @@ namespace Wonky.Client.HttpInterfaces;
public interface ISendMailService public interface ISendMailService
{ {
Task<ApiResponseView> SendMail(EmailMessage message); Task<ApiResponseView> SendMail(string messageType, EmailMessage message);
} }

View file

@ -55,21 +55,21 @@ public class CrmActivityHttpRepository : ICrmActivityHttpRepository
_api = configuration.Value; _api = configuration.Value;
} }
public async Task<ApiResponseView> UpdateExpressStatus(string id) public async Task<ApiResponseView> GetExpressStatus(string id)
{ {
var response = await _client.PostAsync($"{_api.CrmSales}/express/{id}/?status=express", null); var response = await _client.GetFromJsonAsync<ApiResponseView>($"{_api.CrmSales}/express/{id}?status=Express");
var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ApiResponseView>(content, _options); if (response.IsSuccess) return response;
if (result.IsSuccess) return result!;
var msg = JsonSerializer.SerializeToElement(result.Message, _options); var msg = JsonSerializer.SerializeToElement(response.Message, _options);
result.Message = msg.ToString(); response.Message = msg.ToString();
return result!; return response;
} }
public async Task UpdateOfficeNote(ActivityOfficeNote model) public async Task UpdateOfficeNote(ActivityOfficeNote model)
{ {
_logger.LogDebug("UpdateOfficeNote => model \n{}", JsonSerializer.Serialize(model) ); // _logger.LogDebug("UpdateOfficeNote => model \n{}", JsonSerializer.Serialize(model) );
_logger.LogDebug("UpdateOfficeNote => url \n{}", $"{_api.CrmSales}/activity/{model.ActivityId}" ); // _logger.LogDebug("UpdateOfficeNote => url \n{}", $"{_api.CrmSales}/activity/{model.ActivityId}" );
await _client.PostAsJsonAsync($"{_api.CrmSales}/activity/{model.ActivityId}", model, _options); await _client.PostAsJsonAsync($"{_api.CrmSales}/activity/{model.ActivityId}", model, _options);
} }
public async Task<ReportStatusView> GetActivities(string activityDate) public async Task<ReportStatusView> GetActivities(string activityDate)

View file

@ -1,3 +1,4 @@
using System.Net;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text.Json; using System.Text.Json;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
@ -29,12 +30,19 @@ public class SendMailService : ISendMailService
_navigation = navigation; _navigation = navigation;
_api = configuration.Value; _api = configuration.Value;
} }
public async Task<ApiResponseView> SendMail(EmailMessage message)
public async Task<ApiResponseView> SendMail(string messageType, EmailMessage message)
{ {
var response = await _client.PostAsJsonAsync("", message, _options); var response = await _client.PostAsJsonAsync($"{_api.SendMail}/{messageType}", message, _options);
if (!response.IsSuccessStatusCode)
return new ApiResponseView
{
Code = (int) response.StatusCode,
Message = $"{response.ReasonPhrase}: {await response.Content.ReadAsStringAsync()}",
IsSuccess = false,
Id = ""
};
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
_logger.LogDebug("SendMail => ResponseContent <= {}", content); return JsonSerializer.Deserialize<ApiResponseView>(content, _options);
var result = JsonSerializer.Deserialize<ApiResponseView>(content, _options);
return result!;
} }
} }

View file

@ -314,7 +314,7 @@ else
<a class="btn btn-info" href="/companies">Til Oversigt</a> <a class="btn btn-info" href="/companies">Til Oversigt</a>
</div> </div>
<div class="col"> <div class="col">
<a class="btn btn-warning" href="/companies/@_company.CompanyId">Annuller</a> <a class="btn btn-warning" href="/companies/@_company.CompanyId">Tilbage</a>
</div> </div>
<div class="col"> <div class="col">
<button type="button" class="btn btn-primary" @onclick="CreateActivity" disabled="@_poFormInvalid">Opret besøg</button> <button type="button" class="btn btn-primary" @onclick="CreateActivity" disabled="@_poFormInvalid">Opret besøg</button>

View file

@ -93,12 +93,6 @@ public partial class CrmNewActivityPage : IDisposable
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
if (!_prefs.DateConfirmed)
{
_confirmDatePrompt = $"Er arbejdsdato {_selectedDate} korrekt?";
CallConfirmWorkDate();
}
_editContext = new EditContext(_activity); _editContext = new EditContext(_activity);
_editContext.OnFieldChanged += HandleFieldChanged; _editContext.OnFieldChanged += HandleFieldChanged;
_editContext.OnValidationStateChanged += ValidationChanged; _editContext.OnValidationStateChanged += ValidationChanged;
@ -149,8 +143,8 @@ public partial class CrmNewActivityPage : IDisposable
_activity.DlvAddress2 = _company.Address2; _activity.DlvAddress2 = _company.Address2;
_activity.DlvZipCode = _company.ZipCode; _activity.DlvZipCode = _company.ZipCode;
_activity.DlvCity = _company.City; _activity.DlvCity = _company.City;
} }
private void CallPriceListModal() private void CallPriceListModal()
{ {
PriceListModal.Show(); PriceListModal.Show();
@ -205,7 +199,13 @@ public partial class CrmNewActivityPage : IDisposable
private async Task CreateActivity() private async Task CreateActivity()
{ {
_activity.CountryCode = "";
// if (!_prefs.DateConfirmed)
// {
// _confirmDatePrompt = $"Er arbejdsdato {_selectedDate} korrekt?";
// CallConfirmWorkDate();
// }
if (string.IsNullOrWhiteSpace(_activity.Address1)) if (string.IsNullOrWhiteSpace(_activity.Address1))
{ {
Toast.ShowError("Kunde adresse er ufuldstændig."); Toast.ShowError("Kunde adresse er ufuldstændig.");
@ -227,6 +227,8 @@ public partial class CrmNewActivityPage : IDisposable
} }
} }
_poFormInvalid = true;
_activity.ActivityDate = $"{_workDate:yyyy-MM-dd}"; _activity.ActivityDate = $"{_workDate:yyyy-MM-dd}";
_activity.OurRef = _activity.ActivityTypeEnum switch _activity.OurRef = _activity.ActivityTypeEnum switch
@ -276,12 +278,12 @@ public partial class CrmNewActivityPage : IDisposable
if (result.IsSuccess) if (result.IsSuccess)
{ {
Toast.ShowSuccess($"{result.Message}", "RESULTAT"); Toast.ShowSuccess($"{result.Message}", "RESULTAT");
if(DraftStateProvider.Draft.Items.Any())
Toast.ShowSuccess($"{result.Message}.", "BESTILLING OPRETTET");
await DraftStateProvider.DeleteDraftAsync(); await DraftStateProvider.DeleteDraftAsync();
Navigator.NavigateTo($"/companies"); Navigator.NavigateTo($"/companies");
return;
} }
_poFormInvalid = false;
Toast.ShowError(result.Message, "ORDRE FEJL"); Toast.ShowError(result.Message, "ORDRE FEJL");
_selectedItem = new SalesItemView(); _selectedItem = new SalesItemView();
} }

View file

@ -8,16 +8,16 @@
<tr> <tr>
<th class="p-0" colspan="4"> <th class="p-0" colspan="4">
<div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2"> <div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2">
<h2 class="fw-bold text-center">@ReportItem.Company.Name</h2> <h2 class="fw-bold text-center">@_reportItem.Company.Name</h2>
@if (ReportItem.StatusTypeEnum.ToLower() is "quote") @if (_reportItem.StatusTypeEnum.ToLower() is "quote")
{ {
<h3 class="text-center">TILBUD</h3> <h3 class="text-center">TILBUD</h3>
} }
@if (ReportItem.Express) @if (_reportItem.Express)
{ {
<h2 class="fw-bold text-center"><i class="bi-lightning-charge text-dark" style="font-size: 2rem;"></i> HASTER</h2> <h2 class="fw-bold text-center"><i class="bi-lightning-charge text-dark" style="font-size: 2rem;"></i> HASTER</h2>
} }
@if (ReportItem.Express && ReportItem.ProcessStatusEnum == "None") @if (_reportItem.Express && _reportItem.ProcessStatusEnum == "None")
{ {
<div id="watermark"> <div id="watermark">
<i class="bi-lightning-charge text-dark" style="font-size: 11rem;"></i> <i class="bi-lightning-charge text-dark" style="font-size: 11rem;"></i>
@ -37,7 +37,7 @@
</Authorized> </Authorized>
</AuthorizeView> </AuthorizeView>
} }
@if (ReportItem.VisitTypeEnum.ToLower() == "phone" || ReportItem.OurRef.Contains("T:")) @if (_reportItem.VisitTypeEnum.ToLower() == "phone" || _reportItem.OurRef.Contains("T:"))
{ {
<h5 class="text-center">TELEFONORDRE</h5> <h5 class="text-center">TELEFONORDRE</h5>
} }
@ -48,45 +48,45 @@
<tbody> <tbody>
<tr> <tr>
<th scope="row">Dato</th> <th scope="row">Dato</th>
<td>@ReportItem.OrderDate</td> <td>@_reportItem.OrderDate</td>
<th scope="row">Konto</th> <th scope="row">Konto</th>
<td>@ReportItem.Company.Account</td> <td>@_reportItem.Company.Account</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Telefon</th> <th scope="col">Telefon</th>
<td>@ReportItem.Company.Phone</td> <td>@_reportItem.Company.Phone</td>
<th scope="col">Køber</th> <th scope="col">Køber</th>
<td>@ReportItem.YourRef</td> <td>@_reportItem.YourRef</td>
</tr> </tr>
<tr> <tr>
<th scope="col">CVR/VAT</th> <th scope="col">CVR/VAT</th>
<td>@ReportItem.Company.VatNumber</td> <td>@_reportItem.Company.VatNumber</td>
<th scope="col">Rekvisition</th> <th scope="col">Rekvisition</th>
<td>@ReportItem.ReferenceNumber</td> <td>@_reportItem.ReferenceNumber</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Navn</th> <th scope="col">Navn</th>
<td>@ReportItem.Company.Name</td> <td>@_reportItem.Company.Name</td>
<th scope="col">Lev.Navn</th> <th scope="col">Lev.Navn</th>
<td>@ReportItem.DlvName</td> <td>@_reportItem.DlvName</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Adresse</th> <th scope="col">Adresse</th>
<td>@ReportItem.Company.Address1</td> <td>@_reportItem.Company.Address1</td>
<th scope="col">Lev.Adresse</th> <th scope="col">Lev.Adresse</th>
<td>@ReportItem.DlvAddress1</td> <td>@_reportItem.DlvAddress1</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Adresse</th> <th scope="col">Adresse</th>
<td>@ReportItem.Company.Address2</td> <td>@_reportItem.Company.Address2</td>
<th scope="col">Lev.Adresse</th> <th scope="col">Lev.Adresse</th>
<td>@ReportItem.DlvAddress2</td> <td>@_reportItem.DlvAddress2</td>
</tr> </tr>
<tr> <tr>
<th scope="col">Postnr By</th> <th scope="col">Postnr By</th>
<td>@ReportItem.Company.ZipCode @ReportItem.Company.City</td> <td>@_reportItem.Company.ZipCode @_reportItem.Company.City</td>
<th scope="col">Lev.Postnr By</th> <th scope="col">Lev.Postnr By</th>
<td>@ReportItem.DlvZipCity</td> <td>@_reportItem.DlvZipCity</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -102,7 +102,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var line in ReportItem.Lines) @foreach (var line in _reportItem.Lines)
{ {
<tr> <tr>
<td>@line.Quantity</td> <td>@line.Quantity</td>
@ -116,18 +116,18 @@
<tr> <tr>
<td colspan="4"></td> <td colspan="4"></td>
<td>Ordresum</td> <td>Ordresum</td>
<td class="text-end">@ReportItem.OrderAmount</td> <td class="text-end">@_reportItem.OrderAmount</td>
</tr> </tr>
@if (ReportItem.Express) @if (_reportItem.Express)
{ {
<td colspan="4"></td> <td colspan="4"></td>
<td colspan="2"><h5 class="fw-bold text-center"><i class="bi-lightning-charge text-dark" style="font-size: 2rem;"></i> HASTER</h5></td> <td colspan="2"><h5 class="fw-bold text-center"><i class="bi-lightning-charge text-dark" style="font-size: 2rem;"></i> HASTER</h5></td>
} }
</tbody> </tbody>
</table> </table>
@if (!string.IsNullOrWhiteSpace(ReportItem.OfficeNote)) @if (!string.IsNullOrWhiteSpace(_reportItem.OfficeNote))
{ {
<div class="alert alert-dark"> <div class="alert alert-dark">
<h4 class="text-center">@ReportItem.OfficeNote</h4> <h4 class="text-center">@_reportItem.OfficeNote</h4>
</div> </div>
} }

View file

@ -20,67 +20,86 @@ public partial class OfficeViewActivityPage : IDisposable
[Parameter] public string OrderId { get; set; } = ""; [Parameter] public string OrderId { get; set; } = "";
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ICrmActivityHttpRepository ActivityRepo { get; set; } [Inject] public ICrmActivityHttpRepository ActivityRepo { get; set; }
[Inject] public ISendMailService SendMailService { get; set; } [Inject] public ISendMailService MailService { get; set; }
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public IOfficeUserHttpRepository UserRepo { get; set; } [Inject] public IOfficeUserHttpRepository UserRepo { get; set; }
[Inject] public ILogger<OfficeViewActivityPage> Logger { get; set; } [Inject] public ILogger<OfficeViewActivityPage> Logger { get; set; }
[Inject] public IToastService Toast { get; set; } [Inject] public IToastService Toast { get; set; }
private ReportItemView ReportItem { get; set; } = new(); private ReportItemView _reportItem { get; set; } = new();
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
ReportItem = await ActivityRepo.GetReportItem(OrderId); _reportItem = await ActivityRepo.GetReportItem(OrderId);
Logger.LogDebug("ReportItem => \n {}", JsonSerializer.Serialize(ReportItem)); Logger.LogDebug("ReportItem => \n {}", JsonSerializer.Serialize(_reportItem, _options));
} }
private async Task SetExpressState() private async Task SetExpressState()
{ {
var responseView = await ActivityRepo.UpdateExpressStatus(ReportItem.ActivityId); Logger.LogDebug("SetExpressState => \n {}", JsonSerializer.Serialize(_reportItem, _options));
if (responseView.IsSuccess) var responseView = await ActivityRepo.GetExpressStatus(_reportItem.ActivityId);
Logger.LogDebug("SetExpressState => \n {}", responseView.Message );
if (!responseView.IsSuccess)
{ {
var user = await Storage.GetItemAsync<UserInfoView>("_ux"); Toast.ShowError(responseView.Message);
var salesRep = await UserRepo.GetAdvisorInfo(responseView.Id);
var body = new StringBuilder();
body.AppendLine($"Kvittering for behandling af hasteordre {ReportItem.ESalesNumber}");
body.AppendLine($"Konto : {ReportItem.Company.Account}");
body.AppendLine($"Navn : {ReportItem.Company.Name}");
body.AppendLine(
$"Post Bynavn: {salesRep.CountryCode.ToLower()}-{ReportItem.Company.ZipCode} {ReportItem.Company.City}");
body.AppendLine();
body.AppendLine("Med venlig hilsen");
body.AppendLine($"{user.FullName}");
body.AppendLine($"{user.PhoneNumber}");
var msg = new EmailMessage
{
Body = body.ToString(),
Subject = $"{ReportItem.ESalesNumber} {ReportItem.Company.Name} er registreret.",
To = { new EmailContact
{
Email = salesRep.Email,
Name = $"{salesRep.FirstName} {salesRep.LastName}"
}}
};
var sendMail = await SendMailService.SendMail(msg);
if (sendMail.IsSuccess)
{
Toast.ShowSuccess($"Status er opdateret og notifikation sendt til {salesRep.FirstName}.", "OK");
}
else
{
Toast.ShowWarning($"Notifikation til {salesRep.FirstName} kunne ikke sendes. {sendMail.Message}", "ADVARSEL");
}
return; return;
} }
Toast.ShowError($"{responseView.Message}", "FEJL");
var user = await Storage.GetItemAsync<UserInfoView>("_xu");
var salesRep = await UserRepo.GetAdvisorInfo(responseView.Id);
Logger.LogDebug("SetExpressState => salesRep => \n {}", JsonSerializer.Serialize(salesRep));
var body = new StringBuilder();
body.AppendLine($"Kvittering for modtagelse af hasteordre {_reportItem.ESalesNumber}");
body.AppendLine($"Konto : {_reportItem.Company.Account}");
body.AppendLine($"Navn : {_reportItem.Company.Name}");
body.AppendLine(
$"Post By : {salesRep.CountryCode.ToUpper()}-{_reportItem.Company.ZipCode} {_reportItem.Company.City}");
body.AppendLine();
body.AppendLine("Med venlig hilsen");
body.AppendLine($"{user.FullName}");
body.AppendLine($"{user.PhoneNumber}");
var sendTo = new List<EmailContact>
{
new()
{
Email = salesRep.Email,
Name = $"{salesRep.FirstName} {salesRep.LastName}"
}
};
var msg = new EmailMessage
{
Body = body.ToString(),
Subject = $"Haste ordre til {_reportItem.Company.Name} er modtaget.",
To = sendTo,
IsBodyHtml = false
};
Logger.LogDebug("SetExpressState Notification => \n {}", JsonSerializer.Serialize(msg));
var sendMail = await MailService.SendMail("System", msg);
if (sendMail.IsSuccess)
{
Toast.ShowSuccess($"Status er opdateret og notifikation sendt til {salesRep.FirstName}.", "OK");
}
else
{
Toast.ShowWarning($"Notifikation til {salesRep.FirstName} kunne ikke sendes. {sendMail.Message}",
"ADVARSEL");
}
} }
public void Dispose() public void Dispose()
{ {
Interceptor.DisposeEvent(); Interceptor.DisposeEvent();
} }
} }

View file

@ -1,13 +1,13 @@
{ {
"appInfo": { "appInfo": {
"name": "Wonky Client", "name": "Wonky Client",
"version": "0.24.1", "version": "0.25.1",
"rc": false, "rc": true,
"sandBox": false, "sandBox": false,
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
}, },
"apiConfig": { "apiConfig": {
"innoBaseUrl": "https://eta.innotec.dk", "innoBaseUrl": "https://zeta.innotec.dk",
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=", "glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
"glsId": "", "glsId": "",
"serviceVirk": "api/v2/services/virk", "serviceVirk": "api/v2/services/virk",
@ -30,11 +30,11 @@
"officeCustomers": "api/v2/office/customers", "officeCustomers": "api/v2/office/customers",
"officeReports": "api/v2/office/reports", "officeReports": "api/v2/office/reports",
"warehouse": "api/v2/warehouse/packages", "warehouse": "api/v2/warehouse/packages",
"sendMail": "api/v2/" "sendMail": "api/v2/services/sendmail"
}, },
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Debug", "Default": "Information",
"System": "Information", "System": "Information",
"Microsoft": "Information" "Microsoft": "Information"
}, },

View file

@ -81,6 +81,9 @@ a, .btn-link {
.the-dead-bg { .the-dead-bg {
background-color: #0dcaf0; background-color: #0dcaf0;
} }
.the-fast {
color: orange;
}
.the-good { .the-good {
color: green; color: green;
} }

View file

@ -25,8 +25,10 @@ public class ReportItemView
/// Lines /// Lines
/// </summary> /// </summary>
public List<ReportItemLine> Lines { get; set; } = new(); public List<ReportItemLine> Lines { get; set; } = new();
/// <summary>
public string SalesRepId { get; set; } /// entity id for sales rep
/// </summary>
public string SalesRepId { get; set; } = "";
/// <summary> /// <summary>
/// Activity entity id /// Activity entity id
/// </summary> /// </summary>