IMMREX7

aku nok ndi : /home/spdtg/www/schoolmis/app/Http/Controllers/School/Stock/
File Up :
aku nok ndi : /home/spdtg/www/schoolmis/app/Http/Controllers/School/Stock/InvoiceController.php

<?php

namespace App\Http\Controllers\School\Stock;

use Illuminate\Http\Request;
use App\Http\Controllers\School\SchoolController;
use Auth;
use DB;
use PDF;
use Session;
use Carbon\Carbon;

class InvoiceController extends SchoolController {

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request) {
        $invoices = \App\Invoice::where('idSchool', '=', Auth::guard('school')->user()->idSchool)
                        ->orderBy('idInvoice', 'desc');
        if ($request->has('idFinancialYear')) {
            $invoices = $invoices->where('idFinancialYear', '=', $request->idFinancialYear)->get();
        } else {
            $invoices = $invoices->where('idFinancialYear', '=', Session::get('idFinancialYear'))->get();
        }
        return view('schools.stock.invoice_list', compact('invoices'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create() {
        $school = \App\School::where('idSchool',Auth::guard('school')->user()->idSchool)->first();
        $products = ['' => '---Select---'] + \App\Product::where('idSchool', '=', Auth::guard('school')->user()->idSchool)
                        ->orderBy('idProduct', 'desc')->pluck('productName', 'idProduct')->toArray();
        $curr_no = \App\NoGenerator::where('idSchool', '=', Auth::guard('school')->user()->idSchool)->where('type', '=', 'invoice')->first();

        if ($curr_no) {
            $next_no = $curr_no->no + 1;
        } else {
            $next_no = 1;
        }
        if($school->invoice_prefix != null){
            $invoice_no = $school->invoice_prefix . $next_no;
        }else
        $invoice_no = 'INV-0000' . $next_no;
        return view('schools.stock.invoice', compact('products', 'invoice_no'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request) {
        $school = \App\School::where('idSchool',Auth::guard('school')->user()->idSchool)->first();
        $rules = [
            'idCustomer' => 'required',
        ];

        if($request->paymentMode == "IMPS" && $request->idAccount == ""){
            $rules = [
                'idCustomer' => 'required',
                'accountNo' => 'required'
            ];
        }

        if (count($request->products) > 0) {
            foreach ($request->products as $key => $value) {
                $rules['products.' . $key . '.idProduct'] = 'required';
                if ((isset($value['idProduct']) && isset($value['quantity']))) {
                    $stock = \App\StockLedger::where('idProduct', '=', $value['idProduct'])->first();
                    // dd($stock);
                    if ($stock != null) {
                        $available_products = $stock->quantityInStock;
                        if ($value['quantity'] > $available_products) {
                            $rules['products.' . $key . '.aval_qty'] = 'required';
                        }
                    } else {
                        $rules['products.' . $key . '.noitem'] = 'required';
                    }
                }
            }
        }
        $messages = [
            'idCustomer.required' => 'Select Customer First.',
            'products.*idProduct.required' => 'Item should be selected first.',
            'products.*noitem.required' => 'No Item is available in Stock.',
        ];

        if($request->paymentMode == "IMPS" && $request->idAccount == ""){
            $messages = [
                'idCustome.required' => 'Select Customer First.',
                'products.*idProduct.required' => 'Item should be selected first.',
                'products.*noitem.required' => 'No Item is available in Stock.',
                'accountNo.required' => 'Account Number cannot be empty'
            ];
        }

        foreach ($request->products as $key => $value) {
            if ((isset($value['idProduct']) && isset($value['quantity']))) {
                $stock = \App\StockLedger::where('idProduct', '=', $value['idProduct'])->first();
                if($stock){
                    $messages += [
                        'products.*aval_qty.required' => 'Only ' . $stock->quantityInStock . ' items available in Stock.',
                    ];
                }
            }
        }

        if(isset($request->utr)){
            $utr = \App\StockInvoicePayment::where('utr',$request->utr)->first();
            if($utr != null){
                flash('UTR Number already exits in the system. Failed to save the invoice data.');
                if ($request->ajax()) {
                    return response()->json(['success' => "Failed"], 200, ['app-status' => 'success']);
                }else
                return redirect()->back();
            }
        }
        

        $this->validate($request, $rules, $messages);
        $invoice = new \App\Invoice();
        $invoice->fill($request->all());
        $invoice->idSchool = Auth::guard('school')->user()->idSchool;
        $invoice->idFinancialYear = Session::get('idFinancialYear');
        $month = Carbon::parse($invoice->invoiceDate);
        $invoice->poMonth = $month->format('m');
        $next_receiptno = next_invoiceno();
        if($school->invoice_prefix != null){
            $invoice->invoiceNo = $school->invoice_prefix . $next_receiptno;
        }else
        $invoice->invoiceNo = 'INV-0000' . $next_receiptno;
        DB::beginTransaction();
        $invoice->save();
        // Invoice Payment Statrt
        $invoice_payment = new \App\StockInvoicePayment();
        $invoice_payment->fill($request->all());
        $month = Carbon::parse($invoice_payment->paymentDate);
        $invoice_payment->poMonth = $month->format('m');
        $invoice_payment->idFinancialYear =  Session::get('idFinancialYear');
        $invoice_payment->idSchool = Auth::guard('school')->user()->idSchool;
        $invoice_payment->idInvoice = $invoice->idInvoice;
        $invoice_payment->paymentDate = Carbon::now()->format('Y-m-d');
        $next_receiptno = next_invoice_receiptno();
        $invoice_payment->receiptNo = 'RCPT000' . $next_receiptno;
        $invoice_payment->created_by = Auth::guard('school')->user()->idSchoolUser;
        $invoice_payment->save();
        if ($request->hasFile('utrFile')) {
            $hw = 'utr_' . $invoice_payment->receiptNo . '.' . $request->file('utrFile')->getClientOriginalExtension();
            $request->file('utrFile')->storeAs('public/schools/' . Auth::guard('school')->user()->idSchool . '/utr/', $hw);
            $invoice_payment->utrFile = $hw;   
            $invoice_payment->update();
        }
         // Invoice Payment End
        foreach ($request->products as $k1 => $v1) {
            $invoicedetails = new \App\InvoiceDetail();
            $invoicedetails->idInvoice = $invoice->idInvoice;
            $invoicedetails->idProduct = $v1['idProduct'];
            $invoicedetails->quantity = $v1['quantity'];
            $invoicedetails->rate = $v1['rate'];
            $invoicedetails->tax = $v1['tax'];
            $invoicedetails->taxAmount = ($v1['rate'] * $v1['quantity']) * ($v1['tax'] / 100);
            $invoicedetails->productTotal = $v1['productTotal'];
            $invoicedetails->save();
            if (array_key_exists("serial", $v1)){
                $arr = explode(",",$v1['serial'] );
                    if(count($arr) > 0){
                        foreach($arr as $indx => $serial){
                            DB::table('invoice_serial')->insert([
                                'idInvoiceDetial' => $invoicedetails->idInvoiceDetail,
                                'idInvoice' => $invoice->idInvoice,
                                'serialNo' =>  $serial,
                                'renewal_date' => $v1['renew']
                            ]);
                        }
                    }
            }
            
            $stock = \App\StockLedger::where('idProduct', '=', $v1['idProduct'])->first();
            if ($stock) {
                $prevqty = $stock->quantityInStock;
                $stock->quantityInStock = $prevqty - $v1['quantity'];
                $stock->totalSell = $stock->totalSell + $v1['quantity'];
                $stock->update();
            }
        }

        /*if(isset($request->accountNo)){
            $paidAccount = \App\PaidAccounts::where('accountNo',$request->accountNo)->first();
            if( $paidAccount == null){
                $bankAccount = new \App\PaidAccounts();
                $bankAccount->fill($request->all());
                $bankAccount->idSchool = Auth::guard('school')->user()->idSchool;
                $bankAccount->save();
                $invoice_payment->idAccount = $bankAccount->idAccount;
                $invoice_payment->update();
            }
        }*/
        
        

        DB::commit();
        flash('Invoice has been saved successfully');
        if ($request->ajax()) {
            return response()->json(['success' => "SUCCESS"], 200, ['app-status' => 'success']);
        }
        return redirect('school/invoices');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id) {
        
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id) {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id) {
       
        $data = $request->all();
        //dd($data);
        $invoice = \App\Invoice::where('idInvoice', '=', $id)->first();
        $ip = \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)
                ->select(DB::raw('SUM(paidAmount) as amountPaid'))->where('paymentStatus','!=','Cancelled')->first();
        $inv_payments = \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)->where('paymentStatus','!=','Cancelled')->get();
        $school = \App\School::where('idSchool', '=', $invoice->idSchool)->first();
        if($school->idCountry == 1)
        $pdf = PDF::loadView('schools.stock.print_invoice_modify', ['margin_top' => 20], compact('invoice','ip','inv_payments', 'school','data'));
        else $pdf = PDF::loadView('schools.stock.print_invoice_modify_qatar', ['margin_top' => 20], compact('invoice','ip','inv_payments', 'school','data'));
        return $pdf->stream('invoice.pdf');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id) {
        try{
            $invoice = \App\Invoice::where('idInvoice', '=', $id)->first();
            DB::beginTransaction();
            if(\App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)->where('paymentStatus','Cancelled')->count() > 0){
                \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)->where('paymentStatus','Cancelled')->delete();
            }
            $invoice->details()->delete();
            $invoice->delete();            
            DB::commit();
        } catch(\Illuminate\Database\QueryException $ex){
            DB::rollback();
            return response()->json(['success' => "FAILED", 'message' => $ex->getMessage()], 200, ['app-status' => 'success']);
        }
        return response()->json(['success' => "SUCCESS"], 200, ['app-status' => 'success']);
    }

    public function printInvoice($id) {
        $invoice = \App\Invoice::where('idInvoice', '=', $id)->first();
        $ip = \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)
                ->select(DB::raw('SUM(paidAmount) as amountPaid'))->where('paymentStatus','!=','Cancelled')->first();
        $inv_payments = \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)->where('paymentStatus','!=','Cancelled')->get();
        $school = \App\School::where('idSchool', '=', $invoice->idSchool)->first();
        if($school->idCountry == 1)
        $pdf = PDF::loadView('schools.stock.print_invoice', ['margin_top' => 20], compact('invoice','ip','inv_payments', 'school'));
        else $pdf = PDF::loadView('schools.stock.print_invoice_qatar', ['margin_top' => 20], compact('invoice','ip','inv_payments', 'school'));
        return $pdf->stream('invoice.pdf');
    }

    public function printFakeInvoice($id){
        $invoice = \App\Invoice::where('idInvoice', '=', $id)->first();
        $ip = \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)
                ->select(DB::raw('SUM(paidAmount) as amountPaid'))->where('paymentStatus','!=','Cancelled')->first();
        $inv_payments = \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)->where('paymentStatus','!=','Cancelled')->get();
        $school = \App\School::where('idSchool', '=', $invoice->idSchool)->first();
        return view('schools.stock.invoice-print', compact('invoice', 'inv_payments','ip','school'));
    }
    
    public function payBalanceForm($id) {
        $invoice = \App\Invoice::where('idInvoice', '=', $id)->first();
        $ip = \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)
                ->select(DB::raw('SUM(paidAmount) as amountPaid'))->where('paymentStatus','!=','Cancelled')->first();
        $inv_payments = \App\StockInvoicePayment::where('idInvoice','=',$invoice->idInvoice)->where('paymentStatus','!=','Cancelled')->get();
        return view('schools.stock.paybalance', compact('invoice','ip','inv_payments'));
    }
    public function payBalance(Request $request) {
        
        $invoice = \App\Invoice::where('idInvoice', '=', $request->idInvoice)->first();
        //check utr exits
        $utr = \App\StockInvoicePayment::where('utr',$request->utr)->first();
        if($utr != null){
            flash('UTR Number already exits in the system. Failed to save the invoice data.');
            return redirect()->back();
        }
        // Invoice Payment Statrt
        $invoice_payment = new \App\StockInvoicePayment();
        $invoice_payment->fill($request->all());
        $invoice_payment->idSchool = Auth::guard('school')->user()->idSchool;
        $invoice_payment->idInvoice = $invoice->idInvoice;
        if(isset($request->paymentDate))
        $invoice_payment->paymentDate = Carbon::parse($request->paymentDate)->format('Y-m-d');
        else
        $invoice_payment->paymentDate =Carbon::now()->format('Y-m-d');
        $month = Carbon::parse($invoice_payment->paymentDate);
        $invoice_payment->poMonth = $month->format('m');
        if(isset($request->idFinancialYear))
        $invoice_payment->idFinancialYear = $request->idFinancialYear;
        else
        $invoice_payment->idFinancialYear =  Session::get('idFinancialYear');
        $next_receiptno = next_invoice_receiptno();
        $invoice_payment->receiptNo = 'RCPT000' . $next_receiptno;
        $invoice_payment->created_by = Auth::guard('school')->user()->idSchoolUser;
        $invoice_payment->save();
        if ($request->hasFile('utrFile')) {
            $hw = 'utr_' . $invoice_payment->receiptNo . '.' . $request->file('utrFile')->getClientOriginalExtension();
            $request->file('utrFile')->storeAs('public/schools/' . Auth::guard('school')->user()->idSchool . '/utr/', $hw);
            $invoice_payment->utrFile = $hw;   
            $invoice_payment->update();
        }

        if($request->returnAmount > 0){
            DB::table('invoice_serial')->insert([
                'idInvoice' => $invoice->idInvoice,
                'idInvoiceDetial' => $invoice_payment->idInvoicePayment,
                'renewal_date' => Carbon::now()->format('Y-m-d'),
                'return_amount' => $request->returnAmount,
                'is_return' => 'Y'
            ]);
        }
       
        /*if(isset($request->accountNo)){
            $paidAccount = \App\PaidAccounts::where('accountNo',$request->accountNo)->first();
            if( $paidAccount == null){
                $bankAccount = new \App\PaidAccounts();
                $bankAccount->fill($request->all());
                $bankAccount->idSchool = Auth::guard('school')->user()->idSchool;
                $bankAccount->save();
                $invoice_payment->idAccount = $bankAccount->idAccount;
                $invoice_payment->update();
            }
        }*/
        return redirect('school/inventoryreport');
    }
    
    public function invoiceReceipts($id) {
        $receipts =  DB::table('stock_invoicepayment')
                ->join('invoices','stock_invoicepayment.idInvoice','=','invoices.idInvoice')
                ->where('stock_invoicepayment.idInvoice','=',$id)
                ->where(function($query) {
                    $query->whereNull('paymentStatus');
                    $query->orWhere('paymentStatus', '=', 'Cleared');
                    $query->orWhere('paymentStatus', '=', 'In-Process');
                    $query->orWhere('paymentStatus', '=', 'Success');
                })
                ->get();

        return view('schools.stock.invoice_receipts', compact('receipts'));
    }
    
    public function cancelReceipt($id) {
        $pay = \App\StockInvoicePayment::where('idInvoicePayment','=',$id)->first();
        $pay->paymentStatus = 'Cancelled';
        $pay->update();
        $invoice = DB::table('invoice_details')
        ->where('invoice_details.idInvoice', '=', $pay->idInvoice)
        ->get();  

        foreach ($invoice as $products) {
            $stock = \App\StockLedger::where('idProduct', '=', $products->idProduct)->first();
            $stock->quantityInStock  =  $stock->quantityInStock + $products->quantity;
            $stock->totalSell = $stock->totalSell - $products->quantity;
            //$stock->returnedQuantity = $stock->returnedQuantity + $products->quantity;
            $stock->update();
        }
        return response()->json(['success' => "SUCCESS"], 200, ['app-status' => 'success']);
    }

}

Copyright © 2021 - 2025 IMMREX7