New version

This commit is contained in:
Piotr Dudek 2025-07-11 00:18:14 +02:00
parent 6b6c90272c
commit 49038de2b5
341 changed files with 18364 additions and 0 deletions

55
.gitignore vendored Normal file
View File

@ -0,0 +1,55 @@
# These are some examples of commonly ignored file patterns.
# You should customize this list as applicable to your project.
# Learn more about .gitignore:
# https://www.atlassian.com/git/tutorials/saving-changes/gitignore
# Node artifact files
node_modules/
dist/
# Compiled Java class files
*.class
# Compiled Python bytecode
*.py[cod]
# Log files
*.log
# Package files
*.jar
# Maven
target/
dist/
# JetBrains IDE
.idea/
# Unit test reports
TEST*.xml
# Generated by MacOS
.DS_Store
# Generated by Windows
Thumbs.db
# Applications
*.app
*.exe
*.war
# Large media files
*.mp4
*.tiff
*.avi
*.flv
*.mov
*.wmv
.vs
*/bin
*/obj
Drab/.config
Drab/drab.db

View File

@ -0,0 +1,9 @@
namespace Drab.Core.Configuration;
public class DrabSettings : IDrabSettings
{
public const string SectionName = "DrabSettings";
public int DbPollingFrequencyInSeconds { get; set; }
public int PrinterTimeoutSeconds { get; set; }
public string IgnoreOrdersBefore { get; set; }
}

View File

@ -0,0 +1,8 @@
namespace Drab.Core.Configuration;
public interface IDrabSettings
{
int DbPollingFrequencyInSeconds { get; }
int PrinterTimeoutSeconds { get; }
public string IgnoreOrdersBefore { get; set; }
}

View File

@ -0,0 +1,9 @@
using Drab.LocalDb.IoC;
namespace Drab.Core.Configuration;
public class LocalDbConfiguration : ILocalDbConfiguration
{
public const string SectionName = "LocalDbConnection";
public string ConnectionString { get; set; }
}

View File

@ -0,0 +1,13 @@
using Pcm.Db.Ioc;
namespace Drab.Core.Configuration;
public class PcmDbConfiguration : IDbConfiguration
{
public const string SectionName = "PcmDbSettings";
public string Host { get; set; }
public string Port { get; set; }
public string User { get; set; }
public string Password { get; set; }
public string Database { get; set; }
}

View File

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows</TargetFramework>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Drab.LocalDb\Drab.LocalDb.csproj"/>
<ProjectReference Include="..\Pcm.Db\Pcm.Db.csproj"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="6.0.1"/>
</ItemGroup>
</Project>

View File

@ -0,0 +1,13 @@
using Drab.Core.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Drab.Core.Ioc;
public static class IocCoreRegister
{
public static IServiceCollection AddDrabCore(this IServiceCollection services, IDrabSettings settings)
{
services.AddSingleton(settings);
return services;
}
}

View File

@ -0,0 +1,82 @@
using System;
namespace Drab.Core.Models;
public class Result<TOk, TBad>
{
private TBad _error;
private TOk _ok;
public bool IsOk { get; }
public bool IsNotOk => !IsOk;
public Result(bool isOk, TOk ok, TBad bad)
{
IsOk = isOk;
if (IsOk)
{
if (ok == null)
throw new ArgumentNullException(nameof(ok), "If IsOk flag is set to true parameter 'ok' needs to be non null");
Value = ok;
}
else
{
if (bad == null)
throw new ArgumentNullException(nameof(bad), "If IsOk flag is set to false parameter 'bad' needs to be non null");
Error = bad;
}
}
public TBad Error
{
get
{
if (IsOk)
throw new InvalidOperationException("Result has IsOk flag set to true only Value property is available");
return _error;
}
private set => _error = value;
}
public TOk Value
{
get
{
if (!IsOk)
throw new InvalidOperationException("Result has IsOk flag set to false only Error property is available");
return _ok;
}
private set => _ok = value;
}
public Result<TNew, TBad> Map<TNew>(Func<TOk, TNew> map) where TNew : class
{
if (IsOk)
return new Result<TNew, TBad>(IsOk, map(Value), default);
else
return new Result<TNew, TBad>(false, default, Error);
}
public TOk ValueWithDefault(Func<TBad, TOk> defaultCreator) => IsOk ? Value : defaultCreator(Error);
public void Do(Action<TOk> action)
{
if (IsOk)
action(Value);
}
}
public class Result
{
public static Result<T, TK> Failed<T, TK>(TK wrong)
{
return new Result<T, TK>(false, default(T), wrong);
}
public static Result<T, TK> Ok<T, TK>(T ok)
{
return new Result<T, TK>(true, ok, default(TK));
}
}

View File

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows</TargetFramework>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.7"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.7"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="9.0.7"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6"/>
</ItemGroup>
<ItemGroup>
<Folder Include="Migrations"/>
</ItemGroup>
</Project>

View File

@ -0,0 +1,16 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Drab.LocalDb.Entities;
public class OrderDb
{
[Key]
public long OrderId { get; set; }
public long DokId { get; set; }
public DateTime Created { get; set; }
public bool IsPrinted { get; set; }
public string Filename { get; set; }
public string Shop { get; set; }
public string OrderNumber { get; set; }
}

View File

@ -0,0 +1,6 @@
namespace Drab.LocalDb.IoC;
public interface ILocalDbConfiguration
{
public string ConnectionString { get; set; }
}

View File

@ -0,0 +1,13 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
namespace Drab.LocalDb.IoC;
public static class IocLocalDbRegister
{
public static IServiceCollection AddLocalDatabase(this IServiceCollection services, ILocalDbConfiguration localDbConfiguration)
{
services.AddDbContext<LocalDbContext>(cx => cx.UseSqlite(localDbConfiguration.ConnectionString));
return services;
}
}

View File

@ -0,0 +1,18 @@
using Drab.LocalDb.Entities;
using Microsoft.EntityFrameworkCore;
namespace Drab.LocalDb;
public class LocalDbContext : DbContext
{
public LocalDbContext()
{
}
public LocalDbContext(DbContextOptions<LocalDbContext> options)
: base(options)
{
}
public DbSet<OrderDb> Orders { get; set; }
}

View File

@ -0,0 +1,52 @@
// <auto-generated />
using System;
using Drab.LocalDb;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Drab.LocalDb.Migrations
{
[DbContext(typeof(LocalDbContext))]
[Migration("20211101180516_Initial")]
partial class Initial
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "5.0.11");
modelBuilder.Entity("Drab.LocalDb.Entities.OrderDb", b =>
{
b.Property<long>("OrderId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime>("Created")
.HasColumnType("TEXT");
b.Property<long>("DokId")
.HasColumnType("INTEGER");
b.Property<string>("Filename")
.HasColumnType("TEXT");
b.Property<bool>("IsPrinted")
.HasColumnType("INTEGER");
b.Property<string>("OrderNumber")
.HasColumnType("TEXT");
b.Property<string>("Shop")
.HasColumnType("TEXT");
b.HasKey("OrderId");
b.ToTable("Orders");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,35 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace Drab.LocalDb.Migrations
{
public partial class Initial : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Orders",
columns: table => new
{
OrderId = table.Column<long>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
DokId = table.Column<long>(type: "INTEGER", nullable: false),
Created = table.Column<DateTime>(type: "TEXT", nullable: false),
IsPrinted = table.Column<bool>(type: "INTEGER", nullable: false),
Filename = table.Column<string>(type: "TEXT", nullable: true),
Shop = table.Column<string>(type: "TEXT", nullable: true),
OrderNumber = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Orders", x => x.OrderId);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Orders");
}
}
}

View File

@ -0,0 +1,50 @@
// <auto-generated />
using System;
using Drab.LocalDb;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Drab.LocalDb.Migrations
{
[DbContext(typeof(LocalDbContext))]
partial class LocalDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "5.0.11");
modelBuilder.Entity("Drab.LocalDb.Entities.OrderDb", b =>
{
b.Property<long>("OrderId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime>("Created")
.HasColumnType("TEXT");
b.Property<long>("DokId")
.HasColumnType("INTEGER");
b.Property<string>("Filename")
.HasColumnType("TEXT");
b.Property<bool>("IsPrinted")
.HasColumnType("INTEGER");
b.Property<string>("OrderNumber")
.HasColumnType("TEXT");
b.Property<string>("Shop")
.HasColumnType("TEXT");
b.HasKey("OrderId");
b.ToTable("Orders");
});
#pragma warning restore 612, 618
}
}
}

11
Drab.Logic/Constants.cs Normal file
View File

@ -0,0 +1,11 @@
using Drab.Logic.Services;
using System.IO;
using System.Reflection;
namespace Drab.Logic;
internal static class Constants
{
internal static readonly string ReportsTemplatesPath = Path.Combine(Path.GetDirectoryName(Assembly.GetAssembly(typeof(OrderPdfGenerator)).Location), "Templates");
internal static readonly string ReportsOutputPath = Path.Combine(Path.GetDirectoryName(Assembly.GetAssembly(typeof(OrderPdfGenerator)).Location), "Orders");
}

View File

@ -0,0 +1,42 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0-windows</TargetFramework>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<ItemGroup>
<Reference Include="System.Printing">
<HintPath>./System.Printing.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="FastReport.OpenSource" Version="2025.2.0"/>
<PackageReference Include="FastReport.OpenSource.Export.PdfSimple" Version="2025.2.0"/>
<PackageReference Include="FastReport.OpenSource.Web" Version="2025.2.0"/>
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.0"/>
<PackageReference Include="NLog" Version="6.0.1"/>
<PackageReference Include="PdfiumViewer" Version="2.13.0"/>
<PackageReference Include="PdfiumViewer.Native.x86_64.v8-xfa" Version="2018.4.8.256"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Drab.Core\Drab.Core.csproj"/>
</ItemGroup>
<ItemGroup>
<Folder Include="Templates"/>
</ItemGroup>
<ItemGroup>
<None Update="Templates\Order.frx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="pdfium.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="System.Printing.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

