|
@@ -16,7 +16,7 @@ class AnalyticsSentimentDashboardModel
|
|
|
public function getDashboardData(int $companyId, array $queryParams): array
|
|
public function getDashboardData(int $companyId, array $queryParams): array
|
|
|
{
|
|
{
|
|
|
$filters = $this->normalizeFilters($queryParams);
|
|
$filters = $this->normalizeFilters($queryParams);
|
|
|
- $summaryRange = $this->resolveRange($filters['timeframe']);
|
|
|
|
|
|
|
+ $summaryRange = $this->resolveRange($filters);
|
|
|
|
|
|
|
|
return [
|
|
return [
|
|
|
'summaryCards' => $this->getSummaryCards($companyId, $filters, $summaryRange),
|
|
'summaryCards' => $this->getSummaryCards($companyId, $filters, $summaryRange),
|
|
@@ -33,7 +33,22 @@ class AnalyticsSentimentDashboardModel
|
|
|
private function normalizeFilters(array $queryParams): array
|
|
private function normalizeFilters(array $queryParams): array
|
|
|
{
|
|
{
|
|
|
$timeframe = strtolower(trim((string) ($queryParams['timeframe'] ?? 'week')));
|
|
$timeframe = strtolower(trim((string) ($queryParams['timeframe'] ?? 'week')));
|
|
|
- if (!in_array($timeframe, ['day', 'week', 'month'], true)) {
|
|
|
|
|
|
|
+ if (!in_array($timeframe, ['day', 'week', 'month', 'custom'], true)) {
|
|
|
|
|
+ $timeframe = 'week';
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Intervalo personalizado: aceita start_date/end_date no formato YYYY-MM-DD.
|
|
|
|
|
+ // Se as datas forem válidas, o timeframe é tratado como "custom" mesmo que
|
|
|
|
|
+ // não tenha sido enviado explicitamente.
|
|
|
|
|
+ $customStart = $this->parseDate((string) ($queryParams['start_date'] ?? ''));
|
|
|
|
|
+ $customEnd = $this->parseDate((string) ($queryParams['end_date'] ?? ''));
|
|
|
|
|
+ if ($customStart !== null && $customEnd !== null) {
|
|
|
|
|
+ $timeframe = 'custom';
|
|
|
|
|
+ if ($customEnd < $customStart) {
|
|
|
|
|
+ [$customStart, $customEnd] = [$customEnd, $customStart];
|
|
|
|
|
+ }
|
|
|
|
|
+ } elseif ($timeframe === 'custom') {
|
|
|
|
|
+ // "custom" sem datas válidas cai para o padrão semanal.
|
|
|
$timeframe = 'week';
|
|
$timeframe = 'week';
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -51,24 +66,49 @@ class AnalyticsSentimentDashboardModel
|
|
|
'timeframe' => $timeframe,
|
|
'timeframe' => $timeframe,
|
|
|
'sentiment' => $sentiment,
|
|
'sentiment' => $sentiment,
|
|
|
'aspect' => $aspect !== null ? mb_strtolower($aspect) : null,
|
|
'aspect' => $aspect !== null ? mb_strtolower($aspect) : null,
|
|
|
|
|
+ 'custom_start' => $customStart,
|
|
|
|
|
+ 'custom_end' => $customEnd,
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private function resolveRange(string $timeframe): array
|
|
|
|
|
|
|
+ private function parseDate(string $value): ?\DateTimeImmutable
|
|
|
|
|
+ {
|
|
|
|
|
+ $value = trim($value);
|
|
|
|
|
+ if ($value === '') {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $date = \DateTimeImmutable::createFromFormat('!Y-m-d', $value);
|
|
|
|
|
+ $errors = \DateTimeImmutable::getLastErrors();
|
|
|
|
|
+ if ($date === false || ($errors !== false && ($errors['warning_count'] > 0 || $errors['error_count'] > 0))) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return $date;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private function resolveRange(array $filters): array
|
|
|
{
|
|
{
|
|
|
$today = new \DateTimeImmutable('today');
|
|
$today = new \DateTimeImmutable('today');
|
|
|
|
|
+ $timeframe = $filters['timeframe'];
|
|
|
|
|
|
|
|
- if ($timeframe === 'day') {
|
|
|
|
|
- $start = $today;
|
|
|
|
|
- } elseif ($timeframe === 'month') {
|
|
|
|
|
- $start = $today->modify('-29 days');
|
|
|
|
|
|
|
+ if ($timeframe === 'custom' && $filters['custom_start'] !== null && $filters['custom_end'] !== null) {
|
|
|
|
|
+ $start = $filters['custom_start'];
|
|
|
|
|
+ $end = $filters['custom_end'];
|
|
|
} else {
|
|
} else {
|
|
|
- $start = $today->modify('-6 days');
|
|
|
|
|
|
|
+ if ($timeframe === 'day') {
|
|
|
|
|
+ $start = $today;
|
|
|
|
|
+ } elseif ($timeframe === 'month') {
|
|
|
|
|
+ $start = $today->modify('-29 days');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $start = $today->modify('-6 days');
|
|
|
|
|
+ }
|
|
|
|
|
+ $end = $today;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return [
|
|
return [
|
|
|
'start_datetime' => $start->format('Y-m-d 00:00:00'),
|
|
'start_datetime' => $start->format('Y-m-d 00:00:00'),
|
|
|
- 'end_exclusive_datetime' => $today->modify('+1 day')->format('Y-m-d 00:00:00'),
|
|
|
|
|
|
|
+ 'end_exclusive_datetime' => $end->modify('+1 day')->format('Y-m-d 00:00:00'),
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
|
|
|