From edfc73bcf0b8e0f7f1e35429fbb5696e0e56d0ba Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Mon, 28 Apr 2025 12:17:21 +0300 Subject: [PATCH 1/5] PM-1142 - reset tax forms --- .../migration.sql | 31 +++++++++++++ prisma/schema.prisma | 45 +++---------------- src/api/admin-winning/adminWinning.service.ts | 32 ++++++------- src/api/repository/taxForm.repo.ts | 36 +++------------ src/api/winning/winning.service.ts | 24 ++-------- src/dto/adminWinning.dto.ts | 10 ++--- src/dto/taxForm.dto.ts | 10 ++--- 7 files changed, 72 insertions(+), 116 deletions(-) create mode 100644 prisma/migrations/20250425134520_truncate_tax_forms/migration.sql diff --git a/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql b/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql new file mode 100644 index 0000000..c97addb --- /dev/null +++ b/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql @@ -0,0 +1,31 @@ +-- DropForeignKey +ALTER TABLE "docusign_envelopes" DROP CONSTRAINT "docusign_envelopes_user_tax_form_association_id_fkey"; + +-- DropForeignKey +ALTER TABLE "user_tax_form_associations" DROP CONSTRAINT "user_tax_form_associations_tax_form_id_fkey"; + +-- AlterTable +DROP TABLE "user_tax_form_associations"; +DROP TYPE "tax_form_status"; + +CREATE TYPE "tax_form_status" AS ENUM ('incomplete', 'submitted', 'reviewed', 'voided'); + +-- CreateTable +CREATE TABLE "user_tax_form_associations" ( + "id" UUID NOT NULL DEFAULT uuid_generate_v4(), + "user_id" VARCHAR(80) NOT NULL, + "tax_form_id" TEXT, + "date_filed" TIMESTAMP(6), + "tax_form_status" "tax_form_status", + + CONSTRAINT "user_tax_form_associations_pkey" PRIMARY KEY ("id") +); + +-- DropTable +DROP TABLE "docusign_envelopes"; + +-- DropTable +DROP TABLE "tax_forms"; + +-- DropEnum +DROP TYPE "docusign_envelope_status"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 93f41a8..2ac15ad 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -19,15 +19,6 @@ model audit { winnings winnings @relation(fields: [winnings_id], references: [winning_id], onDelete: NoAction, onUpdate: NoAction) } -model docusign_envelopes { - id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid - user_tax_form_association_id String @db.Uuid - envelope_id String @db.VarChar(80) - template_id String @db.VarChar(80) - status_id docusign_envelope_status? - user_tax_form_associations user_tax_form_associations @relation(fields: [user_tax_form_association_id], references: [id], onDelete: NoAction, onUpdate: NoAction) -} - model origin { origin_id Int @id @default(autoincrement()) origin_name String @db.VarChar(255) @@ -137,18 +128,6 @@ model reward { winnings winnings @relation(fields: [winnings_id], references: [winning_id], onDelete: NoAction, onUpdate: NoAction) } -model tax_forms { - tax_form_id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid - name String? @db.VarChar(30) - text String? - description String? @db.VarChar(255) - default_withholding_amount Decimal? @db.Decimal(12, 2) - default_withholding_percentage Decimal? @db.Decimal(5, 5) - use_percentage Boolean? - e_sign_template_id String @db.VarChar(80) - user_tax_form_associations user_tax_form_associations[] -} - model transaction { id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid user_id String @db.VarChar(255) @@ -181,14 +160,9 @@ model user_payment_methods { model user_tax_form_associations { id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid user_id String @db.VarChar(80) - tax_form_id String @db.Uuid + tax_form_id String? date_filed DateTime? @db.Timestamp(6) - withholding_amount Decimal? @db.Decimal - withholding_percentage Decimal? @db.Decimal(5, 5) - status_id tax_form_status? - use_percentage Boolean? - docusign_envelopes docusign_envelopes[] - tax_forms tax_forms @relation(fields: [tax_form_id], references: [tax_form_id], onDelete: NoAction, onUpdate: NoAction) + tax_form_status tax_form_status? } model winnings { @@ -248,13 +222,6 @@ enum action_type { REMOVE_TAX_FORMS } -enum docusign_envelope_status { - CREATED - OTP_VERIFIED - COMPLETED - DECLINED -} - enum payment_method_status { OTP_PENDING OTP_VERIFIED @@ -282,10 +249,10 @@ enum reference_type { } enum tax_form_status { - OTP_PENDING - OTP_VERIFIED - ACTIVE - INACTIVE + incomplete + submitted + reviewed + voided } enum transaction_status { diff --git a/src/api/admin-winning/adminWinning.service.ts b/src/api/admin-winning/adminWinning.service.ts index db5b26c..b848bc9 100644 --- a/src/api/admin-winning/adminWinning.service.ts +++ b/src/api/admin-winning/adminWinning.service.ts @@ -17,6 +17,7 @@ import { WinningUpdateRequestDto, PaymentStatus, AuditPayoutDto, + WinningsCategory, } from 'src/dto/adminWinning.dto'; import { TaxFormRepository } from '../repository/taxForm.repo'; import { PaymentMethodRepository } from '../repository/paymentMethod.repo'; @@ -94,30 +95,29 @@ export class AdminWinningService { type: item.type, winnerId: item.winner_id, origin: item.origin?.origin_name, - category: item.category, - title: item.title, - description: item.description, - externalId: item.external_id, - attributes: item.attributes, + category: (item.category ?? '') as WinningsCategory, + title: item.title as string, + description: item.description as string, + externalId: item.external_id as string, + attributes: (item.attributes ?? {}) as object, details: item.payment?.map((paymentItem) => ({ id: paymentItem.payment_id, netAmount: Number(paymentItem.net_amount), grossAmount: Number(paymentItem.gross_amount), totalAmount: Number(paymentItem.total_amount), - installmentNumber: paymentItem.installment_number, - datePaid: paymentItem.date_paid ?? undefined, - status: paymentItem.payment_status, - currency: paymentItem.currency, - releaseDate: paymentItem.release_date, - category: item.category, + installmentNumber: paymentItem.installment_number as number, + datePaid: (paymentItem.date_paid ?? undefined) as Date, + status: paymentItem.payment_status as PaymentStatus, + currency: paymentItem.currency as string, + releaseDate: paymentItem.release_date as Date, + category: item.category as string, billingAccount: paymentItem.billing_account, })), - createdAt: item.created_at, - updatedAt: - item.payment?.[0].date_paid ?? + createdAt: item.created_at as Date, + updatedAt: (item.payment?.[0].date_paid ?? item.payment?.[0].updated_at ?? - undefined, - releaseDate: item.payment?.[0]?.release_date, + undefined) as Date, + releaseDate: item.payment?.[0]?.release_date as Date, })), pagination: { totalItems: count, diff --git a/src/api/repository/taxForm.repo.ts b/src/api/repository/taxForm.repo.ts index 92d17a1..68996f2 100644 --- a/src/api/repository/taxForm.repo.ts +++ b/src/api/repository/taxForm.repo.ts @@ -1,6 +1,5 @@ import { Injectable } from '@nestjs/common'; import { TaxFormStatus } from 'src/dto/adminWinning.dto'; -import { TaxFormQueryResult } from 'src/dto/taxForm.dto'; import { PrismaService } from 'src/shared/global/prisma.service'; @Injectable() @@ -14,34 +13,13 @@ export class TaxFormRepository { * @returns true if user has active tax form */ async hasActiveTaxForm(userId: string): Promise { - const ret = await this.findTaxFormByUserId(userId); - for (const r of ret) { - if (r.status_id === TaxFormStatus.Active.toString()) { - return true; - } - } - return false; - } - - /** - * Find tax forms by user id - * - * @param userId user id - * @param tx transaction - * @returns tax forms - */ - async findTaxFormByUserId( - userId: string, - tx?, - ): Promise { - const db = tx || this.prisma; + const count = await this.prisma.user_tax_form_associations.count({ + where: { + user_id: userId, + tax_form_status: TaxFormStatus.Reviewed, + }, + }); - const ret = await db.$queryRaw` - SELECT u.id, u.user_id, t.tax_form_id, t.name, t.text, t.description, u.date_filed, u.withholding_amount, u.withholding_percentage, u.status_id::text, u.use_percentage - FROM user_tax_form_associations AS u - JOIN tax_forms AS t ON u.tax_form_id = t.tax_form_id - WHERE u.user_id=${userId} - `; - return (ret || []) as TaxFormQueryResult[]; + return count > 0; } } diff --git a/src/api/winning/winning.service.ts b/src/api/winning/winning.service.ts index 5b2951e..0d2980d 100644 --- a/src/api/winning/winning.service.ts +++ b/src/api/winning/winning.service.ts @@ -67,10 +67,7 @@ export class WinningService { create: [] as Partial[], }, }; - const taxForms = await this.taxFormRepo.findTaxFormByUserId( - body.winnerId, - tx, - ); + const payrollPayment = (body.attributes || {})['payroll'] === true; const hasPaymentMethod = @@ -90,22 +87,9 @@ export class WinningService { created_by: userId, billing_account: detail.billingAccount, }; - if (taxForms.length > 0) { - let netAmount = detail.grossAmount; - for (const taxForm of taxForms) { - const withholding = taxForm.withholding_amount; - netAmount -= withholding; - if (netAmount <= 0) { - netAmount = 0; - break; - } - } - paymentModel.net_amount = Prisma.Decimal(netAmount); - paymentModel.payment_status = PaymentStatus.OWED; - } else { - paymentModel.net_amount = Prisma.Decimal(detail.grossAmount); - paymentModel.payment_status = PaymentStatus.ON_HOLD; - } + + paymentModel.net_amount = Prisma.Decimal(detail.grossAmount); + paymentModel.payment_status = PaymentStatus.ON_HOLD; if (!hasPaymentMethod) { paymentModel.payment_status = PaymentStatus.ON_HOLD; diff --git a/src/dto/adminWinning.dto.ts b/src/dto/adminWinning.dto.ts index 90dda3b..bd40855 100644 --- a/src/dto/adminWinning.dto.ts +++ b/src/dto/adminWinning.dto.ts @@ -93,10 +93,10 @@ export enum WinningsCategory { } export enum TaxFormStatus { - Active = 'ACTIVE', - Inactive = 'INACTIVE', - Verified = 'OTP_VERIFIED', - OtpPending = 'OTP_PENDING', + Incomplete = 'incomplete', + Submitted = 'submitted', + Reviewed = 'reviewed', + Voided = 'voided', } export enum PaymentStatus { @@ -528,7 +528,7 @@ export class AuditPayoutDto { status: string; totalNetAmount: number; createdAt: Date; - metadata: object; + metadata: string; paymentMethodUsed: string; externalTransactionDetails: object; } diff --git a/src/dto/taxForm.dto.ts b/src/dto/taxForm.dto.ts index 703439b..38738ce 100644 --- a/src/dto/taxForm.dto.ts +++ b/src/dto/taxForm.dto.ts @@ -1,13 +1,9 @@ +import { TaxFormStatus } from './adminWinning.dto'; + export class TaxFormQueryResult { id: string; user_id: string; tax_form_id: string; - name: string; - text: string; - description: string; date_filed: Date; - withholding_amount: number; - withholding_percentage: number; - status_id: string; - use_percentage: number; + tax_form_status: TaxFormStatus; } From b4a1e27ec1f64abd964868e734e6eb64009e5538 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Tue, 29 Apr 2025 12:55:51 +0300 Subject: [PATCH 2/5] PM-1142 - make fields mandatory --- .../20250425134520_truncate_tax_forms/migration.sql | 4 ++-- src/shared/global/prisma.service.ts | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql b/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql index c97addb..b795b8c 100644 --- a/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql +++ b/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql @@ -14,8 +14,8 @@ CREATE TYPE "tax_form_status" AS ENUM ('incomplete', 'submitted', 'reviewed', 'v CREATE TABLE "user_tax_form_associations" ( "id" UUID NOT NULL DEFAULT uuid_generate_v4(), "user_id" VARCHAR(80) NOT NULL, - "tax_form_id" TEXT, - "date_filed" TIMESTAMP(6), + "tax_form_id" TEXT NOT NULL, + "date_filed" TIMESTAMP(6) NOT NULL, "tax_form_status" "tax_form_status", CONSTRAINT "user_tax_form_associations_pkey" PRIMARY KEY ("id") diff --git a/src/shared/global/prisma.service.ts b/src/shared/global/prisma.service.ts index ae6347c..0719eb3 100644 --- a/src/shared/global/prisma.service.ts +++ b/src/shared/global/prisma.service.ts @@ -18,6 +18,10 @@ export class PrismaService { level: 'error', emit: 'event' }, ], }); + + // this.$on("query", async (e) => { + // console.log(`${e.query} ${e.params}`) + // }); } async onModuleInit() { From 799a7cfeb9e06ce0e6ac558c643cd3e8dc32ca5d Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Tue, 29 Apr 2025 12:58:45 +0300 Subject: [PATCH 3/5] PM-1142 fix wrong commit --- prisma/schema.prisma | 6 +++--- src/shared/global/prisma.service.ts | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2ac15ad..58c09bc 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -160,9 +160,9 @@ model user_payment_methods { model user_tax_form_associations { id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid user_id String @db.VarChar(80) - tax_form_id String? - date_filed DateTime? @db.Timestamp(6) - tax_form_status tax_form_status? + tax_form_id String + date_filed DateTime @db.Timestamp(6) + tax_form_status tax_form_status } model winnings { diff --git a/src/shared/global/prisma.service.ts b/src/shared/global/prisma.service.ts index 0719eb3..ae6347c 100644 --- a/src/shared/global/prisma.service.ts +++ b/src/shared/global/prisma.service.ts @@ -18,10 +18,6 @@ export class PrismaService { level: 'error', emit: 'event' }, ], }); - - // this.$on("query", async (e) => { - // console.log(`${e.query} ${e.params}`) - // }); } async onModuleInit() { From c96568be61ccc7cc3a2dccfffc301cb2042a88b5 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Tue, 29 Apr 2025 13:02:07 +0300 Subject: [PATCH 4/5] remove redundant code --- src/api/winning/winning.service.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/api/winning/winning.service.ts b/src/api/winning/winning.service.ts index 0d2980d..1bd1e54 100644 --- a/src/api/winning/winning.service.ts +++ b/src/api/winning/winning.service.ts @@ -91,9 +91,6 @@ export class WinningService { paymentModel.net_amount = Prisma.Decimal(detail.grossAmount); paymentModel.payment_status = PaymentStatus.ON_HOLD; - if (!hasPaymentMethod) { - paymentModel.payment_status = PaymentStatus.ON_HOLD; - } if (payrollPayment) { paymentModel.payment_status = PaymentStatus.PAID; } From e1551a461811e1243d354facaad9e4ea8e6dfac8 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Tue, 29 Apr 2025 13:05:41 +0300 Subject: [PATCH 5/5] update migration --- .../migrations/20250425134520_truncate_tax_forms/migration.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql b/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql index b795b8c..f6c1962 100644 --- a/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql +++ b/prisma/migrations/20250425134520_truncate_tax_forms/migration.sql @@ -16,7 +16,7 @@ CREATE TABLE "user_tax_form_associations" ( "user_id" VARCHAR(80) NOT NULL, "tax_form_id" TEXT NOT NULL, "date_filed" TIMESTAMP(6) NOT NULL, - "tax_form_status" "tax_form_status", + "tax_form_status" "tax_form_status" NOT NULL, CONSTRAINT "user_tax_form_associations_pkey" PRIMARY KEY ("id") );