feat: initial project setup

- Add .NET 8 backend with Clean Architecture
- Add React + Vite + TypeScript frontend
- Implement authentication with JWT
- Implement Azure Blob Storage client
- Implement OCR integration
- Implement supplier matching service
- Implement voucher generation
- Implement Fortnox provider
- Add unit and integration tests
- Add Docker Compose configuration
This commit is contained in:
Invoice Master
2026-02-04 20:14:34 +01:00
commit 05ea67144f
250 changed files with 50402 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
using InvoiceMaster.Core.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace InvoiceMaster.Infrastructure.Data.Configurations;
public class SupplierCacheConfiguration : IEntityTypeConfiguration<SupplierCache>
{
public void Configure(EntityTypeBuilder<SupplierCache> builder)
{
builder.ToTable("supplier_cache");
builder.HasKey(e => e.Id);
builder.Property(e => e.SupplierNumber)
.IsRequired()
.HasMaxLength(50);
builder.Property(e => e.Name)
.IsRequired()
.HasMaxLength(255);
builder.Property(e => e.OrganisationNumber)
.HasMaxLength(20);
builder.Property(e => e.Address1)
.HasMaxLength(255);
builder.Property(e => e.Address2)
.HasMaxLength(255);
builder.Property(e => e.Postcode)
.HasMaxLength(20);
builder.Property(e => e.City)
.HasMaxLength(100);
builder.Property(e => e.Country)
.HasMaxLength(100);
builder.Property(e => e.Phone)
.HasMaxLength(50);
builder.Property(e => e.Email)
.HasMaxLength(255);
builder.Property(e => e.BankgiroNumber)
.HasMaxLength(50);
builder.Property(e => e.PlusgiroNumber)
.HasMaxLength(50);
builder.HasIndex(e => new { e.ConnectionId, e.SupplierNumber })
.IsUnique();
builder.HasIndex(e => e.ConnectionId);
builder.HasIndex(e => e.OrganisationNumber);
builder.HasIndex(e => e.Name);
builder.HasIndex(e => e.ExpiresAt);
builder.HasOne(e => e.Connection)
.WithMany()
.HasForeignKey(e => e.ConnectionId)
.OnDelete(DeleteBehavior.Cascade);
}
}