6 Commits

Author SHA1 Message Date
sanchezvem 09ce53203c Merge branch 'develop' 2026-06-08 12:22:09 +01:00
sanchezvem 3065bba7fb Merge branch 'develop' 2026-06-01 11:13:22 +01:00
sanchezvem da1407579d Actualiser README.md 2026-05-30 14:23:44 +02:00
sanchezvem 602b91006e Merge remote-tracking branch 'origin/develop' 2026-05-30 13:45:04 +01:00
Cristiano 7f3ffde3ff Merge branch 'develop' 2025-11-27 14:56:14 +01:00
sanchezvem 6be43958fa updated length of password to 60 for bcrypt length 2025-11-27 13:28:05 +01:00
9 changed files with 52 additions and 52 deletions
@@ -3,17 +3,12 @@ using FastEndpoints;
using PyroFetes.DTO.DeliveryNote.Request; using PyroFetes.DTO.DeliveryNote.Request;
using PyroFetes.Models; using PyroFetes.Models;
using PyroFetes.Repositories; using PyroFetes.Repositories;
using PyroFetes.Services;
using PyroFetes.Services.Pdf; using PyroFetes.Services.Pdf;
using PyroFetes.Specifications.DeliveryNotes; using PyroFetes.Specifications.DeliveryNotes;
namespace PyroFetes.Endpoints.DeliveryNotes; namespace PyroFetes.Endpoints.DeliveryNotes;
public class GetDeliveryNotePdfEndpoint( public class GetDeliveryNotePdfEndpoint(DeliveryNotesRepository deliveryNotesRepository, IDeliveryNotePdfService deliveryNotePdfService, SettingsRepository settingsRepository)
DeliveryNotesRepository deliveryNotesRepository,
DeliveryNotePdfService deliveryNotePdfService,
SettingsRepository settingsRepository,
StorageService storageService)
: Endpoint<GetDeliveryNotePdfDto, byte[]> : Endpoint<GetDeliveryNotePdfDto, byte[]>
{ {
public override void Configure() public override void Configure()
@@ -36,7 +31,7 @@ public class GetDeliveryNotePdfEndpoint(
return; return;
} }
byte[] bytes = await deliveryNotePdfService.Generate(deliveryNote, setting!, storageService); byte[] bytes = deliveryNotePdfService.Generate(deliveryNote, deliveryNote.ProductDeliveries!, setting!);
await Send.BytesAsync( await Send.BytesAsync(
bytes: bytes, bytes: bytes,
@@ -3,7 +3,6 @@ using FastEndpoints;
using PyroFetes.DTO.PurchaseOrder.Request; using PyroFetes.DTO.PurchaseOrder.Request;
using PyroFetes.Models; using PyroFetes.Models;
using PyroFetes.Repositories; using PyroFetes.Repositories;
using PyroFetes.Services;
using PyroFetes.Services.Pdf; using PyroFetes.Services.Pdf;
using PyroFetes.Specifications.PurchaseOrders; using PyroFetes.Specifications.PurchaseOrders;
@@ -11,9 +10,8 @@ namespace PyroFetes.Endpoints.PurchaseOrders;
public class GetPurchaseOrderPdfEndpoint( public class GetPurchaseOrderPdfEndpoint(
PurchaseOrdersRepository purchaseOrdersRepository, PurchaseOrdersRepository purchaseOrdersRepository,
PurchaseOrderPdfService purchaseOrderPdfService, IPurchaseOrderPdfService purchaseOrderPdfService,
SettingsRepository settingsRepository, SettingsRepository settingsRepository)
StorageService storageService)
: Endpoint<GetPurchaseOrderPdfDto, byte[]> : Endpoint<GetPurchaseOrderPdfDto, byte[]>
{ {
public override void Configure() public override void Configure()
@@ -35,7 +33,7 @@ public class GetPurchaseOrderPdfEndpoint(
Setting? setting = await settingsRepository.FirstOrDefaultAsync(ct); Setting? setting = await settingsRepository.FirstOrDefaultAsync(ct);
byte[] bytes = await purchaseOrderPdfService.Generate(purchaseOrder, setting!, storageService); byte[] bytes = purchaseOrderPdfService.Generate(purchaseOrder, purchaseOrder.PurchaseProducts!, setting!);
await Send.BytesAsync( await Send.BytesAsync(
bytes: bytes, bytes: bytes,
@@ -3,7 +3,6 @@ using FastEndpoints;
using PyroFetes.DTO.Quotation.Request; using PyroFetes.DTO.Quotation.Request;
using PyroFetes.Models; using PyroFetes.Models;
using PyroFetes.Repositories; using PyroFetes.Repositories;
using PyroFetes.Services;
using PyroFetes.Services.Pdf; using PyroFetes.Services.Pdf;
using PyroFetes.Specifications.Quotations; using PyroFetes.Specifications.Quotations;
@@ -11,9 +10,8 @@ namespace PyroFetes.Endpoints.Quotations;
public class GetQuotationPdfEndpoint( public class GetQuotationPdfEndpoint(
QuotationsRepository quotationRepository, QuotationsRepository quotationRepository,
QuotationPdfService quotationPdfService, IQuotationPdfService quotationPdfService,
SettingsRepository settingsRepository, SettingsRepository settingsRepository)
StorageService storageService)
: Endpoint<GetQuotationPdfDto, byte[]> : Endpoint<GetQuotationPdfDto, byte[]>
{ {
public override void Configure() public override void Configure()
@@ -35,7 +33,7 @@ public class GetQuotationPdfEndpoint(
Setting? setting = await settingsRepository.FirstOrDefaultAsync(ct); Setting? setting = await settingsRepository.FirstOrDefaultAsync(ct);
byte[] bytes = await quotationPdfService.Generate(quotation, setting!, storageService); byte[] bytes = quotationPdfService.Generate(quotation, quotation.QuotationProducts!, setting!);
await Send.BytesAsync( await Send.BytesAsync(
bytes: bytes, bytes: bytes,
+3 -3
View File
@@ -56,9 +56,9 @@ builder.Services.AddScoped<WareHouseRepository>();
builder.Services.AddScoped<CustomersRepository>(); builder.Services.AddScoped<CustomersRepository>();
// Ajout des services // Ajout des services
builder.Services.AddScoped<DeliveryNotePdfService>(); builder.Services.AddScoped<IDeliveryNotePdfService, DeliveryNotePdfService>();
builder.Services.AddScoped<PurchaseOrderPdfService>(); builder.Services.AddScoped<IPurchaseOrderPdfService, PurchaseOrderPdfService>();
builder.Services.AddScoped<QuotationPdfService>(); builder.Services.AddScoped<IQuotationPdfService, QuotationPdfService>();
builder.Services.AddScoped<StorageService>(); builder.Services.AddScoped<StorageService>();
MapperConfiguration mappingConfig = new(mc => MapperConfiguration mappingConfig = new(mc =>
+1 -1
View File
@@ -64,7 +64,7 @@ public class PyroFetesDbContext : DbContext
{ {
string connectionString = string connectionString =
"Server=romaric-thibault.fr;" + "Server=romaric-thibault.fr;" +
"Database=PyroFetes-Sujet2-Cristiano;" + "Database=PyroFetes-Sujet2;" +
"User Id=pyrofetes;" + "User Id=pyrofetes;" +
"Password=Crablike8-Fringe-Swimmable;" + "Password=Crablike8-Fringe-Swimmable;" +
"TrustServerCertificate=true;"; "TrustServerCertificate=true;";
@@ -5,14 +5,17 @@ using QuestPDF.Infrastructure;
namespace PyroFetes.Services.Pdf; namespace PyroFetes.Services.Pdf;
public class DeliveryNotePdfService public interface IDeliveryNotePdfService
{ {
private static readonly HttpClient HttpClient = new(); byte[] Generate(DeliveryNote deliveryNote, List<ProductDelivery> lignes, Setting setting);
}
public async Task<byte[]> Generate(DeliveryNote deliveryNote, Setting setting, StorageService storageService) public class DeliveryNotePdfService : IDeliveryNotePdfService
{ {
byte[] logoBytes = await HttpClient.GetByteArrayAsync(storageService.GetUrl(setting.Logo!)); public byte[] Generate(DeliveryNote deliveryNote, List<ProductDelivery> lignes, Setting setting)
byte[] signatureBytes = await HttpClient.GetByteArrayAsync(storageService.GetUrl(setting.ElectronicSignature!)); {
byte[] logo = Convert.FromBase64String(setting.Logo!);
byte[] signature = Convert.FromBase64String(setting.ElectronicSignature!);
decimal total = 0; decimal total = 0;
int totalQuantity = 0; int totalQuantity = 0;
Document document = Document.Create(container => Document document = Document.Create(container =>
@@ -45,7 +48,7 @@ public class DeliveryNotePdfService
// Logo + société à droite // Logo + société à droite
row.ConstantItem(200).Column(col => row.ConstantItem(200).Column(col =>
{ {
col.Item().AlignRight().Height(70).Image(logoBytes, ImageScaling.FitArea); col.Item().AlignRight().Height(70).Image(logo, ImageScaling.FitArea);
col.Item().Height(20); col.Item().Height(20);
col.Item().AlignRight().Text("Pyro-Fêtes").SemiBold(); col.Item().AlignRight().Text("Pyro-Fêtes").SemiBold();
col.Item().Height(5); col.Item().Height(5);
@@ -90,7 +93,7 @@ public class DeliveryNotePdfService
header.Cell().Element(CellHeader).AlignRight().Text("Total"); header.Cell().Element(CellHeader).AlignRight().Text("Total");
}); });
foreach (ProductDelivery l in deliveryNote.ProductDeliveries!) foreach (ProductDelivery l in lignes)
{ {
decimal price = l.Product!.Prices! decimal price = l.Product!.Prices!
.FirstOrDefault(x => x.SupplierId == l.DeliveryNote!.SupplierId && x.ProductId == l.ProductId) .FirstOrDefault(x => x.SupplierId == l.DeliveryNote!.SupplierId && x.ProductId == l.ProductId)
@@ -122,7 +125,7 @@ public class DeliveryNotePdfService
}); });
// Signature en bas à droite // Signature en bas à droite
page.Footer().AlignRight().Column(col => { col.Item().AlignRight().Height(100).Image(signatureBytes, ImageScaling.FitArea); }); page.Footer().AlignRight().Column(col => { col.Item().AlignRight().Height(100).Image(signature, ImageScaling.FitArea); });
}); });
}); });
@@ -5,14 +5,17 @@ using QuestPDF.Infrastructure;
namespace PyroFetes.Services.Pdf; namespace PyroFetes.Services.Pdf;
public class PurchaseOrderPdfService public interface IPurchaseOrderPdfService
{ {
private static readonly HttpClient HttpClient = new(); byte[] Generate(PurchaseOrder purchaseOrder, List<PurchaseProduct> lignes, Setting setting);
}
public async Task<byte[]> Generate(PurchaseOrder purchaseOrder, Setting setting, StorageService storageService) public class PurchaseOrderPdfService : IPurchaseOrderPdfService
{ {
byte[] logoBytes = await HttpClient.GetByteArrayAsync(storageService.GetUrl(setting.Logo!)); public byte[] Generate(PurchaseOrder purchaseOrder, List<PurchaseProduct> lignes, Setting setting)
byte[] signatureBytes = await HttpClient.GetByteArrayAsync(storageService.GetUrl(setting.ElectronicSignature!)); {
byte[] logo = Convert.FromBase64String(setting.Logo!);
byte[] signature = Convert.FromBase64String(setting.ElectronicSignature!);
int totalQuantity = 0; int totalQuantity = 0;
decimal total = 0; decimal total = 0;
Document document = Document.Create(container => Document document = Document.Create(container =>
@@ -42,7 +45,7 @@ public class PurchaseOrderPdfService
// Logo + société à droite // Logo + société à droite
row.ConstantItem(200).Column(col => row.ConstantItem(200).Column(col =>
{ {
col.Item().AlignRight().Height(70).Image(logoBytes, ImageScaling.FitArea); col.Item().AlignRight().Height(70).Image(logo, ImageScaling.FitArea);
col.Item().Height(20); col.Item().Height(20);
col.Item().AlignRight().Text("Pyro-Fêtes").SemiBold(); col.Item().AlignRight().Text("Pyro-Fêtes").SemiBold();
col.Item().Height(5); col.Item().Height(5);
@@ -90,7 +93,7 @@ public class PurchaseOrderPdfService
header.Cell().Element(CellHeader).AlignRight().Text("Total"); header.Cell().Element(CellHeader).AlignRight().Text("Total");
}); });
foreach (PurchaseProduct l in purchaseOrder.PurchaseProducts!) foreach (PurchaseProduct l in lignes)
{ {
decimal price = l.Product!.Prices! decimal price = l.Product!.Prices!
.FirstOrDefault(x => x.SupplierId == l.PurchaseOrder!.SupplierId && x.ProductId == l.ProductId) .FirstOrDefault(x => x.SupplierId == l.PurchaseOrder!.SupplierId && x.ProductId == l.ProductId)
@@ -138,7 +141,7 @@ public class PurchaseOrderPdfService
}); });
// Signature en bas à droite // Signature en bas à droite
page.Footer().AlignRight().Column(col => { col.Item().AlignRight().Height(100).Image(signatureBytes, ImageScaling.FitArea); }); page.Footer().AlignRight().Column(col => { col.Item().AlignRight().Height(100).Image(signature, ImageScaling.FitArea); });
}); });
}); });
+11 -8
View File
@@ -5,14 +5,17 @@ using QuestPDF.Infrastructure;
namespace PyroFetes.Services.Pdf; namespace PyroFetes.Services.Pdf;
public class QuotationPdfService public interface IQuotationPdfService
{ {
private static readonly HttpClient HttpClient = new(); byte[] Generate(Quotation quotation, List<QuotationProduct> lignes, Setting setting);
}
public async Task<byte[]> Generate(Quotation quotation, Setting setting, StorageService storageService) public class QuotationPdfService : IQuotationPdfService
{ {
byte[] logoBytes = await HttpClient.GetByteArrayAsync(storageService.GetUrl(setting.Logo!)); public byte[] Generate(Quotation quotation, List<QuotationProduct> lignes, Setting setting)
byte[] signatureBytes = await HttpClient.GetByteArrayAsync(storageService.GetUrl(setting.ElectronicSignature!)); {
byte[] logo = Convert.FromBase64String(setting.Logo!);
byte[] signature = Convert.FromBase64String(setting.ElectronicSignature!);
decimal total = 0; decimal total = 0;
Document document = Document.Create(container => Document document = Document.Create(container =>
{ {
@@ -39,7 +42,7 @@ public class QuotationPdfService
// Logo + société à droite // Logo + société à droite
row.ConstantItem(200).Column(col => row.ConstantItem(200).Column(col =>
{ {
col.Item().AlignRight().Height(70).Image(logoBytes, ImageScaling.FitArea); col.Item().AlignRight().Height(70).Image(logo, ImageScaling.FitArea);
col.Item().Height(20); col.Item().Height(20);
col.Item().AlignRight().Text("Pyro-Fêtes").SemiBold(); col.Item().AlignRight().Text("Pyro-Fêtes").SemiBold();
col.Item().Height(5); col.Item().Height(5);
@@ -87,7 +90,7 @@ public class QuotationPdfService
header.Cell().Element(CellHeader).AlignRight().Text("Total"); header.Cell().Element(CellHeader).AlignRight().Text("Total");
}); });
foreach (QuotationProduct l in quotation.QuotationProducts!) foreach (QuotationProduct l in lignes)
{ {
decimal price = l.Product!.Prices! decimal price = l.Product!.Prices!
.FirstOrDefault(x => x.SupplierId == l.Quotation!.SupplierId && x.ProductId == l.ProductId) .FirstOrDefault(x => x.SupplierId == l.Quotation!.SupplierId && x.ProductId == l.ProductId)
@@ -131,7 +134,7 @@ public class QuotationPdfService
}); });
// Signature en bas à droite // Signature en bas à droite
page.Footer().AlignRight().Column(col => { col.Item().AlignRight().Height(100).Image(signatureBytes, ImageScaling.FitArea); }); page.Footer().AlignRight().Column(col => { col.Item().AlignRight().Height(100).Image(signature, ImageScaling.FitArea); });
}); });
}); });
+1 -1
View File
@@ -12,7 +12,7 @@ public class StorageService(IAmazonS3 amazonS3, IConfiguration config)
{ {
if (file.Length == 0) throw new Exception("Fichier vide"); if (file.Length == 0) throw new Exception("Fichier vide");
string key = $"settings/{type}/{Guid.NewGuid()}"; string key = $"settings/{type}";
using MemoryStream memoryStream = new(); using MemoryStream memoryStream = new();
await file.CopyToAsync(memoryStream, ct); await file.CopyToAsync(memoryStream, ct);