Completed
Push — development ( 6c0383...f96071 )
by Ashutosh
11:19
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);
355
356
            throw new \Exception('Can not create Invoice Items');
357
        }
358
    }
359
360
    public function invoiceGenerateByForm(Request $request, $user_id = '')
361
    {
362
        try {
363
            $agents = $request->input('agents');
364
            $status = 'pending';
365
            $qty = $request->input('quantity');
366
            if ($user_id == '') {
367
                $user_id = \Request::input('user');
368
            }
369
            $productid = $request->input('product');
370
371
            $plan = $request->input('plan');
372
            $agents = $this->getAgents($agents, $productid, $plan);
373
            $qty = $this->getQuantity($qty, $productid, $plan);
374
375
            $code = $request->input('code');
376
            $total = $request->input('price');
377
            $description = $request->input('description');
378
            if ($request->has('domain')) {
379
                $domain = $request->input('domain');
380
                $this->setDomain($productid, $domain);
381
            }
382
            $controller = new \App\Http\Controllers\Front\CartController();
383
            $userCurrency = $controller->currency($user_id);
384
            $currency = $userCurrency['currency'];
385
            $number = rand(11111111, 99999999);
386
            $date = \Carbon\Carbon::now();
387
            $product = Product::find($productid);
388
            $cost = $controller->cost($productid, $user_id, $plan);
389
            if ($cost != $total) {
390
                $grand_total = $total;
391
            }
392
            $grand_total = $this->getGrandTotal($code, $total, $cost, $productid, $currency);
393
            $grand_total = $qty * $grand_total;
394
            if ($grand_total == 0) {
395
                $status = 'success';
396
            }
397
            $tax = $this->checkTax($product->id, $user_id);
398
            $tax_name = '';
399
            $tax_rate = '';
400
            if (!empty($tax)) {
401
                $tax_name = $tax[0];
402
                $tax_rate = $tax[1];
403
            }
404
405
            $grand_total = $this->calculateTotal($tax_rate, $grand_total);
406
            $grand_total = \App\Http\Controllers\Front\CartController::rounding($grand_total);
407
408
            $invoice = Invoice::create(['user_id' => $user_id,
409
                'number'                          => $number, 'date' => $date, 'grand_total' => $grand_total,
410
                'currency'                        => $currency, 'status' => $status, 'description' => $description, ]);
411
412
            $items = $this->createInvoiceItemsByAdmin($invoice->id, $productid,
413
             $code, $total, $currency, $qty, $agents, $plan, $user_id, $tax_name, $tax_rate);
414
            $result = $this->getMessage($items, $user_id);
415
        } catch (\Exception $ex) {
416
            app('log')->info($ex->getMessage());
417
            Bugsnag::notifyException($ex);
418
            $result = ['fails' => $ex->getMessage()];
419
        }
420
421
        return response()->json(compact('result'));
422
    }
423
424
    public function createInvoiceItemsByAdmin($invoiceid, $productid, $code, $price,
425
        $currency, $qty, $agents, $planid = '', $userid = '', $tax_name = '', $tax_rate = '')
426
    {
427
        try {
428
            $discount = '';
429
            $mode = '';
430
            $product = $this->product->findOrFail($productid);
431
            $plan = Plan::where('product', $productid)->first();
432
            $subtotal = $qty * intval($price);
433
            if ($code) {
434
                $subtotal = $this->checkCode($code, $productid, $currency);
435
                $mode = 'coupon';
436
                $discount = $price - $subtotal;
437
            }
438
            $userid = \Auth::user()->id;
439
            if (\Auth::user()->role == 'user') {
440
                $tax = $this->checkTax($product->id, $userid);
441
                $tax_name = '';
442
                $tax_rate = '';
443
                if (!empty($tax)) {
444
                    $tax_name = $tax[0];
445
                    $tax_rate = $tax[1];
446
                }
447
            }
448
449
            $subtotal = $this->calculateTotal($tax_rate, $subtotal);
450
            $domain = $this->domain($productid);
451
            $items = $this->invoiceItem->create([
452
                'invoice_id'     => $invoiceid,
453
                'product_name'   => $product->name,
454
                'regular_price'  => $price,
455
                'quantity'       => $qty,
456
                'discount'       => $discount,
457
                'discount_mode'  => $mode,
458
                'subtotal'       => \App\Http\Controllers\Front\CartController::rounding($subtotal),
459
                'tax_name'       => $tax_name,
460
                'tax_percentage' => $tax_rate,
461
                'domain'         => $domain,
462
                'plan_id'        => $planid,
463
                'agents'         => $agents,
464
            ]);
465
466
            return $items;
467
        } catch (\Exception $ex) {
468
            Bugsnag::notifyException($ex);
469
470
            return redirect()->back()->with('fails', $ex->getMessage());
471
        }
472
    }
473
474
    public function checkTax($productid, $userid)
