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
+2 -2
View File
@@ -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: {
+22 -4
View File
@@ -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 })
@@ -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 {
@@ -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)),
@@ -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',
@@ -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<string, any>)?.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<string, string>
@@ -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<string, any>)?.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);
}