32
Drab.Logic/Dtos/DokDto.cs Normal file
View File

@ -0,0 +1,32 @@
using Pcm.Db.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Drab.Logic.Dtos;
public class DokDto
{
public long DokId { get; set; }
public string NrDok { get; set; }
public DateTime Data { get; set; }
public string Sklep { get; set; }
public IEnumerable<PozDokDto> PozDok { get; set; }
public string Opis { get; set; }
}
internal static class DokExtensions
{
internal static DokDto ToDokDto(this Dok dok)
{
return new DokDto
{
DokId = (long)dok.DokId,
Data = dok.Zmiana,
NrDok = dok.NrDok,
Sklep = dok.DokKontr.Kontr.Nazwa,
Opis = string.Join(' ', dok.TekstDoks.Select(x => x.Tekst)),
PozDok = dok.PozDoks.Select(x => x.ToPozDokDto()).ToList()
};
}
}

23
Drab.Logic/Dtos/MagDto.cs Normal file
View File

@ -0,0 +1,23 @@
using Pcm.Db.Entities;
namespace Drab.Logic.Dtos;
public class MagDto
{
public long MagId { get; set; }
public string Nazwa { get; set; }
public short Numer { get; set; }
}
internal static class MagazynExtensions
{
internal static MagDto ToMagDto(this Magazyn magazyn)
{
return new MagDto
{
MagId = (long)magazyn.MagId,
Numer = magazyn.Numer ?? 0,
Nazwa = magazyn.Nazwa
};
}
}

View File

@ -0,0 +1,26 @@
using System.Linq;
using Pcm.Db.Entities;
namespace Drab.Logic.Dtos;
public class PozDokDto
{
public long DokId { get; set; }
public TowarDto Towar { get; set; }
public decimal Ilosc { get; set; }
public string Komentarz { get; set; }
}
internal static class PozDokExtensions
{
internal static PozDokDto ToPozDokDto(this PozDok pozDok)
{
return new PozDokDto
{
DokId = (long)pozDok.DokId,
Ilosc = pozDok.IloscPlus,
Towar = pozDok.Tow.ToTowarDto(),
Komentarz = string.Join("; ", pozDok.TekstPozs.Select(x => x.Tekst.Trim()))
};
}
}

View File

@ -0,0 +1,25 @@
using Pcm.Db.Entities;
namespace Drab.Logic.Dtos;
public class TowarDto
{
public long TowId { get; set; }
public string Nazwa { get; set; }
public string Kod { get; set; }
public string Jm { get; set; }
}
internal static class TowarExtension
{
internal static TowarDto ToTowarDto(this Towar towar)
{
return new TowarDto
{
TowId = (long)towar.TowId,
Nazwa = towar.Nazwa,
Kod = towar.Kod,
Jm = towar.Jm.Nazwa
};
}
}

View File

@ -0,0 +1,8 @@
using System.Threading.Tasks;
namespace Drab.Logic.Interfaces;
public interface IDbFetcher
{
Task Start();
}

View File

@ -0,0 +1,12 @@
using Drab.LocalDb.Entities;
using Drab.Logic.Dtos;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Drab.Logic.Interfaces;
public interface ILocalOrderStore
{
public Task<List<OrderDb>> GetAll();
public Task<DokDto> GetOrderById(long dokId);
}

View File

@ -0,0 +1,9 @@
using Drab.Logic.Dtos;
using System.Threading.Tasks;
namespace Drab.Logic.Interfaces;
public interface IOrderPdfGenerator
{
Task<string> GenerateOrder(DokDto order);
}

View File

@ -0,0 +1,9 @@
using Drab.Logic.Dtos;
using System.Threading.Tasks;
namespace Drab.Logic.Interfaces;
public interface IOrderProcessor
{
Task ProcessOrder(DokDto order);
}

View File

@ -0,0 +1,12 @@
using Drab.Core.Models;
using Drab.Logic.Dtos;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Drab.Logic.Interfaces;
public interface IOrdersStore : IDisposable
{
Task<Result<List<DokDto>, string>> FetchOrders();
}

View File

@ -0,0 +1,9 @@
using Drab.Logic.Models;
using System.Threading.Tasks;
namespace Drab.Logic.Interfaces;
public interface IPrintService
{
Task<PrintDocumentResult> PrintPdf(PrintDocumentRequest request);
}

View File

@ -0,0 +1,21 @@
using Drab.Logic.Interfaces;
using Drab.Logic.Services;
using Drab.Logic.Utils;
using Microsoft.Extensions.DependencyInjection;
namespace Drab.Logic.Ioc;
public static class IocLogicRegister
{
public static IServiceCollection AddDrabLogic(this IServiceCollection services)
{
services.AddSingleton<OrderEventBus>();
services.AddSingleton<IOrderProcessor, OrderProcessor>();
services.AddTransient<IPrintService, PrintService>();
services.AddTransient<IOrderPdfGenerator, OrderPdfGenerator>();
services.AddTransient<IOrdersStore, OrdersStore>();
services.AddHostedService<DbFetcher>();
services.AddTransient<ILocalOrderStore, LocalOrderStore>();
return services;
}
}

View File

@ -0,0 +1,7 @@
using System.Drawing;
namespace Drab.Logic.Models;
public record PrintDocumentRequest(string FilePath, long DokId);
public record PrintDocumentResult(bool IsSuccess, string Message);

View File

@ -0,0 +1,47 @@
using System;
using Drab.LocalDb;
using Drab.LocalDb.Entities;
using Drab.Logic.Dtos;
using Drab.Logic.Interfaces;
using Microsoft.Extensions.DependencyInjection;
using NLog;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Drab.Logic.Services;
public class LocalOrderStore : ILocalOrderStore
{
private readonly ILogger _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
public LocalOrderStore(IServiceScopeFactory serviceScopeFactory)
{
_logger = LogManager.GetCurrentClassLogger();
_serviceScopeFactory = serviceScopeFactory;
}
public async Task<List<OrderDb>> GetAll()
{
using var scope = _serviceScopeFactory.CreateScope();
await using var dbContext = scope.ServiceProvider.GetService<LocalDbContext>();
var fromDate = DateTime.UtcNow.AddDays(-30);
var orders = dbContext.Orders
.Where(x => x.Created >= fromDate)
.OrderByDescending(x => x.Created)
.ToList();
return orders;
}
public async Task<DokDto> GetOrderById(long dokId)
{
using var scope = _serviceScopeFactory.CreateScope();
await using var dbContext = scope.ServiceProvider.GetService<LocalDbContext>();
var order = dbContext.Orders.FirstOrDefault(x => x.DokId == dokId);
return new DokDto();
}
}

View File

@ -0,0 +1,58 @@
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Drab.LocalDb;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Drab.Logic.Services;
public class OldOrdersCleanupService : BackgroundService
{
private readonly IServiceProvider _services;
private readonly ILogger<OldOrdersCleanupService> _logger;
private readonly TimeSpan _interval = TimeSpan.FromHours(24);
public OldOrdersCleanupService(IServiceProvider services, ILogger<OldOrdersCleanupService> logger)
{
_services = services;
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
using var scope = _services.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<LocalDbContext>();
var threshold = DateTime.Now.AddDays(-45);
var oldOrders = dbContext.Orders
.Where(o => o.Created < threshold)
.ToList();
if (oldOrders.Count != 0)
{
dbContext.Orders.RemoveRange(oldOrders);
await dbContext.SaveChangesAsync(stoppingToken);
_logger.LogInformation("Usunięto {OldOrdersCount} starych zamówień.", oldOrders.Count);
}
else
{
_logger.LogInformation("Nie znaleziono starych zamówień do usunięcia.");
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Błąd podczas usuwania starych zamówień.");
}
await Task.Delay(_interval, stoppingToken);
}
}
}

View File

@ -0,0 +1,13 @@
using System;
namespace Drab.Logic.Services;
public class OrderEventBus
{
public event Action? OrdersChanged;
public void NotifyOrdersChanged()
{
OrdersChanged?.Invoke();
}
}

View File

@ -0,0 +1,51 @@
using Drab.Logic.Dtos;
using Drab.Logic.Interfaces;
using FastReport;
using FastReport.Export.PdfSimple;
using NLog;
using System;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
namespace Drab.Logic.Services;
internal class OrderPdfGenerator : IOrderPdfGenerator
{
private readonly ILogger _logger;
public OrderPdfGenerator()
{
_logger = LogManager.GetCurrentClassLogger();
}
public Task<string> GenerateOrder(DokDto order)
{
_logger.Info($"Generate pdf document: {order.NrDok}");
var cleanFilename = order.NrDok.Replace('/', '-');
var orderFilename = $"Zam_{cleanFilename}_{order.Data:yyyy-MM-dd}_{order.Sklep}_{order.DokId}.pdf";
var templatePath = Path.Combine(Constants.ReportsTemplatesPath, "Order.frx");
var outputFile = Path.Combine(Constants.ReportsOutputPath, orderFilename);
var version = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>().InformationalVersion;
var generatedAt = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}";
var data = new[] { order };
try
{
var report = new Report();
report.Load(templatePath);
report.SetParameterValue("generatedAt", generatedAt);
report.SetParameterValue("version", version);
report.RegisterData(data, "Order");
report.Prepare();
var pdfExport = new PDFSimpleExport();
pdfExport.Export(report, outputFile);
return Task.FromResult(orderFilename);
}
catch (Exception e)
{
_logger.Error(e, "Error on generating order document: {OrderNo}", order.NrDok);
return Task.FromResult(string.Empty);
}
}
}

