@@ -1685,16 +1685,16 @@ <h3>Why calculate PR costs?</h3>
16851685 // Delay Costs
16861686 output += ' Delay Costs\n' ;
16871687 output += ' ───────────\n' ;
1688- output += ` Workstream blockage ${ formatCurrency ( avgDeliveryDelayCost ) . padStart ( 15 ) } ${ formatTimeUnit ( avgDeliveryDelayHours ) } (${ e . human_prs } PRs)\n` ;
1688+ output += formatItemLine ( " Workstream blockage" , avgDeliveryDelayCost , formatTimeUnit ( avgDeliveryDelayHours ) , ` (${ e . human_prs } PRs)` ) ;
16891689 const avgAutomatedUpdatesCost = e . automated_updates_cost / totalPRs ;
16901690 const avgAutomatedUpdatesHours = e . automated_updates_hours / totalPRs ;
16911691 const avgPRTrackingCost = e . pr_tracking_cost / totalPRs ;
16921692 const avgPRTrackingHours = e . pr_tracking_hours / totalPRs ;
16931693 if ( avgAutomatedUpdatesCost > 0.01 ) {
1694- output += ` Automated Updates ${ formatCurrency ( avgAutomatedUpdatesCost ) . padStart ( 15 ) } ${ formatTimeUnit ( avgAutomatedUpdatesHours ) } (${ e . bot_prs } PRs)\n` ;
1694+ output += formatItemLine ( " Automated Updates" , avgAutomatedUpdatesCost , formatTimeUnit ( avgAutomatedUpdatesHours ) , ` (${ e . bot_prs } PRs)` ) ;
16951695 }
16961696 if ( avgPRTrackingCost > 0.01 ) {
1697- output += ` PR Tracking ${ formatCurrency ( avgPRTrackingCost ) . padStart ( 15 ) } ${ formatTimeUnit ( avgPRTrackingHours ) } (${ e . open_prs } open PRs)\n` ;
1697+ output += formatItemLine ( " PR Tracking" , avgPRTrackingCost , formatTimeUnit ( avgPRTrackingHours ) , ` (${ e . open_prs } open PRs)` ) ;
16981698 }
16991699 const avgMergeDelayCost = avgDeliveryDelayCost + avgCodeChurnCost + avgAutomatedUpdatesCost + avgPRTrackingCost ;
17001700 const avgMergeDelayHours = avgDeliveryDelayHours + avgCodeChurnHours + avgAutomatedUpdatesHours + avgPRTrackingHours ;
@@ -1710,17 +1710,17 @@ <h3>Why calculate PR costs?</h3>
17101710 if ( e . code_churn_cost > 0.01 ) {
17111711 const avgReworkPct = e . avg_rework_percentage || 0 ;
17121712 const label = avgReworkPct > 0 ? `Code Churn (${ avgReworkPct . toFixed ( 0 ) } % drift)` : 'Code Churn' ;
1713- output += ` ${ label . padEnd ( 26 ) } ${ formatCurrency ( avgCodeChurnCost ) . padStart ( 15 ) } ${ formatTimeUnit ( avgCodeChurnHours ) } (${ e . code_churn_pr_count } PRs)\n` ;
1713+ output += formatItemLine ( label , avgCodeChurnCost , formatTimeUnit ( avgCodeChurnHours ) , ` (${ e . code_churn_pr_count } PRs)` ) ;
17141714 }
17151715 if ( e . future_review_cost > 0.01 ) {
1716- output += ` Review ${ formatCurrency ( avgFutureReviewCost ) . padStart ( 15 ) } ${ formatTimeUnit ( avgFutureReviewHours ) } (${ e . future_review_pr_count } PRs)\n` ;
1716+ output += formatItemLine ( " Review" , avgFutureReviewCost , formatTimeUnit ( avgFutureReviewHours ) , ` (${ e . future_review_pr_count } PRs)` ) ;
17171717 }
17181718 if ( e . future_merge_cost > 0.01 ) {
1719- output += ` Merge ${ formatCurrency ( avgFutureMergeCost ) . padStart ( 15 ) } ${ formatTimeUnit ( avgFutureMergeHours ) } (${ e . future_merge_pr_count } PRs)\n` ;
1719+ output += formatItemLine ( " Merge" , avgFutureMergeCost , formatTimeUnit ( avgFutureMergeHours ) , ` (${ e . future_merge_pr_count } PRs)` ) ;
17201720 }
17211721 if ( e . future_context_cost > 0.01 ) {
17221722 const avgFutureContextSessions = e . future_context_sessions / totalPRs ;
1723- output += ` Context Switching ${ formatCurrency ( avgFutureContextCost ) . padStart ( 15 ) } ${ formatTimeUnit ( avgFutureContextHours ) } (${ avgFutureContextSessions . toFixed ( 1 ) } sessions)\n` ;
1723+ output += formatItemLine ( " Context Switching" , avgFutureContextCost , formatTimeUnit ( avgFutureContextHours ) , ` (${ avgFutureContextSessions . toFixed ( 1 ) } sessions)` ) ;
17241724 }
17251725 const avgFutureCost = avgCodeChurnCost + avgFutureReviewCost + avgFutureMergeCost + avgFutureContextCost ;
17261726 const avgFutureHours = avgCodeChurnHours + avgFutureReviewHours + avgFutureMergeHours + avgFutureContextHours ;
@@ -1794,13 +1794,13 @@ <h3>Why calculate PR costs?</h3>
17941794 output += ' ' + '─' . repeat ( delayCostsHeader . length - 2 ) + '\n' ;
17951795
17961796 if ( ( e . delivery_delay_cost || 0 ) > 0 ) {
1797- output += ` Workstream blockage ${ formatCurrency ( e . delivery_delay_cost ) . padStart ( 15 ) } ${ formatTimeUnit ( e . delivery_delay_hours ) } (${ e . human_prs || 0 } PRs)\n` ;
1797+ output += formatItemLine ( " Workstream blockage" , e . delivery_delay_cost , formatTimeUnit ( e . delivery_delay_hours ) , ` (${ e . human_prs || 0 } PRs)` ) ;
17981798 }
17991799 if ( ( e . automated_updates_cost || 0 ) > 0 ) {
1800- output += ` Automated Updates ${ formatCurrency ( e . automated_updates_cost ) . padStart ( 15 ) } ${ formatTimeUnit ( e . automated_updates_hours ) } (${ e . bot_prs || 0 } PRs)\n` ;
1800+ output += formatItemLine ( " Automated Updates" , e . automated_updates_cost , formatTimeUnit ( e . automated_updates_hours ) , ` (${ e . bot_prs || 0 } PRs)` ) ;
18011801 }
18021802 if ( ( e . pr_tracking_cost || 0 ) > 0 ) {
1803- output += ` PR Tracking ${ formatCurrency ( e . pr_tracking_cost ) . padStart ( 15 ) } ${ formatTimeUnit ( e . pr_tracking_hours ) } (${ e . open_prs || 0 } open PRs)\n` ;
1803+ output += formatItemLine ( " PR Tracking" , e . pr_tracking_cost , formatTimeUnit ( e . pr_tracking_hours ) , ` (${ e . open_prs || 0 } open PRs)` ) ;
18041804 }
18051805
18061806 const mergeDelayCost = ( e . delivery_delay_cost || 0 ) + ( e . code_churn_cost || 0 ) + ( e . automated_updates_cost || 0 ) + ( e . pr_tracking_cost || 0 ) ;
@@ -1815,18 +1815,18 @@ <h3>Why calculate PR costs?</h3>
18151815 output += ' Future Costs\n' ;
18161816 output += ' ────────────\n' ;
18171817 if ( ( e . code_churn_cost || 0 ) > 0.01 ) {
1818- output += ` Code Churn ${ formatCurrency ( e . code_churn_cost ) . padStart ( 15 ) } ${ formatTimeUnit ( e . code_churn_hours ) } \n` ;
1818+ output += formatItemLine ( " Code Churn" , e . code_churn_cost , formatTimeUnit ( e . code_churn_hours ) , "" ) ;
18191819 }
18201820 if ( ( e . future_review_cost || 0 ) > 0.01 ) {
18211821 const openPRs = e . open_prs || 0 ;
1822- output += ` Review ${ formatCurrency ( e . future_review_cost ) . padStart ( 15 ) } ${ formatTimeUnit ( e . future_review_hours ) } (${ openPRs } PRs)\n` ;
1822+ output += formatItemLine ( " Review" , e . future_review_cost , formatTimeUnit ( e . future_review_hours ) , ` (${ openPRs } PRs)` ) ;
18231823 }
18241824 if ( ( e . future_merge_cost || 0 ) > 0.01 ) {
18251825 const openPRs = e . open_prs || 0 ;
1826- output += ` Merge ${ formatCurrency ( e . future_merge_cost ) . padStart ( 15 ) } ${ formatTimeUnit ( e . future_merge_hours ) } (${ openPRs } PRs)\n` ;
1826+ output += formatItemLine ( " Merge" , e . future_merge_cost , formatTimeUnit ( e . future_merge_hours ) , ` (${ openPRs } PRs)` ) ;
18271827 }
18281828 if ( ( e . future_context_cost || 0 ) > 0.01 ) {
1829- output += ` Context Switching ${ formatCurrency ( e . future_context_cost ) . padStart ( 15 ) } ${ formatTimeUnit ( e . future_context_hours ) } (${ e . future_context_sessions || 0 } sessions)\n` ;
1829+ output += formatItemLine ( " Context Switching" , e . future_context_cost , formatTimeUnit ( e . future_context_hours ) , ` (${ e . future_context_sessions || 0 } sessions)` ) ;
18301830 }
18311831 const futureCost = ( e . code_churn_cost || 0 ) + ( e . future_review_cost || 0 ) + ( e . future_merge_cost || 0 ) + ( e . future_context_cost || 0 ) ;
18321832 const futureHours = ( e . code_churn_hours || 0 ) + ( e . future_review_hours || 0 ) + ( e . future_merge_hours || 0 ) + ( e . future_context_hours || 0 ) ;
0 commit comments