add graphs for stats

This commit is contained in:
ludo
2024-01-29 22:39:57 +01:00
parent 75107285e7
commit 9fcc81f4d9
7 changed files with 202 additions and 73 deletions

View File

@@ -30,24 +30,24 @@ class DateRange
public static function previousDay($nb = 1)
{
return [
'start' => Carbon::now()->subDay($nb)->startOfDay(),
'end' => Carbon::now()->subDay($nb)->endOfDay(),
'start' => Carbon::now()->subDays($nb)->startOfDay(),
'end' => Carbon::now()->subDays($nb)->endOfDay(),
];
}
public static function previousWeek($nb = 1)
{
return [
'start' => Carbon::now()->subWeek($nb)->startOfWeek(),
'end' => Carbon::now()->subWeek($nb)->endOfWeek(),
'start' => Carbon::now()->subWeeks($nb)->startOfWeek(),
'end' => Carbon::now()->subWeeks($nb)->endOfWeek(),
];
}
public static function previousMonth($nb = 1)
{
return [
'start' => Carbon::now()->subMonth($nb)->startOfMonth(),
'end' => Carbon::now()->subMonth($nb)->endOfMonth(),
'start' => Carbon::now()->subMonths($nb)->startOfMonth(),
'end' => Carbon::now()->subMonths($nb)->endOfMonth(),
];
}
@@ -79,7 +79,7 @@ class DateRange
public static function getPeriodsLastMonth($nb = 1, $withActual = true)
{
$end = $withActual ? Carbon::now()->endOfMonth() : self::lastMonth();
$begin = $nb === 1 ? $end->copy()->startOfMonth() : $end->copy()->startOfMonth()->subMonth($nb - 1);
$begin = $nb === 1 ? $end->copy()->startOfMonth() : $end->copy()->startOfMonth()->subMonths($nb - 1);
return self::getPeriodsByMonth($begin, $end);
}
@@ -108,7 +108,7 @@ class DateRange
public static function getPeriodsLastWeek($nb = 1, $withActual = true)
{
$end = $withActual ? Carbon::now()->endOfWeek() : self::lastWeek();
$begin = $end->copy()->subWeek($nb);
$begin = $end->copy()->subWeeks($nb);
return static::getPeriodsByWeek($begin, $end);
}
@@ -116,7 +116,7 @@ class DateRange
public static function getPeriodsLastDay($nb = 1, $withActual = true)
{
$end = $withActual ? Carbon::now()->endOfDay() : static::lastDay();
$begin = $end->copy()->subDay($nb);
$begin = $end->copy()->subDays($nb);
return static::getPeriodsByDay($begin, $end);
}
@@ -153,7 +153,7 @@ class DateRange
$date = Carbon::now()->startOfQuarter();
break;
case 4:
$date = Carbon::now()->subMonth(3)->startOfQuarter();
$date = Carbon::now()->subMonths(3)->startOfQuarter();
break;
default:
return false;
@@ -169,17 +169,17 @@ class DateRange
public static function lastMonth()
{
return Carbon::now()->subMonth()->startOfMonth();
return Carbon::now()->subMonths()->startOfMonth();
}
public static function lastWeek()
{
return Carbon::now()->subWeek()->startOfWeek();
return Carbon::now()->subWeeks()->startOfWeek();
}
public static function lastDay()
{
return Carbon::now()->subDay()->startOfDay();
return Carbon::now()->subDays()->startOfDay();
}
public static function getPeriodsByMonth($begin, $end, $interval = 1)

View File

