Completed
Branch feature-dynamic-fields (a5624d)
by Ashutosh
09:27
created

InvoiceController::createInvoiceItemsByAdmin()   A

Complexity

Conditions 5
Paths 38

Size

Total Lines 48
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Importance

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