Skip to content

Commit 1a03152

Browse files
feat: Add acteDepot parameter to TEJ XML export endpoints and update filename generation
- Introduced acteDepot query parameter in ExportFactureDepenseToTejXmlEndpoint and ExportProviderInvoiceToTejXmlEndpoint to handle initial and rectificative declarations. - Updated XML export logic to include acteDepot in the generated XML and filename, ensuring compliance with TEJ requirements. - Enhanced TejXmlExportService to support acteDepot in both export methods, improving flexibility for users. - Added localization entries for TEJ export messages, enhancing user experience in multiple languages.
1 parent 972326b commit 1a03152

File tree

17 files changed

+1246
-11
lines changed

17 files changed

+1246
-11
lines changed

src/TunNetCom.SilkRoadErp.Sales.Api/Features/FactureDepense/ExportToTejXml/ExportFactureDepenseToTejXmlEndpoint.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public static async Task<Results<FileContentHttpResult, BadRequest<string>, NotF
3030
[FromServices] IActiveAccountingYearService activeAccountingYearService,
3131
[FromServices] IAccountingYearFinancialParametersService financialParametersService,
3232
int id,
33+
[FromQuery] string? acteDepot = "0",
3334
CancellationToken cancellationToken = default)
3435
{
3536
try
@@ -160,6 +161,8 @@ public static async Task<Results<FileContentHttpResult, BadRequest<string>, NotF
160161
"Le matricule fiscal de l'entreprise doit être au format 7 chiffres et une lettre clé (ex. 0001238L).");
161162
}
162163

164+
var acteDepotValue = acteDepot == "1" ? "1" : "0";
165+
163166
var xmlBytes = exportService.ExportFactureDepenseToTejXml(
164167
factureDepense,
165168
tiers,
@@ -169,7 +172,8 @@ public static async Task<Results<FileContentHttpResult, BadRequest<string>, NotF
169172
refCertifChezDeclarant: refCertifTej,
170173
normalizedDeclarantMatricule: matriculeNormaliseResult,
171174
normalizedBeneficiaireMatricule: tiersMatriculeNormalise,
172-
beneficiaireTel8Digits: telDigitsOnly);
175+
beneficiaireTel8Digits: telDigitsOnly,
176+
acteDepot: acteDepotValue);
173177

174178
var validationErrors = TejXsdValidator.Validate(xmlBytes)
175179
.Where(e => !e.Contains("introuvable", StringComparison.OrdinalIgnoreCase))
@@ -183,8 +187,7 @@ public static async Task<Results<FileContentHttpResult, BadRequest<string>, NotF
183187

184188
var exercice = factureDepense.Date.Year;
185189
var mois = factureDepense.Date.Month.ToString("D2");
186-
const string codeActe = "0";
187-
var filename = $"{matriculeNormaliseResult}-{exercice}-{mois}-{codeActe}.xml";
190+
var filename = $"{matriculeNormaliseResult}-{exercice}-{mois}-{acteDepotValue}.xml";
188191

