| Server IP : 139.59.63.204 / Your IP : 216.73.216.39 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ubuntu-s-1vcpu-1gb-blr1-01 6.8.0-110-generic #110-Ubuntu SMP PREEMPT_DYNAMIC Thu Mar 19 15:09:20 UTC 2026 x86_64 User : root ( 0) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/html/app/Http/Controllers/ |
Upload File : |
<?php
namespace App\Http\Controllers;
use App\Models\Invoice;
use App\Models\Product;
use App\Models\Customer;
use App\Models\LineItem;
use App\Exports\InvoiceExport;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Arr;
use Barryvdh\DomPDF\Facade\Pdf;
use Auth;
use App\Helpers\Helper;
class InvoiceController extends Controller
{
// use CommonTrait;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$cust_ids = Arr::flatten(Auth::user()->customer->toArray());
$invoices = Invoice::whereIn('customer_id',$cust_ids)->where('type',1)->orderBy('invoices.id','desc')->paginate(10);
// $invoices = Invoice::leftjoin('line_items as li',,'=','invoices.id')->select('invoices.*','li.price','li.product_id','li.qty')->where(['li.posted_by'=>auth()->user()->id])->orderBy('invoices.id','desc')->paginate(10);
return view('invoices.index', compact('invoices'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$products = Product::where(['status'=>1,'posted_by'=>auth()->user()->id])->where('qty','>',0)->orderBy('name')->get();
$customers = Customer::where('user_id',auth()->user()->id)->orderBy('firstname')->get();
return view('invoices.create',compact('products','customers'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
// dd($request->all(),$request->line["product"][0]);
$this->validate($request,[
'customer' => 'required|numeric',
'line.product' => 'required|array',
'line.product.*' => 'required',
'billing_address' => 'string|max:255',
'billing_city' => 'string|max:255',
'billing_state' => 'string|max:255',
'billing_country' => 'string|max:255',
'billing_pin' => 'digits:6',
'shipping_address' => 'string|max:255',
'shipping_city' => 'string|max:255',
'shipping_state' => 'string|max:255',
'shipping_country' => 'string|max:255',
'shipping_pin' => 'digits:6',
],['line.product.required'=>'Line item selection is required',
'line.product.*.required'=>'Line item selection is required',
]);
// dd($d);
$invoice = new Invoice;
$invoice->customer_id = $request->customer;
$invoice->billing_address = $request->billing_address;
$invoice->billing_city = $request->billing_city;
$invoice->billing_state = $request->billing_state;
$invoice->billing_country = $request->billing_country;
$invoice->billing_pin = $request->billing_pin;
$invoice->shipping_address = $request->shipping_address;
$invoice->shipping_city = $request->shipping_city;
$invoice->shipping_state = $request->shipping_state;
$invoice->shipping_country = $request->shipping_country;
$invoice->shipping_pin = $request->shipping_pin;
if($invoice->save())
{ $line = $request->line; $result = false;
foreach($line['product'] as $key=> $product)
{
$item = new LineItem;
$item->product_id = $product;
$item->price = $line["price"][$key];
$item->qty = $line["qty"][$key];
$item->invoice_id = $invoice->id;
$item->posted_by = auth()->user()->id;
$result = $item->save();
$prod = Product::findOrFail($product);
$qty = $prod->qty - $line["qty"][$key];
$prod->where('id',$product)->update(['qty'=>$qty]);
}
if($result)
{
return redirect()->route('invoice.index')->with('success','Invoice Added Successfully!!');
}
return redirect()->route('invoice.create')->with('fail','Fail!! To Add Invoice');
}
return redirect()->route('invoice.create')->with('fail','Fail!! To Add Invoice');
}
/**
* Display the specified resource.
*
* @param \App\Models\Invoice $invoice
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$invoice = Invoice::findOrFail($id);
$invoice = $invoice->leftjoin('line_items as li','li.invoice_id','=','invoices.id')->select('invoices.*','li.price','li.product_id','li.qty')->where(['li.invoice_id'=>$id,'li.posted_by'=>auth()->user()->id])->first();
$view_name = @auth()->user()->invoice_template;
$view_name = !empty($view_name)?$view_name:'invoice1';
$view = strtok($view_name,'.');
return view('invoices.'.$view ,compact('invoice'));
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Invoice $invoice
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$products = Product::where(['status'=>1,'posted_by'=>auth()->user()->id])->orderBy('name')->get();
$customers = Customer::where('user_id',auth()->user()->id)->orderBy('firstname')->get();
$invoice = Invoice::findOrFail($id);
$invoice = $invoice->leftjoin('line_items as li','li.invoice_id','=','invoices.id')->select('invoices.*','li.price','li.product_id','li.qty')->where(['li.invoice_id'=>$id,'li.posted_by'=>auth()->user()->id])->first();
$gst = auth()->user()->gst_percent;
return view('invoices.edit',compact('invoice','products','customers','gst'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Invoice $invoice
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate($request,[
'customer' => 'required|numeric',
'line.product' => 'required|array',
'line.product.*' => 'required',
'billing_address' => 'string|max:255',
'billing_city' => 'string|max:255',
'billing_state' => 'string|max:255',
'billing_country' => 'string|max:255',
'billing_pin' => 'digits:6',
'shipping_address' => 'string|max:255',
'shipping_city' => 'string|max:255',
'shipping_state' => 'string|max:255',
'shipping_country' => 'string|max:255',
'shipping_pin' => 'digits:6',
],['line.product.required'=>'Line item selection is required',
'line.product.*.required'=>'Line item selection is required',
]);
//dd($request->all());
$invoice = Invoice::findOrFail($id);
$invoice->customer_id = $request->customer;
$invoice->billing_address = $request->billing_address;
$invoice->billing_city = $request->billing_city;
$invoice->billing_state = $request->billing_state;
$invoice->billing_country = $request->billing_country;
$invoice->billing_pin = $request->billing_pin;
$invoice->shipping_address = $request->shipping_address;
$invoice->shipping_city = $request->shipping_city;
$invoice->shipping_state = $request->shipping_state;
$invoice->shipping_country = $request->shipping_country;
$invoice->shipping_pin = $request->shipping_pin;
if($invoice->save())
{
$oldData = LineItem::where(['invoice_id'=>$id])->get(['id'])->toArray();
$deleted_items = Arr::flatten($request->line['id']);
//get product id and quantity to update product
$data= LineItem::where(['invoice_id'=>$id])->whereNotIn('id',$deleted_items)->get(['product_id','qty']);
//delete record line items which deleted by user
LineItem::where(['invoice_id'=>$id])->whereNotIn('id',$deleted_items)->delete();
if(!is_null($data))
{
foreach($data as $d)
{
$prod = Product::findOrFail($d->product_id);
$newQty = $prod->qty+$d->qty;
$prod->where('id',$d->product_id)->update(['qty'=>$newQty]);
}
}
// $item = LineItem::where(['invoice_id'=>$id])->delete();
$line = $request->line; $result = false;
foreach($line['product'] as $key=> $product)
{
if(!empty($line["id"][$key]))
{
$item =LineItem::find( $line["id"][$key]);
$old_qty = $item->qty;
$decrese_qty = $line["qty"][$key]-$old_qty;
$item->product_id = $product;
$item->price = $line["price"][$key];
$item->qty = $line["qty"][$key];
$item->invoice_id = $invoice->id;
$item->posted_by = auth()->user()->id;
$result = $item->save();
$prod = Product::findOrFail($product);
$qty = $prod->qty - $decrese_qty;
if($qty<0)
{
$qty = $prod->qty+(int)$qty;
}
$prod->where('id',$product)->update(['qty'=>$qty]);
}
else{
$item = new LineItem;
$item->product_id = $product;
$item->price = $line["price"][$key];
$item->qty = $line["qty"][$key];
$item->invoice_id = $invoice->id;
$item->posted_by = auth()->user()->id;
$result = $item->save();
$prod = Product::findOrFail($product);
$qty = $prod->qty - $line["qty"][$key];
$prod->where('id',$product)->update(['qty'=>$qty]);
}
}
if($result)
{
return redirect()->route('invoice.index')->with('success','Invoice Updated Successfully!!');
}
return redirect()->route('invoice.edit')->with('fail','Fail!! To Update Invoice');
}
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Invoice $invoice
* @return \Illuminate\Http\Response
*/
public function destroy(Request $request)
{
$id = trim($request->delete_id);
$invoice = Invoice::where('id',$id)->delete();
if($invoice)
{
//product id and qty to update product
$data = LineItem::where('invoice_id',$id)->get(['product_id','qty']);
//delete line items
$lineItem = LineItem::where('invoice_id',$id)->delete();
if(!is_null($data))
{
foreach($data as $d)
{
$prod = Product::findOrFail($d->product_id);
$newQty = $prod->qty+$d->qty;
$prod->where('id',$d->product_id)->update(['qty'=>$newQty]);
}
}
if($lineItem)
{
return redirect()->route('invoice.index')->with('success','Invoice deleted Successfully!!');
}
return redirect()->route('invoice.index')->with('fail','Fail!! To delete Invoice');
}
return redirect()->route('invoice.index')->with('fail','Fail!! To delete Invoice');
}
public function export()
{
return Excel::download(new InvoiceExport, 'invoices.xlsx');
}
public function getline(){
$n = $_REQUEST['n'];
$products = Product::where(['status'=>1,'posted_by'=>auth()->user()->id])->where('qty','>',0)->orderBy('name')->get();
$str = '<tr> <td><input type="hidden" name="line[id][]" value=""/><select onchange="calculateme('.$n.')" id="line_product_'.$n.'" name="line[product][]" class="form-select line"><option value="">Select Product</option>';
foreach($products as $p) {
$str .= '<option value="'.$p->id.'">'.$p->name.'</option>';
}
$str .= '</select></td> <td><input onblur="changeqty('.$n.')" id="line_qty_'.$n.'" min="1" type="number" name="line[qty][]" class="form-control"></td> <td><input type="text" id="line_price_'.$n.'" data-initial-value="" name="line[price][]" class="form-control"></td> <td><input type="hidden" name="line[totalprice][]" id="line_total_price_'.$n.'" data-initial-value="" class="form-control price">
</td> <td><a href="javascript:void(0)" class="deleteLine" ><i class="fas fa-trash text-danger fs-2"></i> </a></td> </tr>';
echo $str;
}
public function getprd() {
$n = $_REQUEST['id'];
$p = Product::where('id',$n)->first();
$gst = $p->user->gst_percent;
$total = !empty($gst)?Helper::totalPrice($gst,$p->price,1):$p->price;
$ar = ['id'=>$p->id, 'price'=>$p->price,'qty'=>$p->qty,'gst'=>$gst];
return response()->json($ar);
}
public function getAddress(Request $request)
{
$id = $request->customerId;
$customerAddress = Customer::where('id',$id)->first(['address','city','state','country','pin'])->toArray();
return response()->json(compact('customerAddress'),200);
}
public function pdfview($id)
{
$invoice = Invoice::findOrFail($id);
$invoice = $invoice->leftjoin('line_items as li','li.invoice_id','=','invoices.id')->select('invoices.*','li.price','li.product_id','li.qty')->where(['li.invoice_id'=>$id,'li.posted_by'=>auth()->user()->id])->first();
$view_name = @auth()->user()->invoice_template;
$view_name = !empty($view_name)?$view_name:'invoice1';
$view = strtok($view_name,'.');
$pdf = pdf::loadView('invoices.pdf'.$view, compact('invoice'))->setOptions(['defaultFont' => 'sans-serif']);
// return view('invoices.pdf',compact('invoice'));
return $pdf->stream('invoices.pdf');
}
// public function totalPrice($gst,$price,$QTY )
// {
// $price = round($price,2)*$QTY;
// $tax=round($price,2)*round(($gst/100),2);
// $total=round(($price+$tax),2);
// return $total;
// //$calculatedTaxRate=(($total-$price)/$price)*100;
// }
}