HEX
Server: Apache
System: Linux amsngx344.inmotionhosting.com 4.18.0-553.40.1.lve.el8.x86_64 #1 SMP Wed Feb 12 18:54:57 UTC 2025 x86_64
User: raniho6 (2736)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/raniho6/public_html/raniworks.stream/app/Http/Controllers/InvoiceController.php
<?php

namespace App\Http\Controllers;

use App\Models\Client;
use App\Models\Invoice;
use App\Models\InvoiceItem;
use App\Models\InvoicePayment;
use App\Models\Project;
use App\Models\Task;
use App\Models\Tax;
use App\Models\User;
use App\Exports\invoiceExport;
use Maatwebsite\Excel\Facades\Excel;
use App\Models\Utility;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Crypt;
use Stripe;

class InvoiceController extends Controller
{

     public function __construct(){

         if(\Auth::check()){

          $this->middleware(['auth:client','XSS']);

        }
         else{
             $this->middleware('XSS');
       }

    }

    public function export()
    {
        $name = 'invoice_' . date('Y-m-d i:h:s');
        $data = Excel::download(new invoiceExport(), $name . '.xlsx');

        return $data;
    }

    public function index($slug)
    {
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        $objUser          = Auth::user();

        if($currentWorkspace && $objUser)
        {
        if($currentWorkspace->creater->id == \Auth::user()->id || $objUser->getGuard() == 'client')
        {
            $objUser          = Auth::user();
           // $currentWorkspace = Utility::getWorkspaceBySlug($slug);
            $invoices         = $objUser->getInvoices($currentWorkspace->id);
            $invoices->load('project','tax');

            return view('invoices.index', compact('currentWorkspace', 'invoices'));
        }
        else
        {
            return redirect()->route('home');
        }
        }
        else
        {
          return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function create($slug)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        if($currentWorkspace->created_by == $objUser->id)
        {
            $projects = Project::select('projects.*')->join('user_projects', 'projects.id', '=', 'user_projects.project_id')->where('user_projects.user_id', '=', $objUser->id)->where('projects.workspace', '=', $currentWorkspace->id)->get();
            $taxes    = Tax::where('workspace_id', '=', $currentWorkspace->id)->get();
            $clients  = Client::select('clients.*')->join('client_workspaces', 'client_workspaces.client_id', '=', 'clients.id')->where('client_workspaces.is_active', '=', 1)->where('client_workspaces.workspace_id', '=', $currentWorkspace->id)->get();

            return view('invoices.create', compact('currentWorkspace', 'taxes', 'clients', 'projects'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }


    public function store($slug, Request $request)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        $project_name = Project::where('id', $request->project_id)->first();
        $user1 = $currentWorkspace->id;
        $setting = Utility::getAdminPaymentSettings();

        if($currentWorkspace->created_by == $objUser->id)
        {

            $rules     = [
                'project_id' => 'required',
                'issue_date' => 'required',
                'due_date' => 'required',
                'discount' => 'required',
                'client_id' => 'required',
            ];
            $validator = \Validator::make($request->all(), $rules);

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            $invoice               = new Invoice();
            $invoice->invoice_id   = $this->invoiceNumber($currentWorkspace->id);
            $invoice->project_id   = $request->project_id;
            $invoice->issue_date   = $request->issue_date;
            $invoice->due_date     = $request->due_date;
            $invoice->discount     = $request->discount;
            $invoice->tax_id       = $request->tax_id;
            $invoice->client_id    = $request->client_id;
            $invoice->status       = 'sent';
            $invoice->workspace_id = $currentWorkspace->id;
            $invoice->save();

            $settings  = Utility::getPaymentSetting($user1);
            $client           = Client::find($request->client_id);

             $uArr = [
                // 'user_name' => $user->name,
                'project_name' => $project_name->name,
                'company_name' => \Auth::user()->name,
                'invoice_id' => Utility::invoiceNumberFormat($invoice->id),
                'client_name' => $client->name,
                'app_url' => env('APP_URL'),
                'app_name'  => $setting['app_name'],
            ];

            if (isset($settings['invoice_notificaation']) && $settings['invoice_notificaation'] == 1) {
                Utility::send_slack_msg('New Invoice', $user1 , $uArr);
            }

            if (isset($settings['telegram_invoice_notificaation']) && $settings['telegram_invoice_notificaation'] == 1) {
                Utility::send_telegram_msg('New Invoice' ,$uArr, $user1);
            }

            //webhook
            $module ='New Invoice';
            // $webhook=  Utility::webhookSetting($module);
            $webhook=  Utility::webhookSetting($module , $user1);

            if($webhook)
            {
                $parameter = json_encode($invoice);
                // 1 parameter is  URL , 2 parameter is data , 3 parameter is method
                $status = Utility::WebhookCall($webhook['url'],$parameter,$webhook['method']);
                // if($status == true)
                // {
                //     return redirect()->back()->with('success', __('Invoice Save Successfully!'));
                // }
                // else
                // {
                //     return redirect()->back()->with('error', __('Webhook call failed.'));
                // }
            }

            return redirect()->back()->with('success', __('Invoice Save Successfully.!'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    function invoiceNumber($workspace_id)
    {
        $latest = Invoice::where('workspace_id', '=', $workspace_id)->latest()->first();

        return $latest ? $latest->invoice_id + 1 : 1;
    }


    public function show($slug, $id)
    {
        $invoice = Invoice::with('project','items.task.invoiceproject')->find($id); 
        if(isset($invoice) && $invoice != null )
         {
            $client           = Client::find($invoice->client_id);
            $objUser          = Auth::user();
            $currentWorkspace = Utility::getWorkspaceBySlug($slug);
            $paymentSetting   = Utility::getPaymentSetting($currentWorkspace->id);
           return view('invoices.show', compact('currentWorkspace', 'invoice', 'paymentSetting','client'));
         }
         else
         {
             return redirect()->back()->with('error', __('Invoice Not Found.'));
         }
    }


    public function  payinvoice($slug, $invoice_id)
    {
         $currentWorkspace = Utility::getWorkspaceBySlug($slug);
 
          $id=\Illuminate\Support\Facades\Crypt::decrypt($invoice_id);



        $objUser          = Auth::user();
        $invoice          = Invoice::find($id);
        $client           = Client::find($invoice->client_id);
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        $paymentSetting   = Utility::getPaymentSetting($currentWorkspace->id);


        return view('invoices.invoicepay', compact('currentWorkspace', 'invoice', 'paymentSetting','client'));
    }


    public function edit($slug, Invoice $invoice)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        if($currentWorkspace->created_by == $objUser->id)
        {
            $projects = Project::select('projects.*')->join('user_projects', 'projects.id', '=', 'user_projects.project_id')->where('user_projects.user_id', '=', $objUser->id)->where('projects.workspace', '=', $currentWorkspace->id)->get();
            $taxes    = Tax::where('workspace_id', '=', $currentWorkspace->id)->get();
            $clients  = Client::select('clients.*')->join('client_workspaces', 'client_workspaces.client_id', '=', 'clients.id')->where('client_workspaces.is_active', '=', 1)->where('client_workspaces.workspace_id', '=', $currentWorkspace->id)->get();

            return view('invoices.edit', compact('currentWorkspace', 'projects', 'taxes', 'invoice', 'clients'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }



    public function update($slug, Request $request, Invoice $invoice)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        if($currentWorkspace->created_by == $objUser->id)
        {

            $rules     = [
                'issue_date' => 'required',
                'due_date' => 'required',
                'discount' => 'required',
                'status' => 'required',
            ];
            $validator = \Validator::make($request->all(), $rules);

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }

            $invoice->issue_date = $request->issue_date;
            $invoice->due_date   = $request->due_date;
            $invoice->discount   = $request->discount;
            $invoice->tax_id     = $request->tax_id;
            $invoice->status     = $request->status;
            $invoice->client_id  = $request->client_id;
            $invoice->save();

            return redirect()->back()->with('success', __('Invoice Save Successfully.!'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }


    public function destroy($slug, Invoice $invoice)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        if($currentWorkspace->created_by == $objUser->id)
        {
            $invoice->delete();

            return redirect()->back()->with('success', __('Invoice Deleted Successfully.!'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function create_item($slug, $id)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        if($currentWorkspace->created_by == $objUser->id)
        {
            $invoice = Invoice::find($id);

            return view('invoices.create_item', compact('currentWorkspace', 'invoice'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function store_item($slug, $id, Request $request)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        if($currentWorkspace->created_by == $objUser->id)
        {
            $invoice = Invoice::find($id);

            $rules     = [
                'task' => 'required',
                'price' => 'required',
            ];
            $validator = \Validator::make($request->all(), $rules);

            if($validator->fails())
            {
                $messages = $validator->getMessageBag();

                return redirect()->back()->with('error', $messages->first());
            }
            $task             = Task::find($request->task);
            $item             = new InvoiceItem();
            $item->item_type  = get_class($task);
            $item->item_id    = $task->id;
            $item->price      = $request->price;
            $item->qty        = 1;
            $item->invoice_id = $invoice->id;
            $item->save();

            return redirect()->back()->with('success', __('Item Added Successfully.!'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function destroy_item($slug, $id, $item_id)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        if($currentWorkspace->created_by == $objUser->id)
        {
            $invoice_item = InvoiceItem::find($item_id);
            $invoice_item->delete();

            return redirect()->back()->with('success', __('Item Deleted Successfully.!'));
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }

    public function printInvoice($slug, $id)
    {

        $objUser          = Auth::user();
        // $currentWorkspace = Utility::getWorkspaceBySlug($slug);   
        $id               = Crypt::decryptString($id);
        $invoice          = Invoice::find($id);
        $currentWorkspace = $objUser ? Utility::getWorkspaceBySlug($slug) : Utility::getWorkspaceBySlug_copylink( 'invoice' , $invoice->id);
        if($invoice)
        {
            $color    = '#' . (($currentWorkspace->invoice_color) ? $currentWorkspace->invoice_color : 'ffffff');
            $template = ($currentWorkspace->invoice_template) ? $currentWorkspace->invoice_template : 'template1';

            $font_color = Utility::getFontColor($color);


            return view('invoices.' . $template, compact('currentWorkspace', 'invoice', 'color', 'font_color'));

        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }


    }

    public function previewInvoice($slug, $template, $color)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        $invoice          = new Invoice();

        $project       = new \stdClass();
        $project->name = 'UI Design';

        $client            = new \stdClass();
        $client->name      = '<Client Name>';
        $client->address   = '<Address>';
        $client->city      = '<City>';
        $client->state     = '<State>';
        $client->country   = '<Country>';
        $client->zipcode   = '<Zipcode>';
        $client->email     = '<Client Email>';
        $client->telephone = '<Client Phone Number>';

        $items = [];
        for($i = 1; $i <= 3; $i++)
        {
            $task        = new \stdClass();
            $task->title = 'Task ' . $i;

            $item        = new \stdClass();
            $item->task  = $task;
            $item->price = 100;
            $item->qty   = 1;
            $items[]     = $item;
        }

        $invoice->invoice_id = 1;
        $invoice->issue_date = date('Y-m-d H:i:s');
        $invoice->due_date   = date('Y-m-d H:i:s');
        $invoice->project    = $project;
        $invoice->client     = $client;
        $invoice->discount   = 50;
        $invoice->items      = $items;

        $preview = 1;

        $color = '#' . ($color != 'undefined' ? $color : 'ffffff');

        $font_color = Utility::getFontColor($color);



        return view('invoices.' . $template, compact('currentWorkspace', 'invoice', 'preview', 'color', 'font_color'));

    }

    public function addPayment($slug, $id, Request $request)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        $user1 = $currentWorkspace->id;
        $invoice          = Invoice::find($id);
        $project_name     = Project::where('id', $invoice->project_id)->first();
        $client           = Client::find($invoice->client_id);

        if($invoice)
        {
            if($request->amount > $invoice->getDueAmounts($invoice->id))
            {
                return redirect()->back()->with('error', __('Invalid amount.'));
            }
            else
            {
                try
                {
                    $orderID = strtoupper(str_replace('.', '', uniqid('', true)));
                    $price   = $request->amount;
                    Stripe\Stripe::setApiKey($currentWorkspace->stripe_secret);
                    $data = Stripe\Charge::create(
                        [
                            "amount" => 100 * $price,
                            "currency" => $currentWorkspace->currency_code,
                            "source" => $request->stripeToken,
                            "description" => $currentWorkspace->name . " - " . Utility::invoiceNumberFormat($invoice->invoice_id),
                            "metadata" => ["order_id" => $orderID],
                        ]
                    );

                    if($data['amount_refunded'] == 0 && empty($data['failure_code']) && $data['paid'] == 1 && $data['captured'] == 1)
                    {
                        InvoicePayment::create(
                            [
                                'order_id' => $orderID,
                                'invoice_id' => $invoice->id,
                                'currency' => $data['currency'],
                                'amount' => $price,
                                'txn_id' => $data['balance_transaction'],
                                'payment_type' => 'STRIPE',
                                'payment_status' => $data['status'],
                                'receipt' => $data['receipt_url'],
                                'client_id' => $invoice->client_id,
                            ]
                        );

                            if (($invoice->getDueAmounts($invoice->id) - $request->amount) == 0) { 
                                $invoice->status = 'paid';
                                $invoice->save();
                            }else{
                                $invoice->status = 'partialy paid';
                                $invoice->save();
                            }

                            $settings  = Utility::getPaymentSetting($user1);
                            $total_amount =  $invoice->getDueAmounts($invoice->id);

                             $uArr = [
                                // 'user_name' => $user->name,
                                'project_name' => $project_name->name,
                                'company_name' => User::find($project_name->created_by)->name,
                                'invoice_id' => Utility::invoiceNumberFormat($invoice->id),
                                'client_name' => $client->name,
                                'total_amount' => "$total_amount",
                                'paid_amount' => $request->amount,
                            ];

                            if (isset($settings['invoicest_notificaation']) && $settings['invoicest_notificaation'] == 1) {
                                Utility::send_slack_msg('Invoice Status Updated', $user1 , $uArr);
                            }

                            if (isset($settings['telegram_invoicest_notificaation']) && $settings['telegram_invoicest_notificaation'] == 1) {
                                Utility::send_telegram_msg('Invoice Status Updated' ,$uArr, $user1);
                            }

                            //webhook
                            $module ='Invoice Status Updated';
                            $webhook=  Utility::webhookSetting($module , $user1);

                            // $webhook=  Utility::webhookSetting($module);
                            if($webhook)
                            {
                                $parameter = json_encode($invoice);
                                // 1 parameter is  URL , 2 parameter is data , 3 parameter is method
                                $status = Utility::WebhookCall($webhook['url'],$parameter,$webhook['method']);
                                // if($status == true)
                                // {
                                //     return redirect()->back()->with('success', __('Payment added Successfully!'));
                                // }
                                // else
                                // {
                                //     return redirect()->back()->with('error', __('Webhook call failed.'));
                                // }
                            }

                        return redirect()->back()->with('success', __(' Payment added Successfully'));
                    }
                    else
                    {
                        return redirect()->back()->with('error', __('Transaction has been failed!'));
                    }

                }
                catch(\Exception $e)
                {
                    // dd($e);
                    if(\Auth::check())
                    {
                        return redirect()->route(
                            'client.invoices.show', [
                                                      $currentWorkspace->slug,
                                                      $invoice->id,
                                                  ]
                        )->with('error', __($e->getMessage()));
                    }
                    else
                    {
                        return redirect()->route('pay.invoice',[$slug,\Illuminate\Support\Facades\Crypt::encrypt($invoice->id)])->with('error', __($e->getMessage()));
                    }
                }
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }
    public function addManualPayment($slug, $id, Request $request)
    {
        $objUser          = Auth::user();
        $currentWorkspace = Utility::getWorkspaceBySlug($slug);
        $invoice          = Invoice::find($id);
        $project_name = Project::where('id', $invoice->project_id)->first();
        $user1 = $currentWorkspace->id;
        if($invoice && Auth::guard('web')->check())
        {
            if($request->amount > $invoice->getDueAmounts($invoice->id))
            {
                return redirect()->back()->with('error', __('Invalid amount.'));
            }
            else
            {

                $orderID = strtoupper(str_replace('.', '', uniqid('', true)));
                $price   = $request->amount;

                InvoicePayment::create(
                    [
                        'order_id' => $orderID,
                        'invoice_id' => $invoice->id,
                        'currency' => $currentWorkspace->currency_code,
                        'amount' => $price,
                        'txn_id' => '',
                        'payment_type' => 'Manual',
                        'payment_status' => 'succeeded',
                        'receipt' => '',
                        'client_id' => $objUser->id,
                    ]
                );
                
                if (($invoice->getDueAmounts($invoice->id) - $request->amount) == 0) { 
                    $invoice->status = 'paid';
                    $invoice->save();
                }else{
                    $invoice->status = 'partialy paid';
                    $invoice->save();
                }

                    $client           = Client::find($invoice->client_id);
                    $total_amount =  $invoice->getDueAmounts($invoice->id);
                    $settings  = Utility::getPaymentSetting($user1);

                    $uArr = [
                        // 'user_name' => $user->name,
                        'project_name' => $project_name->name,
                        'company_name' => \Auth::user()->name,
                        'invoice_id' => Utility::invoiceNumberFormat($invoice->id),
                        'client_name' => \Auth::user()->name,
                        'total_amount' => "$total_amount",
                        'paid_amount' => $request->amount,
                    ];

                    if (isset($settings['invoicest_notificaation']) && $settings['invoicest_notificaation'] == 1) {

                        Utility::send_slack_msg('Invoice Status Updated', $user1 , $uArr);
                    }

                    if (isset($settings['telegram_invoicest_notificaation']) && $settings['telegram_invoicest_notificaation'] == 1) {
                        Utility::send_telegram_msg('Invoice Status Updated' ,$uArr, $user1);
                    }

                    //webhook
                    $module ='Invoice Status Updated';
                    $webhook=  Utility::webhookSetting($module , $user1);

                    // $webhook=  Utility::webhookSetting($module);
                    if($webhook)
                    {
                        $parameter = json_encode($invoice);
                        // 1 parameter is  URL , 2 parameter is data , 3 parameter is method
                        $status = Utility::WebhookCall($webhook['url'],$parameter,$webhook['method']);
                        // if($status == true)
                        // {
                        //     return redirect()->back()->with('success', __('Payment added Successfully!'));
                        // }
                        // else
                        // {
                        //     return redirect()->back()->with('error', __('Webhook call failed.'));
                        // }
                    }

                return redirect()->back()->with('success', __(' Payment added Successfully'));
            }
        }
        else
        {
            return redirect()->back()->with('error', __('Permission denied.'));
        }
    }
}