Added: Sale & Purchase Returns Report
This commit is contained in:
parent
9577fd7f41
commit
823addf861
|
|
@ -5,14 +5,32 @@ namespace Modules\Reports\Http\Controllers;
|
|||
use Illuminate\Contracts\Support\Renderable;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
class ReportsController extends Controller
|
||||
{
|
||||
|
||||
public function salesReport() {
|
||||
abort_if(Gate::denies('access_sales_report'), 403);
|
||||
|
||||
return view('reports::sales.index');
|
||||
}
|
||||
|
||||
public function purchasesReport() {
|
||||
abort_if(Gate::denies('access_purchases_report'), 403);
|
||||
|
||||
return view('reports::purchases.index');
|
||||
}
|
||||
|
||||
public function salesReturnReport() {
|
||||
abort_if(Gate::denies('access_sales_return_report'), 403);
|
||||
|
||||
return view('reports::sales-return.index');
|
||||
}
|
||||
|
||||
public function purchasesReturnReport() {
|
||||
abort_if(Gate::denies('access_purchases_return_report'), 403);
|
||||
|
||||
return view('reports::purchases-return.index');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Purchases Return Report')
|
||||
|
||||
@section('breadcrumb')
|
||||
<ol class="breadcrumb border-0 m-0">
|
||||
<li class="breadcrumb-item"><a href="{{ route('home') }}">Home</a></li>
|
||||
<li class="breadcrumb-item active">Purchases Return Report</li>
|
||||
</ol>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid">
|
||||
<livewire:reports.purchases-return-report :suppliers="\Modules\People\Entities\Supplier::all()"/>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@section('title', 'Sales Return Report')
|
||||
|
||||
@section('breadcrumb')
|
||||
<ol class="breadcrumb border-0 m-0">
|
||||
<li class="breadcrumb-item"><a href="{{ route('home') }}">Home</a></li>
|
||||
<li class="breadcrumb-item active">Sales Return Report</li>
|
||||
</ol>
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid">
|
||||
<livewire:reports.sales-return-report :customers="\Modules\People\Entities\Customer::all()"/>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
@ -18,4 +18,10 @@ Route::group(['middleware' => 'auth'], function () {
|
|||
//Purchases Report
|
||||
Route::get('/purchases-report', 'ReportsController@purchasesReport')
|
||||
->name('purchases-report.index');
|
||||
//Sales Return Report
|
||||
Route::get('/sales-return-report', 'ReportsController@salesReturnReport')
|
||||
->name('sales-return-report.index');
|
||||
//Purchases Return Report
|
||||
Route::get('/purchases-return-report', 'ReportsController@purchasesReturnReport')
|
||||
->name('purchases-return-report.index');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Livewire\Reports;
|
||||
|
||||
use Livewire\Component;
|
||||
use Livewire\WithPagination;
|
||||
use Modules\PurchasesReturn\Entities\PurchaseReturn;
|
||||
|
||||
class PurchasesReturnReport extends Component
|
||||
{
|
||||
|
||||
|
||||
use WithPagination;
|
||||
|
||||
protected $paginationTheme = 'bootstrap';
|
||||
|
||||
public $suppliers;
|
||||
public $start_date;
|
||||
public $end_date;
|
||||
public $supplier_id;
|
||||
public $purchase_return_status;
|
||||
public $payment_status;
|
||||
|
||||
protected $rules = [
|
||||
'start_date' => 'required|date|before:end_date',
|
||||
'end_date' => 'required|date|after:start_date',
|
||||
];
|
||||
|
||||
public function mount($suppliers) {
|
||||
$this->suppliers = $suppliers;
|
||||
$this->start_date = today()->subDays(30)->format('Y-m-d');
|
||||
$this->end_date = today()->format('Y-m-d');
|
||||
$this->supplier_id = '';
|
||||
$this->purchase_return_status = '';
|
||||
$this->payment_status = '';
|
||||
}
|
||||
|
||||
public function render() {
|
||||
$purchase_returns = PurchaseReturn::whereDate('date', '>=', $this->start_date)
|
||||
->whereDate('date', '<=', $this->end_date)
|
||||
->when($this->supplier_id, function ($query) {
|
||||
return $query->where('supplier_id', $this->supplier_id);
|
||||
})
|
||||
->when($this->purchase_return_status, function ($query) {
|
||||
return $query->where('status', $this->purchase_return_status);
|
||||
})
|
||||
->when($this->payment_status, function ($query) {
|
||||
return $query->where('payment_status', $this->payment_status);
|
||||
})
|
||||
->orderBy('date', 'desc')->paginate(10);
|
||||
|
||||
return view('livewire.reports.purchases-return-report', [
|
||||
'purchase_returns' => $purchase_returns
|
||||
]);
|
||||
}
|
||||
|
||||
public function generateReport() {
|
||||
$this->validate();
|
||||
$this->render();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Livewire\Reports;
|
||||
|
||||
use Livewire\Component;
|
||||
use Livewire\WithPagination;
|
||||
use Modules\SalesReturn\Entities\SaleReturn;
|
||||
|
||||
class SalesReturnReport extends Component
|
||||
{
|
||||
|
||||
use WithPagination;
|
||||
|
||||
protected $paginationTheme = 'bootstrap';
|
||||
|
||||
public $customers;
|
||||
public $start_date;
|
||||
public $end_date;
|
||||
public $customer_id;
|
||||
public $sale_return_status;
|
||||
public $payment_status;
|
||||
|
||||
protected $rules = [
|
||||
'start_date' => 'required|date|before:end_date',
|
||||
'end_date' => 'required|date|after:start_date',
|
||||
];
|
||||
|
||||
public function mount($customers) {
|
||||
$this->customers = $customers;
|
||||
$this->start_date = today()->subDays(30)->format('Y-m-d');
|
||||
$this->end_date = today()->format('Y-m-d');
|
||||
$this->customer_id = '';
|
||||
$this->sale_return_status = '';
|
||||
$this->payment_status = '';
|
||||
}
|
||||
|
||||
public function render() {
|
||||
$sale_returns = SaleReturn::whereDate('date', '>=', $this->start_date)
|
||||
->whereDate('date', '<=', $this->end_date)
|
||||
->when($this->customer_id, function ($query) {
|
||||
return $query->where('customer_id', $this->customer_id);
|
||||
})
|
||||
->when($this->sale_return_status, function ($query) {
|
||||
return $query->where('status', $this->sale_return_status);
|
||||
})
|
||||
->when($this->payment_status, function ($query) {
|
||||
return $query->where('payment_status', $this->payment_status);
|
||||
})
|
||||
->orderBy('date', 'desc')->paginate(10);
|
||||
|
||||
return view('livewire.reports.sales-return-report', [
|
||||
'sale_returns' => $sale_returns
|
||||
]);
|
||||
}
|
||||
|
||||
public function generateReport() {
|
||||
$this->validate();
|
||||
$this->render();
|
||||
}
|
||||
}
|
||||
|
|
@ -109,7 +109,7 @@
|
|||
@endcan
|
||||
|
||||
@can('access_purchase_returns')
|
||||
<li class="c-sidebar-nav-item c-sidebar-nav-dropdown {{ request()->routeIs('purchase-returns*') || request()->routeIs('purchase-return-payments*') ? 'c-show' : '' }}">
|
||||
<li class="c-sidebar-nav-item c-sidebar-nav-dropdown {{ request()->routeIs('purchase-returns.*') || request()->routeIs('purchase-return-payments.*') ? 'c-show' : '' }}">
|
||||
<a class="c-sidebar-nav-link c-sidebar-nav-dropdown-toggle" href="#">
|
||||
<i class="c-sidebar-nav-icon bi bi-arrow-return-right" style="line-height: 1;"></i> Purchase Returns
|
||||
</a>
|
||||
|
|
@ -157,7 +157,7 @@
|
|||
@endcan
|
||||
|
||||
@can('access_sale_returns')
|
||||
<li class="c-sidebar-nav-item c-sidebar-nav-dropdown {{ request()->routeIs('sale-returns*') || request()->routeIs('sale-return-payments*') ? 'c-show' : '' }}">
|
||||
<li class="c-sidebar-nav-item c-sidebar-nav-dropdown {{ request()->routeIs('sale-returns.*') || request()->routeIs('sale-return-payments.*') ? 'c-show' : '' }}">
|
||||
<a class="c-sidebar-nav-link c-sidebar-nav-dropdown-toggle" href="#">
|
||||
<i class="c-sidebar-nav-icon bi bi-arrow-return-left" style="line-height: 1;"></i> Sale Returns
|
||||
</a>
|
||||
|
|
@ -233,7 +233,7 @@
|
|||
</li>
|
||||
@endcan
|
||||
|
||||
@can('access_sales_report|access_purchases_report')
|
||||
@can('access_sales_report|access_purchases_report|access_sales_return_report|access_purchases_return_report')
|
||||
<li class="c-sidebar-nav-item c-sidebar-nav-dropdown {{ request()->routeIs('*-report.index') ? 'c-show' : '' }}">
|
||||
<a class="c-sidebar-nav-link c-sidebar-nav-dropdown-toggle" href="#">
|
||||
<i class="c-sidebar-nav-icon bi bi-graph-up" style="line-height: 1;"></i> Reports
|
||||
|
|
@ -253,6 +253,20 @@
|
|||
</a>
|
||||
</li>
|
||||
@endcan
|
||||
@can('access_sales_return_report')
|
||||
<li class="c-sidebar-nav-item">
|
||||
<a class="c-sidebar-nav-link {{ request()->routeIs('sales-return-report.index') ? 'c-active' : '' }}" href="{{ route('sales-return-report.index') }}">
|
||||
<i class="c-sidebar-nav-icon bi bi-clipboard-data" style="line-height: 1;"></i> Sales Return Report
|
||||
</a>
|
||||
</li>
|
||||
@endcan
|
||||
@can('access_purchases_return_report')
|
||||
<li class="c-sidebar-nav-item">
|
||||
<a class="c-sidebar-nav-link {{ request()->routeIs('purchases-return-report.index') ? 'c-active' : '' }}" href="{{ route('purchases-return-report.index') }}">
|
||||
<i class="c-sidebar-nav-icon bi bi-clipboard-data" style="line-height: 1;"></i> Purchases Return Report
|
||||
</a>
|
||||
</li>
|
||||
@endcan
|
||||
</ul>
|
||||
</li>
|
||||
@endcan
|
||||
|
|
|
|||
|
|
@ -0,0 +1,154 @@
|
|||
<div>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card border-0 shadow-sm">
|
||||
<div class="card-body">
|
||||
<form wire:submit.prevent="generateReport">
|
||||
<div class="form-row">
|
||||
<div class="col-lg-4">
|
||||
<div class="form-group">
|
||||
<label>Start Date <span class="text-danger">*</span></label>
|
||||
<input wire:model.defer="start_date" type="date" class="form-control" name="start_date">
|
||||
@error('start_date')
|
||||
<span class="text-danger mb-1">{{ $message }}</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="form-group">
|
||||
<label>End Date <span class="text-danger">*</span></label>
|
||||
<input wire:model.defer="end_date" type="date" class="form-control" name="end_date">
|
||||
@error('end_date')
|
||||
<span class="text-danger mb-1">{{ $message }}</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="form-group">
|
||||
<label>Supplier</label>
|
||||
<select wire:model.defer="supplier_id" class="form-control" name="supplier_id">
|
||||
<option value="">Select Supplier</option>
|
||||
@foreach($suppliers as $supplier)
|
||||
<option value="{{ $supplier->id }}">{{ $supplier->supplier_name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="col-lg-6">
|
||||
<div class="form-group">
|
||||
<label>Status</label>
|
||||
<select wire:model.defer="purchase_return_status" class="form-control" name="purchase_return_status">
|
||||
<option value="">Select Status</option>
|
||||
<option value="Pending">Pending</option>
|
||||
<option value="Shipped">Shipped</option>
|
||||
<option value="Completed">Completed</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="form-group">
|
||||
<label>Payment Status</label>
|
||||
<select wire:model.defer="payment_status" class="form-control" name="payment_status">
|
||||
<option value="">Select Payment Status</option>
|
||||
<option value="Paid">Paid</option>
|
||||
<option value="Unpaid">Unpaid</option>
|
||||
<option value="Partial">Partial</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mb-0">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<span wire:target="generateReport" wire:loading class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
||||
<i wire:target="generateReport" wire:loading.remove class="bi bi-shuffle"></i>
|
||||
Filter Report
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card border-0 shadow-sm">
|
||||
<div class="card-body">
|
||||
<table class="table table-bordered table-striped text-center mb-0">
|
||||
<div wire:loading.flex class="col-12 position-absolute justify-content-center align-items-center" style="top:0;right:0;left:0;bottom:0;background-color: rgba(255,255,255,0.5);z-index: 99;">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="sr-only">Loading...</span>
|
||||
</div>
|
||||
</div>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th>Reference</th>
|
||||
<th>Supplier</th>
|
||||
<th>Status</th>
|
||||
<th>Total</th>
|
||||
<th>Paid</th>
|
||||
<th>Due</th>
|
||||
<th>Payment Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($purchase_returns as $purchase_return)
|
||||
<tr>
|
||||
<td>{{ \Carbon\Carbon::parse($purchase_return->date)->format('d M, Y') }}</td>
|
||||
<td>{{ $purchase_return->reference }}</td>
|
||||
<td>{{ $purchase_return->supplier_name }}</td>
|
||||
<td>
|
||||
@if ($purchase_return->status == 'Pending')
|
||||
<span class="badge badge-info">
|
||||
{{ $purchase_return->status }}
|
||||
</span>
|
||||
@elseif ($purchase_return->status == 'Shipped')
|
||||
<span class="badge badge-primary">
|
||||
{{ $purchase_return->status }}
|
||||
</span>
|
||||
@else
|
||||
<span class="badge badge-success">
|
||||
{{ $purchase_return->status }}
|
||||
</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ format_currency($purchase_return->total_amount) }}</td>
|
||||
<td>{{ format_currency($purchase_return->paid_amount) }}</td>
|
||||
<td>{{ format_currency($purchase_return->due_amount) }}</td>
|
||||
<td>
|
||||
@if ($purchase_return->payment_status == 'Partial')
|
||||
<span class="badge badge-warning">
|
||||
{{ $purchase_return->payment_status }}
|
||||
</span>
|
||||
@elseif ($purchase_return->payment_status == 'Paid')
|
||||
<span class="badge badge-success">
|
||||
{{ $purchase_return->payment_status }}
|
||||
</span>
|
||||
@else
|
||||
<span class="badge badge-danger">
|
||||
{{ $purchase_return->payment_status }}
|
||||
</span>
|
||||
@endif
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="8">
|
||||
<span class="text-danger">No Purchase Return Data Available!</span>
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
<div @class(['mt-3' => $purchase_returns->hasPages()])>
|
||||
{{ $purchase_returns->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
<div class="col-lg-6">
|
||||
<div class="form-group">
|
||||
<label>Payment Status</label>
|
||||
<select wire:model.defer="sale_status" class="form-control" name="payment_status">
|
||||
<select wire:model.defer="payment_status" class="form-control" name="payment_status">
|
||||
<option value="">Select Payment Status</option>
|
||||
<option value="Paid">Paid</option>
|
||||
<option value="Unpaid">Unpaid</option>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,154 @@
|
|||
<div>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card border-0 shadow-sm">
|
||||
<div class="card-body">
|
||||
<form wire:submit.prevent="generateReport">
|
||||
<div class="form-row">
|
||||
<div class="col-lg-4">
|
||||
<div class="form-group">
|
||||
<label>Start Date <span class="text-danger">*</span></label>
|
||||
<input wire:model.defer="start_date" type="date" class="form-control" name="start_date">
|
||||
@error('start_date')
|
||||
<span class="text-danger mb-1">{{ $message }}</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="form-group">
|
||||
<label>End Date <span class="text-danger">*</span></label>
|
||||
<input wire:model.defer="end_date" type="date" class="form-control" name="end_date">
|
||||
@error('end_date')
|
||||
<span class="text-danger mb-1">{{ $message }}</span>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="form-group">
|
||||
<label>Customer</label>
|
||||
<select wire:model.defer="customer_id" class="form-control" name="customer_id">
|
||||
<option value="">Select Customer</option>
|
||||
@foreach($customers as $customer)
|
||||
<option value="{{ $customer->id }}">{{ $customer->customer_name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="col-lg-6">
|
||||
<div class="form-group">
|
||||
<label>Status</label>
|
||||
<select wire:model.defer="sale_return_status" class="form-control" name="sale_return_status">
|
||||
<option value="">Select Status</option>
|
||||
<option value="Pending">Pending</option>
|
||||
<option value="Shipped">Shipped</option>
|
||||
<option value="Completed">Completed</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="form-group">
|
||||
<label>Payment Status</label>
|
||||
<select wire:model.defer="payment_status" class="form-control" name="payment_status">
|
||||
<option value="">Select Payment Status</option>
|
||||
<option value="Paid">Paid</option>
|
||||
<option value="Unpaid">Unpaid</option>
|
||||
<option value="Partial">Partial</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mb-0">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<span wire:target="generateReport" wire:loading class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
||||
<i wire:target="generateReport" wire:loading.remove class="bi bi-shuffle"></i>
|
||||
Filter Report
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card border-0 shadow-sm">
|
||||
<div class="card-body">
|
||||
<table class="table table-bordered table-striped text-center mb-0">
|
||||
<div wire:loading.flex class="col-12 position-absolute justify-content-center align-items-center" style="top:0;right:0;left:0;bottom:0;background-color: rgba(255,255,255,0.5);z-index: 99;">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="sr-only">Loading...</span>
|
||||
</div>
|
||||
</div>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th>Reference</th>
|
||||
<th>Customer</th>
|
||||
<th>Status</th>
|
||||
<th>Total</th>
|
||||
<th>Paid</th>
|
||||
<th>Due</th>
|
||||
<th>Payment Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($sale_returns as $sale_return)
|
||||
<tr>
|
||||
<td>{{ \Carbon\Carbon::parse($sale_return->date)->format('d M, Y') }}</td>
|
||||
<td>{{ $sale_return->reference }}</td>
|
||||
<td>{{ $sale_return->customer_name }}</td>
|
||||
<td>
|
||||
@if ($sale_return->status == 'Pending')
|
||||
<span class="badge badge-info">
|
||||
{{ $sale_return->status }}
|
||||
</span>
|
||||
@elseif ($sale_return->status == 'Shipped')
|
||||
<span class="badge badge-primary">
|
||||
{{ $sale_return->status }}
|
||||
</span>
|
||||
@else
|
||||
<span class="badge badge-success">
|
||||
{{ $sale_return->status }}
|
||||
</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ format_currency($sale_return->total_amount) }}</td>
|
||||
<td>{{ format_currency($sale_return->paid_amount) }}</td>
|
||||
<td>{{ format_currency($sale_return->due_amount) }}</td>
|
||||
<td>
|
||||
@if ($sale_return->payment_status == 'Partial')
|
||||
<span class="badge badge-warning">
|
||||
{{ $sale_return->payment_status }}
|
||||
</span>
|
||||
@elseif ($sale_return->payment_status == 'Paid')
|
||||
<span class="badge badge-success">
|
||||
{{ $sale_return->payment_status }}
|
||||
</span>
|
||||
@else
|
||||
<span class="badge badge-danger">
|
||||
{{ $sale_return->payment_status }}
|
||||
</span>
|
||||
@endif
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="8">
|
||||
<span class="text-danger">No Sale Return Data Available!</span>
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
<div @class(['mt-3' => $sale_returns->hasPages()])>
|
||||
{{ $sale_returns->links() }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Loading…
Reference in New Issue