MIF_E31222707/Modules/Quotation/Http/Controllers/QuotationController.php

175 lines
6.8 KiB
PHP

<?php
namespace Modules\Quotation\Http\Controllers;
use Gloudemans\Shoppingcart\Facades\Cart;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Modules\People\Entities\Customer;
use Modules\Product\Entities\Product;
use Modules\Quotation\DataTables\QuotationsDataTable;
use Modules\Quotation\Entities\Quotation;
use Modules\Quotation\Entities\QuotationDetails;
use Modules\Quotation\Http\Requests\StoreQuotationRequest;
use Modules\Quotation\Http\Requests\UpdateQuotationRequest;
class QuotationController extends Controller
{
public function index(QuotationsDataTable $dataTable) {
abort_if(Gate::denies('access_quotations'), 403);
return $dataTable->render('quotation::index');
}
public function create() {
abort_if(Gate::denies('create_quotations'), 403);
Cart::instance('quotation')->destroy();
return view('quotation::create');
}
public function store(StoreQuotationRequest $request) {
DB::transaction(function () use ($request) {
$quotation = Quotation::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,
'total_amount' => $request->total_amount * 100,
'status' => $request->status,
'note' => $request->note,
'tax_amount' => Cart::instance('quotation')->tax() * 100,
'discount_amount' => Cart::instance('quotation')->discount() * 100,
]);
foreach (Cart::instance('quotation')->content() as $cart_item) {
QuotationDetails::create([
'quotation_id' => $quotation->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,
]);
}
Cart::instance('quotation')->destroy();
});
toast('Quotation Created!', 'success');
return redirect()->route('quotations.index');
}
public function show(Quotation $quotation) {
abort_if(Gate::denies('show_quotations'), 403);
$customer = Customer::findOrFail($quotation->customer_id);
return view('quotation::show', compact('quotation', 'customer'));
}
public function edit(Quotation $quotation) {
abort_if(Gate::denies('edit_quotations'), 403);
$quotation_details = $quotation->quotationDetails;
Cart::instance('quotation')->destroy();
$cart = Cart::instance('quotation');
foreach ($quotation_details as $quotation_detail) {
$cart->add([
'id' => $quotation_detail->product_id,
'name' => $quotation_detail->product_name,
'qty' => $quotation_detail->quantity,
'price' => $quotation_detail->price,
'weight' => 1,
'options' => [
'product_discount' => $quotation_detail->product_discount_amount,
'product_discount_type' => $quotation_detail->product_discount_type,
'sub_total' => $quotation_detail->sub_total,
'code' => $quotation_detail->product_code,
'stock' => Product::findOrFail($quotation_detail->product_id)->product_quantity,
'product_tax' => $quotation_detail->product_tax_amount,
'unit_price' => $quotation_detail->unit_price
]
]);
}
return view('quotation::edit', compact('quotation'));
}
public function update(UpdateQuotationRequest $request, Quotation $quotation) {
DB::transaction(function () use ($request, $quotation) {
foreach ($quotation->quotationDetails as $quotation_detail) {
$quotation_detail->delete();
}
$quotation->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,
'total_amount' => $request->total_amount * 100,
'status' => $request->status,
'note' => $request->note,
'tax_amount' => Cart::instance('quotation')->tax() * 100,
'discount_amount' => Cart::instance('quotation')->discount() * 100,
]);
foreach (Cart::instance('quotation')->content() as $cart_item) {
QuotationDetails::create([
'quotation_id' => $quotation->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,
]);
}
Cart::instance('quotation')->destroy();
});
toast('Quotation Updated!', 'info');
return redirect()->route('quotations.index');
}
public function destroy(Quotation $quotation) {
abort_if(Gate::denies('delete_quotations'), 403);
$quotation->delete();
toast('Quotation Deleted!', 'warning');
return redirect()->route('quotations.index');
}
}