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 _logger; private readonly IServiceScopeFactory _serviceScopeFactory; private readonly IDrabSettings _drabSettings; public OrdersStore(ILogger logger, IServiceScopeFactory serviceScopeFactory, IDrabSettings drabSettings) { _serviceScopeFactory = serviceScopeFactory; _drabSettings = drabSettings; _logger = logger; } public async Task, 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(); 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, string>(orders.Select(x => x.ToDokDto()).ToList()); } catch (Exception e) { _logger.LogError(e, "Error on fetching orders"); return Result.Failed, string>(e.Message); } } public void Dispose() { } }