@@ -18,6 +18,8 @@ import {
18
18
PaymentStatus ,
19
19
AuditPayoutDto ,
20
20
} from 'src/dto/adminWinning.dto' ;
21
+ import { TaxFormRepository } from '../repository/taxForm.repo' ;
22
+ import { PaymentMethodRepository } from '../repository/paymentMethod.repo' ;
21
23
22
24
const ONE_DAY = 24 * 60 * 60 * 1000 ;
23
25
@@ -30,7 +32,11 @@ export class AdminWinningService {
30
32
* Constructs the admin winning service with the given dependencies.
31
33
* @param prisma the prisma service.
32
34
*/
33
- constructor ( private readonly prisma : PrismaService ) { }
35
+ constructor (
36
+ private readonly prisma : PrismaService ,
37
+ private readonly taxFormRepo : TaxFormRepository ,
38
+ private readonly paymentMethodRepo : PaymentMethodRepository ,
39
+ ) { }
34
40
35
41
/**
36
42
* Search winnings with parameters
@@ -101,7 +107,7 @@ export class AdminWinningService {
101
107
details : item . payment ?. map ( ( paymentItem ) => ( {
102
108
id : paymentItem . payment_id ,
103
109
netAmount : Number ( paymentItem . net_amount ) ,
104
- grossAmount : Number ( paymentItem . gross_amount ) ,
110
+ grossAmount : ( paymentItem . gross_amount ) ,
105
111
totalAmount : Number ( paymentItem . total_amount ) ,
106
112
installmentNumber : paymentItem . installment_number ,
107
113
datePaid : paymentItem . date_paid ?? undefined ,
@@ -276,6 +282,21 @@ export class AdminWinningService {
276
282
return orderBy ;
277
283
}
278
284
285
+ private getPaymentsByWinningsId ( winningsId : string , paymentId ?: string ) {
286
+ return this . prisma . payment . findMany ( {
287
+ where : {
288
+ winnings_id : {
289
+ equals : winningsId ,
290
+ } ,
291
+ payment_id : paymentId
292
+ ? {
293
+ equals : paymentId ,
294
+ }
295
+ : undefined ,
296
+ } ,
297
+ } ) ;
298
+ }
299
+
279
300
/**
280
301
* Update winnings with parameters
281
302
* @param body the request body
@@ -291,18 +312,10 @@ export class AdminWinningService {
291
312
let needsReconciliation = false ;
292
313
const winningsId = body . winningsId ;
293
314
try {
294
- const payments = await this . prisma . payment . findMany ( {
295
- where : {
296
- winnings_id : {
297
- equals : winningsId ,
298
- } ,
299
- payment_id : body . paymentId
300
- ? {
301
- equals : body . paymentId ,
302
- }
303
- : undefined ,
304
- } ,
305
- } ) ;
315
+ const payments = await this . getPaymentsByWinningsId (
316
+ winningsId ,
317
+ body . paymentId ,
318
+ ) ;
306
319
307
320
if ( payments . length === 0 ) {
308
321
throw new NotFoundException ( 'failed to get current payments' ) ;
@@ -316,6 +329,13 @@ export class AdminWinningService {
316
329
const transactions : PrismaPromise < any > [ ] = [ ] ;
317
330
const now = new Date ( ) . getTime ( ) ;
318
331
payments . forEach ( ( payment ) => {
332
+ if (
333
+ payment . payment_status &&
334
+ payment . payment_status === PaymentStatus . CANCELLED
335
+ ) {
336
+ throw new BadRequestException ( 'cannot update cancelled winnings' ) ;
337
+ }
338
+
319
339
let version = payment . version ?? 1 ;
320
340
// Update Payment Status if requested
321
341
if ( body . paymentStatus ) {
@@ -356,7 +376,10 @@ export class AdminWinningService {
356
376
break ;
357
377
}
358
378
359
- if ( errMessage ) {
379
+ if (
380
+ errMessage &&
381
+ payment . payment_status === PaymentStatus . PROCESSING
382
+ ) {
360
383
throw new BadRequestException ( errMessage ) ;
361
384
}
362
385
@@ -371,7 +394,10 @@ export class AdminWinningService {
371
394
) ,
372
395
) ;
373
396
version += 1 ;
374
- needsReconciliation = true ;
397
+
398
+ if ( body . paymentStatus === PaymentStatus . OWED ) {
399
+ needsReconciliation = true ;
400
+ }
375
401
376
402
if ( payment . installment_number === 1 ) {
377
403
transactions . push (
@@ -388,11 +414,6 @@ export class AdminWinningService {
388
414
// Update Release Date if requested
389
415
if ( body . releaseDate ) {
390
416
const newReleaseDate = new Date ( body . releaseDate ) ;
391
- if ( newReleaseDate . getTime ( ) < now ) {
392
- throw new BadRequestException (
393
- 'new release date cannot be in the past' ,
394
- ) ;
395
- }
396
417
397
418
transactions . push (
398
419
this . updateReleaseDate (
@@ -417,10 +438,11 @@ export class AdminWinningService {
417
438
}
418
439
}
419
440
420
- // Update Release Date if requested
441
+ // Update payment amount if requested
421
442
if (
422
443
body . paymentAmount !== undefined &&
423
444
( payment . payment_status === PaymentStatus . OWED ||
445
+ payment . payment_status === PaymentStatus . ON_HOLD ||
424
446
payment . payment_status === PaymentStatus . ON_HOLD ||
425
447
payment . payment_status === PaymentStatus . ON_HOLD_ADMIN )
426
448
) {
@@ -661,9 +683,47 @@ export class AdminWinningService {
661
683
} ) ;
662
684
}
663
685
664
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
665
- private async reconcileWinningsStatusOnUserDetailsUpdate ( userId : string ) {
666
- // not implement, because it's about detail payment
686
+ /**
687
+ * Update payment for user from one status to another
688
+ *
689
+ * @param userId user id
690
+ * @param fromStatus from status
691
+ * @param toStatus to status
692
+ * @param tx transaction
693
+ */
694
+ updateWinningsStatus ( userId , fromStatus , toStatus ) {
695
+ return this . prisma . $executeRaw `
696
+ UPDATE payment
697
+ SET payment_status = ${ toStatus } ::payment_status,
698
+ updated_at = now(),
699
+ updated_by = 'system',
700
+ version = version + 1
701
+ FROM winnings
702
+ WHERE payment.winnings_id = winnings.winning_id
703
+ AND winnings.winner_id = ${ userId }
704
+ AND payment.payment_status = ${ fromStatus } ::payment_status AND version = version
705
+ ` ;
706
+ }
707
+
708
+ /**
709
+ * Reconcile winning if user data updated
710
+ *
711
+ * @param userId user id
712
+ */
713
+ async reconcileWinningsStatusOnUserDetailsUpdate ( userId ) {
714
+ const hasTaxForm = await this . taxFormRepo . hasActiveTaxForm ( userId ) ;
715
+ const hasPaymentMethod =
716
+ await this . paymentMethodRepo . hasVerifiedPaymentMethod ( userId ) ;
717
+ let fromStatus , toStatus ;
718
+ if ( hasTaxForm && hasPaymentMethod ) {
719
+ fromStatus = PaymentStatus . ON_HOLD ;
720
+ toStatus = PaymentStatus . OWED ;
721
+ } else {
722
+ fromStatus = PaymentStatus . OWED ;
723
+ toStatus = PaymentStatus . ON_HOLD ;
724
+ }
725
+
726
+ await this . updateWinningsStatus ( userId , fromStatus , toStatus ) ;
667
727
}
668
728
669
729
/**
0 commit comments