Skip to content

Commit 849cc5a

Browse files
authored
Merge pull request #1695 from topcoder-platform/handle-reviewer-payment-coefficients
When adding/editing reviewers, re-assign the payment coefficients
2 parents 93f960a + ade1e0f commit 849cc5a

File tree

1 file changed

+31
-20
lines changed
  • src/components/ChallengeEditor/ChallengeReviewer-Field

1 file changed

+31
-20
lines changed

src/components/ChallengeEditor/ChallengeReviewer-Field/index.js

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class ChallengeReviewerField extends Component {
110110
const phase = challenge.phases && challenge.phases.find(p => p.phaseId === item.phaseId)
111111
return {
112112
...item,
113-
name: phase.name
113+
name: phase?.name
114114
}
115115
})
116116

@@ -355,7 +355,7 @@ class ChallengeReviewerField extends Component {
355355
const currentReviewers = challenge.reviewers || []
356356

357357
// Create a new default reviewer based on track and type
358-
const defaultReviewer = this.findDefaultReviewer()
358+
const defaultTrackReviewer = this.findDefaultReviewer()
359359

360360
// Get the first available review phase if phases exist
361361
const reviewPhases = challenge.phases && challenge.phases.filter(phase =>
@@ -368,7 +368,19 @@ class ChallengeReviewerField extends Component {
368368
? challenge.phases[0]
369369
: null
370370

371-
const isAIReviewer = this.isAIReviewer(defaultReviewer)
371+
// Determine the default phase ID
372+
let defaultPhaseId = ''
373+
if (defaultTrackReviewer && defaultTrackReviewer.phaseId) {
374+
defaultPhaseId = defaultTrackReviewer.phaseId
375+
} else if (firstReviewPhase) {
376+
defaultPhaseId = firstReviewPhase.phaseId || firstReviewPhase.id
377+
} else if (fallbackPhase) {
378+
defaultPhaseId = fallbackPhase.phaseId || fallbackPhase.id
379+
}
380+
381+
const defaultReviewer = this.findDefaultReviewer(defaultPhaseId) ?? defaultTrackReviewer;
382+
383+
const isAIReviewer = this.isAIReviewer(defaultTrackReviewer)
372384

373385
// For AI reviewers, get scorecardId from the workflow if available
374386
let scorecardId = ''
@@ -386,22 +398,13 @@ class ChallengeReviewerField extends Component {
386398
scorecardId = (defaultReviewer && defaultReviewer.scorecardId) || ''
387399
}
388400

389-
// Determine the default phase ID
390-
let defaultPhaseId = ''
391-
if (defaultReviewer && defaultReviewer.phaseId) {
392-
defaultPhaseId = defaultReviewer.phaseId
393-
} else if (firstReviewPhase) {
394-
defaultPhaseId = firstReviewPhase.phaseId || firstReviewPhase.id
395-
} else if (fallbackPhase) {
396-
defaultPhaseId = fallbackPhase.phaseId || fallbackPhase.id
397-
}
398-
399401
const newReviewer = {
400402
scorecardId,
401403
isMemberReview: !isAIReviewer,
402404
phaseId: defaultPhaseId,
403-
baseCoefficient: (defaultReviewer && defaultReviewer.baseCoefficient) || '0',
404-
incrementalCoefficient: (defaultReviewer && defaultReviewer.incrementalCoefficient) || 0,
405+
fixedAmount: (defaultReviewer && defaultReviewer.fixedAmount) || 0,
406+
baseCoefficient: (defaultReviewer && defaultReviewer.baseCoefficient) || '0.13',
407+
incrementalCoefficient: (defaultReviewer && defaultReviewer.incrementalCoefficient) || 0.05,
405408
type: isAIReviewer
406409
? undefined
407410
: (defaultReviewer && defaultReviewer.opportunityType) || REVIEW_OPPORTUNITY_TYPES.REGULAR_REVIEW,
@@ -449,6 +452,14 @@ class ChallengeReviewerField extends Component {
449452
// Special handling for phase and count changes
450453
if (field === 'phaseId') {
451454
this.handlePhaseChangeWithReassign(index, value)
455+
456+
// update payment based on default reviewer
457+
const defaultReviewer = this.findDefaultReviewer(value) ?? updatedReviewers[index];
458+
Object.assign(fieldUpdate, {
459+
fixedAmount: defaultReviewer.fixedAmount,
460+
baseCoefficient: defaultReviewer.baseCoefficient,
461+
incrementalCoefficient: defaultReviewer.incrementalCoefficient,
462+
})
452463
}
453464

454465
if (field === 'memberReviewerCount') {
@@ -460,17 +471,15 @@ class ChallengeReviewerField extends Component {
460471
onUpdateReviewers({ field: 'reviewers', value: updatedReviewers })
461472
}
462473

463-
findDefaultReviewer () {
474+
findDefaultReviewer (phaseId) {
464475
const { challenge, metadata = {} } = this.props
465476
const { defaultReviewers = [] } = metadata
466477

467478
if (!challenge || !challenge.trackId || !challenge.typeId) {
468479
return null
469480
}
470481

471-
return defaultReviewers.find(dr =>
472-
dr.trackId === challenge.trackId && dr.typeId === challenge.typeId
473-
)
482+
return phaseId ? defaultReviewers.find(dr => dr.phaseId === phaseId) : defaultReviewers[0];
474483
}
475484

476485
validateReviewer (reviewer) {
@@ -560,6 +569,7 @@ class ChallengeReviewerField extends Component {
560569
scorecardId,
561570
isMemberReview: !isAI,
562571
phaseId: currentReviewer.phaseId,
572+
fixedAmount: currentReviewer.fixedAmount || 0,
563573
baseCoefficient: currentReviewer.baseCoefficient || '0',
564574
incrementalCoefficient: currentReviewer.incrementalCoefficient || 0,
565575
type: isAI ? undefined : (currentReviewer.type || REVIEW_OPPORTUNITY_TYPES.REGULAR_REVIEW)
@@ -827,11 +837,12 @@ class ChallengeReviewerField extends Component {
827837
const reviewersCost = reviewers
828838
.filter((r) => !this.isAIReviewer(r))
829839
.reduce((sum, r) => {
840+
const fixedAmount = r.fixedAmount || 0
830841
const basePayment = firstPlacePrize * parseFloat(r.baseCoefficient || 0)
831842
const incrementalPayment = parseFloat(r.incrementalCoefficient || 0) * firstPlacePrize
832843

833844
const count = parseInt(r.memberReviewerCount) || 1
834-
return sum + (basePayment + incrementalPayment) * count
845+
return sum + (fixedAmount + basePayment + incrementalPayment) * count
835846
}, 0)
836847
.toFixed(2)
837848

0 commit comments

Comments
 (0)