feat: add DTOs and services for tax switch integration

- Created SendBulkSaleInvoicesDto for handling bulk sale invoice requests.
- Implemented TaxSwitchSendPayloadDto and related DTOs for tax switch item payloads and results.
- Developed SalesInvoiceTaxSwitchService to manage tax switch operations, including sending and retrieving tax information.
- Added SalesInvoiceTaxService for handling sales invoice tax logic, including bulk sending and persistence of results.
- Introduced NamaTaxSwitchAdapter to interact with the tax switch service, simulating external API responses.
- Created SendBulkSalesInvoicesDto for POS module to handle bulk sales invoice requests.
This commit is contained in:
2026-04-27 22:11:05 +03:30
parent dee96b6e91
commit 58a7c359d8
68 changed files with 7896 additions and 3534 deletions
@@ -77,6 +77,8 @@ model BusinessActivity {
id String @id @default(ulid())
economic_code String
name String
fiscal_id String
partner_token String
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
@@ -87,9 +89,9 @@ model BusinessActivity {
consumer_id String
consumer Consumer @relation(fields: [consumer_id], references: [id])
license_activation LicenseActivation?
complexes Complex[]
permission_businesses PermissionBusiness[]
license_activation LicenseActivation?
goods Good[]
customer_individuals CustomerIndividual[]
customer_legals CustomerLegal[]
+68 -19
View File
@@ -1,10 +1,12 @@
model SalesInvoice {
id String @id @default(ulid())
code String @unique @db.VarChar(100)
total_amount Decimal @db.Decimal(15, 2)
notes String? @db.Text
unknown_customer Json? @db.Json
invoice_date DateTime? @default(now()) @db.Timestamp(0)
id String @id @default(uuid())
code String @unique @db.VarChar(100)
total_amount Decimal @db.Decimal(15, 2)
invoice_number Int @db.Int()
invoice_date DateTime @default(now()) @db.Timestamp(0)
notes String? @db.Text
unknown_customer Json? @db.Json
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
@@ -12,15 +14,18 @@ model SalesInvoice {
customer_id String?
customer Customer? @relation(fields: [customer_id], references: [id])
account_id String
consumer_account ConsumerAccount @relation(fields: [account_id], references: [id])
consumer_account_id String
consumer_account ConsumerAccount @relation(fields: [consumer_account_id], references: [id])
pos_id String
pos Pos @relation(fields: [pos_id], references: [id])
fiscal SaleInvoiceFiscals?
items SalesInvoiceItem[]
payments SalesInvoicePayment[]
@@unique([invoice_number, pos_id])
@@map("sales_invoices")
}
@@ -34,29 +39,73 @@ model SalesInvoiceItem {
discount Decimal @default(0.00) @db.Decimal(15, 2)
notes String? @db.Text
payload Json?
good_snapshot Json?
invoice_id String
good_id String?
invoice SalesInvoice @relation(fields: [invoice_id], references: [id])
good_id String?
good Good? @relation(fields: [good_id], references: [id])
service_id String?
payload Json?
invoice SalesInvoice @relation(fields: [invoice_id], references: [id])
good Good? @relation(fields: [good_id], references: [id])
service Service? @relation(fields: [service_id], references: [id])
service Service? @relation(fields: [service_id], references: [id])
@@index([invoice_id, good_id])
@@map("sales_invoice_items")
}
model SaleInvoiceFiscals {
id String @id @default(ulid())
retry_count Int @default(0)
last_attempt_at DateTime? @db.Timestamp(0)
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
invoice_id String @unique
invoice SalesInvoice @relation(fields: [invoice_id], references: [id], onDelete: Cascade)
attempts SaleInvoiceFiscalAttempts[]
@@map("sale_invoice_fiscals")
}
model SaleInvoiceFiscalAttempts {
id String @id @default(ulid())
attempt_no Int
status String @db.VarChar(50)
tax_id String? @unique @db.VarChar(191)
request_payload Json?
response_payload Json?
error_message String? @db.Text
sent_at DateTime? @db.Timestamp(0)
received_at DateTime? @db.Timestamp(0)
created_at DateTime @default(now()) @db.Timestamp(0)
fiscal_id String
fiscal SaleInvoiceFiscals @relation(fields: [fiscal_id], references: [id], onDelete: Cascade)
@@unique([fiscal_id, attempt_no])
@@index([status])
@@index([tax_id])
@@map("sale_invoice_fiscal_attempts")
}
model SalesInvoicePayment {
id String @id @default(ulid())
invoice_id String
amount Decimal @db.Decimal(15, 2)
payment_method PaymentMethodType
paid_at DateTime
created_at DateTime @default(now())
paid_at DateTime @db.Timestamp(0)
invoice SalesInvoice @relation(fields: [invoice_id], references: [id])
created_at DateTime @default(now()) @db.Timestamp(0)
invoice_id String
invoice SalesInvoice @relation(fields: [invoice_id], references: [id])
@@index([invoice_id])
@@map("sales_invoice_payments")