From 122dfb10a048612761f76b07ffb1a3e04ef5787f Mon Sep 17 00:00:00 2001 From: abijah Date: Thu, 23 Jul 2009 23:52:59 +0000 Subject: [PATCH] Finally resolved the StatementEntries::stats() query issue. It has been lingering in an incomplete state because it wasn't clear what it was supposed to really do. I think it is now performing the task expected of it. git-svn-id: file:///svn-source/pmgr/branches/yafr_20090716@374 97e9348a-65ac-dc4b-aefc-98561f571b83 --- site/models/statement_entry.php | 165 ++++++++++---------------------- 1 file changed, 48 insertions(+), 117 deletions(-) diff --git a/site/models/statement_entry.php b/site/models/statement_entry.php index a41b582..681dafc 100644 --- a/site/models/statement_entry.php +++ b/site/models/statement_entry.php @@ -263,6 +263,12 @@ OPTION 2 $query['link']['ChargeEntry'] = array('fields' => array("SUM(ChargeEntry.amount) AS reconciled")); $query['group'] = 'StatementEntry.id'; + + // REVISIT: TESTING + //$query['link']['PaymentEntry'] = array('fields' => array("(`PaymentEntry.amount`+0) AS reconciled")); + //$query['group'] = null; + // END REVISIT + return $query; } @@ -270,14 +276,13 @@ OPTION 2 $lquery = $this->reconciledSetQuery($set, $query); $result = $this->find('all', $lquery); - //pr(compact('lquery', 'result')); - - //pr(array('reconciledSet', compact('set', 'lquery', 'result'))); + //pr(array('StatementEntry::reconciledSet' => compact('set', 'unrec', 'lquery', 'result'))); $resultset = array(); foreach ($result AS $i => $entry) { //pr(compact('entry')); - $entry['StatementEntry'] = $entry[0] + $entry['StatementEntry']; + if (!empty($entry[0])) + $entry['StatementEntry'] = $entry[0] + $entry['StatementEntry']; unset($entry[0]); $entry['StatementEntry']['balance'] = @@ -295,9 +300,7 @@ OPTION 2 } } - //pr(compact('resultset')); - - //pr(array('StatementEntry::reconciledSet()' => compact('resultset'))); + //pr(array('StatementEntry::reconciledSet' => compact('resultset'))); //$resultset['stats'] = $this->stats(null, $query); //pr($this->stats(null, $query)); @@ -354,128 +357,56 @@ OPTION 2 $this->queryInit($query); unset($query['group']); - - if (isset($id)) { - $this->id = $id; - $this->recursive = -1; - $this->read(); - - if ($this->data['StatementEntry']['type'] == 'PAYMENT') { - // Payment has only a _single_ charge, and by definition - // 100% of the payment is used to reconcile that charge. - return array('total' => $this->data['StatementEntry']['amount'], - 'reconciled' => $this->data['StatementEntry']['amount'], - 'balance' => 0); - } - - $query['link']['PaymentEntry'] = - array('fields' => array("SUM(COALESCE(PaymentEntry.amount,0)) AS reconciled"), - //'type' => 'INNER', - ); - - $query['fields'] = array('StatementEntry.amount'); - $query['conditions'][] = array('StatementEntry.id' => $id); - $query['group'] = 'StatementEntry.id'; - - $result = $this->find('first', $query); - $result[0]['balance'] = $result['StatementEntry']['amount'] - $result[0]['reconciled']; - //pr(compact('query', 'result')); - - return $result['StatementEntry'] + $result[0]; - } +/* pr(array('StatementEntry::stats' => compact('id', 'query'))); */ $stats = array(); + if (isset($id)) + $query['conditions'][] = array('StatementEntry.id' => $id); $rquery = $query; - $rquery['link']['PaymentEntry'] = - array('fields' => array("SUM(COALESCE(PaymentEntry.amount,0)) AS reconciled"), - //'type' => 'INNER', - ); + unset($rquery['link']['ChargeEntry']); + $rquery['link']['PaymentEntry'] = array('fields' => array()); $rquery['fields'] = array(); $rquery['fields'][] = "SUM(StatementEntry.amount) AS total"; + $rquery['fields'][] = "SUM(PaymentEntry.amount) AS reconciled"; + $rquery['fields'][] = "SUM(StatementEntry.amount - COALESCE(PaymentEntry.amount,0)) AS balance"; - $rquery['conditions'][] = array("PaymentEntry.id !=" => null); - + $rquery['conditions'][] = array('StatementEntry.type' => 'CHARGE'); $result = $this->find('first', $rquery); - $result[0]['balance'] = $result[0]['total'] - $result[0]['reconciled']; - $stats['Payment'] = $result[0]; - //pr(array('stats Payment', compact('rquery', 'stats'))); - - $rquery = $query; - $rquery['fields'] = array(); - $rquery['fields'][] = "SUM(StatementEntry.amount) AS total"; - $rquery['fields'][] = "SUM(StatementEntry.amount) AS reconciled"; - - $result = $this->find('first', $rquery); - $result[0]['balance'] = $result[0]['total'] - $result[0]['reconciled']; + if (!isset($result[0]['balance'])) + $result[0]['balance'] = 0; $stats['Charge'] = $result[0]; - //pr(array('stats Charge', compact('rquery', 'stats'))); - + +/* pr(array('StatementEntry::stats' => */ +/* array('checkpoint' => 'Charges') */ +/* + compact('query', 'result'))); */ + + $rquery = $query; + unset($rquery['link']['PaymentEntry']); + $rquery['link']['ChargeEntry'] = array('fields' => array()); + + $rquery['fields'] = array(); + $rquery['fields'][] = "SUM(StatementEntry.amount) AS total"; + $rquery['fields'][] = "SUM(IF(ChargeEntry.id IS NULL, 0, StatementEntry.amount)) AS reconciled"; + $rquery['fields'][] = "SUM(IF(ChargeEntry.id IS NULL, StatementEntry.amount, 0)) AS balance"; + + $rquery['conditions'][] = array('StatementEntry.type' => 'PAYMENT'); + $result = $this->find('first', $rquery); + if (!isset($result[0]['balance'])) + $result[0]['balance'] = 0; + $stats['Payment'] = $result[0]; + +/* pr(array('StatementEntry::stats' => */ +/* array('checkpoint' => 'Payments') */ +/* + compact('rquery', 'result'))); */ + + +/* pr(array('StatementEntry::stats' => */ +/* array('checkpoint' => 'return') */ +/* + compact('stats'))); */ return $stats; - - - $this->id = $id; - $this->recursive = -1; - $this->read(); - - //pr(array('stats()', compact('id', 'query', 'set'))); - - - -/* if ($this->data['StatementEntry']['type'] == 'CHARGE') */ -/* $set = 'PAYMENT'; */ -/* else */ -/* $set = 'CHARGE'; */ - -/* $Set = ucfirst(strtolower($set)); */ - -/* $query['link'][$Set.'Entry'] = */ -/* array('fields' => array("SUM(COALESCE({$Set}Entry.amount,0)) AS reconciled"), */ -/* //'type' => 'INNER', */ -/* ); */ - -/* $query['fields'] = array(); */ -/* $query['fields'][] = "StatementEntry.amount AS total"; */ -/* $query['fields'][] = "StatementEntry.amount - SUM(COALESCE({$Set}Entry.amount,0)) AS balance"; */ -/* //$query['conditions'][] = array("{$Set}Entry.id !=" => null); */ - -/* $query['conditions'][] = array('StatementEntry.id' => $id); */ - -/* $query['group'] = 'StatementEntry.id'; */ - -/* $result = $this->find('first', $query); */ -/* pr(compact('Rtype', 'query', 'result')); */ - -/* return $result['StatementEntry'] + $result[0]; */ - - if ($this->data['StatementEntry']['type'] == 'PAYMENT') { - // Payment has only a _single_ charge, and by definition - // 100% of the payment is used to reconcile that charge. - return array('total' => $this->data['StatementEntry']['amount'], - 'reconciled' => $this->data['StatementEntry']['amount'], - 'balance' => 0); - } - - $query['link']['PaymentEntry'] = - array('fields' => array("SUM(COALESCE(PaymentEntry.amount,0)) AS reconciled"), - //'type' => 'INNER', - ); - - $query['fields'] = array(); - $query['fields'][] = "StatementEntry.amount AS total"; - $query['fields'][] = "StatementEntry.amount - SUM(COALESCE(PaymentEntry.amount,0)) AS balance"; - //$query['conditions'][] = array("{$Set}Entry.id !=" => null); - - $query['conditions'][] = array('StatementEntry.id' => $id); - - $query['group'] = 'StatementEntry.id'; - - $result = $this->find('first', $query); - //pr(compact('Rtype', 'query', 'result')); - - return $result['StatementEntry'] + $result[0]; } }