%PDF- %PDF-
Direktori : /home/forge/api-takeaseat.eco-n-tech.co.uk/vendor/laravel/nova/src/Metrics/ |
Current File : //home/forge/api-takeaseat.eco-n-tech.co.uk/vendor/laravel/nova/src/Metrics/Value.php |
<?php namespace Laravel\Nova\Metrics; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Carbon; use Laravel\Nova\Nova; abstract class Value extends RangedMetric { /** * The element's component. * * @var string */ public $component = 'value-metric'; /** * The value's precision when rounding. * * @var int */ public $precision = 0; /** * Return a value result showing the growth of an count aggregate over time. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Database\Eloquent\Builder|string $model * @param \Illuminate\Database\Query\Expression|string|null $column * @param string|null $dateColumn * @return \Laravel\Nova\Metrics\ValueResult */ public function count($request, $model, $column = null, $dateColumn = null) { return $this->aggregate($request, $model, 'count', $column, $dateColumn); } /** * Return a value result showing the growth of an average aggregate over time. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Database\Eloquent\Builder|string $model * @param \Illuminate\Database\Query\Expression|string $column * @param string|null $dateColumn * @return \Laravel\Nova\Metrics\ValueResult */ public function average($request, $model, $column, $dateColumn = null) { return $this->aggregate($request, $model, 'avg', $column, $dateColumn); } /** * Return a value result showing the growth of a sum aggregate over time. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Database\Eloquent\Builder|string $model * @param \Illuminate\Database\Query\Expression|string $column * @param string|null $dateColumn * @return \Laravel\Nova\Metrics\ValueResult */ public function sum($request, $model, $column, $dateColumn = null) { return $this->aggregate($request, $model, 'sum', $column, $dateColumn); } /** * Return a value result showing the growth of a maximum aggregate over time. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Database\Eloquent\Builder|string $model * @param \Illuminate\Database\Query\Expression|string $column * @param string|null $dateColumn * @return \Laravel\Nova\Metrics\ValueResult */ public function max($request, $model, $column, $dateColumn = null) { return $this->aggregate($request, $model, 'max', $column, $dateColumn); } /** * Return a value result showing the growth of a minimum aggregate over time. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Database\Eloquent\Builder|string $model * @param \Illuminate\Database\Query\Expression|string $column * @param string|null $dateColumn * @return \Laravel\Nova\Metrics\ValueResult */ public function min($request, $model, $column, $dateColumn = null) { return $this->aggregate($request, $model, 'min', $column, $dateColumn); } /** * Return a value result showing the growth of a model over a given time frame. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Database\Eloquent\Builder|string $model * @param string $function * @param \Illuminate\Database\Query\Expression|string|null $column * @param string|null $dateColumn * @return \Laravel\Nova\Metrics\ValueResult */ protected function aggregate($request, $model, $function, $column = null, $dateColumn = null) { $query = $model instanceof Builder ? $model : (new $model)->newQuery(); $column = $column ?? $query->getModel()->getQualifiedKeyName(); if ($request->range === 'ALL') { return $this->result( round(with(clone $query)->{$function}($column), $this->precision) ); } $timezone = Nova::resolveUserTimezone($request) ?? $request->timezone; $previousValue = round(with(clone $query)->whereBetween( $dateColumn ?? $query->getModel()->getQualifiedCreatedAtColumn(), array_map(function ($datetime) { return $this->asQueryDatetime($datetime); }, $this->previousRange($request->range, $timezone)) )->{$function}($column), $this->precision); return $this->result( round(with(clone $query)->whereBetween( $dateColumn ?? $query->getModel()->getQualifiedCreatedAtColumn(), array_map(function ($datetime) { return $this->asQueryDatetime($datetime); }, $this->currentRange($request->range, $timezone)) )->{$function}($column), $this->precision) )->previous($previousValue); } /** * Calculate the previous range and calculate any short-cuts. * * @param string|int $range * @param string $timezone * @return array */ protected function previousRange($range, $timezone) { if ($range == 'TODAY') { return [ now($timezone)->modify('yesterday')->setTime(0, 0), today($timezone)->subSecond(1), ]; } if ($range == 'MTD') { return [ now($timezone)->modify('first day of previous month')->setTime(0, 0), now($timezone)->firstOfMonth()->subSecond(1), ]; } if ($range == 'QTD') { return $this->previousQuarterRange($timezone); } if ($range == 'YTD') { return [ now($timezone)->subYears(1)->firstOfYear()->setTime(0, 0), now($timezone)->firstOfYear()->subSecond(1), ]; } return [ now($timezone)->subDays($range * 2), now($timezone)->subDays($range)->subSecond(1), ]; } /** * Calculate the previous quarter range. * * @param string $timezone * * @return array */ protected function previousQuarterRange($timezone) { return [ Carbon::firstDayOfPreviousQuarter($timezone), Carbon::firstDayOfQuarter($timezone)->subSecond(1), ]; } /** * Calculate the current range and calculate any short-cuts. * * @param string|int $range * @param string $timezone * @return array */ protected function currentRange($range, $timezone) { if ($range == 'TODAY') { return [ today($timezone), now($timezone), ]; } if ($range == 'MTD') { return [ now($timezone)->firstOfMonth(), now($timezone), ]; } if ($range == 'QTD') { return $this->currentQuarterRange($timezone); } if ($range == 'YTD') { return [ now($timezone)->firstOfYear(), now($timezone), ]; } return [ now($timezone)->subDays($range), now($timezone), ]; } /** * Calculate the previous quarter range. * * @param string $timezone * * @return array */ protected function currentQuarterRange($timezone) { return [ Carbon::firstDayOfQuarter($timezone), now($timezone), ]; } /** * Set the precision level used when rounding the value. * * @param int $precision * @return $this */ public function precision($precision = 0) { $this->precision = $precision; return $this; } /** * Create a new value metric result. * * @param mixed $value * @return \Laravel\Nova\Metrics\ValueResult */ public function result($value) { return new ValueResult($value); } }