@@ -2,11 +2,7 @@ import { Injectable, HttpStatus } from '@nestjs/common';
2
2
3
3
import { PrismaService } from 'src/shared/global/prisma.service' ;
4
4
5
- import {
6
- ResponseDto ,
7
- WinningsType ,
8
- PaymentStatus ,
9
- } from 'src/dto/adminWinning.dto' ;
5
+ import { ResponseDto , WinningsType } from 'src/dto/adminWinning.dto' ;
10
6
import { WalletDetailDto } from 'src/dto/wallet.dto' ;
11
7
import { TaxFormRepository } from '../repository/taxForm.repo' ;
12
8
import { PaymentMethodRepository } from '../repository/paymentMethod.repo' ;
@@ -37,65 +33,7 @@ export class WalletService {
37
33
const result = new ResponseDto < WalletDetailDto > ( ) ;
38
34
39
35
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 ) ;
99
37
100
38
const hasActiveTaxForm = await this . taxFormRepo . hasActiveTaxForm ( userId ) ;
101
39
const hasVerifiedPaymentMethod =
@@ -106,7 +44,10 @@ export class WalletService {
106
44
balances : [
107
45
{
108
46
type : WinningsType . PAYMENT ,
109
- amount : paymentTotal ,
47
+ amount : Number (
48
+ winnings . find ( ( it ) => it . payment_type === 'PAYMENT' )
49
+ ?. total_owed ?? 0 ,
50
+ ) ,
110
51
unit : 'currency' ,
111
52
} ,
112
53
// hide rewards for now
@@ -138,6 +79,43 @@ export class WalletService {
138
79
return result ;
139
80
}
140
81
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
+
141
119
private findMaxVersion ( latest : any [ ] , winningId : string ) : number {
142
120
const winningItem = latest . find ( ( item ) => item . winnings_id === winningId ) ;
143
121
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
0 commit comments