Added invoice data widget chart
This commit is contained in:
271
app/Filament/Widgets/InvoiceDataChart.php
Normal file
271
app/Filament/Widgets/InvoiceDataChart.php
Normal file
@@ -0,0 +1,271 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Filament\Widgets;
|
||||||
|
|
||||||
|
use App\Models\InvoiceDataValidation;
|
||||||
|
use App\Models\InvoiceOutValidation;
|
||||||
|
use App\Models\InvoiceValidation;
|
||||||
|
use Filament\Widgets\ChartWidget;
|
||||||
|
use Filament\Support\RawJs;
|
||||||
|
|
||||||
|
class InvoiceDataChart extends ChartWidget
|
||||||
|
{
|
||||||
|
protected static ?string $heading = 'Chart';
|
||||||
|
|
||||||
|
protected function getData(): array
|
||||||
|
{
|
||||||
|
$selectedPlant = session('selected_plant');
|
||||||
|
$selectedDistribution = session(key: 'dist_channel');
|
||||||
|
$activeFilter = $this->filter;
|
||||||
|
|
||||||
|
if (!$selectedPlant || !$selectedDistribution) {
|
||||||
|
return [
|
||||||
|
'datasets' => [],
|
||||||
|
'labels' => [],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($activeFilter == 'yesterday') {
|
||||||
|
$startDate = now()->subDay()->setTime(8, 0, 0);
|
||||||
|
$endDate = now()->setTime(8, 0, 0);
|
||||||
|
$groupBy = 'none'; // No grouping by hour
|
||||||
|
} elseif ($activeFilter == 'this_week') {
|
||||||
|
$startDate = now()->startOfWeek()->setTime(8, 0, 0);
|
||||||
|
$endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
|
||||||
|
$groupBy = 'day_of_week';
|
||||||
|
} elseif ($activeFilter == 'this_month') {
|
||||||
|
$startDate = now()->startOfMonth()->setTime(8, 0, 0);
|
||||||
|
$endDate = now()->endOfMonth()->setTime(8, 0, 0);
|
||||||
|
$groupBy = 'week_of_month';
|
||||||
|
} else {
|
||||||
|
$startDate = now()->setTime(8, 0, 0);
|
||||||
|
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
|
||||||
|
$groupBy = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($selectedDistribution == 'Direct Sale')
|
||||||
|
{
|
||||||
|
|
||||||
|
$totalInvoices = InvoiceDataValidation::where('plant_id', $selectedPlant)
|
||||||
|
->where('distribution_channel_desc', $selectedDistribution)
|
||||||
|
->whereBetween('document_date', [$startDate, $endDate])
|
||||||
|
->distinct('document_number')
|
||||||
|
->pluck('document_number')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
if (empty($totalInvoices)) {
|
||||||
|
return [
|
||||||
|
'labels' => ['Total', 'Went Out', 'Pending'],
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'label' => 'Invoice Count',
|
||||||
|
'data' => [0, 0, 0],
|
||||||
|
'backgroundColor' => ['#60A5FA', '#34D399', '#F87171'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$wentOutInvoices = InvoiceOutValidation::where('plant_id', $selectedPlant)
|
||||||
|
->whereIn('qr_code', $totalInvoices)
|
||||||
|
->whereBetween('scanned_at', [$startDate, $endDate])
|
||||||
|
->distinct('qr_code')
|
||||||
|
->pluck('qr_code')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$totalCount = count($totalInvoices);
|
||||||
|
$wentOutCount = count($wentOutInvoices);
|
||||||
|
$pendingCount = $totalCount - $wentOutCount;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => ['Total Invoices', 'Went Out', 'Pending'],
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'label' => ucfirst(str_replace('_', ' ', $activeFilter)),
|
||||||
|
'data' => [$totalCount, $wentOutCount, $pendingCount],
|
||||||
|
'backgroundColor' => ['#60A5FA', '#34D399', '#F87171'], // blue, green, red
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
elseif ($selectedDistribution == 'Branch Sale')
|
||||||
|
{
|
||||||
|
$totalInvoices = InvoiceDataValidation::where('plant_id', $selectedPlant)
|
||||||
|
->where('distribution_channel_desc', $selectedDistribution)
|
||||||
|
->whereBetween('document_date', [$startDate, $endDate])
|
||||||
|
->distinct('document_number')
|
||||||
|
->pluck('document_number')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
if (empty($totalInvoices)) {
|
||||||
|
return [
|
||||||
|
'labels' => ['Total', 'Went Out', 'Pending'],
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'label' => 'Invoice Count',
|
||||||
|
'data' => [0, 0, 0],
|
||||||
|
'backgroundColor' => ['#60A5FA', '#34D399', '#F87171'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$wentOutInvoices = InvoiceOutValidation::where('plant_id', $selectedPlant)
|
||||||
|
->whereIn('qr_code', $totalInvoices)
|
||||||
|
->whereBetween('scanned_at', [$startDate, $endDate])
|
||||||
|
->distinct('qr_code')
|
||||||
|
->pluck('qr_code')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$totalCount = count($totalInvoices);
|
||||||
|
$wentOutCount = count($wentOutInvoices);
|
||||||
|
$pendingCount = $totalCount - $wentOutCount;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => ['Total Invoices', 'Went Out', 'Pending'],
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'label' => ucfirst(str_replace('_', ' ', $activeFilter)),
|
||||||
|
'data' => [$totalCount, $wentOutCount, $pendingCount],
|
||||||
|
'backgroundColor' => ['#60A5FA', '#34D399', '#F87171'], // blue, green, red
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
elseif ($selectedDistribution == 'Internal Transfer')
|
||||||
|
{
|
||||||
|
$totalInvoices = InvoiceDataValidation::where('plant_id', $selectedPlant)
|
||||||
|
->where('distribution_channel_desc', $selectedDistribution)
|
||||||
|
->whereBetween('document_date', [$startDate, $endDate])
|
||||||
|
->distinct('document_number')
|
||||||
|
->pluck('document_number')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
if (empty($totalInvoices)) {
|
||||||
|
return [
|
||||||
|
'labels' => ['Total', 'Went Out', 'Pending'],
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'label' => 'Invoice Count',
|
||||||
|
'data' => [0, 0, 0],
|
||||||
|
'backgroundColor' => ['#60A5FA', '#34D399', '#F87171'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$wentOutInvoices = InvoiceOutValidation::where('plant_id', $selectedPlant)
|
||||||
|
->whereIn('qr_code', $totalInvoices)
|
||||||
|
->whereBetween('scanned_at', [$startDate, $endDate])
|
||||||
|
->distinct('qr_code')
|
||||||
|
->pluck('qr_code')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$totalCount = count($totalInvoices);
|
||||||
|
$wentOutCount = count($wentOutInvoices);
|
||||||
|
$pendingCount = $totalCount - $wentOutCount;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => ['Total Invoices', 'Went Out', 'Pending'],
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'label' => ucfirst(str_replace('_', ' ', $activeFilter)),
|
||||||
|
'data' => [$totalCount, $wentOutCount, $pendingCount],
|
||||||
|
'backgroundColor' => ['#60A5FA', '#34D399', '#F87171'], // blue, green, red
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
elseif ($selectedDistribution == 'Challan')
|
||||||
|
{
|
||||||
|
$totalInvoices = InvoiceDataValidation::where('plant_id', $selectedPlant)
|
||||||
|
->where('distribution_channel_desc', $selectedDistribution)
|
||||||
|
->whereBetween('document_date', [$startDate, $endDate])
|
||||||
|
->distinct('document_number')
|
||||||
|
->pluck('document_number')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
if (empty($totalInvoices)) {
|
||||||
|
return [
|
||||||
|
'labels' => ['Total', 'Went Out', 'Pending'],
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'label' => 'Invoice Count',
|
||||||
|
'data' => [0, 0, 0],
|
||||||
|
'backgroundColor' => ['#60A5FA', '#34D399', '#F87171'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$wentOutInvoices = InvoiceOutValidation::where('plant_id', $selectedPlant)
|
||||||
|
->whereIn('qr_code', $totalInvoices)
|
||||||
|
->whereBetween('scanned_at', [$startDate, $endDate])
|
||||||
|
->distinct('qr_code')
|
||||||
|
->pluck('qr_code')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$totalCount = count($totalInvoices);
|
||||||
|
$wentOutCount = count($wentOutInvoices);
|
||||||
|
$pendingCount = $totalCount - $wentOutCount;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => ['Total Invoices', 'Went Out', 'Pending'],
|
||||||
|
'datasets' => [
|
||||||
|
[
|
||||||
|
'label' => ucfirst(str_replace('_', ' ', $activeFilter)),
|
||||||
|
'data' => [$totalCount, $wentOutCount, $pendingCount],
|
||||||
|
'backgroundColor' => ['#60A5FA', '#34D399', '#F87171'], // blue, green, red
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getFilters(): ?array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'today' => 'Today',
|
||||||
|
'yesterday' => 'Yesterday',
|
||||||
|
'this_week'=> 'This Week',
|
||||||
|
'this_month'=> 'This Month',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getType(): string
|
||||||
|
{
|
||||||
|
return 'bar';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getOptions(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 'plugins' => [
|
||||||
|
// 'datalabels' => false,
|
||||||
|
// ],
|
||||||
|
'plugins' => [
|
||||||
|
'datalabels' => [
|
||||||
|
'anchor' => 'start', // Positions the label relative to the top of the bar
|
||||||
|
'align' => 'start', // Aligns the label above the bar
|
||||||
|
'offset' => -15, // Adjust if needed (positive moves up, negative moves down)
|
||||||
|
'color' => '#000',
|
||||||
|
'font' => [
|
||||||
|
'weight' => 'bold',
|
||||||
|
],
|
||||||
|
'formatter' => RawJs::make('function(value) {
|
||||||
|
return value;
|
||||||
|
}'),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'scales' => [
|
||||||
|
'y' => [
|
||||||
|
'beginAtZero' => true, //Start Y-axis from 0
|
||||||
|
'ticks' => [
|
||||||
|
'stepSize' => 0.5,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user