using ComplianceDAL.DTO.GSTEInvoice; using ComplianceDAL.Query.GSTEInvoice; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using Microsoft.Extensions.Logging; namespace ComplianceDAL.CustomCode.GSTEInvoice; public class GSTEInvoiceDAL : IGSTEInvoiceDAL { private readonly IQueryExecutor _qe; private readonly ILogger _logger; public GSTEInvoiceDAL(IQueryExecutor qe, ILogger logger) { _qe = qe; _logger = logger; } public async Task GetEInvoiceAsync(int eInvoiceId, LoginDTO login, CancellationToken ct) { try { return await _qe.QuerySingleAsync(login, GSTEInvoiceQB.GET_EINVOICE, new { EInvoiceId = eInvoiceId, login.ClientId, login.DatabaseName }).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: GetEInvoiceAsync failed for EInvoiceId {EInvoiceId}", eInvoiceId); throw; } } public async Task GetEInvoiceByDocumentAsync(int documentId, string documentType, LoginDTO login, CancellationToken ct) { try { return await _qe.QuerySingleAsync(login, GSTEInvoiceQB.GET_EINVOICE_BY_DOCUMENT, new { DocumentId = documentId, DocumentType = documentType, login.ClientId, login.DatabaseName }).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: GetEInvoiceByDocumentAsync failed for DocumentId {DocumentId}", documentId); throw; } } public async Task SaveEInvoiceAsync(GSTEInvoiceDTO dto, LoginDTO login, CancellationToken ct) { try { return await _qe.ExecuteIdentityAsync(login, GSTEInvoiceQB.SAVE_EINVOICE, new { dto.ArtifactId, dto.DocumentId, dto.DocumentType, dto.DocumentNumber, dto.DocumentDate, dto.GSTIN, dto.IRN, dto.SignedQRCode, dto.SignedEInvoice, dto.AcknowledgementNumber, dto.AcknowledgementDate, dto.SubmissionMode, dto.BatchId, login.ClientId, login.DatabaseName, CreatedById = login.UserId }).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: SaveEInvoiceAsync failed for DocumentId {DocumentId}, ArtifactId {ArtifactId}", dto.DocumentId, dto.ArtifactId); throw; } } public async Task CancelEInvoiceAsync(int eInvoiceId, string cancellationReason, LoginDTO login, CancellationToken ct) { try { return await _qe.ExecuteAsync(login, GSTEInvoiceQB.CANCEL_EINVOICE, new { EInvoiceId = eInvoiceId, CancellationReason = cancellationReason, ModifiedById = login.UserId, login.ClientId, login.DatabaseName }, cancellationToken: ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: CancelEInvoiceAsync failed for EInvoiceId {EInvoiceId}", eInvoiceId); throw; } } public async Task> GetCoverageListAsync(string gstin, string returnPeriod, LoginDTO login, CancellationToken ct) { try { return await _qe.QueryAsync(login, GSTEInvoiceQB.GET_EINVOICE_COVERAGE_LIST, new { GSTIN = gstin, ReturnPeriod = returnPeriod, login.ClientId, login.DatabaseName }, cancellationToken: ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: GetCoverageListAsync failed for GSTIN {GSTIN}, ReturnPeriod {ReturnPeriod}", gstin, returnPeriod); throw; } } public async Task UpdateTMMHeadByDocumentIdAsync(int documentId, string irn, string signedQRCode, string acknowledgementNumber, DateTime? acknowledgementDate, LoginDTO login, CancellationToken ct) { try { await _qe.ExecuteAsync(login, GSTEInvoiceQB.UPDATE_TMMHEAD_BY_DOCUMENTID, new { DocumentId = documentId, IRN = irn, SignedQRCode = signedQRCode, AcknowledgementNumber = acknowledgementNumber, AcknowledgementDate = acknowledgementDate }, cancellationToken: ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: UpdateTMMHeadByDocumentIdAsync failed for DocumentId {DocumentId}", documentId); throw; } } public async Task ClearTMMHeadIRNAsync(string irn, LoginDTO login, CancellationToken ct) { try { await _qe.ExecuteAsync(login, GSTEInvoiceQB.CLEAR_TMMHEAD_IRN_BY_IRN, new { IRN = irn }, cancellationToken: ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: ClearTMMHeadIRNAsync failed for IRN {IRN}", irn); throw; } } public async Task GetEInvoiceGstinBasedOnOuAsync(string irn, LoginDTO login, CancellationToken ct) { try { return await _qe.ExecuteScalarAsync(login, GSTEInvoiceQB.GET_IRN_GSTIN_BASED_ON_OU, new { IRN = irn }, cancellationToken: ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: GetEInvoiceGstinBasedOnOuAsync failed for IRN {IRN}", irn); throw; } } public async Task GetEInvoiceGstinBasedOnStoreAsync(string irn, LoginDTO login, CancellationToken ct) { try { return await _qe.ExecuteScalarAsync(login, GSTEInvoiceQB.GET_IRN_GSTIN_BASED_ON_STORE, new { IRN = irn }, cancellationToken: ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "E-Invoice DAL: GetEInvoiceGstinBasedOnStoreAsync failed for IRN {IRN}", irn); throw; } } }