IncomeTransactionController.php

app/Http/Controllers/IncomeTransactionController.php
 avatar
unknown
php
8 months ago
12 kB
3
Indexable
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\IncomeTransaction;
use App\Models\PaymentMethod;
use App\Models\Category;
use Carbon\Carbon;

class IncomeTransactionController extends Controller
{
    public function incomes($date = [])
    {
        $user_id = auth()->user()->id;

        if (empty($date)) {
            $incomes = IncomeTransaction::where('user_id', $user_id)
                ->orWhere('par_user_id', $user_id)
                ->orWhere('par_user_id', auth()->user()->par_id)
                ->latest()
                ->get();
        } else {
            $start_date = $date['start_date'];
            $end_date   = $date['end_date'];

            if (auth()->user()->role_id == 2) {
                $incomes = IncomeTransaction::where('user_id', $user_id)
                    ->whereBetween('date', [$start_date, $end_date])
                    ->latest()
                    ->get();
            } else if (auth()->user()->role_id == 1) {
                $incomes = IncomeTransaction::where('par_user_id', $user_id)
                    ->whereBetween('date', [$start_date, $end_date])
                    ->latest()
                    ->get();
            } else {
                $incomes = IncomeTransaction::where('par_user_id', auth()->user()->par_id)
                    ->whereBetween('date', [$start_date, $end_date])
                    ->latest()
                    ->get();
            }
        }

        if (auth()->user()->role_id == 3) {
            foreach ($incomes as $key => $income) {
                if ($income->status == 2)
                    unset($incomes[$key]);
            }
        }

        if (auth()->user()->role_id == 1) {
            foreach ($incomes as $key => $income) {
                if (is_null($income->total_income))
                    unset($incomes[$key]);
            }
        }

        return $incomes;
    }
    public function index()
    {
        if (!empty(session()->get('data_incomes')['date'])) {
            $sess_date = session()->get('data_incomes')['date'];
            $incomes = $this->incomes([
                'start_date'    => $sess_date['start_date'],
                'end_date'      => $sess_date['end_date']
            ]);

            $input_date = date('m/d/Y', strtotime($sess_date['start_date'])) . ' - ' . date('m/d/Y', strtotime($sess_date['end_date']));
        } else {
            $incomes = $this->incomes();
            $today = Carbon::today();
            $thirtyDaysAgo = $today->copy()->subDays(30);

            $formattedToday = $today->format('m/d/Y');
            $formattedThirtyDaysAgo = $thirtyDaysAgo->format('m/d/Y');

            $input_date = $formattedThirtyDaysAgo . ' - ' . $formattedToday;
        }

        $data_parse = [
            'input_date' => $input_date,
            'incomes'    => $incomes
        ];


        return view("incomes.index", $data_parse);
    }

    public function show($id)
    {
        $income = IncomeTransaction::where('id', $id)
            ->where('user_id', auth()->user()->id)
            ->orWhere('par_user_id', auth()->user()->id)
            ->orWhere('par_user_id', auth()->user()->par_id)
            ->firstOrFail();

        $income->staff_url = $this->getRoleRoute('teams');

        return view('incomes.show', [
            'income' => $income
        ]);
    }

    public function create()
    {
        return view("incomes.form", [
            'income' => new IncomeTransaction(),
            'page_meta' => [
                'title' => 'Tambahkan Transaksi Pendapatan',
                'action' => 'incomes.store',
                'method' => 'POST'
            ]
        ]);
    }

    public function validateIncome($request)
    {
        if (!empty($request->total_income))
            $request->total_income = intval(str_replace('.', '', $request->total_income));

        $payment_method_ids = implode(',', PaymentMethod::pluck('id')->toArray());

        $list_validate = [];

        // BEFORE
        /*
        switch (auth()->user()->role_id) {
            case 3: // finance
                $list_validate = [
                    'total_income' => ['required', 'max:256'],
                    'payment_method' => ['required', 'in:' . $payment_method_ids, 'numeric'],
                ];
                break;

            case 2: // manager
            default:
                $list_validate = [
                    'tenant_name' => ['required', 'min:3', 'max:256', 'string'],
                    'tenant_phone' => ['nullable', 'digits_between:10,13', 'numeric'],
                    'tenant_address' => ['nullable', 'min:3', 'max:256', 'string'],
                    'property_description' => ['required', 'min:3', 'max:256', 'string'],
                    'date' => ['required'],
                    'start_date' => ['required'],
                    'end_date' => ['required'],
                    'note' => ['nullable', 'min:1', 'max:256', 'string']
                ];
                break;
        }
        */

        // REVISION
        $list_validate = [
            'tenant_name' => ['required', 'min:3', 'max:256', 'string'],
            'tenant_phone' => ['nullable', 'digits_between:10,13', 'numeric'],
            'tenant_address' => ['nullable', 'min:3', 'max:256', 'string'],
            'property_description' => ['required', 'min:3', 'max:256', 'string'],
            'date' => ['required'],
            'start_date' => ['nullable'],
            'end_date' => ['nullable'],
            'note' => ['nullable', 'min:1', 'max:256', 'string']
        ];

        $category_ids       = implode(',', Category::pluck('id')->toArray());
        if (auth()->user()->role_id == 3) 
        {
            $list_validate['category'] = ['required', 'in:'.$category_ids, 'numeric'];
            $list_validate['total_income'] = ['required', 'max:256'];
            $list_validate['payment_method'] = ['required', 'in:' . $payment_method_ids, 'numeric'];
        }

        $validated = $request->validate($list_validate);

        return $validated;
    }

