|
1 | 1 | import { HttpStatus, Injectable } from '@nestjs/common';
|
2 |
| -import { payment_status, Prisma, winnings_category } from '@prisma/client'; |
| 2 | +import { |
| 3 | + payment_status, |
| 4 | + Prisma, |
| 5 | + winnings, |
| 6 | + winnings_category, |
| 7 | +} from '@prisma/client'; |
| 8 | +import { uniq } from 'lodash'; |
3 | 9 | import { ResponseDto } from 'src/dto/api-response.dto';
|
4 | 10 | import { DateFilterType } from 'src/dto/date-filter.type';
|
5 | 11 | import { PaymentStatus } from 'src/dto/payment.dto';
|
@@ -110,6 +116,32 @@ export class WinningsRepository {
|
110 | 116 | return orderBy;
|
111 | 117 | }
|
112 | 118 |
|
| 119 | + private async getUsersPayoutStatusForWinnings(winnings: winnings[]) { |
| 120 | + const usersPayoutStatus = await this.prisma.$queryRaw< |
| 121 | + { |
| 122 | + userId: string; |
| 123 | + taxFormSetupComplete: boolean; |
| 124 | + paymentMethodSetupComplete: boolean; |
| 125 | + }[] |
| 126 | + >` |
| 127 | + SELECT |
| 128 | + upm.user_id as "userId", |
| 129 | + CASE WHEN utx.tax_form_status = 'ACTIVE' THEN TRUE ELSE FALSE END as "taxFormSetupComplete", |
| 130 | + CASE WHEN upm.status = 'CONNECTED' THEN TRUE ELSE FALSE END as "payoutSetupComplete" |
| 131 | + FROM user_payment_methods upm |
| 132 | + LEFT JOIN user_tax_form_associations utx ON upm.user_id = utx.user_id |
| 133 | + WHERE upm.user_id IN (${Prisma.join(uniq(winnings.map((w) => w.winner_id)))}) |
| 134 | + `; |
| 135 | + |
| 136 | + return usersPayoutStatus.reduce( |
| 137 | + (map, userPayoutStatus) => |
| 138 | + Object.assign(map, { |
| 139 | + [userPayoutStatus.userId]: { ...userPayoutStatus, userId: undefined }, |
| 140 | + }), |
| 141 | + {}, |
| 142 | + ); |
| 143 | + } |
| 144 | + |
113 | 145 | /**
|
114 | 146 | * Search winnings with parameters
|
115 | 147 | * @param searchProps the request body
|
@@ -168,6 +200,9 @@ export class WinningsRepository {
|
168 | 200 | this.prisma.winnings.count({ where: queryWhere }),
|
169 | 201 | ]);
|
170 | 202 |
|
| 203 | + const usersPayoutStatusMap = |
| 204 | + await this.getUsersPayoutStatusForWinnings(winnings); |
| 205 | + |
171 | 206 | result.data = {
|
172 | 207 | winnings: winnings.map((item) => ({
|
173 | 208 | id: item.winning_id,
|
@@ -197,6 +232,7 @@ export class WinningsRepository {
|
197 | 232 | item.payment?.[0].updated_at ??
|
198 | 233 | undefined) as Date,
|
199 | 234 | releaseDate: item.payment?.[0]?.release_date as Date,
|
| 235 | + paymentStatus: usersPayoutStatusMap[item.winner_id], |
200 | 236 | })),
|
201 | 237 | pagination: {
|
202 | 238 | totalItems: count,
|
|
0 commit comments