HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/vebon.komma.pro/app/KommaApp/Members/MemberService.php
<?php


namespace KommaApp\Members;

use KommaApp\Members\Member;
use KommaApp\Site\Checkout\CheckoutSession\CheckoutSession;
use KommaApp\Site\FormValidation\UpdateMemberForm;
use KommaApp\Orders\Models\Order;
use KommaApp\Site\FormValidation\MemberForm;
use KommaApp\Site\FormValidation\FullMemberForm;
use KommaApp\Site\FormValidation\LoginForm;
use KommaApp\Site\Mailers\MemberMailer;
use TijsVerkoyen\CssToInlineStyles\Exception;

class MemberService
{
    /**
     * @var FullMemberForm
     */
    private $fullMemberForm;

    /**
     * @var MemberForm
     */
    private $memberForm;

    /**
     * @var Member
     */
    private $member;

    /**
     * @var CheckoutSession
     */
    private $checkoutSession;

    /**
     * @var LoginForm
     */
    private $loginForm;

    private $memberMailer;

    /**
     * @param Member           $member
     * @param FullMemberForm   $fullMemberForm
     * @param UpdateMemberForm $updateMemberForm
     * @param MemberForm       $memberForm
     * @param LoginForm          $loginForm
     * @param CheckoutSession    $checkoutSession
     * @param MemberMailer     $memberMailer
     */
    public function __construct(
        Member $member,
        FullMemberForm $fullMemberForm,
        UpdateMemberForm $updateMemberForm,
        MemberForm $memberForm,
        LoginForm $loginForm,
        CheckoutSession $checkoutSession,
        MemberMailer $memberMailer
    )
    {
        $this->fullMemberForm = $fullMemberForm;
        $this->updateMemberForm = $updateMemberForm;
        $this->memberForm = $memberForm;
        $this->member = $member;
        $this->checkoutSession = $checkoutSession;
        $this->loginForm = $loginForm;
        $this->memberMailer = $memberMailer;
    }

    public function updateMember(array $input)
    {
        //todo: this is not the way to go, the lang should be set in the contruct
        //Translate the messages
        $this->updateMemberForm->translateMessages();


        //Not logged in  so new member
        if (!$currentMember = $this->getLoggedInMember()) return $this->storeNewMember($input);

        // Validate the form
        if (!$this->updateMemberForm->isValid($input))
            return \Redirect::back()
                ->withInput()
                ->withErrors($this->updateMemberForm->errorMessages());

        if (!$currentMember = $this->getLoggedInMember())
            throw new \Exception('Update failed: Can\'t find current user.');

        // Prepare input data for update
        $input['username'] = $input['email'];

        if ($input['company'] == '') $input['company_vat'] = '';

        $input['title'] == 'mr' ? $input['gender'] = 'male' : $input['female'] = 'male';

        if ($input['password'] == '') {
            unset($input['password']);
        } else {
            $input['password'] = \Hash::make($input['password']);
        }

        // Save the member
        $currentMember->fill($input);
        $currentMember->save();

        return \Redirect::to(\Site::getPageService()->page('member')->route);
    }

    public function storeNewMemberFromToken($orderToken, $password)
    {
        $order = Order::where('order_token', $orderToken)->first();
        $data = [
            'username' => $order->invoice_email,
            'email' => $order->invoice_email,
            'password' => $password,
            'password_confirmation' => $password,
            'gender' => $order->invoice_gender,
            'title' => $order->invoice_title,
            'first_name' => $order->invoice_first_name,
            'last_name' => $order->invoice_last_name,
            'name_insertion' => $order->invoice_name_insertion,
            'company' => $order->invoice_company,
            'company_vat' => $order->invoice_company_vat,
            'postal' => $order->invoice_postal,
            'city' => $order->invoice_city,
            'street' => $order->invoice_street,
            'house_number' => $order->invoice_house_number,
            'house_number_suffix' => $order->invoice_house_number_suffix,
            'country' => $order->invoice_country,
            'order_id' => $order->id,
        ];
        return $this->storeNewMember($data);
    }

