* Added Client Stellantis and mapped it

* Code cleanup
This commit is contained in:
2025-08-27 15:49:24 +02:00
parent 8f95736d84
commit 3abee3ff1c
10 changed files with 177 additions and 61 deletions

View File

@@ -21,7 +21,36 @@ public class ClientBase(
IEnricher<EdiCustomerOrderDto, CustomerOrderDto> customerOrderEnricher, IEnricher<EdiCustomerOrderDto, CustomerOrderDto> customerOrderEnricher,
IValidator validator) 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}"; string orderNumber = $"EDI{orderModel.GetOrderNumber():0000000}";
@@ -73,15 +102,17 @@ public class ClientBase(
ScheduleOrderDetailDetailDto scheduleOrderDetailDetail, EdiCustomerOrderLineDto ediCustomerOrderLine, ScheduleOrderDetailDetailDto scheduleOrderDetailDetail, EdiCustomerOrderLineDto ediCustomerOrderLine,
OrderModel orderModel, string customerOrderNumber, int itemNumber) OrderModel orderModel, string customerOrderNumber, int itemNumber)
{ {
bool isDeljit = orderModel.ScheduleOrderDto.DocType.StartsWith("DELJIT");
EdiCustomerOrderLineItemDto ediCustomerOrderLineItem = itemTranslator.Translate(scheduleOrderDetailDetail); EdiCustomerOrderLineItemDto ediCustomerOrderLineItem = itemTranslator.Translate(scheduleOrderDetailDetail);
ediCustomerOrderLineItem.CustomerOrderNumber = customerOrderNumber; ediCustomerOrderLineItem.CustomerOrderNumber = customerOrderNumber;
ediCustomerOrderLineItem.CustomerOrderRelease = itemNumber; ediCustomerOrderLineItem.CustomerOrderRelease = itemNumber;
ediCustomerOrderLineItem.NewStatus = orderModel.ScheduleOrderDto.DocType == "DELJIT" ? "O" : "P"; ediCustomerOrderLineItem.NewStatus = isDeljit ? "O" : "P";
ediCustomerOrderLineItem.CustomerOrderCustomerNumber = orderModel.Customer.CustNum; ediCustomerOrderLineItem.CustomerOrderCustomerNumber = orderModel.Customer.CustNum;
ediCustomerOrderLineItem.CustomerNumber = orderModel.Customer.CustNum; ediCustomerOrderLineItem.CustomerNumber = orderModel.Customer.CustNum;
ediCustomerOrderLineItem.CustomerSequence = orderModel.Customer.CustSeq; ediCustomerOrderLineItem.CustomerSequence = orderModel.Customer.CustSeq;
ediCustomerOrderLineItem.CustomerPoNumber = orderModel.CustomerOrder?.CustPo ?? string.Empty; 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.Warehouse = orderModel.Warehouse;
ediCustomerOrderLineItem.DueDate = GetDueDate(scheduleOrderDetailDetail); ediCustomerOrderLineItem.DueDate = GetDueDate(scheduleOrderDetailDetail);

View File

@@ -23,48 +23,28 @@ public class ClientScania(
customerOrderLineEnricher, itemEnricher, itemPriceEnricher, ediCustomerOrderLineEnricher, customerOrderEnricher, customerOrderLineEnricher, itemEnricher, itemPriceEnricher, ediCustomerOrderLineEnricher, customerOrderEnricher,
validator), IClientScania validator), IClientScania
{ {
private readonly IValidator _validator = validator;
public async Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel) public async Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel)
{ {
EdiCustomerOrderDto ediCustomerOrder = CreateCustomerOrder(orderModel); EdiCustomerOrderDto ediCustomerOrder = CreateEdiCustomerOrder(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;
IList<EdiCustomerOrderLineDto> ediCustomerOrderLines = new List<EdiCustomerOrderLineDto>(); IList<EdiCustomerOrderLineDto> ediCustomerOrderLines = new List<EdiCustomerOrderLineDto>();
foreach (ScheduleOrderDetailDto scheduleOrderDetail in orderModel.ScheduleOrderDetailsByGate) await Process(orderModel, ediCustomerOrder, (scheduleOrderDetails, lineNumber) =>
{ {
EdiCustomerOrderLineDto? ediCustomerOrderLine = CreateCustomerOrderLine(scheduleOrderDetail, orderModel, foreach (ScheduleOrderDetailDto scheduleOrderDetail in scheduleOrderDetails)
ediCustomerOrder.CustomerOrderNumber, ++lineNumber); {
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.EdiCustomerOrderLineItems = CreateEdiCustomerOrderLineItems(scheduleOrderDetail,
ediCustomerOrderLine, orderModel, ediCustomerOrder.CustomerOrderNumber); ediCustomerOrderLine, orderModel, ediCustomerOrder.CustomerOrderNumber);
} }
ediCustomerOrder.EdiCustomerOrderLines = ediCustomerOrderLines; return ediCustomerOrderLines;
ediCustomerOrder.EdiCustomerOrderTranslates = new List<EdiCustomerOrderTranslateDto> });
{
customerOrderTranslation
};
return ediCustomerOrder; return ediCustomerOrder;
} }

View File

@@ -24,8 +24,79 @@ namespace DelforSenders.Clients.Stellantis
customerOrderLineEnricher, itemEnricher, itemPriceEnricher, ediCustomerOrderLineEnricher, customerOrderEnricher, customerOrderLineEnricher, itemEnricher, itemPriceEnricher, ediCustomerOrderLineEnricher, customerOrderEnricher,
validator), IClientStellantis 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, protected override EdiCustomerOrderLineDto? CreateCustomerOrderLine(ScheduleOrderDetailDto scheduleOrderDetail,
@@ -37,7 +108,7 @@ namespace DelforSenders.Clients.Stellantis
if (ediCustomerOrderLine is null) return null; if (ediCustomerOrderLine is null) return null;
ediCustomerOrderLine.BoxType = GetBoxType(scheduleOrderDetail); ediCustomerOrderLine.BoxType = GetBoxType(scheduleOrderDetail);
return ediCustomerOrderLine; return ediCustomerOrderLine;
} }
@@ -57,7 +128,7 @@ namespace DelforSenders.Clients.Stellantis
ediCustomerOrderLineItem.PalletCode = GetPalletCode(scheduleOrderDetail); ediCustomerOrderLineItem.PalletCode = GetPalletCode(scheduleOrderDetail);
ediCustomerOrderLineItem.PalletNumber = GetPalletNumber(scheduleOrderDetail); ediCustomerOrderLineItem.PalletNumber = GetPalletNumber(scheduleOrderDetail);
return ediCustomerOrderLineItem; return ediCustomerOrderLineItem;
} }
@@ -95,16 +166,18 @@ namespace DelforSenders.Clients.Stellantis
return null; 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); DateTime? maxDueDate = ediCustomerOrderLineItems.Max(x => x.DueDate);
IList<DateTime?> plannedDates = ediCustomerOrderLineItems.Select(x => x.DueDate).Distinct().ToList(); IList<DateTime?> plannedDates = ediCustomerOrderLineItems.Select(x => x.DueDate).Distinct().ToList();
IList<CustomerOrderLineItemDto> customerOrderLineItems = IList<CustomerOrderLineItemDto> customerOrderLineItems =
customerOrderLine.CustomerOrderLineItems.Where(x => x.Stat == "P").ToList(); 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 .Select(x => new EdiCustomerOrderLineItemDto
{ {
ReceivedDate = x.CreateDate, ReceivedDate = x.CreateDate,
@@ -146,5 +219,20 @@ namespace DelforSenders.Clients.Stellantis
return plannedDetailsForDeljit; 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();
}
}
} }
} }