View File

@ -0,0 +1,154 @@
using Drab.LocalDb;
using Drab.LocalDb.Entities;
using Drab.Logic.Dtos;
using Drab.Logic.Interfaces;
using Drab.Logic.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using NLog;
using System;
using System.IO;
using System.Threading.Tasks;
namespace Drab.Logic.Services;
public class OrderProcessor : IOrderProcessor
{
private readonly ILogger _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IPrintService _printService;
private readonly IOrderPdfGenerator _orderPdfGenerator;
private readonly OrderEventBus _eventBus;
public OrderProcessor(IServiceScopeFactory serviceScopeFactory,
IPrintService printService,
IOrderPdfGenerator orderPdfGenerator,
OrderEventBus eventBus)
{
_logger = LogManager.GetCurrentClassLogger();
_serviceScopeFactory = serviceScopeFactory;
_printService = printService;
_orderPdfGenerator = orderPdfGenerator;
_eventBus = eventBus;
}
public async Task ProcessOrder(DokDto order)
{
var dok = await GetOrCreateOrder(order);
if (dok.IsPrinted)
return;
var filePath = await EnsureOrderPdfExists(order, dok);
var printResult = await PrintOrder(order, filePath);
if (printResult.IsSuccess)
{
dok.IsPrinted = true;
await SaveOrderIfChanged(dok);
}
}
private async Task<OrderDb> GetOrCreateOrder(DokDto order)
{
var dok = await GetOrder(order.DokId);
if (dok != null)
return dok;
_logger.Info("Creating new order - {OrderNo}", order.NrDok);
dok = new OrderDb
{
DokId = order.DokId,
Created = order.Data,
OrderId = order.DokId,
Filename = string.Empty,
IsPrinted = false,
Shop = order.Sklep,
OrderNumber = order.NrDok
};
await SaveOrderIfChanged(dok);
return dok;
}
private async Task<string> EnsureOrderPdfExists(DokDto order, OrderDb dok)
{
if (!string.IsNullOrEmpty(dok.Filename))
{
var fullPath = Path.Combine(Constants.ReportsOutputPath, dok.Filename);
if (File.Exists(fullPath))
return fullPath;
}
_logger.Info("Generating order file: {OrderNo}", order.NrDok);
var generatedFilename = await _orderPdfGenerator.GenerateOrder(order);
var newPath = Path.Combine(Constants.ReportsOutputPath, generatedFilename);
if (string.Equals(dok.Filename, generatedFilename, StringComparison.OrdinalIgnoreCase))
return newPath;
dok.Filename = generatedFilename;
await SaveOrderIfChanged(dok);
return newPath;
}
private async Task<PrintDocumentResult> PrintOrder(DokDto order, string filePath)
{
_logger.Info("Printing order: {OrderNo}", order.NrDok);
var result = await _printService.PrintPdf(new PrintDocumentRequest(filePath, order.DokId));
_logger.Info("Printing result - OrderNo: {OrderNo}, Success: {IsSuccess}, Message: {Message}",
order.NrDok, result.IsSuccess, result.Message);
return result;
}
private async Task<OrderDb?> GetOrder(long dokId)
{
try
{
using var scope = _serviceScopeFactory.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<LocalDbContext>();
return await context.Orders
.FirstOrDefaultAsync(x => x.DokId == dokId);
}
catch (Exception e)
{
_logger.Error(e, "Error retrieving order from database");
return null;
}
}
private async Task SaveOrderIfChanged(OrderDb order)
{
using var scope = _serviceScopeFactory.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<LocalDbContext>();
var existing = await context.Orders.FirstOrDefaultAsync(x => x.DokId == order.DokId);
if (existing == null)
{
await context.Orders.AddAsync(order);
await context.SaveChangesAsync();
_eventBus.NotifyOrdersChanged();
return;
}
if (existing.IsPrinted == order.IsPrinted && existing.Filename == order.Filename)
return;
existing.IsPrinted = order.IsPrinted;
existing.Filename = order.Filename;
context.Orders.Update(existing);
await context.SaveChangesAsync();
_eventBus.NotifyOrdersChanged();
}
}

View File

@ -0,0 +1,78 @@
using Drab.Core.Models;
using Drab.Logic.Dtos;
using Drab.Logic.Interfaces;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using NLog;
using Pcm.Db;
using Pcm.Db.Enums;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using Drab.Core.Configuration;
namespace Drab.Logic.Services;
public class OrdersStore : IOrdersStore, IDisposable
{
private readonly ILogger _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IDrabSettings _drabSettings;
public OrdersStore(IServiceScopeFactory serviceScopeFactory, IDrabSettings drabSettings)
{
_serviceScopeFactory = serviceScopeFactory;
_drabSettings = drabSettings;
_logger = LogManager.GetCurrentClassLogger();
}
public async Task<Result<List<DokDto>, string>> FetchOrders()
{
_logger.Info("Fetch new orders");
DateTime date;
try
{
date = DateTime.ParseExact(_drabSettings.IgnoreOrdersBefore, "yyyy-MM-dd", CultureInfo.InvariantCulture);
}
catch
{
date = DateTime.Now - TimeSpan.FromDays(30);
}
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.Error(e, "Error on fetching orders");
return Result.Failed<List<DokDto>, string>(e.Message);
}
}
public void Dispose()
{
}
}

View File

@ -0,0 +1,71 @@
using Drab.Core.Configuration;
using Drab.Logic.Interfaces;
using Drab.Logic.Models;
using PdfiumViewer;
using System;
using System.Collections.Generic;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Printing;
using System.Threading.Tasks;
namespace Drab.Logic.Services;
public class PrintService : IPrintService
{
private readonly IDrabSettings _drabSettings;
public PrintService(IDrabSettings drabSettings)
{
_drabSettings = drabSettings;
}
public async Task<PrintDocumentResult> PrintPdf(PrintDocumentRequest request)
{
try
{
var oldJobs = GetPrintJobs(request.DokId.ToString());
if (oldJobs.Any(x => !x.IsRetained))
{
oldJobs.ForEach(x => x.Cancel());
await Task.Delay(TimeSpan.FromSeconds(2));
}
var (filePath, dokId) = request;
using (var document = PdfDocument.Load(filePath))
{
using (var printDocument = document.CreatePrintDocument())
{
var fileName = Path.GetFileName(filePath);
printDocument.PrinterSettings.PrintFileName = fileName;
printDocument.DocumentName = dokId.ToString();
printDocument.PrintController = new StandardPrintController();
printDocument.Print();
}
}
await Task.Delay(TimeSpan.FromSeconds(_drabSettings.PrinterTimeoutSeconds));
var jobs = GetPrintJobs(request.DokId.ToString());
if (jobs.Count == 0)
return new PrintDocumentResult(true, "Print success.");
jobs.ForEach(x => x.Cancel());
return new PrintDocumentResult(false, "Print failed - timeout expired.");
}
catch (Exception e)
{
return new PrintDocumentResult(false, $"Print failed - {e.Message}");
}
}
private static List<PrintSystemJobInfo> GetPrintJobs(string jobName)
{
var printQueue = LocalPrintServer.GetDefaultPrintQueue();
return printQueue.GetPrintJobInfoCollection()
.Where(x => x.Name == jobName)
.ToList();
}
}

Binary file not shown.

