MembersController::store()   F
last analyzed

Complexity

Conditions 18
Paths 18710

Size

Total Lines 232
Code Lines 150

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 232
rs 2
c 0
b 0
f 0
cc 18
eloc 150
nc 18710
nop 1

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
namespace App\Http\Controllers;
3
4
use Illuminate\Http\Request;
5
use Auth;
6
use DB;
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 Carbon\Carbon;
9
use App\Member;
10
use App\Setting;
11
use App\Plan;
12
use App\Enquiry;
13
use App\Subscription;
14
use App\Invoice;
15
use App\Service;
16
use App\Invoice_detail;
17
use App\Payment_detail;
18
use App\Cheque_detail;
19
use App\Sms_trigger;
20
use Illuminate\Pagination\Paginator;
21
use App\Http\Requests;
22
use App\Http\Controllers\Controller;
23
24
class MembersController extends Controller
25
{   
26
    public function __construct()
27
    {
28
        $this->middleware('auth');
29
    }
30
	/**
31
     * Display a listing of the resource.
32
     *
33
     * @return Response
0 ignored issues
show
Bug introduced by
The type App\Http\Controllers\Response was not found. Did you mean Response? If so, make sure to prefix the type with \.
Loading history...
34
     */
35
    public function index(Request $request)
36
    {
37
      $members = Member::indexQuery($request->sort_field,$request->sort_direction,$request->drp_start,$request->drp_end)->search('"'.$request->input('search').'"')->paginate(10);
38
      $memberTotal = Member::indexQuery($request->sort_field,$request->sort_direction,$request->drp_start,$request->drp_end)->search('"'.$request->input('search').'"')->get();
39
      $count = $memberTotal->count();
40
     
41
 
42
      if (!$request->has('drp_start') or !$request->has('drp_end')) 
43
      {
44
        $drp_placeholder = "Select daterange filter";
45
      }
46
      else
47
      {
48
        $drp_placeholder = $request->drp_start. ' - ' .$request->drp_end;
49
      }
50
51
      $request->flash();
52
      
53
      return view('members.index', compact('members','count','drp_placeholder','old_sort'));
0 ignored issues
show
Bug Best Practice introduced by
The expression return view('members.ind...ceholder', 'old_sort')) returns the type Illuminate\View\View which is incompatible with the documented return type App\Http\Controllers\Response.
Loading history...
54
    }
55
56
    public function active(Request $request)
57
    {
58
      $members = Member::active($request->sort_field,$request->sort_direction,$request->drp_start,$request->drp_end)->search('"'.$request->input('search').'"')->paginate(10);
59
      $Totalmembers = Member::active($request->sort_field,$request->sort_direction,$request->drp_start,$request->drp_end)->search('"'.$request->input('search').'"')->get();
60
      $count = $Totalmembers->count();
61
     
62
 
63
      if (!$request->has('drp_start') or !$request->has('drp_end')) 
64
      {
65
        $drp_placeholder = "Select daterange filter";
66
      }
67
      else
68
      {
69
        $drp_placeholder = $request->drp_start. ' - ' .$request->drp_end;
70
      }
71
72
      $request->flash();
73
      
74
      return view('members.active', compact('members','count','drp_placeholder','old_sort'));
75
    }
76
77
    public function inactive(Request $request)
78
    {
79
      $members = Member::inactive($request->sort_field,$request->sort_direction,$request->drp_start,$request->drp_end)->search('"'.$request->input('search').'"')->paginate(10);
80
      $Totalmembers = Member::inactive($request->sort_field,$request->sort_direction,$request->drp_start,$request->drp_end)->search('"'.$request->input('search').'"')->get();
81
      $count = $Totalmembers->count();
82
     
83
 
84
      if (!$request->has('drp_start') or !$request->has('drp_end')) 
85
      {
86
        $drp_placeholder = "Select daterange filter";
87
      }
88
      else
89
      {
90
        $drp_placeholder = $request->drp_start. ' - ' .$request->drp_end;
91
      }
92
93
      $request->flash();
94
      
95
      return view('members.inactive', compact('members','count','drp_placeholder','old_sort'));
96
    }
97
98
     /**
99
     * Display the specified resource.
100
     *
101
     * @param  int  $id
102
     * @return Response
103
     */
104
    public function show($id)
105
    {
106
      $member = Member::findOrFail($id);
107
108
      return view('members.show', compact('member'));
0 ignored issues
show
Bug Best Practice introduced by
The expression return view('members.show', compact('member')) returns the type Illuminate\View\View which is incompatible with the documented return type App\Http\Controllers\Response.
Loading history...
109
    }
