CORE-POS/IS4C

View on GitHub
fannie/modules/plugins2.0/PIKiller/PISignaturePage.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/*******************************************************************************

    Copyright 2014 Whole Foods Co-op

    This file is part of IT CORE.

    IT CORE is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    IT CORE is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    in the file license.txt along with IT CORE; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*********************************************************************************/

use COREPOS\Fannie\API\data\pipes\OutgoingEmail;

include(dirname(__FILE__).'/../../../config.php');
if (!class_exists('FannieAPI')) {
    include(__DIR__ . '/../../../classlib2.0/FannieAPI.php');
}
if (!class_exists('SubAgreement')) {
    include(__DIR__ . '/sub/SubAgreement.php');
}

class PISignaturePage extends FannieRESTfulPage 
{
    protected $header = 'Sign Subscription Agreement';
    protected $title = 'Sign Subscription Agreement';

    public function preprocess()
    {
        $this->addRoute('get<done>');
        return parent::preprocess();
    }

    protected function get_done_view()
    {
        return '<div class="alert alert-success">Thank You</div>'
            . $this->get_view();
    }

    protected function post_id_handler()
    {
        $png = $this->padToPng($this->form->sig);
        $this->shrinkFile($png);
        $mem = \COREPOS\Fannie\API\member\MemberREST::get($this->id);

        $mem['signature'] = $png;
        list($balance, $start) = $this->stockLookup();
        $mem['stock'] = $this->stockJSON($balance);
        $mem['date'] = $start;
        $pdf = new SubAgreement();
        $pdf->AliasNbPages();
        $pdf->AddPage();;
        $pdf->AutoFill($mem);
        $out = $pdf->Output($this->outputFile(), 'F');
        $this->emailAgreement($mem, file_get_contents($this->outputFile()));
        unlink($png);

        return '?done=1';
    }

    private function emailAgreement($mem, $pdf)
    {
        $primary = \COREPOS\Fannie\API\Member\MemberREST::getPrimary($mem);
        if (filter_var($primary[0]['email'], FILTER_VALIDATE_EMAIL)) {
            $mail = OutgoingEmail::get();
            $mail->From = 'info@wholefoods.coop';
            $mail->FromName = 'Whole Foods Co-op';
            $mail->AddAddress($primary[0]['email']);
            $mail->Subject = 'Subscription Agreement';
            $mail->Body = 'A copy of your subscription agreement is attached.';
            $mail->AddStringAttachment($pdf, 'wfc.pdf', 'base64', 'application/pdf');
            $mail->Send();
        }
    }

    private function outputFile()
    {
        $dir = __DIR__ . '/noauto/docfile/' . $this->id . '/';
        if (!is_dir($dir)) {
            mkdir($dir);
        }

        return $dir . 'Generated Sub Agreement ' . $this->id . '.pdf';
    }

    private function stockLookup()
    {
        $equity = new EquityLiveBalanceModel($this->connection);
        $equity->whichDB($this->config->get('TRANS_DB'));
        $equity->memnum($this->id);
        if ($equity->load()) {
            return array($equity->payments(), $equity->startdate());
        } else {
            return array(0, date('Y-m-d'));
        }
    }

    private function stockJSON($balance)
    {
        $ret = array(
            'paid-in-full' => false,
            'total' => $balance,
            'a' => 0,
            'b' => 0,
        );
        if ($balance >= 100) {
            $ret['paid-in-full'] = true;
            $ret['a'] = 20;
            $ret['b'] = $balance-20;
        } elseif ($balance >= 20) {
            $ret['a'] = 20;
            $ret['b'] = $balance-20;
        } else {
            $ret['a'] = $balance;
        }

        return $ret;
    }

    private function shrinkFile($file)
    {
        $cmd = escapeshellcmd('convert')
            . ' -trim ' 
            . escapeshellarg($file)
            . ' ' 
            . escapeshellarg($file);
        exec($cmd, $output);

        return $output;
    }

    private function padToPng($data)
    {
        $pieces = explode(',', $data);
        $decoded = base64_decode($pieces[1]);
        $filename = tempnam(sys_get_temp_dir(), 'sub');
        file_put_contents($filename, $decoded);

        return $filename;
    }

    protected function get_id_view()
    {
        $this->addScript('../../../src/javascript/signature_pad-1.5.0/signature_pad.js');
        $this->addScript('sig.js');
        $mem = \COREPOS\Fannie\API\member\MemberREST::get($this->id);
        $primary = \COREPOS\Fannie\API\Member\MemberREST::getPrimary($mem);
        if ($mem === false) {
            return '<div class="alert alert-danger">Owner not found</div>' . $this->get_view();
        }
        $ret = '<form method="post" id="sign-form">
            <p>
                <label>Owner</label>
                <input type="hidden" name="id" value="' . $this->id . '" />
                ' . $mem['cardNo'] . ' ' . $primary[0]['firstName'] . ' ' . $primary[0]['lastName'] . '
            </p>
            <p id="sign-p">
                <label>Sign Here</label>
                <canvas id="sign-canvas" 
                    style="width:100%;height:200px;border-radius:4px;border-style:solid;border-color:black;border-width:1px;">
                </canvas>
            </p>
            <p class="clearfix">
                <button type="button" class="btn btn-default btn-lg pull-left" id="btn-clear">Clear</button>
                <button type="button" class="btn btn-default btn-lg pull-right" id="btn-accept">Accept</button>
            </p>
            </form>';
        return $ret;
    }

    protected function get_view()
    {
        $p = new SubAgreement();
        $this->addOnloadCommand("\$('input[name=id]').focus();\n");
        return '<form method="get">
            <div class="form-group">
                <label>Owner#</label>
                <input type="number" class="form-control" name="id" />
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-default">Enter</button>
            </div>
            </form>';
    }
}

FannieDispatch::conditionalExec();