View File

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<Report ScriptLanguage="CSharp" ReportInfo.Name="Zamówienie" ReportInfo.Author="Piekarnia-Cukiernia BRZĘCZEK SP.K." ReportInfo.Version="1.0.0" ReportInfo.Created="06/20/2009 22:40:42" ReportInfo.Modified="07/11/2025 00:08:23" ReportInfo.CreatorVersion="2025.2.0.0">
<Styles>
<Style Name="Dark" Fill.Color="Gainsboro" Font="Arial, 10pt" ApplyBorder="false" ApplyTextFill="false" ApplyFont="false"/>
</Styles>
<Dictionary>
<BusinessObjectDataSource Name="Order" ReferenceName="Order" DataType="System.Int32" Enabled="true">
<Column Name="DokId" DataType="System.Int64"/>
<Column Name="NrDok" DataType="System.String"/>
<Column Name="Data" DataType="System.DateTime"/>
<Column Name="Opis" DataType="System.String"/>
<Column Name="Sklep" DataType="System.String"/>
<Column Name="CompanyInfo" DataType="System.Int32">
<Column Name="Name" DataType="System.String"/>
<Column Name="Nip" DataType="System.String"/>
<Column Name="Phone" DataType="System.String"/>
<Column Name="Email" DataType="System.String"/>
<Column Name="Address" DataType="System.Int32">
<Column Name="Street" DataType="System.String"/>
<Column Name="Number" DataType="System.Int32"/>
<Column Name="PostalCode" DataType="System.String"/>
<Column Name="City" DataType="System.String"/>
</Column>
</Column>
<BusinessObjectDataSource Name="PozDok" ReferenceName="PozDok" DataType="System.Int32" Enabled="true">
<Column Name="DokId" DataType="System.Int64"/>
<Column Name="Komentarz" DataType="System.String"/>
<Column Name="Ilosc" DataType="System.Decimal"/>
<Column Name="Towar" DataType="System.Int32">
<Column Name="TowId" DataType="System.Int64"/>
<Column Name="Nazwa" DataType="System.String"/>
<Column Name="Kod" DataType="System.String"/>
<Column Name="Jm" DataType="System.String"/>
</Column>
</BusinessObjectDataSource>
</BusinessObjectDataSource>
<Parameter Name="generatedAt" DataType="System.String" AsString=""/>
<Parameter Name="version" DataType="System.String" AsString=""/>
</Dictionary>
<ReportPage Name="Page1" RawPaperSize="9" Watermark.Font="Arial, 60pt" LastPageSource="15" FirstPageSource="15" OtherPageSource="15">
<PageHeaderBand Name="PageHeader1" Width="718.2" Height="85.05">
<TextObject Name="Text18" Width="718.2" Height="28.35" Text="[Order.NrDok]" HorzAlign="Center" Font="Arial, 14pt, style=Bold"/>
<TextObject Name="Text20" Top="37.8" Width="283.5" Height="28.35" Text="Data: [Order.Data]&#13;&#10;" VertAlign="Center" Font="Arial, 11pt, style=Bold"/>
<TextObject Name="Text19" Left="292.95" Top="37.8" Width="396.9" Height="28.35" Text="Sklep: [Order.Sklep]" HorzAlign="Right" VertAlign="Center" Font="Arial, 11pt, style=Bold"/>
</PageHeaderBand>
<DataBand Name="Data1" Top="86.65" Width="718.2" Height="28.35" DataSource="Order">
<TableObject Name="Table2" Width="717.95" Height="28.35">
<TableColumn Name="Column6" Width="51.96"/>
<TableColumn Name="Column7" Width="286.48"/>
<TableColumn Name="Column11" Width="114.91"/>
<TableColumn Name="Column10" Width="264.6"/>
<TableRow Name="Row2" Height="28.35">
<TableCell Name="Cell6" Border.Lines="All" Text="LP" VertAlign="Center" Font="Arial, 10pt, style=Bold"/>
<TableCell Name="Cell7" Border.Lines="All" Text="Towar" HorzAlign="Center" VertAlign="Center" Font="Arial, 10pt, style=Bold"/>
<TableCell Name="Cell10" Border.Lines="All" Text="Ilość" HorzAlign="Right" VertAlign="Center" Font="Arial, 10pt, style=Bold"/>
<TableCell Name="Cell11" Border.Lines="All" Text="Komentarz" HorzAlign="Center" VertAlign="Center" Font="Arial, 10pt, style=Bold"/>
</TableRow>
</TableObject>
<LineObject Name="Line2" Left="-9450" Top="-9450" Width="718.2" Diagonal="true"/>
<DataBand Name="Data2" Top="116.6" Width="718.2" Height="37.95" CanGrow="true" CanShrink="true" EvenStyle="Dark" CanBreak="true" DataSource="PozDok">
<TableObject Name="Table1" Width="717.76" Height="37.95">
<TableColumn Name="Column1" Width="51.79"/>
<TableColumn Name="Column2" Width="286.46"/>
<TableColumn Name="Column12" Width="114.91"/>
<TableColumn Name="Column5" Width="264.6"/>
<TableRow Name="Row1" Height="37.95" AutoSize="true">
<TableCell Name="Cell1" Text="[Row#]" VertAlign="Center" Font="Arial, 10pt"/>
<TableCell Name="Cell2" Text="[Order.PozDok.Towar.Nazwa]" VertAlign="Center" Font="Arial, 10pt"/>
<TableCell Name="Cell5" Text="[Order.PozDok.Ilosc] [Order.PozDok.Towar.Jm]" HorzAlign="Right" VertAlign="Center" Font="Arial, 10pt">
<Formats>
<NumberFormat/>
<GeneralFormat/>
</Formats>
</TableCell>
<TableCell Name="Cell12" CanBreak="false" Text="[Order.PozDok.Komentarz]" Font="Arial, 10pt"/>
</TableRow>
</TableObject>
</DataBand>
<DataFooterBand Name="DataFooter1" Top="156.15" Width="718.2" Height="85.05">
<TextObject Name="Text21" Top="9.45" Width="718.2" Height="75.6" Text="[Order.Opis]" Font="Arial, 10pt"/>
<LineObject Name="Line3" Width="718.2" Diagonal="true"/>
</DataFooterBand>
</DataBand>
<PageFooterBand Name="PageFooter1" Top="242.8" Width="718.2" Height="18.9">
<TextObject Name="Text6" Left="471" Width="245.7" Height="18.9" Text="Strona [Page#] z [TotalPages#]" HorzAlign="Right" VertAlign="Center" Font="Arial, 10pt"/>
<TextObject Name="Text7" Width="245.7" Height="18.9" Text="Wygenerowano: [generatedAt]" VertAlign="Center" Font="Arial, 10pt"/>
<TextObject Name="Text17" Left="245.7" Width="226.8" Height="18.9" Text="DRAB [version]" HorzAlign="Center" VertAlign="Center" Font="Arial, 10pt"/>
</PageFooterBand>
</ReportPage>
</Report>

View File

@ -0,0 +1,62 @@
using Drab.Core.Configuration;
using Drab.Logic.Interfaces;
using Microsoft.Extensions.DependencyInjection;
using NLog;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
namespace Drab.Logic.Utils;
public class DbFetcher : BackgroundService
{
private readonly IDrabSettings _drabSettings;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IOrderProcessor _orderProcessor;
private readonly ILogger _logger;
public DbFetcher(IDrabSettings drabSettings, IServiceScopeFactory serviceScopeFactory, IOrderProcessor orderProcessor)
{
_drabSettings = drabSettings;
_serviceScopeFactory = serviceScopeFactory;
_orderProcessor = orderProcessor;
_logger = LogManager.GetCurrentClassLogger();
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
Start();
return Task.CompletedTask;
}
public async Task Start()
{
await Task.Delay(TimeSpan.FromSeconds(2));
while (true)
{
_logger.Info("Fetch database for new orders");
try
{
using var scope = _serviceScopeFactory.CreateScope();
using var orderStore = scope.ServiceProvider.GetService<IOrdersStore>();
var result = await orderStore.FetchOrders();
if (result.IsNotOk)
_logger.Warn($"Fetch orders result failed: {result.Error}");
result.Value.ToList()
.ForEach(x => _orderProcessor.ProcessOrder(x));
}
catch (Exception e)
{
_logger.Error(e, "Error on fetching new orders data:");
}
finally
{
await Task.Delay(TimeSpan.FromSeconds(_drabSettings.DbPollingFrequencyInSeconds));
}
}
}
}

49
Drab.sln Normal file
View File

