diff --git a/Modules/Branch/Database/Migrations/2024_03_21_create_branches_table.php b/Modules/Branch/Database/Migrations/2024_03_21_create_branches_table.php new file mode 100644 index 00000000..05f635d4 --- /dev/null +++ b/Modules/Branch/Database/Migrations/2024_03_21_create_branches_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('name'); + $table->text('address'); + $table->string('phone', 20); + $table->string('email'); + $table->boolean('status')->default(true); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('branches'); + } +} \ No newline at end of file diff --git a/Modules/Branch/Database/Migrations/2025_05_20_074559_create_branch_managers_table.php b/Modules/Branch/Database/Migrations/2025_05_20_074559_create_branch_managers_table.php new file mode 100644 index 00000000..8c9f18dc --- /dev/null +++ b/Modules/Branch/Database/Migrations/2025_05_20_074559_create_branch_managers_table.php @@ -0,0 +1,94 @@ +id(); + $table->string('name'); + $table->string('city')->nullable(); + $table->string('address')->nullable(); + $table->string('phone')->nullable(); + $table->string('email')->nullable(); + $table->boolean('is_active')->default(true); + $table->timestamps(); + }); + + // Insert default branch + DB::table('branches')->insert([ + 'name' => 'Toko Al Fatih Pusar', + 'city' => 'Lumajang', + 'address' => 'Toko Pusat', + 'phone' => '1234567890', + 'email' => 'alfatih@test.com', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now() + ]); + } + + // Add branch_id to related tables + $tables = [ + 'sales', + 'purchases', + 'purchase_returns', + 'expenses', + 'sale_payments', + 'purchase_payments', + 'purchase_return_payments' + ]; + + foreach ($tables as $tableName) { + if (Schema::hasTable($tableName)) { + Schema::table($tableName, function (Blueprint $table) use ($tableName) { + if (!Schema::hasColumn($tableName, 'branch_id')) { + $table->unsignedBigInteger('branch_id')->default(1)->after('id'); + $table->foreign('branch_id')->references('id')->on('branches'); + } + }); + } + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Drop branch_id from related tables + $tables = [ + 'sales', + 'purchases', + 'purchase_returns', + 'expenses', + 'sale_payments', + 'purchase_payments', + 'purchase_return_payments' + ]; + + foreach ($tables as $tableName) { + if (Schema::hasTable($tableName)) { + Schema::table($tableName, function (Blueprint $table) use ($tableName) { + if (Schema::hasColumn($tableName, 'branch_id')) { + $table->dropForeign(['branch_id']); + $table->dropColumn('branch_id'); + } + }); + } + } + + // Drop branches table + Schema::dropIfExists('branches'); + } +}; diff --git a/Modules/Branch/Entities/Branch.php b/Modules/Branch/Entities/Branch.php new file mode 100644 index 00000000..258a6af6 --- /dev/null +++ b/Modules/Branch/Entities/Branch.php @@ -0,0 +1,23 @@ + 'boolean' + ]; +} \ No newline at end of file diff --git a/Modules/Branch/Http/Controllers/BranchController.php b/Modules/Branch/Http/Controllers/BranchController.php new file mode 100644 index 00000000..f8d9b122 --- /dev/null +++ b/Modules/Branch/Http/Controllers/BranchController.php @@ -0,0 +1,92 @@ +paginate(10); + return view('branch::index', compact('branches')); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + return view('branch::create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'address' => 'required|string', + 'phone' => 'required|string|max:20', + 'email' => 'required|email|max:255', + 'status' => 'required|boolean' + ]); + + Branch::create($request->all()); + + return redirect()->route('branch.index') + ->with('success', 'Branch created successfully.'); + } + + /** + * Display the specified resource. + */ + public function show(Branch $branch) + { + return view('branch::show', compact('branch')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Branch $branch) + { + return view('branch::edit', compact('branch')); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, Branch $branch) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'address' => 'required|string', + 'phone' => 'required|string|max:20', + 'email' => 'required|email|max:255', + 'status' => 'required|boolean' + ]); + + $branch->update($request->all()); + + return redirect()->route('branch.index') + ->with('success', 'Branch updated successfully.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Branch $branch) + { + $branch->delete(); + + return redirect()->route('branch.index') + ->with('success', 'Branch deleted successfully.'); + } +} \ No newline at end of file diff --git a/Modules/Branch/Providers/BranchServiceProvider.php b/Modules/Branch/Providers/BranchServiceProvider.php new file mode 100644 index 00000000..b7e45a08 --- /dev/null +++ b/Modules/Branch/Providers/BranchServiceProvider.php @@ -0,0 +1,30 @@ +app->register(RouteServiceProvider::class); + } + + /** + * Bootstrap services. + * + * @return void + */ + public function boot() + { + $this->loadMigrationsFrom(module_path('Branch', 'Database/Migrations')); + $this->loadViewsFrom(module_path('Branch', 'Resources/views'), 'branch'); + } +} \ No newline at end of file diff --git a/Modules/Branch/Providers/RouteServiceProvider.php b/Modules/Branch/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..897ae6af --- /dev/null +++ b/Modules/Branch/Providers/RouteServiceProvider.php @@ -0,0 +1,42 @@ +mapWebRoutes(); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::middleware('web') + ->namespace($this->namespace) + ->group(module_path('Branch', 'Routes/web.php')); + } +} \ No newline at end of file diff --git a/Modules/Branch/Resources/views/create.blade.php b/Modules/Branch/Resources/views/create.blade.php new file mode 100644 index 00000000..3a37dc30 --- /dev/null +++ b/Modules/Branch/Resources/views/create.blade.php @@ -0,0 +1,69 @@ +@extends('core::layouts.master') + +@section('title') + Create Branch +@endsection + +@section('content') +
+
+
+
+

Create New Branch

+
+
+
+ @csrf +
+ + + @error('name') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('address') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('phone') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('email') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('status') +
{{ $message }}
+ @enderror +
+ +
+ + Cancel +
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/Modules/Branch/Resources/views/edit.blade.php b/Modules/Branch/Resources/views/edit.blade.php new file mode 100644 index 00000000..17133eff --- /dev/null +++ b/Modules/Branch/Resources/views/edit.blade.php @@ -0,0 +1,70 @@ +@extends('core::layouts.master') + +@section('title') + Edit Branch +@endsection + +@section('content') +
+
+
+
+

Edit Branch

+
+
+
+ @csrf + @method('PUT') +
+ + + @error('name') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('address') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('phone') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('email') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('status') +
{{ $message }}
+ @enderror +
+ +
+ + Cancel +
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/Modules/Branch/Resources/views/index.blade.php b/Modules/Branch/Resources/views/index.blade.php new file mode 100644 index 00000000..c6a91c13 --- /dev/null +++ b/Modules/Branch/Resources/views/index.blade.php @@ -0,0 +1,83 @@ +@extends('core::layouts.master') + +@section('title') + Branches +@endsection + +@section('content') +
+
+
+
+

Branches

+ @can('create_branches') + + @endcan +
+
+
+ + + + + + + + + + + + + @forelse($branches as $branch) + + + + + + + + + @empty + + + + @endforelse + +
NameAddressPhoneEmailStatusActions
{{ $branch->name }}{{ $branch->address }}{{ $branch->phone }}{{ $branch->email }} + @if($branch->status) + Active + @else + Inactive + @endif + + + + + @can('edit_branches') + + + + @endcan + @can('delete_branches') +
+ @csrf + @method('DELETE') + +
+ @endcan +
No branches found.
+
+
+ {{ $branches->links() }} +
+
+
+
+
+@endsection \ No newline at end of file diff --git a/Modules/Branch/Resources/views/show.blade.php b/Modules/Branch/Resources/views/show.blade.php new file mode 100644 index 00000000..531e602b --- /dev/null +++ b/Modules/Branch/Resources/views/show.blade.php @@ -0,0 +1,67 @@ +@extends('core::layouts.master') + +@section('title') + Branch Details +@endsection + +@section('content') +
+
+
+
+

Branch Details