    public function store(Request $request)
    {
        $this->validateIncome($request);

        // AWALNYA KODE DIBUAT SEPERTI INI
        /* $lastest_code = IncomeTransaction::latest()->pluck('code')->first();
        $lastest_code = @intval($lastest_code);
        if (empty($lastest_code)) 
        {
            $lastest_code = 1000;
        } else {
            $lastest_code += 1;
        }
        */

        // REVISION

        $income = new IncomeTransaction();
        $income->user_id = auth()->user()->id;
        $income->par_user_id = auth()->user()->par_id;

        $income->tenant_name = $request->tenant_name;
        $income->tenant_address = $request->tenant_address ?? '';
        $income->payment_method_id = $request->payment_method;
        $income->total_income = $request->total_income;
        $income->tenant_phone = $request->tenant_phone ?? '';
        $income->property_description = $request->property_description;
        $income->date = $request->date;
        $income->note = $request->note ?? '';
        $income->start_date = $request->start_date;
        $income->end_date = $request->end_date;
        $income->save();

        return redirect(route($this->getRoleRoute('incomes')))->with('success', 'Transaksi pendapatan berhasil ditambahkan');
    }

    public function edit($id)
    {
        $income = IncomeTransaction::where('id', $id)->firstOrFail();
        return view("incomes.form", [
            'income' => $income,
            'page_meta' => [
                'title' => 'Edit Transaksi Pendapatan',
                'action' => 'incomes.update',
                'method' => 'PUT'
            ]
        ]);
    }

    public function update(Request $request)
    {
        $validated = $this->validateIncome($request);

        $income = IncomeTransaction::where('id', $request->id)
            ->whereIn('status', [0, 2])
            ->firstOrfail();

        if ($income->status == 1)
            return back()->with('danger', 'Transaksi tidak dapat diubah');

        $access_req = [];
        // BEFORE
        /*
        switch (auth()->user()->role_id) {
            case 2:
                $access_req = [
                    'tenant_name' => $request->tenant_name,
                    'tenant_address' => $request->tenant_address ?? '',
                    'tenant_phone' => $request->tenant_phone ?? '',
                    'property_description' => $request->property_description,
                    'date' => $request->date,
                    'note' => $request->note ?? '',
                    'start_date' => $request->start_date,
                    'end_date' => $request->end_date
                ];
                break;
            
            case 3:
                $access_req = [
                    'payment_method_id' => $request->payment_method,
                    'total_income' => $request->total_income
                ];
                break;
        }
        */

        // REVISION
        $access_req = [
            'tenant_name' => $request->tenant_name,
            'tenant_address' => $request->tenant_address ?? '',
            'tenant_phone' => $request->tenant_phone ?? '',
            'property_description' => $request->property_description,
            'date' => $request->date,
            'note' => $request->note ?? '',
            'start_date' => $request->start_date,
            'end_date' => $request->end_date
        ];

        if (auth()->user()->role_id == 3) // 3 = Finance
        {
            $access_req['payment_method_id'] = $request->payment_method;
            $access_req['total_income'] = $request->total_income;
            $access_req['code'] = Category::where('id', $request->category)->value('code');
            $access_req['category_id'] = $request->category;
        }

        if (auth()->user()->role_id == 2)
            $access_req['status'] = 0;

        $income->update($access_req);

        session()->forget('data_incomes');

        return redirect(route($this->getRoleRoute('incomes.edit'), $income->id))->with('success', 'Data transaksi berhasil diupdate');
    }

    public function delete($id)
    {
        $income = IncomeTransaction::findOrFail($id);

        $income->delete();

        session()->forget('data_incomes');

        return redirect(route($this->getRoleRoute('incomes')))->with('success', 'Transaksi telah dihapus');
    }

    public function approve($id)
    {
        $income = IncomeTransaction::findOrFail($id);

        $income->update([
            'status' => 1
        ]);

        session()->forget('data_incomes');

        return redirect(route($this->getRoleRoute('incomes')))->with('success', 'Transaksi telah disetujui');
    }

    public function review($id)
    {
        $income = IncomeTransaction::findOrFail($id);

        $income->update([
            'status' => 2
        ]);
        session()->forget('data_incomes');

        return redirect(route($this->getRoleRoute('incomes')))->with('warning', 'Transaksi telah dikirim kembali untuk ditinjau ulang');
    }

    public function filter_date(Request $request)
    {
        $dates = explode('-', trim($request->input('date')));
        $dates = array_map('trim', $dates); // [0 => "04/27/2024", 1 => "05/26/2024"]

        $startDate = Carbon::parse($dates[0])->startOfDay();
        $endDate = Carbon::parse($dates[1])->endOfDay();

        session()->put('data_incomes', [
            'date'      => [
                'start_date'    => $startDate,
                'end_date'      => $endDate
            ]
        ]);

        return redirect()->route($this->getRoleRoute('incomes'));
    }
}
Editor is loading...
Leave a Comment