From f6d85a3edffca5054a3c1660e44610cbb0abc50d Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sun, 21 Jun 2026 17:43:34 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20round=203=20helpers=20=E2=80=94=201=20n?= =?UTF-8?q?ew=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Helper/OpenHouseHelper.php | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 source/packages/plg_system_mokosuiterealty/src/Helper/OpenHouseHelper.php diff --git a/source/packages/plg_system_mokosuiterealty/src/Helper/OpenHouseHelper.php b/source/packages/plg_system_mokosuiterealty/src/Helper/OpenHouseHelper.php new file mode 100644 index 0000000..9e47638 --- /dev/null +++ b/source/packages/plg_system_mokosuiterealty/src/Helper/OpenHouseHelper.php @@ -0,0 +1,77 @@ +get(DatabaseInterface::class); + + $event = (object) [ + 'listing_id' => $listingId, + 'event_date' => $date, + 'start_time' => $startTime, + 'end_time' => $endTime, + 'status' => 'scheduled', + 'created_at' => Factory::getDate()->toSql(), + ]; + + $db->insertObject('#__mokosuiterealty_open_houses', $event, 'id'); + return (object) ['success' => true, 'open_house_id' => (int) $event->id]; + } + + public static function signIn(int $openHouseId, string $name, string $email, ?string $phone = null): object + { + $db = Factory::getContainer()->get(DatabaseInterface::class); + $filter = \Joomla\Filter\InputFilter::getInstance(); + + $visitor = (object) [ + 'open_house_id' => $openHouseId, + 'name' => $filter->clean($name, 'STRING'), + 'email' => $filter->clean($email, 'EMAIL'), + 'phone' => $phone ? $filter->clean($phone, 'STRING') : null, + 'signed_in_at' => Factory::getDate()->toSql(), + ]; + + $db->insertObject('#__mokosuiterealty_open_house_visitors', $visitor, 'id'); + return (object) ['success' => true, 'visitor_id' => (int) $visitor->id]; + } + + public static function getVisitors(int $openHouseId): array + { + $db = Factory::getContainer()->get(DatabaseInterface::class); + + $db->setQuery($db->getQuery(true) + ->select('*') + ->from('#__mokosuiterealty_open_house_visitors') + ->where('open_house_id = ' . (int) $openHouseId) + ->order('signed_in_at ASC')); + + return $db->loadObjectList() ?: []; + } + + public static function getUpcoming(int $days = 14): array + { + $db = Factory::getContainer()->get(DatabaseInterface::class); + + $db->setQuery($db->getQuery(true) + ->select('oh.*, l.address, l.city, l.price, cd.name AS agent_name') + ->select('(SELECT COUNT(*) FROM #__mokosuiterealty_open_house_visitors v WHERE v.open_house_id = oh.id) AS visitor_count') + ->from($db->quoteName('#__mokosuiterealty_open_houses', 'oh')) + ->join('INNER', $db->quoteName('#__mokosuiterealty_listings', 'l') . ' ON l.id = oh.listing_id') + ->join('LEFT', $db->quoteName('#__contact_details', 'cd') . ' ON cd.id = l.agent_id') + ->where('oh.event_date BETWEEN ' . $db->quote(date('Y-m-d')) . ' AND ' . $db->quote(date('Y-m-d', strtotime("+{$days} days")))) + ->where($db->quoteName('oh.status') . ' = ' . $db->quote('scheduled')) + ->order('oh.event_date ASC, oh.start_time ASC')); + + return $db->loadObjectList() ?: []; + } +}