189192
logger.LogInformation("TEJ XML export completed successfully for FactureDepense Id {Id}", id);
190193

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using Carter;
2+
using Microsoft.AspNetCore.Mvc;
3+
using TunNetCom.SilkRoadErp.Sales.Api.Infrastructure.Constants;
4+
using TunNetCom.SilkRoadErp.Sales.Contracts.FactureDepense;
5+
6+
namespace TunNetCom.SilkRoadErp.Sales.Api.Features.FactureDepense.GetFacturesDepenseTotals;
7+
8+
public class GetFacturesDepenseTotalsEndpoint : ICarterModule
9+
{
10+
public void AddRoutes(IEndpointRouteBuilder app)
11+
{
12+
_ = app.MapGet("/api/factures-depenses/totals", HandleGetTotalsAsync)
13+
.RequireAuthorization($"Permission:{Permissions.ViewFactureDepense}")
14+
.WithTags(EndpointTags.FactureDepense)
15+
.Produces<FactureDepenseTotalsResponse>(StatusCodes.Status200OK)
16+
.Produces(StatusCodes.Status500InternalServerError);
17+
}
18+
19+
public static async Task<Results<Ok<FactureDepenseTotalsResponse>, StatusCodeHttpResult>> HandleGetTotalsAsync(
20+
[FromServices] IMediator mediator,
21+
[FromServices] ILogger<GetFacturesDepenseTotalsEndpoint> logger,
22+
[FromQuery] int? accountingYearId = null,
23+
[FromQuery] DateTime? startDate = null,
24+
[FromQuery] DateTime? endDate = null,
25+
[FromQuery] int? tiersDepenseFonctionnementId = null,
26+
CancellationToken cancellationToken = default)
27+
{
28+
try
29+
{
30+
logger.LogInformation(
31+
"GetFacturesDepenseTotalsEndpoint called with accountingYearId: {AccountingYearId}, startDate: {StartDate}, endDate: {EndDate}, tiersId: {TiersId}",
32+
accountingYearId, startDate, endDate, tiersDepenseFonctionnementId);
33+
34+
var response = await mediator.Send(
35+
new GetFacturesDepenseTotalsQuery(accountingYearId, startDate, endDate, tiersDepenseFonctionnementId),
36+
cancellationToken);
37+
return TypedResults.Ok(response);
38+
}
39+
catch (Exception ex)
40+
{
41+
logger.LogError(ex, "Error calculating factures dépense totals");
42+
return TypedResults.StatusCode(500);
43+
}
44+
}
45+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using TunNetCom.SilkRoadErp.Sales.Contracts.FactureDepense;
2+
3+
namespace TunNetCom.SilkRoadErp.Sales.Api.Features.FactureDepense.GetFacturesDepenseTotals;
4+
5+
public record GetFacturesDepenseTotalsQuery(
6+
int? AccountingYearId = null,
7+
DateTime? StartDate = null,
8+
DateTime? EndDate = null,
9+
int? TiersDepenseFonctionnementId = null) : IRequest<FactureDepenseTotalsResponse>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using TunNetCom.SilkRoadErp.Sales.Contracts.FactureDepense;
3+
using TunNetCom.SilkRoadErp.Sales.Domain.Entites;
4+
5+
namespace TunNetCom.SilkRoadErp.Sales.Api.Features.FactureDepense.GetFacturesDepenseTotals;
6+
7+
public class GetFacturesDepenseTotalsQueryHandler(SalesContext context)
8+
: IRequestHandler<GetFacturesDepenseTotalsQuery, FactureDepenseTotalsResponse>
9+
{
10+
public async Task<FactureDepenseTotalsResponse> Handle(GetFacturesDepenseTotalsQuery request, CancellationToken cancellationToken)
11+
{
12+
var q = context.FactureDepense.AsNoTracking().AsQueryable();
13+
14+
if (request.AccountingYearId.HasValue)
15+
q = q.Where(f => f.AccountingYearId == request.AccountingYearId.Value);
16+
17+
if (request.TiersDepenseFonctionnementId.HasValue)
18+
q = q.Where(f => f.IdTiersDepenseFonctionnement == request.TiersDepenseFonctionnementId.Value);
19+
20+
if (request.StartDate.HasValue)
21+
q = q.Where(f => f.Date >= request.StartDate.Value);
22+
23+
if (request.EndDate.HasValue)
24+
{
25+
var endDateInclusive = request.EndDate.Value.Date.AddDays(1).AddTicks(-1);
26+
q = q.Where(f => f.Date <= endDateInclusive);
27+
}
28+
29+
var totals = await q
30+
.Select(f => new
31+
{
32+
HT = f.BaseHT0 + f.BaseHT7 + f.BaseHT13 + f.BaseHT19,
33+
TVA = f.MontantTVA0 + f.MontantTVA7 + f.MontantTVA13 + f.MontantTVA19,
34+
TTC = f.MontantTotal
35+
})
36+
.ToListAsync(cancellationToken);
37+
38+
return new FactureDepenseTotalsResponse
39+
{
40+
TotalHT = totals.Sum(t => t.HT),
41+
TotalTVA = totals.Sum(t => t.TVA),
42+
TotalTTC = totals.Sum(t => t.TTC)
43+
};
44+
}
45+
}

src/TunNetCom.SilkRoadErp.Sales.Api/Features/ProviderInvoices/ExportToTejXml/ExportProviderInvoiceToTejXmlEndpoint.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public static async Task<Results<FileContentHttpResult, BadRequest<string>, NotF
2929
[FromServices] IActiveAccountingYearService activeAccountingYearService,
3030
[FromServices] IAccountingYearFinancialParametersService financialParametersService,
3131
int invoiceNumber,
32+
[FromQuery] string? acteDepot = "0",
3233
CancellationToken cancellationToken = default)
3334
{
3435
try
@@ -197,6 +198,8 @@ public static async Task<Results<FileContentHttpResult, BadRequest<string>, NotF
197198
"Le matricule fiscal de l'entreprise doit être au format 7 chiffres et une lettre clé (ex. 0001238L).");
198199
}
199200

201+
var acteDepotValue = acteDepot == "1" ? "1" : "0";
202+
200203
// Generate XML : montant avant retenue + ref F+AV+AF ; la plateforme TEJ effectue le calcul de retenue
201204
var xmlBytes = exportService.ExportProviderInvoiceToTejXml(
202205
factureFournisseur,
@@ -208,7 +211,8 @@ public static async Task<Results<FileContentHttpResult, BadRequest<string>, NotF
208211
refCertifChezDeclarant: refCertifTej,
209212
normalizedDeclarantMatricule: matriculeNormaliseResult,
210213
normalizedBeneficiaireMatricule: providerMatriculeNormalise,
211-
beneficiaireTel8Digits: telDigitsOnly);
214+
beneficiaireTel8Digits: telDigitsOnly,
215+
acteDepot: acteDepotValue);
212216

213217
// Validate against TEJ XSD when schema is available
214218
var validationErrors = TejXsdValidator.Validate(xmlBytes)
@@ -224,8 +228,7 @@ public static async Task<Results<FileContentHttpResult, BadRequest<string>, NotF
224228
// Generate filename per regulatory format: [MATRICULEFISCAL]-[EXERCICE]-[mois]-[code acte].xml
225229
var exercice = factureFournisseur.Date.Year;
226230
var mois = factureFournisseur.Date.Month.ToString("D2");
227-
const string codeActe = "0"; // 0 = déclaration initiale
228-
var filename = $"{matriculeNormaliseResult}-{exercice}-{mois}-{codeActe}.xml";
231+
var filename = $"{matriculeNormaliseResult}-{exercice}-{mois}-{acteDepotValue}.xml";
229232

230233
logger.LogInformation("TEJ XML export completed successfully for invoice {InvoiceNumber}", invoiceNumber);
231234

0 commit comments

Comments
 (0)