@ -0,0 +1,49 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31729.503
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Drab", "Drab\Drab.csproj", "{64D48CEF-6B5E-42CA-A6AB-10FCC15E1288}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Pcm.Db", "Pcm.Db\Pcm.Db.csproj", "{3A449E77-3320-491D-805F-FB8DDFBD4FE2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Drab.Core", "Drab.Core\Drab.Core.csproj", "{FCA29186-6444-4532-AB25-E67446CAA060}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Drab.Logic", "Drab.Logic\Drab.Logic.csproj", "{60CB71F2-798C-4E0E-B68F-9C29D8E2934A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drab.LocalDb", "Drab.LocalDb\Drab.LocalDb.csproj", "{FAFD1123-326B-40D6-A440-4CBBD783CA45}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{64D48CEF-6B5E-42CA-A6AB-10FCC15E1288}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{64D48CEF-6B5E-42CA-A6AB-10FCC15E1288}.Debug|Any CPU.Build.0 = Debug|Any CPU
{64D48CEF-6B5E-42CA-A6AB-10FCC15E1288}.Release|Any CPU.ActiveCfg = Release|Any CPU
{64D48CEF-6B5E-42CA-A6AB-10FCC15E1288}.Release|Any CPU.Build.0 = Release|Any CPU
{3A449E77-3320-491D-805F-FB8DDFBD4FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A449E77-3320-491D-805F-FB8DDFBD4FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3A449E77-3320-491D-805F-FB8DDFBD4FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3A449E77-3320-491D-805F-FB8DDFBD4FE2}.Release|Any CPU.Build.0 = Release|Any CPU
{FCA29186-6444-4532-AB25-E67446CAA060}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FCA29186-6444-4532-AB25-E67446CAA060}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FCA29186-6444-4532-AB25-E67446CAA060}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FCA29186-6444-4532-AB25-E67446CAA060}.Release|Any CPU.Build.0 = Release|Any CPU
{60CB71F2-798C-4E0E-B68F-9C29D8E2934A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{60CB71F2-798C-4E0E-B68F-9C29D8E2934A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{60CB71F2-798C-4E0E-B68F-9C29D8E2934A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{60CB71F2-798C-4E0E-B68F-9C29D8E2934A}.Release|Any CPU.Build.0 = Release|Any CPU
{FAFD1123-326B-40D6-A440-4CBBD783CA45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FAFD1123-326B-40D6-A440-4CBBD783CA45}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FAFD1123-326B-40D6-A440-4CBBD783CA45}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FAFD1123-326B-40D6-A440-4CBBD783CA45}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {29279B5D-113E-4BB7-8E30-1E255A164BF2}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,4 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=3A449E77_002D3320_002D491D_002D805F_002DFB8DDFBD4FE2_002Ff_003APcmDbContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACallSiteValidator_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003Fpdude_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F223f3993d7b717137d1eac7a1da6b5a458d1d124b0f8a62a3450f9bd6c89af_003FCallSiteValidator_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AServiceProvider_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FUsers_003Fpdude_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fce37be1a06b16c6faa02038d2cc477dd3bca5b217ceeb41c5f2ad45c1bf9_003FServiceProvider_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>

35
Drab/Drab.csproj Normal file
View File

@ -0,0 +1,35 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<TargetFramework>net9.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="9.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.7"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.7"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.7"/>
<PackageReference Include="NLog" Version="6.0.1"/>
<PackageReference Include="NLog.Web.AspNetCore" Version="6.0.1"/>
<PackageReference Include="Radzen.Blazor" Version="7.1.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Drab.Core\Drab.Core.csproj"/>
<ProjectReference Include="..\Drab.Logic\Drab.Logic.csproj"/>
<ProjectReference Include="..\Pcm.Db\Pcm.Db.csproj"/>
</ItemGroup>
<ItemGroup>
<Content Update="wwwroot\css\common.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

10
Drab/Drab.csproj.user Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup>
<ActiveDebugProfile>Drab</ActiveDebugProfile>
<NameOfLastUsedPublishProfile>C:\__Repozytorium\DRAB\Drab\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
</PropertyGroup>
</Project>

18
Drab/FileController.cs Normal file
View File

@ -0,0 +1,18 @@
using Microsoft.AspNetCore.Mvc;
namespace Drab;
[ApiController]
public class FileController : ControllerBase
{
[HttpGet("/pdf/{filename}")]
public IActionResult Get([FromRoute] string filename)
{
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Orders", filename);
if (!System.IO.File.Exists(filePath))
return NotFound();
return File(System.IO.File.OpenRead(filePath), "application/pdf");
}
}

79
Drab/Program.cs Normal file
View File

@ -0,0 +1,79 @@
using System.Net;
using Drab.Core.Configuration;
using Drab.Core.Ioc;
using Drab.LocalDb;
using Drab.LocalDb.IoC;
using Drab.Logic.Ioc;
using Drab.Logic.Services;
using Drab.Ui;
using Microsoft.EntityFrameworkCore;
using NLog.Extensions.Logging;
using Pcm.Db.Ioc;
using Radzen;
var builder = WebApplication.CreateBuilder(args);
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
var configuration = configurationBuilder.Build();
var port = int.Parse(builder.WebHost.GetSetting("ListenPort") ?? "5010");
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.AddConfiguration(configuration.GetSection("Logging"));
loggingBuilder.AddNLog("nlog.config");
});
var drabSettings = configuration.GetSection(DrabSettings.SectionName).Get<DrabSettings>();
var localDbSettings = configuration.GetSection(LocalDbConfiguration.SectionName).Get<LocalDbConfiguration>();
builder.Services.AddLocalDatabase(localDbSettings);
var dbConfig = configuration.GetSection(PcmDbConfiguration.SectionName).Get<PcmDbConfiguration>();
builder.Services.AddPcmDatabase(dbConfig);
builder.Services.AddDrabCore(drabSettings);
builder.Services.AddDrabLogic();
builder.Services.AddHostedService<OldOrdersCleanupService>();
builder.Services.AddRadzenComponents();
builder.Services.AddControllers().AddControllersAsServices();
builder.WebHost
.UseKestrel(options =>
{
options.Listen(IPAddress.Any, port);
})
.UseContentRoot(Directory.GetCurrentDirectory());
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
app.UseHsts();
}
app.UseStaticFiles();
app.UseRouting();
app.UseAntiforgery();
app.MapControllers();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
if (!Directory.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Orders")))
{
Directory.CreateDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Orders"));
}
var scope = app.Services.GetService<IServiceScopeFactory>();
using (var scopeProvider = scope.CreateScope())
{
await using var context = scopeProvider.ServiceProvider.GetRequiredService<LocalDbContext>();
await context.Database.MigrateAsync();
}
app.Run();

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<DeleteExistingFiles>true</DeleteExistingFiles>
<ExcludeApp_Data>false</ExcludeApp_Data>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<PublishProvider>FileSystem</PublishProvider>
<PublishUrl>bin\Release\publish\</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
<_TargetId>Folder</_TargetId>
<SiteUrlToLaunchAfterPublish />
<TargetFramework>net6.0-windows</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishSingleFile>false</PublishSingleFile>
<PublishReadyToRun>true</PublishReadyToRun>
<ProjectGuid>64d48cef-6b5e-42ca-a6ab-10fcc15e1288</ProjectGuid>
<SelfContained>true</SelfContained>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<_PublishTargetUrl>C:\__Repozytorium\DRAB\Drab\bin\Release\publish\</_PublishTargetUrl>
<History>True|2023-02-21T14:54:18.7590581Z;True|2023-02-18T14:13:57.9596803+01:00;False|2023-02-18T14:12:47.7973484+01:00;False|2023-02-18T14:11:56.4748109+01:00;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -0,0 +1,28 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:26177",
"sslPort": 44338
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Drab": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": false,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

25
Drab/Ui/App.razor Normal file
View File

@ -0,0 +1,25 @@
@using Drab.Ui.components
@using Microsoft.AspNetCore.Components.Web
@using Radzen
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<base href="/"/>
<RadzenTheme Theme="standard" @rendermode="RenderMode.InteractiveServer"/>
<link rel="stylesheet" href="/css/common.css"/>
<ImportMap/>
<title>Brzęczek - Zamówienia</title>
<HeadOutlet/>
</head>
<body>
<Routes @rendermode="RenderMode.InteractiveServer"/>
<script src="_content/Radzen.Blazor/Radzen.Blazor.js?v=@(typeof(Colors).Assembly.GetName().Version)"></script>
<script src="_framework/blazor.web.js"></script>
</body>
</html>

109
Drab/Ui/Pages/Index.razor Normal file
View File

@ -0,0 +1,109 @@
@page "/"
@using Drab.LocalDb
@using Drab.LocalDb.Entities
@using Drab.Logic.Services
@using Drab.Ui.components
@using Radzen
@inject LocalDbContext LocalDbContext
@inject DialogService DialogService
@inject OrderEventBus EventBus
@implements IDisposable
<RadzenDataGrid Data="@_orders"
TItem="OrderDb"
@ref="_dataGridRef"
AllowFiltering="true"
AllowColumnResize="false"
AllowAlternatingRows="false"
AllowColumnReorder="false"
Density="Density.Default"
FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
AllowSorting="true"
PageSize="20"
AllowPaging="true"
GridLines="DataGridGridLines.Both"
PagerHorizontalAlign="HorizontalAlign.Center"
ShowPagingSummary="true"
LogicalFilterOperator="LogicalFilterOperator.Or"
SelectionMode="DataGridSelectionMode.Single"
RowClick="@(RowClick)">
<Columns>
<RadzenDataGridColumn Property="@nameof(OrderDb.Shop)"
Filterable="true"
Title="Sklep"
Width="200px"
FilterMode="FilterMode.CheckBoxList"/>
<RadzenDataGridColumn Property="@nameof(OrderDb.Created)"
Title="Data"
Filterable="false"
SortOrder="SortOrder.Descending"
TextAlign="TextAlign.Center"
Width="160px"/>
<RadzenDataGridColumn Property="@nameof(OrderDb.IsPrinted)"
Title="Wydrukowane"
FilterMode="FilterMode.CheckBoxList"
TextAlign="TextAlign.Center"
Width="100px">
<Template Context="order">
@if (order.IsPrinted)
{
<RadzenIcon IconStyle="IconStyle.Success" Icon="check_circle"/>
}
else
{
<RadzenIcon IconStyle="IconStyle.Danger" Icon="highlight_off"/>
}
</Template>
</RadzenDataGridColumn>
<RadzenDataGridColumn Property="@nameof(OrderDb.OrderNumber)"
FilterMode="FilterMode.CheckBoxList"
Title="Numer"
Width="150px"/>
</Columns>
</RadzenDataGrid>
@code {
IQueryable<OrderDb> _orders;
private RadzenDataGrid<OrderDb>? _dataGridRef;
protected override void OnInitialized()
{
EventBus.OrdersChanged += OnOrdersChanged;
_orders = LocalDbContext.Orders;
}
private async Task RowClick(DataGridRowMouseEventArgs<OrderDb> obj)
{
await DialogService.OpenAsync<PdfViewer>($"Zamówienie {obj.Data.OrderNumber} - Sklep {obj.Data.Shop}",
new Dictionary<string, object>() {{nameof(PdfViewer.Filename), obj.Data.Filename}},
new DialogOptions()
{
CloseDialogOnEsc = true,
CloseDialogOnOverlayClick = true,
Resizable = false,
Draggable = false,
Width = "80%",
Height = "90vh"
});
}
private void OnOrdersChanged()
{
InvokeAsync(() =>
{
_orders = LocalDbContext.Orders;
_dataGridRef?.Reload();
StateHasChanged();
return Task.CompletedTask;
});
}
public void Dispose()
{
EventBus.OrdersChanged -= OnOrdersChanged;
LocalDbContext?.Dispose();
DialogService?.Dispose();
}
}

1
Drab/Ui/_Imports.razor Normal file
View File

@ -0,0 +1 @@
@using Radzen.Blazor

View File

@ -0,0 +1,18 @@
@inherits LayoutComponentBase
<RadzenLayout>
<RadzenBody>
<div class="rz-p-0" style="margin: auto; width: 100%; max-width: 1900px !important;">
@Body
</div>
</RadzenBody>
</RadzenLayout>
<div id="blazor-error-ui" data-nosnippet>
An unhandled error has occurred.
<a href="." class="reload">Reload</a>
<span class="dismiss">🗙</span>
</div>
<RadzenDialog/>
<RadzenNotification/>
<RadzenTooltip/>
<RadzenContextMenu/>

View File

@ -0,0 +1,9 @@
<object data="@($"/pdf/{Filename}")"
style="width: 100%; height: 80vh; border: 1px solid gray"
type="application/pdf" width="100%" height="500px">
</object>
@code {
[Parameter]
public string Filename { get; set; } = string.Empty;
}

View File

@ -0,0 +1,12 @@
@using Microsoft.AspNetCore.Components.Routing
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="@typeof(MainLayout)"/>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>404 nie znaleziono strony</p>
</LayoutView>
</NotFound>
</Router>

1
Drab/add migration.txt Normal file
View File

@ -0,0 +1 @@
dotnet ef migrations add Initial --project ..\Drab.LocalDb\Drab.LocalDb.csproj --context LocalDbContext

View File

@ -0,0 +1,10 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}

26
Drab/appsettings.json Normal file
View File

