using System.Data; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.StockValuation; using MMDAL.Query.StockValuation; namespace MMDAL.CustomCode.StockLedgerCost; public class StockPostingDAL : IStockPostingDAL { private readonly IQueryExecutor _qe; public StockPostingDAL(IQueryExecutor qe) => _qe = qe; public async Task ApplyStockBatchAsync(DataTable movementsTvp, LoginDTO login, CancellationToken ct) { try { // TenantId is embedded in every TVP row (TENANTID column); SP derives it internally. var tvpParameters = new Dictionary { { "@Movements", (movementsTvp, "StockMovementTVP") } }; await _qe.BulkInsertMultipleAsync( login, StockPostingQB.SP_APPLY_STOCK_BATCH, tvpParameters).ConfigureAwait(false); }catch(Exception) { throw; } } public async Task> GetStockMovementsForDocumentAsync( int documentId, int objectDetailTypeId, LoginDTO login, CancellationToken ct) { var param = new { DocumentId = documentId, ObjectDetailTypeId = objectDetailTypeId, TenantId = login.ClientId }; var rows = await _qe.QueryAsync( login, StockPostingQB.GET_STOCK_LEDGER_FOR_DOCUMENT, param, cancellationToken: ct).ConfigureAwait(false); return rows.ToList(); } }