* Added Client Stellantis and mapped it
* Code cleanup
This commit is contained in:
@@ -21,7 +21,36 @@ public class ClientBase(
|
||||
IEnricher<EdiCustomerOrderDto, CustomerOrderDto> customerOrderEnricher,
|
||||
IValidator validator)
|
||||
{
|
||||
protected virtual EdiCustomerOrderDto CreateCustomerOrder(OrderModel orderModel)
|
||||
protected async Task Process(OrderModel orderModel, EdiCustomerOrderDto ediCustomerOrder, Func<IGrouping<string?,ScheduleOrderDetailDto>, int, IList<EdiCustomerOrderLineDto>> onProcessDetails)
|
||||
{
|
||||
//EdiCustomerOrderDto ediCustomerOrder = CreateEdiCustomerOrder(orderModel);
|
||||
|
||||
EdiCustomerOrderTranslateDto? customerOrderTranslation =
|
||||
await FindOrderAndCreateTranslation(orderModel, ediCustomerOrder.CustomerOrderNumber);
|
||||
|
||||
if (!validator.IsEdiCustomerOrderTranslationFound(orderModel.ScheduleOrderDto, customerOrderTranslation))
|
||||
return;
|
||||
|
||||
if (TryGetValidCustomerOrder(orderModel.ScheduleOrderDto, customerOrderTranslation?.CoCoNum ?? string.Empty)
|
||||
.Result is not { } customerOrder) return;
|
||||
|
||||
orderModel.CustomerOrder = customerOrder;
|
||||
|
||||
customerOrderEnricher.Enrich(ediCustomerOrder, customerOrder);
|
||||
|
||||
int lineNumber = 0;
|
||||
|
||||
ediCustomerOrder.EdiCustomerOrderLines =
|
||||
onProcessDetails.Invoke(orderModel.ScheduleOrderDetailsByGate, lineNumber);
|
||||
ediCustomerOrder.EdiCustomerOrderTranslates = new List<EdiCustomerOrderTranslateDto>
|
||||
{
|
||||
customerOrderTranslation ?? new EdiCustomerOrderTranslateDto()
|
||||
};
|
||||
|
||||
//return ediCustomerOrder;
|
||||
}
|
||||
|
||||
protected virtual EdiCustomerOrderDto CreateEdiCustomerOrder(OrderModel orderModel)
|
||||
{
|
||||
string orderNumber = $"EDI{orderModel.GetOrderNumber():0000000}";
|
||||
|
||||
@@ -73,15 +102,17 @@ public class ClientBase(
|
||||
ScheduleOrderDetailDetailDto scheduleOrderDetailDetail, EdiCustomerOrderLineDto ediCustomerOrderLine,
|
||||
OrderModel orderModel, string customerOrderNumber, int itemNumber)
|
||||
{
|
||||
bool isDeljit = orderModel.ScheduleOrderDto.DocType.StartsWith("DELJIT");
|
||||
|
||||
EdiCustomerOrderLineItemDto ediCustomerOrderLineItem = itemTranslator.Translate(scheduleOrderDetailDetail);
|
||||
ediCustomerOrderLineItem.CustomerOrderNumber = customerOrderNumber;
|
||||
ediCustomerOrderLineItem.CustomerOrderRelease = itemNumber;
|
||||
ediCustomerOrderLineItem.NewStatus = orderModel.ScheduleOrderDto.DocType == "DELJIT" ? "O" : "P";
|
||||
ediCustomerOrderLineItem.NewStatus = isDeljit ? "O" : "P";
|
||||
ediCustomerOrderLineItem.CustomerOrderCustomerNumber = orderModel.Customer.CustNum;
|
||||
ediCustomerOrderLineItem.CustomerNumber = orderModel.Customer.CustNum;
|
||||
ediCustomerOrderLineItem.CustomerSequence = orderModel.Customer.CustSeq;
|
||||
ediCustomerOrderLineItem.CustomerPoNumber = orderModel.CustomerOrder?.CustPo ?? string.Empty;
|
||||
ediCustomerOrderLineItem.DocumentType = orderModel.ScheduleOrderDto.DocType ?? string.Empty;
|
||||
ediCustomerOrderLineItem.DocumentType = isDeljit ? "DELJIT" : orderModel.ScheduleOrderDto.DocType ?? string.Empty;
|
||||
ediCustomerOrderLineItem.Warehouse = orderModel.Warehouse;
|
||||
ediCustomerOrderLineItem.DueDate = GetDueDate(scheduleOrderDetailDetail);
|
||||
|
||||
|
||||
@@ -23,48 +23,28 @@ public class ClientScania(
|
||||
customerOrderLineEnricher, itemEnricher, itemPriceEnricher, ediCustomerOrderLineEnricher, customerOrderEnricher,
|
||||
validator), IClientScania
|
||||
{
|
||||
private readonly IValidator _validator = validator;
|
||||
|
||||
public async Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel)
|
||||
{
|
||||
EdiCustomerOrderDto ediCustomerOrder = CreateCustomerOrder(orderModel);
|
||||
|
||||
EdiCustomerOrderTranslateDto? customerOrderTranslation =
|
||||
await FindOrderAndCreateTranslation(orderModel, ediCustomerOrder.CustomerOrderNumber);
|
||||
|
||||
if (!_validator.IsEdiCustomerOrderTranslationFound(orderModel.ScheduleOrderDto, customerOrderTranslation))
|
||||
return null;
|
||||
|
||||
if (TryGetValidCustomerOrder(orderModel.ScheduleOrderDto, customerOrderTranslation.CoCoNum).Result is not
|
||||
{ } customerOrder)
|
||||
return null;
|
||||
|
||||
orderModel.CustomerOrder = customerOrder;
|
||||
|
||||
customerOrderEnricher.Enrich(ediCustomerOrder, customerOrder);
|
||||
|
||||
int lineNumber = 0;
|
||||
|
||||
EdiCustomerOrderDto ediCustomerOrder = CreateEdiCustomerOrder(orderModel);
|
||||
IList<EdiCustomerOrderLineDto> ediCustomerOrderLines = new List<EdiCustomerOrderLineDto>();
|
||||
|
||||
foreach (ScheduleOrderDetailDto scheduleOrderDetail in orderModel.ScheduleOrderDetailsByGate)
|
||||
await Process(orderModel, ediCustomerOrder, (scheduleOrderDetails, lineNumber) =>
|
||||
{
|
||||
EdiCustomerOrderLineDto? ediCustomerOrderLine = CreateCustomerOrderLine(scheduleOrderDetail, orderModel,
|
||||
ediCustomerOrder.CustomerOrderNumber, ++lineNumber);
|
||||
foreach (ScheduleOrderDetailDto scheduleOrderDetail in scheduleOrderDetails)
|
||||
{
|
||||
EdiCustomerOrderLineDto? ediCustomerOrderLine = CreateCustomerOrderLine(scheduleOrderDetail, orderModel,
|
||||
ediCustomerOrder.CustomerOrderNumber, ++lineNumber);
|
||||
|
||||
if (ediCustomerOrderLine is null) continue;
|
||||
if (ediCustomerOrderLine is null) continue;
|
||||
|
||||
ediCustomerOrderLines.Add(ediCustomerOrderLine);
|
||||
ediCustomerOrderLines.Add(ediCustomerOrderLine);
|
||||
|
||||
ediCustomerOrderLine.EdiCustomerOrderLineItems = CreateEdiCustomerOrderLineItems(scheduleOrderDetail,
|
||||
ediCustomerOrderLine, orderModel, ediCustomerOrder.CustomerOrderNumber);
|
||||
}
|
||||
ediCustomerOrderLine.EdiCustomerOrderLineItems = CreateEdiCustomerOrderLineItems(scheduleOrderDetail,
|
||||
ediCustomerOrderLine, orderModel, ediCustomerOrder.CustomerOrderNumber);
|
||||
}
|
||||
|
||||
ediCustomerOrder.EdiCustomerOrderLines = ediCustomerOrderLines;
|
||||
ediCustomerOrder.EdiCustomerOrderTranslates = new List<EdiCustomerOrderTranslateDto>
|
||||
{
|
||||
customerOrderTranslation
|
||||
};
|
||||
return ediCustomerOrderLines;
|
||||
});
|
||||
|
||||
return ediCustomerOrder;
|
||||
}
|
||||
|
||||
@@ -24,8 +24,79 @@ namespace DelforSenders.Clients.Stellantis
|
||||
customerOrderLineEnricher, itemEnricher, itemPriceEnricher, ediCustomerOrderLineEnricher, customerOrderEnricher,
|
||||
validator), IClientStellantis
|
||||
{
|
||||
public Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel)
|
||||
public async Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel,
|
||||
IList<StellantisConfigModel> stellantisConfig)
|
||||
{
|
||||
EdiCustomerOrderDto ediCustomerOrder = CreateEdiCustomerOrder(orderModel);
|
||||
IList<EdiCustomerOrderLineDto> ediCustomerOrderLines = new List<EdiCustomerOrderLineDto>();
|
||||
|
||||
await Process(orderModel, ediCustomerOrder, (scheduleOrderDetails, lineNumber) =>
|
||||
{
|
||||
foreach (ScheduleOrderDetailDto scheduleOrderDetail in scheduleOrderDetails)
|
||||
{
|
||||
MapItemNumberIfNeeded(orderModel, stellantisConfig, scheduleOrderDetail);
|
||||
|
||||
EdiCustomerOrderLineDto? ediCustomerOrderLine = CreateCustomerOrderLine(scheduleOrderDetail,
|
||||
orderModel, ediCustomerOrder.CustomerOrderNumber, ++lineNumber);
|
||||
|
||||
if (ediCustomerOrderLine is null) continue;
|
||||
|
||||
ediCustomerOrderLines.Add(ediCustomerOrderLine);
|
||||
|
||||
ediCustomerOrderLine.EdiCustomerOrderLineItems = CreateEdiCustomerOrderLineItems(
|
||||
scheduleOrderDetail, ediCustomerOrderLine, orderModel, ediCustomerOrder.CustomerOrderNumber);
|
||||
}
|
||||
|
||||
return ediCustomerOrderLines;
|
||||
});
|
||||
|
||||
return ediCustomerOrder;
|
||||
}
|
||||
|
||||
private static void MapItemNumberIfNeeded(OrderModel orderModel, IList<StellantisConfigModel> stellantisConfig,
|
||||
ScheduleOrderDetailDto scheduleOrderDetail)
|
||||
{
|
||||
if (stellantisConfig.FirstOrDefault(x =>
|
||||
x.ItemNumber == scheduleOrderDetail.Sh_productCode &&
|
||||
x.Recipient == orderModel.ScheduleOrderDto.Recipient.ID) is { } mapper)
|
||||
{
|
||||
scheduleOrderDetail.Sh_productCode = mapper.NewItemNumber;
|
||||
}
|
||||
}
|
||||
|
||||
private IList<EdiCustomerOrderLineItemDto> CreateEdiCustomerOrderLineItems(
|
||||
ScheduleOrderDetailDto scheduleOrderDetail, EdiCustomerOrderLineDto ediCustomerOrderLine,
|
||||
OrderModel orderModel,
|
||||
string customerOrderNumber)
|
||||
{
|
||||
List<ScheduleOrderDetailDetailDto> scheduleOrderDetailsDetails =
|
||||
scheduleOrderDetail.ScheduleOrderDetailDetails.ToList();
|
||||
List<EdiCustomerOrderLineItemDto> ediCustomerOrderLineItems = new List<EdiCustomerOrderLineItemDto>();
|
||||
|
||||
int itemNumber = 0;
|
||||
|
||||
foreach (ScheduleOrderDetailDetailDto scheduleOrderDetailDetail in scheduleOrderDetailsDetails
|
||||
.Where(x => x.Qty > 0 && x.QtyType != "54").OrderBy(x => x.DateTo))
|
||||
{
|
||||
EdiCustomerOrderLineItemDto? ediCustomerOrderLineItem =
|
||||
CreateCustomerOrderLineItem(scheduleOrderDetailDetail, ediCustomerOrderLine, orderModel,
|
||||
customerOrderNumber, ++itemNumber);
|
||||
|
||||
if (ediCustomerOrderLineItem is null) continue;
|
||||
|
||||
ediCustomerOrderLineItems.Add(ediCustomerOrderLineItem);
|
||||
}
|
||||
|
||||
if (orderModel.ScheduleOrderDto.DocType == "DELJIT" && orderModel.CustomerOrder is not null)
|
||||
{
|
||||
ediCustomerOrderLineItems.AddRange(GetPlannedDetailsForDeljit(
|
||||
orderModel.CustomerOrder.CustomerOrderLines.First(x =>
|
||||
x.Item == ediCustomerOrderLine.Item), ediCustomerOrderLine.EdiCustomerOrderLineItems.ToList()));
|
||||
}
|
||||
|
||||
EnumerateEdiCustomerOrderLineItems(ediCustomerOrderLineItems, ediCustomerOrderLine.CustomerOrderNumber);
|
||||
|
||||
return ediCustomerOrderLineItems;
|
||||
}
|
||||
|
||||
protected override EdiCustomerOrderLineDto? CreateCustomerOrderLine(ScheduleOrderDetailDto scheduleOrderDetail,
|
||||
@@ -37,7 +108,7 @@ namespace DelforSenders.Clients.Stellantis
|
||||
if (ediCustomerOrderLine is null) return null;
|
||||
|
||||
ediCustomerOrderLine.BoxType = GetBoxType(scheduleOrderDetail);
|
||||
|
||||
|
||||
return ediCustomerOrderLine;
|
||||
}
|
||||
|
||||
@@ -57,7 +128,7 @@ namespace DelforSenders.Clients.Stellantis
|
||||
|
||||
ediCustomerOrderLineItem.PalletCode = GetPalletCode(scheduleOrderDetail);
|
||||
ediCustomerOrderLineItem.PalletNumber = GetPalletNumber(scheduleOrderDetail);
|
||||
|
||||
|
||||
return ediCustomerOrderLineItem;
|
||||
}
|
||||
|
||||
@@ -95,16 +166,18 @@ namespace DelforSenders.Clients.Stellantis
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public IList<EdiCustomerOrderLineItemDto> GetPlannedDetailsForDeljit(CustomerOrderLineDto customerOrderLine, IList<EdiCustomerOrderLineItemDto> ediCustomerOrderLineItems)
|
||||
|
||||
private IList<EdiCustomerOrderLineItemDto> GetPlannedDetailsForDeljit(CustomerOrderLineDto customerOrderLine,
|
||||
List<EdiCustomerOrderLineItemDto> ediCustomerOrderLineItems)
|
||||
{
|
||||
DateTime? maxDueDate = ediCustomerOrderLineItems.Max(x => x.DueDate);
|
||||
IList<DateTime?> plannedDates = ediCustomerOrderLineItems.Select(x => x.DueDate).Distinct().ToList();
|
||||
|
||||
|
||||
IList<CustomerOrderLineItemDto> customerOrderLineItems =
|
||||
customerOrderLine.CustomerOrderLineItems.Where(x => x.Stat == "P").ToList();
|
||||
|
||||
List<EdiCustomerOrderLineItemDto> plannedDetailsForDeljit = customerOrderLineItems.Where(x => !plannedDates.Contains(x.DueDate) && x.DueDate > maxDueDate)
|
||||
List<EdiCustomerOrderLineItemDto> plannedDetailsForDeljit = customerOrderLineItems
|
||||
.Where(x => !plannedDates.Contains(x.DueDate) && x.DueDate > maxDueDate)
|
||||
.Select(x => new EdiCustomerOrderLineItemDto
|
||||
{
|
||||
ReceivedDate = x.CreateDate,
|
||||
@@ -146,5 +219,20 @@ namespace DelforSenders.Clients.Stellantis
|
||||
|
||||
return plannedDetailsForDeljit;
|
||||
}
|
||||
|
||||
private void EnumerateEdiCustomerOrderLineItems(List<EdiCustomerOrderLineItemDto> ediCustomerOrderLineItems,
|
||||
string customerOrderNumber)
|
||||
{
|
||||
int lineItemNumber = 0;
|
||||
|
||||
foreach (EdiCustomerOrderLineItemDto ediCustomerOrderLineItem in ediCustomerOrderLineItems.OrderBy(x =>
|
||||
x.DueDate))
|
||||
{
|
||||
ediCustomerOrderLineItem.CustomerOrderRelease = ++lineItemNumber;
|
||||
ediCustomerOrderLineItem.SupplyQtyConvFactor = 1;
|
||||
ediCustomerOrderLineItem.CustomerOrderNumber = customerOrderNumber;
|
||||
ediCustomerOrderLineItem.RowPointer = Guid.NewGuid();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace DelforSenders.Clients.Stellantis
|
||||
{
|
||||
public interface IClientStellantis
|
||||
{
|
||||
Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel);
|
||||
Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel,
|
||||
IList<StellantisConfigModel> stellantisConfig);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using DelforSenders.Clients.Scania;
|
||||
using DelforSenders.Clients.Stellantis;
|
||||
using DelforSenders.Enums;
|
||||
using DelforSenders.Models;
|
||||
using DelforSenders.Services;
|
||||
@@ -7,7 +8,7 @@ using SytelineSaAppEfDataModel.Dtos;
|
||||
|
||||
namespace DelforSenders.Core;
|
||||
|
||||
public class App(IAppService appService, IClientScania scania, IValidator validator) : IApp
|
||||
public class App(IAppService appService, IClientScania scania, IClientStellantis stellantis, IValidator validator) : IApp
|
||||
{
|
||||
public async Task RunAsync()
|
||||
{
|
||||
@@ -19,14 +20,14 @@ public class App(IAppService appService, IClientScania scania, IValidator valida
|
||||
return;
|
||||
}
|
||||
|
||||
lastUpdateDate = new DateTime(2025, 8, 24);
|
||||
lastUpdateDate = new DateTime(2025, 8, 26);
|
||||
|
||||
IList<CustomerDto> customers = await appService.GetCustomers();
|
||||
IList<CustomerTpDto> customerTps = await appService.GetCustomerTps();
|
||||
List<CustomerConfigModel> customersFromConfig = appService.GetCustomersFromConfig();
|
||||
IList<CustomerConfigModel> customersFromConfig = appService.GetCustomersFromConfig();
|
||||
|
||||
IEnumerable<ScheduleOrderDto> scheduleOrders = await appService.GetScheduleOrders(lastUpdateDate.Value);
|
||||
scheduleOrders = scheduleOrders.Where(x => x.ID == 22996).Take(1).ToList();
|
||||
scheduleOrders = scheduleOrders.Where(x => x.ID == 23051).Take(1).ToList();
|
||||
|
||||
int lastOrderNumber = await appService.GetLastOrderNumber();
|
||||
|
||||
@@ -76,13 +77,14 @@ public class App(IAppService appService, IClientScania scania, IValidator valida
|
||||
case Client.Man:
|
||||
case Client.Edscha:
|
||||
case Client.Volvo:
|
||||
return null;
|
||||
case Client.Stellantis:
|
||||
return await stellantis.ProcessClientOrder(orderModel, appService.GetStellantisConfig());
|
||||
case Client.Tofas:
|
||||
case Client.Strattec:
|
||||
case Client.StellantisArgentina:
|
||||
return null;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,14 +109,14 @@ public class App(IAppService appService, IClientScania scania, IValidator valida
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool TryGetValidCustomerTp(ScheduleOrderDto scheduleOrder, IList<CustomerTpDto> customerTps, List<CustomerConfigModel> customersFromConfig,
|
||||
out CustomerTpDto? customerTp)
|
||||
private bool TryGetValidCustomerTp(ScheduleOrderDto scheduleOrder, IList<CustomerTpDto> customerTps,
|
||||
IList<CustomerConfigModel> customersFromConfig, out CustomerTpDto? customerTp)
|
||||
{
|
||||
(var isValidCustomerTp, customerTp) =
|
||||
validator.TryGetValidCustomerTp(scheduleOrder, customerTps, customersFromConfig);
|
||||
|
||||
if (isValidCustomerTp && customerTp is not null) return true;
|
||||
|
||||
|
||||
string errors = validator.GetErrors();
|
||||
Console.WriteLine(errors);
|
||||
return false;
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
namespace DelforSenders.Models;
|
||||
|
||||
public abstract class CustomerConfigModel
|
||||
{
|
||||
public string TpCode { get; set; }
|
||||
public string CustomerNumber { get; set; }
|
||||
public int CustomerSequenceNumber { get; set; }
|
||||
}
|
||||
public record CustomerConfigModel(string TpCode, string CustomerNumber, int CustomerSequenceNumber);
|
||||
3
DelforSender/Models/StellantisConfigModel.cs
Normal file
3
DelforSender/Models/StellantisConfigModel.cs
Normal file
@@ -0,0 +1,3 @@
|
||||
namespace DelforSenders.Models;
|
||||
|
||||
public record StellantisConfigModel(string ItemNumber, int Recipient, string NewItemNumber);
|
||||
@@ -66,11 +66,19 @@ public class AppService(IRestClient restClient, IConfiguration configuration) :
|
||||
return response.IsSuccessful ? response.Data : 0;
|
||||
}
|
||||
|
||||
public List<CustomerConfigModel> GetCustomersFromConfig()
|
||||
public IList<CustomerConfigModel> GetCustomersFromConfig()
|
||||
{
|
||||
var customers = configuration.GetSection("Customers").Get<List<CustomerConfigModel>>() ??
|
||||
new List<CustomerConfigModel>();
|
||||
|
||||
return customers;
|
||||
}
|
||||
|
||||
public IList<StellantisConfigModel> GetStellantisConfig()
|
||||
{
|
||||
var stellantisConfig = configuration.GetSection("StellantisMappers").Get<List<StellantisConfigModel>>() ??
|
||||
new List<StellantisConfigModel>();
|
||||
|
||||
return stellantisConfig;
|
||||
}
|
||||
}
|
||||
@@ -11,5 +11,6 @@ public interface IAppService
|
||||
Task<IList<CustomerDto>> GetCustomers();
|
||||
Task<IList<CustomerTpDto>> GetCustomerTps();
|
||||
Task<int> GetLastOrderNumber();
|
||||
List<CustomerConfigModel> GetCustomersFromConfig();
|
||||
IList<CustomerConfigModel> GetCustomersFromConfig();
|
||||
IList<StellantisConfigModel> GetStellantisConfig();
|
||||
}
|
||||
@@ -19,6 +19,13 @@
|
||||
"ToEmail": "piotr.kus@fakrosno.pl,marek.zolna@fakrosno.pl",
|
||||
"Ssl": false
|
||||
},
|
||||
"StellantisMappers": [
|
||||
{
|
||||
"ItemNumber": "FA71004.97C",
|
||||
"Recipient": 35,
|
||||
"NewItemNumber": "FA71004.97B"
|
||||
}
|
||||
],
|
||||
"Customers": [
|
||||
{
|
||||
"TpCode": "000254206547900919",
|
||||
|
||||
Reference in New Issue
Block a user