diff --git a/.vscode/settings.json b/.vscode/settings.json index 6b7731b..6d3c5ad 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ "editor.formatOnSave": true }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "vscode.typescript-language-features" }, "editor.formatOnSave": true, "cSpell.words": [ diff --git a/src/common/constants/translates/enums.ts b/src/common/constants/translates/enums.ts index b69dab5..38e3b08 100644 --- a/src/common/constants/translates/enums.ts +++ b/src/common/constants/translates/enums.ts @@ -140,8 +140,8 @@ export default { [TspProviderResponseStatus.SUCCESS]: 'موفق', [TspProviderResponseStatus.FAILURE]: 'ناموفق', [TspProviderResponseStatus.NOT_SEND]: 'ارسال نشده', - [TspProviderResponseStatus.QUEUED]: 'در صف ارسال به معتمد', - [TspProviderResponseStatus.FISCAL_QUEUED]: 'در صف ارسال به مالیات', + [TspProviderResponseStatus.QUEUED]: 'در صف ارسال', + [TspProviderResponseStatus.FISCAL_QUEUED]: 'در انتظار تایید سازمان', [TspProviderResponseStatus.SEND_FAILURE]: 'خطا در ارسال', }, TspProviderRequestType: { diff --git a/src/modules/tspProviders/dto/original.dto.ts b/src/modules/tspProviders/dto/original.dto.ts index 2a07967..0aa015a 100644 --- a/src/modules/tspProviders/dto/original.dto.ts +++ b/src/modules/tspProviders/dto/original.dto.ts @@ -13,7 +13,8 @@ import { IsObject, IsOptional, IsString, - ValidateNested, + Min, + ValidateNested } from 'class-validator' import { CustomerInfoDto, @@ -45,12 +46,18 @@ export class TspProviderOriginalItemPayloadDto { @ApiProperty() @IsNumber() + @Min(0) total_amount: number @ApiProperty() - @IsOptional() - @IsString() - discount: string + @IsNumber() + @Min(0) + discount_amount: number + + @ApiProperty() + @IsNumber() + @Min(0) + tax_amount: number @ApiProperty({ required: true }) @IsString() @@ -116,8 +123,19 @@ export class TspProviderOriginalSendPayloadDto { @ApiProperty() @IsNumber() + @Min(0) total_amount: number + @ApiProperty() + @IsNumber() + @Min(0) + discount_amount: number + + @ApiProperty() + @IsNumber() + @Min(0) + tax_amount: number + @ApiProperty({ type: [TspProviderOriginalItemPayloadDto] }) @IsArray() @ValidateNested({ each: true }) diff --git a/src/modules/tspProviders/switch/nama/dto/common.dto.ts b/src/modules/tspProviders/switch/nama/dto/common.dto.ts index 84ce727..a43f1ae 100644 --- a/src/modules/tspProviders/switch/nama/dto/common.dto.ts +++ b/src/modules/tspProviders/switch/nama/dto/common.dto.ts @@ -159,20 +159,30 @@ export class NamaProviderCommonBodyDto { @ApiProperty({ description: ' اجرت ساخت (طلا)', }) + @IsOptional() @IsString() - consfee: string + consfee?: string @ApiProperty({ description: 'حق العمل', }) + @IsOptional() @IsString() - bros: string + bros?: string @ApiProperty({ description: 'سود فروشنده', }) + @IsOptional() @IsString() - spro: string + spro?: string + + @ApiProperty({ + description: 'مجموع سود، حق‌العمل و اجرت', + }) + @IsOptional() + @IsString() + tcpbs?: string } export class NamaProviderApiErrorItemDto { diff --git a/src/modules/tspProviders/switch/nama/nama-provider.adapter.ts b/src/modules/tspProviders/switch/nama/nama-provider.adapter.ts index 1991f06..b81cb28 100644 --- a/src/modules/tspProviders/switch/nama/nama-provider.adapter.ts +++ b/src/modules/tspProviders/switch/nama/nama-provider.adapter.ts @@ -110,6 +110,10 @@ export class NamaProviderSwitchAdapter implements IProviderSwitchAdapter { return result } catch (err) { + console.log('err@@@@@@@@@@@@@@@@@@', err); + console.log(JSON.parse(JSON.stringify(mappedRequest))); + + const failure: TspProviderOriginalResponseDto = { invoice_id: payload.id, provider_request_payload: JSON.parse(JSON.stringify(mappedRequest)), diff --git a/src/modules/tspProviders/switch/nama/nama-provider.util.ts b/src/modules/tspProviders/switch/nama/nama-provider.util.ts index 7a124ea..32f4efb 100644 --- a/src/modules/tspProviders/switch/nama/nama-provider.util.ts +++ b/src/modules/tspProviders/switch/nama/nama-provider.util.ts @@ -12,10 +12,11 @@ import { PaymentInfoDto, TspProviderCorrectionSendPayloadDto, TspProviderOriginalSendPayloadDto, - TspProviderRevokePayloadDto, + TspProviderRevokePayloadDto } from '../../dto' import { NamaProviderCorrectionRequestDto, + NamaProviderOriginalBodyItemDto, NamaProviderOriginalRequestDto, NamaProviderPaymentInfoDto, NamaProviderResponseStatus, @@ -62,18 +63,35 @@ export class NamaProviderUtils { ), ...this.mapCustomerInfo(payload.customer), }, - body: payload.items.map(item => ({ - sstid: item.sku, - vra: item.sku_vat, - // sstt: item.unit_type, - fee: String(item.unit_price), - dis: String(item.discount), - mu: item.measure_unit, - am: String(item.quantity), - consfee: '0', - bros: '0', - spro: '0', - })), + body: payload.items.map(item => { + let data: NamaProviderOriginalBodyItemDto = { + sstid: item.sku, + vra: item.sku_vat, + fee: String(item.unit_price), + dis: String(item.discount_amount), + mu: item.measure_unit, + am: String(item.quantity), + consfee: '0', + bros: '0', + spro: '0', + } + + console.log('item.gold_type_payload', item.gold_type_payload); + + + if (item.gold_type_payload) { + const { profit='0', commission = '0', wages = "0" } = item.gold_type_payload + data = { + ...data, + consfee: wages, + bros: commission, + spro: profit, + tcpbs: (Number(profit) + Number(commission) + Number(wages)).toString(), + } + } + + return data + }), } } @@ -100,7 +118,7 @@ export class NamaProviderUtils { vra: item.sku_vat, // sstt: item.unit_type, fee: String(item.unit_price), - dis: String(item.discount), + dis: String(item.discount_amount), mu: item.measure_unit, am: String(item.quantity), consfee: '0', diff --git a/src/modules/tspProviders/utils/sales-invoice-tsp.utils.ts b/src/modules/tspProviders/utils/sales-invoice-tsp.utils.ts index 500a092..2f6d5f5 100644 --- a/src/modules/tspProviders/utils/sales-invoice-tsp.utils.ts +++ b/src/modules/tspProviders/utils/sales-invoice-tsp.utils.ts @@ -7,6 +7,7 @@ import { TspProviderResponseStatus, } from 'generated/prisma/client' import { + goldTypePayload, TspProviderCorrectionSendPayloadDto, TspProviderGetResponseDto, TspProviderOriginalResponseDto, @@ -169,6 +170,8 @@ export async function buildCorrectionPayload( invoice_number: true, settlement_type: true, tax_id: true, + discount_amount: true, + tax_amount: true, items: true, pos: { select: { @@ -251,7 +254,8 @@ export async function buildCorrectionPayload( measure_unit: item.measure_unit_code, sku: item.sku_code, sku_vat: String(item.sku_vat), - discount: String((item.payload as Record)?.discount || '0'), + discount_amount: Number(item.discount_amount), + tax_amount: Number(item.tax_amount), good_id: item.good_id, service_id: item.service_id, payload: item.payload, @@ -267,6 +271,8 @@ export async function buildCorrectionPayload( }, })), total_amount: Number(invoice.total_amount), + discount_amount: Number(invoice.discount_amount), + tax_amount: Number(invoice.tax_amount), last_tax_id: invoice.reference_invoice!.tax_id!, invoice_number: invoice.invoice_number, id: invoice.id, @@ -281,17 +287,17 @@ export async function buildCorrectionPayload( customer: invoice.customer && invoice.customer.type !== 'UNKNOWN' ? { - type: invoice.customer.type, - legal_info: invoice.customer.legal ?? undefined, - individual_info: invoice.customer.individual ?? undefined, - } + type: invoice.customer.type, + legal_info: invoice.customer.legal ?? undefined, + individual_info: invoice.customer.individual ?? undefined, + } : { - type: 'UNKNOWN', - unknown_info: { - name: unknown_customer?.name || '', - economic_code: unknown_customer?.economic_code || '', - }, + type: 'UNKNOWN', + unknown_info: { + name: unknown_customer?.name || '', + economic_code: unknown_customer?.economic_code || '', }, + }, } } @@ -312,6 +318,8 @@ export async function buildOriginalPayload( invoice_date: true, invoice_number: true, settlement_type: true, + discount_amount: true, + tax_amount: true, items: { select: { id: true, @@ -412,7 +420,7 @@ export async function buildOriginalPayload( throw new NotFoundException('فاکتور مورد نظر یافت نشد.') } - const { pos, id, invoice_number, invoice_date, total_amount, settlement_type } = invoice + const { pos, id, invoice_number, invoice_date, total_amount, discount_amount, tax_amount, settlement_type } = invoice const { business_activity: ba } = pos.complex const unknown_customer = (invoice.unknown_customer || {}) as Record @@ -425,6 +433,8 @@ export async function buildOriginalPayload( invoice_date, settlement_type, total_amount: Number(total_amount), + tax_amount: Number(tax_amount), + discount_amount: Number(discount_amount), economic_code: ba.economic_code, fiscal_id: ba.fiscal_id, template: ba.guild.invoice_template, @@ -443,30 +453,34 @@ export async function buildOriginalPayload( customer: invoice.customer && invoice.customer.type !== 'UNKNOWN' ? { - type: invoice.customer.type, - legal_info: invoice.customer.legal ?? undefined, - individual_info: invoice.customer.individual ?? undefined, - } + type: invoice.customer.type, + legal_info: invoice.customer.legal ?? undefined, + individual_info: invoice.customer.individual ?? undefined, + } : { - type: 'UNKNOWN', - unknown_info: { - name: unknown_customer?.name || '', - economic_code: unknown_customer?.economic_code || '', - }, + type: 'UNKNOWN', + unknown_info: { + name: unknown_customer?.name || '', + economic_code: unknown_customer?.economic_code || '', }, + }, items: invoice.items.map(item => ({ invoice_item_id: item.id, quantity: Number(item.quantity), unit_price: Number(item.unit_price), total_amount: Number(item.total_amount), + tax_amount: Number(tax_amount), + discount_amount: Number(discount_amount), measure_unit: item.measure_unit_code, sku: item.sku_code, sku_vat: String(item.sku_vat), discount: String((item.payload as Record)?.discount || '0'), good_id: item.good_id, service_id: item.service_id, - payload: item.payload, good_snapshot: item.good_snapshot, + gold_type_payload: isGoldTypePayload(item.payload) + ? item.payload + : undefined })), } } @@ -547,3 +561,8 @@ export async function onResult( message: updatedAttempt.message, } } + + +function isGoldTypePayload(value: unknown): value is goldTypePayload { + return typeof value === 'object' && value !== null && !Array.isArray(value); +}