update migrations and create base migration. set discount and tax to sale invoices

This commit is contained in:
2026-05-28 18:27:21 +03:30
parent a975f9d02a
commit 7ae027633b
7 changed files with 114 additions and 45 deletions
+1 -1
View File
@@ -9,7 +9,7 @@
"editor.formatOnSave": true "editor.formatOnSave": true
}, },
"[typescript]": { "[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode" "editor.defaultFormatter": "vscode.typescript-language-features"
}, },
"editor.formatOnSave": true, "editor.formatOnSave": true,
"cSpell.words": [ "cSpell.words": [
+2 -2
View File
@@ -140,8 +140,8 @@ export default {
[TspProviderResponseStatus.SUCCESS]: 'موفق', [TspProviderResponseStatus.SUCCESS]: 'موفق',
[TspProviderResponseStatus.FAILURE]: 'ناموفق', [TspProviderResponseStatus.FAILURE]: 'ناموفق',
[TspProviderResponseStatus.NOT_SEND]: 'ارسال نشده', [TspProviderResponseStatus.NOT_SEND]: 'ارسال نشده',
[TspProviderResponseStatus.QUEUED]: 'در صف ارسال به معتمد', [TspProviderResponseStatus.QUEUED]: 'در صف ارسال',
[TspProviderResponseStatus.FISCAL_QUEUED]: 'در صف ارسال به مالیات', [TspProviderResponseStatus.FISCAL_QUEUED]: 'در انتظار تایید سازمان',
[TspProviderResponseStatus.SEND_FAILURE]: 'خطا در ارسال', [TspProviderResponseStatus.SEND_FAILURE]: 'خطا در ارسال',
}, },
TspProviderRequestType: { TspProviderRequestType: {
+22 -4
View File
@@ -13,7 +13,8 @@ import {
IsObject, IsObject,
IsOptional, IsOptional,
IsString, IsString,
ValidateNested, Min,
ValidateNested
} from 'class-validator' } from 'class-validator'
import { import {
CustomerInfoDto, CustomerInfoDto,
@@ -45,12 +46,18 @@ export class TspProviderOriginalItemPayloadDto {
@ApiProperty() @ApiProperty()
@IsNumber() @IsNumber()
@Min(0)
total_amount: number total_amount: number
@ApiProperty() @ApiProperty()
@IsOptional() @IsNumber()
@IsString() @Min(0)
discount: string discount_amount: number
@ApiProperty()
@IsNumber()
@Min(0)
tax_amount: number
@ApiProperty({ required: true }) @ApiProperty({ required: true })
@IsString() @IsString()
@@ -116,8 +123,19 @@ export class TspProviderOriginalSendPayloadDto {
@ApiProperty() @ApiProperty()
@IsNumber() @IsNumber()
@Min(0)
total_amount: number total_amount: number
@ApiProperty()
@IsNumber()
@Min(0)
discount_amount: number
@ApiProperty()
@IsNumber()
@Min(0)
tax_amount: number
@ApiProperty({ type: [TspProviderOriginalItemPayloadDto] }) @ApiProperty({ type: [TspProviderOriginalItemPayloadDto] })
@IsArray() @IsArray()
@ValidateNested({ each: true }) @ValidateNested({ each: true })
@@ -159,20 +159,30 @@ export class NamaProviderCommonBodyDto {
@ApiProperty({ @ApiProperty({
description: ' اجرت ساخت (طلا)', description: ' اجرت ساخت (طلا)',
}) })
@IsOptional()
@IsString() @IsString()
consfee: string consfee?: string
@ApiProperty({ @ApiProperty({
description: 'حق العمل', description: 'حق العمل',
}) })
@IsOptional()
@IsString() @IsString()
bros: string bros?: string
@ApiProperty({ @ApiProperty({
description: 'سود فروشنده', description: 'سود فروشنده',
}) })
@IsOptional()
@IsString() @IsString()
spro: string spro?: string
@ApiProperty({
description: 'مجموع سود، حق‌العمل و اجرت',
})
@IsOptional()
@IsString()
tcpbs?: string
} }
export class NamaProviderApiErrorItemDto { export class NamaProviderApiErrorItemDto {
@@ -110,6 +110,10 @@ export class NamaProviderSwitchAdapter implements IProviderSwitchAdapter {
return result return result
} catch (err) { } catch (err) {
console.log('err@@@@@@@@@@@@@@@@@@', err);
console.log(JSON.parse(JSON.stringify(mappedRequest)));
const failure: TspProviderOriginalResponseDto = { const failure: TspProviderOriginalResponseDto = {
invoice_id: payload.id, invoice_id: payload.id,
provider_request_payload: JSON.parse(JSON.stringify(mappedRequest)), provider_request_payload: JSON.parse(JSON.stringify(mappedRequest)),
@@ -12,10 +12,11 @@ import {
PaymentInfoDto, PaymentInfoDto,
TspProviderCorrectionSendPayloadDto, TspProviderCorrectionSendPayloadDto,
TspProviderOriginalSendPayloadDto, TspProviderOriginalSendPayloadDto,
TspProviderRevokePayloadDto, TspProviderRevokePayloadDto
} from '../../dto' } from '../../dto'
import { import {
NamaProviderCorrectionRequestDto, NamaProviderCorrectionRequestDto,
NamaProviderOriginalBodyItemDto,
NamaProviderOriginalRequestDto, NamaProviderOriginalRequestDto,
NamaProviderPaymentInfoDto, NamaProviderPaymentInfoDto,
NamaProviderResponseStatus, NamaProviderResponseStatus,
@@ -62,18 +63,35 @@ export class NamaProviderUtils {
), ),
...this.mapCustomerInfo(payload.customer), ...this.mapCustomerInfo(payload.customer),
}, },
body: payload.items.map(item => ({ body: payload.items.map(item => {
let data: NamaProviderOriginalBodyItemDto = {
sstid: item.sku, sstid: item.sku,
vra: item.sku_vat, vra: item.sku_vat,
// sstt: item.unit_type,
fee: String(item.unit_price), fee: String(item.unit_price),
dis: String(item.discount), dis: String(item.discount_amount),
mu: item.measure_unit, mu: item.measure_unit,
am: String(item.quantity), am: String(item.quantity),
consfee: '0', consfee: '0',
bros: '0', bros: '0',
spro: '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, vra: item.sku_vat,
// sstt: item.unit_type, // sstt: item.unit_type,
fee: String(item.unit_price), fee: String(item.unit_price),
dis: String(item.discount), dis: String(item.discount_amount),
mu: item.measure_unit, mu: item.measure_unit,
am: String(item.quantity), am: String(item.quantity),
consfee: '0', consfee: '0',
@@ -7,6 +7,7 @@ import {
TspProviderResponseStatus, TspProviderResponseStatus,
} from 'generated/prisma/client' } from 'generated/prisma/client'
import { import {
goldTypePayload,
TspProviderCorrectionSendPayloadDto, TspProviderCorrectionSendPayloadDto,
TspProviderGetResponseDto, TspProviderGetResponseDto,
TspProviderOriginalResponseDto, TspProviderOriginalResponseDto,
@@ -169,6 +170,8 @@ export async function buildCorrectionPayload(
invoice_number: true, invoice_number: true,
settlement_type: true, settlement_type: true,
tax_id: true, tax_id: true,
discount_amount: true,
tax_amount: true,
items: true, items: true,
pos: { pos: {
select: { select: {
@@ -251,7 +254,8 @@ export async function buildCorrectionPayload(
measure_unit: item.measure_unit_code, measure_unit: item.measure_unit_code,
sku: item.sku_code, sku: item.sku_code,
sku_vat: String(item.sku_vat), sku_vat: String(item.sku_vat),
discount: String((item.payload as Record<string, any>)?.discount || '0'), discount_amount: Number(item.discount_amount),
tax_amount: Number(item.tax_amount),
good_id: item.good_id, good_id: item.good_id,
service_id: item.service_id, service_id: item.service_id,
payload: item.payload, payload: item.payload,
@@ -267,6 +271,8 @@ export async function buildCorrectionPayload(
}, },
})), })),
total_amount: Number(invoice.total_amount), 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!, last_tax_id: invoice.reference_invoice!.tax_id!,
invoice_number: invoice.invoice_number, invoice_number: invoice.invoice_number,
id: invoice.id, id: invoice.id,
@@ -312,6 +318,8 @@ export async function buildOriginalPayload(
invoice_date: true, invoice_date: true,
invoice_number: true, invoice_number: true,
settlement_type: true, settlement_type: true,
discount_amount: true,
tax_amount: true,
items: { items: {
select: { select: {
id: true, id: true,
@@ -412,7 +420,7 @@ export async function buildOriginalPayload(
throw new NotFoundException('فاکتور مورد نظر یافت نشد.') 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 { business_activity: ba } = pos.complex
const unknown_customer = (invoice.unknown_customer || {}) as Record<string, string> const unknown_customer = (invoice.unknown_customer || {}) as Record<string, string>
@@ -425,6 +433,8 @@ export async function buildOriginalPayload(
invoice_date, invoice_date,
settlement_type, settlement_type,
total_amount: Number(total_amount), total_amount: Number(total_amount),
tax_amount: Number(tax_amount),
discount_amount: Number(discount_amount),
economic_code: ba.economic_code, economic_code: ba.economic_code,
fiscal_id: ba.fiscal_id, fiscal_id: ba.fiscal_id,
template: ba.guild.invoice_template, template: ba.guild.invoice_template,
@@ -459,14 +469,18 @@ export async function buildOriginalPayload(
quantity: Number(item.quantity), quantity: Number(item.quantity),
unit_price: Number(item.unit_price), unit_price: Number(item.unit_price),
total_amount: Number(item.total_amount), total_amount: Number(item.total_amount),
tax_amount: Number(tax_amount),
discount_amount: Number(discount_amount),
measure_unit: item.measure_unit_code, measure_unit: item.measure_unit_code,
sku: item.sku_code, sku: item.sku_code,
sku_vat: String(item.sku_vat), sku_vat: String(item.sku_vat),
discount: String((item.payload as Record<string, any>)?.discount || '0'), discount: String((item.payload as Record<string, any>)?.discount || '0'),
good_id: item.good_id, good_id: item.good_id,
service_id: item.service_id, service_id: item.service_id,
payload: item.payload,
good_snapshot: item.good_snapshot, 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, message: updatedAttempt.message,
} }
} }
function isGoldTypePayload(value: unknown): value is goldTypePayload {
return typeof value === 'object' && value !== null && !Array.isArray(value);
}