Passed
Push — master ( be1785...591f13 )
by Ajit
07:10
created

SubscriptionsController::generateInvoiceNumber()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 15
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
namespace App\Http\Controllers;
4
5
use DB;
6
use Auth;
7
use JavaScript;
0 ignored issues
show
Bug introduced by
The type JavaScript was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
use App\Invoice;
9
use App\Service;
10
use App\Setting;
11
use Carbon\Carbon;
12
use App\SmsTrigger;
13
use App\ChequeDetail;
14
use App\Subscription;
15
use App\InvoiceDetail;
16
use App\PaymentDetail;
17
use Illuminate\Http\Request;
18
19
class SubscriptionsController extends Controller
20
{
21
    public function __construct()
22
    {
23
        $this->middleware('auth');
24
    }
25
26
    public function index(Request $request)
27
    {
28
        $subscriptions = Subscription::indexQuery($request->sort_field, $request->sort_direction, $request->drp_start, $request->drp_end, $request->plan_name)->search('"'.$request->input('search').'"')->paginate(10);
29
        $subscriptionTotal = Subscription::indexQuery($request->sort_field, $request->sort_direction, $request->drp_start, $request->drp_end, $request->plan_name)->search('"'.$request->input('search').'"')->get();
30
        $count = $subscriptionTotal->count();
31
32
        if (! $request->has('drp_start') or ! $request->has('drp_end')) {
33
            $drp_placeholder = 'Select daterange filter';
34
        } else {
35
            $drp_placeholder = $request->drp_start.' - '.$request->drp_end;
36
        }
37
38
        $request->flash();
39
40
        return view('subscriptions.index', compact('subscriptions', 'count', 'drp_placeholder'));
41
    }
42
43
    public function expiring(Request $request)
44
    {
45
        $expirings = Subscription::expiring($request->sort_field, $request->sort_direction, $request->drp_start, $request->drp_end)->search('"'.$request->input('search').'"')->paginate(10);
46
        $count = $expirings->total();
47
48
        if (! $request->has('drp_start') or ! $request->has('drp_end')) {
49
            $drp_placeholder = 'Select daterange filter';
50
        } else {
51
            $drp_placeholder = $request->drp_start.' - '.$request->drp_end;
52
        }
53
54
        $request->flash();
55
56
        return view('subscriptions.expiring', compact('expirings', 'count', 'drp_placeholder'));
57
    }
58
59
    public function expired(Request $request)
60
    {
61
        $allExpired = Subscription::expired($request->sort_field, $request->sort_direction, $request->drp_start, $request->drp_end)->search('"'.$request->input('search').'"')->paginate(10);
62
        $count = $allExpired->total();
63
64
        if (! $request->has('drp_start') or ! $request->has('drp_end')) {
65
            $drp_placeholder = 'Select daterange filter';
66
        } else {
67
            $drp_placeholder = $request->drp_start.' - '.$request->drp_end;
68
        }
69
70
        $request->flash();
71
72
        return view('subscriptions.expired', compact('allExpired', 'count', 'drp_placeholder'));
73
    }
74
75
    public function create()
76
    {
77
        // For Tax calculation
78
        JavaScript::put([
79
          'taxes' => \Utilities::getSetting('taxes'),
80
          'gymieToday' => Carbon::today()->format('Y-m-d'),
81
          'servicesCount' => Service::count(),
82
      ]);
83
        list($invoice_number_mode, $invoiceCounter, $invoice_number) = $this->generateInvoiceNumber();
84
85
        return view('subscriptions.create', compact('invoice_number', 'invoiceCounter', 'invoice_number_mode'));
86
    }
87
88
    public function store(Request $request)
89
    {
90
        DB::beginTransaction();
91
92
        try {
93
            //Helper function to set Payment status
94
            $invoice_total = $request->admission_amount + $request->subscription_amount + $request->taxes_amount - $request->discount_amount;
95
            $paymentStatus = \constPaymentStatus::Unpaid;
96
            $pending = $invoice_total - $request->payment_amount;
97
98
            if ($request->mode == 1) {
99
                if ($request->payment_amount == $invoice_total) {
100
                    $paymentStatus = \constPaymentStatus::Paid;
101
                } elseif ($request->payment_amount > 0 && $request->payment_amount < $invoice_total) {
102
                    $paymentStatus = \constPaymentStatus::Partial;
103
                } elseif ($request->payment_amount == 0) {
104
                    $paymentStatus = \constPaymentStatus::Unpaid;
105
                } else {
106
                    $paymentStatus = \constPaymentStatus::Overpaid;
107
                }
108
            }
109
110
            // Storing Invoice
111
            $invoiceData = ['invoice_number'=> $request->invoice_number,
112
                                     'member_id'=> $request->member_id,
113
                                     'total'=> $invoice_total,
114
                                     'status'=> $paymentStatus,
115
                                     'pending_amount'=> $pending,
116
                                     'discount_amount'=> $request->discount_amount,
117
                                     'discount_percent'=> $request->discount_percent,
118
                                     'discount_note'=> $request->discount_note,
119
                                     'tax'=> $request->taxes_amount,
120
                                     'additional_fees'=> $request->additional_fees,
121
                                     'note'=>' ', ];
122
123
            $invoice = new Invoice($invoiceData);
124
            $invoice->createdBy()->associate(Auth::user());
125
            $invoice->updatedBy()->associate(Auth::user());
126
            $invoice->save();
127
128
            // Storing subscription
129
            foreach ($request->plan as $plan) {
130
                $subscriptionData = ['member_id'=> $request->member_id,
131
                                            'invoice_id'=> $invoice->id,
132
                                            'plan_id'=> $plan['id'],
133
                                            'start_date'=> $plan['start_date'],
134
                                            'end_date'=> $plan['end_date'],
135
                                            'status'=> \constSubscription::onGoing,
136
                                            'is_renewal'=>'0', ];
137
138
                $subscription = new Subscription($subscriptionData);
139
                $subscription->createdBy()->associate(Auth::user());
140
                $subscription->updatedBy()->associate(Auth::user());
141
                $subscription->save();
142
143
                //Adding subscription to invoice(Invoice Details)
144
                $detailsData = ['invoice_id'=> $invoice->id,
145
                                       'plan_id'=> $plan['id'],
146
                                       'item_amount'=> $plan['price'], ];
147
148
                $invoice_details = new InvoiceDetail($detailsData);
149
                $invoice_details->createdBy()->associate(Auth::user());
150
                $invoice_details->updatedBy()->associate(Auth::user());
151
                $invoice_details->save();
152
            }
153
154
            //Payment Details
155
            $paymentData = ['invoice_id'=> $invoice->id,
156
                                   'payment_amount'=> $request->payment_amount,
157
                                   'mode'=> $request->mode,
158
                                   'note'=> ' ', ];
159
160
            $payment_details = new PaymentDetail($paymentData);
161
            $payment_details->createdBy()->associate(Auth::user());
162
            $payment_details->updatedBy()->associate(Auth::user());
163
            $payment_details->save();
164
165
            if ($request->mode == 0) {
166
                // Store Cheque Details
167
                $chequeData = ['payment_id'=> $payment_details->id,
168
                                    'number'=> $request->number,
169
                                    'date'=> $request->date,
170
                                    'status'=> \constChequeStatus::Recieved, ];
171
172
                $cheque_details = new ChequeDetail($chequeData);
173
                $cheque_details->createdBy()->associate(Auth::user());
174
                $cheque_details->updatedBy()->associate(Auth::user());
175
                $cheque_details->save();
176
            }
177
178
            // Set the subscription status of the 'Renewed' subscription to Renew
179
            if ($request->has('previousSubscriptions')) {
180
                Subscription::where('invoice_id', $invoice->id)->update(['is_renewal' => '1']);
181
182
                foreach ($request->previousSubscriptions as $subscriptionId) {
183
                    $oldSubscription = Subscription::findOrFail($subscriptionId);
184
                    $oldSubscription->status = \constSubscription::renewed;
185
                    $oldSubscription->updatedBy()->associate(Auth::user());
186
                    $oldSubscription->save();
187
                }
188
            }
189
190
            //Updating Numbering Counters
191
            Setting::where('key', '=', 'invoice_last_number')->update(['value' => $request->invoiceCounter]);
192
            $sender_id = \Utilities::getSetting('sms_sender_id');
193
            $gym_name = \Utilities::getSetting('gym_name');
194
195
            //SMS Trigger
196
            if ($invoice->status == \constPaymentStatus::Paid) {
197
                if ($request->mode == 0) {
198
                    $sms_trigger = SmsTrigger::where('alias', '=', 'payment_with_cheque')->first();
199
                    $message = $sms_trigger->message;
200
                    $sms_text = sprintf($message, $subscription->member->name, $payment_details->payment_amount, $cheque_details->number, $invoice->invoice_number, $gym_name);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $cheque_details does not seem to be defined for all execution paths leading up to this point.
Loading history...
Comprehensibility Best Practice introduced by
The variable $subscription seems to be defined by a foreach iteration on line 129. Are you sure the iterator is never empty, otherwise this variable is not defined?
Loading history...
201
                    $sms_status = $sms_trigger->status;
202
203
                    \Utilities::Sms($sender_id, $subscription->member->contact, $sms_text, $sms_status);
204
                } else {
205
                    $sms_trigger = SmsTrigger::where('alias', '=', 'subscription_renewal_with_paid_invoice')->first();
206
                    $message = $sms_trigger->message;
207
                    $sms_text = sprintf($message, $subscription->member->name, $payment_details->payment_amount, $invoice->invoice_number);
208
                    $sms_status = $sms_trigger->status;
209
210
                    \Utilities::Sms($sender_id, $subscription->member->contact, $sms_text, $sms_status);
211
                }
212
            } elseif ($invoice->status == \constPaymentStatus::Partial) {
213
                if ($request->mode == 0) {
214
                    $sms_trigger = SmsTrigger::where('alias', '=', 'payment_with_cheque')->first();
215
                    $message = $sms_trigger->message;
216
                    $sms_text = sprintf($message, $subscription->member->name, $payment_details->payment_amount, $cheque_details->number, $invoice->invoice_number, $gym_name);
217
                    $sms_status = $sms_trigger->status;
218
219
                    \Utilities::Sms($sender_id, $subscription->member->contact, $sms_text, $sms_status);
220
                } else {
221
                    $sms_trigger = SmsTrigger::where('alias', '=', 'subscription_renewal_with_partial_invoice')->first();
222
                    $message = $sms_trigger->message;
223
                    $sms_text = sprintf($message, $subscription->member->name, $payment_details->payment_amount, $invoice->invoice_number, $invoice->pending_amount);
224
                    $sms_status = $sms_trigger->status;
225
226
                    \Utilities::Sms($sender_id, $subscription->member->contact, $sms_text, $sms_status);
227
                }
228
            } elseif ($invoice->status == \constPaymentStatus::Unpaid) {
229
                if ($request->mode == 0) {
230
                    $sms_trigger = SmsTrigger::where('alias', '=', 'payment_with_cheque')->first();
231
                    $message = $sms_trigger->message;
232
                    $sms_text = sprintf($message, $subscription->member->name, $payment_details->payment_amount, $cheque_details->number, $invoice->invoice_number, $gym_name);
233
                    $sms_status = $sms_trigger->status;
234
235
                    \Utilities::Sms($sender_id, $subscription->member->contact, $sms_text, $sms_status);
236
                } else {
237
                    $sms_trigger = SmsTrigger::where('alias', '=', 'subscription_renewal_with_unpaid_invoice')->first();
238
                    $message = $sms_trigger->message;
239
                    $sms_text = sprintf($message, $subscription->member->name, $invoice->total, $invoice->invoice_number);
240
                    $sms_status = $sms_trigger->status;
241
242
                    \Utilities::Sms($sender_id, $subscription->member->contact, $sms_text, $sms_status);
243
                }
244
            }
245
246
            DB::commit();
247
            flash()->success('Subscription was successfully created');
248
249
            return redirect(action('SubscriptionsController@index'));
250
        } catch (\Exception $e) {
251
            DB::rollback();
252
            flash()->error('Error while creating the Subscription');
253
254
            return redirect(action('SubscriptionsController@index'));
255
        }
256
    }
257
258
    //End of store method
259
260
    public function edit($id)
261
    {
262
        $subscription = Subscription::findOrFail($id);
263
        // $carbonToday = Carbon::today()->format('Y-m-d');
264
        // $subscriptionEndDate = $subscription->end_date->format('Y-m-d');
265
        $diff = Carbon::today()->diffInDays($subscription->end_date);
266
        //$gymieDiff = $diff->format('Y-m-d');
267
        $gymieDiff = $subscription->end_date->addDays($diff);
268
269
        JavaScript::put([
270
          'gymieToday' => Carbon::today()->format('Y-m-d'),
271
          'gymieEndDate' => $subscription->end_date->format('Y-m-d'),
272
          'gymieDiff' => $gymieDiff->format('Y-m-d'),
273
      ]);
274
275
        return view('subscriptions.edit', compact('subscription'));
276
    }
277
278
    public function update($id, Request $request)
279
    {
280
        $subscription = Subscription::findOrFail($id);
281
282
        $subscription->update($request->all());
283
        $subscription->updatedBy()->associate(Auth::user());
284
        $subscription->save();
285
        flash()->success('Subscription details were successfully updated');
286
287
        return redirect('subscriptions/all');
288
    }
289
290
    public function renew($id, Request $request)
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

290
    public function renew($id, /** @scrutinizer ignore-unused */ Request $request)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
291
    {
292
293
        //Get Numbering mode
294
        list($invoice_number_mode, $invoiceCounter, $invoice_number) = $this->generateInvoiceNumber();
295
296
        $subscriptions = Subscription::where('invoice_id', $id)->get();
297
        $member_id = $subscriptions->pluck('member_id')->first();
298
299
        // Javascript Variables
300
        JavaScript::put([
301
            'taxes' => \Utilities::getSetting('taxes'),
302
            'gymieToday' => Carbon::today()->format('Y-m-d'),
303
            'servicesCount' => Service::count(),
304
            'currentServices' => $subscriptions->count(),
305
        ]);
306
307
        return view('subscriptions.renew', compact('subscriptions', 'member_id', 'invoice_number', 'invoiceCounter', 'invoice_number_mode'));
308
    }
309
310
    public function cancelSubscription($id)
311
    {
312
        DB::beginTransaction();
313
        try {
314
            $subscription = Subscription::findOrFail($id);
315
316
            $subscription->update(['status' => \constSubscription::cancelled]);
317
318
            $subscription->member->update(['status' => \constStatus::InActive]);
319
320
            DB::commit();
321
            flash()->success('Subscription was successfully cancelled');
322
323
            return redirect('subscriptions/expired');
324
        } catch (Exception $e) {
0 ignored issues
show
Bug introduced by
The type App\Http\Controllers\Exception was not found. Did you mean Exception? If so, make sure to prefix the type with \.
Loading history...
325
            DB::rollback();
326
            flash()->error('Error while cancelling the Subscription');
327
328
            return redirect('subscriptions/expired');
329
        }
330
    }
331
332
    public function delete($id)
333
    {
334
        DB::beginTransaction();
335
336
        try {
337
            $subscription = Subscription::findOrFail($id);
338
            $invoice = Invoice::where('id', $subscription->invoice_id)->first();
339
            $invoice_details = InvoiceDetail::where('invoice_id', $invoice->id)->get();
340
            $payment_details = PaymentDetail::where('invoice_id', $invoice->id)->get();
341
342
            foreach ($invoice_details as $invoice_detail) {
343
                $invoice_detail->delete();
344
            }
345
346
            foreach ($payment_details as $payment_detail) {
347
                ChequeDetail::where('payment_id', $payment_detail->id)->delete();
348
                $payment_detail->delete();
349
            }
350
351
            $subscription->delete();
352
            $invoice->delete();
353
354
            DB::commit();
355
356
            return back();
357
        } catch (\Exception $e) {
358
            DB::rollback();
359
360
            return back();
361
        }
362
    }
363
364
    public function change($id)
365
    {
366
        $subscription = Subscription::findOrFail($id);
367
368
        $already_paid = PaymentDetail::leftJoin('trn_cheque_details', 'trn_payment_details.id', '=', 'trn_cheque_details.payment_id')
369
                                     ->whereRaw("trn_payment_details.invoice_id = $subscription->invoice_id AND (trn_cheque_details.`status` = 2 or trn_cheque_details.`status` IS NULL)")
370
                                     ->sum('trn_payment_details.payment_amount');
371
372
        JavaScript::put([
373
          'taxes' => \Utilities::getSetting('taxes'),
374
          'gymieToday' => Carbon::today()->format('Y-m-d'),
375
          'servicesCount' => Service::count(),
376
      ]);
377
378
        return view('subscriptions.change', compact('subscription', 'already_paid'));
379
    }
380
381
    public function modify($id, Request $request)
382
    {
383
        $subscription = Subscription::findOrFail($id);
384
385
        try {
386
            DB::beginTransaction();
387
            //Helper function to set Payment status
388
            $invoice_total = $request->admission_amount + $request->subscription_amount + $request->taxes_amount - $request->discount_amount;
389
            $paymentStatus = \constPaymentStatus::Unpaid;
390
            $total_paid = $request->payment_amount + $request->previous_payment;
391
            $pending = $invoice_total - $total_paid;
392
393
            if ($request->mode == 1) {
394
                if ($total_paid == $invoice_total) {
395
                    $paymentStatus = \constPaymentStatus::Paid;
396
                } elseif ($total_paid > 0 && $total_paid < $invoice_total) {
397
                    $paymentStatus = \constPaymentStatus::Partial;
398
                } elseif ($total_paid == 0) {
399
                    $paymentStatus = \constPaymentStatus::Unpaid;
400
                } else {
401
                    $paymentStatus = \constPaymentStatus::Overpaid;
402
                }
403
            }
404
405
            Invoice::where('id', $subscription->invoice_id)->update(['invoice_number'=> $request->invoice_number,
406
                                                               'total'=> $invoice_total,
407
                                                               'status'=> $paymentStatus,
408
                                                               'pending_amount'=> $pending,
409
                                                               'discount_amount'=> $request->discount_amount,
410
                                                               'discount_percent'=> $request->discount_percent,
411
                                                               'discount_note'=> $request->discount_note,
412
                                                               'tax'=> $request->taxes_amount,
413
                                                               'additional_fees'=> $request->additional_fees,
414
                                                               'note'=>' ', ]);
415
416
            foreach ($request->plan as $plan) {
417
                $subscription->update(['plan_id'=> $plan['id'],
418
                                        'start_date'=> $plan['start_date'],
419
                                        'end_date'=> $plan['end_date'],
420
                                        'status'=> \constSubscription::onGoing,
421
                                        'is_renewal'=>'0', ]);
422
423
                //Adding subscription to invoice(Invoice Details)
424
425
                InvoiceDetail::where('invoice_id', $subscription->invoice_id)->update(['plan_id'=> $plan['id'],
426
                                                                                         'item_amount'=> $plan['price'], ]);
427
            }
428
429
            //Payment Details
430
            $paymentData = ['invoice_id'=> $subscription->invoice_id,
431
                                   'payment_amount'=> $request->payment_amount,
432
                                   'mode'=> $request->mode,
433
                                   'note'=> ' ', ];
434
435
            $payment_details = new PaymentDetail($paymentData);
436
            $payment_details->createdBy()->associate(Auth::user());
437
            $payment_details->updatedBy()->associate(Auth::user());
438
            $payment_details->save();
439
440
            if ($request->mode == 0) {
441
                // Store Cheque Details
442
                $chequeData = ['payment_id'=> $payment_details->id,
443
                                    'number'=> $request->number,
444
                                    'date'=> $request->date,
445
                                    'status'=> \constChequeStatus::Recieved, ];
446
447
                $cheque_details = new ChequeDetail($chequeData);
448
                $cheque_details->createdBy()->associate(Auth::user());
449
                $cheque_details->updatedBy()->associate(Auth::user());
450
                $cheque_details->save();
451
            }
452
453
            DB::commit();
454
            flash()->success('Subscription was successfully changed');
455
456
            return redirect(action('MembersController@show', ['id' => $subscription->member_id]));
457
        } catch (\Exception $e) {
458
            DB::rollback();
459
            flash()->error('Error while changing the Subscription');
460
461
            return back();
462
        }
463
    }
464
465
    /**
466
     * @return array
467
     */
468
    private function generateInvoiceNumber()
469
    {
470
        //Get Numbering mode
471
        $invoiceNumberMode = \Utilities::getSetting('invoice_number_mode');
472
473
        //Generating Invoice number
474
        if ($invoiceNumberMode == \constNumberingMode::Auto) {
475
            $invoiceCounter = \Utilities::getSetting('invoice_last_number') + 1;
476
            $invoiceNumber = \Utilities::getSetting('invoice_prefix').$invoiceCounter;
477
        } else {
478
            $invoiceNumber = '';
479
            $invoiceCounter = '';
480
        }
481
482
        return [$invoiceNumberMode, $invoiceCounter, $invoiceNumber];
483
    }
484
}
485