@@ -2172,6 +2172,13 @@ updateChallenge.schema = {
2172
2172
)
2173
2173
. optional ( ) ,
2174
2174
overview : Joi . any ( ) . forbidden ( ) ,
2175
+ v5Payout : Joi . object ( ) . keys ( {
2176
+ userId : Joi . number ( ) . integer ( ) . positive ( ) . required ( ) ,
2177
+ amount : Joi . number ( ) . allow ( null ) ,
2178
+ status : Joi . string ( ) . allow ( null ) ,
2179
+ datePaid : Joi . string ( ) . allow ( null ) ,
2180
+ releaseDate : Joi . string ( ) . allow ( null ) ,
2181
+ } ) ,
2175
2182
} )
2176
2183
. unknown ( true )
2177
2184
. required ( ) ,
@@ -2498,6 +2505,132 @@ async function indexChallengeAndPostToKafka(updatedChallenge, track, type) {
2498
2505
} ) ;
2499
2506
}
2500
2507
2508
+ async function updateLegacyPayout ( currentUser , challengeId , data ) {
2509
+ const challenge = await challengeDomain . lookup ( getLookupCriteria ( "id" , challengeId ) ) ;
2510
+ const { v5Payout } = data ;
2511
+
2512
+ // SQL qurey to fetch the payment and payment_detail record
2513
+ let sql = `SELECT * FROM informixoltp:payment p
2514
+ INNER JOIN informixoltp:payment_detail pd ON p.most_recent_detail_id = pd.payment_detail_id
2515
+ WHERE p.user_id = ${ v5Payout . userId } AND` ;
2516
+
2517
+ if ( challenge . legacyId != null ) {
2518
+ sql += ` pd.component_project_id = ${ challenge . legacyId } ` ;
2519
+ } else {
2520
+ sql += ` pd.jira_issue_id = \'${ challengeId } \'` ;
2521
+ }
2522
+
2523
+ sql += " ORDER BY pd.payment_detail_id ASC" ;
2524
+
2525
+ console . log ( "Fetch legacy payment detail: " , sql ) ;
2526
+
2527
+ const result = await aclQueryDomain . rawQuery ( { sql } ) ;
2528
+ let updateClauses = [ `date_modified = current` ] ;
2529
+
2530
+ const statusMap = {
2531
+ Paid : 53 ,
2532
+ OnHold : 55 ,
2533
+ OnHoldAdmin : 55 ,
2534
+ Owed : 56 ,
2535
+ Cancelled : 65 ,
2536
+ EnteredIntoPaymentSystem : 70 ,
2537
+ } ;
2538
+
2539
+ if ( v5Payout . status != null ) {
2540
+ updateClauses . push ( `payment_status_id = ${ statusMap [ v5Payout . status ] } ` ) ;
2541
+ if ( v5Payout . status === "Paid" ) {
2542
+ updateClauses . push ( `date_paid = '${ v5Payout . datePaid } '` ) ;
2543
+ } else {
2544
+ updateClauses . push ( "date_paid = null" ) ;
2545
+ }
2546
+ }
2547
+
2548
+ if ( v5Payout . releaseDate != null ) {
2549
+ updateClauses . push ( `date_due = '${ v5Payout . releaseDate } '` ) ;
2550
+ }
2551
+
2552
+ const paymentDetailIds = result . rows . map (
2553
+ ( row ) => row . fields . find ( ( field ) => field . key === "payment_detail_id" ) . value
2554
+ ) ;
2555
+
2556
+ if ( v5Payout . amount != null ) {
2557
+ updateClauses . push ( `total_amount = ${ v5Payout . amount } ` ) ;
2558
+ if ( paymentDetailIds . length === 1 ) {
2559
+ updateClauses . push ( `net_amount = ${ v5Payout . amount } ` ) ;
2560
+ updateClauses . push ( `gross_amount = ${ v5Payout . amount } ` ) ;
2561
+ }
2562
+ }
2563
+
2564
+ if ( paymentDetailIds . length === 0 ) {
2565
+ return {
2566
+ success : false ,
2567
+ message : "No payment detail record found" ,
2568
+ } ;
2569
+ }
2570
+
2571
+ const whereClause = [ `payment_detail_id IN (${ paymentDetailIds . join ( "," ) } )` ] ;
2572
+
2573
+ const updateQuery = `UPDATE informixoltp:payment_detail SET ${ updateClauses . join (
2574
+ ", "
2575
+ ) } WHERE ${ whereClause . join ( " AND " ) } `;
2576
+
2577
+ console . log ( "Update Clauses" , updateClauses ) ;
2578
+ console . log ( "Update Query" , updateQuery ) ;
2579
+
2580
+ await aclQueryDomain . rawQuery ( { sql : updateQuery } ) ;
2581
+
2582
+ if ( v5Payout . amount != null ) {
2583
+ if ( paymentDetailIds . length > 1 ) {
2584
+ const amountInCents = v5Payout . amount * 100 ;
2585
+
2586
+ const split1Cents = Math . round ( amountInCents * 0.75 ) ;
2587
+ const split2Cents = amountInCents - split1Cents ;
2588
+
2589
+ const split1Dollars = Number ( ( split1Cents / 100 ) . toFixed ( 2 ) ) ;
2590
+ const split2Dollars = Number ( ( split2Cents / 100 ) . toFixed ( 2 ) ) ;
2591
+
2592
+ const paymentUpdateQueries = paymentDetailIds . map ( ( paymentDetailId , index ) => {
2593
+ let amt = 0 ;
2594
+ if ( index === 0 ) {
2595
+ amt = split1Dollars ;
2596
+ }
2597
+ if ( index === 1 ) {
2598
+ amt = split2Dollars ;
2599
+ }
2600
+
2601
+ return `UPDATE informixoltp:payment_detail SET date_modified = CURRENT, net_amount = ${ amt } , gross_amount = ${ amt } WHERE payment_detail_id = ${ paymentDetailId } ` ;
2602
+ } ) ;
2603
+
2604
+ console . log ( "Payment Update Queries" , paymentUpdateQueries ) ;
2605
+
2606
+ await Promise . all (
2607
+ paymentUpdateQueries . map ( ( query ) => aclQueryDomain . rawQuery ( { sql : query } ) )
2608
+ ) ;
2609
+ }
2610
+ }
2611
+
2612
+ return {
2613
+ success : true ,
2614
+ message : "Successfully updated legacy payout" ,
2615
+ } ;
2616
+ }
2617
+ updateLegacyPayout . schema = {
2618
+ currentUser : Joi . any ( ) ,
2619
+ challengeId : Joi . id ( ) ,
2620
+ data : Joi . object ( )
2621
+ . keys ( {
2622
+ v5Payout : Joi . object ( ) . keys ( {
2623
+ userId : Joi . number ( ) . integer ( ) . positive ( ) . required ( ) ,
2624
+ amount : Joi . number ( ) . allow ( null ) ,
2625
+ status : Joi . string ( ) . allow ( null ) ,
2626
+ datePaid : Joi . string ( ) . allow ( null ) ,
2627
+ releaseDate : Joi . string ( ) . allow ( null ) ,
2628
+ } ) ,
2629
+ } )
2630
+ . unknown ( true )
2631
+ . required ( ) ,
2632
+ } ;
2633
+
2501
2634
/**
2502
2635
* Get SRM Schedule
2503
2636
* @param {Object } criteria the criteria
@@ -2562,6 +2695,7 @@ module.exports = {
2562
2695
getChallenge,
2563
2696
updateChallenge,
2564
2697
deleteChallenge,
2698
+ updateLegacyPayout,
2565
2699
getChallengeStatistics,
2566
2700
sendNotifications,
2567
2701
advancePhase,
0 commit comments