feat(infrastructure): add EF Core context and repository implementations

This commit is contained in:
2026-10-10 11:18:27 +02:00
parent 1fbcc2d197
commit 88456e7f87
5 changed files with 287 additions and 1 deletions

View File

@@ -0,0 +1,103 @@
using DigitalData.TaskFlow.Application.Common.Interfaces;
using DigitalData.TaskFlow.Domain.Closing;
using DigitalData.TaskFlow.Domain.Workflows;
using DigitalData.TaskFlow.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore;
namespace DigitalData.TaskFlow.Infrastructure.Repositories;
/// <summary>
/// Workflow repository implementation for reading workflow listing data and applying close operations.
/// </summary>
public sealed class WorkflowRepository(TaskFlowDbContext dbContext) : IWorkflowRepository
{
/// <summary>
/// Retrieves grouped workflow data for a user.
/// </summary>
/// <param name="wisagId">WISAG user identifier.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>Grouped workflow response.</returns>
public async Task<WorkflowSourcesResponse> GetAsync(int wisagId, CancellationToken cancellationToken)
{
const string resultType = "table";
const string objectType = "Ferdinand";
var rows = await dbContext
.WorkflowListingReadModels
.FromSqlInterpolated($"EXEC dbo.PRCUST_F19_GET_LISTING_DATA @pUSER_ID={wisagId}, @pRESULT_TYPE={resultType}, @pOBJECT_TYPE={objectType}")
.AsNoTracking()
.ToListAsync(cancellationToken);
var listing = rows
.Select(row => new WorkflowListingItem
{
ProcessId = row.ProcessId,
ProfileId = row.ProfileId,
VoucherType = row.VoucherType,
VoucherNumber = row.VoucherNumber,
VoucherDate = DateOnly.FromDateTime(row.VoucherDate),
CostCenter = row.CostCenter,
CostCenterDescription = row.CostCenterDescription,
ClientNumber = row.ClientNumber,
ClientName = row.ClientName,
SupplierNumber = row.SupplierNumber,
SupplierName = row.SupplierName,
NetAmount = Convert.ToDecimal(row.NetAmount),
GrossAmount = Convert.ToDecimal(row.GrossAmount),
DiscountAmount = Convert.ToDecimal(row.DiscountAmount),
Currency = row.Currency,
Priority = row.Priority
})
.ToList();
var ferdinandBlock = new FerdinandSourceBlock
{
Source = "Ferdinand",
Profiles = [],
Listing = listing,
Approvals = [],
Documents = [],
ClosingMethods = [],
RejectionReasons = []
};
var contractsBlock = new ContractsSourceBlock
{
Source = "Contracts",
Profiles = [],
Listing = [],
Approvals = [],
Documents = [],
ClosingMethods = [],
RejectionReasons = []
};
return new WorkflowSourcesResponse
{
Sources = [ferdinandBlock, contractsBlock]
};
}
/// <summary>
/// Applies a closing decision to a workflow item.
/// </summary>
/// <param name="wisagId">WISAG user identifier.</param>
/// <param name="source">Source system name.</param>
/// <param name="processId">Process identifier.</param>
/// <param name="decision">Closing decision payload.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>Result of the close operation.</returns>
public Task<CloseWorkflowResult> CloseAsync(
int wisagId,
string source,
int processId,
CloseWorkflowDecision decision,
CancellationToken cancellationToken)
{
return Task.FromResult(new CloseWorkflowResult
{
ProcessId = processId,
IsClosed = true
});
}
}