How do I create a report?
To create a report, make a class that extends \Aero\Admin\Reports\Report.
For example, let's make a basic stock report.
First, let's make the report class, this defines the base query for our report:
class StockReport extends \Aero\Admin\Reports\Report
{
use \Aero\Admin\Reports\Traits\HasTables;
use \Aero\Admin\Reports\Traits\HasFilters;
use \Aero\Admin\Reports\Traits\CanExport;
protected static $exports = [
\Aero\Admin\Reports\Exporters\CSVExporter::class,
\Aero\Admin\Reports\Exporters\JSONExporter::class,
\Aero\Admin\Reports\Exporters\XMLExporter::class,
];
protected static $tables = [
// TODO
];
protected static $filters = [
// TODO
];
protected function newQuery(): \Illuminate\Database\Eloquent\Builder
{
return \Aero\Catalog\Models\Variant::query()
->select([
'variants.id',
'variants.sku',
'variants.stock_level',
])
->groupBy('variants.id');
}
}
Next, let's make a table class, this defines the UI of the report:
class StockReportTable extends \Aero\Admin\Reports\ReportTable
{
public function columns(): array
{
$positionStart = 0;
$positionIncrement = 10;
return [
\Aero\Admin\Reports\ReportTableColumn::create('SKU', function ($row) {
return $row->sku;
})
->position($positionStart = $positionStart + $positionIncrement)
->setSearchAction(function ($query, $search) {
$query->whereLower('sku', 'like', "%{$search}%");
}),
\Aero\Admin\Reports\ReportTableColumn::create('Stock', function ($row) {
return $row->stock_level;
})
->position($positionStart = $positionStart + $positionIncrement),
];
}
public function emptyMessage(): string
{
return 'No stock data';
}
}
Next, let's make a stock level filter:
class MinMaxStockFilter extends \Aero\Admin\Filters\MinMaxAdminFilter
{
public function handleMinMax($min, $max, $query): void
{
$query->whereBetween('stock_level', [$min, $max]);
}
public function title(): string
{
return 'Stock Level';
}
}
Finally, let's hook it all up on the report:
class StockReport extends \Aero\Admin\Reports\Report
{
use \Aero\Admin\Reports\Traits\HasTables;
use \Aero\Admin\Reports\Traits\HasFilters;
use \Aero\Admin\Reports\Traits\CanExport;
protected static $exports = [
\Aero\Admin\Reports\Exporters\CSVExporter::class,
\Aero\Admin\Reports\Exporters\JSONExporter::class,
\Aero\Admin\Reports\Exporters\XMLExporter::class,
];
protected static $tables = [
\Aerocargo\Acme\Tables\StockReportTable::class,
];
protected static $filters = [
\Aerocargo\Acme\Filters\MinMaxStockFilter::class,
];
protected function newQuery(): \Illuminate\Database\Eloquent\Builder
{
return \Aero\Catalog\Models\Variant::query()
->select([
'variants.id',
'variants.sku',
'variants.stock_level',
])
->groupBy('variants.id');
}
}
And register it so that it shows on the Reports index page:
\Aero\Admin\AdminReport::create(\Aerocargo\Acme\StockReport::class)
->title('Stock Report')
->summary('Stock report for all products');