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') +
+
+
+ @include('utils.alerts') +
+
+
+ @csrf + @method('patch') +
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+
+@endsection + diff --git a/Modules/Expense/Resources/views/categories/index.blade.php b/Modules/Expense/Resources/views/categories/index.blade.php new file mode 100644 index 00000000..d5132dd9 --- /dev/null +++ b/Modules/Expense/Resources/views/categories/index.blade.php @@ -0,0 +1,73 @@ +@extends('layouts.app') + +@section('title', 'Expense Categories') + +@section('third_party_stylesheets') + +@endsection + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+
+ @include('utils.alerts') +
+
+ + + +
+ +
+ {!! $dataTable->table() !!} +
+
+
+
+
+
+ + + +@endsection + +@push('page_scripts') + {!! $dataTable->scripts() !!} +@endpush diff --git a/Modules/Expense/Resources/views/categories/partials/actions.blade.php b/Modules/Expense/Resources/views/categories/partials/actions.blade.php new file mode 100644 index 00000000..ee0a4c41 --- /dev/null +++ b/Modules/Expense/Resources/views/categories/partials/actions.blade.php @@ -0,0 +1,15 @@ + + + + diff --git a/Modules/Expense/Resources/views/expenses/create.blade.php b/Modules/Expense/Resources/views/expenses/create.blade.php new file mode 100644 index 00000000..aabe04ea --- /dev/null +++ b/Modules/Expense/Resources/views/expenses/create.blade.php @@ -0,0 +1,73 @@ +@extends('layouts.app') + +@section('title', 'Create Expense') + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+ @csrf +
+
+ @include('utils.alerts') +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+
+@endsection + diff --git a/Modules/Expense/Resources/views/expenses/edit.blade.php b/Modules/Expense/Resources/views/expenses/edit.blade.php new file mode 100644 index 00000000..6483b87b --- /dev/null +++ b/Modules/Expense/Resources/views/expenses/edit.blade.php @@ -0,0 +1,75 @@ +@extends('layouts.app') + +@section('title', 'Create Expense') + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+ @csrf + @method('patch') +
+
+ @include('utils.alerts') +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+
+@endsection + diff --git a/Modules/Expense/Resources/views/expenses/index.blade.php b/Modules/Expense/Resources/views/expenses/index.blade.php new file mode 100644 index 00000000..7e548e90 --- /dev/null +++ b/Modules/Expense/Resources/views/expenses/index.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.app') + +@section('title', 'Expenses') + +@section('third_party_stylesheets') + +@endsection + +@section('breadcrumb') + +@endsection + +@section('content') +
+
+
+
+
+ + Add Expense + + +
+ +
+ {!! $dataTable->table() !!} +
+
+
+
+
+
+@endsection + +@push('page_scripts') + {!! $dataTable->scripts() !!} +@endpush diff --git a/Modules/Expense/Resources/views/expenses/partials/actions.blade.php b/Modules/Expense/Resources/views/expenses/partials/actions.blade.php new file mode 100644 index 00000000..c3334d51 --- /dev/null +++ b/Modules/Expense/Resources/views/expenses/partials/actions.blade.php @@ -0,0 +1,15 @@ + + + + diff --git a/Modules/Expense/Resources/views/index.blade.php b/Modules/Expense/Resources/views/index.blade.php deleted file mode 100644 index 7b782e98..00000000 --- a/Modules/Expense/Resources/views/index.blade.php +++ /dev/null @@ -1,9 +0,0 @@ -@extends('expense::layouts.master') - -@section('content') -

Hello World

- -

- 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 @@ - - - - - - - Module Expense - - {{-- Laravel Mix - CSS File --}} - {{-- --}} - - - - @yield('content') - - {{-- Laravel Mix - JS File --}} - {{-- --}} - - diff --git a/Modules/Expense/Routes/web.php b/Modules/Expense/Routes/web.php index 203ee309..70bc871c 100644 --- a/Modules/Expense/Routes/web.php +++ b/Modules/Expense/Routes/web.php @@ -11,6 +11,11 @@ | */ -Route::prefix('expense')->group(function() { - Route::get('/', 'ExpenseController@index'); +Route::group(['middleware' => 'auth'], function () { + + //Expense Category + Route::resource('expense-categories', 'ExpenseCategoriesController')->except('show', 'create'); + //Expense + Route::resource('expenses', 'ExpenseController')->except('show'); + }); diff --git a/Modules/Product/Http/Controllers/CategoriesController.php b/Modules/Product/Http/Controllers/CategoriesController.php index 84518a31..951e7670 100644 --- a/Modules/Product/Http/Controllers/CategoriesController.php +++ b/Modules/Product/Http/Controllers/CategoriesController.php @@ -71,7 +71,7 @@ class CategoriesController extends Controller $category = Category::findOrFail($id); - if ($category->products->isNotEmpty()) { + if ($category->products()->isNotEmpty()) { return back()->withErrors('Can\'t delete beacuse there are products associated with this category.'); } diff --git a/Modules/Product/Resources/views/categories/index.blade.php b/Modules/Product/Resources/views/categories/index.blade.php index dc2bdc0d..db0f0ab3 100644 --- a/Modules/Product/Resources/views/categories/index.blade.php +++ b/Modules/Product/Resources/views/categories/index.blade.php @@ -47,7 +47,7 @@ -
+ @csrf