View File

@@ -5,6 +5,7 @@ namespace DelforSenders.Clients.Stellantis
{ {
public interface IClientStellantis public interface IClientStellantis
{ {
Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel); Task<EdiCustomerOrderDto?> ProcessClientOrder(OrderModel orderModel,
IList<StellantisConfigModel> stellantisConfig);
} }
} }

View File

@@ -1,4 +1,5 @@
using DelforSenders.Clients.Scania; using DelforSenders.Clients.Scania;
using DelforSenders.Clients.Stellantis;
using DelforSenders.Enums; using DelforSenders.Enums;
using DelforSenders.Models; using DelforSenders.Models;
using DelforSenders.Services; using DelforSenders.Services;
@@ -7,7 +8,7 @@ using SytelineSaAppEfDataModel.Dtos;
namespace DelforSenders.Core; 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() public async Task RunAsync()
{ {
@@ -19,14 +20,14 @@ public class App(IAppService appService, IClientScania scania, IValidator valida
return; return;
} }
lastUpdateDate = new DateTime(2025, 8, 24); lastUpdateDate = new DateTime(2025, 8, 26);
IList<CustomerDto> customers = await appService.GetCustomers(); IList<CustomerDto> customers = await appService.GetCustomers();
IList<CustomerTpDto> customerTps = await appService.GetCustomerTps(); IList<CustomerTpDto> customerTps = await appService.GetCustomerTps();
List<CustomerConfigModel> customersFromConfig = appService.GetCustomersFromConfig(); IList<CustomerConfigModel> customersFromConfig = appService.GetCustomersFromConfig();
IEnumerable<ScheduleOrderDto> scheduleOrders = await appService.GetScheduleOrders(lastUpdateDate.Value); 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(); int lastOrderNumber = await appService.GetLastOrderNumber();
@@ -76,13 +77,14 @@ public class App(IAppService appService, IClientScania scania, IValidator valida
case Client.Man: case Client.Man:
case Client.Edscha: case Client.Edscha:
case Client.Volvo: case Client.Volvo:
return null;
case Client.Stellantis: case Client.Stellantis:
return await stellantis.ProcessClientOrder(orderModel, appService.GetStellantisConfig());
case Client.Tofas: case Client.Tofas:
case Client.Strattec: case Client.Strattec:
case Client.StellantisArgentina: case Client.StellantisArgentina:
return null;
default: default:
throw new ArgumentOutOfRangeException(); return null;
} }
} }
@@ -107,14 +109,14 @@ public class App(IAppService appService, IClientScania scania, IValidator valida
return false; return false;
} }
private bool TryGetValidCustomerTp(ScheduleOrderDto scheduleOrder, IList<CustomerTpDto> customerTps, List<CustomerConfigModel> customersFromConfig, private bool TryGetValidCustomerTp(ScheduleOrderDto scheduleOrder, IList<CustomerTpDto> customerTps,
out CustomerTpDto? customerTp) IList<CustomerConfigModel> customersFromConfig, out CustomerTpDto? customerTp)
{ {
(var isValidCustomerTp, customerTp) = (var isValidCustomerTp, customerTp) =
validator.TryGetValidCustomerTp(scheduleOrder, customerTps, customersFromConfig); validator.TryGetValidCustomerTp(scheduleOrder, customerTps, customersFromConfig);
if (isValidCustomerTp && customerTp is not null) return true; if (isValidCustomerTp && customerTp is not null) return true;
string errors = validator.GetErrors(); string errors = validator.GetErrors();
Console.WriteLine(errors); Console.WriteLine(errors);
return false; return false;

View File

@@ -1,8 +1,3 @@
namespace DelforSenders.Models; namespace DelforSenders.Models;
public abstract class CustomerConfigModel public record CustomerConfigModel(string TpCode, string CustomerNumber, int CustomerSequenceNumber);
{
public string TpCode { get; set; }
public string CustomerNumber { get; set; }
public int CustomerSequenceNumber { get; set; }
}

View File

@@ -0,0 +1,3 @@
namespace DelforSenders.Models;
public record StellantisConfigModel(string ItemNumber, int Recipient, string NewItemNumber);

View File

@@ -66,11 +66,19 @@ public class AppService(IRestClient restClient, IConfiguration configuration) :
return response.IsSuccessful ? response.Data : 0; return response.IsSuccessful ? response.Data : 0;
} }
public List<CustomerConfigModel> GetCustomersFromConfig() public IList<CustomerConfigModel> GetCustomersFromConfig()
{ {
var customers = configuration.GetSection("Customers").Get<List<CustomerConfigModel>>() ?? var customers = configuration.GetSection("Customers").Get<List<CustomerConfigModel>>() ??
new List<CustomerConfigModel>(); new List<CustomerConfigModel>();
return customers; return customers;
} }
public IList<StellantisConfigModel> GetStellantisConfig()
{
var stellantisConfig = configuration.GetSection("StellantisMappers").Get<List<StellantisConfigModel>>() ??
new List<StellantisConfigModel>();
return stellantisConfig;
}
} }

View File

@@ -11,5 +11,6 @@ public interface IAppService
Task<IList<CustomerDto>> GetCustomers(); Task<IList<CustomerDto>> GetCustomers();
Task<IList<CustomerTpDto>> GetCustomerTps(); Task<IList<CustomerTpDto>> GetCustomerTps();
Task<int> GetLastOrderNumber(); Task<int> GetLastOrderNumber();
List<CustomerConfigModel> GetCustomersFromConfig(); IList<CustomerConfigModel> GetCustomersFromConfig();
IList<StellantisConfigModel> GetStellantisConfig();
} }

View File

@@ -19,6 +19,13 @@
"ToEmail": "piotr.kus@fakrosno.pl,marek.zolna@fakrosno.pl", "ToEmail": "piotr.kus@fakrosno.pl,marek.zolna@fakrosno.pl",
"Ssl": false "Ssl": false
}, },
"StellantisMappers": [
{
"ItemNumber": "FA71004.97C",
"Recipient": 35,
"NewItemNumber": "FA71004.97B"
}
],
"Customers": [ "Customers": [
{ {
"TpCode": "000254206547900919", "TpCode": "000254206547900919",