sackey e839d40a99
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (push) Waiting to run
Initial commit
2025-07-30 17:15:50 +00:00

151 lines
5.1 KiB
PHP

<?php
namespace App\Livewire\WorkOrders;
use App\Models\Estimate;
use App\Models\WorkOrder;
use App\Models\WorkOrderTask;
use App\Models\User;
use Livewire\Component;
class Create extends Component
{
public Estimate $estimate;
public $work_description = '';
public $special_instructions = '';
public $safety_requirements = '';
public $estimated_start_time = '';
public $estimated_completion_time = '';
public $assigned_technician_id = '';
public $quality_check_required = true;
public $customer_notification_required = true;
public $notes = '';
public $tasks = [];
protected $rules = [
'work_description' => 'required|string',
'estimated_start_time' => 'required|date|after:now',
'estimated_completion_time' => 'required|date|after:estimated_start_time',
'assigned_technician_id' => 'required|exists:users,id',
'tasks.*.task_name' => 'required|string',
'tasks.*.estimated_duration' => 'required|numeric|min:0.5',
'tasks.*.required_skills' => 'nullable|string',
];
public function mount(Estimate $estimate)
{
$this->estimate = $estimate->load([
'jobCard.customer',
'jobCard.vehicle',
'diagnosis',
'lineItems'
]);
$this->work_description = "Perform repairs as per approved estimate #{$estimate->estimate_number}";
$this->estimated_start_time = now()->addDay()->format('Y-m-d\TH:i');
$this->estimated_completion_time = now()->addDays(3)->format('Y-m-d\TH:i');
// Initialize tasks from estimate line items
$this->initializeTasks();
}
public function initializeTasks()
{
foreach ($this->estimate->lineItems as $item) {
if ($item->type === 'labor') {
$this->tasks[] = [
'task_name' => $item->description,
'task_description' => $item->description,
'estimated_duration' => $item->labor_hours ?? 1,
'required_skills' => '',
'safety_requirements' => '',
'status' => 'pending',
];
}
}
}
public function addTask()
{
$this->tasks[] = [
'task_name' => '',
'task_description' => '',
'estimated_duration' => 1,
'required_skills' => '',
'safety_requirements' => '',
'status' => 'pending',
];
}
public function removeTask($index)
{
unset($this->tasks[$index]);
$this->tasks = array_values($this->tasks);
}
public function save()
{
$this->validate();
// Generate work order number
$branchCode = $this->estimate->jobCard->branch_code;
$lastWONumber = WorkOrder::where('work_order_number', 'like', $branchCode . '/WO%')
->whereYear('created_at', now()->year)
->count();
$workOrderNumber = $branchCode . '/WO' . str_pad($lastWONumber + 1, 4, '0', STR_PAD_LEFT);
$workOrder = WorkOrder::create([
'work_order_number' => $workOrderNumber,
'job_card_id' => $this->estimate->job_card_id,
'estimate_id' => $this->estimate->id,
'service_coordinator_id' => auth()->id(),
'assigned_technician_id' => $this->assigned_technician_id,
'priority' => $this->estimate->jobCard->priority,
'status' => 'scheduled',
'work_description' => $this->work_description,
'special_instructions' => $this->special_instructions,
'safety_requirements' => $this->safety_requirements,
'estimated_start_time' => $this->estimated_start_time,
'estimated_completion_time' => $this->estimated_completion_time,
'quality_check_required' => $this->quality_check_required,
'customer_notification_required' => $this->customer_notification_required,
'notes' => $this->notes,
]);
// Create tasks
foreach ($this->tasks as $task) {
WorkOrderTask::create([
'work_order_id' => $workOrder->id,
'task_name' => $task['task_name'],
'task_description' => $task['task_description'],
'estimated_duration' => $task['estimated_duration'],
'required_skills' => $task['required_skills'],
'safety_requirements' => $task['safety_requirements'],
'status' => 'pending',
]);
}
// Update job card status
$this->estimate->jobCard->update(['status' => 'work_order_created']);
session()->flash('message', 'Work Order created successfully!');
return redirect()->route('work-orders.show', $workOrder);
}
public function getTechniciansProperty()
{
return User::whereIn('role', ['technician', 'service_coordinator'])
->where('status', 'active')
->orderBy('name')
->get();
}
public function render()
{
return view('livewire.work-orders.create', [
'technicians' => $this->technicians
]);
}
}