diff --git a/app/Http/Controllers/Admin/Finance/ExpenseController.php b/app/Http/Controllers/Admin/Finance/ExpenseController.php index 90ee3b1..2873d7f 100644 --- a/app/Http/Controllers/Admin/Finance/ExpenseController.php +++ b/app/Http/Controllers/Admin/Finance/ExpenseController.php @@ -19,9 +19,10 @@ class ExpenseController extends Controller public function index(): View { return view('pages.admin.finance.expenses', [ - 'pageTitle' => 'Pengeluaran', + 'pageTitle' => 'Pengeluaran Tetap', 'expenses' => Expense::with(['user', 'user.biography']) ->barbershop() + ->fixed() ->when(auth()->user()->role_id === 4, function ($query) { return $query->where('user_id', auth()->id()); }) diff --git a/app/Http/Controllers/Admin/Finance/GoodsExpenseController.php b/app/Http/Controllers/Admin/Finance/GoodsExpenseController.php new file mode 100644 index 0000000..f925e7f --- /dev/null +++ b/app/Http/Controllers/Admin/Finance/GoodsExpenseController.php @@ -0,0 +1,115 @@ + 'Pengeluaran Barang', + 'expenses' => Expense::with(['user', 'user.biography']) + ->barbershop() + ->goods() + ->latest() + ->get(), + ]); + } + + public function store(ExpenseRequest $request): RedirectResponse + { + $validatedData = $request->validated(); + $barbershopId = Auth::user()->barbershop_id; + $barbershop = Barbershop::findOrFail($barbershopId); + + if ($validatedData['use_cash'] === '1' && $barbershop->cash < $validatedData['amount']) { + notify()->error('Saldo kas tidak mencukupi', 'Gagal'); + + return back()->withInput(); + } + + DB::transaction(function () use ($validatedData, $barbershop, $barbershopId) { + $newExpense = Expense::create(array_merge($validatedData, [ + 'user_id' => Auth::id(), + 'barbershop_id' => $barbershopId, + 'type' => '2', + ])); + + if ($validatedData['use_cash'] === '1') { + $barbershop->decrement('cash', $validatedData['amount']); + } + + $this->uploadAttachment($validatedData['proof'], 'expenses', Expense::class, $newExpense->id, 'expenses'); + }); + + notify()->success('Data berhasil ditambahkan', 'Berhasil'); + + return back(); + } + + public function update(ExpenseRequest $request, Expense $expense): RedirectResponse + { + $validatedData = $request->validated(); + $barbershop = Barbershop::findOrFail($expense->barbershop_id); + + $amountDifference = $validatedData['amount'] - $expense->amount; + + if ($validatedData['use_cash'] === '1') { + $requiredCash = $barbershop->cash - ($amountDifference < 0 ? 0 : $amountDifference); + if ($requiredCash < 0) { + notify()->error('Saldo kas tidak mencukupi', 'Gagal'); + + return back()->withInput(); + } + } + + DB::transaction(function () use ($validatedData, $expense, $barbershop) { + if ($expense->use_cash === '1') { + $barbershop->increment('cash', $expense->amount); + } + + $expense->update($validatedData); + + if ($validatedData['use_cash'] === '1') { + $barbershop->decrement('cash', $validatedData['amount']); + } + + if (isset($validatedData['proof'])) { + $this->uploadAttachment($validatedData['proof'], 'expenses', Expense::class, $expense->id, 'expenses'); + } + }); + + notify()->success('Data berhasil diperbarui', 'Berhasil'); + + return back(); + } + + public function delete(Expense $expense): RedirectResponse + { + $barbershop = Barbershop::findOrFail($expense->barbershop_id); + + DB::transaction(function () use ($expense, $barbershop) { + if ($expense->use_cash === '1') { + $barbershop->increment('cash', $expense->amount); + } + + $expense->delete(); + }); + + notify()->success('Data berhasil dihapus', 'Berhasil'); + + return back(); + } +} diff --git a/app/Models/Expense.php b/app/Models/Expense.php index b79fe0c..e1246db 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -24,6 +24,7 @@ class Expense extends Model 'name', 'amount', 'use_cash', + 'type', ]; public function scopeBarbershop(Builder $query): Builder @@ -41,6 +42,16 @@ public function scopeYesterday(Builder $query): Builder return $query->whereDate('created_at', Carbon::yesterday()); } + public function scopeGoods(Builder $query): Builder + { + return $query->where('type', '2'); + } + + public function scopeFixed(Builder $query): Builder + { + return $query->where('type', '1'); + } + public function user(): BelongsTo { return $this->belongsTo(User::class); diff --git a/database/migrations/2024_12_30_152153_add_type_to_expenses.php b/database/migrations/2024_12_30_152153_add_type_to_expenses.php new file mode 100644 index 0000000..45cc16c --- /dev/null +++ b/database/migrations/2024_12_30_152153_add_type_to_expenses.php @@ -0,0 +1,28 @@ +enum('type', ['1', '2'])->default('1')->after('use_cash')->comment('1:Bukan Barang 2:Barang'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('expenses', function (Blueprint $table) { + $table->dropColumn('type'); + }); + } +}; diff --git a/resources/views/pages/admin/finance/goods-expense.blade.php b/resources/views/pages/admin/finance/goods-expense.blade.php new file mode 100644 index 0000000..6360b21 --- /dev/null +++ b/resources/views/pages/admin/finance/goods-expense.blade.php @@ -0,0 +1,192 @@ +@extends('layouts.admin') +@section('styles') + +@endsection +@section('app') +
+
+
+ @if (in_array(auth()->user()->role_id, [1, 3, 4])) +
+
+ + Tambah + +
+
+ @endif +
+
+
+ + + + + + + + + + @if (in_array(auth()->user()->role_id, [1, 3, 4])) + + @endif + + + + @foreach ($expenses as $expense) + + + + + + + + @if (in_array(auth()->user()->role_id, [1, 3, 4])) + + @endif + + @endforeach + +
NoPenginputNamaJumlahBuktiTanggalAksi
{{ $loop->iteration }}{{ $expense->user->biography->full_name ?? '-deleted-' }}{{ $expense->name }}{{ formatToRupiah($expense->amount) ?? '-' }} + @if ($expense->attachment && $expense->attachment->formatted_attachment) + attachment->formatted_attachment}") }}"> + attachment->formatted_attachment}") }}" + alt="{{ $expense->name }}" width="77" height="77"> + + @else + + Default Image + + @endif + {{ formatDateIndo($expense->created_at) }} +
    +
  • + + + +
  • + @if (auth()->user()->role_id === 1) +
  • +
    + @csrf + @method('delete') + + + +
    +
  • + @endif +