    /**
     * @param array $input
     */
    public function storeNewMember(array $input)
    {
        $input['username'] = $input['email'];

        if (isset($input['company_vat'])) {
            $input['company_vat'] = strtoupper($input['company_vat']);
            $input['company_vat'] = preg_replace("/[^a-zA-Z0-9]/", "", $input['company_vat']);
        }

        //todo: this is not the wat to, the lang should be set in the contruct
        //Translate the messages
        $this->fullMemberForm->translateMessages();

        // Validate the form
        if (!$this->fullMemberForm->isValid($input)) {
            return \Redirect::back()
                ->withInput()
                ->withErrors($this->fullMemberForm->errorMessages());
        }

        //TODO: Als een klant registreert, niet activeert, registreert activeert, kan hij meerdere accounts de hetzelfde email hebben
        if ($currentMember = Member::where('email', $input['email'])->where('site_id', \Site::getId())->first()) {
            if ($this->member->active == 1) {

                return \Lang::get('member/create.error_user_exists');
            }
            $this->member = $currentMember;
        }

        $input['site_id'] = \Site::getId();
        $input['password'] = \Hash::make($input['password']);
        $input['title'] == 'mr' ? $input['gender'] = 'male' : $input['female'] = 'male';

        do { // Ensure that validate_token is unique
            $input['validate_token'] = str_random(32);
        } while (!$this->member->where('validate_token', $input['validate_token'])->get());

        $input['member_number'] = Member::getNewMemberNumber();


        // Create Member
        if (!$this->member
            ->fill($input)
            ->save()
        ) {
            // Todo: With error / flash message
            return \Redirect::back()
                ->withInput();
        };

        if (isset($input['order_id'])) {
            $order = Order::find($input['order_id']);
            $order->member()->associate($this->member);
            $order->save();
        }

        try {
            $this->memberMailer->sendMemberValidation($input);
        } catch (\Exception $e) {
            // Todo: With error / flash message
            return \Redirect::back();
        }

        return \View::make('members.sendValidation', ['email' => $input['email']]);
    }


    /**
     * Duplicate of store new member,
     * I don't want to change the flow a week befor live
     * Todo: fix this and make it in one function
     *
     * @param $input
     * @return mixed
     *
     */
    public function streamLinedStoreNewMember($input)
    {
        //Clean up the VAt if it is set
        if (isset($input['company_vat'])) {
            $input['company_vat'] = strtoupper($input['company_vat']);
            $input['company_vat'] = preg_replace("/[^a-zA-Z0-9]/", "", $input['company_vat']);
        }

        $input['site_id'] = \Site::getId();
        $input['password'] = \Hash::make($input['password']);

        $input['title'] == 'mr' ? $input['gender'] = 'male' : $input['female'] = 'male';

        do { // Ensure that validate_token is unique
            $input['validate_token'] = str_random(32);
        } while (!$this->member->where('validate_token', $input['validate_token'])->get());

        $input['member_number'] = Member::getNewMemberNumber();

        if (!isset($input['username'])) {
            $input['username'] = $input['member_number'];
        }

        // Create Member
        if (!$this->member
            ->fill($input)
            ->save()
        ) {

            return false;
        };
        return $this->member;
    }


    public function activateMember($token)
    {
        if ($this->member->where('validate_token', $token)->first() && $this->member->where('validate_token', $token)->first()->active == 1) {
            return \View::make('members.invalidLink');
        }
        if (!($member = $this->member->where('validate_token', $token)->first())) {
            return \View::make('members.invalidLink');
        }
        $member->active = 1;
        $member->validate_token = null;
        $member->save();
        return \View::make('members.activated');
    }

