diff --git a/Modules/Purchase/Config/.gitkeep b/Modules/Purchase/Config/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Config/config.php b/Modules/Purchase/Config/config.php new file mode 100644 index 00000000..b636464f --- /dev/null +++ b/Modules/Purchase/Config/config.php @@ -0,0 +1,5 @@ + 'Purchase' +]; diff --git a/Modules/Purchase/Console/.gitkeep b/Modules/Purchase/Console/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Database/Migrations/.gitkeep b/Modules/Purchase/Database/Migrations/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Database/Migrations/2021_08_08_021108_create_purchases_table.php b/Modules/Purchase/Database/Migrations/2021_08_08_021108_create_purchases_table.php new file mode 100644 index 00000000..055f2912 --- /dev/null +++ b/Modules/Purchase/Database/Migrations/2021_08_08_021108_create_purchases_table.php @@ -0,0 +1,48 @@ +id(); + $table->date('date'); + $table->string('reference'); + $table->unsignedBigInteger('supplier_id')->nullable(); + $table->string('supplier_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('supplier_id')->references('id')->on('suppliers')->nullOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('purchases'); + } +} diff --git a/Modules/Purchase/Database/Migrations/2021_08_08_021131_create_purchase_payments_table.php b/Modules/Purchase/Database/Migrations/2021_08_08_021131_create_purchase_payments_table.php new file mode 100644 index 00000000..da8b2258 --- /dev/null +++ b/Modules/Purchase/Database/Migrations/2021_08_08_021131_create_purchase_payments_table.php @@ -0,0 +1,38 @@ +id(); + $table->unsignedBigInteger('purchase_id'); + $table->integer('amount'); + $table->date('date'); + $table->string('reference'); + $table->string('payment_method'); + $table->text('note')->nullable(); + $table->foreign('purchase_id')->references('id')->on('purchase_payments')->cascadeOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('purchase_payments'); + } +} diff --git a/Modules/Purchase/Database/Migrations/2021_08_08_021713_create_purchase_details_table.php b/Modules/Purchase/Database/Migrations/2021_08_08_021713_create_purchase_details_table.php new file mode 100644 index 00000000..e5cb67de --- /dev/null +++ b/Modules/Purchase/Database/Migrations/2021_08_08_021713_create_purchase_details_table.php @@ -0,0 +1,46 @@ +id(); + $table->unsignedBigInteger('purchase_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('purchase_id')->references('id') + ->on('purchases')->cascadeOnDelete(); + $table->foreign('product_id')->references('id') + ->on('products')->nullOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('purchase_details'); + } +} diff --git a/Modules/Purchase/Database/Seeders/.gitkeep b/Modules/Purchase/Database/Seeders/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Database/Seeders/PurchaseDatabaseSeeder.php b/Modules/Purchase/Database/Seeders/PurchaseDatabaseSeeder.php new file mode 100644 index 00000000..4d7060db --- /dev/null +++ b/Modules/Purchase/Database/Seeders/PurchaseDatabaseSeeder.php @@ -0,0 +1,21 @@ +call("OthersTableSeeder"); + } +} diff --git a/Modules/Purchase/Database/factories/.gitkeep b/Modules/Purchase/Database/factories/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Entities/.gitkeep b/Modules/Purchase/Entities/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Entities/Purchase.php b/Modules/Purchase/Entities/Purchase.php new file mode 100644 index 00000000..c397e533 --- /dev/null +++ b/Modules/Purchase/Entities/Purchase.php @@ -0,0 +1,49 @@ +hasMany(PurchaseDetail::class, 'purchase_id', 'id'); + } + + public function purchasePayments() { + return $this->hasMany(PurchasePayment::class, 'purchase_id', 'id'); + } + + public function getReferenceAttribute($value) { + return strtoupper($value) . '_' . str_pad($this->attributes['id'], 6, '0', STR_PAD_LEFT); + } + + 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/Purchase/Entities/PurchaseDetail.php b/Modules/Purchase/Entities/PurchaseDetail.php new file mode 100644 index 00000000..7beadeda --- /dev/null +++ b/Modules/Purchase/Entities/PurchaseDetail.php @@ -0,0 +1,44 @@ +belongsTo(Product::class, 'product_id', 'id'); + } + + public function purchase() { + return $this->belongsTo(Purchase::class, 'purchase_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/Purchase/Entities/PurchasePayment.php b/Modules/Purchase/Entities/PurchasePayment.php new file mode 100644 index 00000000..04ddea66 --- /dev/null +++ b/Modules/Purchase/Entities/PurchasePayment.php @@ -0,0 +1,34 @@ +belongsTo(Purchase::class, 'purchase_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 scopeByPurchase($query) { + return $query->where('purchase_id', request()->route('purchase_id')); + } +} diff --git a/Modules/Purchase/Http/Controllers/.gitkeep b/Modules/Purchase/Http/Controllers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Http/Controllers/PurchaseController.php b/Modules/Purchase/Http/Controllers/PurchaseController.php new file mode 100644 index 00000000..6e9305d2 --- /dev/null +++ b/Modules/Purchase/Http/Controllers/PurchaseController.php @@ -0,0 +1,231 @@ +render('purchase::index'); + } + + + public function create() { + abort_if(Gate::denies('create_purchases'), 403); + + Cart::instance('purchase')->destroy(); + + return view('purchase::create'); + } + + + public function store(StorePurchaseRequest $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'; + } + + $purchase = Purchase::create([ + 'date' => $request->date, + 'reference' => $request->reference, + 'supplier_id' => $request->supplier_id, + 'supplier_name' => Supplier::findOrFail($request->supplier_id)->supplier_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('purchase')->tax() * 100, + 'discount_amount' => Cart::instance('purchase')->discount() * 100, + ]); + + foreach (Cart::instance('purchase')->content() as $cart_item) { + PurchaseDetail::create([ + 'purchase_id' => $purchase->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('purchase')->destroy(); + + PurchasePayment::create([ + 'date' => $request->date, + 'reference' => 'INV/'.$purchase->reference, + 'amount' => $purchase->paid_amount, + 'purchase_id' => $purchase->id, + 'payment_method' => $request->payment_method + ]); + }); + + toast('Purchase Created!', 'success'); + + return redirect()->route('purchases.index'); + } + + + public function show(Purchase $purchase) { + abort_if(Gate::denies('show_purchases'), 403); + + $supplier = Supplier::findOrFail($purchase->supplier_id); + + return view('purchase::show', compact('purchase', 'supplier')); + } + + + public function edit(Purchase $purchase) { + abort_if(Gate::denies('edit_purchases'), 403); + + $purchase_details = $purchase->purchaseDetails; + + Cart::instance('purchase')->destroy(); + + $cart = Cart::instance('purchase'); + + foreach ($purchase_details as $purchase_detail) { + $cart->add([ + 'id' => $purchase_detail->product_id, + 'name' => $purchase_detail->product_name, + 'qty' => $purchase_detail->quantity, + 'price' => $purchase_detail->price, + 'weight' => 1, + 'options' => [ + 'product_discount' => $purchase_detail->product_discount_amount, + 'product_discount_type' => $purchase_detail->product_discount_type, + 'sub_total' => $purchase_detail->sub_total, + 'code' => $purchase_detail->product_code, + 'stock' => Product::findOrFail($purchase_detail->product_id)->product_quantity, + 'product_tax' => $purchase_detail->product_tax_amount, + 'unit_price' => $purchase_detail->unit_price + ] + ]); + } + + return view('purchase::edit', compact('purchase')); + } + + + public function update(UpdatePurchaseRequest $request, Purchase $purchase) { + DB::transaction(function () use ($request, $purchase) { + $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 ($purchase->purchaseDetails as $purchase_detail) { + if ($purchase->status == 'Completed') { + $product = Product::findOrFail($purchase_detail->product_id); + $product->update([ + 'product_quantity' => $product->product_quantity - $purchase_detail->quantity + ]); + } + $purchase_detail->delete(); + } + + $purchase->update([ + 'date' => $request->date, + 'reference' => $request->reference, + 'supplier_id' => $request->supplier_id, + 'supplier_name' => Supplier::findOrFail($request->supplier_id)->supplier_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('purchase')->tax() * 100, + 'discount_amount' => Cart::instance('purchase')->discount() * 100, + ]); + + foreach (Cart::instance('purchase')->content() as $cart_item) { + PurchaseDetail::create([ + 'purchase_id' => $purchase->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('purchase')->destroy(); + }); + + toast('Purchase Updated!', 'info'); + + return redirect()->route('purchases.index'); + } + + + public function destroy(Purchase $purchase) { + abort_if(Gate::denies('delete_purchases'), 403); + + $purchase->delete(); + + toast('Purchase Deleted!', 'warning'); + + return redirect()->route('purchases.index'); + } +} diff --git a/Modules/Purchase/Http/Controllers/PurchasePaymentsController.php b/Modules/Purchase/Http/Controllers/PurchasePaymentsController.php new file mode 100644 index 00000000..6d17c15f --- /dev/null +++ b/Modules/Purchase/Http/Controllers/PurchasePaymentsController.php @@ -0,0 +1,147 @@ +render('purchase::payments.index', compact('purchase')); + } + + + public function create($purchase_id) { + abort_if(Gate::denies('access_purchase_payments'), 403); + + $purchase = Purchase::findOrFail($purchase_id); + + return view('purchase::payments.create', compact('purchase')); + } + + + public function store(Request $request) { + abort_if(Gate::denies('access_purchase_payments'), 403); + + $request->validate([ + 'date' => 'required|date', + 'reference' => 'required|string|max:255', + 'amount' => 'required|numeric', + 'note' => 'nullable|string|max:1000', + 'purchase_id' => 'required', + 'payment_method' => 'required|string|max:255' + ]); + + DB::transaction(function () use ($request) { + PurchasePayment::create([ + 'date' => $request->date, + 'reference' => $request->reference, + 'amount' => $request->amount, + 'note' => $request->note, + 'purchase_id' => $request->purchase_id, + 'payment_method' => $request->payment_method + ]); + + $purchase = Purchase::findOrFail($request->purchase_id); + + $due_amount = $purchase->due_amount - $request->amount; + + if ($due_amount == $purchase->total_amount) { + $payment_status = 'Unpaid'; + } elseif ($due_amount > 0) { + $payment_status = 'Partial'; + } else { + $payment_status = 'Paid'; + } + + $purchase->update([ + 'paid_amount' => ($purchase->paid_amount + $request->amount) * 100, + 'due_amount' => $due_amount * 100, + 'payment_status' => $payment_status + ]); + }); + + toast('Purchase Payment Created!', 'success'); + + return redirect()->route('purchases.index'); + } + + + public function edit($purchase_id, PurchasePayment $purchasePayment) { + abort_if(Gate::denies('access_purchase_payments'), 403); + + $purchase = Purchase::findOrFail($purchase_id); + + return view('purchase::payments.edit', compact('purchasePayment', 'purchase')); + } + + + public function update(Request $request, PurchasePayment $purchasePayment) { + abort_if(Gate::denies('access_purchase_payments'), 403); + + $request->validate([ + 'date' => 'required|date', + 'reference' => 'required|string|max:255', + 'amount' => 'required|numeric', + 'note' => 'nullable|string|max:1000', + 'purchase_id' => 'required', + 'payment_method' => 'required|string|max:255' + ]); + + DB::transaction(function () use ($request, $purchasePayment) { + $purchase = $purchasePayment->purchase; + + $due_amount = ($purchase->due_amount + $purchasePayment->amount) - $request->amount; + + if ($due_amount == $purchase->total_amount) { + $payment_status = 'Unpaid'; + } elseif ($due_amount > 0) { + $payment_status = 'Partial'; + } else { + $payment_status = 'Paid'; + } + + $purchase->update([ + 'paid_amount' => (($purchase->paid_amount - $purchasePayment->amount) + $request->amount) * 100, + 'due_amount' => $due_amount * 100, + 'payment_status' => $payment_status + ]); + + $purchasePayment->update([ + 'date' => $request->date, + 'reference' => $request->reference, + 'amount' => $request->amount, + 'note' => $request->note, + 'purchase_id' => $request->purchase_id, + 'payment_method' => $request->payment_method + ]); + }); + + toast('Purchase Payment Updated!', 'info'); + + return redirect()->route('purchases.index'); + } + + + public function destroy(PurchasePayment $purchasePayment) { + abort_if(Gate::denies('access_purchase_payments'), 403); + + $purchasePayment->delete(); + + toast('Purchase Payment Deleted!', 'warning'); + + return redirect()->route('purchases.index'); + } +} diff --git a/Modules/Purchase/Http/Middleware/.gitkeep b/Modules/Purchase/Http/Middleware/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Http/Requests/.gitkeep b/Modules/Purchase/Http/Requests/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Http/Requests/StorePurchaseRequest.php b/Modules/Purchase/Http/Requests/StorePurchaseRequest.php new file mode 100644 index 00000000..8650cdf9 --- /dev/null +++ b/Modules/Purchase/Http/Requests/StorePurchaseRequest.php @@ -0,0 +1,40 @@ + '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_sales'); + } +} diff --git a/Modules/Purchase/Http/Requests/UpdatePurchaseRequest.php b/Modules/Purchase/Http/Requests/UpdatePurchaseRequest.php new file mode 100644 index 00000000..626dc3b6 --- /dev/null +++ b/Modules/Purchase/Http/Requests/UpdatePurchaseRequest.php @@ -0,0 +1,40 @@ + '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->purchase->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_purchases'); + } +} diff --git a/Modules/Purchase/Providers/.gitkeep b/Modules/Purchase/Providers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Providers/PurchaseServiceProvider.php b/Modules/Purchase/Providers/PurchaseServiceProvider.php new file mode 100644 index 00000000..397fdb9f --- /dev/null +++ b/Modules/Purchase/Providers/PurchaseServiceProvider.php @@ -0,0 +1,112 @@ +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/Purchase/Providers/RouteServiceProvider.php b/Modules/Purchase/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..55cea7a2 --- /dev/null +++ b/Modules/Purchase/Providers/RouteServiceProvider.php @@ -0,0 +1,69 @@ +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('Purchase', '/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('Purchase', '/Routes/api.php')); + } +} diff --git a/Modules/Purchase/Resources/assets/.gitkeep b/Modules/Purchase/Resources/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Resources/assets/js/app.js b/Modules/Purchase/Resources/assets/js/app.js new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Resources/assets/sass/app.scss b/Modules/Purchase/Resources/assets/sass/app.scss new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Resources/lang/.gitkeep b/Modules/Purchase/Resources/lang/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Resources/views/.gitkeep b/Modules/Purchase/Resources/views/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/Purchase/Resources/views/create.blade.php b/Modules/Purchase/Resources/views/create.blade.php new file mode 100644 index 00000000..73b924b4 --- /dev/null +++ b/Modules/Purchase/Resources/views/create.blade.php @@ -0,0 +1,139 @@ +@extends('layouts.app') + +@section('title', 'Create Purchase') + +@section('breadcrumb') +
+@endsection + +@section('content') +
+ | Product | +Net Unit Price | +Stock | +Quantity | +Discount | +Tax | +Sub Total | +
|---|---|---|---|---|---|---|
|
+ {{ $item->product_name }} + + {{ $item->product_code }} + + |
+
+ {{ format_currency($item->unit_price) }} | + ++ {{ $item->product->product_quantity }} + | + ++ {{ $item->quantity }} + | + ++ {{ format_currency($item->product_discount_amount) }} + | + ++ {{ format_currency($item->product_tax_amount) }} + | + ++ {{ format_currency($item->sub_total) }} + | +
| Discount ({{ $purchase->discount_percentage }}%) | +{{ format_currency($purchase->discount_amount) }} | +
| Tax ({{ $purchase->tax_percentage }}%) | +{{ format_currency($purchase->tax_amount) }} | +
| Shipping) | +{{ format_currency($purchase->shipping_amount) }} | +
| Grand Total | +{{ format_currency($purchase->total_amount) }} | +
Computer generated invoice. {{ settings()->company_name }} © {{ date('Y') }}.
+| Product | +Net Unit Price | +Stock | +Quantity | +Discount | +Tax | +Sub Total | +
|---|---|---|---|---|---|---|
|
+ {{ $item->product_name }} + + {{ $item->product_code }} + + |
+
+ {{ format_currency($item->unit_price) }} | + ++ {{ $item->product->product_quantity }} + | + ++ {{ $item->quantity }} + | + ++ {{ format_currency($item->product_discount_amount) }} + | + ++ {{ format_currency($item->product_tax_amount) }} + | + ++ {{ format_currency($item->sub_total) }} + | +
| Discount ({{ $purchase->discount_percentage }}%) | +{{ format_currency($purchase->discount_amount) }} | +
| Tax ({{ $purchase->tax_percentage }}%) | +{{ format_currency($purchase->tax_amount) }} | +
| Shipping) | +{{ format_currency($purchase->shipping_amount) }} | +
| Grand Total | +{{ format_currency($purchase->total_amount) }} | +