@ -0,0 +1,26 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ListenPort": 80,
"AllowedHosts": "*",
"DrabSettings": {
"DbPollingFrequencyInSeconds": 180,
"PrinterTimeoutSeconds": 30,
"IgnoreOrdersBefore": "2025-07-11"
},
"PcmDbSettings": {
"Host": "192.168.200.6",
"Port": "1433",
"User": "sa",
"Password": "10Coma123",
"Database": "BRZECZEK"
},
"LocalDbConnection": {
"ConnectionString": "Data Source=.\\drab.db"
}
}

33
Drab/nlog.config Normal file
View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
throwExceptions="false">
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<variable name="logDirectory" value="${basedir}/logs"/>
<variable name="maxLogFiles" value="60"/>
<targets>
<default-wrapper xsi:type="AsyncWrapper" overflowAction="Block" timeToSleepBetweenBatches="0"/>
<target name="File"
xsi:type="File"
fileName="${logDirectory}/${shortdate}.log"
encoding="UTF-8"
keepFileOpen="True"
maxArchiveFiles="${maxLogFiles}"
layout="${date:format=yyyy-MM-dd HH\:mm\:ss.ffffK} | ${level:uppercase=true} | ${logger:uppercase=true} | ${message}${onexception:${newline}${exception:format=ToString,StackTrace:maxInnerFaultLevel=5:innerFormat=ToString,StackTrace}}"/>
<target name="Console" xsi:type="ColoredConsole"
layout="${date:format=yyyy-MM-dd HH\:mm\:ss.ffffK} | ${level:uppercase=true} | ${logger:uppercase=true} | ${message}${onexception:${newline}${exception:format=ToString,StackTrace:maxInnerFaultLevel=5:innerFormat=ToString,StackTrace}}"/>
</targets>
<rules>
<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="File, Console" final="true"/>
<logger name="Microsoft.*" maxlevel="Info" final="true"/>
<logger name="System.Net.Http.*" maxlevel="Info" final="true"/>
<logger name="*" minlevel="Debug" writeTo="File, Console"/>
</rules>
</nlog>

View File

@ -0,0 +1,37 @@
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
background-image: none !important;
width: 100% !important;
margin: auto;
}
.blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
padding: 1rem 1rem 1rem 3.7rem;
color: white;
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
#blazor-error-ui {
color-scheme: light only;
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
box-sizing: border-box;
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}

View File

@ -0,0 +1,20 @@
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class Akwizytor
{
public Akwizytor()
{
Kontrahents = new HashSet<Kontrahent>();
}
public decimal AkwId { get; set; }
public string Nazwisko { get; set; }
public string Opis { get; set; }
public decimal Prowizja { get; set; }
public virtual ICollection<Kontrahent> Kontrahents { get; set; }
}

View File

@ -0,0 +1,21 @@
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class Artykul
{
public Artykul()
{
Towars = new HashSet<Towar>();
}
public decimal ArtId { get; set; }
public string ArtNazwa { get; set; }
public decimal? CentrArtId { get; set; }
public decimal? GlownyTowId { get; set; }
public virtual Towar GlownyTow { get; set; }
public virtual ICollection<Towar> Towars { get; set; }
}

43
Pcm.Db/Entities/Asort.cs Normal file
View File

@ -0,0 +1,43 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
#nullable disable
namespace Pcm.Db.Entities;
public class Asort
{
public Asort()
{
Marzowniks = new HashSet<Marzownik>();
Przydzials = new HashSet<Przydzial>();
RegulaAsorts = new HashSet<RegulaAsort>();
SklepPrzydzials = new HashSet<SklepPrzydzial>();
Towars = new HashSet<Towar>();
}
public decimal AsId { get; set; }
public string Nazwa { get; set; }
public decimal Marza { get; set; }
public short OpcjaMarzy { get; set; }
public decimal HurtRabat { get; set; }
public short OpcjaRabatu { get; set; }
public decimal NocNarzut { get; set; }
public short OpcjaNarzutu { get; set; }
public decimal? CentrAsId { get; set; }
public short? UkrytyNaPanelach { get; set; }
public short? UkrytyNaBonowniku { get; set; }
public short? BezAutoEtykiet { get; set; }
public decimal? Param1 { get; set; }
[JsonIgnore]
public virtual ICollection<Marzownik> Marzowniks { get; set; }
[JsonIgnore]
public virtual ICollection<Przydzial> Przydzials { get; set; }
[JsonIgnore]
public virtual ICollection<RegulaAsort> RegulaAsorts { get; set; }
[JsonIgnore]
public virtual ICollection<SklepPrzydzial> SklepPrzydzials { get; set; }
[JsonIgnore]
public virtual ICollection<Towar> Towars { get; set; }
}

26
Pcm.Db/Entities/Bank.cs Normal file
View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class Bank
{
public Bank()
{
KontoBankoweKontrs = new HashSet<KontoBankoweKontr>();
KontoBankowes = new HashSet<KontoBankowe>();
}
public decimal BankId { get; set; }
public string Nazwa { get; set; }
public string Adres { get; set; }
public short Aktywny { get; set; }
public DateTime Zmiana { get; set; }
public decimal? CentrBankId { get; set; }
public string NrRozliBank { get; set; }
public virtual ICollection<KontoBankoweKontr> KontoBankoweKontrs { get; set; }
public virtual ICollection<KontoBankowe> KontoBankowes { get; set; }
}

View File

@ -0,0 +1,14 @@
#nullable disable
namespace Pcm.Db.Entities;
public class Blokadum
{
public decimal SesjaId { get; set; }
public decimal TowId { get; set; }
public decimal MagId { get; set; }
public decimal Ilosc { get; set; }
public virtual Istw Istw { get; set; }
public virtual SesjaAktywna Sesja { get; set; }
}

View File

@ -0,0 +1,19 @@
using System;
#nullable disable
namespace Pcm.Db.Entities;
public class CentrStanZgody
{
public decimal KontrId { get; set; }
public decimal ZgId { get; set; }
public short Status { get; set; }
public string Kiedy { get; set; }
public string Wersja { get; set; }
public short? FormaDec { get; set; }
public DateTime? DataDec { get; set; }
public virtual Kontrahent Kontr { get; set; }
public virtual Zgodum Zg { get; set; }
}

20
Pcm.Db/Entities/Cza.cs Normal file
View File

@ -0,0 +1,20 @@
using System;
#nullable disable
namespace Pcm.Db.Entities;
public class Cza
{
public decimal CzasId { get; set; }
public decimal? DzienTygodnia { get; set; }
public decimal? DzienMiesiaca { get; set; }
public decimal? Dzien { get; set; }
public decimal? TydzienRoku { get; set; }
public decimal? Tydzien { get; set; }
public decimal? MiesiacRoku { get; set; }
public decimal? Miesiac { get; set; }
public decimal? Weekend { get; set; }
public decimal? Rok { get; set; }
public DateTime? Data { get; set; }
}

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class DefinicjaKodu
{
public DefinicjaKodu()
{
SkladnikDefinicjiKodus = new HashSet<SkladnikDefinicjiKodu>();
}
public decimal Dkid { get; set; }
public short Typ { get; set; }
public string Nazwa { get; set; }
public DateTime? DataOd { get; set; }
public DateTime? DataDo { get; set; }
public short Aktywny { get; set; }
public DateTime Zmiana { get; set; }
public decimal? CentrDkid { get; set; }
public virtual ICollection<SkladnikDefinicjiKodu> SkladnikDefinicjiKodus { get; set; }
}

134
Pcm.Db/Entities/Dok.cs Normal file
View File