+
+
+
+
+
+
+ + +
+@endsection +@section('afterScripts') + + + + + + +@endsection diff --git a/resources/views/partials/admin/_sidebar.blade.php b/resources/views/partials/admin/_sidebar.blade.php index 48b0915..5675c02 100644 --- a/resources/views/partials/admin/_sidebar.blade.php +++ b/resources/views/partials/admin/_sidebar.blade.php @@ -103,7 +103,16 @@ - Pengeluaran + Pengeluaran Tetap + + + @endif + @if (in_array(auth()->user()->role_id, [1, 2, 3])) + @endif diff --git a/routes/web.php b/routes/web.php index 31f9555..a77be56 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Admin\Finance\CashController; use App\Http\Controllers\Admin\Finance\DebtController; use App\Http\Controllers\Admin\Finance\ExpenseController; +use App\Http\Controllers\Admin\Finance\GoodsExpenseController; use App\Http\Controllers\Admin\Finance\PayrollController; use App\Http\Controllers\Admin\Manage\AttendanceController; use App\Http\Controllers\Admin\Manage\InventoryController; @@ -95,6 +96,15 @@ }); }); + Route::middleware(['check_role:1,3,4'])->group(function () { + Route::prefix('goods-expense')->group(function () { + Route::get('/', [GoodsExpenseController::class, 'index'])->name('finance.goodsExpense'); + Route::post('store', [GoodsExpenseController::class, 'store'])->name('finance.goodsExpense.store'); + Route::put('update/{expense}', [GoodsExpenseController::class, 'update'])->name('finance.goodsExpense.update'); + Route::delete('delete/{expense}', [GoodsExpenseController::class, 'delete'])->name('finance.goodsExpense.delete')->middleware('check_role:1'); + }); + }); + Route::get('/payrolls', [PayrollController::class, 'index'])->name('finance.payrolls'); Route::prefix('payroll')->group(function () { Route::middleware(['check_role:1,3,4'])->group(function () {