2026-05-08 18:09:13 +03:30
|
|
|
import { BadRequestException, Injectable } from '@nestjs/common'
|
2026-05-03 16:23:17 +03:30
|
|
|
import {
|
|
|
|
|
TspProviderBulkSendResultDto,
|
2026-05-05 22:42:09 +03:30
|
|
|
TspProviderCorrectionSendPayloadDto,
|
|
|
|
|
TspProviderCorrectionSendResponseDto,
|
2026-05-03 16:23:17 +03:30
|
|
|
TspProviderGetResultDto,
|
2026-05-05 22:42:09 +03:30
|
|
|
TspProviderOriginalSendPayloadDto,
|
2026-05-04 11:21:49 +03:30
|
|
|
TspProviderRevokePayloadDto,
|
|
|
|
|
TspProviderRevokeResponseDto,
|
2026-05-03 16:23:17 +03:30
|
|
|
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() || ''
|
|
|
|
|
|
2026-05-08 18:09:13 +03:30
|
|
|
let adapter: NamaProviderSwitchAdapter | null = null
|
2026-05-03 16:23:17 +03:30
|
|
|
switch (normalizedCode) {
|
|
|
|
|
case 'NAMA':
|
2026-05-08 18:09:13 +03:30
|
|
|
adapter = this.namaAdapter
|
2026-05-03 16:23:17 +03:30
|
|
|
}
|
2026-05-08 18:09:13 +03:30
|
|
|
|
|
|
|
|
if (!adapter) {
|
|
|
|
|
throw new BadRequestException(
|
|
|
|
|
`${providerCode} برای ارسال انتخاب شده است که در حال حاضر پشتیبانی نمی شود.`,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
return adapter
|
2026-05-03 16:23:17 +03:30
|
|
|
}
|
|
|
|
|
|
2026-05-05 22:42:09 +03:30
|
|
|
async send(
|
|
|
|
|
payload: TspProviderOriginalSendPayloadDto,
|
|
|
|
|
): Promise<TspProviderSendItemResultDto> {
|
2026-05-03 16:23:17 +03:30
|
|
|
const adapter = this.resolveSwitch(payload.tsp_provider)
|
2026-05-08 18:09:13 +03:30
|
|
|
|
2026-05-05 22:42:09 +03:30
|
|
|
return adapter.originalSend(payload)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async correction(
|
|
|
|
|
payload: TspProviderCorrectionSendPayloadDto,
|
|
|
|
|
): Promise<TspProviderCorrectionSendResponseDto> {
|
|
|
|
|
const adapter = this.resolveSwitch(payload.tsp_provider)
|
2026-05-08 18:09:13 +03:30
|
|
|
|
2026-05-05 22:42:09 +03:30
|
|
|
return adapter.correctionSend(payload)
|
2026-05-03 16:23:17 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async sendBulk(
|
2026-05-05 22:42:09 +03:30
|
|
|
payloads: TspProviderOriginalSendPayloadDto[],
|
2026-05-03 16:23:17 +03:30
|
|
|
): Promise<TspProviderBulkSendResultDto[]> {
|
2026-05-05 22:42:09 +03:30
|
|
|
const groupedByProvider = new Map<string, TspProviderOriginalSendPayloadDto[]>()
|
2026-05-03 16:23:17 +03:30
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
}
|
2026-05-03 16:23:17 +03:30
|
|
|
}
|