issue #7155 - fre is slow. first pass at using temp table to (1) reduce the amount...
authorGil Moskowitz <gilmoskowitz@acm.org>
Mon, 9 Jun 2014 22:20:01 +0000 (18:20 -0400)
committerGil Moskowitz <gilmoskowitz@acm.org>
Mon, 9 Jun 2014 22:20:01 +0000 (18:20 -0400)
foundation-database/public/functions/financialreport.sql
foundation-database/public/functions/insertflgroup.sql
test/database/financialreport.js [new file with mode: 0644]

index 84b2a52..94ab40b 100644 (file)
@@ -24,6 +24,17 @@ CREATE OR REPLACE FUNCTION financialreport(INTEGER, INTEGER, bpchar, INTEGER)
   RETURNS bool AS $$
 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
 -- See www.xtuple.com/CPAL for the full text of the software license.
+
+/* performance vs. history:
+   versions prior to xTuple ERP 4.5.x (x ?= 1) used public.flrpt
+   to build financial reports. after that release, the function
+   creates a temporary table if necessary. with the temp table,
+   flrpt self-joins no longer require comparing flrpt_username -
+   temp tables are only visible within the current session. however,
+   there are subsidiary functions (eg insertflgroup) that _do_ join
+   on flrpt_username. in addition, flrpt_username has a not-null constraint.
+   to reduce the risk of breakage, this function still sets flrpt_username.
+*/
 DECLARE
   pFlheadid ALIAS FOR $1;
   pPeriodid ALIAS FOR $2;
@@ -33,6 +44,7 @@ DECLARE
   _r RECORD;
   _t RECORD;
   _s RECORD;
+  _username TEXT := getEffectiveXtUser();
 
 BEGIN
 
@@ -41,12 +53,15 @@ BEGIN
      RAISE EXCEPTION 'Invalid Interval --> %', pInterval;
    END IF;
 
--- Get rid of any old reporting done by this user for the specified criteria
+  CREATE TEMPORARY TABLE IF NOT EXISTS flrpt
+    (LIKE public.flrpt INCLUDING ALL)
+    ON COMMIT PRESERVE ROWS;
+
+  -- clear even temp tables because every run builds on data upserted by itself
   DELETE FROM flrpt
    WHERE ((flrpt_flhead_id=pFlheadid)
      AND  (flrpt_period_id=pPeriodId)
-     AND  (flrpt_interval=pInterval)
-     AND  (flrpt_username=getEffectiveXtUser()));
+     AND  (flrpt_interval=pInterval));
 
 -- Find out if we need to show a Grand Total and which if any of the values
 -- we want to show in that grand total.
@@ -91,7 +106,7 @@ BEGIN
             flrpt_beginning, flrpt_ending,
             flrpt_debits, flrpt_credits, flrpt_budget, flrpt_diff,
             flrpt_custom, flrpt_altname, flrpt_interval )
