コード例 #1
0
ファイル: EquityPaymentPlan.php プロジェクト: phpsmith/IS4C
 public function showEditForm($memNum, $country = "US")
 {
     global $FANNIE_URL, $FANNIE_TRANS_DB;
     $dbc = $this->db();
     $trans = $FANNIE_TRANS_DB . $dbc->sep();
     $infoQ = $dbc->prepare_statement("SELECT payments\n                FROM {$trans}equity_live_balance\n                WHERE memnum=?");
     $infoR = $dbc->exec_statement($infoQ, array($memNum));
     $equity = 0;
     if ($dbc->num_rows($infoR) > 0) {
         $w = $dbc->fetch_row($infoR);
         $equity = $w['payments'];
     }
     $plan = new EquityPaymentPlanAccountsModel($dbc);
     $plan->cardNo($memNum);
     foreach ($plan->find() as $p) {
         $plan = $p;
         break;
     }
     $allplans = new EquityPaymentPlansModel($dbc);
     $ret = "<div class=\"panel panel-default\">\n            <div class=\"panel-heading\">Equity</div>\n            <div class=\"panel-body\">";
     $ret .= '<div class="form-group">';
     $ret .= '<span class="label primaryBackground">Stock Purchased</span> ';
     $ret .= sprintf('%.2f', $equity);
     $ret .= " <a href=\"{$FANNIE_URL}reports/Equity/index.php?memNum={$memNum}\">History</a>";
     $ret .= '</div>';
     $ret .= '<div class="form-group form-inline">';
     $ret .= '<span class="label primaryBackground">Payment Plan</span> ';
     $ret .= '<select name="payment-plan" class="form-control input-sm">
                 <option value="0">None</option>';
     $ret .= $allplans->toOptions($plan->equityPaymentPlanID());
     $ret .= '</select>
             </div>';
     $ret .= '<div class="form-group">';
     $ret .= '<span class="label primaryBackground">Last Payment</span> ';
     $ret .= sprintf('%s $%.2f', $plan->lastPaymentDate(), $plan->lastPaymentAmount());
     $ret .= '</div>';
     $ret .= '<div class="form-group">';
     $ret .= '<span class="label primaryBackground">Next Payment</span> ';
     $ret .= sprintf('%s $%.2f', $plan->nextPaymentDate(), $plan->nextPaymentAmount());
     $ret .= '</div>';
     $ret .= '<div class="form-group">';
     $ret .= "<a href=\"{$FANNIE_URL}mem/correction_pages/MemEquityTransferTool.php?memIN={$memNum}\">Transfer Equity</a>";
     $ret .= ' | ';
     $ret .= "<a href=\"{$FANNIE_URL}mem/correction_pages/MemArEquitySwapTool.php?memIN={$memNum}\">Convert Equity</a>";
     $ret .= '</div>';
     $ret .= "</div>";
     $ret .= "</div>";
     return $ret;
 }