110
111
     /**
112
     * Show the form for creating a new resource.
113
     *
114
     * @return Response
115
     */
116
    public function create()
117
    {
118
        // For Tax calculation
119
        JavaScript::put([
120
            'taxes' => \Utilities::getSetting('taxes'),
121
            'gymieToday' => Carbon::today()->format('Y-m-d'),
122
            'servicesCount' => Service::count(),
123
        ]);
124
125
        //Get Numbering mode
126
        $invoice_number_mode = \Utilities::getSetting('invoice_number_mode');
127
        $member_number_mode = \Utilities::getSetting('member_number_mode');
128
129
        //Generating Invoice number
130
        if ($invoice_number_mode == \constNumberingMode::Auto ) {
131
            $invoiceCounter = \Utilities::getSetting('invoice_last_number') + 1;
132
            $invoicePrefix = \Utilities::getSetting('invoice_prefix');
133
            $invoice_number = $invoicePrefix.$invoiceCounter;
134
        }
135
136
        else {
137
            $invoice_number = '';
138
            $invoiceCounter = '';
139
        }
140
141
        //Generating Member Counter
142
        if ($member_number_mode == \constNumberingMode::Auto ) {
143
            $memberCounter = \Utilities::getSetting('member_last_number') + 1;
144
            $memberPrefix = \Utilities::getSetting('member_prefix');
145
            $member_code = $memberPrefix.$memberCounter;
146
        }
147
148
        else {
149
            $member_code = '';
150
            $memberCounter = '';
151
        }
152
153
    	return view('members.create',compact('invoice_number','invoiceCounter','member_code','memberCounter','member_number_mode','invoice_number_mode'));
0 ignored issues
show
Bug Best Practice introduced by
The expression return view('members.cre...'invoice_number_mode')) returns the type Illuminate\View\View which is incompatible with the documented return type App\Http\Controllers\Response.
Loading history...
154
    }
155
    
156
     /**
157
     * Store a newly created resource in storage.
158
     *
159
     * @return Response
160
     */
161
    public function store(Request $request)
162
    {
163
        // Member Model Validation
164
        $this->validate($request, ['email' => 'unique:mst_members,email',
165
                                   'contact' => 'unique:mst_members,contact', 
166
                                   'member_code' => 'unique:mst_members,member_code']);
167
168
        // Start Transaction
169
        DB::beginTransaction();
170
171
        try {
172
                // Store member's personal details
173
                $memberData = array('name'=>$request->name,
174
                                    'DOB'=> $request->DOB,
175
                                    'gender'=> $request->gender,
176
                                    'contact'=> $request->contact,
177
                                    'emergency_contact'=> $request->emergency_contact,
178
                                    'health_issues'=> $request->health_issues,
179
                                    'email'=> $request->email,
180
                                    'address'=> $request->address,
181
                                    'member_id'=> $request->member_id,
182
                                    'proof_name'=> $request->proof_name,
183
                                    'member_code'=> $request->member_code,
184
                                    'status'=> $request->status, 
185
                                    'pin_code'=> $request->pin_code, 
186
                                    'occupation'=> $request->occupation, 
187
                                    'aim'=> $request->aim, 
188
                                    'source'=> $request->source);
189
190
                $member  = new Member($memberData);
191
                $member->createdBy()->associate(Auth::user());
192
                $member->updatedBy()->associate(Auth::user());
193
                $member->save();
194
195
                // Adding media i.e. Profile & proof photo
196
                if($request->hasFile('photo'))
197
                {
198
                  $member->addMedia($request->file('photo'))->usingFileName('profile_'.$member->id.$request->photo->getClientOriginalExtension())->toCollection('profile');
0 ignored issues
show
Bug introduced by
It seems like $request->file('photo') can also be of type array; however, parameter $file of App\Member::addMedia() does only seem to accept Symfony\Component\HttpFo...ile\UploadedFile|string, maybe add an additional type check? ( Ignorable by Annotation )

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

198
                  $member->addMedia(/** @scrutinizer ignore-type */ $request->file('photo'))->usingFileName('profile_'.$member->id.$request->photo->getClientOriginalExtension())->toCollection('profile');
Loading history...
199
                }
200
201
                if($request->hasFile('proof_photo'))
202
                {
203
                  $member->addMedia($request->file('proof_photo'))->usingFileName('proof_'.$member->id.$request->proof_photo->getClientOriginalExtension())->toCollection('proof');
204
                }                
205
206
                // Helper function for calculating payment status
207
                $invoice_total = $request->admission_amount + $request->subscription_amount + $request->taxes_amount - $request->discount_amount;
208
                $paymentStatus = \constPaymentStatus::Unpaid;
209
                $pending = $invoice_total - $request->payment_amount;
210
211
                if($request->mode == 1)
212
                {
213
                  if ($request->payment_amount == $invoice_total) 
214
                  {
215
                    $paymentStatus = \constPaymentStatus::Paid;
216
                  } 
217
                  elseif($request->payment_amount > 0 && $request->payment_amount < $invoice_total) 
218
                  {
219
                    $paymentStatus = \constPaymentStatus::Partial;
220
                  }
221
                  elseif($request->payment_amount == 0)
222
                  {
223
                    $paymentStatus = \constPaymentStatus::Unpaid;
224
                  }
225
                  else 
226
                  {
227
                    $paymentStatus = \constPaymentStatus::Overpaid;
228
                  }
229
                }
230
231
                // Storing Invoice                
232
                $invoiceData = array('invoice_number'=> $request->invoice_number,
233
                                     'member_id'=> $member->id,
234
                                     'total'=> $invoice_total,
235
                                     'status'=> $paymentStatus,
236
                                     'pending_amount'=> $pending,
237
                                     'discount_amount'=> $request->discount_amount,
238
                                     'discount_percent'=> $request->discount_percent,
239
                                     'discount_note'=> $request->discount_note,
240
                                     'tax'=> $request->taxes_amount,
241
                                     'additional_fees'=> $request->additional_fees,
242
                                     'note'=>' ');
243
244
                $invoice = new Invoice($invoiceData);
245
                $invoice->createdBy()->associate(Auth::user());
246
                $invoice->updatedBy()->associate(Auth::user());
247
                $invoice->save();
248
249
                // Storing subscription
250
                foreach($request->plan as $plan)
251
                {
252
                  $subscriptionData = array('member_id'=> $member->id,
253
                                            'invoice_id'=> $invoice->id,
254
                                            'plan_id'=> $plan['id'],
255
                                            'start_date'=> $plan['start_date'],
256
                                            'end_date'=> $plan['end_date'],
257
                                            'status'=> \constSubscription::onGoing,
258
                                            'is_renewal'=>'0');
259
260
                  $subscription = new Subscription($subscriptionData);
261
                  $subscription->createdBy()->associate(Auth::user());
262
                  $subscription->updatedBy()->associate(Auth::user());
263
                  $subscription->save();
264
265
                  //Adding subscription to invoice(Invoice Details)
266
                  $detailsData = array('invoice_id'=> $invoice->id,
267
                                       'plan_id'=> $plan['id'],
268
                                       'item_amount'=> $plan['price']);
269
               
270
                  $invoice_details = new Invoice_detail($detailsData);
271
                  $invoice_details->createdBy()->associate(Auth::user());
272
                  $invoice_details->updatedBy()->associate(Auth::user());
273
                  $invoice_details->save();
274
                }
275
276
                // Store Payment Details
277
                $paymentData = array('invoice_id'=> $invoice->id,
278
                                     'payment_amount'=> $request->payment_amount,
279
                                     'mode'=> $request->mode,
280
                                     'note'=> ' ');
281
            
282
                $payment_details = new Payment_detail($paymentData);
283
                $payment_details->createdBy()->associate(Auth::user());
284
                $payment_details->updatedBy()->associate(Auth::user());
285
                $payment_details->save();
286
287
                if($request->mode == 0)
288
                {
289
                  // Store Cheque Details
290
                  $chequeData = array('payment_id'=> $payment_details->id,
291
                                      'number'=> $request->number,
292
                                      'date'=> $request->date,
293
                                      'status'=> \constChequeStatus::Recieved);
294
              
295
                  $cheque_details = new Cheque_detail($chequeData);
296
                  $cheque_details->createdBy()->associate(Auth::user());
297
                  $cheque_details->updatedBy()->associate(Auth::user());
298
                  $cheque_details->save();
299
                }
300
301
                // On member transfer update enquiry Status
302
                if ($request->has('transfer_id')) 
303
                {
304
                    $enquiry=Enquiry::findOrFail($request->transfer_id);
305
                    $enquiry->status = \constEnquiryStatus::Member;
306
                    $enquiry->updatedBy()->associate(Auth::user());
307
                    $enquiry->save();
308
                }
309
310
                //Updating Numbering Counters
311
                Setting::where('key', '=','invoice_last_number')->update(['value' => $request->invoiceCounter]);
312
                Setting::where('key', '=','member_last_number')->update(['value' => $request->memberCounter]);
313
                $sender_id = \Utilities::getSetting('sms_sender_id');
314
                $gym_name = \Utilities::getSetting('gym_name');
315
316
                //SMS Trigger
317
                if ($invoice->status == \constPaymentStatus::Paid) 
318
                {
319
                  $sms_trigger = Sms_trigger::where('alias','=','member_admission_with_paid_invoice')->first();
320
                  $message = $sms_trigger->message;
321
                  $sms_text = sprintf($message,$member->name,$gym_name,$payment_details->payment_amount,$invoice->invoice_number);
322
                  $sms_status = $sms_trigger->status;
323
324
                  \Utilities::Sms($sender_id,$member->contact,$sms_text,$sms_status);
325
                } 
326
                elseif($invoice->status == \constPaymentStatus::Partial)
327
                {
328
                  $sms_trigger = Sms_trigger::where('alias','=','member_admission_with_partial_invoice')->first();
329
                  $message = $sms_trigger->message;
330
                  $sms_text = sprintf($message,$member->name,$gym_name,$payment_details->payment_amount,$invoice->invoice_number,$invoice->pending_amount);
331
                  $sms_status = $sms_trigger->status;
332
333
                  \Utilities::Sms($sender_id,$member->contact,$sms_text,$sms_status);
334
                }
335
                elseif($invoice->status == \constPaymentStatus::Unpaid)
336
                {
337
                  if($request->mode == 0)
338
                  {
339
                    $sms_trigger = Sms_trigger::where('alias','=','payment_with_cheque')->first();
340
                    $message = $sms_trigger->message;
341
                    $sms_text = sprintf($message,$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...
342
                    $sms_status = $sms_trigger->status;
343
344
                    \Utilities::Sms($sender_id,$member->contact,$sms_text,$sms_status);
345
                  }
346
                  else
347
                  {
348
                    $sms_trigger = Sms_trigger::where('alias','=','member_admission_with_unpaid_invoice')->first();
349
                    $message = $sms_trigger->message;
350
                    $sms_text = sprintf($message,$member->name,$gym_name,$invoice->pending_amount,$invoice->invoice_number);
351
                    $sms_status = $sms_trigger->status;
352
353
                    \Utilities::Sms($sender_id,$member->contact,$sms_text,$sms_status);
354
                  }
355
                  
356
                }
357
358
                if($subscription->start_date < $member->created_at)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $subscription seems to be defined by a foreach iteration on line 250. Are you sure the iterator is never empty, otherwise this variable is not defined?
Loading history...
359
                {
360
                  $member->created_at = $subscription->start_date;
361
                  $member->updated_at = $subscription->start_date;
362
                  $member->save(); 
363
364
                  $invoice->created_at = $subscription->start_date;
365
                  $invoice->updated_at = $subscription->start_date;
366
                  $invoice->save();
367
368
                  foreach($invoice->invoice_details as $invoice_detail)
0 ignored issues
show
Bug introduced by
The property invoice_details does not exist on App\Invoice. Did you mean Invoice_details?
Loading history...
369
                  {
370
                    $invoice_detail->created_at = $subscription->start_date;
371
                    $invoice_detail->updated_at = $subscription->start_date;
372
                    $invoice_detail->save();
373
                  }
374
                  
375
                  $payment_details->created_at = $subscription->start_date;
376
                  $payment_details->updated_at = $subscription->start_date;
377
                  $payment_details->save();
378
379
                  $subscription->created_at = $subscription->start_date;
380
                  $subscription->updated_at = $subscription->start_date;
381
                  $subscription->save();
382
                }                
383
384
                DB::commit();    
385
                flash()->success('Member was successfully created');                         
386
                return redirect (action('MembersController@show', ['id' => $member->id]));
0 ignored issues
show
Bug Best Practice introduced by
The expression return redirect(action('...('id' => $member->id))) returns the type Illuminate\Http\Redirect...nate\Routing\Redirector which is incompatible with the documented return type App\Http\Controllers\Response.
Loading history...
387
            } 
388
            catch (\Exception $e) 
389
            {
390
                DB::rollback();
391
                flash()->error('Error while creating the member');
392
                return redirect (action('MembersController@index'));
0 ignored issues
show
Bug Best Practice introduced by
The expression return redirect(action('...bersController@index')) returns the type Illuminate\Http\Redirect...nate\Routing\Redirector which is incompatible with the documented return type App\Http\Controllers\Response.
Loading history...
393
            }
394
    }//End of new Member
395
        
396
397
    // End of store method
398
399
400
    /**
401
     * Edit a created resource in storage.
402
     *
403
     * @return Response
404
     */
405
406
    public function edit($id)
407
    {
408
        $member=Member::findOrFail($id);
409
        $member_number_mode = \Utilities::getSetting('member_number_mode');
410
        $member_code = $member->member_code;
411
412
        return view('members.edit', compact('member','member_number_mode','member_code'));
0 ignored issues
show
Bug Best Practice introduced by
The expression return view('members.edi..._mode', 'member_code')) returns the type Illuminate\View\View which is incompatible with the documented return type App\Http\Controllers\Response.
Loading history...
413
    }
414
415
    /**
416
     * Update an edited resource in storage.
417
     *
418
     * @return Response
419
     */
420
421
    public function update($id, Request $request)
422
    {
423
        //dd($request->all());
424
        $member=Member::findOrFail($id);
425
        $member->update($request->all());        
426
427
        if($request->hasFile('photo'))
428
        {
429
          $member->clearMediaCollection('profile');
430
          $member->addMedia($request->file('photo'))->usingFileName('profile_'.$member->id.$request->photo->getClientOriginalExtension())->toCollection('profile');
431
        }
432
433
        if($request->hasFile('proof_photo'))
434
        {
435
          $member->clearMediaCollection('proof');
436
          $member->addMedia($request->file('proof_photo'))->usingFileName('proof_'.$member->id.$request->proof_photo->getClientOriginalExtension())->toCollection('proof');
437
        }        
438
439
        $member->updatedBy()->associate(Auth::user());
440
        $member->save();
441
442
        flash()->success('Member details were successfully updated');
443
444
        return redirect (action('MembersController@show', ['id' => $member->id]));
0 ignored issues
show
Bug Best Practice introduced by
The expression return redirect(action('...('id' => $member->id))) returns the type Illuminate\Http\Redirect...nate\Routing\Redirector which is incompatible with the documented return type App\Http\Controllers\Response.
Loading history...
445
    }
446
447
    /**
448
     * Archive a resource in storage.
449
     *
450
     * @return Response
451
     */
452
453
    public function archive($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

453
    public function archive($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...
454
    {
455
        Subscription::where('member_id',$id)->delete();
456
457
        $invoices = Invoice::where('member_id',$id)->get();
458
459
        foreach($invoices as $invoice)
460
        {
461
          Invoice_detail::where('invoice_id',$invoice->id)->delete();
462
          $payment_details = Payment_detail::where('invoice_id',$invoice->id)->get();
463
464
          foreach($payment_details as $payment_detail)
465
          {
466
            Cheque_detail::where('payment_id',$payment_detail->id)->delete();
467
            $payment_detail->delete();
468
          }
469
          
470
          $invoice->delete();
471
        }
472
473
        $member = Member::findOrFail($id);
474
        $member->clearMediaCollection('profile');
475
        $member->clearMediaCollection('proof');
476
477
        $member->delete();
478
        return back();
0 ignored issues
show
Bug Best Practice introduced by
The expression return back() returns the type Illuminate\Http\RedirectResponse which is incompatible with the documented return type App\Http\Controllers\Response.
Loading history...
479
    }
480
481
    public function transfer($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

481
    public function transfer($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...
482
    {
483
        // For Tax calculation
484
        JavaScript::put([
485
            'taxes' => \Utilities::getSetting('taxes'),
486
            'gymieToday' => Carbon::today()->format('Y-m-d'),
487
            'servicesCount' => Service::count(),
488
        ]);
489
490
        //Get Numbering mode
491
        $invoice_number_mode = \Utilities::getSetting('invoice_number_mode');
492
        $member_number_mode = \Utilities::getSetting('member_number_mode');
493
494
        //Generating Invoice number
495
        if ($invoice_number_mode == \constNumberingMode::Auto ) {
496
            $invoiceCounter = \Utilities::getSetting('invoice_last_number') + 1;
497
            $invoicePrefix = \Utilities::getSetting('invoice_prefix');
498
            $invoice_number = $invoicePrefix.$invoiceCounter;
499
        }
500
501
        else {
502
            $invoice_number = '';
503
            $invoiceCounter = '';
504
        }
505
506
        //Generating Member Counter
507
        if ($member_number_mode == \constNumberingMode::Auto ) {
508
            $memberCounter = \Utilities::getSetting('member_last_number') + 1;
509
            $memberPrefix = \Utilities::getSetting('member_prefix');
510
            $member_code = $memberPrefix.$memberCounter;
511
        }
512
513
        else {
514
            $member_code = '';
515
            $memberCounter = '';
516
        }
517
518
        $enquiry = Enquiry::findOrFail($id);
519
520
        return view('members.transfer',compact('enquiry','invoice_number','invoiceCounter','member_code','memberCounter','member_number_mode','invoice_number_mode'));
521
    }
522
    
523
}