Payment terms related functions moved to separate file, common function for calculati...
[fa-stable.git] / includes / db / sql_functions.inc
index febc3af824e4f1246be0f9659a7a6aced26616ab..56392e6d9fdb7eef8c2edbd838cb7517ab2d512e 100644 (file)
 //-------------------------------------------------------------------
 // Multilevel transaction control.
 //
+$transaction_level = 0;
+$transaction_data = null;
 
-function begin_transaction()
+function begin_transaction($func=null, $args=null)
 {
-       global $transaction_level; // set in set_global_connection()
+       global $transaction_level, $transaction_data, $SysPrefs;
 
        if (!$transaction_level) {
+               if ($SysPrefs->db_trail) {
+                       $bt = debug_backtrace();
+                       $user = $_SESSION["wa_current_user"]->user;
+                       $transaction_data = array(
+                               'user' => $_SESSION["wa_current_user"]->user,
+                               'msg'=> basename($bt[count($bt)-1]['file']).'@'.$bt[count($bt)-1]['line'], // call start point
+                               'entry' => $func,
+                               'data' => serialize($args),
+                       );
+               }
                db_query("BEGIN", "could not start a transaction");
        }
        $transaction_level++;
@@ -28,11 +40,22 @@ function begin_transaction()
 
 function commit_transaction()
 {
-       global $transaction_level;
+       global $transaction_level, $transaction_data, $SysPrefs, $db_last_inserted_id, $db;
 
        $transaction_level--;
 
        if (!$transaction_level) {
+               // FIXME: if logged to table remember to preserve last_insert_id!
+               if ($SysPrefs->db_trail == 1) {
+                       $last_insert = $db_last_inserted_id;
+                       $db_last_inserted_id = mysqli_insert_id($db);   // preserve in case trail insert is done
+                       $sql = "INSERT INTO ".TB_PREF."db_trail (user, msg, entry, data) VALUES ("
+                                       ."'".$transaction_data['user']."','".$transaction_data['msg']."','".$transaction_data['entry']."',"
+                                       .db_escape($transaction_data['data']).")";
+                       db_query($sql, 'cannot log user operation');
+                       $db_last_inserted_id = $last_insert;
+               } elseif ($SysPrefs->db_trail == 2)
+                       error_log($transaction_data['msg'].'|'.$transaction_data['user'].'|'.$transaction_data['entry'].'|'.$transaction_data['data']);
                db_query("COMMIT", "could not commit a transaction");
        }
 }
@@ -48,6 +71,7 @@ function cancel_transaction()
        if ($transaction_level) {
                db_query("ROLLBACK", "could not cancel a transaction"); 
        }
+       $transaction_level = 0;
 }
 
 //-----------------------------------------------------------------------------
@@ -59,4 +83,51 @@ function update_record_status($id, $status, $table, $key) {
                
        db_query($sql, "Can't update record status");
 }
-?>
+//-----------------------------------------------------------------------------
+//
+//     Helper for sql subquery returning running totals from delta tables like stock_moves or bank_trans
+//
+//     $table - table name with optional WHERE clause
+//  $column - delta column
+//     $index  - comma delimited list of columns for total grouping and order
+//  Returns running totals with respective index column
+//
+function running_total_sql($table, $column, $index)
+{
+
+       return "SELECT daily.$index, daily.$column, (@total:=@total+daily.$column) total 
+               FROM
+                       (SELECT $index, sum($column) $column FROM $table GROUP BY $index ORDER BY $index) daily,
+                       (SELECT @total:=0) total_var";
+}
+
+/*
+       Return number of records in tables, where some foreign key $id is used.
+       $id - searched key value
+       $tables - array of table names (without prefix); when table name is used as a key, then
+               value is name of foreign key field. For numeric keys $stdkey field name is used.
+       $stdkey - standard name of foreign key.
+*/
+function key_in_foreign_table($id, $tables, $stdkey)
+{
+
+       if (!is_array($tables))
+               $tables = array($tables);
+
+       $sqls = array();
+       foreach ($tables as $tbl => $key) {
+               if (is_numeric($tbl)) {
+                       $tbl = $key;
+                       $key = $stdkey;
+               }
+               $sqls[] = "(SELECT COUNT(*) as cnt FROM `".TB_PREF."$tbl` WHERE `$key`=".db_escape($id).")\n";
+       }
+
+       $sql = "SELECT sum(cnt) FROM (". implode(' UNION ', $sqls).") as counts";
+
+       $result = db_query($sql, "check relations for ".implode(',',$tables)." failed");
+       $count = db_fetch($result);
+
+       return $count[0];
+}
+