-    VALUES (pFlheadid, pPeriodid, getEffectiveXtUser(),
+    VALUES (pFlheadid, pPeriodid, _username,
             0, -1, 'G', -1,
             _r.beginning, _r.ending,
             _r.debits, _r.credits, _r.budget, _r.diff,
@@ -107,7 +122,6 @@ BEGIN
              WHERE ((flrpt_flhead_id=pFlheadid)
                AND  (flrpt_period_id=pPeriodid)
                AND  (flrpt_interval=pInterval)
-               AND  (flrpt_username=getEffectiveXtUser())
                AND  (flrpt_type='G')
                AND  (flrpt_type_id=flgrp_id))
              UNION
@@ -116,7 +130,6 @@ BEGIN
              WHERE ((flrpt_flhead_id=pFlheadid)
                AND  (flrpt_period_id=pPeriodid)
                AND  (flrpt_interval=pInterval)
-               AND  (flrpt_username=getEffectiveXtUser())
                AND  (flrpt_type='I')
                AND  (flrpt_type_id=flitem_id))
              UNION
@@ -125,7 +138,6 @@ BEGIN
              WHERE ((flrpt_flhead_id=pFlheadid)
                AND  (flrpt_period_id=pPeriodid)
                AND  (flrpt_interval=pInterval)
-               AND  (flrpt_username=getEffectiveXtUser())
                AND  (flrpt_type='S')
                AND  (flrpt_type_id=flspec_id)) LOOP
 
@@ -141,7 +153,6 @@ BEGIN
        WHERE ((flrpt_flhead_id=pFlheadid)
          AND  (flrpt_period_id=pPeriodid)
          AND  (flrpt_interval=pInterval)
-         AND  (flrpt_username=getEffectiveXtUser())
          AND  (flrpt_type != 'T')
          AND  (flrpt_parent_id=_t.flgrp_id));
     ELSE
@@ -156,7 +167,6 @@ BEGIN
        WHERE ((flrpt_flhead_id=pFlheadid)
          AND  (flrpt_period_id=pPeriodid)
          AND  (flrpt_interval=pInterval)
-         AND  (flrpt_username=getEffectiveXtUser())
          AND  (flrpt_type = 'G')
          AND  (flrpt_type_id=_t.flgrp_id));
     END IF;
@@ -171,7 +181,6 @@ BEGIN
      WHERE ((flrpt_flhead_id=pFlheadid)
        AND  (flrpt_period_id=pPeriodid)
        AND  (flrpt_interval=pInterval)
-       AND  (flrpt_username=getEffectiveXtUser())
        AND  (flrpt_order=_t.flrpt_order));
   END LOOP;
 
@@ -190,12 +199,10 @@ BEGIN
              WHERE ((a.flrpt_flhead_id=pFlheadid)
                AND  (a.flrpt_period_id=pPeriodid)
                AND  (a.flrpt_interval=pInterval)
-               AND  (a.flrpt_username=getEffectiveXtUser())
                AND  (a.flrpt_type='T')
                AND  (b.flrpt_flhead_id=a.flrpt_flhead_id)
                AND  (b.flrpt_period_id=a.flrpt_period_id)
                AND  (b.flrpt_interval=pInterval)
-               AND  (b.flrpt_username=a.flrpt_username)
                AND  (b.flrpt_type='G')
                AND  (b.flrpt_type_id=a.flrpt_parent_id)) LOOP
     UPDATE flrpt SET flrpt_beginningprcnt=flrpt_beginningprcnt + _t.flrpt_beginningprcnt,
@@ -208,7 +215,6 @@ BEGIN
                WHERE ((flrpt_flhead_id=pFlheadid)
                  AND  (flrpt_period_id=pPeriodid)
                  AND  (flrpt_interval=pInterval)
-                 AND  (flrpt_username=getEffectiveXtUser())
                  AND  (flrpt_order=_t.flrpt_order));
   END LOOP;
 
@@ -221,14 +227,13 @@ BEGIN
                                     WHERE ((flrpt_flhead_id=pFlheadid)
                                       AND  (flrpt_period_id=pPeriodid)
                                       AND  (flrpt_interval=pInterval)
-                                      AND  (flrpt_username=getEffectiveXtUser()))
+                                    )
                                   ), 0) + 1,
            flrpt_level = 0,
            flrpt_type = 'T'
      WHERE ((flrpt_flhead_id=pFlheadid)
        AND  (flrpt_period_id=pPeriodid)
        AND  (flrpt_interval=pInterval)
-       AND  (flrpt_username=getEffectiveXtUser())
        AND  (flrpt_order=0)
        AND  (flrpt_level = -1)
        AND  (flrpt_type = 'G')
@@ -243,6 +248,7 @@ CREATE OR REPLACE FUNCTION financialreport(INTEGER, INTEGER, bool, bool, INTEGER
   RETURNS SETOF flstmtitem AS $$
 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
 -- See www.xtuple.com/CPAL for the full text of the software license.
+-- see "performance vs. history" in financialreport(integer,integer,bpchar,integer)
 DECLARE
   pFlcolid ALIAS FOR $1;
   pPeriodid ALIAS FOR $2;
@@ -259,6 +265,7 @@ DECLARE
   _prevlevel INTEGER;
   _subgrp INTEGER;
   _qtrInterval TEXT;
+--_username TEXT := getEffectiveXtUser();
   _yrInterval TEXT;
 
 BEGIN
@@ -289,14 +296,17 @@ BEGIN
     _yrInterval := 'Y';
   END IF;
 
---Delete old data from all periods
+  CREATE TEMPORARY TABLE IF NOT EXISTS flrpt
+    (LIKE public.flrpt INCLUDING ALL)
+    ON COMMIT PRESERVE ROWS;
+
+  -- clear even temp tables because every run builds on data upserted by itself
   DELETE FROM flrpt
-  WHERE ((flrpt_username=getEffectiveXtUser())
-  AND (flrpt_flhead_id=_p.flhead_id));
+  WHERE (flrpt_flhead_id=_p.flhead_id);
 
 --Populate report data...
 --...for Month
-        IF (_p.flcol_month) THEN
+      IF (_p.flcol_month) THEN
 
         PERFORM financialreport(_p.flhead_id,pPeriodid,'M',pPrjid);
 
@@ -679,14 +689,13 @@ BEGIN
                 WHERE ((flrpt_type='G')
                 AND (flrpt_flhead_id=_p.flhead_id)
                 AND (flrpt_period_id=pPeriodId)
-                AND (flrpt_username=getEffectiveXtUser()))) AS flrpt
+                )) AS flrpt
                         LEFT OUTER JOIN flrpt flrptmo
                                 ON ((flrptmo.flrpt_type=flrpt.flrpt_type)
                                 AND (flrptmo.flrpt_type_id=flrpt.flrpt_type_id)
                                 AND (flrptmo.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptmo.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptmo.flrpt_interval='M')
-                                AND (flrptmo.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptmo.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptqt
                                 ON ((flrptqt.flrpt_type=flrpt.flrpt_type)
@@ -694,7 +703,6 @@ BEGIN
                                 AND (flrptqt.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptqt.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptqt.flrpt_interval=_qtrInterval)
-                                AND (flrptqt.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptqt.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptyr
                                 ON ((flrptyr.flrpt_type=flrpt.flrpt_type)
@@ -702,7 +710,6 @@ BEGIN
                                 AND (flrptyr.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptyr.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptyr.flrpt_interval=_yrInterval)
-                                AND (flrptyr.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptyr.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptprmo
                                 ON ((flrptprmo.flrpt_type=flrpt.flrpt_type)
@@ -710,7 +717,6 @@ BEGIN
                                 AND (flrptprmo.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptprmo.flrpt_period_id=_priorMoPeriodId)
                                 AND (flrptprmo.flrpt_interval='M')
-                                AND (flrptprmo.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptprmo.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptprqt
                                 ON ((flrptprqt.flrpt_type=flrpt.flrpt_type)
@@ -718,7 +724,6 @@ BEGIN
                                 AND (flrptprqt.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptprqt.flrpt_period_id=_priorQtPeriodId)
                                 AND (flrptprqt.flrpt_interval='Q')
-                                AND (flrptprqt.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptprqt.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptpryr
                                 ON ((flrptpryr.flrpt_type=flrpt.flrpt_type)
@@ -726,7 +731,6 @@ BEGIN
                                 AND (flrptpryr.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptpryr.flrpt_period_id=_priorYrPeriodId)
                                 AND (flrptpryr.flrpt_interval='Y')
-                                AND (flrptpryr.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptpryr.flrpt_order=flrpt.flrpt_order))
         WHERE ((flgrp_id = flrpt.flrpt_type_id)
         AND (flhead_id = flgrp_flhead_id))
@@ -920,7 +924,6 @@ BEGIN
                 WHERE ((flrpt_type='I')
                 AND (flrpt_flhead_id=_p.flhead_id)
                 AND (flrpt_period_id=pPeriodid)
-                AND (flrpt_username=getEffectiveXtUser())
                 AND (accnt_id=flrpt_accnt_id))) AS flrpt
                         LEFT OUTER JOIN flrpt flrptmo
                                 ON ((flrptmo.flrpt_type=flrpt.flrpt_type)
@@ -928,7 +931,6 @@ BEGIN
                                 AND (flrptmo.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptmo.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptmo.flrpt_interval='M')
-                                AND (flrptmo.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptmo.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptqt
                                 ON ((flrptqt.flrpt_type=flrpt.flrpt_type)
@@ -936,7 +938,6 @@ BEGIN
                                 AND (flrptqt.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptqt.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptqt.flrpt_interval=_qtrInterval)
-                                AND (flrptqt.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptqt.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptyr
                                 ON ((flrptyr.flrpt_type=flrpt.flrpt_type)
@@ -944,7 +945,6 @@ BEGIN
                                 AND (flrptyr.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptyr.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptyr.flrpt_interval=_yrInterval)
-                                AND (flrptyr.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptyr.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptprmo
                                 ON ((flrptprmo.flrpt_type=flrpt.flrpt_type)
@@ -952,7 +952,6 @@ BEGIN
                                 AND (flrptprmo.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptprmo.flrpt_period_id=_priorMoPeriodId)
                                 AND (flrptprmo.flrpt_interval='M')
-                                AND (flrptprmo.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptprmo.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptprqt
                                 ON ((flrptprqt.flrpt_type=flrpt.flrpt_type)
@@ -960,7 +959,6 @@ BEGIN
                                 AND (flrptprqt.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptprqt.flrpt_period_id=_priorQtPeriodId)
                                 AND (flrptprqt.flrpt_interval='Q')
-                                AND (flrptprqt.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptprqt.flrpt_order=flrpt.flrpt_order))
                         LEFT OUTER JOIN flrpt flrptpryr
                                 ON ((flrptpryr.flrpt_type=flrpt.flrpt_type)
@@ -968,7 +966,6 @@ BEGIN
                                 AND (flrptpryr.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptpryr.flrpt_period_id=_priorYrPeriodId)
                                 AND (flrptpryr.flrpt_interval='Y')
-                                AND (flrptpryr.flrpt_username=flrpt.flrpt_username)
                                 AND (flrptpryr.flrpt_order=flrpt.flrpt_order) )
         WHERE ((flitem_id = flrpt.flrpt_type_id)
         AND (flhead_id = flitem_flhead_id))
@@ -1149,49 +1146,49 @@ BEGIN
                 WHERE ((NOT (flrpt_type IN ('G','I','S')))
                 AND (flrpt_flhead_id=_p.flhead_id)
                 AND (flrpt_period_id=pPeriodId)
-                AND (flrpt_username=getEffectiveXtUser()))) AS flrpt
+                )) AS flrpt
                         LEFT OUTER JOIN flrpt flrptmo
                                 ON ((flrptmo.flrpt_type=flrpt.flrpt_type)
                                 AND (flrptmo.flrpt_order=flrpt.flrpt_order)
                                 AND (flrptmo.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptmo.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptmo.flrpt_interval='M')
-                                AND (flrptmo.flrpt_username=flrpt.flrpt_username))
+                                )
                         LEFT OUTER JOIN flrpt flrptqt
                                 ON ((flrptqt.flrpt_type=flrpt.flrpt_type)
                                 AND (flrptqt.flrpt_order=flrpt.flrpt_order)
                                 AND (flrptqt.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptqt.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptqt.flrpt_interval=_qtrInterval)
-                                AND (flrptqt.flrpt_username=flrpt.flrpt_username))
+                                )
                         LEFT OUTER JOIN flrpt flrptyr
                                 ON ((flrptyr.flrpt_type=flrpt.flrpt_type)
                                 AND (flrptyr.flrpt_order=flrpt.flrpt_order)
                                 AND (flrptyr.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptyr.flrpt_period_id=flrpt.flrpt_period_id)
                                 AND (flrptyr.flrpt_interval=_yrInterval)
-                                AND (flrptyr.flrpt_username=flrpt.flrpt_username))
+                                )
                         LEFT OUTER JOIN flrpt flrptprmo
                                 ON ((flrptprmo.flrpt_type=flrpt.flrpt_type)
                                 AND (flrptprmo.flrpt_order=flrpt.flrpt_order)
                                 AND (flrptprmo.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptprmo.flrpt_period_id=_priorMoPeriodId)
                                 AND (flrptprmo.flrpt_interval='M')
-                                AND (flrptprmo.flrpt_username=flrpt.flrpt_username))
+                                )
                         LEFT OUTER JOIN flrpt flrptprqt
                                 ON ((flrptprqt.flrpt_type=flrpt.flrpt_type)
                                 AND (flrptprqt.flrpt_order=flrpt.flrpt_order)
                                 AND (flrptprqt.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptprqt.flrpt_period_id=_priorQtPeriodId)
                                 AND (flrptprqt.flrpt_interval='Q')
-                                AND (flrptprqt.flrpt_username=flrpt.flrpt_username))
+                                )
                         LEFT OUTER JOIN flrpt flrptpryr
                                 ON ((flrptpryr.flrpt_type=flrpt.flrpt_type)
                                 AND (flrptpryr.flrpt_order=flrpt.flrpt_order)
                                 AND (flrptpryr.flrpt_flhead_id=flrpt.flrpt_flhead_id)
                                 AND (flrptpryr.flrpt_period_id=_priorYrPeriodId)
                                 AND (flrptpryr.flrpt_interval='Y')
-                                AND (flrptpryr.flrpt_username=flrpt.flrpt_username))
+                                )
         WHERE (flhead_id=flrpt.flrpt_flhead_id)
         ORDER BY flstmtitem_order
         LOOP
@@ -1327,7 +1324,7 @@ BEGIN
         AND (flrpt_type='G')
         AND (flrpt_period_id=pPeriodIds[1])
         AND (flrpt_interval=pInterval)
-        AND (flrpt_username=getEffectiveXtUser()))
+        )
         UNION
         SELECT flrpt_flhead_id,
                 flrpt_username,
@@ -1353,7 +1350,7 @@ BEGIN
         AND (flrpt_type='I')
         AND (flrpt_period_id=pPeriodIds[1])
         AND (flrpt_interval=pInterval)
-        AND (flrpt_username=getEffectiveXtUser()))
+        )
         UNION
         SELECT flrpt_flhead_id,
                 flrpt_username,
@@ -1385,7 +1382,7 @@ BEGIN
         AND (flrpt_type NOT IN ('I','S','G'))
         AND (flrpt_period_id=pPeriodIds[1])
         AND (flrpt_interval=pInterval)
-        AND (flrpt_username=getEffectiveXtUser()))
+        )
         ORDER BY flrpt_order
         LOOP
 
@@ -1409,7 +1406,6 @@ BEGIN
                                 WHERE ((flrpt_flhead_id=pFlheadId)
                                 AND (flrpt_period_id=pPeriodIds[_i])
                                 AND (flrpt_interval=pInterval)
-                                AND (flrpt_username=getEffectiveXtUser())
                                 AND (flrpt_order=_p.flrpt_order));
                                 _fld[_i-1] := _n;
                                 IF _type IN ('I','C') THEN
index 82e7f5e..2c14dd0 100644 (file)
@@ -1,52 +1,24 @@
+SELECT dropIfExists('FUNCTION', 'insertFlGroup(INTEGER, INTEGER, INTEGER, INTEGER, BOOLEAN)');
+SELECT dropIfExists('FUNCTION', 'insertFlGroup(INTEGER, INTEGER, INTEGER, INTEGER, BOOLEAN, CHAR)');
+SELECT dropIfExists('FUNCTION', 'insertFlGroup(INTEGER, INTEGER, INTEGER, INTEGER, BOOLEAN, CHAR, INTEGER)');
 
-
-CREATE OR REPLACE FUNCTION insertFlGroup(INTEGER, INTEGER, INTEGER, INTEGER, BOOLEAN) RETURNS BOOLEAN AS $$
+CREATE OR REPLACE FUNCTION insertflgroup(pFlheadid INTEGER
+                                       , pPeriodid INTEGER
+                                       , pFlgrpid INTEGER
+                                       , pLevel INTEGER
+                                       , pSummarize BOOLEAN
+                                       , pInterval CHAR DEFAULT NULL
+                                       , pPrjid INTEGER DEFAULT NULL) RETURNS BOOLEAN AS $$
 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
 -- See www.xtuple.com/CPAL for the full text of the software license.
-DECLARE
-  pFlheadid  ALIAS FOR $1;
-  pPeriodid  ALIAS FOR $2;
-  pFlgrpid   ALIAS FOR $3;
-  pLevel     ALIAS FOR $4;
-  pSummarize ALIAS FOR $5;
 
-BEGIN
-  RETURN insertFlGroup(pFlheadid, pPeriodid, pFlgrpid, pLevel, pSummarize, NULL);
-END;
-$$ LANGUAGE 'plpgsql';
-
-CREATE OR REPLACE FUNCTION insertFlGroup(INTEGER, INTEGER, INTEGER, INTEGER, BOOLEAN, CHAR) RETURNS BOOLEAN AS $$
--- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
--- See www.xtuple.com/CPAL for the full text of the software license.
+/* see the "performance vs. history" comment in financialreport() */
 DECLARE
-  pFlheadid  ALIAS FOR $1;
-  pPeriodid  ALIAS FOR $2;
-  pFlgrpid   ALIAS FOR $3;
-  pLevel     ALIAS FOR $4;
-  pSummarize ALIAS FOR $5;
-  pInterval  ALIAS FOR $6;
-
-BEGIN
-  RETURN insertFlGroup(pFlheadid, pPeriodid, pFlgrpid, pLevel, pSummarize, pInterval, NULL);
-END;
-$$ LANGUAGE 'plpgsql';
-
-CREATE OR REPLACE FUNCTION insertflgroup(INTEGER, INTEGER, INTEGER, INTEGER, BOOLEAN, CHAR, INTEGER) RETURNS BOOLEAN AS $$
--- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple. 
--- See www.xtuple.com/CPAL for the full text of the software license.
-DECLARE
-  pFlheadid  ALIAS FOR $1;
-  pPeriodid  ALIAS FOR $2;
-  pFlgrpid   ALIAS FOR $3;
-  pLevel     ALIAS FOR $4;
-  pSummarize ALIAS FOR $5;
-  pInterval  ALIAS FOR $6;
-  pPrjid     ALIAS FOR $7;
-
   _subtotal BOOLEAN;
   _r RECORD;
   _g RECORD;
   _all BOOLEAN;
+  _username TEXT := getEffectiveXtUser();
 
 BEGIN
 
@@ -293,13 +265,14 @@ BEGIN
               flrpt_beginningprcnt, flrpt_endingprcnt,
               flrpt_debitsprcnt, flrpt_creditsprcnt, flrpt_budgetprcnt, flrpt_diffprcnt, flrpt_customprcnt,
               flrpt_parent_id, flrpt_interval)
-      VALUES (pFlheadid, pPeriodid, getEffectiveXtUser(),
+      VALUES (pFlheadid, pPeriodid, _username,
               (COALESCE(( SELECT MAX(flrpt_order)
                             FROM flrpt
                            WHERE ((flrpt_flhead_id=pFlheadid)
                              AND  (flrpt_period_id=pPeriodid)
                              AND (flrpt_interval=pInterval)
-                             AND  (flrpt_username=getEffectiveXtUser()))
+--                           AND  (flrpt_username=_username)
+                             )
                         ), 1) + 1),
               pLevel, _r.type, _r.type_id,
               _r.beginning, _r.ending,
@@ -322,7 +295,7 @@ BEGIN
        WHERE ((flrpt_flhead_id=pFlheadid)
          AND  (flrpt_period_id=pPeriodid)
           AND (flrpt_interval=pInterval)
-         AND  (flrpt_username=getEffectiveXtUser())
+--       AND  (flrpt_username=_username)
          AND  (flrpt_type=_r.type)
          AND  (flrpt_type_id=_r.type_id));
       IF (_r.subtract) THEN
@@ -337,7 +310,7 @@ BEGIN
          WHERE ((flrpt_flhead_id=pFlheadid)
            AND  (flrpt_period_id=pPeriodid)
            AND  (flrpt_interval=pInterval)
-           AND  (flrpt_username=getEffectiveXtUser())
+--         AND  (flrpt_username=_username)
            AND  (flrpt_type='G')
            AND  (flrpt_type_id=pFlgrpid));
       ELSE
@@ -352,7 +325,7 @@ BEGIN
          WHERE ((flrpt_flhead_id=pFlheadid)
            AND  (flrpt_period_id=pPeriodid)
            AND  (flrpt_interval=pInterval)
-           AND  (flrpt_username=getEffectiveXtUser())
+--         AND  (flrpt_username=_username)
            AND  (flrpt_type='G')
            AND  (flrpt_type_id=pFlgrpid));
       END IF;
@@ -363,7 +336,7 @@ BEGIN
          WHERE ((flrpt_flhead_id=pFlheadid)
           AND  (flrpt_period_id=pPeriodid)
           AND  (flrpt_interval=pInterval)
-          AND  (flrpt_username=getEffectiveXtUser())
+--        AND  (flrpt_username=_username)
           AND  (flrpt_type=_r.type)
           AND  (flrpt_type_id=_r.type_id));
       END IF;
@@ -382,13 +355,14 @@ BEGIN
                   flrpt_beginningprcnt, flrpt_endingprcnt,
                   flrpt_debitsprcnt, flrpt_creditsprcnt, flrpt_budgetprcnt, flrpt_diffprcnt, flrpt_customprcnt,
                   flrpt_parent_id,flrpt_accnt_id,flrpt_interval)
-          VALUES (pFlheadid, pPeriodid, getEffectiveXtUser(),
+          VALUES (pFlheadid, pPeriodid, _username,
                   (COALESCE(( SELECT MAX(flrpt_order)
                                FROM flrpt
                               WHERE ((flrpt_flhead_id=pFlheadid)
                                 AND  (flrpt_period_id=pPeriodid)
                                 AND  (flrpt_interval=pInterval)
-                                AND  (flrpt_username=getEffectiveXtUser()))
+--                              AND  (flrpt_username=_username)
+                                )
                             ), 1) + 1),
                   pLevel, _r.type, _r.type_id,
                   _r.beginning, _r.ending,
@@ -411,7 +385,7 @@ BEGIN
            WHERE ((flrpt_flhead_id=pFlheadid)
              AND  (flrpt_period_id=pPeriodid)
              AND  (flrpt_interval=pInterval)
-             AND  (flrpt_username=getEffectiveXtUser())
+--           AND  (flrpt_username=_username)
              AND  (flrpt_type='G')
              AND  (flrpt_type_id=pFlgrpid));
         ELSE
@@ -426,7 +400,7 @@ BEGIN
            WHERE ((flrpt_flhead_id=pFlheadid)
              AND  (flrpt_interval=pInterval)
              AND  (flrpt_period_id=pPeriodid)
-             AND  (flrpt_username=getEffectiveXtUser())
+--           AND  (flrpt_username=_username)
              AND  (flrpt_type='G')
              AND  (flrpt_type_id=pFlgrpid));
         END IF;
@@ -448,13 +422,14 @@ BEGIN
               flrpt_beginningprcnt, flrpt_endingprcnt,
               flrpt_debitsprcnt, flrpt_creditsprcnt, flrpt_budgetprcnt, flrpt_diffprcnt, flrpt_customprcnt,
               flrpt_parent_id, flrpt_altname,flrpt_interval )
-      SELECT pFlheadid, pPeriodid, getEffectiveXtUser(),
+      SELECT pFlheadid, pPeriodid, _username,
              (COALESCE(( SELECT MAX(flrpt_order)
                            FROM flrpt
                           WHERE ((flrpt_flhead_id=pFlheadid)
                             AND  (flrpt_period_id=pPeriodid)
                             AND  (flrpt_interval=pInterval)
-                            AND  (flrpt_username=getEffectiveXtUser()))
+--                          AND  (flrpt_username=_username)
+                                )
                        ), 1) + 1),
              pLevel, 'T', -1,
              CASE WHEN (flgrp_showstart) THEN flrpt_beginning