コード例 #2
0
ファイル: EquityHistoryTask.php プロジェクト: phpsmith/IS4C
 public function run()
 {
     $dbc = FannieDB::get($this->config->get('TRANS_DB'));
     // build department list
     $ret = preg_match_all("/[0-9]+/", $this->config->get('EQUITY_DEPARTMENTS'), $depts);
     $depts = array_pop($depts);
     $dlist = "(";
     $where_args = array();
     foreach ($depts as $d) {
         $dlist .= "?,";
         $where_args[] = $d;
     }
     $dlist = substr($dlist, 0, strlen($dlist) - 1) . ")";
     if ($dlist == ')') {
         // no configured departments
         return false;
     }
     // lookup AR transactions from past 15 days
     $lookupQ = "SELECT card_no,\n                department, total,\n                tdate, trans_num, trans_id\n                FROM dlog_15\n                WHERE department IN {$dlist}";
     $lookupP = $dbc->prepare($lookupQ);
     $lookupR = $dbc->execute($lookupP, $where_args);
     $checkP = $dbc->prepare('SELECT stockPurchase FROM stockpurchases 
                 WHERE tdate=? AND trans_num=? AND card_no=? AND dept=?');
     $addP = $dbc->prepare('INSERT INTO stockpurchases (card_no, stockPurchase, tdate, trans_num, dept)
                         VALUES (?, ?, ?, ?, ?)');
     $model = new StockpurchasesModel($dbc);
     while ($lookupW = $dbc->fetch_row($lookupR)) {
         if ($this->isLogged($dbc, $lookupW)) {
             continue;
         }
         $model->card_no($lookupW['card_no']);
         $model->stockPurchase($lookupW['total']);
         $model->tdate($lookupW['tdate']);
         $model->trans_num($lookupW['trans_num']);
         $model->dept($lookupW['department']);
         $model->trans_id($lookupW['trans_id']);
         if ($model->save() === false) {
             $this->cronMsg('Error adding equity entry ' . $lookupW['tdate'] . ' ' . $lookupW['trans_num'], FannieLogger::ERROR);
         }
     }
     // rebuild ar history sum table
     $dbc->query("TRUNCATE TABLE equity_history_sum");
     $query = "INSERT INTO equity_history_sum\n            SELECT card_no, SUM(stockPurchase), MIN(tdate)\n            FROM stockpurchases GROUP BY card_no";
     $def = $dbc->tableDefinition('equity_history_sum');
     if (isset($def['mostRecent'])) {
         $query = str_replace('MIN(tdate)', 'MIN(tdate), MAX(tdate)', $query);
     }
     $try = $dbc->query($query);
     if ($try === false) {
         $this->cronMsg('Error rebuilding equity_history_sum table', FannieLogger::ERROR);
     }
     if (isset($def['mostRecent'])) {
         /**
           Lookup transactions with net equity purchase
           of zero. These transactions should not impact
           the first/last equity purchase dates
         */
         $voidedR = $dbc->query('
             SELECT card_no,
                 trans_num
             FROM stockpurchases
             GROUP BY card_no,trans_num
             HAVING SUM(stockPurchase)=0');
         $voids = array();
         while ($row = $dbc->fetchRow($voidedR)) {
             if (!isset($voids[$row['card_no']])) {
                 $voids[$row['card_no']] = array();
             }
             $voids[$row['card_no']][] = $row['trans_num'];
         }
         /**
           For applicable members, lookup min and max
           date values again excluding the net-zero
           transactions. Update date fields for these
           members.
         */
         $upP = $dbc->prepare('
             UPDATE equity_history_sum
             SET startdate=?,
                 mostRecent=?
             WHERE card_no=?');
         foreach ($voids as $card_no => $transactions) {
             $query = '
                 SELECT MIN(tdate) AS startdate,
                     MAX(tdate) AS mostRecent
                 FROM stockpurchases
                 WHERE card_no=?
                     AND trans_num NOT IN (';
             $args = array($card_no);
             foreach ($transactions as $t) {
                 $query .= '?,';
                 $args[] = $t;
             }
             $query = substr($query, 0, strlen($query) - 1) . ')';
             $prep = $dbc->prepare($query);
             $res = $dbc->execute($prep, $args);
             if ($res && $dbc->numRows($res)) {
                 $dates = $dbc->fetchRow($res);
                 $dbc->execute($upP, array($dates['startdate'], $dates['mostRecent'], $card_no));
             }
         }
     }
     /**
       Update payment plan accounts based on 
       current payment history 
     */
     $dbc->selectDB($this->config->get('OP_DB'));
     $date = new MemDatesModel($dbc);
     $plan = new EquityPaymentPlansModel($dbc);
     $plans = array();
     foreach ($plan->find() as $p) {
         $plans[$p->equityPaymentPlanID()] = $p;
     }
     $accounts = new EquityPaymentPlanAccountsModel($dbc);
     $balP = $dbc->prepare('
         SELECT payments,
             mostRecent
         FROM ' . $this->config->get('TRANS_DB') . $dbc->sep() . 'equity_history_sum
         WHERE card_no=?');
     $historyP = $dbc->prepare('
         SELECT stockPurchase,
             tdate
         FROM ' . $this->config->get('TRANS_DB') . $dbc->sep() . 'stockpurchases
         WHERE card_no=?
         ORDER BY tdate');
     foreach ($accounts->find() as $account) {
         if (!isset($plans[$account->equityPaymentPlanID()])) {
             // undefined plan
             continue;
         }
         $myplan = $plans[$account->equityPaymentPlanID()];
         $bal = $dbc->getRow($balP, array($account->cardNo()));
         if ($bal['payments'] >= $myplan->finalBalance()) {
             // account is now paid in full
             $account->lastPaymentDate($bal['mostRecent']);
             $account->nextPaymentDate(null);
             $account->nextPaymentAmount(0);
             $account->save();
         } else {
             /**
               Payment plans are really structured into tiers. For a $20 increment, $100 total
               plan the tiers are at $20, $40, $60, and $80. I'm not assuming any rigid 
               enforcement of payment amounts (i.e., someone may make a payment that isn't
               exactly $20). So after the current tier is established, I go through
               the whole history to figure out when the tier was reached and track
               any progress toward tier.
             */
             $payment_number = $this->numberOfPayments($myplan, $bal['payments']);
             $last_threshold_reached = $myplan->initialPayment() + ($payment_number - 1) * $myplan->recurringPayment();
             $historyR = $dbc->execute($historyP, array($account->cardNo()));
             list($last_payment, $last_date, $next_payment) = $this->analyzePaymentHistory($dbc, $historyR, $myplan, $last_threshold_reached);
             $account->lastPaymentDate($last_date);
             $account->lastPaymentAmount($last_payment);
             $account->nextPaymentAmount($next_payment);
             // finally, figure out the next payment due date
             // if due dates are all based on the original join date,
             // walk forward through due dates from the beginning
             $basis_date = $last_date;
             if ($myplan->dueDateBasis() == 0) {
                 $date->card_no($account->cardNo());
                 $date->load();
                 $basis_date = $date->start_date();
                 for ($i = 1; $i < $payment_number - 1; $i++) {
                     $basis_date = $this->getNextPaymentDate($myplan, $basis_date);
                 }
             }
             $account->nextPaymentDate($this->getNextPaymentDate($myplan, $basis_date));
             $account->save();
         }
     }
 }
コード例 #3
0
ファイル: PaymentPlanEditor.php プロジェクト: phpsmith/IS4C
 public function unitTest($phpunit)
 {
     $values = new \COREPOS\common\mvc\ValueContainer();
     $values->_method = 'get';
     $this->setForm($values);
     $this->readRoutes();
     $page = $this->get_view();
     $phpunit->assertNotEquals(0, strlen($page));
     $values->_method = 'put';
     $this->setForm($values);
     $this->readRoutes();
     $this->put_handler();
     $values->_method = 'get';
     $this->setForm($values);
     $this->readRoutes();
     $newpage = $this->get_view();
     $phpunit->assertNotEquals($newpage, $page);
     $model = new EquityPaymentPlansModel($this->connection);
     $model->equityPaymentPlanID(1);
     $phpunit->assertEquals(true, $model->load());
     $values->_method = 'get';
     $values->id = 1;
     $this->setForm($values);
     $this->readRoutes();
     $page = $this->get_id_view();
     $phpunit->assertEquals(false, strstr($page, 'plan does not exist'));
     $values->_method = 'post';
     $values->id = 1;
     $values->name = 'Test';
     $values->final = '123';
     $values->initial = '12';
     $values->recurring = '23';
     $values->cycle = '5W';
     $values->basis = 1;
     $values->overdue = 90;
     $values->reason = 4;
     $this->setForm($values);
     $this->readRoutes();
     $this->post_id_name_final_initial_recurring_cycle_basis_overdue_reason_handler();
     $model->reset();
     $model->equityPaymentPlanID(1);
     $model->load();
     $phpunit->assertEquals($values->name, $model->name());
     $phpunit->assertEquals($values->final, $model->finalBalance());
     $phpunit->assertEquals($values->initial, $model->initialPayment());
     $phpunit->assertEquals($values->recurring, $model->recurringPayment());
     $phpunit->assertEquals($values->cycle, $model->billingCycle());
     $phpunit->assertEquals($values->basis, $model->dueDateBasis());
     $phpunit->assertEquals($values->overdue, $model->overDueLimit());
     $phpunit->assertEquals($values->reason, $model->reasonMask());
 }