Files
basicdata/app/Http/Controllers/BranchController.php
Daeng Deni Mardaeni 0bb12812a5 feat(branch): tambahkan fitur filter dan search pada eksport dan tabel cabang
- Menambahkan parameter `search` dan `parent_id` pada `BranchExport` untuk mendukung fitur filter.
- Memodifikasi method `collection` di `BranchExport` agar mendukung filter pencarian dan parent cabang.
- Memperbaiki issue pada method `collection` terkait penggunaan query `LOWER` untuk pencarian.
- Mengubah method `export` di `BranchController` agar menerima parameter filter dari request.
- Menambahkan logika filtering untuk `search` dan `parent_id` pada method index API `BranchController`.
- Menambahkan dropdown filter parent di tampilan `branch/index.blade.php`.
- Implementasi JavaScript di `branch/index.blade.php` untuk mendukung filter pencarian dan parent cabang.
  - Menambahkan logika sinkronisasi URL eksport dengan parameter filter.
  - Menambahkan event listener untuk filter pencarian dan dropdown parent.
  - Menambahkan validasi agar filter diterapkan ke datatable dan URL eksport secara dinamis.
- Memperbaiki penghitungan halaman pagination di datatable.
- Penyesuaian minor pada model Branch dan cara logging aktivitas di model Base.

Fitur ini memungkinkan pengguna melakukan filter data cabang berdasarkan pencarian dan parent cabang saat menampilkan tabel ataupun mengekspor data ke Excel.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-05-19 08:56:44 +07:00

272 lines
10 KiB
PHP

