ArthurGuy/BBMembershipSystem

View on GitHub
app/Http/Controllers/StatementImportController.php

Summary

Maintainability
D
1 day
Test Coverage
<?php namespace BB\Http\Controllers;

use BB\Entities\Payment;
use BB\Entities\User;
use BB\Repo\SubscriptionChargeRepository;
use SpreadsheetReader;

class StatementImportController extends Controller
{
    /**
     * @var SubscriptionChargeRepository
     */
    private $subscriptionChargeRepository;

    public function __construct(SubscriptionChargeRepository $subscriptionChargeRepository)
    {
        $this->subscriptionChargeRepository = $subscriptionChargeRepository;
    }


    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        return \View::make('statement-import.create');
    }


    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store()
    {

        $spreadsheetPath = \Input::file('statement')->getRealPath();
        $testProcess = \Request::get('test');
        if ($testProcess) {
            $testProcess = true;
            echo "Test Mode - no payment records are being created<br /><br />";
        } else {
            $testProcess = false;
            echo "Live Mode - Payments have been created<br /><br />";
        }

        $reader = new SpreadsheetReader($spreadsheetPath);
        $reader->ChangeSheet(0);


        $stringMatchUsers = User::active()->where('import_match_string', '!=', '')->get();
        $users = User::active()->get();


        echo '<br />' . PHP_EOL;
        echo '<table width="100%">';
        foreach ($reader as $i=>$row) {
            echo "<tr>";
            $subPayment = false;
            $balancePayment = false;
            $paymentReference = null;
            //print_r($row);

            //If the payment isn't a credit then we don't care about it
            //if (($row[1] != 'CR') && ($row[1]) != 'BP')
            if ($row[1] != 'CR') {
                continue;
            }

            if (strpos(strtoupper($row[2]), 'GC C1 BUILDBRIGHTO') !== false) {
                continue;
            }

            if (strpos(strtoupper($row[2]), 'STRIPE TRANSFER') !== false) {
                continue;
            }

            if (strpos(strtoupper($row[2]), 'EVENTBRITE') !== false) {
                continue;
            }

            $date = new \Carbon\Carbon($row[0]);
            echo "<td>" . $date->format('d/m/y') . '</td>';

            //echo "<td>".$row[1].'</td>';

            if (strpos(strtoupper($row[2]), 'SUB') !== false) {
                $subPayment = true;
            } elseif (strpos($row[2], 'MEMBERSHIP') !== false) {
                $subPayment = true;
            } elseif (strpos($row[2], '-BALANCE-') !== false) {
                $balancePayment = true;
                $descriptionParts = explode('-BALANCE-', $row[2]);
                if (is_array($descriptionParts) && count($descriptionParts) > 1) {
                    $paymentReference = strtolower($descriptionParts[1]);
                }
            }

            if ($subPayment) {
                echo '<td>SUB</td>';
                $reasonString = 'subscription';
            } elseif ($balancePayment) {
                echo '<td>Balance</td>';
                $reasonString = 'balance';
            } else {
                echo '<td></td>';
                $reasonString = 'unknown';
            }

            $matchedUser = false;
            $paymentDescription = strtolower($row[2]);

            //Try matching against specific match strings first
            foreach ($stringMatchUsers as $user) {
                if (strpos($paymentDescription, strtolower($user->import_match_string)) !== false) {
                    $matchedUser = $user;
                    break;
                }
            }

            //If there was no match do a general surname match
            if ( ! $matchedUser) {
                foreach ($users as $user) {
                    if (strpos($paymentDescription, strtolower($user->family_name)) !== false) {
                        $matchedUser = $user;
                        break;
                    }
                }
            }
            if ($matchedUser) {
                echo '<td>' . $matchedUser->name . '</td>';
                if ($subPayment) {
                    $subCharge = $this->subscriptionChargeRepository->findCharge($matchedUser->id, $date);
                    if ($subCharge) {
                        echo '<td>Subscription Payment</td>';
                    } else {
                        echo '<td style="background-color: #ff8c14;">Unknown: Recording as balance top up</td>';
                        $subPayment = false;
                        $reasonString = 'balance';
                    }
                }
            } else {
                echo '<td style="background-color: #F00;">Unknown</td><td></td>';
            }

            echo '<td>' . $row[2] . '</td>';

            //echo '<td>'.$row[3].'</td>';

            echo '<td>' . $row[4] . '</td>';

            echo "</tr>";

            if ( ! $testProcess && $matchedUser) {
                if ($subPayment) {
                    if (isset($subCharge) && $subCharge) {
                        $paymentReference = $subCharge->id;
                        $this->subscriptionChargeRepository->markChargeAsPaid($subCharge->id, $date, $row[4]);
                    }
                }

                Payment::create([
                    'created_at' => $date,
                    'reason' => $reasonString,
                    'source' => 'standing-order',
                    'user_id' => $matchedUser->id,
                    'amount' => $row[4],
                    'fee' => 0,
                    'amount_minus_fee' => $row[4],
                    'status' => 'paid',
                    'reference' => $paymentReference
                ]);
                if ($subPayment) {
                    if ($matchedUser->payment_method == 'standing-order') {
                        $matchedUser->monthly_subscription = $row[4];
                    }

                    $matchedUser->save();
                }
            }
        }
        echo "</table>";
        exit;
    }





}