Completed
Push — development ( 877883...280d38 )
by Ashutosh
10:04
created

InvoiceController::createInvoiceItemsByAdmin()   A

Complexity

Conditions 5
Paths 38

Size

Total Lines 47
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 37
dl 0
loc 47
rs 9.0168
c 0
b 0
f 0
cc 5
nc 38
nop 11

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace App\Http\Controllers\Order;
4
5
use App\Http\Controllers\Front\CartController;
6
use App\Model\Common\Setting;
7
use App\Model\Common\Template;
8
use App\Model\Order\Invoice;
9
use App\Model\Order\InvoiceItem;
10
use App\Model\Order\Order;
11
use App\Model\Order\Payment;
12
use App\Model\Payment\Currency;
13
use App\Model\Payment\Plan;
14
use App\Model\Payment\Promotion;
15
use App\Model\Payment\Tax;
16
use App\Model\Payment\TaxByState;
17
use App\Model\Payment\TaxOption;
18
use App\Model\Product\Price;
19
use App\Model\Product\Product;
20
use App\Traits\CoupCodeAndInvoiceSearch;
21
use App\Traits\PaymentsAndInvoices;
22
use App\User;
23
use Bugsnag;
24
use Illuminate\Http\Request;
25
use Input;
26
use Log;
27
28
class InvoiceController extends TaxRatesAndCodeExpiryController
29
{
30
    use  CoupCodeAndInvoiceSearch;
0 ignored issues
show
introduced by
The trait App\Traits\CoupCodeAndInvoiceSearch requires some properties which are not provided by App\Http\Controllers\Order\InvoiceController: $grand_total, $id, $created_at, $type, $value
Loading history...
31
    use  PaymentsAndInvoices;
0 ignored issues
show
introduced by
The trait App\Traits\PaymentsAndInvoices requires some properties which are not provided by App\Http\Controllers\Order\InvoiceController: $grand_total, $first_name, $planPrice, $domain, $amount, $payment_method, $product_quantity, $id, $amt_to_credit, $planRelation, $no_of_agents
Loading history...
32
33
    public $invoice;
34
    public $invoiceItem;
35
    public $user;
36
    public $template;
37
    public $setting;
38
    public $payment;
39
    public $product;
40
    public $price;
41
    public $promotion;
42
    public $currency;
43
    public $tax;
44
    public $tax_option;
45
    public $order;
46
    public $cartController;
47
48
    public function __construct()
49
    {
50
        $this->middleware('auth');
51
        $this->middleware('admin', ['except' => ['pdf']]);
52
53
        $invoice = new Invoice();
54
        $this->invoice = $invoice;
55
56
        $invoiceItem = new InvoiceItem();
57
        $this->invoiceItem = $invoiceItem;
58
59
        $user = new User();
60
        $this->user = $user;
61
62
        $template = new Template();
63
        $this->template = $template;
64
65
        $seting = new Setting();
66
        $this->setting = $seting;
67
68
        $payment = new Payment();
69
        $this->payment = $payment;
70
71
        $product = new Product();
72
        $this->product = $product;
73
74
        $price = new Price();
75
        $this->price = $price;
76
77
        $promotion = new Promotion();
78
        $this->promotion = $promotion;
79
80
        $currency = new Currency();
81
        $this->currency = $currency;
82
83
        $tax = new Tax();
84
        $this->tax = $tax;
85
86
        $tax_option = new TaxOption();
87
        $this->tax_option = $tax_option;
88
89
        $order = new Order();
90
        $this->order = $order;
91
92
        $tax_by_state = new TaxByState();
93
        $this->tax_by_state = new $tax_by_state();
94
95
        $cartController = new CartController();
96
        $this->cartController = $cartController;
97
    }
98
99
    public function index(Request $request)
100
    {
101
        try {
102
            $currencies = Currency::where('status', 1)->pluck('code')->toArray();
103
            $name = $request->input('name');
104
            $invoice_no = $request->input('invoice_no');
105
            $status = $request->input('status');
106
107
            $currency_id = $request->input('currency_id');
108
            $from = $request->input('from');
109
            $till = $request->input('till');
110
111
            return view('themes.default1.invoice.index', compact('name','invoice_no','status','currencies','currency_id','from',
0 ignored issues
show
Coding Style introduced by
This line exceeds maximum limit of 120 characters; contains 128 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
112
113
                'till'));
114
        } catch (\Exception $ex) {
115
            Bugsnag::notifyException($ex);
116
117
            return redirect()->back()->with('fails', $ex->getMessage());
118
        }
119
    }
120
121
    public function getInvoices(Request $request)
122
    {
123
        $name = $request->input('name');
124
        $invoice_no = $request->input('invoice_no');
125
        $status = $request->input('status');
126
        $currency = $request->input('currency_id');
127
        $from = $request->input('from');
128
        $till = $request->input('till');
129
        $query = $this->advanceSearch($name, $invoice_no, $currency, $status, $from, $till);
130
131
        return \DataTables::of($query->take(100))
132
         ->setTotalRecords($query->count())
133
134
         ->addColumn('checkbox', function ($model) {
135
             return "<input type='checkbox' class='invoice_checkbox' 
136
                            value=".$model->id.' name=select[] id=check>';
137
         })
138
                        ->addColumn('user_id', function ($model) {
139
                            $first = $this->user->where('id', $model->user_id)->first()->first_name;
140
                            $last = $this->user->where('id', $model->user_id)->first()->last_name;
141
                            $id = $this->user->where('id', $model->user_id)->first()->id;
142
143
                            return '<a href='.url('clients/'.$id).'>'.ucfirst($first).' '.ucfirst($last).'</a>';
144
                        })
145
                         ->addColumn('number', function ($model) {
146
                             return ucfirst($model->number);
147
                         })
148
149
                        ->addColumn('date', function ($model) {
150
                            $date = ($model->created_at);
151
152
                            return $date;
153
                            // return "<span style='display:none'>$model->id</span>".$date->format('l, F j, Y H:m');
154
                        })
155
                         ->addColumn('grand_total', function ($model) {
156
                             return $model->grand_total;
157
                         })
158
                          ->addColumn('status', function ($model) {
159
                              return ucfirst($model->status);
160
                          })
161
162
                        ->addColumn('action', function ($model) {
163
                            $action = '';
164
165
                            $check = $this->checkExecution($model->id);
166
                            if ($check == false) {
167
                                $action = '<a href='.url('order/execute?invoiceid='.$model->id)
168
                                ." class='btn btn-sm btn-primary btn-xs'>
169
                                <i class='fa fa-tasks' style='color:white;'>
170
                                 </i>&nbsp;&nbsp; Execute Order</a>";
171
                            }
172
173
                            return '<a href='.url('invoices/show?invoiceid='.$model->id)
174
                            ." class='btn btn-sm btn-primary btn-xs'><i class='fa fa-eye' 
175
                            style='color:white;'> </i>&nbsp;&nbsp;View</a>"
176
                                    ."   $action";
177
                        })
178
                         ->filterColumn('user_id', function ($query, $keyword) {
179
                             $sql = 'first_name like ?';
180
                             $query->whereRaw($sql, ["%{$keyword}%"]);
181
                         })
182
183
                          ->filterColumn('status', function ($query, $keyword) {
184
                              $sql = 'status like ?';
185
                              $query->whereRaw($sql, ["%{$keyword}%"]);
186
                          })
187
188
                        ->filterColumn('number', function ($query, $keyword) {
189
                            $sql = 'number like ?';
190
                            $query->whereRaw($sql, ["%{$keyword}%"]);
191
                        })
192
                         ->filterColumn('grand_total', function ($query, $keyword) {
193
                             $sql = 'grand_total like ?';
194
                             $query->whereRaw($sql, ["%{$keyword}%"]);
195
                         })
196
                          ->filterColumn('date', function ($query, $keyword) {
197
                              $sql = 'date like ?';
198
                              $query->whereRaw($sql, ["%{$keyword}%"]);
199
                          })
200
201
                         ->rawColumns(['checkbox', 'user_id', 'number', 'date', 'grand_total', 'status', 'action'])
202
                        ->make(true);
203
    }
204
205
    /**
206
     * Shoe Invoice when view Invoice is selected from dropdown in Admin Panel.
207
     *
208
     * @param Request $request Get InvoiceId as Request
209
     */
210
    public function show(Request $request)
211
    {
212
        try {
213
            $id = $request->input('invoiceid');
214
            $invoice = $this->invoice->where('id', $id)->first();
215
            $invoiceItems = $this->invoiceItem->where('invoice_id', $id)->get();
216
            $user = $this->user->find($invoice->user_id);
217
            $currency = CartController::currency($user->id);
218
            $symbol = $currency['symbol'];
219
220
            return view('themes.default1.invoice.show', compact('invoiceItems', 'invoice', 'user', 'currency', 'symbol'));
0 ignored issues
show
Coding Style introduced by
This line exceeds maximum limit of 120 characters; contains 122 characters

Overly long lines are hard to read on any screen. Most code styles therefor impose a maximum limit on the number of characters in a line.

Loading history...
221
        } catch (\Exception $ex) {
222
            app('log')->warning($ex->getMessage());
223
            Bugsnag::notifyException($ex);
224
225
            return redirect()->back()->with('fails', $ex->getMessage());
226
        }
227
    }
228
229
    /**
230
     * not in use case.
231
     *
232
     * @param Request $request
233
     *
234
     * @return type
235
     */
236
    public function generateById(Request $request)
237
    {
238
        try {
239
            $clientid = $request->input('clientid');
240
            $user = new User();
241
            if ($clientid) {
242
                $user = $user->where('id', $clientid)->first();
243
                if (!$user) {
244
                    return redirect()->back()->with('fails', 'Invalid user');
0 ignored issues
show
Bug Best Practice introduced by
The expression return redirect()->back(...fails', 'Invalid user') also could return the type Illuminate\Http\Redirect...nate\Routing\Redirector which is incompatible with the documented return type App\Http\Controllers\Order\type.
Loading history...
245
                }
246
            } else {
247
                $user = '';
248
            }
249
            $products = $this->product->where('id', '!=', 1)->pluck('name', 'id')->toArray();
250
            $currency = $this->currency->pluck('name', 'code')->toArray();
251
252
            return view('themes.default1.invoice.generate', compact('user', 'products', 'currency'));
253
        } catch (\Exception $ex) {
254
            app('log')->info($ex->getMessage());
255
            Bugsnag::notifyException($ex);
256
257
            return redirect()->back()->with('fails', $ex->getMessage());
0 ignored issues
show
Bug Best Practice introduced by
The expression return redirect()->back(...ls', $ex->getMessage()) also could return the type Illuminate\Http\Redirect...nate\Routing\Redirector which is incompatible with the documented return type App\Http\Controllers\Order\type.
Loading history...
258
        }
259
    }
260
261
    /**
262
     * Generate invoice.
263
     *
264
     * @throws \Exception
265
     */
266
267
    //Is this Method only for cliet?? because Auth::user->id?
268
    public function generateInvoice()
269
    {
270
        try {
271
            $tax_rule = new \App\Model\Payment\TaxOption();
272
            $rule = $tax_rule->findOrFail(1);
273
            $rounding = $rule->rounding;
274
            $user_id = \Auth::user()->id;
275
            if (\Auth::user()->currency == 'INR') {
276
                $grand_total = \Cart::getSubTotal();
277
            } else {
278
                foreach (\Cart::getContent() as $cart) {
279
                    $grand_total = \Cart::getSubTotal();
280
                }
281
            }
282
            $number = rand(11111111, 99999999);
283
            $date = \Carbon\Carbon::now();
284
            if ($rounding == 1) {
285
                $grand_total = round($grand_total);
286
            }
287
            $content = \Cart::getContent();
288
            $attributes = [];
289
            foreach ($content as $key => $item) {
290
                $attributes[] = $item->attributes;
291
            }
292
293
            $symbol = $attributes[0]['currency']['symbol'];
294
            $invoice = $this->invoice->create(['user_id' => $user_id, 'number' => $number,
295
             'date'                                      => $date, 'grand_total' => $grand_total, 'status' => 'pending',
296
             'currency'                                  => \Auth::user()->currency, ]);
297
            foreach (\Cart::getContent() as $cart) {
298
                $this->createInvoiceItems($invoice->id, $cart);
299
            }
300
            $this->sendMail($user_id, $invoice->id);
301
302
            return $invoice;
303
        } catch (\Exception $ex) {
304
            app('log')->error($ex->getMessage());
305
            Bugsnag::notifyException($ex);
306
307
            throw new \Exception('Can not Generate Invoice');
308
        }
309
    }
310
311
    public function createInvoiceItems($invoiceid, $cart)
312
    {
313
        try {
314
            $planid = 0;
315
            $product_name = $cart->name;
316
            $regular_price = $cart->price;
317
            $quantity = $cart->quantity;
318
            $agents = $cart->attributes->agents;
319
            $domain = $this->domain($cart->id);
320
            $cart_cont = new \App\Http\Controllers\Front\CartController();
321
            if ($cart_cont->checkPlanSession() === true) {
322
                $planid = \Session::get('plan');
323
            }
324
            if ($planid == 0) {
325
                //When Product is added from Faveo Website
326
                $planid = Plan::where('product', $cart->id)->pluck('id')->first();
327
            }
328
            $user_currency = \Auth::user()->currency;
329
            $subtotal = $this->getSubtotal($user_currency, $cart);
330
331
            $tax_name = '';
332
            $tax_percentage = '';
333
334
            foreach ($cart->attributes['tax'] as $tax) {
335
                $tax_name .= $tax['name'].',';
336
                $tax_percentage .= $tax['rate'].',';
337
            }
338
            $invoiceItem = $this->invoiceItem->create([
339
                'invoice_id'     => $invoiceid,
340
                'product_name'   => $product_name,
341
                'regular_price'  => $regular_price,
342
                'quantity'       => $quantity,
343
                'tax_name'       => $tax_name,
344
                'tax_percentage' => $tax_percentage,
345
                'subtotal'       => $subtotal,
346
                'domain'         => $domain,
347
                'plan_id'        => $planid,
348
                'agents'         => $agents,
349
            ]);
350
351
            return $invoiceItem;
352
        } catch (\Exception $ex) {
353
            dd($ex);
354
            Bugsnag::notifyException($ex->getMessage());
355
356
            throw new \Exception('Can not create Invoice Items');
357
        }
358
    }
359
360
    public function invoiceGenerateByForm(Request $request, $user_id = '')
361
    {
362
        $this->validate($request,[
363
364
                'plan'      => 'required_if:subscription,true',
365
                'price'     => 'required',
366
            ],[
367
                'plan.required_if' =>'Select a Plan',
368
            ]);
369
        try {
370
            $agents = $request->input('agents');
371
            $status = 'pending';
372
            $qty = $request->input('quantity');
373
            if ($user_id == '') {
374
                $user_id = \Request::input('user');
375
            }
376
            $productid = $request->input('product');
377
378
            $plan = $request->input('plan');
379
            $agents = $this->getAgents($agents, $productid, $plan);
380
            $qty = $this->getQuantity($qty, $productid, $plan);
381
382
            $code = $request->input('code');
383
            $total = $request->input('price');
384
            $description = $request->input('description');
385
            if ($request->has('domain')) {
386
                $domain = $request->input('domain');
387
                $this->setDomain($productid, $domain);
388
            }
389
            $controller = new \App\Http\Controllers\Front\CartController();
390
            $userCurrency = $controller->currency($user_id);
391
            $currency = $userCurrency['currency'];
392
            $number = rand(11111111, 99999999);
393
            $date = \Carbon\Carbon::now();
394
            $product = Product::find($productid);
395
            $cost = $controller->cost($productid, $user_id, $plan);
396
            // if ($cost != $total) {
397
            //     $grand_total = $total;
398
            // }
399
            $grand_total = $this->getGrandTotal($code, $total, $cost, $productid, $currency);
400
            $grand_total = $qty * $grand_total;
401
            if ($grand_total == 0) {
402
                $status = 'success';
403
            }
404
            $tax = $this->checkTax($product->id, $user_id);
405
            $tax_name = '';
406
            $tax_rate = '';
407
            if (!empty($tax)) {
408
                $tax_name = $tax[0];
409
                $tax_rate = $tax[1];
410
            }
411
412
            $grand_total = $this->calculateTotal($tax_rate, $grand_total);
413
            $grand_total = \App\Http\Controllers\Front\CartController::rounding($grand_total);
414
415
            $invoice = Invoice::create(['user_id' => $user_id,
416
                'number'                          => $number, 'date' => $date, 'grand_total' => $grand_total,
417
                'currency'                        => $currency, 'status' => $status, 'description' => $description, ]);
418
419
            $items = $this->createInvoiceItemsByAdmin($invoice->id, $productid,
420
             $code, $total, $currency, $qty, $agents, $plan, $user_id, $tax_name, $tax_rate);
421
            $result = $this->getMessage($items, $user_id);
422
        } catch (\Exception $ex) {
423
            app('log')->info($ex->getMessage());
424
            Bugsnag::notifyException($ex);
425
            $result = ['fails' => $ex->getMessage()];
426
        }
427
428
        return response()->json(compact('result'));
429
    }
430
431
    public function createInvoiceItemsByAdmin($invoiceid, $productid, $code, $price,
432
        $currency, $qty, $agents, $planid = '', $userid = '', $tax_name = '', $tax_rate = '')
433
    {
434
        try {
435
            $discount = '';
436
            $mode = '';
437
            $product = $this->product->findOrFail($productid);
438
            $plan = Plan::where('product', $productid)->first();
439
            $subtotal = $qty * intval($price);
440
            if ($code) {
441
                $subtotal = $this->checkCode($code, $productid, $currency);
442
                $mode = 'coupon';
443
                $discount = $price - $subtotal;
444
            }
445
            $userid = \Auth::user()->id;
446
            if (\Auth::user()->role == 'user') {
447
                $tax = $this->checkTax($product->id, $userid);
448
                $tax_name = '';
449
                $tax_rate = '';
450
                if (!empty($tax)) {
451
                    $tax_name = $tax[0];
452
                    $tax_rate = $tax[1];
453
                }
454
            }
455
456
            $subtotal = $this->calculateTotal($tax_rate, $subtotal);
457
            $domain = $this->domain($productid);
458
            $items = $this->invoiceItem->create([
459
                'invoice_id'     => $invoiceid,
460
                'product_name'   => $product->name,
461
                'regular_price'  => $price,
462
                'quantity'       => $qty,
463
                'discount'       => $discount,
464
                'discount_mode'  => $mode,
465
                'subtotal'       => \App\Http\Controllers\Front\CartController::rounding($subtotal),
466
                'tax_name'       => $tax_name,
467
                'tax_percentage' => $tax_rate,
468
                'domain'         => $domain,
469
                'plan_id'        => $planid,
470
                'agents'         => $agents,
471
            ]);
472
473
            return $items;
474
        } catch (\Exception $ex) {
475
            Bugsnag::notifyException($ex);
476
477
            return redirect()->back()->with('fails', $ex->getMessage());
478
        }
479
    }
480
481
    public function checkTax($productid, $userid)
482
    {
483
        try {
484
            $taxs = [];
485
            $taxs[0] = ['name' => 'null', 'rate' => 0];
486
            $geoip_state = User::where('id', $userid)->pluck('state')->first();
487
            $geoip_country = User::where('id', $userid)->pluck('country')->first();
488
            $product = $this->product->findOrFail($productid);
489
            $cartController = new CartController();
490
            if ($this->tax_option->findOrFail(1)->inclusive == 0) {
491
                if ($this->tax_option->findOrFail(1)->tax_enable == 1) {
492
                    $taxs = $this->getTaxWhenEnable($productid, $taxs[0], $userid);
493
                } elseif ($this->tax_option->tax_enable == 0) {//if tax_enable is 0
494
495
                    $taxClassId = Tax::where('country', '')->where('state', 'Any State')
496
                     ->pluck('tax_classes_id')->first(); //In case of India when
497
                    //other tax is available and tax is not enabled
498
                    if ($taxClassId) {
499
                        $rate = $this->getTotalRate($taxClassId, $productid, $taxs);
500
                        $taxs = $rate['taxes'];
501
                        $rate = $rate['rate'];
502
                    } elseif ($geoip_country != 'IN') {//In case of other country
503
                        // when tax is available and tax is not enabled(Applicable
504
                        //when Global Tax class for any country and state is not there)
505
506
                        $taxClassId = Tax::where('state', $geoip_state)
507
                        ->orWhere('country', $geoip_country)->pluck('tax_classes_id')->first();
508
                        if ($taxClassId) { //if state equals the user State
509
                            $rate = $this->getTotalRate($taxClassId, $productid, $taxs);
510
                            $taxs = $rate['taxes'];
511
                            $rate = $rate['rate'];
512
                        }
513
                        $taxs = ([$taxs[0]['name'], $taxs[0]['rate']]);
514
515
                        return $taxs;
516
                    }
517
                    $taxs = ([$taxs[0]['name'], $taxs[0]['rate']]);
518
                } else {
519
                    $taxs = ([$taxs[0]['name'], $taxs[0]['rate']]);
520
                }
521
            }
522
523
            return $taxs;
524
        } catch (\Exception $ex) {
525
            throw new \Exception(\Lang::get('message.check-tax-error'));
526
        }
527
    }
528
529
    public function getRate($productid, $taxs, $userid)
530
    {
531
        $tax_attribute = [];
532
        $tax_attribute[0] = ['name' => 'null', 'rate' => 0, 'tax_enable' =>0];
533
        $tax_value = '0';
534
535
        $geoip_state = User::where('id', $userid)->pluck('state')->first();
536
        $geoip_country = User::where('id', $userid)->pluck('country')->first();
537
        $user_state = $this->tax_by_state::where('state_code', $geoip_state)->first();
538
        $origin_state = $this->setting->first()->state; //Get the State of origin
539
        $cartController = new CartController();
540
        $rate = 0;
541
        $name1 = 'CGST';
542
        $name2 = 'SGST';
543
        $name3 = 'IGST';
544
        $name4 = 'UTGST';
545
        $c_gst = 0;
546
        $s_gst = 0;
547
        $i_gst = 0;
548
        $ut_gst = 0;
549
        $state_code = '';
550
        if ($user_state != '') {//Get the CGST,SGST,IGST,STATE_CODE of the user
551
            $tax = $this->getTaxWhenState($user_state, $productid, $origin_state);
552
            $taxes = $tax['taxes'];
553
            $value = $tax['value'];
554
        } else {//If user from other Country
555
            $tax = $this->getTaxWhenOtherCountry($geoip_state, $geoip_country, $productid);
556
            $taxes = $tax['taxes'];
557
            $value = $tax['value'];
558
            $rate = $tax['rate'];
559
        }
560
561
        foreach ($taxes as $key => $tax) {
562
            if ($taxes[0]) {
563
                $tax_attribute[$key] = ['name' => $tax->name, 'name1' => $name1,
564
                 'name2'                       => $name2, 'name3' => $name3, 'name4' => $name4,
565
                 'rate'                        => $value, 'rate1'=>$c_gst, 'rate2'=>$s_gst,
566
                 'rate3'                       => $i_gst, 'rate4'=>$ut_gst, 'state'=>$state_code,
567
                  'origin_state'               => $origin_state, ];
568
569
                $rate = $tax->rate;
570
571
                $tax_value = $value;
572
            } else {
573
                $tax_attribute[0] = ['name' => 'null', 'rate' => 0, 'tax_enable' =>0];
574
                $tax_value = '0%';
575
            }
576
        }
577
578
        return ['taxs'=>$tax_attribute, 'value'=>$tax_value];
579
    }
580
581
    public function setDomain($productid, $domain)
582
    {
583
        try {
584
            if (\Session::has('domain'.$productid)) {
585
                \Session::forget('domain'.$productid);
586
            }
587
            \Session::put('domain'.$productid, $domain);
588
        } catch (\Exception $ex) {
589
            Bugsnag::notifyException($ex);
590
591
            throw new \Exception($ex->getMessage());
592
        }
593
    }
594
595
    public function sendMail($userid, $invoiceid)
596
    {
597
        try {
598
            $invoice = $this->invoice->find($invoiceid);
599
            $number = $invoice->number;
600
            $total = $invoice->grand_total;
601
602
            return $this->sendInvoiceMail($userid, $number, $total, $invoiceid);
603
        } catch (\Exception $ex) {
604
            Bugsnag::notifyException($ex);
605
606
            throw new \Exception($ex->getMessage());
607
        }
608
    }
609
}
610