@@ -7,12 +7,83 @@ use Illuminate\Database\Eloquent\Model;
trait DateStats
{
public static function countByMonth($prev = 0)
public static function sumDaily($field, $nbDays = 15, $fieldDate = 'created_at')
{
$start = Carbon::now()->startOfMonth($prev);
$end = Carbon::now()->endOfMonth($prev);
$periods = DateRange::getPeriodsLastDay($nbDays);
$values = self::sumPeriodly($periods, $field, $fieldDate);
return self::countByPeriod($start, $end);
return self::buildLabels($periods, $values, 'dd Do MMM');
}
public static function countDaily($nbDays = 15, $fieldDate = 'created_at')
{
$periods = DateRange::getPeriodsLastDay($nbDays);
$values = self::countPeriodly($periods, $fieldDate);
return self::buildLabels($periods, $values, 'dd Do MMM');
}
public static function sumMonthly($field, $fieldDate = 'created_at')
{
$periods = DateRange::getPeriodsLastMonth(12);
$values = self::sumPeriodly($periods, $field, $fieldDate);
return self::buildLabels($periods, $values, 'MMM YY');
}
public static function countMonthly($fieldDate = 'created_at')
{
$periods = DateRange::getPeriodsLastMonth(12);
$values = self::countPeriodly($periods, $fieldDate);
return self::buildLabels($periods, $values, 'MMM YY');
}
public static function buildLabels($periods, $values, $format = 'MMM YY')
{
$data = [];
foreach ($periods as $key => $period) {
$index = Carbon::parse($period->startDate)->isoFormat($format);
$data[$index] = $values[$key];
}
return $data;
}
public static function sumPeriodly($periods, $field, $fieldDate = 'created_at')
{
$data = [];
foreach ($periods as $period) {
$data[] = self::sumByPeriod($period->startDate, $period->endDate, $field, $fieldDate);
}
return $data;
}
public static function countPeriodly($periods, $fieldDate = 'created_at')
{
$data = [];
foreach ($periods as $period) {
$data[] = self::countByPeriod($period->startDate, $period->endDate, $fieldDate);
}
return $data;
}
public static function countByMonth($prev = 0, $field = 'created_at')
{
$start = Carbon::now()->subMonths($prev)->startOfMonth();
$end = Carbon::now()->subMonths($prev)->endOfMonth();
return self::countByPeriod($start, $end, $field);
}
public static function countByDay($prev = 0, $field = 'created_at')
{
$start = Carbon::now()->subDays($prev)->startOfMonth();
$end = Carbon::now()->subDays($prev)->endOfMonth();
return self::countByPeriod($start, $end, $field);
}
public static function countByPeriod($start, $end, $field = 'created_at')
@@ -20,32 +91,48 @@ trait DateStats
return self::getModel()->whereBetween($field, [$start, $end])->count();
}
public static function avgByMonth($prev = 0, $field = false)
public static function avgByMonth($field, $prev = 0, $fieldDate = 'created_at')
{
$start = Carbon::now()->startOfMonth($prev);
$end = Carbon::now()->endOfMonth($prev);
$start = Carbon::now()->subMonths($prev)->startOfMonth();
$end = Carbon::now()->subMonths($prev)->endOfMonth();
return self::avgByPeriod($start, $end, $field);
return self::avgByPeriod($start, $end, $field, $fieldDate);
}
public static function avgByPeriod($start, $end, $field)
public static function avgByDay($field, $prev = 0, $fieldDate = 'created_at')
{
$start = Carbon::now()->subDays($prev)->startOfMonth();
$end = Carbon::now()->subDays($prev)->endOfMonth();
return self::avgByPeriod($start, $end, $field, $fieldDate);
}
public static function avgByPeriod($start, $end, $field, $fieldDate = 'created_at')
{
$c = self::countByPeriod($start, $end);
return $c ? round(self::sumByPeriod($start, $end, $field) / $c, 2) : 0;
return $c ? round(self::sumByPeriod($start, $end, $field, $fieldDate) / $c, 2) : 0;
}
public static function sumByMonth($prev = 0, $field = false)
public static function sumByMonth($field, $prev = 0, $fieldDate = 'created_at')
{
$start = Carbon::now()->startOfMonth($prev);
$end = Carbon::now()->endOfMonth($prev);
$start = Carbon::now()->subMonths($prev)->startOfMonth();
$end = Carbon::now()->subMonths($prev)->endOfMonth();
return self::sumByPeriod($start, $end, $field);
return self::sumByPeriod($start, $end, $field, $fieldDate);
}
public static function sumByPeriod($start, $end, $field = 'created_at')
public static function sumByDay($field, $prev = 0, $fieldDate = 'created_at')
{
return self::getModel()->whereBetween($field, [$start, $end])->sum($field);
$start = Carbon::now()->subDays($prev)->startOfDay();
$end = Carbon::now()->subDays($prev)->endOfDay();
return self::sumByPeriod($start, $end, $field, $fieldDate);
}
public static function sumByPeriod($start, $end, $field, $fieldDate = 'created_at')
{
return self::getModel()->whereBetween($fieldDate, [$start, $end])->sum($field);
}
public static function getModel()