+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Branch Name{{ $branch->name }}
Address{{ $branch->address }}
Phone{{ $branch->phone }}
Email{{ $branch->email }}
Status + @if($branch->status) + Active + @else + Inactive + @endif +
Created At{{ $branch->created_at->format('d M Y H:i') }}
Last Updated{{ $branch->updated_at->format('d M Y H:i') }}
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/Modules/Branch/Routes/web.php b/Modules/Branch/Routes/web.php new file mode 100644 index 00000000..cd6c6b24 --- /dev/null +++ b/Modules/Branch/Routes/web.php @@ -0,0 +1,8 @@ +group(function () { + Route::resource('branch', BranchController::class); +}); \ No newline at end of file diff --git a/Modules/Branch/module.json b/Modules/Branch/module.json new file mode 100644 index 00000000..e84c3b16 --- /dev/null +++ b/Modules/Branch/module.json @@ -0,0 +1,11 @@ +{ + "name": "Branch", + "alias": "branch", + "description": "Branch management module", + "keywords": [], + "priority": 0, + "providers": [ + "Modules\\Branch\\Providers\\BranchServiceProvider" + ], + "files": [] +} \ No newline at end of file diff --git a/Modules/SalesReturn/Config/.gitkeep b/Modules/SalesReturn/Config/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Config/config.php b/Modules/SalesReturn/Config/config.php deleted file mode 100644 index bb1b255d..00000000 --- a/Modules/SalesReturn/Config/config.php +++ /dev/null @@ -1,5 +0,0 @@ - 'SalesReturn' -]; diff --git a/Modules/SalesReturn/Console/.gitkeep b/Modules/SalesReturn/Console/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/DataTables/SaleReturnPaymentsDataTable.php b/Modules/SalesReturn/DataTables/SaleReturnPaymentsDataTable.php deleted file mode 100644 index 3a4871eb..00000000 --- a/Modules/SalesReturn/DataTables/SaleReturnPaymentsDataTable.php +++ /dev/null @@ -1,78 +0,0 @@ -eloquent($query) - ->addColumn('amount', function ($data) { - return format_currency($data->amount); - }) - ->addColumn('action', function ($data) { - return view('salesreturn::payments.partials.actions', compact('data')); - }); - } - - public function query(SaleReturnPayment $model) { - return $model->newQuery()->bySaleReturn()->with('saleReturn'); - } - - public function html() { - return $this->builder() - ->setTableId('sale-payments-table') - ->columns($this->getColumns()) - ->minifiedAjax() - ->dom("<'row'<'col-md-3'l><'col-md-5 mb-2'B><'col-md-4'f>> . - 'tr' . - <'row'<'col-md-5'i><'col-md-7 mt-2'p>>") - ->orderBy(5) - ->buttons( - Button::make('excel') - ->text(' Excel'), - Button::make('print') - ->text(' Print'), - Button::make('reset') - ->text(' Reset'), - Button::make('reload') - ->text(' Reload') - ); - } - - protected function getColumns() { - return [ - Column::make('date') - ->className('align-middle text-center'), - - Column::make('reference') - ->className('align-middle text-center'), - - Column::computed('amount') - ->className('align-middle text-center'), - - Column::make('payment_method') - ->className('align-middle text-center'), - - Column::computed('action') - ->exportable(false) - ->printable(false) - ->className('align-middle text-center'), - - Column::make('created_at') - ->visible(false), - ]; - } - - protected function filename(): string { - return 'SaleReturnPayments_' . date('YmdHis'); - } -} diff --git a/Modules/SalesReturn/DataTables/SaleReturnsDataTable.php b/Modules/SalesReturn/DataTables/SaleReturnsDataTable.php deleted file mode 100644 index cd7bf4d8..00000000 --- a/Modules/SalesReturn/DataTables/SaleReturnsDataTable.php +++ /dev/null @@ -1,100 +0,0 @@ -eloquent($query) - ->addColumn('total_amount', function ($data) { - return format_currency($data->total_amount); - }) - ->addColumn('paid_amount', function ($data) { - return format_currency($data->paid_amount); - }) - ->addColumn('due_amount', function ($data) { - return format_currency($data->due_amount); - }) - ->addColumn('status', function ($data) { - return view('salesreturn::partials.status', compact('data')); - }) - ->addColumn('payment_status', function ($data) { - return view('salesreturn::partials.payment-status', compact('data')); - }) - ->addColumn('action', function ($data) { - return view('salesreturn::partials.actions', compact('data')); - }); - } - - public function query(SaleReturn $model) { - return $model->newQuery(); - } - - public function html() { - return $this->builder() - ->setTableId('sale-returns-table') - ->columns($this->getColumns()) - ->minifiedAjax() - ->dom("<'row'<'col-md-3'l><'col-md-5 mb-2'B><'col-md-4'f>> . - 'tr' . - <'row'<'col-md-5'i><'col-md-7 mt-2'p>>") - ->orderBy(8) - ->buttons( - Button::make('excel') - ->text(' Excel'), - Button::make('print') - ->text(' Print'), - Button::make('reset') - ->text(' Reset'), - Button::make('reload') - ->text(' Reload') - ); - } - - protected function getColumns() { - return [ - Column::make('reference') - ->className('text-center align-middle'), - - Column::make('customer_name') - ->title('Customer') - ->className('text-center align-middle'), - - Column::computed('status') - ->className('text-center align-middle'), - - Column::computed('total_amount') - ->className('text-center align-middle'), - - Column::computed('paid_amount') - ->className('text-center align-middle'), - - Column::computed('due_amount') - ->className('text-center align-middle'), - - Column::computed('payment_status') - ->className('text-center align-middle'), - - Column::computed('action') - ->exportable(false) - ->printable(false) - ->className('text-center align-middle'), - - Column::make('created_at') - ->visible(false) - ]; - } - - protected function filename(): string { - return 'SaleReturns_' . date('YmdHis'); - } -} diff --git a/Modules/SalesReturn/Database/Migrations/.gitkeep b/Modules/SalesReturn/Database/Migrations/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Database/Migrations/2021_08_08_175345_create_sale_returns_table.php b/Modules/SalesReturn/Database/Migrations/2021_08_08_175345_create_sale_returns_table.php deleted file mode 100644 index a42661af..00000000 --- a/Modules/SalesReturn/Database/Migrations/2021_08_08_175345_create_sale_returns_table.php +++ /dev/null @@ -1,48 +0,0 @@ -id(); - $table->date('date'); - $table->string('reference'); - $table->unsignedBigInteger('customer_id')->nullable(); - $table->string('customer_name'); - $table->integer('tax_percentage')->default(0); - $table->integer('tax_amount')->default(0); - $table->integer('discount_percentage')->default(0); - $table->integer('discount_amount')->default(0); - $table->integer('shipping_amount')->default(0); - $table->integer('total_amount'); - $table->integer('paid_amount'); - $table->integer('due_amount'); - $table->string('status'); - $table->string('payment_status'); - $table->string('payment_method'); - $table->text('note')->nullable(); - $table->foreign('customer_id')->references('id')->on('customers')->nullOnDelete(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('sale_returns'); - } -} diff --git a/Modules/SalesReturn/Database/Migrations/2021_08_08_175358_create_sale_return_details_table.php b/Modules/SalesReturn/Database/Migrations/2021_08_08_175358_create_sale_return_details_table.php deleted file mode 100644 index b2ab2cfa..00000000 --- a/Modules/SalesReturn/Database/Migrations/2021_08_08_175358_create_sale_return_details_table.php +++ /dev/null @@ -1,46 +0,0 @@ -id(); - $table->unsignedBigInteger('sale_return_id'); - $table->unsignedBigInteger('product_id')->nullable(); - $table->string('product_name'); - $table->string('product_code'); - $table->integer('quantity'); - $table->integer('price'); - $table->integer('unit_price'); - $table->integer('sub_total'); - $table->integer('product_discount_amount'); - $table->string('product_discount_type')->default('fixed'); - $table->integer('product_tax_amount'); - $table->foreign('sale_return_id')->references('id') - ->on('sale_returns')->cascadeOnDelete(); - $table->foreign('product_id')->references('id') - ->on('products')->nullOnDelete(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('sale_return_details'); - } -} diff --git a/Modules/SalesReturn/Database/Migrations/2021_08_08_175406_create_sale_return_payments_table.php b/Modules/SalesReturn/Database/Migrations/2021_08_08_175406_create_sale_return_payments_table.php deleted file mode 100644 index 0a020875..00000000 --- a/Modules/SalesReturn/Database/Migrations/2021_08_08_175406_create_sale_return_payments_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->unsignedBigInteger('sale_return_id'); - $table->integer('amount'); - $table->date('date'); - $table->string('reference'); - $table->string('payment_method'); - $table->text('note')->nullable(); - $table->foreign('sale_return_id')->references('id')->on('sale_returns')->cascadeOnDelete(); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('sale_return_payments'); - } -} diff --git a/Modules/SalesReturn/Database/Seeders/.gitkeep b/Modules/SalesReturn/Database/Seeders/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Database/Seeders/SalesReturnDatabaseSeeder.php b/Modules/SalesReturn/Database/Seeders/SalesReturnDatabaseSeeder.php deleted file mode 100644 index bdf64a6e..00000000 --- a/Modules/SalesReturn/Database/Seeders/SalesReturnDatabaseSeeder.php +++ /dev/null @@ -1,21 +0,0 @@ -call("OthersTableSeeder"); - } -} diff --git a/Modules/SalesReturn/Database/factories/.gitkeep b/Modules/SalesReturn/Database/factories/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Entities/.gitkeep b/Modules/SalesReturn/Entities/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Entities/SaleReturn.php b/Modules/SalesReturn/Entities/SaleReturn.php deleted file mode 100644 index 7a98dad5..00000000 --- a/Modules/SalesReturn/Entities/SaleReturn.php +++ /dev/null @@ -1,58 +0,0 @@ -hasMany(SaleReturnDetail::class, 'sale_return_id', 'id'); - } - - public function saleReturnPayments() { - return $this->hasMany(SaleReturnPayment::class, 'sale_return_id', 'id'); - } - - public static function boot() { - parent::boot(); - - static::creating(function ($model) { - $number = SaleReturn::max('id') + 1; - $model->reference = make_reference_id('SLRN', $number);; - }); - } - - public function scopeCompleted($query) { - return $query->where('status', 'Completed'); - } - - public function getShippingAmountAttribute($value) { - return $value / 100; - } - - public function getPaidAmountAttribute($value) { - return $value / 100; - } - - public function getTotalAmountAttribute($value) { - return $value / 100; - } - - public function getDueAmountAttribute($value) { - return $value / 100; - } - - public function getTaxAmountAttribute($value) { - return $value / 100; - } - - public function getDiscountAmountAttribute($value) { - return $value / 100; - } -} diff --git a/Modules/SalesReturn/Entities/SaleReturnDetail.php b/Modules/SalesReturn/Entities/SaleReturnDetail.php deleted file mode 100644 index 9f7b5000..00000000 --- a/Modules/SalesReturn/Entities/SaleReturnDetail.php +++ /dev/null @@ -1,44 +0,0 @@ -belongsTo(Product::class, 'product_id', 'id'); - } - - public function saleReturn() { - return $this->belongsTo(SaleReturnPayment::class, 'sale_return_id', 'id'); - } - - public function getPriceAttribute($value) { - return $value / 100; - } - - public function getUnitPriceAttribute($value) { - return $value / 100; - } - - public function getSubTotalAttribute($value) { - return $value / 100; - } - - public function getProductDiscountAmountAttribute($value) { - return $value / 100; - } - - public function getProductTaxAmountAttribute($value) { - return $value / 100; - } -} diff --git a/Modules/SalesReturn/Entities/SaleReturnPayment.php b/Modules/SalesReturn/Entities/SaleReturnPayment.php deleted file mode 100644 index eda96ee8..00000000 --- a/Modules/SalesReturn/Entities/SaleReturnPayment.php +++ /dev/null @@ -1,34 +0,0 @@ -belongsTo(SaleReturn::class, 'sale_return_id', 'id'); - } - - public function setAmountAttribute($value) { - $this->attributes['amount'] = $value * 100; - } - - public function getAmountAttribute($value) { - return $value / 100; - } - - public function getDateAttribute($value) { - return Carbon::parse($value)->format('d M, Y'); - } - - public function scopeBySaleReturn($query) { - return $query->where('sale_return_id', request()->route('sale_return_id')); - } -} diff --git a/Modules/SalesReturn/Http/Controllers/.gitkeep b/Modules/SalesReturn/Http/Controllers/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Http/Controllers/SaleReturnPaymentsController.php b/Modules/SalesReturn/Http/Controllers/SaleReturnPaymentsController.php deleted file mode 100644 index 95954cbe..00000000 --- a/Modules/SalesReturn/Http/Controllers/SaleReturnPaymentsController.php +++ /dev/null @@ -1,146 +0,0 @@ -render('salesreturn::payments.index', compact('sale_return')); - } - - - public function create($sale_return_id) { - abort_if(Gate::denies('access_sale_return_payments'), 403); - - $sale_return = SaleReturn::findOrFail($sale_return_id); - - return view('salesreturn::payments.create', compact('sale_return')); - } - - - public function store(Request $request) { - abort_if(Gate::denies('access_sale_return_payments'), 403); - - $request->validate([ - 'date' => 'required|date', - 'reference' => 'required|string|max:255', - 'amount' => 'required|numeric', - 'note' => 'nullable|string|max:1000', - 'sale_return_id' => 'required', - 'payment_method' => 'required|string|max:255' - ]); - - DB::transaction(function () use ($request) { - SaleReturnPayment::create([ - 'date' => $request->date, - 'reference' => $request->reference, - 'amount' => $request->amount, - 'note' => $request->note, - 'sale_return_id' => $request->sale_return_id, - 'payment_method' => $request->payment_method - ]); - - $sale_return = SaleReturn::findOrFail($request->sale_return_id); - - $due_amount = $sale_return->due_amount - $request->amount; - - if ($due_amount == $sale_return->total_amount) { - $payment_status = 'Unpaid'; - } elseif ($due_amount > 0) { - $payment_status = 'Partial'; - } else { - $payment_status = 'Paid'; - } - - $sale_return->update([ - 'paid_amount' => ($sale_return->paid_amount + $request->amount) * 100, - 'due_amount' => $due_amount * 100, - 'payment_status' => $payment_status - ]); - }); - - toast('Sale Return Payment Created!', 'success'); - - return redirect()->route('sale-returns.index'); - } - - - public function edit($sale_return_id, SaleReturnPayment $saleReturnPayment) { - abort_if(Gate::denies('access_sale_return_payments'), 403); - - $sale_return = SaleReturn::findOrFail($sale_return_id); - - return view('salesreturn::payments.edit', compact('saleReturnPayment', 'sale_return')); - } - - - public function update(Request $request, SaleReturnPayment $saleReturnPayment) { - abort_if(Gate::denies('access_sale_return_payments'), 403); - - $request->validate([ - 'date' => 'required|date', - 'reference' => 'required|string|max:255', - 'amount' => 'required|numeric', - 'note' => 'nullable|string|max:1000', - 'sale_return_id' => 'required', - 'payment_method' => 'required|string|max:255' - ]); - - DB::transaction(function () use ($request, $saleReturnPayment) { - $sale_return = $saleReturnPayment->saleReturn; - - $due_amount = ($sale_return->due_amount + $saleReturnPayment->amount) - $request->amount; - - if ($due_amount == $sale_return->total_amount) { - $payment_status = 'Unpaid'; - } elseif ($due_amount > 0) { - $payment_status = 'Partial'; - } else { - $payment_status = 'Paid'; - } - - $sale_return->update([ - 'paid_amount' => (($sale_return->paid_amount - $saleReturnPayment->amount) + $request->amount) * 100, - 'due_amount' => $due_amount * 100, - 'payment_status' => $payment_status - ]); - - $saleReturnPayment->update([ - 'date' => $request->date, - 'reference' => $request->reference, - 'amount' => $request->amount, - 'note' => $request->note, - 'sale_return_id' => $request->sale_return_id, - 'payment_method' => $request->payment_method - ]); - }); - - toast('Sale Return Payment Updated!', 'info'); - - return redirect()->route('sale-returns.index'); - } - - - public function destroy(SaleReturnPayment $saleReturnPayment) { - abort_if(Gate::denies('access_sale_return_payments'), 403); - - $saleReturnPayment->delete(); - - toast('Sale Return Payment Deleted!', 'warning'); - - return redirect()->route('sale-returns.index'); - } -} diff --git a/Modules/SalesReturn/Http/Controllers/SalesReturnController.php b/Modules/SalesReturn/Http/Controllers/SalesReturnController.php deleted file mode 100644 index cccea4ee..00000000 --- a/Modules/SalesReturn/Http/Controllers/SalesReturnController.php +++ /dev/null @@ -1,232 +0,0 @@ -render('salesreturn::index'); - } - - - public function create() { - abort_if(Gate::denies('create_sale_returns'), 403); - - Cart::instance('sale_return')->destroy(); - - return view('salesreturn::create'); - } - - - public function store(StoreSaleReturnRequest $request) { - DB::transaction(function () use ($request) { - $due_amount = $request->total_amount - $request->paid_amount; - - if ($due_amount == $request->total_amount) { - $payment_status = 'Unpaid'; - } elseif ($due_amount > 0) { - $payment_status = 'Partial'; - } else { - $payment_status = 'Paid'; - } - - $sale_return = SaleReturn::create([ - 'date' => $request->date, - 'customer_id' => $request->customer_id, - 'customer_name' => Customer::findOrFail($request->customer_id)->customer_name, - 'tax_percentage' => $request->tax_percentage, - 'discount_percentage' => $request->discount_percentage, - 'shipping_amount' => $request->shipping_amount * 100, - 'paid_amount' => $request->paid_amount * 100, - 'total_amount' => $request->total_amount * 100, - 'due_amount' => $due_amount * 100, - 'status' => $request->status, - 'payment_status' => $payment_status, - 'payment_method' => $request->payment_method, - 'note' => $request->note, - 'tax_amount' => Cart::instance('sale_return')->tax() * 100, - 'discount_amount' => Cart::instance('sale_return')->discount() * 100, - ]); - - foreach (Cart::instance('sale_return')->content() as $cart_item) { - SaleReturnDetail::create([ - 'sale_return_id' => $sale_return->id, - 'product_id' => $cart_item->id, - 'product_name' => $cart_item->name, - 'product_code' => $cart_item->options->code, - 'quantity' => $cart_item->qty, - 'price' => $cart_item->price * 100, - 'unit_price' => $cart_item->options->unit_price * 100, - 'sub_total' => $cart_item->options->sub_total * 100, - 'product_discount_amount' => $cart_item->options->product_discount * 100, - 'product_discount_type' => $cart_item->options->product_discount_type, - 'product_tax_amount' => $cart_item->options->product_tax * 100, - ]); - - if ($request->status == 'Completed') { - $product = Product::findOrFail($cart_item->id); - $product->update([ - 'product_quantity' => $product->product_quantity + $cart_item->qty - ]); - } - } - - Cart::instance('sale_return')->destroy(); - - if ($sale_return->paid_amount > 0) { - SaleReturnPayment::create([ - 'date' => $request->date, - 'reference' => 'INV/'.$sale_return->reference, - 'amount' => $sale_return->paid_amount, - 'sale_return_id' => $sale_return->id, - 'payment_method' => $request->payment_method - ]); - } - }); - - toast('Sale Return Created!', 'success'); - - return redirect()->route('sale-returns.index'); - } - - - public function show(SaleReturn $sale_return) { - abort_if(Gate::denies('show_sale_returns'), 403); - - $customer = Customer::findOrFail($sale_return->customer_id); - - return view('salesreturn::show', compact('sale_return', 'customer')); - } - - - public function edit(SaleReturn $sale_return) { - abort_if(Gate::denies('edit_sale_returns'), 403); - - $sale_return_details = $sale_return->saleReturnDetails; - - Cart::instance('sale_return')->destroy(); - - $cart = Cart::instance('sale_return'); - - foreach ($sale_return_details as $sale_return_detail) { - $cart->add([ - 'id' => $sale_return_detail->product_id, - 'name' => $sale_return_detail->product_name, - 'qty' => $sale_return_detail->quantity, - 'price' => $sale_return_detail->price, - 'weight' => 1, - 'options' => [ - 'product_discount' => $sale_return_detail->product_discount_amount, - 'product_discount_type' => $sale_return_detail->product_discount_type, - 'sub_total' => $sale_return_detail->sub_total, - 'code' => $sale_return_detail->product_code, - 'stock' => Product::findOrFail($sale_return_detail->product_id)->product_quantity, - 'product_tax' => $sale_return_detail->product_tax_amount, - 'unit_price' => $sale_return_detail->unit_price - ] - ]); - } - - return view('salesreturn::edit', compact('sale_return')); - } - - - public function update(UpdateSaleReturnRequest $request, SaleReturn $sale_return) { - DB::transaction(function () use ($request, $sale_return) { - $due_amount = $request->total_amount - $request->paid_amount; - - if ($due_amount == $request->total_amount) { - $payment_status = 'Unpaid'; - } elseif ($due_amount > 0) { - $payment_status = 'Partial'; - } else { - $payment_status = 'Paid'; - } - - foreach ($sale_return->saleReturnDetails as $sale_return_detail) { - if ($sale_return->status == 'Completed') { - $product = Product::findOrFail($sale_return_detail->product_id); - $product->update([ - 'product_quantity' => $product->product_quantity - $sale_return_detail->quantity - ]); - } - $sale_return_detail->delete(); - } - - $sale_return->update([ - 'date' => $request->date, - 'reference' => $request->reference, - 'customer_id' => $request->customer_id, - 'customer_name' => Customer::findOrFail($request->customer_id)->customer_name, - 'tax_percentage' => $request->tax_percentage, - 'discount_percentage' => $request->discount_percentage, - 'shipping_amount' => $request->shipping_amount * 100, - 'paid_amount' => $request->paid_amount * 100, - 'total_amount' => $request->total_amount * 100, - 'due_amount' => $due_amount * 100, - 'status' => $request->status, - 'payment_status' => $payment_status, - 'payment_method' => $request->payment_method, - 'note' => $request->note, - 'tax_amount' => Cart::instance('sale_return')->tax() * 100, - 'discount_amount' => Cart::instance('sale_return')->discount() * 100, - ]); - - foreach (Cart::instance('sale_return')->content() as $cart_item) { - SaleReturnDetail::create([ - 'sale_return_id' => $sale_return->id, - 'product_id' => $cart_item->id, - 'product_name' => $cart_item->name, - 'product_code' => $cart_item->options->code, - 'quantity' => $cart_item->qty, - 'price' => $cart_item->price * 100, - 'unit_price' => $cart_item->options->unit_price * 100, - 'sub_total' => $cart_item->options->sub_total * 100, - 'product_discount_amount' => $cart_item->options->product_discount * 100, - 'product_discount_type' => $cart_item->options->product_discount_type, - 'product_tax_amount' => $cart_item->options->product_tax * 100, - ]); - - if ($request->status == 'Completed') { - $product = Product::findOrFail($cart_item->id); - $product->update([ - 'product_quantity' => $product->product_quantity + $cart_item->qty - ]); - } - } - - Cart::instance('sale_return')->destroy(); - }); - - toast('Sale Return Updated!', 'info'); - - return redirect()->route('sale-returns.index'); - } - - - public function destroy(SaleReturn $sale_return) { - abort_if(Gate::denies('delete_sale_returns'), 403); - - $sale_return->delete(); - - toast('Sale Return Deleted!', 'warning'); - - return redirect()->route('sale-returns.index'); - } -} diff --git a/Modules/SalesReturn/Http/Middleware/.gitkeep b/Modules/SalesReturn/Http/Middleware/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Http/Requests/.gitkeep b/Modules/SalesReturn/Http/Requests/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Http/Requests/StoreSaleReturnRequest.php b/Modules/SalesReturn/Http/Requests/StoreSaleReturnRequest.php deleted file mode 100644 index 15e292c1..00000000 --- a/Modules/SalesReturn/Http/Requests/StoreSaleReturnRequest.php +++ /dev/null @@ -1,40 +0,0 @@ - 'required|numeric', - 'reference' => 'required|string|max:255', - 'tax_percentage' => 'required|integer|min:0|max:100', - 'discount_percentage' => 'required|integer|min:0|max:100', - 'shipping_amount' => 'required|numeric', - 'total_amount' => 'required|numeric', - 'paid_amount' => 'required|numeric', - 'status' => 'required|string|max:255', - 'payment_method' => 'required|string|max:255', - 'note' => 'nullable|string|max:1000' - ]; - } - - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return Gate::allows('create_sale_returns'); - } -} diff --git a/Modules/SalesReturn/Http/Requests/UpdateSaleReturnRequest.php b/Modules/SalesReturn/Http/Requests/UpdateSaleReturnRequest.php deleted file mode 100644 index 50004f6a..00000000 --- a/Modules/SalesReturn/Http/Requests/UpdateSaleReturnRequest.php +++ /dev/null @@ -1,40 +0,0 @@ - 'required|numeric', - 'reference' => 'required|string|max:255', - 'tax_percentage' => 'required|integer|min:0|max:100', - 'discount_percentage' => 'required|integer|min:0|max:100', - 'shipping_amount' => 'required|numeric', - 'total_amount' => 'required|numeric', - 'paid_amount' => 'required|numeric|max:' . $this->sale_return->total_amount, - 'status' => 'required|string|max:255', - 'payment_method' => 'required|string|max:255', - 'note' => 'nullable|string|max:1000' - ]; - } - - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return Gate::allows('edit_sale_returns'); - } -} diff --git a/Modules/SalesReturn/Providers/.gitkeep b/Modules/SalesReturn/Providers/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Providers/RouteServiceProvider.php b/Modules/SalesReturn/Providers/RouteServiceProvider.php deleted file mode 100644 index e4864eb1..00000000 --- a/Modules/SalesReturn/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,69 +0,0 @@ -mapApiRoutes(); - - $this->mapWebRoutes(); - } - - /** - * Define the "web" routes for the application. - * - * These routes all receive session state, CSRF protection, etc. - * - * @return void - */ - protected function mapWebRoutes() - { - Route::middleware('web') - ->namespace($this->moduleNamespace) - ->group(module_path('SalesReturn', '/Routes/web.php')); - } - - /** - * Define the "api" routes for the application. - * - * These routes are typically stateless. - * - * @return void - */ - protected function mapApiRoutes() - { - Route::prefix('api') - ->middleware('api') - ->namespace($this->moduleNamespace) - ->group(module_path('SalesReturn', '/Routes/api.php')); - } -} diff --git a/Modules/SalesReturn/Providers/SalesReturnServiceProvider.php b/Modules/SalesReturn/Providers/SalesReturnServiceProvider.php deleted file mode 100644 index 288795cd..00000000 --- a/Modules/SalesReturn/Providers/SalesReturnServiceProvider.php +++ /dev/null @@ -1,112 +0,0 @@ -registerTranslations(); - $this->registerConfig(); - $this->registerViews(); - $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations')); - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - $this->app->register(RouteServiceProvider::class); - } - - /** - * Register config. - * - * @return void - */ - protected function registerConfig() - { - $this->publishes([ - module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'), - ], 'config'); - $this->mergeConfigFrom( - module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower - ); - } - - /** - * Register views. - * - * @return void - */ - public function registerViews() - { - $viewPath = resource_path('views/modules/' . $this->moduleNameLower); - - $sourcePath = module_path($this->moduleName, 'Resources/views'); - - $this->publishes([ - $sourcePath => $viewPath - ], ['views', $this->moduleNameLower . '-module-views']); - - $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); - } - - /** - * Register translations. - * - * @return void - */ - public function registerTranslations() - { - $langPath = resource_path('lang/modules/' . $this->moduleNameLower); - - if (is_dir($langPath)) { - $this->loadTranslationsFrom($langPath, $this->moduleNameLower); - } else { - $this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower); - } - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return []; - } - - private function getPublishableViewPaths(): array - { - $paths = []; - foreach (\Config::get('view.paths') as $path) { - if (is_dir($path . '/modules/' . $this->moduleNameLower)) { - $paths[] = $path . '/modules/' . $this->moduleNameLower; - } - } - return $paths; - } -} diff --git a/Modules/SalesReturn/Resources/assets/.gitkeep b/Modules/SalesReturn/Resources/assets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Resources/assets/js/app.js b/Modules/SalesReturn/Resources/assets/js/app.js deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Resources/assets/sass/app.scss b/Modules/SalesReturn/Resources/assets/sass/app.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Resources/lang/.gitkeep b/Modules/SalesReturn/Resources/lang/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Resources/views/.gitkeep b/Modules/SalesReturn/Resources/views/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Resources/views/create.blade.php b/Modules/SalesReturn/Resources/views/create.blade.php deleted file mode 100644 index 0a16503a..00000000 --- a/Modules/SalesReturn/Resources/views/create.blade.php +++ /dev/null @@ -1,139 +0,0 @@ -@extends('layouts.app') - -@section('title', 'Create Sale Return') - -@section('breadcrumb') - -@endsection - -@section('content') -
-
-
- -
-
- -
-
-
-
- @include('utils.alerts') -
- @csrf - -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
- - - -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
- -
- -
- -
-
-
-
-
- -
- - -
- -
- -
- -
-
-
-
-
-@endsection - -@push('page_scripts') - - -@endpush diff --git a/Modules/SalesReturn/Resources/views/edit.blade.php b/Modules/SalesReturn/Resources/views/edit.blade.php deleted file mode 100644 index 658777a2..00000000 --- a/Modules/SalesReturn/Resources/views/edit.blade.php +++ /dev/null @@ -1,124 +0,0 @@ -@extends('layouts.app') - -@section('title', 'Edit Sale Return') - -@section('breadcrumb') - -@endsection - -@section('content') -
-
-
- -
-
- -
-
-
-
- @include('utils.alerts') -
- @csrf - @method('patch') -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
- - - -
-
-
- - -
-
-
-
-
- - -
-
-
-
-
- - -
-
-
- -
- - -
- -
- -
- -
-
-
-
-
-@endsection - -@push('page_scripts') - - -@endpush diff --git a/Modules/SalesReturn/Resources/views/index.blade.php b/Modules/SalesReturn/Resources/views/index.blade.php deleted file mode 100644 index 20cb496c..00000000 --- a/Modules/SalesReturn/Resources/views/index.blade.php +++ /dev/null @@ -1,40 +0,0 @@ -@extends('layouts.app') - -@section('title', 'Sale Returns') - -@section('third_party_stylesheets') - -@endsection - -@section('breadcrumb') - -@endsection - -@section('content') -
-
-
-
-
- - Add Sale Return - - -
- -
- {!! $dataTable->table() !!} -
-
-
-
-
-
-@endsection - -@push('page_scripts') - {!! $dataTable->scripts() !!} -@endpush diff --git a/Modules/SalesReturn/Resources/views/partials/actions.blade.php b/Modules/SalesReturn/Resources/views/partials/actions.blade.php deleted file mode 100644 index c401b726..00000000 --- a/Modules/SalesReturn/Resources/views/partials/actions.blade.php +++ /dev/null @@ -1,42 +0,0 @@ -
- - -
diff --git a/Modules/SalesReturn/Resources/views/partials/payment-status.blade.php b/Modules/SalesReturn/Resources/views/partials/payment-status.blade.php deleted file mode 100644 index 7ac6bf4c..00000000 --- a/Modules/SalesReturn/Resources/views/partials/payment-status.blade.php +++ /dev/null @@ -1,13 +0,0 @@ -@if ($data->payment_status == 'Partial') - - {{ $data->payment_status }} - -@elseif ($data->payment_status == 'Paid') - - {{ $data->payment_status }} - -@else - - {{ $data->payment_status }} - -@endif diff --git a/Modules/SalesReturn/Resources/views/partials/status.blade.php b/Modules/SalesReturn/Resources/views/partials/status.blade.php deleted file mode 100644 index e6f2dfe7..00000000 --- a/Modules/SalesReturn/Resources/views/partials/status.blade.php +++ /dev/null @@ -1,13 +0,0 @@ -@if ($data->status == 'Pending') - - {{ $data->status }} - -@elseif ($data->status == 'Shipped') - - {{ $data->status }} - -@else - - {{ $data->status }} - -@endif diff --git a/Modules/SalesReturn/Resources/views/payments/create.blade.php b/Modules/SalesReturn/Resources/views/payments/create.blade.php deleted file mode 100644 index fca8985e..00000000 --- a/Modules/SalesReturn/Resources/views/payments/create.blade.php +++ /dev/null @@ -1,114 +0,0 @@ -@extends('layouts.app') - -@section('title', 'Create Payment') - -@section('breadcrumb') - -@endsection - -@section('content') -
-
- @csrf -
-
- @include('utils.alerts') -
- -
-
-
-
-
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
- -
- -
- -
-
-
-
-
-
-
- - -
-
-
-
- -
- - -
- - -
-
-
-
-
-
-@endsection - -@push('page_scripts') - - -@endpush - diff --git a/Modules/SalesReturn/Resources/views/payments/edit.blade.php b/Modules/SalesReturn/Resources/views/payments/edit.blade.php deleted file mode 100644 index 43f8e723..00000000 --- a/Modules/SalesReturn/Resources/views/payments/edit.blade.php +++ /dev/null @@ -1,117 +0,0 @@ -@extends('layouts.app') - -@section('title', 'Edit Payment') - -@section('breadcrumb') - -@endsection - -@section('content') -
-
- @csrf - @method('patch') -
-
- @include('utils.alerts') -
- -
-
-
-
-
-
-
-
- - -
-
-
-
- - -
-
-
- -
-
-
- - -
-
-
-
- -
- -
- -
-
-
-
-
-
-
- - -
-
-
-
- -
- - -
- - -
-
-
-
-
-
-@endsection - -@push('page_scripts') - - -@endpush - diff --git a/Modules/SalesReturn/Resources/views/payments/index.blade.php b/Modules/SalesReturn/Resources/views/payments/index.blade.php deleted file mode 100644 index a92f0ebc..00000000 --- a/Modules/SalesReturn/Resources/views/payments/index.blade.php +++ /dev/null @@ -1,37 +0,0 @@ -@extends('layouts.app') - -@section('title', 'Sale Payments') - -@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/SalesReturn/Resources/views/payments/partials/actions.blade.php b/Modules/SalesReturn/Resources/views/payments/partials/actions.blade.php deleted file mode 100644 index 5532260d..00000000 --- a/Modules/SalesReturn/Resources/views/payments/partials/actions.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -@can('access_sale_return_payments') - - - -@endcan -@can('access_sale_return_payments') - -@endcan diff --git a/Modules/SalesReturn/Resources/views/print.blade.php b/Modules/SalesReturn/Resources/views/print.blade.php deleted file mode 100644 index ee5eb6e6..00000000 --- a/Modules/SalesReturn/Resources/views/print.blade.php +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - Sale Return Details - - - -
-
-
-
- Logo -