    /**
     * @param $input
     */
    public function store($input)
    {
        if (isset($input['company_vat'])) {
            $input['company_vat'] = strtoupper($input['company_vat']);
            $input['company_vat'] = preg_replace("/[^a-zA-Z0-9]/", "", $input['company_vat']);
        }

        // Validate the form
        if (!$this->memberForm->isValid($input)) {
            return \Redirect::back()
                ->withErrors($this->memberForm->errorMessages());
        }

        // Create data array
        $data = [];

        // check for unique email
        if ($currentMember = Member::where('email', $input['email'])->where('site_id', \Site::getId())->first()) {
            if ($this->member->active == 1) {
                return \Lang::get('member/create.error_user_exists');
            }
            $this->member = $currentMember;
        }

        // Get user data from the checkoutSession
        /*
        foreach($this->checkoutSession->member()->get() as $invoiceField => $value)
        {
            $dbKey = str_replace('invoice-','',$invoiceField);
            $dbKey = str_replace('-','_',$dbKey);

            $data[$dbKey] = $value;
        }
        */

        // Other data
        $data['site_id'] = \Site::getId();
        $data['username'] = $data['email'];

        $data['member_number'] = Member::getNewMemberNumber();

        // Set password
        $this->member->password = \Hash::make($input['password']);
        $this->member->remember_token = $data['remember_token'];

        // Set validation token
        do { // Ensure that validate_token is unique
            $input['validate_token'] = str_random(32);
        } while (!$this->member->where('validate_token', $input['validate_token'])->get());
        $data['validate_token'] = $this->member->validate_token = $input['validate_token'];

        // Mass assign data and save order
        if (!$this->member
            ->fill($data)
            ->save()
        ) {
            // Todo message
            // Bevestigings mail
            return \Redirect::back();
        };

        if (isset($input['order_id'])) {
            $order = Order::find(\Input::get('order_id'));
            $order->member()->associate($this->member);
            $order->save();
        }

        try {
            $this->memberMailer->sendMemberValidation($input);
        } catch (\Exception $e) {
            // Todo: With error / flash message
            return \Redirect::back();
        }

        return \View::make('members.sendValidation', ['email' => $input['email']]);
    }

    public function isLoggedIn()
    {
        return \Auth::member()->check();
    }

    public function authorizeLogin($input, $pageSlug = 'member')
    {
        // Is the form valid

        $messages = [
            'email.exists' => \Lang::get('member/login.email_exists'),
            'email.activated' => \Lang::get('member/login.email_activated'),
        ];
        $this->loginForm->setMessages($messages);
        if (!$this->loginForm->isValid($input)) {
            return \Redirect::back()
                ->withErrors($this->loginForm->errorMessages());
        }

        $input['active'] = 1;
        $input['site_id'] = \Site::getId();

        // Does the user exists
        if (!\Auth::member()->attempt($input)) {
            return \Redirect::back()
                ->withErrors(['wrongPassword' => \Lang::get('member/login.wrong_password')]);
            // Todo errors
        }

        // Redirect to checkout data
        $this->checkoutSession->member()->fillAfterLogin();
        return \Redirect::to(\Site::getPageService()->page($pageSlug)->route);
    }

    public function getLoggedInMember()
    {
        if (!$this->isLoggedIn()) {
            return null;
        }
        return \Auth::member()->get();
    }

    public function checkEmailAddress($email)
    {
        $member = $this->member
            ->where('email', $email)
            ->where('site_id', \Site::getId())
            ->where('active', 1)
            ->first();
        if ($member == null) return false;
        return true;
    }

    public function getReminderService()
    {
        return $this->reminderService;
    }

    public function getMemberByEmail($email)
    {
        $member = Member::
        where('email', '=', $email)
            ->where('site_id', '=', \Site::getId())
            ->where('active', '=', 1)
            ->first();
        return $member;
    }

    /**
     * In this Method we will activate the account based on an order token
     * We'll check if there is an member for the order and link this
     * We are going to activate this account and set token to null
     *
     * @param $orderToken
     * @param $password
     * @return array|bool
     *
     */
    public function LinkAccountFromOrder($orderToken, $password)
    {
        //Load order by Token
        if (!$order = \App::make('KommaApp\Orders\OrderService')->getOrderByToken($orderToken)) {
            //No order found, return with error message
        }
        //load member from order
        if (!$member = $order->member) {
            //No member found, this is normaly not possible todo: create member from token?
            return ['error' => 'Oops Something went wrong'];
        }

        //Set password
        $member->password = \Hash::make($password);
        //Set username, use the member email (is our default)
        $member->username = $member->email;
        //set account active
        $member->active = 1;
        //Set validate_token to null
        $member->validate_token = null;

        //save the member
        $member->save();

        return true;
    }

}