One Hat Cyber Team
Your IP :
3.19.75.187
Server IP :
104.21.16.1
Server :
Linux agrigation-prod 5.15.0-67-generic #74-Ubuntu SMP Wed Feb 22 14:14:39 UTC 2023 x86_64
Server Software :
nginx/1.24.0
PHP Version :
7.4.33
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
home
/
forge
/
app.gftag.com
/
app
/
Http
/
Controllers
/
View File Name :
SaleController.php
<?php namespace App\Http\Controllers; use App\Exports\SalesHistoryExport; use App\Http\Requests\SalesCreateRequest; use PDF; use App\Models\Item; use App\Models\Sale; use App\Models\Customer; use App\Models\SaleItem; use App\Models\CashSale; use App\Models\Organisation; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Models\CashBookTransaction; use App\Services\TransactionService; use Illuminate\Support\Facades\View; use App\Services\OrganisationService; use Maatwebsite\Excel\Facades\Excel; use Illuminate\Support\Str; class SaleController extends Controller { // public function saleView(Request $request) { if ($request->ajax()) { $filter_sales = $this->getFilteredData($request); return view('sale.partials.filtered-table-body-data', ['request' => $request], compact('filter_sales'))->render(); } else { if (View::exists('sale.index')) { $page_data = 10; $organisationService = new OrganisationService(); $org_id = $organisationService->getOrganisationByUser(); $sales = Sale::where('organisation_id', $org_id)->orderBy('sale_date', 'DESC')->paginate($page_data); $items = Item::where('organisation_id', $org_id)->get(); $customers = Customer::where('organisation_id', $org_id)->pluck('name', 'id'); $invoices = Sale::select('invoice_number')->where('organisation_id', $org_id)->get(); foreach ($sales as $sale) { $subtotal = round($sale->saleItems->sum('amount')); $base_amount = $subtotal; $discount = 0; if ($sale->discount > 0) { $discount = ($subtotal * $sale->discount) / 100; $base_amount = $subtotal - $discount; } $gst_total = 0; foreach ($sale->saleItems as $value) { $qty = $value->quantity; $price = $qty * $value->price; $line_discount = (int) ($price * $sale->discount) / 100; $price_after_discount = $price - $line_discount; $gst = ($sale->organisation->state_id == $sale->customer->state_id) ? ($value->item->sgst_rate + $value->item->cgst_rate) : $value->item->igst_rate; $gst_amount = round(($price_after_discount * $gst) / 100, 2); $gst_total = $gst_total + $gst_amount; } $sale->subtotal = $subtotal; $sale->discount = $discount; $sale->gst = $gst_total; $sale->income = CashBookTransaction::where('type', 'income')->where('reference_id', $sale->id)->sum('amount'); } } return view('sale.index', ['sales' => $sales, 'items' => $items, 'customers' => $customers, 'invoices' => $invoices]); } } public function getFilteredData($request) { $page_data = $request->records; $organisationService = new OrganisationService(); $org_id = $organisationService->getOrganisationByUser(); $sales_query = Sale::where('organisation_id', $org_id)->orderBy('sale_date', 'DESC') ->when($request->invoice, function ($q) use ($request) { $q->whereIn('invoice_number', Str::of($request->invoice)->explode(",")); }) ->when($request->customer, function ($q) use ($request) { $q->whereIn('customer_id', Str::of($request->customer)->explode(",")); }) ->when($request->start_date && !$request->end_date, function ($q) use ($request) { $q->where('sale_date', '>=', $request->start_date); }) ->when($request->end_date && !$request->start_date, function ($q) use ($request) { $q->where('sale_date', '<=', $request->end_date); }) ->when($request->start_date && $request->end_date, function ($q) use ($request) { $q->whereBetween('sale_date', [$request->start_date, $request->end_date]); }) ->when($request->text_search, function ($q) use ($request) { $q->where('invoice_number', 'like', '%' . $request->text_search . '%') ->orWhere('comments', 'like', '%' . $request->text_search . '%'); }); $filter_sales = $sales_query->paginate($page_data); foreach ($filter_sales as $sale) { $subtotal = round($sale->saleItems->sum('amount'), 2); $base_amount = $subtotal; $discount = 0; if ($sale->discount > 0) { $discount = ($subtotal * $sale->discount) / 100; $base_amount = $subtotal - $discount; } $gst_total = 0; foreach ($sale->saleItems as $value) { $qty = $value->quantity; $price = $qty * $value->price; $line_discount = (int) ($price * $sale->discount) / 100; $price_after_discount = $price - $line_discount; $gst = ($sale->organisation->state_id == $sale->customer->state_id) ? ($value->item->sgst_rate + $value->item->cgst_rate) : $value->item->igst_rate; $gst_amount = round(($price_after_discount * $gst) / 100, 2); $gst_total = $gst_total + $gst_amount; } $sale->subtotal = $subtotal; $sale->discount = $discount; $sale->gst = $gst_total; $sale->income = CashBookTransaction::where('type', 'income')->where('reference_id', $sale->id)->sum('amount'); } return $filter_sales; } public function createSale(Request $request) { if (View::exists('sale.create')) { $organisationService = new OrganisationService(); $org_id = $organisationService->getOrganisationByUser(); $organisation = Organisation::find($org_id); $items = Item::where('organisation_id', $org_id)->get(); $customers = Customer::where('organisation_id', $org_id)->get(); return view('sale.create', ['items' => $items, 'customers' => $customers, 'organisation' => $organisation]); } } public function store(SalesCreateRequest $request) { $organisationService = new OrganisationService(); $org_id = $organisationService->getOrganisationByUser(); $seller_id = $organisationService->getUser(); $available_credit = $this->calculateCustomerAvailableCredit($request, $org_id); if ($available_credit < 0) { return redirect()->back()->with('error', 'This customer credit limit expired. No invoice can be generated'); } $items = $request->item; $quantity = $request->quantity; $price = $request->price; $unit = $request->unit; DB::beginTransaction(); try { $invoiceNumber = $this->createInvoiceNumber($org_id); $sale = Sale::create([ 'organisation_id' => $org_id, 'customer_id' => (int)$request->customer, 'seller_id' => (int)$seller_id, 'invoice_number' => $invoiceNumber, 'fpo_invoice_number' => $request->fpo_invoice_number, 'type' => $request->sale_type, 'sale_date' => date('Y-m-d', strtotime($request->sale_date)), 'comments' => $request->comments, 'exclude_gst' => $request->exclude_gst ? $request->exclude_gst : 0, 'discount' => $request->discount, 'shipping_address' => $request->taxable_shipping_address, 'despatched_from' => $request->despatched_from ]); $transaction = new TransactionService(); foreach ($items as $key => $item) { $itemOb = Item::find($item); $saleItem = SaleItem::create([ "organisation_id" => $org_id, "sale_id" => $sale->id, "item_id" => (int)$item, "price" => $price[$key], "unit" => $unit[$key], "quantity" => $quantity[$key], "amount" => round($price[$key] * $quantity[$key], 2), "sale_date" => date('Y-m-d', strtotime($request->sale_date)) ]); if ($request->sale_type == "product") { $transaction->updateDailyTransaction( $org_id, "sale", (int)$item, $quantity[$key], date('Y-m-d', strtotime($request->sale_date)) ); $transaction->createNewTransactionEntry( $org_id, "sale", (int)$item, $quantity[$key], uniqid(), 'organisation', 'customer', date('Y-m-d', strtotime($request->sale_date)), get_class($saleItem), $saleItem->id ); } } $sale = Sale::find($sale->id); $total = $this->calculateSaleTotals($sale); $sale->total = $total; if ((int)$request->customer == 1 || (int)$request->customer == 2958) { $sale->is_cash_Sale = 1; CashSale::create([ "sale_id" => $sale->id, "name" => $request->name, "gst_number" => $request->gst, "billing_address" => $request->billing_address, "shipping_address" => $request->shipping_address ]); } $sale->save(); if ((int)$request->customer == 1 || (int)$request->customer == 2958) { $request->merge(['amount' => $total]); $request->merge(['reference' => $sale->id]); $cashbookTransition = new CashBookController(); $store_income = $cashbookTransition->storeIncome($request); }; DB::commit(); } catch (\Exception $e) { DB::rollback(); return redirect()->back()->with('message', 'Failed to create a Sale !'); } return redirect()->back()->with('message', 'Sale created successfully !'); } public function calculateCustomerAvailableCredit($request, $org_id) { if ($request->customer == 1) { return 1; } $customer = Customer::find($request->customer); if (!$customer->credit_balance) { return 1; } $organisation = Organisation::find($org_id); $total_sale_till_date = Sale::where('customer_id', $request->customer)->sum('total'); $total_paid_till_date = CashBookTransaction::where('customer_id', $request->customer)->sum('amount'); $total_due_till_date = $total_sale_till_date - $total_paid_till_date; $items = $request->item; $quantity = $request->quantity; $priceArr = $request->price; $base_amount = 0; foreach ($items as $key => $item) { $base_amount += $priceArr[$key] * $quantity[$key]; } if ($request->discount > 0) { $discount = (int) ($base_amount * $request->discount) / 100; $base_amount = $base_amount - $discount; } $gst_total = 0; foreach ($items as $key => $item) { $itemOb = Item::find($item); $qty = $quantity[$key]; $price = $qty * $priceArr[$key]; $line_discount = (int) ($price * $request->discount) / 100; $price_after_discount = $price - $line_discount; $gst = ($organisation->state_id == $customer->state_id) ? ($itemOb->sgst_rate + $itemOb->cgst_rate) : $itemOb->igst_rate; $gst_amount = round(($price_after_discount * $gst) / 100, 2); $gst_total = $gst_total + $gst_amount; } $current_sale_value = $base_amount + $gst_total; $total_due = $total_due_till_date + $current_sale_value; return ($customer->credit_balance - $total_due); } public function calculateSaleTotals($sale) { $base_amount = $sale->saleItems->sum('amount'); if ($sale->discount > 0) { $discount = (int) ($base_amount * $sale->discount) / 100; $base_amount = $base_amount - $discount; } $gst_total = 0; foreach ($sale->saleItems as $value) { $qty = $value->quantity; $price = $qty * $value->price; $line_discount = (int) ($price * $sale->discount) / 100; $price_after_discount = $price - $line_discount; $gst = ($sale->organisation->state_id == $sale->customer->state_id) ? ($value->item->sgst_rate + $value->item->cgst_rate) : $value->item->igst_rate; $gst_amount = round(($price_after_discount * $gst) / 100, 2); $gst_total = $gst_total + $gst_amount; } $total_sale = $base_amount + $gst_total; return $total_sale; } public function editSale($id) { if (View::exists('sale.edit')) { $organisationService = new OrganisationService(); $org_id = $organisationService->getOrganisationByUser(); $organisation = Organisation::find($org_id); $items = Item::where('organisation_id', $org_id)->get(); $customers = Customer::where('organisation_id', $org_id)->get(); $sale = Sale::findOrFail($id); return view('sale.edit', ['sale' => $sale, 'items' => $items, 'customers' => $customers, 'organisation' => $organisation]); } } public function update(Request $request) { $request->validate([ 'item' => 'required', 'customer' => 'required', 'quantity' => 'required', 'sale_date' => 'required', 'sale_type' => 'required' ]); $items = $request->item; $quantity = $request->quantity; $price = $request->price; $organisationService = new OrganisationService(); $org_id = $organisationService->getOrganisationByUser(); $sale = Sale::find($request->id); $sale->customer_id = $request->customer; $sale->sale_date = date('Y-m-d', strtotime($request->sale_date)); $sale->fpo_invoice_number = $request->fpo_invoice_number; $sale->comments = $request->comments; $sale->exclude_gst = $request->exclude_gst ? $request->exclude_gst : 0; $sale->discount = $request->discount; $sale->shipping_address = $request->taxable_shipping_address; $sale->despatched_from = $request->despatched_from; $sale->save(); $transaction = new TransactionService(); foreach ($sale->saleItems as $key => $value) { $saleItem = SaleItem::find($value->id); if ($request->sale_type == "product") { $transaction->updateDailyTransactionOnEdit( $org_id, "sale", $saleItem->item_id, (int)$items[$key], $saleItem->quantity, $quantity[$key], date('Y-m-d', strtotime($request->sale_date)) ); $transaction->updateTransactionOnEdit( $saleItem->id, $quantity[$key], 'sale' ); } $saleItem->item_id = $items[$key]; $saleItem->quantity = $quantity[$key]; $saleItem->price = $price[$key]; $saleItem->amount = round($price[$key] * $quantity[$key], 2); $saleItem->save(); } $new_items = $request->new_item; $new_quantity = $request->new_quantity; $new_price = $request->new_price; if (!empty($new_items)) { foreach ($new_items as $key => $item) { if ($item > 0) { $itemOb = Item::find($item); $saleItem = SaleItem::create([ "organisation_id" => $org_id, "sale_id" => $sale->id, "item_id" => (int)$item, "price" => $new_price[$key], "quantity" => $new_quantity[$key], "amount" => $new_price[$key] * $new_quantity[$key], "sale_date" => date('Y-m-d', strtotime($request->sale_date)) ]); if ($request->sale_type == "product") { $transaction->updateDailyTransaction( $org_id, "sale", (int)$item, $new_quantity[$key], date('Y-m-d', strtotime($request->sale_date)) ); $transaction->createNewTransactionEntry( $org_id, "sale", (int)$item, $new_quantity[$key], uniqid(), 'organisation', 'customer', date('Y-m-d', strtotime($request->sale_date)), get_class($saleItem), $saleItem->id ); } } } } $updated_sale = Sale::find($request->id); $total = $this->calculateSaleTotals($updated_sale); $sale->total = $total; $sale->save(); if (((int)$request->customer == 1 || (int)$request->customer == 2958) && $sale->is_cash_sale) { CashSale::where('sale_id', $sale->id)->update([ "name" => $request->name, "gst_number" => $request->gst, "billing_address" => $request->billing_address, "shipping_address" => $request->shipping_address ]); } return redirect()->back()->with('message', 'Sale Updated successfully !'); } public function saleReport(Request $request) { $organisationService = new OrganisationService(); $org_id = $organisationService->getOrganisationByUser(); $items = Item::where('organisation_id', $org_id)->get(); $saleItems = []; if ($request->has('filter') && $request->filter != "") { $saleItem = SaleItem::where('organisation_id', $org_id)->orderBy('sale_date', 'DESC'); if ($request->has('item') && $request->item != "") { if ($request->item != "All") { $saleItem->where('item_id', $request->item); } } if ($request->has('start_date') && $request->has('end_date')) { if ($request->start_date != "" && $request->end_date != "") { $saleItem->whereBetween('sale_date', [$request->start_date, $request->end_date]); } } $saleItems = $saleItem->get(); } return view('sale.report', ['items' => $items, 'saleItems' => $saleItems]); } public function saleInvoice($id) { $sale = Sale::find($id); $customPaper = array(10, 0, 550.00, 900.80); $pdf = PDF::loadView('sale.invoice', ['sale' => $sale])->setPaper($customPaper, 'portrait'); return $pdf->stream(); } public function createInvoiceNumber($org_id) { $sale = Sale::where('organisation_id', $org_id)->orderBy('id', 'DESC')->first(); $prefix = 'INV/'; $yearMonth = date('Y-m'); if ($sale) { $lastInvoiceNumber = $sale->invoice_number; preg_match('/\d+$/', $lastInvoiceNumber, $matches); $incrementalPart = ($matches) ? intval($matches[0]) + 1 : 1; $newIncrementalPart = str_pad($incrementalPart, 4, '0', STR_PAD_LEFT); $newInvoiceNumber = $prefix . $yearMonth . '/' . $newIncrementalPart; } else { $newInvoiceNumber = $prefix . $yearMonth . '/' . '00001'; } return $newInvoiceNumber; } // public function exportExcel() // { // return Excel::download(new SalesHistoryExport(), 'sales_history.xlsx'); // } public function salesExport(Request $request) { $data = $request->all(); return Excel::download(new SalesHistoryExport($data), 'sales_history.xlsx'); } }