- Reference:: {{ $sale_return->reference }} -

-
-
-
-
-
-

Company Info:

-
{{ settings()->company_name }}
-
{{ settings()->company_address }}
-
Email: {{ settings()->company_email }}
-
Phone: {{ settings()->company_phone }}
-
- -
-

Customer Info:

-
{{ $customer->customer_name }}
-
{{ $customer->address }}
-
Email: {{ $customer->customer_email }}
-
Phone: {{ $customer->customer_phone }}
-
- -
-

Invoice Info:

-
Invoice: INV/{{ $sale_return->reference }}
-
Date: {{ \Carbon\Carbon::parse($sale_return->date)->format('d M, Y') }}
-
- Status: {{ $sale_return->status }} -
-
- Payment Status: {{ $sale_return->payment_status }} -
-
- -
- -
- - - - - - - - - - - - - @foreach($sale_return->saleReturnDetails as $item) - - - - - - - - - - - - - - @endforeach - -
ProductNet Unit PriceQuantityDiscountTaxSub Total
- {{ $item->product_name }}
- - {{ $item->product_code }} - -
{{ format_currency($item->unit_price) }} - {{ $item->quantity }} - - {{ format_currency($item->product_discount_amount) }} - - {{ format_currency($item->product_tax_amount) }} - - {{ format_currency($item->sub_total) }} -
-
-
-
- - - - - - - - - - - - - - - - - - - -
Discount ({{ $sale_return->discount_percentage }}%){{ format_currency($sale_return->discount_amount) }}
Tax ({{ $sale_return->tax_percentage }}%){{ format_currency($sale_return->tax_amount) }}
Shipping){{ format_currency($sale_return->shipping_amount) }}
Grand Total{{ format_currency($sale_return->total_amount) }}
-
-
-
-
-

