DRAB/Drab.Logic/Services/OrdersStore.cs
2025-07-11 10:50:46 +02:00

74 lines
2.6 KiB
C#

using System.Globalization;
using Drab.Core.Models;
using Microsoft.EntityFrameworkCore;
using Pcm.Db;
using Pcm.Db.Enums;
namespace Drab.Logic.Services;
public class OrdersStore : IOrdersStore, IDisposable
{
private readonly ILogger<OrdersStore> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IDrabSettings _drabSettings;
public OrdersStore(ILogger<OrdersStore> logger, IServiceScopeFactory serviceScopeFactory, IDrabSettings drabSettings)
{
_serviceScopeFactory = serviceScopeFactory;
_drabSettings = drabSettings;
_logger = logger;
}
public async Task<Result<List<DokDto>, string>> FetchOrders()
{
_logger.LogInformation("Fetch new orders");
var now = DateTime.Now;
var fallbackDate = now - TimeSpan.FromDays(30);
DateTime date;
try
{
var parsed = DateTime.ParseExact(_drabSettings.IgnoreOrdersBefore, "yyyy-MM-dd", CultureInfo.InvariantCulture);
date = (now - parsed).TotalDays > 30 ? fallbackDate : parsed;
}
catch
{
_logger.LogWarning("IgnoreOrdersBefore is invalid, falling back to last 30 days.");
date = fallbackDate;
}
using var scope = _serviceScopeFactory.CreateScope();
await using var dbContext = scope.ServiceProvider.GetService<PcmDbContext>();
try
{
var orders = await dbContext.Dokumenty
.Where(x => x.Aktywny == 1
&& x.TypDok == (short)TypDok.RejestracjaZamowieniaOdOdbiorcy
&& x.Opcja1 == 0
&& x.Data >= date)
.Include(x => x.DokKontr)
.ThenInclude(x => x.Kontr)
.Include(x => x.TekstDoks.Where(y =>
y.Znaczenie == (short)TekstDokZnaczenie.InfoDoZamowienia ||
y.Znaczenie == (short)TekstDokZnaczenie.TekstDod2))
.Include(x => x.PozDoks)
.ThenInclude(x => x.TekstPozs.Where(y => y.Znaczenie == 0 || y.Znaczenie == 13))
.Include(x => x.PozDoks)
.ThenInclude(x => x.Tow)
.ThenInclude(x => x.Jm)
.ToListAsync();
return Result.Ok<List<DokDto>, string>(orders.Select(x => x.ToDokDto()).ToList());
}
catch (Exception e)
{
_logger.LogError(e, "Error on fetching orders");
return Result.Failed<List<DokDto>, string>(e.Message);
}
}
public void Dispose()
{
}
}