Skip to content

Commit 0baedb7

Browse files
committed
PM-959 - use raw query to fetch payment details
1 parent 137d0e3 commit 0baedb7

File tree

1 file changed

+43
-65
lines changed

1 file changed

+43
-65
lines changed

src/api/wallet/wallet.service.ts

Lines changed: 43 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@ import { Injectable, HttpStatus } from '@nestjs/common';
22

33
import { PrismaService } from 'src/shared/global/prisma.service';
44

5-
import {
6-
ResponseDto,
7-
WinningsType,
8-
PaymentStatus,
9-
} from 'src/dto/adminWinning.dto';
5+
import { ResponseDto, WinningsType } from 'src/dto/adminWinning.dto';
106
import { WalletDetailDto } from 'src/dto/wallet.dto';
117
import { TaxFormRepository } from '../repository/taxForm.repo';
128
import { PaymentMethodRepository } from '../repository/paymentMethod.repo';
@@ -37,65 +33,7 @@ export class WalletService {
3733
const result = new ResponseDto<WalletDetailDto>();
3834

3935
try {
40-
const latestPaymentVersion = await this.prisma.payment.groupBy({
41-
by: ['winnings_id'],
42-
_max: {
43-
version: true,
44-
},
45-
});
46-
47-
const winnings = await this.prisma.winnings.findMany({
48-
where: {
49-
type: {
50-
in: [WinningsType.PAYMENT, WinningsType.REWARD],
51-
},
52-
winner_id: userId,
53-
payment: {
54-
some: {
55-
payment_status: {
56-
in: [PaymentStatus.OWED, PaymentStatus.ON_HOLD],
57-
},
58-
installment_number: {
59-
equals: 1,
60-
},
61-
},
62-
},
63-
},
64-
include: {
65-
payment: true,
66-
reward: true,
67-
},
68-
});
69-
70-
// count PAYMENT and REWARD totals
71-
let paymentTotal = 0;
72-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
73-
let rewardTotal = 0;
74-
winnings.forEach((item) => {
75-
if (item.type === WinningsType.PAYMENT) {
76-
const latestVersion = this.findMaxVersion(
77-
latestPaymentVersion,
78-
item.winning_id,
79-
);
80-
const foundPayment = item.payment.find(
81-
(p) =>
82-
p.installment_number === 1 &&
83-
p.version === latestVersion &&
84-
(p.payment_status === PaymentStatus.OWED ||
85-
p.payment_status === PaymentStatus.ON_HOLD),
86-
);
87-
if (foundPayment) {
88-
paymentTotal += foundPayment.total_amount!.toNumber();
89-
}
90-
// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
91-
} else if (item.type === WinningsType.REWARD) {
92-
if (item.reward && item.reward.length > 0) {
93-
item.reward.forEach((r) => {
94-
rewardTotal += r.points ?? 0;
95-
});
96-
}
97-
}
98-
});
36+
const winnings = await this.getWinningsTotalsByWinnerID(userId);
9937

10038
const hasActiveTaxForm = await this.taxFormRepo.hasActiveTaxForm(userId);
10139
const hasVerifiedPaymentMethod =
@@ -106,7 +44,10 @@ export class WalletService {
10644
balances: [
10745
{
10846
type: WinningsType.PAYMENT,
109-
amount: paymentTotal,
47+
amount: Number(
48+
winnings.find((it) => it.payment_type === 'PAYMENT')
49+
?.total_owed ?? 0,
50+
),
11051
unit: 'currency',
11152
},
11253
// hide rewards for now
@@ -138,6 +79,43 @@ export class WalletService {
13879
return result;
13980
}
14081

82+
getWinningsTotalsByWinnerID(winnerId: string) {
83+
return this.prisma.$queryRaw<
84+
{ payment_type: 'PAYMENT' | 'REWARD'; total_owed: number }[]
85+
>`
86+
WITH latest_payment_version AS (
87+
SELECT
88+
winnings_id,
89+
MAX(version) AS max_version
90+
FROM
91+
payment
92+
GROUP BY
93+
winnings_id
94+
)
95+
SELECT
96+
w.type AS payment_type,
97+
CASE
98+
WHEN w.type = 'PAYMENT' THEN SUM(p.total_amount)
99+
WHEN w.type = 'REWARD' THEN SUM(r.points)
100+
ELSE 0
101+
END AS total_owed
102+
FROM
103+
winnings w
104+
LEFT JOIN payment p ON w.winning_id = p.winnings_id
105+
AND w.type = 'PAYMENT'
106+
AND p.payment_status IN ('OWED', 'ON_HOLD')
107+
AND p.installment_number = 1
108+
INNER JOIN latest_payment_version lpv ON p.winnings_id = lpv.winnings_id
109+
AND p.version = lpv.max_version
110+
LEFT JOIN reward r ON w.winning_id = r.winnings_id
111+
AND w.type = 'REWARD'
112+
WHERE
113+
w.winner_id = ${winnerId}
114+
GROUP BY
115+
w.type
116+
`;
117+
}
118+
141119
private findMaxVersion(latest: any[], winningId: string): number {
142120
const winningItem = latest.find((item) => item.winnings_id === winningId);
143121
// eslint-disable-next-line @typescript-eslint/no-unsafe-return

0 commit comments

Comments
 (0)