{{ settings()->company_name }} © {{ date('Y') }}.

-
-
-
-
-
-
-
- - diff --git a/Modules/SalesReturn/Resources/views/show.blade.php b/Modules/SalesReturn/Resources/views/show.blade.php deleted file mode 100644 index a918556e..00000000 --- a/Modules/SalesReturn/Resources/views/show.blade.php +++ /dev/null @@ -1,135 +0,0 @@ -@extends('layouts.app') - -@section('title', 'Sales Details') - -@section('breadcrumb') - -@endsection - -@section('content') -
-
-
-
-
-
- Reference: {{ $sale_return->reference }} -
- - Print - - - Save - -
-
-
-
-
Company Info:
-
{{ settings()->company_name }}
-
{{ settings()->company_address }}
-
Email: {{ settings()->company_email }}
-
Phone: {{ settings()->company_phone }}
-
- -
-
Customer Info:
-
{{ $customer->customer_name }}
-
{{ $customer->address }}
-
Email: {{ $customer->customer_email }}
-
Phone: {{ $customer->customer_phone }}
-
- -
-
Invoice Info:
-
Invoice: INV/{{ $sale_return->reference }}
-
Date: {{ \Carbon\Carbon::parse($sale_return->date)->format('d M, Y') }}
-
- Status: {{ $sale_return->status }} -
-
- Payment Status: {{ $sale_return->payment_status }} -
-
- -
- -
- - - - - - - - - - - - - @foreach($sale_return->saleReturnDetails as $item) - - - - - - - - - - - - - - @endforeach - -
ProductNet Unit PriceQuantityDiscountTaxSub Total
- {{ $item->product_name }}
- - {{ $item->product_code }} - -
{{ format_currency($item->unit_price) }} - {{ $item->quantity }} - - {{ format_currency($item->product_discount_amount) }} - - {{ format_currency($item->product_tax_amount) }} - - {{ format_currency($item->sub_total) }} -
-
-
-
- - - - - - - - - - - - - - - - - - - -
Discount ({{ $sale_return->discount_percentage }}%){{ format_currency($sale_return->discount_amount) }}
Tax ({{ $sale_return->tax_percentage }}%){{ format_currency($sale_return->tax_amount) }}
Shipping){{ format_currency($sale_return->shipping_amount) }}
Grand Total{{ format_currency($sale_return->total_amount) }}
-
-
-
-
-
-
-
-@endsection - diff --git a/Modules/SalesReturn/Routes/.gitkeep b/Modules/SalesReturn/Routes/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Routes/api.php b/Modules/SalesReturn/Routes/api.php deleted file mode 100644 index 6d64ca74..00000000 --- a/Modules/SalesReturn/Routes/api.php +++ /dev/null @@ -1,18 +0,0 @@ -get('/salesreturn', function (Request $request) { - return $request->user(); -}); \ No newline at end of file diff --git a/Modules/SalesReturn/Routes/web.php b/Modules/SalesReturn/Routes/web.php deleted file mode 100644 index f6f759b0..00000000 --- a/Modules/SalesReturn/Routes/web.php +++ /dev/null @@ -1,44 +0,0 @@ - 'auth'], function () { - //Generate PDF - Route::get('/sale-returns/pdf/{id}', function ($id) { - $saleReturn = \Modules\SalesReturn\Entities\SaleReturn::findOrFail($id); - $customer = \Modules\People\Entities\Customer::findOrFail($saleReturn->customer_id); - - $pdf = \PDF::loadView('salesreturn::print', [ - 'sale_return' => $saleReturn, - 'customer' => $customer, - ])->setPaper('a4'); - - return $pdf->stream('sale-return-'. $saleReturn->reference .'.pdf'); - })->name('sale-returns.pdf'); - - //Sale Returns - Route::resource('sale-returns', 'SalesReturnController'); - - //Payments - Route::get('/sale-return-payments/{sale_return_id}', 'SaleReturnPaymentsController@index') - ->name('sale-return-payments.index'); - Route::get('/sale-return-payments/{sale_return_id}/create', 'SaleReturnPaymentsController@create') - ->name('sale-return-payments.create'); - Route::post('/sale-return-payments/store', 'SaleReturnPaymentsController@store') - ->name('sale-return-payments.store'); - Route::get('/sale-return-payments/{sale_return_id}/edit/{saleReturnPayment}', 'SaleReturnPaymentsController@edit') - ->name('sale-return-payments.edit'); - Route::patch('/sale-return-payments/update/{saleReturnPayment}', 'SaleReturnPaymentsController@update') - ->name('sale-return-payments.update'); - Route::delete('/sale-return-payments/destroy/{saleReturnPayment}', 'SaleReturnPaymentsController@destroy') - ->name('sale-return-payments.destroy'); -}); diff --git a/Modules/SalesReturn/Tests/Feature/.gitkeep b/Modules/SalesReturn/Tests/Feature/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/Tests/Unit/.gitkeep b/Modules/SalesReturn/Tests/Unit/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Modules/SalesReturn/composer.json b/Modules/SalesReturn/composer.json deleted file mode 100644 index 44f24558..00000000 --- a/Modules/SalesReturn/composer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "nwidart/salesreturn", - "description": "", - "authors": [ - { - "name": "Nicolas Widart", - "email": "n.widart@gmail.com" - } - ], - "extra": { - "laravel": { - "providers": [], - "aliases": { - - } - } - }, - "autoload": { - "psr-4": { - "Modules\\SalesReturn\\": "" - } - } -} diff --git a/Modules/SalesReturn/module.json b/Modules/SalesReturn/module.json deleted file mode 100644 index 39a39a48..00000000 --- a/Modules/SalesReturn/module.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "SalesReturn", - "alias": "salesreturn", - "description": "", - "keywords": [], - "priority": 0, - "providers": [ - "Modules\\SalesReturn\\Providers\\SalesReturnServiceProvider" - ], - "aliases": {}, - "files": [], - "requires": [] -} diff --git a/Modules/SalesReturn/package.json b/Modules/SalesReturn/package.json deleted file mode 100644 index 4599509f..00000000 --- a/Modules/SalesReturn/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "private": true, - "scripts": { - "dev": "npm run development", - "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "watch-poll": "npm run watch -- --watch-poll", - "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", - "prod": "npm run production", - "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" - }, - "devDependencies": { - "cross-env": "^7.0", - "laravel-mix": "^5.0.1", - "laravel-mix-merge-manifest": "^0.1.2" - } -} diff --git a/Modules/SalesReturn/webpack.mix.js b/Modules/SalesReturn/webpack.mix.js deleted file mode 100644 index 97a5c6a9..00000000 --- a/Modules/SalesReturn/webpack.mix.js +++ /dev/null @@ -1,14 +0,0 @@ -const dotenvExpand = require('dotenv-expand'); -dotenvExpand(require('dotenv').config({ path: '../../.env'/*, debug: true*/})); - -const mix = require('laravel-mix'); -require('laravel-mix-merge-manifest'); - -mix.setPublicPath('../../public').mergeManifest(); - -mix.js(__dirname + '/Resources/assets/js/app.js', 'js/salesreturn.js') - .sass( __dirname + '/Resources/assets/sass/app.scss', 'css/salesreturn.css'); - -if (mix.inProduction()) { - mix.version(); -} diff --git a/Modules/Setting/Database/Seeders/SettingDatabaseSeeder.php b/Modules/Setting/Database/Seeders/SettingDatabaseSeeder.php index 4e436e39..283a2818 100644 --- a/Modules/Setting/Database/Seeders/SettingDatabaseSeeder.php +++ b/Modules/Setting/Database/Seeders/SettingDatabaseSeeder.php @@ -5,6 +5,7 @@ namespace Modules\Setting\Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Database\Eloquent\Model; use Modules\Setting\Entities\Setting; +use Modules\Currency\Entities\Currency; class SettingDatabaseSeeder extends Seeder { @@ -15,15 +16,19 @@ class SettingDatabaseSeeder extends Seeder */ public function run() { + // Get default currency (IDR) + $currency = Currency::where('code', 'IDR')->first(); + Setting::create([ - 'company_name' => 'Triangle POS', - 'company_email' => 'company@test.com', - 'company_phone' => '012345678901', - 'notification_email' => 'notification@test.com', - 'default_currency_id' => 1, - 'default_currency_position' => 'prefix', - 'footer_text' => 'Triangle Pos © 2021 || Developed by Fahim Anzam', - 'company_address' => 'Tangail, Bangladesh' + 'company_name' => 'Toko Al Fatih', + 'company_email' => 'info@al-fatih.com', + 'company_phone' => '1234567890', + 'notification_email' => 'notification@al-fatih.com', + 'default_currency_id' => $currency->id, + 'default_currency_position' => 'left', + 'footer_text' => 'Toko Al Fatih © 2024', + 'company_address' => 'Jl. Example No. 123', + ]); } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 55c59348..f1e96a35 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -11,19 +11,39 @@ use Modules\PurchasesReturn\Entities\PurchaseReturn; use Modules\PurchasesReturn\Entities\PurchaseReturnPayment; use Modules\Sale\Entities\Sale; use Modules\Sale\Entities\SalePayment; -use Modules\SalesReturn\Entities\SaleReturn; -use Modules\SalesReturn\Entities\SaleReturnPayment; class HomeController extends Controller { public function index() { - $sales = Sale::completed()->sum('total_amount'); - $sale_returns = SaleReturn::completed()->sum('total_amount'); - $purchase_returns = PurchaseReturn::completed()->sum('total_amount'); + // Cek session dulu + $activeBranchId = session('active_branch_id'); + + // Jika tidak ada di session, coba ambil dari user + if (!$activeBranchId) { + $user = auth()->user(); + if ($user && $user->active_branch) { + $activeBranchId = $user->active_branch->id; + } else { + // Default ke branch ID 1 jika tidak ada + $activeBranchId = 1; + session(['active_branch_id' => $activeBranchId]); + } + } + + $sales = Sale::where('payment_status', 'Completed') + ->where('branch_id', $activeBranchId) + ->sum('total_amount'); + + $purchase_returns = PurchaseReturn::where('payment_status', 'Completed') + ->where('branch_id', $activeBranchId) + ->sum('total_amount'); + $product_costs = 0; - foreach (Sale::completed()->with('saleDetails')->get() as $sale) { + foreach (Sale::where('payment_status', 'Completed') + ->where('branch_id', $activeBranchId) + ->with('saleDetails')->get() as $sale) { foreach ($sale->saleDetails as $saleDetail) { if (!is_null($saleDetail->product)) { $product_costs += $saleDetail->product->product_cost * $saleDetail->quantity; @@ -31,12 +51,11 @@ class HomeController extends Controller } } - $revenue = ($sales - $sale_returns) / 100; + $revenue = $sales / 100; $profit = $revenue - $product_costs; return view('home', [ 'revenue' => $revenue, - 'sale_returns' => $sale_returns / 100, 'purchase_returns' => $purchase_returns / 100, 'profit' => $profit ]); @@ -46,15 +65,24 @@ class HomeController extends Controller public function currentMonthChart() { abort_if(!request()->ajax(), 404); - $currentMonthSales = Sale::where('status', 'Completed')->whereMonth('date', date('m')) - ->whereYear('date', date('Y')) - ->sum('total_amount') / 100; - $currentMonthPurchases = Purchase::where('status', 'Completed')->whereMonth('date', date('m')) - ->whereYear('date', date('Y')) - ->sum('total_amount') / 100; - $currentMonthExpenses = Expense::whereMonth('date', date('m')) - ->whereYear('date', date('Y')) - ->sum('amount') / 100; + $activeBranchId = session('active_branch_id') ?? 1; + + $currentMonthSales = Sale::where('payment_status', 'Completed') + ->where('branch_id', $activeBranchId) + ->whereMonth('date', date('m')) + ->whereYear('date', date('Y')) + ->sum('total_amount') / 100; + + $currentMonthPurchases = Purchase::where('payment_status', 'Completed') + ->where('branch_id', $activeBranchId) + ->whereMonth('date', date('m')) + ->whereYear('date', date('Y')) + ->sum('total_amount') / 100; + + $currentMonthExpenses = Expense::where('branch_id', $activeBranchId) + ->whereMonth('date', date('m')) + ->whereYear('date', date('Y')) + ->sum('amount') / 100; return response()->json([ 'sales' => $currentMonthSales, @@ -67,6 +95,8 @@ class HomeController extends Controller public function salesPurchasesChart() { abort_if(!request()->ajax(), 404); + $activeBranchId = session('active_branch_id') ?? 1; + $sales = $this->salesChartData(); $purchases = $this->purchasesChartData(); @@ -77,6 +107,8 @@ class HomeController extends Controller public function paymentChart() { abort_if(!request()->ajax(), 404); + $activeBranchId = session('active_branch_id') ?? 1; + $dates = collect(); foreach (range(-11, 0) as $i) { $date = Carbon::now()->addMonths($i)->format('m-Y'); @@ -86,14 +118,7 @@ class HomeController extends Controller $date_range = Carbon::today()->subYear()->format('Y-m-d'); $sale_payments = SalePayment::where('date', '>=', $date_range) - ->select([ - DB::raw("DATE_FORMAT(date, '%m-%Y') as month"), - DB::raw("SUM(amount) as amount") - ]) - ->groupBy('month')->orderBy('month') - ->get()->pluck('amount', 'month'); - - $sale_return_payments = SaleReturnPayment::where('date', '>=', $date_range) + ->where('branch_id', $activeBranchId) ->select([ DB::raw("DATE_FORMAT(date, '%m-%Y') as month"), DB::raw("SUM(amount) as amount") @@ -102,6 +127,7 @@ class HomeController extends Controller ->get()->pluck('amount', 'month'); $purchase_payments = PurchasePayment::where('date', '>=', $date_range) + ->where('branch_id', $activeBranchId) ->select([ DB::raw("DATE_FORMAT(date, '%m-%Y') as month"), DB::raw("SUM(amount) as amount") @@ -110,6 +136,7 @@ class HomeController extends Controller ->get()->pluck('amount', 'month'); $purchase_return_payments = PurchaseReturnPayment::where('date', '>=', $date_range) + ->where('branch_id', $activeBranchId) ->select([ DB::raw("DATE_FORMAT(date, '%m-%Y') as month"), DB::raw("SUM(amount) as amount") @@ -118,6 +145,7 @@ class HomeController extends Controller ->get()->pluck('amount', 'month'); $expenses = Expense::where('date', '>=', $date_range) + ->where('branch_id', $activeBranchId) ->select([ DB::raw("DATE_FORMAT(date, '%m-%Y') as month"), DB::raw("SUM(amount) as amount") @@ -125,8 +153,8 @@ class HomeController extends Controller ->groupBy('month')->orderBy('month') ->get()->pluck('amount', 'month'); - $payment_received = array_merge_numeric_values($sale_payments, $purchase_return_payments); - $payment_sent = array_merge_numeric_values($purchase_payments, $sale_return_payments, $expenses); + $payment_received = $sale_payments; + $payment_sent = array_merge_numeric_values($purchase_payments, $expenses); $dates_received = $dates->merge($payment_received); $dates_sent = $dates->merge($payment_sent); @@ -152,6 +180,8 @@ class HomeController extends Controller } public function salesChartData() { + $activeBranchId = session('active_branch_id') ?? 1; + $dates = collect(); foreach (range(-6, 0) as $i) { $date = Carbon::now()->addDays($i)->format('d-m-y'); @@ -160,7 +190,8 @@ class HomeController extends Controller $date_range = Carbon::today()->subDays(6); - $sales = Sale::where('status', 'Completed') + $sales = Sale::where('payment_status', 'Completed') + ->where('branch_id', $activeBranchId) ->where('date', '>=', $date_range) ->groupBy(DB::raw("DATE_FORMAT(date,'%d-%m-%y')")) ->orderBy('date') @@ -184,6 +215,8 @@ class HomeController extends Controller public function purchasesChartData() { + $activeBranchId = session('active_branch_id') ?? 1; + $dates = collect(); foreach (range(-6, 0) as $i) { $date = Carbon::now()->addDays($i)->format('d-m-y'); @@ -192,7 +225,8 @@ class HomeController extends Controller $date_range = Carbon::today()->subDays(6); - $purchases = Purchase::where('status', 'Completed') + $purchases = Purchase::where('payment_status', 'Completed') + ->where('branch_id', $activeBranchId) ->where('date', '>=', $date_range) ->groupBy(DB::raw("DATE_FORMAT(date,'%d-%m-%y')")) ->orderBy('date') diff --git a/app/Models/Branch.php b/app/Models/Branch.php new file mode 100644 index 00000000..04d0aafb --- /dev/null +++ b/app/Models/Branch.php @@ -0,0 +1,25 @@ + 'boolean', + ]; + + public function users() + { + return $this->belongsToMany(User::class, 'branch_user')->withTimestamps(); + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index b5afdfed..7ce54f15 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -58,4 +58,9 @@ class User extends Authenticatable implements HasMedia public function scopeIsActive(Builder $builder) { return $builder->where('is_active', 1); } + + public function branches() + { + return $this->belongsToMany(Branch::class, 'branch_user')->withTimestamps(); + } } diff --git a/database/migrations/2024_03_21_create_branch_user_table.php b/database/migrations/2024_03_21_create_branch_user_table.php new file mode 100644 index 00000000..a6eca5cf --- /dev/null +++ b/database/migrations/2024_03_21_create_branch_user_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('branch_id')->constrained('branches')->onDelete('cascade'); + $table->foreignId('user_id')->constrained('users')->onDelete('cascade'); + $table->timestamps(); + + // Prevent duplicate entries + $table->unique(['branch_id', 'user_id']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('branch_user'); + } +}; \ No newline at end of file diff --git a/database/seeders/SettingDatabaseSeeder.php b/database/seeders/SettingDatabaseSeeder.php new file mode 100644 index 00000000..1ccc700b --- /dev/null +++ b/database/seeders/SettingDatabaseSeeder.php @@ -0,0 +1,41 @@ +first(); + + // Create default settings if not exists + if (!Setting::first()) { + Setting::create([ + 'default_currency_id' => $currency->id, + 'company_name' => 'Toko Al Fatih', + 'company_email' => 'info@al-fatih.com', + 'company_phone' => '1234567890', + 'company_address' => 'Jl. Example No. 123', + 'company_logo' => null, + 'company_favicon' => null, + 'company_currency_position' => 'prefix', + 'company_timezone' => 'Asia/Jakarta', + 'company_date_format' => 'd-m-Y', + 'company_time_format' => 'H:i:s', + 'company_fiscal_year' => '1-12', + 'company_tax_number' => '1234567890', + 'company_vat_number' => '1234567890' + ]); + } + } +} \ No newline at end of file diff --git a/database/seeders/SuperUserSeeder.php b/database/seeders/SuperUserSeeder.php index 0838b919..f93a8484 100644 --- a/database/seeders/SuperUserSeeder.php +++ b/database/seeders/SuperUserSeeder.php @@ -3,6 +3,7 @@ namespace Database\Seeders; use App\Models\User; +use App\Models\Branch; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\Hash; use Spatie\Permission\Models\Role; @@ -16,6 +17,10 @@ class SuperUserSeeder extends Seeder */ public function run() { + // Get default branch + $branch = Branch::where('name', 'Toko Al Fatih Pusat')->first(); + + // Create super admin user $user = User::create([ 'name' => 'Administrator', 'email' => 'super.admin@test.com', @@ -23,10 +28,14 @@ class SuperUserSeeder extends Seeder 'is_active' => 1 ]); + // Create and assign Super Admin role $superAdmin = Role::create([ 'name' => 'Super Admin' ]); $user->assignRole($superAdmin); + + // Attach user to branch + $user->branches()->attach($branch->id); } } diff --git a/modules_statuses.json b/modules_statuses.json index ee5b40b7..9d61270a 100644 --- a/modules_statuses.json +++ b/modules_statuses.json @@ -13,5 +13,6 @@ "SalesReturn": true, "PurchasesReturn": true, "Quotation": true, - "Reports": true + "Reports": true, + "Branch": true } \ No newline at end of file diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 82692cd3..12263b69 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -26,20 +26,6 @@ -
-
-
-
- -
-
-
{{ format_currency($sale_returns) }}
-
Sales Return
-
-
-
-
-
diff --git a/resources/views/layouts/menu.blade.php b/resources/views/layouts/menu.blade.php index cd1ffae8..5233a108 100644 --- a/resources/views/layouts/menu.blade.php +++ b/resources/views/layouts/menu.blade.php @@ -4,6 +4,28 @@ +@can('access_branches') +
  • + + Branches + + +
  • +@endcan + @can('access_products')
  • @@ -156,30 +178,6 @@
  • @endcan -@can('access_sale_returns') -
  • - - Sale Returns - - @can('create_sale_returns') - - @endcan - -
  • -@endcan - @can('access_expenses')