Files
psp_api/src/modules/tspProviders/sales-invoice-tsp-switch.service.ts
T

89 lines
2.7 KiB
TypeScript
Raw Normal View History

import { BadRequestException, Injectable } from '@nestjs/common'
import {
TspProviderBulkSendResultDto,
TspProviderCorrectionSendPayloadDto,
TspProviderCorrectionSendResponseDto,
TspProviderGetResultDto,
TspProviderOriginalSendPayloadDto,
2026-05-04 11:21:49 +03:30
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)
}
2026-05-04 11:21:49 +03:30
async revoke(
payload: TspProviderRevokePayloadDto,
): Promise<TspProviderRevokeResponseDto> {
const adapter = this.resolveSwitch(payload.tsp_provider)
return adapter.revoke(payload)
}
}