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

MembersController::drpPlaceholder()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 3
nc 2
nop 1
1
<?php
2
3
namespace App\Http\Controllers;
4
5
use DB;
6
use Auth;
7
use App\Member;
8
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...
9
use App\Enquiry;
10
use App\Invoice;
11
use App\Service;
12
use App\Setting;
13
use Carbon\Carbon;
14
use App\SmsTrigger;
15
use App\ChequeDetail;
16
use App\Subscription;
17
use App\InvoiceDetail;
18
use App\PaymentDetail;
19
use Illuminate\Http\Request;
20
21
class MembersController extends Controller
22
{
23
    public function __construct()
24
    {
25
        $this->middleware('auth');
26
    }
27
28
    /**
29
     * Display a listing of the resource.
30
     *
31
     * @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...
32
     */
33
    public function index(Request $request)
34
    {
35
        $members = Member::indexQuery($request->sort_field, $request->sort_direction, $request->drp_start, $request->drp_end)->search('"'.$request->input('search').'"')->paginate(10);
36
        $count = $members->total();
37
38
        $drp_placeholder = $this->drpPlaceholder($request);
39
40
        $request->flash();
41
42
        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...
43
    }
44
45
    public function active(Request $request)
46
    {
47
        $members = Member::active($request->sort_field, $request->sort_direction, $request->drp_start, $request->drp_end)->search('"'.$request->input('search').'"')->paginate(10);
48
        $count = $members->total();
49
50
        $drp_placeholder = $this->drpPlaceholder($request);
51
52
        $request->flash();
53
54
        return view('members.active', compact('members', 'count', 'drp_placeholder', 'old_sort'));
55
    }
56
57
    public function inactive(Request $request)
58
    {
59
        $members = Member::inactive($request->sort_field, $request->sort_direction, $request->drp_start, $request->drp_end)->search('"'.$request->input('search').'"')->paginate(10);
60
        $count = $members->total();
61
62
        $drp_placeholder = $this->drpPlaceholder($request);
63
64
        $request->flash();
65
66
        return view('members.inactive', compact('members', 'count', 'drp_placeholder', 'old_sort'));
67
    }
68
69
    /**
70
     * Display the specified resource.
71
     *
72
     * @param  int  $id
73
     * @return Response
74
     */
75
    public function show($id)
76
    {
77
        $member = Member::findOrFail($id);
78
79
        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...
80
    }
81
82
    /**
83
     * Show the form for creating a new resource.
84
     *
85
     * @return Response
86
     */
87
    public function create()
88
    {
89
        // For Tax calculation
90
        JavaScript::put([
91
            'taxes' => \Utilities::getSetting('taxes'),
92
            'gymieToday' => Carbon::today()->format('Y-m-d'),
93
            'servicesCount' => Service::count(),
94
        ]);
95
96
        //Get Numbering mode
97
        $invoice_number_mode = \Utilities::getSetting('invoice_number_mode');
98
        $member_number_mode = \Utilities::getSetting('member_number_mode');
99
100
        //Generating Invoice number
101
        if ($invoice_number_mode == \constNumberingMode::Auto) {
102
            $invoiceCounter = \Utilities::getSetting('invoice_last_number') + 1;
103
            $invoicePrefix = \Utilities::getSetting('invoice_prefix');
104
            $invoice_number = $invoicePrefix.$invoiceCounter;
105
        } else {
106
            $invoice_number = '';
107
            $invoiceCounter = '';
108
        }
109
110
        //Generating Member Counter
111
        if ($member_number_mode == \constNumberingMode::Auto) {
112
            $memberCounter = \Utilities::getSetting('member_last_number') + 1;
113
            $memberPrefix = \Utilities::getSetting('member_prefix');
114
            $member_code = $memberPrefix.$memberCounter;
115
        } else {
116
            $member_code = '';
117
            $memberCounter = '';
118
        }
119
120
        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...
121
    }
122
123
    /**
124
     * Store a newly created resource in storage.
125
     *
126
     * @return Response
127
     */
128
    public function store(Request $request)
129
    {
130
        // Member Model Validation
131
        $this->validate($request, ['email' => 'unique:mst_members,email',
132
                                   'contact' => 'unique:mst_members,contact',
133
                                   'member_code' => 'unique:mst_members,member_code', ]);
134
135
        // Start Transaction
136
        DB::beginTransaction();
137
138
        try {
139
            // Store member's personal details
140
            $memberData = ['name'=>$request->name,
141
                                    'DOB'=> $request->DOB,
142
                                    'gender'=> $request->gender,
143
                                    'contact'=> $request->contact,
144
                                    'emergency_contact'=> $request->emergency_contact,
145
                                    'health_issues'=> $request->health_issues,
146
                                    'email'=> $request->email,
147
                                    'address'=> $request->address,
148
                                    'member_id'=> $request->member_id,
149
                                    'proof_name'=> $request->proof_name,
150
                                    'member_code'=> $request->member_code,
151
                                    'status'=> $request->status,
152
                                    'pin_code'=> $request->pin_code,
153
                                    'occupation'=> $request->occupation,
154
                                    'aim'=> $request->aim,
155
                                    'source'=> $request->source, ];
156
157
            $member = new Member($memberData);
158
            $member->createdBy()->associate(Auth::user());
159
            $member->updatedBy()->associate(Auth::user());
160
            $member->save();
161
162
            // Adding media i.e. Profile & proof photo
163
            if ($request->hasFile('photo')) {
164
                $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

164
                $member->addMedia(/** @scrutinizer ignore-type */ $request->file('photo'))->usingFileName('profile_'.$member->id.'.'.$request->photo->getClientOriginalExtension())->toCollection('profile');
Loading history...
165
            }
166
167
            if ($request->hasFile('proof_photo')) {
168
                $member->addMedia($request->file('proof_photo'))->usingFileName('proof_'.$member->id.'.'.$request->proof_photo->getClientOriginalExtension())->toCollection('proof');
169
            }
170
171
            // Helper function for calculating payment status
172
            $invoice_total = $request->admission_amount + $request->subscription_amount + $request->taxes_amount - $request->discount_amount;
173
            $paymentStatus = \constPaymentStatus::Unpaid;
174
            $pending = $invoice_total - $request->payment_amount;
175
176
            if ($request->mode == 1) {
177
                if ($request->payment_amount == $invoice_total) {
178
                    $paymentStatus = \constPaymentStatus::Paid;
179
                } elseif ($request->payment_amount > 0 && $request->payment_amount < $invoice_total) {
180
                    $paymentStatus = \constPaymentStatus::Partial;
181
                } elseif ($request->payment_amount == 0) {
182
                    $paymentStatus = \constPaymentStatus::Unpaid;
183
                } else {
184
                    $paymentStatus = \constPaymentStatus::Overpaid;
185
                }
186
            }
187
188
            // Storing Invoice
189
            $invoiceData = ['invoice_number'=> $request->invoice_number,
190
                                     'member_id'=> $member->id,
191
                                     'total'=> $invoice_total,
192
                                     'status'=> $paymentStatus,
193
                                     'pending_amount'=> $pending,
194
                                     'discount_amount'=> $request->discount_amount,
195
                                     'discount_percent'=> $request->discount_percent,
196
                                     'discount_note'=> $request->discount_note,
197
                                     'tax'=> $request->taxes_amount,
198
                                     'additional_fees'=> $request->additional_fees,
199
                                     'note'=>' ', ];
200
201
            $invoice = new Invoice($invoiceData);
202
            $invoice->createdBy()->associate(Auth::user());
203
            $invoice->updatedBy()->associate(Auth::user());
204
            $invoice->save();
205
206
            // Storing subscription
207
            foreach ($request->plan as $plan) {
208
                $subscriptionData = ['member_id'=> $member->id,
209
                                            'invoice_id'=> $invoice->id,
210
                                            'plan_id'=> $plan['id'],
211
                                            'start_date'=> $plan['start_date'],
212
                                            'end_date'=> $plan['end_date'],
213
                                            'status'=> \constSubscription::onGoing,
214
                                            'is_renewal'=>'0', ];
215
216
                $subscription = new Subscription($subscriptionData);
217
                $subscription->createdBy()->associate(Auth::user());
218
                $subscription->updatedBy()->associate(Auth::user());
219
                $subscription->save();
220
221
                //Adding subscription to invoice(Invoice Details)
222
                $detailsData = ['invoice_id'=> $invoice->id,
223
                                       'plan_id'=> $plan['id'],
224
                                       'item_amount'=> $plan['price'], ];
225
226
                $invoiceDetails = new InvoiceDetail($detailsData);
227
                $invoiceDetails->createdBy()->associate(Auth::user());
228
                $invoiceDetails->updatedBy()->associate(Auth::user());
229
                $invoiceDetails->save();
230
            }
231
232
            // Store Payment Details
233
            $paymentData = ['invoice_id'=> $invoice->id,
234
                                     'payment_amount'=> $request->payment_amount,
235
                                     'mode'=> $request->mode,
236
                                     'note'=> ' ', ];
237
238
            $paymentDetails = new PaymentDetail($paymentData);
239
            $paymentDetails->createdBy()->associate(Auth::user());
240
            $paymentDetails->updatedBy()->associate(Auth::user());
241
            $paymentDetails->save();
242
243
            if ($request->mode == 0) {
244
                // Store Cheque Details
245
                $chequeData = ['payment_id'=> $paymentDetails->id,
246
                                      'number'=> $request->number,
247
                                      'date'=> $request->date,
248
                                      'status'=> \constChequeStatus::Recieved, ];
249
250
                $cheque_details = new ChequeDetail($chequeData);
251
                $cheque_details->createdBy()->associate(Auth::user());
252
                $cheque_details->updatedBy()->associate(Auth::user());
253
                $cheque_details->save();
254
            }
255
256
            // On member transfer update enquiry Status
257
            if ($request->has('transfer_id')) {
258
                $enquiry = Enquiry::findOrFail($request->transfer_id);
259
                $enquiry->status = \constEnquiryStatus::Member;
260
                $enquiry->updatedBy()->associate(Auth::user());
261
                $enquiry->save();
262
            }
263
264
            //Updating Numbering Counters
265
            Setting::where('key', '=', 'invoice_last_number')->update(['value' => $request->invoiceCounter]);
266
            Setting::where('key', '=', 'member_last_number')->update(['value' => $request->memberCounter]);
267
            $sender_id = \Utilities::getSetting('sms_sender_id');
268
            $gym_name = \Utilities::getSetting('gym_name');
269
270
            //SMS Trigger
271
            if ($invoice->status == \constPaymentStatus::Paid) {
272
                $sms_trigger = SmsTrigger::where('alias', '=', 'member_admission_with_paid_invoice')->first();
273
                $message = $sms_trigger->message;
274
                $sms_text = sprintf($message, $member->name, $gym_name, $paymentDetails->payment_amount, $invoice->invoice_number);
275
                $sms_status = $sms_trigger->status;
276
277
                \Utilities::Sms($sender_id, $member->contact, $sms_text, $sms_status);
278
            } elseif ($invoice->status == \constPaymentStatus::Partial) {
279
                $sms_trigger = SmsTrigger::where('alias', '=', 'member_admission_with_partial_invoice')->first();
280
                $message = $sms_trigger->message;
281
                $sms_text = sprintf($message, $member->name, $gym_name, $paymentDetails->payment_amount, $invoice->invoice_number, $invoice->pending_amount);
282
                $sms_status = $sms_trigger->status;
283
284
                \Utilities::Sms($sender_id, $member->contact, $sms_text, $sms_status);
285
            } elseif ($invoice->status == \constPaymentStatus::Unpaid) {
286
                if ($request->mode == 0) {
287
                    $sms_trigger = SmsTrigger::where('alias', '=', 'payment_with_cheque')->first();
288
                    $message = $sms_trigger->message;
289
                    $sms_text = sprintf($message, $member->name, $paymentDetails->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...
290
                    $sms_status = $sms_trigger->status;
291
292
                    \Utilities::Sms($sender_id, $member->contact, $sms_text, $sms_status);
293
                } else {
294
                    $sms_trigger = SmsTrigger::where('alias', '=', 'member_admission_with_unpaid_invoice')->first();
295
                    $message = $sms_trigger->message;
296
                    $sms_text = sprintf($message, $member->name, $gym_name, $invoice->pending_amount, $invoice->invoice_number);
297
                    $sms_status = $sms_trigger->status;
298
299
                    \Utilities::Sms($sender_id, $member->contact, $sms_text, $sms_status);
300
                }
301
            }
302
303
            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 207. Are you sure the iterator is never empty, otherwise this variable is not defined?
Loading history...
304
                $member->created_at = $subscription->start_date;
305
                $member->updated_at = $subscription->start_date;
306
                $member->save();
307
308
                $invoice->created_at = $subscription->start_date;
309
                $invoice->updated_at = $subscription->start_date;
310
                $invoice->save();
311
312
                foreach ($invoice->invoiceDetails as $invoiceDetail) {
313
                    $invoiceDetail->created_at = $subscription->start_date;
314
                    $invoiceDetail->updated_at = $subscription->start_date;
315
                    $invoiceDetail->save();
316
                }
317
318
                $paymentDetails->created_at = $subscription->start_date;
319
                $paymentDetails->updated_at = $subscription->start_date;
320
                $paymentDetails->save();
321
322
                $subscription->created_at = $subscription->start_date;
323
                $subscription->updated_at = $subscription->start_date;
324
                $subscription->save();
325
            }
326
327
            DB::commit();
328
            flash()->success('Member was successfully created');
329
330
            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...
331
        } catch (\Exception $e) {
332
            DB::rollback();
333
            flash()->error('Error while creating the member');
334
335
            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...
336
        }
337
    }
338
339
    //End of new Member
340
341
    // End of store method
342
343
    /**
344
     * Edit a created resource in storage.
345
     *
346
     * @return Response
347
     */
348
    public function edit($id)
349
    {
350
        $member = Member::findOrFail($id);
351
        $member_number_mode = \Utilities::getSetting('member_number_mode');
352
        $member_code = $member->member_code;
353
354
        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...
355
    }
356
357
    /**
358
     * Update an edited resource in storage.
359
     *
360
     * @return Response
361
     */
362
    public function update($id, Request $request)
363
    {
364
        $member = Member::findOrFail($id);
365
        $member->update($request->all());
366
367
        if ($request->hasFile('photo')) {
368
            $member->clearMediaCollection('profile');
369
            $member->addMedia($request->file('photo'))->usingFileName('profile_'.$member->id.'.'.$request->photo->getClientOriginalExtension())->toCollection('profile');
370
        }
371
372
        if ($request->hasFile('proof_photo')) {
373
            $member->clearMediaCollection('proof');
374
            $member->addMedia($request->file('proof_photo'))->usingFileName('proof_'.$member->id.'.'.$request->proof_photo->getClientOriginalExtension())->toCollection('proof');
375
        }
376
377
        $member->updatedBy()->associate(Auth::user());
378
        $member->save();
379
380
        flash()->success('Member details were successfully updated');
381
382
        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...
383
    }
384
385
    /**
386
     * Archive a resource in storage.
387
     *
388
     * @return Response
389
     */
390
    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

390
    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...
391
    {
392
        Subscription::where('member_id', $id)->delete();
393
394
        $invoices = Invoice::where('member_id', $id)->get();
395
396
        foreach ($invoices as $invoice) {
397
            InvoiceDetail::where('invoice_id', $invoice->id)->delete();
398
            $paymentDetails = PaymentDetail::where('invoice_id', $invoice->id)->get();
399
400
            foreach ($paymentDetails as $paymentDetail) {
401
                ChequeDetail::where('payment_id', $paymentDetail->id)->delete();
402
                $paymentDetail->delete();
403
            }
404
405
            $invoice->delete();
406
        }
407
408
        $member = Member::findOrFail($id);
409
        $member->clearMediaCollection('profile');
410
        $member->clearMediaCollection('proof');
411
412
        $member->delete();
413
414
        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...
415
    }
416
417
    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

417
    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...
418
    {
419
        // For Tax calculation
420
        JavaScript::put([
421
            'taxes' => \Utilities::getSetting('taxes'),
422
            'gymieToday' => Carbon::today()->format('Y-m-d'),
423
            'servicesCount' => Service::count(),
424
        ]);
425
426
        //Get Numbering mode
427
        $invoice_number_mode = \Utilities::getSetting('invoice_number_mode');
428
        $member_number_mode = \Utilities::getSetting('member_number_mode');
429
430
        //Generating Invoice number
431
        if ($invoice_number_mode == \constNumberingMode::Auto) {
432
            $invoiceCounter = \Utilities::getSetting('invoice_last_number') + 1;
433
            $invoicePrefix = \Utilities::getSetting('invoice_prefix');
434
            $invoice_number = $invoicePrefix.$invoiceCounter;
435
        } else {
436
            $invoice_number = '';
437
            $invoiceCounter = '';
438
        }
439
440
        //Generating Member Counter
441
        if ($member_number_mode == \constNumberingMode::Auto) {
442
            $memberCounter = \Utilities::getSetting('member_last_number') + 1;
443
            $memberPrefix = \Utilities::getSetting('member_prefix');
444
            $member_code = $memberPrefix.$memberCounter;
445
        } else {
446
            $member_code = '';
447
            $memberCounter = '';
448
        }
449
450
        $enquiry = Enquiry::findOrFail($id);
451
452
        return view('members.transfer', compact('enquiry', 'invoice_number', 'invoiceCounter', 'member_code', 'memberCounter', 'member_number_mode', 'invoice_number_mode'));
453
    }
454
455
    /**
456
     * @param \Illuminate\Http\Request $request
457
     * @return string
458
     */
459
    private function drpPlaceholder(Request $request)
460
    {
461
        if ($request->has('drp_start') and $request->has('drp_end')) {
462
            return $request->drp_start.' - '.$request->drp_end;
463
        }
464
465
        return 'Select daterange filter';
466
    }
467
}
468