| 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 Mail;
use DataTables;
use App\Helpers\Helper;
use App\Mail\SendInvoice;
class PurchaseOrderController extends Controller
{
private $TYPE = 3;
// use CommonTrait;
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
if ($request->ajax()) {
$cust_ids = Arr::flatten(Auth::user()->customer->toArray());
$invoices = Invoice::with('lineItem','customers')->whereIn('customer_id',$cust_ids)->where('type',$this->TYPE);//->orderBy('invoices.id','desc');
return DataTables::of($invoices)
->addIndexColumn()
->addColumn('customer_name', function ($invoice) {
return $invoice->customers->firstname.' '.$invoice->customers->lastname;
})
->addColumn('p_name', function ($invoice) {
$arr =[];
foreach($invoice->lineItem as $item)
{
$arr[] = $item->product->name;
}
return implode(', ', $arr);
})
->addColumn('date', function($invoice){
return $invoice->created_at->format('M d Y');
})
->addColumn('action', function($invoice){
$id = $invoice->id;
$btn = ' <a href="'.route('purchase_order.view',$id).'" ><i class="fas fa-eye text-success fs-2"></i></a>
| <a href="';
$btn .= route('purchase_order.edit',$id);
$btn .= '"><i class="fas fa-edit text-info fs-2"></i></a> | <a href="javascript:void(0)" data-bs-toggle="modal" data-bs-target="#delete" id="deleteBtn" onclick="setValue(';
$btn .= $id;
$status = $invoice->email_status;
$class=($status == 0)?'text-danger':'text-success';
$msg=($status == 0)?'Send Email':'Email Sent';
$btn .=')"><i class="fas fa-trash text-danger fs-2"></i></a> | <a href="'. route('purchase_order.pdfview',$id).'"> PDF</a> | <a class="'.$class.'" href="'. route('purchase_order.sendemail',$id).'" title="'.$msg.'"> Email</a>';
return $btn;
})
->rawColumns(['p_name','action'])
->make(true);
}
return view('purchase_order.index');
}
/**
* 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();
// $count = Invoice::where(['user_id'=>auth()->user()->id,'type'=>$this->TYPE])->count("*");
// $inv_id = 'PUO0'.$count+1;
$inv_id = Helper::getInvoiceId('PUO0',$this->TYPE,auth()->user()->id);
return view('purchase_order.create',compact('products','customers','inv_id'));
}
/**
* 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->inv_id = $request->inv_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;
$invoice->type =$this->TYPE;
$invoice->user_id =auth()->user()->id;
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();
$stock =( @auth()->user()->industry->stock_management== null)?0: auth()->user()->industry->stock_management;
if($stock != 0){
$prod = Product::findOrFail($product);
$qty = $prod->qty - $line["qty"][$key];
$prod->where('id',$product)->update(['qty'=>$qty]);
}
}
if($result)
{
return redirect()->route('purchase_order.index')->with('success','Purchase Order Added Successfully!!');
}
return redirect()->route('purchase_order.create')->with('fail','Fail!! To Add Purchase Order');
}
return redirect()->route('purchase_order.create')->with('fail','Fail!! To Add Purchase Order');
}
/**
* 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('purchase_order.'.$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('purchase_order.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();
$stock =( @auth()->user()->industry->stock_management== null)?0: auth()->user()->industry->stock_management;
if(!is_null($data) && $stock != 0)
{
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();
if($stock != 0){
$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();
if($stock != 0){
$prod = Product::findOrFail($product);
$qty = $prod->qty - $line["qty"][$key];
$prod->where('id',$product)->update(['qty'=>$qty]);
}
}
}
if($result)
{
return redirect()->route('purchase_order.index')->with('success','Purchase Order Updated Successfully!!');
}
return redirect()->route('purchase_order.edit')->with('fail','Fail!! To Update Purchase Order');
}
}
/**
* 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();
$stock =( @auth()->user()->industry->stock_management== null)?0: auth()->user()->industry->stock_management;
if($stock != 0){
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('purchase_order.index')->with('success','Purchase Order deleted Successfully!!');
}
return redirect()->route('purchase_order.index')->with('fail','Fail!! To delete Purchase Order');
}
return redirect()->route('purchase_order.index')->with('fail','Fail!! To delete Purchase Order');
}
public function export()
{
return Excel::download(new InvoiceExport($this->TYPE), '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('purchase_order.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;
// }
function sendEmail($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('purchase_order.pdf'.$view, compact('invoice'))->setOptions(['defaultFont' => 'Helvetica']);//Poppins, Helvetica, "sans-serif"
// return view('invoices.pdf',compact('invoice'));
$customerData['name'] =$invoice->customers->firstname.' '.$invoice->customers->lastname;
$data['attachment']= $pdf->stream('invoices.pdf');
$data['attachment_name'] = $invoice->inv_id.'.pdf';
$data['subject'] =$invoice->customers->firstname.' '.$invoice->customers->lastname ." Your New Purchase Order ".$invoice->inv_id.".pdf Generated";
Mail::to($invoice->customers->email )->send(new SendInvoice($data,$customerData));
Invoice::where(['id'=>$id])->update(['email_status'=>1]);
return redirect()->back()->withSuccess("Mail send successfully");
}
}