@@ -14,7 +14,9 @@ import {
1414 Challenge ,
1515 ChallengeResource ,
1616 ChallengeReview ,
17+ Prize ,
1718 ResourceRole ,
19+ Winner ,
1820} from './models' ;
1921import { BillingAccountsService } from 'src/shared/topcoder/billing-accounts.service' ;
2022import { TopcoderM2MService } from 'src/shared/topcoder/topcoder-m2m.service' ;
@@ -117,9 +119,12 @@ export class ChallengesService {
117119 }
118120 }
119121
120- generateWinnersPayments ( challenge : Challenge ) : PaymentPayload [ ] {
121- const { prizeSets, winners } = challenge ;
122-
122+ generateWinnersPayments (
123+ challenge : Challenge ,
124+ winners : Winner [ ] ,
125+ prizes : Prize [ ] ,
126+ type ?: WinningsCategory ,
127+ ) : PaymentPayload [ ] {
123128 const isCancelledFailedReview =
124129 challenge . status . toLowerCase ( ) ===
125130 ChallengeStatuses . CancelledFailedReview . toLowerCase ( ) ;
@@ -128,6 +133,53 @@ export class ChallengesService {
128133 return [ ] ;
129134 }
130135
136+ return winners . map ( ( winner ) => ( {
137+ handle : winner . handle ,
138+ amount : prizes [ winner . placement - 1 ] . value ,
139+ userId : winner . userId . toString ( ) ,
140+ type :
141+ type ??
142+ ( challenge . task . isTask
143+ ? WinningsCategory . TASK_PAYMENT
144+ : WinningsCategory . CONTEST_PAYMENT ) ,
145+ description :
146+ challenge . type === 'Task'
147+ ? challenge . name
148+ : `${ challenge . name } - ${ placeToOrdinal ( winner . placement ) } Place` ,
149+ } ) ) ;
150+ }
151+
152+ generateCheckpointWinnersPayments ( challenge : Challenge ) : PaymentPayload [ ] {
153+ const { prizeSets, checkpointWinners } = challenge ;
154+
155+ // generate placement payments
156+ const checkpointPrizes = orderBy (
157+ find ( prizeSets , { type : 'CHECKPOINT' } ) ?. prizes ,
158+ 'value' ,
159+ 'desc' ,
160+ ) ;
161+
162+ if ( ( checkpointPrizes ?. length ?? 0 ) < ( checkpointWinners ?. length ?? 0 ) ) {
163+ throw new Error (
164+ 'Task has incorrect number of checkpoint prizes! There are more checkpoint winners than checkpoint prizes!' ,
165+ ) ;
166+ }
167+
168+ if ( ! checkpointPrizes ?. length ) {
169+ return [ ] ;
170+ }
171+
172+ return this . generateWinnersPayments (
173+ challenge ,
174+ checkpointWinners ,
175+ checkpointPrizes ,
176+ WinningsCategory . CONTEST_CHECKPOINT_PAYMENT ,
177+ ) ;
178+ }
179+
180+ generatePlacementWinnersPayments ( challenge : Challenge ) : PaymentPayload [ ] {
181+ const { prizeSets, winners } = challenge ;
182+
131183 // generate placement payments
132184 const placementPrizes = orderBy (
133185 find ( prizeSets , { type : 'PLACEMENT' } ) ?. prizes ,
@@ -141,18 +193,7 @@ export class ChallengesService {
141193 ) ;
142194 }
143195
144- return winners . map ( ( winner ) => ( {
145- handle : winner . handle ,
146- amount : placementPrizes [ winner . placement - 1 ] . value ,
147- userId : winner . userId . toString ( ) ,
148- type : challenge . task . isTask
149- ? WinningsCategory . TASK_PAYMENT
150- : WinningsCategory . CONTEST_PAYMENT ,
151- description :
152- challenge . type === 'Task'
153- ? challenge . name
154- : `${ challenge . name } - ${ placeToOrdinal ( winner . placement ) } Place` ,
155- } ) ) ;
196+ return this . generateWinnersPayments ( challenge , winners , placementPrizes ) ;
156197 }
157198
158199 generateCopilotPayment (
@@ -284,7 +325,9 @@ export class ChallengesService {
284325 throw new Error ( 'Missing challenge resources!' ) ;
285326 }
286327
287- const winnersPayments = this . generateWinnersPayments ( challenge ) ;
328+ const winnersPayments = this . generatePlacementWinnersPayments ( challenge ) ;
329+ const checkpointPayments =
330+ this . generateCheckpointWinnersPayments ( challenge ) ;
288331 const copilotPayments = this . generateCopilotPayment (
289332 challenge ,
290333 challengeResources . copilot ,
@@ -315,6 +358,7 @@ export class ChallengesService {
315358
316359 const payments : PaymentPayload [ ] = [
317360 ...winnersPayments ,
361+ ...checkpointPayments ,
318362 ...copilotPayments ,
319363 ...reviewersPayments ,
320364 ] ;
0 commit comments