- 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>
272 lines
10 KiB
PHP
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');
|
|
}
|
|
}
|