* 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,
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);

View File

@@ -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;
}

View File

@@ -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();
}
}
}
}

View File

@@ -5,6 +5,7 @@ namespace DelforSenders.Clients.Stellantis
{
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.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;

View File

@@ -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);

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;
}
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;
}
}

View File

@@ -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();
}

View File

@@ -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",