@@ -509,7 +484,7 @@ BEGIN
          AND  (flrpt_flhead_id=pFlheadid)
          AND  (flrpt_period_id=pPeriodid)
          AND  (flrpt_interval=pInterval)
-         AND  (flrpt_username=getEffectiveXtUser())
+--       AND  (flrpt_username=_username)
          AND  (flrpt_type='G')
          AND  (flrpt_type_id=pFlgrpid));
     END IF;
diff --git a/test/database/financialreport.js b/test/database/financialreport.js
new file mode 100644 (file)
index 0000000..346ce0a
--- /dev/null
@@ -0,0 +1,90 @@
+/*jshint trailing:true, white:true, indent:2, strict:true, curly:true,
+  immed:true, eqeqeq:true, forin:true, latedef:true,
+  newcap:true, noarg:true, undef:true */
+/*global XT:true, describe:true, it:true, require:true, __dirname:true, before:true */
+
+var _ = require("underscore"),
+  assert = require('chai').assert,
+  path = require('path');
+
+(function () {
+  "use strict";
+
+  describe('The financialReport function', function () {
+
+    var loginData = require(path.join(__dirname, "../lib/login_data.js")).data,
+      datasource = require('../../../xtuple/node-datasource/lib/ext/datasource').dataSource,
+      config = require(path.join(__dirname, "../../node-datasource/config.js")),
+      creds = _.extend({}, config.databaseServer, {database: loginData.org}),
+      oldval    = -98.76,       // makes it easy to spot in test failures
+      changeval = 123.45,
+      freSql = "select financialreport(flhead_id, period_id, 'M', -1) as fr"
+             + "  from flhead, period"
+             + " where flhead_name = 'Basic Balance Sheet'"
+             + "   and current_date between period_start and period_end;",
+      valueSql = " select cast(sum(flrpt_ending) as text) as value"
+               + "   from flrpt"
+               + "   join accnt on flrpt_accnt_id = accnt_id"
+               + " where accnt_descrip = 'Cash at eBank'"
+               + ";";
+      ;
+    this.timeout(10*1000);      // the fre ain't speedy
+
+    it("should generate financial report data", function (done) {
+      datasource.query(freSql, creds, function (err, res) {
+        assert.equal(res.rowCount, 1);
+        assert.isTrue(res.rows[0].fr);
+        done();
+      });
+    });
+
+    it("should get the starting net asset value", function (done) {
+      datasource.query(valueSql, creds, function (err, res) {
+        assert.equal(res.rowCount, 1);
+        oldval = Number(res.rows[0].value);
+        done();
+      });
+    });
+
+    it("should insert a gl transaction", function (done) {
+      var sql = "select insertgltransaction('G/L', 'ST', 'FREtest',"
+              + "  'testing financialreport()', cr.accnt_id, dr.accnt_id,"
+              + "  -1, " + changeval + ", period_end) AS result"
+              + "  from accnt cr, accnt dr, period"
+              + " where cr.accnt_descrip = 'Cash at eBank'"
+              + "   and dr.accnt_descrip = 'Deferred Revenue'"
+              + "   and current_date between period_start and period_end;"
+              + valueSql;
+      datasource.query(sql, creds, function (err, res) {
+        assert.equal(res.rowCount, 1);
+        assert.isTrue(res.rows[0].result > 0);
+        done();
+      });
+    });
+
+    it("should regenerate financial report data", function (done) {
+      datasource.query(freSql, creds, function (err, res) {
+        assert.equal(res.rowCount, 1);
+        assert.isTrue(res.rows[0].fr);
+        done();
+      });
+    });
+
+    it("should show a net asset value change", function (done) {
+      datasource.query(valueSql, creds, function (err, res) {
+        assert.equal(res.rowCount, 1);
+        var newval = Number(res.rows[0].value);
+        assert.closeTo(oldval - newval, changeval, 0.001);
+        done();
+      });
+    });
+
+    after(function (done) {
+      done();   // is there anything to clean up?
+    });
+
+  });
+}());
+
+
+