From: <ex...@us...> - 2016-05-06 03:25:40
|
Revision: 7506 http://sourceforge.net/p/web-erp/reponame/7506 Author: exsonqu Date: 2016-05-06 03:25:37 +0000 (Fri, 06 May 2016) Log Message: ----------- 05/06/16 Exson: Modify Z_RePostGLFromPeriod.php to make this feature still reliable with previous version of GLPostings.inc. Rework the new GLPostings.inc. Modified Paths: -------------- trunk/Z_RePostGLFromPeriod.php trunk/includes/GLPostings.inc Added Paths: ----------- trunk/includes/GLPostingsZero.inc Modified: trunk/Z_RePostGLFromPeriod.php =================================================================== --- trunk/Z_RePostGLFromPeriod.php 2016-05-06 03:07:16 UTC (rev 7505) +++ trunk/Z_RePostGLFromPeriod.php 2016-05-06 03:25:37 UTC (rev 7506) @@ -53,9 +53,9 @@ /*Now repost the lot */ - include('includes/GLPostings.inc'); + include('includes/GLPostingsZero.inc'); prnMsg(_('All general ledger postings have been reposted from period') . ' ' . $_POST['FromPeriod'],'success'); } include('includes/footer.inc'); -?> \ No newline at end of file +?> Modified: trunk/includes/GLPostings.inc =================================================================== --- trunk/includes/GLPostings.inc 2016-05-06 03:07:16 UTC (rev 7505) +++ trunk/includes/GLPostings.inc 2016-05-06 03:25:37 UTC (rev 7506) @@ -88,7 +88,7 @@ if (isset($NewPeriods)) { foreach ($NewPeriods as $Account=>$Period) { if ($Period>$CreateFrom) { - $sql = "UPDATE chartdetails SET bfwd=(SELECT bfwd+actual FROM chartdetails WHERE accountcode='" . $Account . "' AND period='" . $Period - 1 . "') WHERE accountcode='" . $Account . "' AND period>= " . $Period; + $sql = "UPDATE chartdetails SET bfwd=(SELECT t.bfwd FROM (SELECT bfwd+actual as bfwd FROM chartdetails WHERE accountcode='" . $Account . "' AND period='" . ($Period - 1) . "') AS t) WHERE accountcode='" . $Account . "' AND period>= " . $Period; $ErrMsg = _('Failed to update the bfwd amount'); $BfwdResult = DB_query($sql,$ErrMsg); } Added: trunk/includes/GLPostingsZero.inc =================================================================== --- trunk/includes/GLPostingsZero.inc (rev 0) +++ trunk/includes/GLPostingsZero.inc 2016-05-06 03:25:37 UTC (rev 7506) @@ -0,0 +1,126 @@ +<?php + +/* $Id: GLPostings.inc 6945 2014-10-27 07:20:48Z daintree $*/ + +/* This file contains the code to post GL transactions. + +This file can be included on any page that needs GL postings to be posted eg inquiries or GL reports +GL posting thus becomes an invisible/automatic process to the user + +The logic of GL posting consists of: + + +Then looping through all unposted GL transactions in GLTrans table and + +1. Debit amounts increase the charge in the period for the account and credit amounts decrease the charge. +2. Chart Details records for all following periods have the b/fwd balance increased for debit amounts and decreased for credits. +3. Once these updates are done the GLTrans record is flagged as posted. + + +Notes: + +ChartDetail records should already exist - they are created (from includes/DateFunctions.in GetPeriod) when a new period is created or when a new GL account is created for all periods in the periods table. However, we may need to create new ones if the user posts back to a period before periods are currently set up - which is not actually possible with the config parameter ProhibitGLPostingsBefore set (However, is a problem when it is not set) +*/ + + +$FirstPeriodResult = DB_query("SELECT MIN(periodno) FROM periods"); +$FirstPeriodRow = DB_fetch_row($FirstPeriodResult); +$CreateFrom = $FirstPeriodRow[0]; + +if (is_null($FirstPeriodRow[0])){ + //There are no periods defined + $InsertFirstPeriodResult = DB_query("INSERT INTO periods VALUES (-1,'" . Date('Y-m-d',mktime(0,0,0,Date('m')-1,0,Date('Y'))) . "')",_('Could not insert first period')); + $InsertFirstPeriodResult = DB_query("INSERT INTO periods VALUES (0,'" . Date('Y-m-d',mktime(0,0,0,Date('m')+1,0,Date('Y'))) . "')",_('Could not insert first period')); + $InsertFirstPeriodResult = DB_query("INSERT INTO periods VALUES (1,'" . Date('Y-m-d',mktime(0,0,0,Date('m')+2,0,Date('Y'))) . "')",_('Could not insert second period')); + $CreateFrom=-1; +} + +$LastPeriodResult = DB_query("SELECT MAX(periodno) FROM periods"); +$LastPeriodRow = DB_fetch_row($LastPeriodResult); + + +$CreateTo = $LastPeriodRow[0]; + +/*First off see if there are in fact any chartdetails */ + +$sql = "SELECT chartmaster.accountcode, MIN(periods.periodno) AS startperiod + FROM (chartmaster CROSS JOIN periods) + LEFT JOIN chartdetails ON chartmaster.accountcode = chartdetails.accountcode + AND periods.periodno = chartdetails.period + WHERE (periods.periodno BETWEEN '" . $CreateFrom . "' AND '" . $CreateTo . "') + AND chartdetails.actual IS NULL + GROUP BY chartmaster.accountcode"; + +$ChartDetailsNotSetUpResult = DB_query($sql,_('Could not test to see that all chart detail records properly initiated')); + +if(DB_num_rows($ChartDetailsNotSetUpResult)>0){ + + /*Now insert the chartdetails records that do not already exist */ + $sql = "INSERT INTO chartdetails (accountcode, period) + SELECT chartmaster.accountcode, periods.periodno + FROM (chartmaster CROSS JOIN periods) + LEFT JOIN chartdetails ON chartmaster.accountcode = chartdetails.accountcode + AND periods.periodno = chartdetails.period + WHERE (periods.periodno BETWEEN '" . $CreateFrom . "' AND '" . $CreateTo . "') + AND chartdetails.accountcode IS NULL"; + + $ErrMsg = _('Inserting new chart details records required failed because'); + $InsChartDetailsRecords = DB_query($sql,$ErrMsg); +} + + + +/*All the ChartDetail records should have been created now and be available to accept postings */ + +for ( $CurrPeriod = $CreateFrom; $CurrPeriod <= $CreateTo; $CurrPeriod++ ) { + //get all the unposted transactions for the first and successive periods ordered by account + $sql = "SELECT counterindex, + periodno, + account, + amount + FROM gltrans + WHERE posted=0 + AND periodno='" . $CurrPeriod . "' + ORDER BY account"; + + $UnpostedTransResult = DB_query($sql); + + $TransStart = DB_Txn_Begin(); + $CurrentAccount='0'; + $TotalAmount=0; + while ($UnpostedTrans=DB_fetch_array($UnpostedTransResult)) { + if($CurrentAccount != $UnpostedTrans['account'] AND $CurrentAccount!='0') { + $sql = "UPDATE chartdetails SET actual = actual + " . $TotalAmount . " + WHERE accountcode = '" . $CurrentAccount . "' + AND period= '" . $CurrPeriod . "'"; + $PostPrd = DB_query($sql); + /*Update the BFwd for all following ChartDetail records */ + $sql = "UPDATE chartdetails SET bfwd = bfwd + " . $TotalAmount . " + WHERE accountcode = '" . $CurrentAccount . "' + AND period > '" . $CurrPeriod . "'"; + $PostBFwds = DB_query($sql); + $TotalAmount = 0; + } + $CurrentAccount = $UnpostedTrans['account']; + $TotalAmount += $UnpostedTrans['amount']; + } + // There will be one account still to post after the loop + if($CurrentAccount != 0) { + $sql = "UPDATE chartdetails SET actual = actual + " . $TotalAmount . " + WHERE accountcode = '" . $CurrentAccount . "' + AND period= '" . $CurrPeriod . "'"; + $PostPrd = DB_query($sql); + /*Update the BFwd for all following ChartDetail records */ + $sql = "UPDATE chartdetails SET bfwd = bfwd + " . $TotalAmount . " + WHERE accountcode = '" . $CurrentAccount . "' + AND period > '" . $CurrPeriod . "'"; + $PostBFwds = DB_query($sql); + } + + $sql = "UPDATE gltrans SET posted = 1 WHERE periodno = '" . $CurrPeriod . "' AND posted=0"; + $Posted = DB_query($sql); + + $TransCommit = DB_Txn_Commit(); +} + +?> \ No newline at end of file |