diff --git a/source/packages/plg_system_mokosuiteauto/src/Helper/ServiceDeptHelper.php b/source/packages/plg_system_mokosuiteauto/src/Helper/ServiceDeptHelper.php new file mode 100644 index 0000000..3816a3b --- /dev/null +++ b/source/packages/plg_system_mokosuiteauto/src/Helper/ServiceDeptHelper.php @@ -0,0 +1,91 @@ +get(DatabaseInterface::class); + $filter = \Joomla\Filter\InputFilter::getInstance(); + + $ro = (object) [ + 'vin' => strtoupper($vin), + 'contact_id' => $contactId, + 'concern' => $filter->clean($concern, 'STRING'), + 'type' => $type, + 'status' => 'open', + 'created_at' => Factory::getDate()->toSql(), + ]; + + $db->insertObject('#__mokosuiteauto_service_orders', $ro, 'id'); + return (object) ['success' => true, 'ro_id' => (int) $ro->id]; + } + + /** + * Get service history for a VIN. + */ + public static function getVehicleHistory(string $vin): array + { + $db = Factory::getContainer()->get(DatabaseInterface::class); + + $db->setQuery($db->getQuery(true) + ->select('so.id, so.type, so.concern, so.diagnosis, so.status, so.created_at, so.completed_at') + ->select('cd.name AS customer_name') + ->from($db->quoteName('#__mokosuiteauto_service_orders', 'so')) + ->join('LEFT', $db->quoteName('#__contact_details', 'cd') . ' ON cd.id = so.contact_id') + ->where($db->quoteName('so.vin') . ' = ' . $db->quote(strtoupper($vin))) + ->order('so.created_at DESC')); + + return $db->loadObjectList() ?: []; + } + + /** + * Get open repair orders. + */ + public static function getOpenOrders(): array + { + $db = Factory::getContainer()->get(DatabaseInterface::class); + + $db->setQuery($db->getQuery(true) + ->select('so.*, cd.name AS customer_name, cd.telephone') + ->select('TIMESTAMPDIFF(HOUR, so.created_at, NOW()) AS hours_open') + ->from($db->quoteName('#__mokosuiteauto_service_orders', 'so')) + ->join('LEFT', $db->quoteName('#__contact_details', 'cd') . ' ON cd.id = so.contact_id') + ->where($db->quoteName('so.status') . ' IN (' . $db->quote('open') . ',' . $db->quote('in_progress') . ',' . $db->quote('waiting_parts') . ')') + ->order('so.created_at ASC')); + + return $db->loadObjectList() ?: []; + } + + /** + * Get service department dashboard. + */ + public static function getDashboard(): object + { + $db = Factory::getContainer()->get(DatabaseInterface::class); + + $db->setQuery($db->getQuery(true) + ->select('COUNT(*) AS total_open') + ->select('SUM(CASE WHEN status = ' . $db->quote('open') . ' THEN 1 ELSE 0 END) AS awaiting') + ->select('SUM(CASE WHEN status = ' . $db->quote('in_progress') . ' THEN 1 ELSE 0 END) AS in_progress') + ->select('SUM(CASE WHEN status = ' . $db->quote('waiting_parts') . ' THEN 1 ELSE 0 END) AS waiting_parts') + ->from('#__mokosuiteauto_service_orders') + ->where($db->quoteName('status') . ' NOT IN (' . $db->quote('completed') . ',' . $db->quote('cancelled') . ')')); + + return $db->loadObject() ?: (object) ['total_open' => 0]; + } +}