Files
psp_api/src/modules/tspProviders/sales-invoice-tsp-switch.service.ts
T
ahasani 4e61ff618e refactor: remove SalesInvoiceItemsService and update sales invoice handling
- Deleted SalesInvoiceItemsService as it was not implemented.
- Changed variable declaration from `const` to `let` in SalesInvoicesService for sales invoice creation.
- Updated response handling after sending to TSP provider in SalesInvoicesService.
- Renamed payload properties in TspProvider DTOs for clarity.
- Enhanced error handling in SalesInvoiceTspSwitchService for unsupported providers.
- Refactored SalesInvoiceTspService to utilize utility functions for payload building and sending.
- Updated PrismaService to increase connection limit and utilize dynamic options.
- Added new migration scripts to update database schema for sale_invoice_tsp_attempts.
- Introduced utility functions for building payloads and handling responses in sales invoice processing.
2026-05-08 18:09:13 +03:30

89 lines
2.7 KiB
TypeScript

import { BadRequestException, Injectable } from '@nestjs/common'
import {
TspProviderBulkSendResultDto,
TspProviderCorrectionSendPayloadDto,
TspProviderCorrectionSendResponseDto,
TspProviderGetResultDto,
TspProviderOriginalSendPayloadDto,
TspProviderRevokePayloadDto,
TspProviderRevokeResponseDto,
TspProviderSendItemResultDto,
} from './dto/provider-switch.dto'
import { NamaProviderSwitchAdapter } from './switch/nama/nama-provider.adapter'
@Injectable()
export class SalesInvoiceTspSwitchService {
constructor(private readonly namaAdapter: NamaProviderSwitchAdapter) {}
private resolveSwitch(providerCode: string) {
const normalizedCode = providerCode.trim().toUpperCase() || ''
let adapter: NamaProviderSwitchAdapter | null = null
switch (normalizedCode) {
case 'NAMA':
adapter = this.namaAdapter
}
if (!adapter) {
throw new BadRequestException(
`${providerCode} برای ارسال انتخاب شده است که در حال حاضر پشتیبانی نمی شود.`,
)
}
return adapter
}
async send(
payload: TspProviderOriginalSendPayloadDto,
): Promise<TspProviderSendItemResultDto> {
const adapter = this.resolveSwitch(payload.tsp_provider)
return adapter.originalSend(payload)
}
async correction(
payload: TspProviderCorrectionSendPayloadDto,
): Promise<TspProviderCorrectionSendResponseDto> {
const adapter = this.resolveSwitch(payload.tsp_provider)
return adapter.correctionSend(payload)
}
async sendBulk(
payloads: TspProviderOriginalSendPayloadDto[],
): Promise<TspProviderBulkSendResultDto[]> {
const groupedByProvider = new Map<string, TspProviderOriginalSendPayloadDto[]>()
for (const payload of payloads) {
const key = payload.tsp_provider?.trim().toUpperCase() || 'NAMA'
const currentGroup = groupedByProvider.get(key) || []
currentGroup.push(payload)
groupedByProvider.set(key, currentGroup)
}
const result: TspProviderBulkSendResultDto[] = []
for (const [providerCode, groupedPayloads] of groupedByProvider.entries()) {
const adapter = this.resolveSwitch(providerCode)
const providerResult = await adapter.sendBulk(groupedPayloads)
result.push(...providerResult)
}
return result
}
async get(
providerCode: string,
invoiceId: string,
tspToken: string,
): Promise<TspProviderGetResultDto> {
const adapter = this.resolveSwitch(providerCode)
return await adapter.get(invoiceId, tspToken)
}
async revoke(
payload: TspProviderRevokePayloadDto,
): Promise<TspProviderRevokeResponseDto> {
const adapter = this.resolveSwitch(payload.tsp_provider)
return adapter.revoke(payload)
}
}