diff($from)->format("%a"); if ($numDays > 62 && $numDays <= 92) { return static::$weekly; } else if ($numDays > 92) { return static::$monthly; } return static::$daily; } protected function prepareSelect($frequency, $dateField = 'created_at') { $select = [ fluentCrmDb()->raw('COUNT(id) AS count'), fluentCrmDb()->raw('DATE(' . $dateField . ') AS date') ]; if ($frequency == static::$weekly) { $select[] = fluentCrmDb()->raw('WEEK(' . $dateField . ') week'); } else if ($frequency == static::$monthly) { // Keep existing month for backward compatibility $select[] = fluentCrmDb()->raw('MONTH(' . $dateField . ') AS month'); // Correct quoting and add year-month key to disambiguate months across years $select[] = fluentCrmDb()->raw("DATE_FORMAT($dateField, '%Y-%m') AS ym"); } return $select; } protected function getGroupAndOrder($frequency) { $orderBy = $groupBy = 'date'; if ($frequency == static::$weekly) { $orderBy = $groupBy = 'week'; } else if ($frequency == static::$monthly) { $orderBy = $groupBy = 'ym'; } return [$groupBy, $orderBy]; } protected function getDateRangeArray($period) { $range = []; $formatter = 'basicFormatter'; if ($this->isMonthly($period)) { $formatter = 'monYearFormatter'; } foreach ($period as $date) { $date = $this->{$formatter}($date); $range[$date] = 0; } return $range; } protected function getResult($period, $items) { $range = $this->getDateRangeArray($period); $formatter = 'basicFormatter'; if ($this->isMonthly($period)) { $formatter = 'monYearFormatter'; } foreach ($items as $item) { $date = $this->{$formatter}($item->date); $range[$date] = (int)$item->count; } return $range; } protected function isMonthly($period) { return !!$period->getDateInterval()->m; } protected function basicFormatter($date) { if (is_string($date)) { $date = new \DateTime($date); } return $date->format('Y-m-d'); } protected function monYearFormatter($date) { if (is_string($date)) { $date = new \DateTime($date); } return $date->format('M Y'); } }