<?php
namespace Modules\Basicdata\Http\Controllers;
use App\Http\Controllers\Controller;
use Exception;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Basicdata\Exports\BranchExport;
use Modules\Basicdata\Http\Requests\BranchRequest;
use Modules\Basicdata\Models\Branch;
class BranchController extends Controller
{
protected $user;
public function __construct()
{
$this->user = auth()->user();
}
public function index()
{
// Check if the authenticated user has the required permission to view branches
if (is_null($this->user) || !$this->user->can('basic-data.read')) {
abort(403, 'Sorry! You are not allowed to view branches.');
}
return view('basicdata::branch.index');
}
public function store(BranchRequest $request)
{
// Check if the authenticated user has the required permission to create branches
if (is_null($this->user) || !$this->user->can('basic-data.create')) {
abort(403, 'Sorry! You are not allowed to create branches.');
}
$validate = $request->validated();
if ($validate) {
try {
// Save to database
Branch::create($validate);
return redirect()
->route('basicdata.branch.index')
->with('success', 'Branch created successfully');
} catch (Exception $e) {
return redirect()
->route('basicdata.branch.create')
->with('error', 'Failed to create branch');
}
}
}
public function create()
{
// Check if the authenticated user has the required permission to create branches
if (is_null($this->user) || !$this->user->can('basic-data.create')) {
abort(403, 'Sorry! You are not allowed to create branches.');
}
$branches = Branch::all();
return view('basicdata::branch.create', compact('branches'));
}
public function edit($id)
{
// Check if the authenticated user has the required permission to update branches
if (is_null($this->user) || !$this->user->can('basic-data.update')) {
abort(403, 'Sorry! You are not allowed to update branches.');
}
$branch = Branch::findOrFail($id);
$branches = Branch::all();
return view('basicdata::branch.create', compact('branch', 'branches'));
}
public function update(BranchRequest $request, $id)
{
// Check if the authenticated user has the required permission to update branches
if (is_null($this->user) || !$this->user->can('basic-data.update')) {
abort(403, 'Sorry! You are not allowed to update branches.');
}
$validate = $request->validated();
// Tambahkan validasi manual untuk memeriksa parent_id
if (isset($validate['parent_id']) && $validate['parent_id'] == $id) {
return redirect()
->back()
->withInput()
->withErrors(['parent_id' => 'Cabang tidak dapat menjadi induk dari dirinya sendiri.']);
}
if ($validate) {
try {
// Update in database
$branch = Branch::find($id);
$branch->update($validate);
return redirect()
->route('basicdata.branch.index')
->with('success', 'Branch updated successfully');
} catch (Exception $e) {
return redirect()
->route('basicdata.branch.edit', $id)
->with('error', 'Failed to update branch');
}
}
}
public function destroy($id)
{
// Check if the authenticated user has the required permission to delete branches
if (is_null($this->user) || !$this->user->can('basic-data.delete')) {
return response()->json([
'success' => false,
'message' => 'Sorry! You are not allowed to delete branches.'
], 403);
}
try {
// Find the branch
$branch = Branch::find($id);
// Check if the branch has children
if ($branch->children()->exists()) {
return response()->json([
'success' => false,
'message' => 'Cabang dengan anak cabang tidak dapat dihapus.'
], 422);
}
// Delete from database
$branch->delete();
return response()->json(['success' => true, 'message' => 'Branch deleted successfully']);
} catch (Exception $e) {
return response()->json(['success' => false, 'message' => 'Failed to delete branch']);
}
}
public function deleteMultiple(Request $request)
{
// Check if the authenticated user has the required permission to delete branches
if (is_null($this->user) || !$this->user->can('basic-data.delete')) {
return response()->json([
'success' => false,
'message' => 'Sorry! You are not allowed to delete branches.'
], 403);
}
$ids = $request->input('ids');
// Check if any of the branches have children
$branchesWithChildren = Branch::whereIn('id', $ids)
->whereHas('children')
->get();
if ($branchesWithChildren->count() > 0) {
return response()->json([
'success' => false,
'message' => 'Beberapa cabang memiliki anak cabang dan tidak dapat dihapus.'
], 422);
}
Branch::whereIn('id', $ids)->delete();
return response()->json(['success' => true, 'message' => 'Branches deleted successfully']);
}
public function dataForDatatables(Request $request)
{
// Check if the authenticated user has the required permission to view branches
if (is_null($this->user) || !$this->user->can('basic-data.read')) {
return response()->json([
'success' => false,
'message' => 'Sorry! You are not allowed to view branches.'
], 403);
}
// Retrieve data from the database
$query = Branch::query();
// Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) {
$search = json_decode($request->get('search'));
if(isset($search->search)) {
$search_ = strtolower($search->search);
$query->where(function ($q) use ($search_) {
$q->whereRaw('LOWER(code) LIKE ?', ['%' . strtolower($search_) . '%']);
$q->orWhereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search_) . '%']);
$q->orWhereHas('parent', function ($q) use ($search_) {
$q->whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search_) . '%']);
});
});
}
// Apply parent filter if provided
if (isset($search->parent_id) && !empty($search->parent_id)) {
$parentId = $search->parent_id;
$query->where('parent_id', $parentId);
}
}
// Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder');
$column = $request->get('sortField');
$query->orderBy($column, $order);
}
// Get the total count of records
$totalRecords = $query->count();
// Apply pagination if provided
if ($request->has('page') && $request->has('size')) {
$page = $request->get('page');
$size = $request->get('size');
$offset = ($page - 1) * $size; // Calculate the offset
$query->skip($offset)->take($size);
}
// Get the filtered count of records
$filteredRecords = $query->count();
// Get the data for the current page
$data = $query->get();
$data = $data->map(function ($item) {
return [
'id' => $item->id,
'code' => $item->code,
'name' => $item->name,
'parent_id' => $item->parent?->name ?? null,
];
});
// Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size'));
// Calculate the current page number
$currentPage = $request->get('page') ?: 1;
// Return the response data as a JSON object
return response()->json([
'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data,
]);
}
public function export(Request $request)
{
// Check if the authenticated user has the required permission to export branches
if (is_null($this->user) || !$this->user->can('basic-data.export')) {
abort(403, 'Sorry! You are not allowed to export branches.');
}
// Get search parameter from request
$search = $request->get('search');
$parentId = $request->get('parent_id');
return Excel::download(new BranchExport($search,$parentId), 'branch.xlsx');
}
}