* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. * @license GNU General Public License version 3 or later; see LICENSE * SPDX-License-Identifier: GPL-3.0-or-later */ namespace Joomla\Component\MokoSuiteCross\Administrator\Model; defined('_JEXEC') or die; use Joomla\CMS\MVC\Model\BaseDatabaseModel; class CalendarModel extends BaseDatabaseModel { /** * Get cross-post events for a given month, grouped by date. * * @param int $year Four-digit year * @param int $month Month number (1-12) * * @return array Associative array keyed by Y-m-d, each value an array of event objects */ public function getEvents(int $year, int $month): array { $db = $this->getDatabase(); $firstDay = sprintf('%04d-%02d-01', $year, $month); $lastDay = date('Y-m-t', strtotime($firstDay)); $dateExpr = 'COALESCE(' . $db->quoteName('p.scheduled_at') . ', ' . $db->quoteName('p.posted_at') . ', ' . $db->quoteName('p.created') . ')'; $query = $db->getQuery(true) ->select([ 'DATE(' . $dateExpr . ') AS event_date', $db->quoteName('p.status'), $db->quoteName('s.service_type'), $db->quoteName('c.title', 'article_title'), ]) ->from($db->quoteName('#__mokosuitecross_posts', 'p')) ->join('LEFT', $db->quoteName('#__mokosuitecross_services', 's') . ' ON ' . $db->quoteName('s.id') . ' = ' . $db->quoteName('p.service_id')) ->join('LEFT', $db->quoteName('#__content', 'c') . ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('p.article_id')) ->where('DATE(' . $dateExpr . ') >= ' . $db->quote($firstDay)) ->where('DATE(' . $dateExpr . ') <= ' . $db->quote($lastDay)) ->order('DATE(' . $dateExpr . ') ASC, ' . $db->quoteName('p.created') . ' ASC'); $db->setQuery($query); $rows = $db->loadObjectList() ?: []; $grouped = []; foreach ($rows as $row) { $grouped[$row->event_date][] = $row; } return $grouped; } }