diff --git a/Modules/Adjustment/Entities/Adjustment.php b/Modules/Adjustment/Entities/Adjustment.php index 96b37ecf..30a9cd05 100644 --- a/Modules/Adjustment/Entities/Adjustment.php +++ b/Modules/Adjustment/Entities/Adjustment.php @@ -13,7 +13,7 @@ class Adjustment extends Model protected $guarded = []; public function getDateAttribute($value) { - return Carbon::parse($value)->format('M d, Y'); + return Carbon::parse($value)->format('d M, Y'); } public function adjustedProducts() { diff --git a/Modules/Expense/Database/Migrations/2021_07_28_192608_create_expense_categories_table.php b/Modules/Expense/Database/Migrations/2021_07_28_192608_create_expense_categories_table.php new file mode 100644 index 00000000..143cfb7d --- /dev/null +++ b/Modules/Expense/Database/Migrations/2021_07_28_192608_create_expense_categories_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('category_name'); + $table->text('category_description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('expense_categories'); + } +} diff --git a/Modules/Expense/Database/Migrations/2021_07_28_192616_create_expenses_table.php b/Modules/Expense/Database/Migrations/2021_07_28_192616_create_expenses_table.php new file mode 100644 index 00000000..4033aaa2 --- /dev/null +++ b/Modules/Expense/Database/Migrations/2021_07_28_192616_create_expenses_table.php @@ -0,0 +1,37 @@ +id(); + $table->unsignedBigInteger('category_id'); + $table->date('date'); + $table->string('reference'); + $table->text('details')->nullable(); + $table->integer('amount'); + $table->foreign('category_id')->references('id')->on('expense_categories')->restrictOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('expenses'); + } +} diff --git a/Modules/Expense/Entities/Expense.php b/Modules/Expense/Entities/Expense.php new file mode 100644 index 00000000..f05bb16f --- /dev/null +++ b/Modules/Expense/Entities/Expense.php @@ -0,0 +1,22 @@ +belongsTo(ExpenseCategory::class, 'category_id', 'id'); + } + + public function getDateAttribute($value) { + return Carbon::parse($value)->format('d M, Y'); + } +} diff --git a/Modules/Expense/Entities/ExpenseCategory.php b/Modules/Expense/Entities/ExpenseCategory.php new file mode 100644 index 00000000..61f00f36 --- /dev/null +++ b/Modules/Expense/Entities/ExpenseCategory.php @@ -0,0 +1,17 @@ +hasMany(Expense::class, 'category_id', 'id'); + } +} diff --git a/Modules/Expense/Http/Controllers/ExpenseCategoriesController.php b/Modules/Expense/Http/Controllers/ExpenseCategoriesController.php new file mode 100644 index 00000000..ac3fd135 --- /dev/null +++ b/Modules/Expense/Http/Controllers/ExpenseCategoriesController.php @@ -0,0 +1,79 @@ +render('expense::categories.index'); + } + + public function store(Request $request) { + abort_if(Gate::denies('access_expense_categories'), 403); + + $request->validate([ + 'category_name' => 'required|string|max:255|unique:expense_categories,category_name', + 'category_description' => 'nullable|string|max:1000' + ]); + + ExpenseCategory::create([ + 'category_name' => $request->category_name, + 'category_description' => $request->category_description + ]); + + toast('Expense Category Created!', 'success'); + + return redirect()->route('expense-categories.index'); + } + + + public function edit(ExpenseCategory $expenseCategory) { + abort_if(Gate::denies('access_expense_categories'), 403); + + return view('expense::categories.edit', compact('expenseCategory')); + } + + + public function update(Request $request, ExpenseCategory $expenseCategory) { + abort_if(Gate::denies('access_expense_categories'), 403); + + $request->validate([ + 'category_name' => 'required|string|max:255|unique:expense_categories,category_name,' . $expenseCategory->id, + 'category_description' => 'nullable|string|max:1000' + ]); + + $expenseCategory->update([ + 'category_name' => $request->category_name, + 'category_description' => $request->category_description + ]); + + toast('Expense Category Updated!', 'info'); + + return redirect()->route('expense-categories.index'); + } + + + public function destroy(ExpenseCategory $expenseCategory) { + abort_if(Gate::denies('access_expense_categories'), 403); + + if ($expenseCategory->expenses()->isNotEmpty()) { + return back()->withErrors('Can\'t delete beacuse there are expenses associated with this category.'); + } + + $expenseCategory->delete(); + + toast('Expense Category Deleted!', 'warning'); + + return redirect()->route('expense-categories.index'); + } +} diff --git a/Modules/Expense/Http/Controllers/ExpenseController.php b/Modules/Expense/Http/Controllers/ExpenseController.php index f7886473..73ac7834 100644 --- a/Modules/Expense/Http/Controllers/ExpenseController.php +++ b/Modules/Expense/Http/Controllers/ExpenseController.php @@ -2,78 +2,82 @@ namespace Modules\Expense\Http\Controllers; +use App\DataTables\ExpensesDataTable; use Illuminate\Contracts\Support\Renderable; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Modules\Expense\Entities\Expense; +use PhpOffice\PhpSpreadsheet\Calculation\MathTrig\Exp; class ExpenseController extends Controller { - /** - * Display a listing of the resource. - * @return Renderable - */ - public function index() - { - return view('expense::index'); + + public function index(ExpensesDataTable $dataTable) { + return $dataTable->render('expense::expenses.index'); } - /** - * Show the form for creating a new resource. - * @return Renderable - */ - public function create() - { - return view('expense::create'); + + public function create() { + return view('expense::expenses.create'); } - /** - * Store a newly created resource in storage. - * @param Request $request - * @return Renderable - */ - public function store(Request $request) - { - // + + public function store(Request $request) { + $request->validate([ + 'date' => 'required|date', + 'reference' => 'required|string|max:255|unique:expenses,reference', + 'category_id' => 'required', + 'amount' => 'required|integer', + 'details' => 'nullable|string|max:1000' + ]); + + Expense::create([ + 'date' => $request->date, + 'reference' => $request->reference, + 'category_id' => $request->category_id, + 'amount' => $request->amount, + 'details' => $request->details + ]); + + toast('Expense Created!', 'success'); + + return redirect()->route('expenses.index'); } - /** - * Show the specified resource. - * @param int $id - * @return Renderable - */ - public function show($id) - { - return view('expense::show'); + + public function edit(Expense $expense) { + return view('expense::expenses.edit', compact('expense')); } - /** - * Show the form for editing the specified resource. - * @param int $id - * @return Renderable - */ - public function edit($id) - { - return view('expense::edit'); + + public function update(Request $request, Expense $expense) { + $request->validate([ + 'date' => 'required|date', + 'reference' => 'required|string|max:255|unique:expenses,reference,' . $expense->id, + 'category_id' => 'required', + 'amount' => 'required|integer', + 'details' => 'nullable|string|max:1000' + ]); + + $expense->update([ + 'date' => $request->date, + 'reference' => $request->reference, + 'category_id' => $request->category_id, + 'amount' => $request->amount, + 'details' => $request->details + ]); + + toast('Expense Updated!', 'info'); + + return redirect()->route('expenses.index'); } - /** - * Update the specified resource in storage. - * @param Request $request - * @param int $id - * @return Renderable - */ - public function update(Request $request, $id) - { - // - } - /** - * Remove the specified resource from storage. - * @param int $id - * @return Renderable - */ - public function destroy($id) - { - // + public function destroy(Expense $expense) { + $expense->delete(); + + toast('Expense Deleted!', 'warning'); + + return redirect()->route('expenses.index'); } } diff --git a/Modules/Expense/Resources/views/categories/edit.blade.php b/Modules/Expense/Resources/views/categories/edit.blade.php new file mode 100644 index 00000000..2f8fecca --- /dev/null +++ b/Modules/Expense/Resources/views/categories/edit.blade.php @@ -0,0 +1,42 @@ +@extends('layouts.app') + +@section('title', 'Edit Expense Category') + +@section('breadcrumb') +
+@endsection + +@section('content') +- This view is loaded from module: {!! config('expense.name') !!} -
-@endsection diff --git a/Modules/Expense/Resources/views/layouts/master.blade.php b/Modules/Expense/Resources/views/layouts/master.blade.php deleted file mode 100644 index eb0367d3..00000000 --- a/Modules/Expense/Resources/views/layouts/master.blade.php +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - -