diff --git a/src/components/JobCard.tsx b/src/components/JobCard.tsx index 62e5a68..1d2b5af 100644 --- a/src/components/JobCard.tsx +++ b/src/components/JobCard.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; -import { Calendar, Factory, TrendingUp, TrendingDown } from 'lucide-react'; +import { Calendar, Factory, TrendingUp, TrendingDown, Clock } from 'lucide-react'; import { Job } from '@/services/jobService'; import { formatISK } from '@/utils/priceUtils'; @@ -20,15 +20,44 @@ const JobCard: React.FC = ({ job, onEdit, onDelete }) => { const margin = totalIncome > 0 ? ((profit / totalIncome) * 100) : 0; const itemsSold = job.income.reduce((sum, tx) => sum + tx.quantity, 0); - const daysSinceStart = Math.max(1, Math.ceil((Date.now() - job.dates.saleStart.getTime()) / (1000 * 60 * 60 * 24))); - const itemsPerDay = itemsSold / daysSinceStart; + const saleStartTime = job.dates.saleStart?.getTime(); + const daysSinceStart = saleStartTime ? Math.max(1, Math.ceil((Date.now() - saleStartTime) / (1000 * 60 * 60 * 24))) : 0; + const itemsPerDay = daysSinceStart > 0 ? itemsSold / daysSinceStart : 0; + + const getStatusColor = (status: string) => { + switch (status) { + case 'Planned': return 'bg-gray-600'; + case 'Transporting Materials': return 'bg-yellow-600'; + case 'Running': return 'bg-blue-600'; + case 'Done': return 'bg-green-600'; + case 'Selling': return 'bg-purple-600'; + case 'Closed': return 'bg-gray-800'; + default: return 'bg-gray-600'; + } + }; + + const formatDateTime = (date: Date | null) => { + if (!date) return 'Not set'; + return date.toLocaleString('en-CA', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }).replace(',', ''); + }; return (
- {job.outputItem.name} +
+ {job.outputItem.name} + + {job.status} + +

Quantity: {job.outputItem.quantity.toLocaleString()}

@@ -51,27 +80,34 @@ const JobCard: React.FC = ({ job, onEdit, onDelete }) => {
-
-
-
- - Created: {job.dates.creation.toLocaleDateString()} -
-
- - Facility: {job.facilityId} -
+
+
+ + Created: {formatDateTime(job.dates.creation)}
-
-
- Sale Period: {job.dates.saleStart.toLocaleDateString()} - {job.dates.saleEnd.toLocaleDateString()} -
-
- Items/Day: {itemsPerDay.toFixed(2)} -
+
+ + Start: {formatDateTime(job.dates.start)} +
+
+ + Facility: {job.facilityId}
+ {job.dates.saleStart && ( +
+
+ Sale Period: {formatDateTime(job.dates.saleStart)} - {formatDateTime(job.dates.saleEnd)} +
+ {itemsPerDay > 0 && ( +
+ Items/Day: {itemsPerDay.toFixed(2)} +
+ )} +
+ )} +
diff --git a/src/components/JobForm.tsx b/src/components/JobForm.tsx index 5151e0c..16c7f28 100644 --- a/src/components/JobForm.tsx +++ b/src/components/JobForm.tsx @@ -23,12 +23,13 @@ const JobForm: React.FC = ({ job, onSubmit, onCancel }) => { quantity: job?.outputItem.quantity || 0 }, dates: { - creation: job?.dates.creation ? job.dates.creation.toISOString().split('T')[0] : new Date().toISOString().split('T')[0], - start: job?.dates.start ? job.dates.start.toISOString().split('T')[0] : '', - end: job?.dates.end ? job.dates.end.toISOString().split('T')[0] : '', - saleStart: job?.dates.saleStart ? job.dates.saleStart.toISOString().split('T')[0] : '', - saleEnd: job?.dates.saleEnd ? job.dates.saleEnd.toISOString().split('T')[0] : '' + creation: job?.dates.creation ? job.dates.creation.toISOString().slice(0, 16) : new Date().toISOString().slice(0, 16), + start: job?.dates.start ? job.dates.start.toISOString().slice(0, 16) : '', + end: job?.dates.end ? job.dates.end.toISOString().slice(0, 16) : '', + saleStart: job?.dates.saleStart ? job.dates.saleStart.toISOString().slice(0, 16) : '', + saleEnd: job?.dates.saleEnd ? job.dates.saleEnd.toISOString().slice(0, 16) : '' }, + status: job?.status || 'Planned' as const, facilityId: job?.facilityId || '' }); @@ -52,15 +53,25 @@ const JobForm: React.FC = ({ job, onSubmit, onCancel }) => { outputItem: formData.outputItem, dates: { creation: new Date(formData.dates.creation), - start: new Date(formData.dates.start), - end: new Date(formData.dates.end), - saleStart: new Date(formData.dates.saleStart), - saleEnd: new Date(formData.dates.saleEnd) + start: formData.dates.start ? new Date(formData.dates.start) : null, + end: formData.dates.end ? new Date(formData.dates.end) : null, + saleStart: formData.dates.saleStart ? new Date(formData.dates.saleStart) : null, + saleEnd: formData.dates.saleEnd ? new Date(formData.dates.saleEnd) : null }, + status: formData.status, facilityId: formData.facilityId }); }; + const statusOptions = [ + 'Planned', + 'Transporting Materials', + 'Running', + 'Done', + 'Selling', + 'Closed' + ] as const; + return ( @@ -100,100 +111,116 @@ const JobForm: React.FC = ({ job, onSubmit, onCancel }) => {
+
+
+ + +
+
+ + +
+
+
- - + + setFormData({ + ...formData, + dates: { ...formData.dates, creation: e.target.value } + })} + className="bg-gray-800 border-gray-600 text-white" + required + />
- - setFormData({ - ...formData, - dates: { ...formData.dates, creation: e.target.value } - })} - className="bg-gray-800 border-gray-600 text-white" - required - /> -
-
- + setFormData({ ...formData, dates: { ...formData.dates, start: e.target.value } })} className="bg-gray-800 border-gray-600 text-white" - required />
-
- -
- + setFormData({ ...formData, dates: { ...formData.dates, end: e.target.value } })} className="bg-gray-800 border-gray-600 text-white" - required />
+
+ +
- + setFormData({ ...formData, dates: { ...formData.dates, saleStart: e.target.value } })} className="bg-gray-800 border-gray-600 text-white" - required />
-
- -
- - setFormData({ - ...formData, - dates: { ...formData.dates, saleEnd: e.target.value } - })} - className="bg-gray-800 border-gray-600 text-white" - required - /> +
+ + setFormData({ + ...formData, + dates: { ...formData.dates, saleEnd: e.target.value } + })} + className="bg-gray-800 border-gray-600 text-white" + /> +
diff --git a/src/services/jobService.ts b/src/services/jobService.ts index 7b5d6e5..c6e9b77 100644 --- a/src/services/jobService.ts +++ b/src/services/jobService.ts @@ -8,11 +8,12 @@ export interface Job { }; dates: { creation: Date; - start: Date; - end: Date; - saleStart: Date; - saleEnd: Date; + start: Date | null; + end: Date | null; + saleStart: Date | null; + saleEnd: Date | null; }; + status: 'Planned' | 'Transporting Materials' | 'Running' | 'Done' | 'Selling' | 'Closed'; facilityId: string; expenditures: Transaction[]; income: Transaction[];