From fb16824137cf5f4743b1ba07f5c4be5ee9b88864 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 4 Jul 2025 13:28:35 +0000 Subject: [PATCH] Refactor: Use new services and types Update frontend components to use the new services and types for job management, including facilities, jobs, and transactions. Remove old type definitions and integrate the new ones. --- src/components/JobCard.tsx | 40 +++--- src/components/JobForm.tsx | 160 +++++++++-------------- src/components/MaterialsImportExport.tsx | 25 ++-- src/components/TransactionForm.tsx | 29 ++-- src/components/TransactionTable.tsx | 29 ++-- src/pages/Index.tsx | 74 ++++++++--- src/services/jobDataService.ts | 87 ++++++++++++ src/services/jobService.ts | 1 + 8 files changed, 272 insertions(+), 173 deletions(-) create mode 100644 src/services/jobDataService.ts diff --git a/src/components/JobCard.tsx b/src/components/JobCard.tsx index 6ac4bba..69129bd 100644 --- a/src/components/JobCard.tsx +++ b/src/components/JobCard.tsx @@ -1,33 +1,39 @@ + 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 { HoverCard, HoverCardContent, HoverCardTrigger } from '@/components/ui/hover-card'; import { Calendar, Factory, TrendingUp, TrendingDown, Clock, Package, Wrench } from 'lucide-react'; -import { Job } from '@/services/jobService'; +import { IndJobResponse, IndTransactionResponse, IndBillitemResponse } from '@/lib/pbtypes'; import { formatISK } from '@/utils/priceUtils'; interface JobCardProps { - job: Job; - onEdit: (job: Job) => void; + job: IndJobResponse & { + expenditures: IndTransactionResponse[]; + income: IndTransactionResponse[]; + billOfMaterials: IndBillitemResponse[]; + consumedMaterials: { name: string; required: number }[]; + }; + onEdit: (job: any) => void; onDelete: (jobId: string) => void; } const JobCard: React.FC = ({ job, onEdit, onDelete }) => { - const totalExpenditure = job.expenditures.reduce((sum, tx) => sum + Math.abs(tx.totalAmount), 0); - const totalIncome = job.income.reduce((sum, tx) => sum + tx.totalAmount, 0); + const totalExpenditure = job.expenditures.reduce((sum, tx) => sum + tx.totalPrice, 0); + const totalIncome = job.income.reduce((sum, tx) => sum + tx.totalPrice, 0); const profit = totalIncome - totalExpenditure; const margin = totalIncome > 0 ? ((profit / totalIncome) * 100) : 0; const itemsSold = job.income.reduce((sum, tx) => sum + tx.quantity, 0); - const saleStartTime = job.dates.saleStart?.getTime(); + const saleStartTime = job.saleStart ? new Date(job.saleStart).getTime() : null; 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 'Acquisition': return 'bg-yellow-600'; case 'Running': return 'bg-blue-600'; case 'Done': return 'bg-green-600'; case 'Selling': return 'bg-purple-600'; @@ -36,9 +42,9 @@ const JobCard: React.FC = ({ job, onEdit, onDelete }) => { } }; - const formatDateTime = (date: Date | null) => { - if (!date) return 'Not set'; - return date.toLocaleString('en-CA', { + const formatDateTime = (dateString: string | null | undefined) => { + if (!dateString) return 'Not set'; + return new Date(dateString).toLocaleString('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit', @@ -53,7 +59,7 @@ const JobCard: React.FC = ({ job, onEdit, onDelete }) => {
- {job.outputItem.name} + {job.outputItem} {job.status} @@ -102,7 +108,7 @@ const JobCard: React.FC = ({ job, onEdit, onDelete }) => { )}
-

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

+

Quantity: {job.outputQuantity.toLocaleString()}