475
    {
476
        try {
477
            $taxs = [];
478
            $taxs[0] = ['name' => 'null', 'rate' => 0];
479
            $geoip_state = User::where('id', $userid)->pluck('state')->first();
480
            $geoip_country = User::where('id', $userid)->pluck('country')->first();
481
            $product = $this->product->findOrFail($productid);
482
            $cartController = new CartController();
483
            if ($this->tax_option->findOrFail(1)->inclusive == 0) {
484
                if ($this->tax_option->findOrFail(1)->tax_enable == 1) {
485
                    $taxs = $this->getTaxWhenEnable($productid, $taxs[0], $userid);
486
                } elseif ($this->tax_option->tax_enable == 0) {//if tax_enable is 0
487
488
                    $taxClassId = Tax::where('country', '')->where('state', 'Any State')
489
                     ->pluck('tax_classes_id')->first(); //In case of India when
490
                    //other tax is available and tax is not enabled
491
                    if ($taxClassId) {
492
                        $rate = $this->getTotalRate($taxClassId, $productid, $taxs);
493
                        $taxs = $rate['taxes'];
494
                        $rate = $rate['rate'];
495
                    } elseif ($geoip_country != 'IN') {//In case of other country
496
                        // when tax is available and tax is not enabled(Applicable
497
                        //when Global Tax class for any country and state is not there)
498
499
                        $taxClassId = Tax::where('state', $geoip_state)
500
                        ->orWhere('country', $geoip_country)->pluck('tax_classes_id')->first();
501
                        if ($taxClassId) { //if state equals the user State
502
                            $rate = $this->getTotalRate($taxClassId, $productid, $taxs);
503
                            $taxs = $rate['taxes'];
504
                            $rate = $rate['rate'];
505
                        }
506
                        $taxs = ([$taxs[0]['name'], $taxs[0]['rate']]);
507
508
                        return $taxs;
509
                    }
510
                    $taxs = ([$taxs[0]['name'], $taxs[0]['rate']]);
511
                } else {
512
                    $taxs = ([$taxs[0]['name'], $taxs[0]['rate']]);
513
                }
514
            }
515
516
            return $taxs;
517
        } catch (\Exception $ex) {
518
            throw new \Exception(\Lang::get('message.check-tax-error'));
519
        }
520
    }
521
522
    public function getRate($productid, $taxs, $userid)
523
    {
524
        $tax_attribute = [];
525
        $tax_attribute[0] = ['name' => 'null', 'rate' => 0, 'tax_enable' =>0];
526
        $tax_value = '0';
527
528
        $geoip_state = User::where('id', $userid)->pluck('state')->first();
529
        $geoip_country = User::where('id', $userid)->pluck('country')->first();
530
        $user_state = $this->tax_by_state::where('state_code', $geoip_state)->first();
531
        $origin_state = $this->setting->first()->state; //Get the State of origin
532
        $cartController = new CartController();
533
        $rate = 0;
534
        $name1 = 'CGST';
535
        $name2 = 'SGST';
536
        $name3 = 'IGST';
537
        $name4 = 'UTGST';
538
        $c_gst = 0;
539
        $s_gst = 0;
540
        $i_gst = 0;
541
        $ut_gst = 0;
542
        $state_code = '';
543
        if ($user_state != '') {//Get the CGST,SGST,IGST,STATE_CODE of the user
544
            $tax = $this->getTaxWhenState($user_state, $productid, $origin_state);
545
            $taxes = $tax['taxes'];
546
            $value = $tax['value'];
547
        } else {//If user from other Country
548
            $tax = $this->getTaxWhenOtherCountry($geoip_state, $geoip_country, $productid);
549
            $taxes = $tax['taxes'];
550
            $value = $tax['value'];
551
            $rate = $tax['rate'];
552
        }
553
554
        foreach ($taxes as $key => $tax) {
555
            if ($taxes[0]) {
556
                $tax_attribute[$key] = ['name' => $tax->name, 'name1' => $name1,
557
                 'name2'                       => $name2, 'name3' => $name3, 'name4' => $name4,
558
                 'rate'                        => $value, 'rate1'=>$c_gst, 'rate2'=>$s_gst,
559
                 'rate3'                       => $i_gst, 'rate4'=>$ut_gst, 'state'=>$state_code,
560
                  'origin_state'               => $origin_state, ];
561
562
                $rate = $tax->rate;
563
564
                $tax_value = $value;
565
            } else {
566
                $tax_attribute[0] = ['name' => 'null', 'rate' => 0, 'tax_enable' =>0];
567
                $tax_value = '0%';
568
            }
569
        }
570
571
        return ['taxs'=>$tax_attribute, 'value'=>$tax_value];
572
    }
573
574
    public function setDomain($productid, $domain)
575
    {
576
        try {
577
            if (\Session::has('domain'.$productid)) {
578
                \Session::forget('domain'.$productid);
579
            }
580
            \Session::put('domain'.$productid, $domain);
581
        } catch (\Exception $ex) {
582
            Bugsnag::notifyException($ex);
583
584
            throw new \Exception($ex->getMessage());
585
        }
586
    }
587
588
    public function sendMail($userid, $invoiceid)
589
    {
590
        try {
591
            $invoice = $this->invoice->find($invoiceid);
592
            $number = $invoice->number;
593
            $total = $invoice->grand_total;
594
595
            return $this->sendInvoiceMail($userid, $number, $total, $invoiceid);
596
        } catch (\Exception $ex) {
597
            Bugsnag::notifyException($ex);
598
599
            throw new \Exception($ex->getMessage());
600
        }
601
    }
602
}
603