feat: Add selling job progress metric

Adds a metric to the JobCardMetrics component to display the progress of selling jobs, comparing actual revenue to projected revenue based on the number of items sold.
This commit is contained in:
gpt-engineer-app[bot]
2025-07-08 10:19:39 +00:00
committed by PhatPhuckDave
parent bcf249e9c4
commit 037328f0c9

View File

@@ -29,6 +29,16 @@ const JobCardMetrics: React.FC<JobCardMetricsProps> = ({ job }) => {
const profit = totalIncome - totalExpenditure;
const margin = totalIncome > 0 ? ((profit / totalIncome) * 100) : 0;
// Calculate performance metrics
const soldQuantity = job.produced || 0;
const expectedRevenuePerItem = job.projectedRevenue && job.outputQuantity > 0 ? job.projectedRevenue / job.outputQuantity : 0;
const actualRevenuePerItem = soldQuantity > 0 ? totalIncome / soldQuantity : 0;
const performanceRatio = expectedRevenuePerItem > 0 ? (actualRevenuePerItem / expectedRevenuePerItem) : 0;
const performancePercentage = performanceRatio * 100;
// Show performance indicator only if we have the necessary data
const showPerformanceIndicator = job.projectedRevenue > 0 && job.outputQuantity > 0 && soldQuantity > 0;
const handleFieldClick = (fieldName: string, currentValue: number, e: React.MouseEvent) => {
e.stopPropagation();
setEditingField(fieldName);
@@ -135,6 +145,25 @@ const JobCardMetrics: React.FC<JobCardMetricsProps> = ({ job }) => {
</div>
</div>
)}
{showPerformanceIndicator && (
<div className="text-xs space-y-1">
<div className="text-gray-400">
{formatISK(actualRevenuePerItem)}/item vs {formatISK(expectedRevenuePerItem)}/item
</div>
<div
className={`text-xs font-medium px-2 py-1 rounded-full ${
performancePercentage >= 100
? 'bg-green-900/50 text-green-400'
: performancePercentage >= 90
? 'bg-yellow-900/50 text-yellow-400'
: 'bg-red-900/50 text-red-400'
}`}
title={`Performance: ${performancePercentage.toFixed(1)}% of expected revenue per item`}
>
{performancePercentage >= 100 ? '📈' : performancePercentage >= 90 ? '⚠️' : '📉'} {performancePercentage.toFixed(0)}%
</div>
</div>
)}
</div>
<div className="text-center space-y-1">
<div className="text-xs font-medium text-gray-300 uppercase tracking-wide">Profit</div>