@ -0,0 +1,134 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
#nullable disable
namespace Pcm.Db.Entities;
public class Dok
{
public Dok()
{
DokDodKths = new HashSet<DokDodKth>();
DokKontoBankowes = new HashSet<DokKontoBankowe>();
DokKurs = new HashSet<DokKur>();
DokPunkties = new HashSet<DokPunkty>();
DokWaluta = new HashSet<DokWalutum>();
Phrozliczenies = new HashSet<Phrozliczenie>();
PozDoks = new HashSet<PozDok>();
RegulaDoks = new HashSet<RegulaDok>();
RozbicieDoks = new HashSet<RozbicieDok>();
RozliczaDoks = new HashSet<Rozlicza>();
RozliczaRozliczanyDoks = new HashSet<Rozlicza>();
SklepDoks = new HashSet<SklepDok>();
TekstDoks = new HashSet<TekstDok>();
ZaleznoscPoprzedniDoks = new HashSet<Zaleznosc>();
}
public decimal DokId { get; set; }
public decimal UzId { get; set; }
public decimal MagId { get; set; }
public DateTime Data { get; set; }
public int KolejnyWdniu { get; set; }
public DateTime DataDod { get; set; }
public DateTime DataPom { get; set; }
public string NrDok { get; set; }
public short TypDok { get; set; }
public short Aktywny { get; set; }
public short Opcja1 { get; set; }
public short Opcja2 { get; set; }
public short Opcja3 { get; set; }
public short Opcja4 { get; set; }
public short CenyZakBrutto { get; set; }
public short CenySpBrutto { get; set; }
public short FormaPlat { get; set; }
public short TerminPlat { get; set; }
public short PoziomCen { get; set; }
public decimal RabatProc { get; set; }
public decimal Netto { get; set; }
public decimal Podatek { get; set; }
public decimal NettoUslugi { get; set; }
public decimal PodatekUslugi { get; set; }
public decimal NettoDet { get; set; }
public decimal PodatekDet { get; set; }
public decimal NettoDetUslugi { get; set; }
public decimal PodatekDetUslugi { get; set; }
public decimal NettoMag { get; set; }
public decimal PodatekMag { get; set; }
public decimal NettoMagUslugi { get; set; }
public decimal PodatekMagUslugi { get; set; }
public decimal Razem { get; set; }
public decimal DoZaplaty { get; set; }
public decimal Zaplacono { get; set; }
public decimal Kwota1 { get; set; }
public decimal Kwota2 { get; set; }
public decimal Kwota3 { get; set; }
public decimal Kwota4 { get; set; }
public decimal Kwota5 { get; set; }
public decimal Kwota6 { get; set; }
public decimal Kwota7 { get; set; }
public decimal Kwota8 { get; set; }
public decimal Kwota9 { get; set; }
public decimal Kwota10 { get; set; }
public int Param1 { get; set; }
public int Param2 { get; set; }
public int Param3 { get; set; }
public int Param4 { get; set; }
public short EksportFk { get; set; }
public DateTime Zmiana { get; set; }
public int? NrKolejny { get; set; }
public int? NrKolejnyMag { get; set; }
public int? Param5 { get; set; }
public int? Param6 { get; set; }
public decimal? Kwota11 { get; set; }
public decimal? Kwota12 { get; set; }
public decimal? WalId { get; set; }
public decimal? Kurs { get; set; }
public decimal? CentrDokId { get; set; }
public short? Opcja5 { get; set; }
public short? Opcja6 { get; set; }
public short? Opcja7 { get; set; }
public short? Opcja8 { get; set; }
public DateTime? ZmianaPkt { get; set; }
public decimal? ZaplaconoPodatek { get; set; }
public decimal? ZaplaconoWkasie { get; set; }
[JsonIgnore]
public virtual Magazyn Mag { get; set; }
[JsonIgnore]
public virtual Uzytkownik Uz { get; set; }
[JsonIgnore]
public virtual Walutum Wal { get; set; }
[JsonIgnore]
public virtual DokKasa DokKasa { get; set; }
public virtual DokKontr DokKontr { get; set; }
[JsonIgnore]
public virtual Zaleznosc ZaleznoscDok { get; set; }
[JsonIgnore]
public virtual ICollection<DokDodKth> DokDodKths { get; set; }
[JsonIgnore]
public virtual ICollection<DokKontoBankowe> DokKontoBankowes { get; set; }
[JsonIgnore]
public virtual ICollection<DokKur> DokKurs { get; set; }
[JsonIgnore]
public virtual ICollection<DokPunkty> DokPunkties { get; set; }
[JsonIgnore]
public virtual ICollection<DokWalutum> DokWaluta { get; set; }
[JsonIgnore]
public virtual ICollection<Phrozliczenie> Phrozliczenies { get; set; }
public virtual ICollection<PozDok> PozDoks { get; set; }
[JsonIgnore]
public virtual ICollection<RegulaDok> RegulaDoks { get; set; }
[JsonIgnore]
public virtual ICollection<RozbicieDok> RozbicieDoks { get; set; }
[JsonIgnore]
public virtual ICollection<Rozlicza> RozliczaDoks { get; set; }
[JsonIgnore]
public virtual ICollection<Rozlicza> RozliczaRozliczanyDoks { get; set; }
[JsonIgnore]
public virtual ICollection<SklepDok> SklepDoks { get; set; }
[JsonIgnore]
public virtual ICollection<TekstDok> TekstDoks { get; set; }
[JsonIgnore]
public virtual ICollection<Zaleznosc> ZaleznoscPoprzedniDoks { get; set; }
}

View File

@ -0,0 +1,13 @@
#nullable disable
namespace Pcm.Db.Entities;
public class DokDodKth
{
public decimal DokId { get; set; }
public short Znaczenie { get; set; }
public decimal KontrId { get; set; }
public virtual Dok Dok { get; set; }
public virtual Kontrahent Kontr { get; set; }
}

View File

@ -0,0 +1,12 @@
#nullable disable
namespace Pcm.Db.Entities;
public class DokKasa
{
public decimal DokId { get; set; }
public decimal KasaId { get; set; }
public virtual Dok Dok { get; set; }
public virtual Kasa Kasa { get; set; }
}

View File

@ -0,0 +1,12 @@
#nullable disable
namespace Pcm.Db.Entities;
public class DokKontoBankowe
{
public decimal DokId { get; set; }
public decimal Kbid { get; set; }
public virtual Dok Dok { get; set; }
public virtual KontoBankowe Kb { get; set; }
}

View File

@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
#nullable disable
namespace Pcm.Db.Entities;
public class DokKontr
{
public decimal DokId { get; set; }
public decimal KontrId { get; set; }
[JsonIgnore]
public virtual Dok Dok { get; set; }
public virtual Kontrahent Kontr { get; set; }
}

18
Pcm.Db/Entities/DokKur.cs Normal file
View File

@ -0,0 +1,18 @@
using System;
#nullable disable
namespace Pcm.Db.Entities;
public class DokKur
{
public decimal DokId { get; set; }
public short Znaczenie { get; set; }
public decimal WalId { get; set; }
public decimal? Kurs { get; set; }
public DateTime? Data { get; set; }
public string NrTabeli { get; set; }
public virtual Dok Dok { get; set; }
public virtual Walutum Wal { get; set; }
}

View File

@ -0,0 +1,15 @@
using System;
#nullable disable
namespace Pcm.Db.Entities;
public class DokPunkty
{
public decimal DokId { get; set; }
public short Typ { get; set; }
public DateTime Kiedy { get; set; }
public decimal Kwota { get; set; }
public virtual Dok Dok { get; set; }
}

View File

@ -0,0 +1,15 @@
#nullable disable
namespace Pcm.Db.Entities;
public class DokWalutum
{
public decimal DokId { get; set; }
public decimal WalId { get; set; }
public decimal WalKwota { get; set; }
public decimal Kurs { get; set; }
public decimal DokKwota { get; set; }
public virtual Dok Dok { get; set; }
public virtual Walutum Wal { get; set; }
}

View File

@ -0,0 +1,13 @@
#nullable disable
namespace Pcm.Db.Entities;
public class DostProd
{
public decimal DostId { get; set; }
public decimal ProdId { get; set; }
public decimal RabatProd { get; set; }
public virtual Kontrahent Dost { get; set; }
public virtual Kontrahent Prod { get; set; }
}

View File

@ -0,0 +1,15 @@
#nullable disable
namespace Pcm.Db.Entities;
public class Dostawca
{
public decimal KontrId { get; set; }
public decimal TowId { get; set; }
public decimal CenaZak { get; set; }
public decimal RabatOdWart { get; set; }
public short? Narzucany { get; set; }
public virtual Kontrahent Kontr { get; set; }
public virtual Towar Tow { get; set; }
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class DzienRozl
{
public DzienRozl()
{
DzienRozlParams = new HashSet<DzienRozlParam>();
StanPrtMags = new HashSet<StanPrtMag>();
}
public DateTime Dzien { get; set; }
public short Status { get; set; }
public DateTime Zmiana { get; set; }
public virtual ICollection<DzienRozlParam> DzienRozlParams { get; set; }
public virtual ICollection<StanPrtMag> StanPrtMags { get; set; }
}

View File

@ -0,0 +1,14 @@
using System;
#nullable disable
namespace Pcm.Db.Entities;
public class DzienRozlParam
{
public DateTime Dzien { get; set; }
public short Znaczenie { get; set; }
public string Wartosc { get; set; }
public virtual DzienRozl DzienNavigation { get; set; }
}

View File

@ -0,0 +1,14 @@
#nullable disable
namespace Pcm.Db.Entities;
public class FormZgod
{
public decimal TypOsId { get; set; }
public decimal ZgId { get; set; }
public short Kolejnosc { get; set; }
public short? Wymagana { get; set; }
public virtual TypO TypOs { get; set; }
public virtual Zgodum Zg { get; set; }
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class FormaPlatnPos7
{
public FormaPlatnPos7()
{
KasaFormaPlatns = new HashSet<KasaFormaPlatn>();
}
public decimal FormaId { get; set; }
public string Nazwa { get; set; }
public short Typ { get; set; }
public short Reszta { get; set; }
public short? Autoryzacja { get; set; }
public string SerwisPlatniczy { get; set; }
public short Aktywny { get; set; }
public DateTime Zmiana { get; set; }
public decimal? CentrFormaId { get; set; }
public decimal? Kolejnosc { get; set; }
public virtual ICollection<KasaFormaPlatn> KasaFormaPlatns { get; set; }
}

View File

@ -0,0 +1,11 @@
#nullable disable
namespace Pcm.Db.Entities;
public class FormaPlatnosci
{
public short FormaPlat { get; set; }
public string Tekst { get; set; }
public short MinTermPlat { get; set; }
public short MaxTermPlat { get; set; }
}

View File

@ -0,0 +1,13 @@
#nullable disable
namespace Pcm.Db.Entities;
public class GrWartosc
{
public decimal GrId { get; set; }
public decimal ParId { get; set; }
public int Wartosc { get; set; }
public virtual GrupaTow Gr { get; set; }
public virtual Parametr Par { get; set; }
}

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class GrupaAkcyzowa
{
public GrupaAkcyzowa()
{
PozAkcyzas = new HashSet<PozAkcyza>();
TabelaAkcyzowas = new HashSet<TabelaAkcyzowa>();
TowAkcyzas = new HashSet<TowAkcyza>();
}
public decimal GrAkcId { get; set; }
public string Kod { get; set; }
public string Nazwa { get; set; }
public string AkcJm { get; set; }
public string OpcjeWzoru { get; set; }
public string PrefiksyCn { get; set; }
public string Opis { get; set; }
public decimal? CentrGrAkcId { get; set; }
public DateTime Zmiana { get; set; }
public string DodJm { get; set; }
public decimal? IleDodJmwakcJm { get; set; }
public virtual ICollection<PozAkcyza> PozAkcyzas { get; set; }
public virtual ICollection<TabelaAkcyzowa> TabelaAkcyzowas { get; set; }
public virtual ICollection<TowAkcyza> TowAkcyzas { get; set; }
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class GrupaTow
{
public GrupaTow()
{
GrWartoscs = new HashSet<GrWartosc>();
}
public decimal GrId { get; set; }
public string Nazwa { get; set; }
public string Opis { get; set; }
public virtual ICollection<GrWartosc> GrWartoscs { get; set; }
}

View File

@ -0,0 +1,12 @@
#nullable disable
namespace Pcm.Db.Entities;
public class GrupaUz
{
public decimal UzId { get; set; }
public decimal RolaId { get; set; }
public virtual Uzytkownik Rola { get; set; }
public virtual Uzytkownik Uz { get; set; }
}

View File

@ -0,0 +1,22 @@
#nullable disable
namespace Pcm.Db.Entities;
public class HarmCeny
{
public decimal HarmId { get; set; }
public decimal TowId { get; set; }
public decimal? CenaDet { get; set; }
public decimal? CenaHurt { get; set; }
public decimal? CenaDod { get; set; }
public decimal? CenaNoc { get; set; }
public decimal? Cena5 { get; set; }
public decimal? Cena6 { get; set; }
public decimal? ProgPromocji { get; set; }
public short? CenaOtwarta { get; set; }
public string Inne { get; set; }
public short? Stawka { get; set; }
public virtual HarmWpi Harm { get; set; }
public virtual Towar Tow { get; set; }
}

View File

@ -0,0 +1,16 @@
#nullable disable
namespace Pcm.Db.Entities;
public class HarmCykl
{
public decimal HarmId { get; set; }
public short OdDnia { get; set; }
public short OdGodz { get; set; }
public short OdMin { get; set; }
public short? DoDnia { get; set; }
public short? DoGodz { get; set; }
public short? DoMin { get; set; }
public virtual HarmWpi Harm { get; set; }
}

View File

@ -0,0 +1,13 @@
#nullable disable
namespace Pcm.Db.Entities;
public class HarmHarm
{
public decimal HarmId { get; set; }
public short Znaczenie { get; set; }
public decimal PoprzHarmId { get; set; }
public virtual HarmWpi Harm { get; set; }
public virtual HarmWpi PoprzHarm { get; set; }
}

View File

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class HarmWpi
{
public HarmWpi()
{
HarmCenies = new HashSet<HarmCeny>();
HarmCykls = new HashSet<HarmCykl>();
HarmHarmHarms = new HashSet<HarmHarm>();
HarmHarmPoprzHarms = new HashSet<HarmHarm>();
}
public decimal HarmId { get; set; }
public short HarmTyp { get; set; }
public string Nazwa { get; set; }
public string Opcje { get; set; }
public short Aktywny { get; set; }
public short Uwzgledniony { get; set; }
public DateTime Zmiana { get; set; }
public decimal? PolId { get; set; }
public decimal? CentrHarmId { get; set; }
public DateTime? WaznyOd { get; set; }
public DateTime? WaznyDo { get; set; }
public decimal? KrajId { get; set; }
public short? CenyBrutto { get; set; }
public virtual Kraj Kraj { get; set; }
public virtual Polityka Pol { get; set; }
public virtual ICollection<HarmCeny> HarmCenies { get; set; }
public virtual ICollection<HarmCykl> HarmCykls { get; set; }
public virtual ICollection<HarmHarm> HarmHarmHarms { get; set; }
public virtual ICollection<HarmHarm> HarmHarmPoprzHarms { get; set; }
}

26
Pcm.Db/Entities/Istw.cs Normal file
View File

@ -0,0 +1,26 @@
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class Istw
{
public Istw()
{
Blokada = new HashSet<Blokadum>();
}
public decimal TowId { get; set; }
public decimal MagId { get; set; }
public decimal StanMag { get; set; }
public decimal BlokadaMag { get; set; }
public decimal CenaMag { get; set; }
public decimal StanMin { get; set; }
public decimal StanMax { get; set; }
public decimal? RezerwacjaMag { get; set; }
public virtual Magazyn Mag { get; set; }
public virtual Towar Tow { get; set; }
public virtual ICollection<Blokadum> Blokada { get; set; }
}

22
Pcm.Db/Entities/Jm.cs Normal file
View File

@ -0,0 +1,22 @@
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class Jm
{
public Jm()
{
KodWazonies = new HashSet<KodWazony>();
Towars = new HashSet<Towar>();
}
public decimal Jmid { get; set; }
public string Nazwa { get; set; }
public short Precyzja { get; set; }
public decimal? CentrJmid { get; set; }
public virtual ICollection<KodWazony> KodWazonies { get; set; }
public virtual ICollection<Towar> Towars { get; set; }
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class KartaLoj
{
public KartaLoj()
{
NrRejKarta = new HashSet<NrRejKartum>();
ZdarzLojs = new HashSet<ZdarzLoj>();
}
public decimal KartaId { get; set; }
public decimal KontoId { get; set; }
public short TypKarty { get; set; }
public string KodKarty { get; set; }
public DateTime? WaznaOd { get; set; }
public DateTime? WaznaDo { get; set; }
public DateTime? Uniewazniono { get; set; }
public string Posiadacz { get; set; }
public string Opis1 { get; set; }
public string Opis2 { get; set; }
public decimal? CentrKartaId { get; set; }
public virtual KontoLoj Konto { get; set; }
public virtual ICollection<NrRejKartum> NrRejKarta { get; set; }
public virtual ICollection<ZdarzLoj> ZdarzLojs { get; set; }
}

30
Pcm.Db/Entities/KasKod.cs Normal file
View File

@ -0,0 +1,30 @@
#nullable disable
namespace Pcm.Db.Entities;
public class KasKod
{
public decimal KasaId { get; set; }
public decimal TowId { get; set; }
public short Kolejnosc { get; set; }
public string Kod { get; set; }
public short Status { get; set; }
public short ZmianyCen { get; set; }
public short ZmianyInne { get; set; }
public short BylyZmianyCen { get; set; }
public short BylyZmianyInne { get; set; }
public int? KasPrefPlu { get; set; }
public int? Plu { get; set; }
public short? DodIndeks { get; set; }
public short? Stawka { get; set; }
public short? TypTowaru { get; set; }
public decimal? IleWkodzie { get; set; }
public short? PoziomCen { get; set; }
public string Skrot { get; set; }
public string KodOpak { get; set; }
public int? Pluopak { get; set; }
public string Rezerwa { get; set; }
public virtual Kasa Kasa { get; set; }
public virtual Towar Tow { get; set; }
}

12
Pcm.Db/Entities/KasPar.cs Normal file
View File

@ -0,0 +1,12 @@
#nullable disable
namespace Pcm.Db.Entities;
public class KasPar
{
public decimal KasaId { get; set; }
public string ParNazwa { get; set; }
public string ParWartosc { get; set; }
public virtual Kasa Kasa { get; set; }
}

20
Pcm.Db/Entities/KasTow.cs Normal file
View File

@ -0,0 +1,20 @@
#nullable disable
namespace Pcm.Db.Entities;
public class KasTow
{
public decimal KasaId { get; set; }
public string KodWyslany { get; set; }
public decimal TowId { get; set; }
public short TypTowaru { get; set; }
public short Dodatkowy { get; set; }
public int Plu { get; set; }
public short DodIndeks { get; set; }
public short ZmianyCen { get; set; }
public short ZmianyInne { get; set; }
public short FlagaExp { get; set; }
public virtual Kasa Kasa { get; set; }
public virtual Towar Tow { get; set; }
}

41
Pcm.Db/Entities/Kasa.cs Normal file
View File

@ -0,0 +1,41 @@
using System.Collections.Generic;
#nullable disable
namespace Pcm.Db.Entities;
public class Kasa
{
public Kasa()
{
DokKasas = new HashSet<DokKasa>();
KasKods = new HashSet<KasKod>();
KasPars = new HashSet<KasPar>();
KasTows = new HashSet<KasTow>();
KasaFormaPlatns = new HashSet<KasaFormaPlatn>();
Paragons = new HashSet<Paragon>();
ProfilKasas = new HashSet<ProfilKasa>();
Przydzials = new HashSet<Przydzial>();
Zlecenies = new HashSet<Zlecenie>();
}
public decimal KasaId { get; set; }
public decimal MagId { get; set; }
public short Numer { get; set; }
public string Nazwa { get; set; }
public short Rodzaj { get; set; }
public string Typ { get; set; }
public short Aktywny { get; set; }
public string Stanowisko { get; set; }
public virtual Magazyn Mag { get; set; }
public virtual ICollection<DokKasa> DokKasas { get; set; }
public virtual ICollection<KasKod> KasKods { get; set; }
public virtual ICollection<KasPar> KasPars { get; set; }
public virtual ICollection<KasTow> KasTows { get; set; }
public virtual ICollection<KasaFormaPlatn> KasaFormaPlatns { get; set; }
public virtual ICollection<Paragon> Paragons { get; set; }
public virtual ICollection<ProfilKasa> ProfilKasas { get; set; }
public virtual ICollection<Przydzial> Przydzials { get; set; }
public virtual ICollection<Zlecenie> Zlecenies { get; set; }
}

View File

@ -0,0 +1,13 @@
#nullable disable
namespace Pcm.Db.Entities;
public class KasaFormaPlatn
{
public decimal FormaId { get; set; }
public decimal KasaId { get; set; }
public short Aktywny { get; set; }
public virtual FormaPlatnPos7 Forma { get; set; }
public virtual Kasa Kasa { get; set; }
}

View File

@ -0,0 +1,14 @@
#nullable disable
namespace Pcm.Db.Entities;
public class KatParam
{
public decimal KatId { get; set; }
public decimal ParId { get; set; }
public short Kolejnosc { get; set; }
public int WartDom { get; set; }
public virtual Kategorium Kat { get; set; }
public virtual Parametr Par { get; set; }
}

Some files were not shown because too many files have changed in this diff Show More