Bläddra i källkod

added HIST tables for values in child nodes

Piotr Labudda 9 år sedan
förälder
incheckning
14849290cc

+ 80 - 19
SE/se-lib/Core/AclHelper.php

@@ -354,27 +354,81 @@ class Core_AclHelper {// Helper class for Acl
     DB::getPDO()->exec("
     DB::getPDO()->exec("
       CREATE TABLE IF NOT EXISTS `{$instanceTable}` (
       CREATE TABLE IF NOT EXISTS `{$instanceTable}` (
         `PRIMARY_KEY` int(11) NOT NULL,
         `PRIMARY_KEY` int(11) NOT NULL,
-        `REMOTE_PRIMARY_KEY` int(11) NOT NULL,
-        `A_STATUS` enum('WAITING', 'NORMAL', 'DELETED') NOT NULL DEFAULT 'WAITING',
-        `A_RECORD_UPDATE_DATE` timestamp ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-        -- TODO `TRANACTION_ID` int(11) NOT NULL
-        KEY `PRIMARY_KEY` (`PRIMARY_KEY`),
-        KEY `REMOTE_PRIMARY_KEY` (`REMOTE_PRIMARY_KEY`)
+        `A_RECORD_UPDATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+        `INSTANCE_NAME` varchar(255) NOT NULL,
+        UNIQUE KEY `PRIMARY_KEY` (`PRIMARY_KEY`),
+        KEY `INSTANCE_NAME` (`INSTANCE_NAME`)
+        -- TODO `A_TRANACTION_ID` int(11) NOT NULL DEFAULT 0
+      ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
+    ");
+    DB::getPDO()->exec("
+      CREATE TABLE IF NOT EXISTS `{$instanceTable}_HIST` (
+        `ID` int(11) NOT NULL AUTO_INCREMENT,
+        `PRIMARY_KEY` int(11) NOT NULL,
+        `A_TRANACTION_ID` int(11) NOT NULL DEFAULT 0,
+        `A_RECORD_UPDATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+        `INSTANCE_NAME` varchar(255) NOT NULL,
+        PRIMARY KEY (`ID`),
+        KEY `PRIMARY_KEY` (`PRIMARY_KEY`)
       ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
       ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
     ");
     ");
-    try {
-      DB::getPDO()->exec(" ALTER TABLE `{$instanceTable}` ADD `A_STATUS` enum('WAITING', 'NORMAL', 'DELETED') NOT NULL DEFAULT 'WAITING' ");
-    } catch (Exception $e) {
-      // echo 'C.'.get_class($this).' L.' . __LINE__ . " Error:";print_r($e->getMessage());echo "\n";
-    }
-    try {
-      DB::getPDO()->exec(" ALTER TABLE `{$instanceTable}` ADD `A_RECORD_UPDATE_DATE` timestamp ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ");
-    } catch (Exception $e) {
-      // echo 'C.'.get_class($this).' L.' . __LINE__ . " Error:";print_r($e->getMessage());echo "\n";
-    }
     $cacheInstanceTables[] = $instanceTable;
     $cacheInstanceTables[] = $instanceTable;
     return $instanceTable;
     return $instanceTable;
   }
   }
+  public static function setInstance($rootTableName, $pk, $instanceName, $idTransaction = 0) {
+    $instanceTable = self::getInstanceTable($rootTableName);
+    $pk = intval($pk);
+    // TODO: if $pk < 0 throw new Exception("...");
+    $sql = [
+      'instanceName' => DB::getPDO()->quote($instanceName, PDO::PARAM_STR),
+      'idTransaction' => intval($idTransaction)
+    ];
+    DB::getPDO()->exec("
+      insert into `{$instanceTable}_HIST` (`PRIMARY_KEY`, `INSTANCE_NAME`, `A_TRANACTION_ID`)
+        values({$pk}, {$sql['instanceName']}, {$idTransaction})
+    ");
+  }
+
+  public static function getChildHistTable($rootTableName, $childName, $schema) {
+    // $childName(id) => Array:
+    //     [@type] => xsd:integer
+    // $childName(created) => Array:
+    //     [@type] => xsd:date
+    // $childName(worker) => Array:
+    //     [@ref] => default_objects/AccessOwner
+    // $childName(kwota) => Array:
+    //     [@type] => xsd:decimal
+    //     [@totalDigits] => 16
+    //     [@fractionDigits] => 2
+    // $childName(nierozliczona_kwota) => Array:
+    //     [@type] => xsd:decimal
+    //     [@totalDigits] => 16
+    //     [@fractionDigits] => 2
+    // $childName(pozycja) => Array:
+    //     [@ref] => ZaliczkaPozycja
+    //     [@maxOccurs] => unbounded
+    static $cacheHistTables = array();
+    $histTable = "{$rootTableName}__#HIST__{$childName}";
+    if (in_array($histTable, $cacheHistTables)) return $histTable;
+    $sqlType = '';
+    switch ($schema['@type']) {
+      case 'xsd:integer': $sqlType = "int(11) NOT NULL DEFAULT 0"; break;
+      case 'xsd:date': $sqlType = "date DEFAULT NULL"; break;
+      case 'xsd:decimal': $sqlType = "decimal(" . V::get('@totalDigits', 16, $schema) . ", " . V::get('@fractionDigits', 2, $schema) . ") NOT NULL DEFAULT 0"; break;
+    }
+    if (!$sqlType && !empty($schema['@ref'])) $sqlType = "int(11) NOT NULL DEFAULT 0";
+    if (!$sqlType) throw new Exception("Unimplemented schema to sql for '{$rootTableName}/{$childName}' schema(".json_encode($schema).")");
+    DB::getPDO()->exec("
+      CREATE TABLE IF NOT EXISTS `{$histTable}` (
+        `ID` int(11) NOT NULL AUTO_INCREMENT,
+        `VALUE` {$sqlType},
+        `A_TRANSACTION_ID` int(11) NOT NULL DEFAULT 0,
+        PRIMARY KEY (`ID`)
+      ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
+    ");
+    $cacheHistTables[] = $histTable;
+    return $histTable;
+  }
 
 
   public static function getTransactionTable($rootTableName) {
   public static function getTransactionTable($rootTableName) {
     static $cacheTransactionTables = array();
     static $cacheTransactionTables = array();
@@ -382,7 +436,7 @@ class Core_AclHelper {// Helper class for Acl
     if (in_array($transactionTable, $cacheTransactionTables)) return $transactionTable;
     if (in_array($transactionTable, $cacheTransactionTables)) return $transactionTable;
     DB::getPDO()->exec("
     DB::getPDO()->exec("
       CREATE TABLE IF NOT EXISTS `{$transactionTable}` (
       CREATE TABLE IF NOT EXISTS `{$transactionTable}` (
-        `ID` int(11) NOT NULL,
+        `ID` int(11) NOT NULL AUTO_INCREMENT,
         `A_ACTION_ID_USER` int(11) DEFAULT NULL, -- NULL for scripts
         `A_ACTION_ID_USER` int(11) DEFAULT NULL, -- NULL for scripts
         `A_ACTION_AUTHOR` varchar(255) NOT NULL DEFAULT '',
         `A_ACTION_AUTHOR` varchar(255) NOT NULL DEFAULT '',
         `A_ACTION_DATE` timestamp ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
         `A_ACTION_DATE` timestamp ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -407,11 +461,18 @@ class Core_AclHelper {// Helper class for Acl
   }
   }
 
 
   public static function rollbackTransaction($rootTableName, $idTransaction) {
   public static function rollbackTransaction($rootTableName, $idTransaction) {
-    // TODO: rollbackTransaction
+    // TODO: ROLLBACK - do nothing
   }
   }
 
 
-  public static function commitTransaction($rootTableName, $idTransaction) {
+  public static function commitTransaction($idTransaction, $simpleSchema_or_acl) {
     // TODO: COMMIT
     // TODO: COMMIT
+    // TODO: save changes to rootTableName and every childrens - recurence
+  }
+
+  public static function commitContextTransaction($rootTableName, $rootIdTransaction, $simpleSchema_or_acl_for_child) {
+    // TODO: COMMIT - changes for childrens
+    // TODO: find transaction with context transaction like "{$rootTableName}.{$rootIdTransaction}" = A_CONTEXT_TRANSACTION
+    // TODO: save changes to rootTableName and every childrens - recurence
   }
   }
 
 
 }
 }

+ 29 - 19
SE/se-lib/Route/UrlAction/UserProNetMediaZaliczka.php

@@ -221,23 +221,27 @@ window.location.href='{$redirectUrl}';
 				")
 				")
 			]);
 			]);
 
 
-			$tableList = DB::getPDO()->fetchAll("
-				select t.TABLE_NAME
-				from `information_schema`.`COLUMNS` t
-				where t.TABLE_SCHEMA = 'SES_USERS2'
-					and (t.TABLE_NAME like 'ZALICZKA'
-						or t.TABLE_NAME like 'ZALICZKA\_\_%'
-						or t.TABLE_NAME like 'ZALICZKA_HIST'
-						or t.TABLE_NAME like 'Zaliczka\_\_%'
-						or t.TABLE_NAME like 'ZALICZKA_POZYCJA'
-						or t.TABLE_NAME like 'ZALICZKA_POZYCJA\_\_%'
-						or t.TABLE_NAME like 'ZALICZKA_POZYCJA_HIST'
-						or t.TABLE_NAME like 'ZaliczkaPozycja\_\_%'
-					)
-				group by t.TABLE_NAME
-			");
-			foreach ($tableList as $table) {
-				$tableName = $table['TABLE_NAME'];
+			$tableList = array_map(
+				function($item) {
+					return $item['TABLE_NAME'];
+				}
+				, DB::getPDO()->fetchAll("
+						select t.TABLE_NAME
+						from `information_schema`.`COLUMNS` t
+						where t.TABLE_SCHEMA = 'SES_USERS2'
+							and (t.TABLE_NAME like 'ZALICZKA'
+								or t.TABLE_NAME like 'ZALICZKA\_\_%'
+								or t.TABLE_NAME like 'ZALICZKA_HIST'
+								or t.TABLE_NAME like 'Zaliczka\_\_%'
+								or t.TABLE_NAME like 'ZALICZKA_POZYCJA'
+								or t.TABLE_NAME like 'ZALICZKA_POZYCJA\_\_%'
+								or t.TABLE_NAME like 'ZALICZKA_POZYCJA_HIST'
+								or t.TABLE_NAME like 'ZaliczkaPozycja\_\_%'
+							)
+						group by t.TABLE_NAME
+					")
+			);
+			foreach ($tableList as $tableName) {
 				UI::startTag('div', ['style'=>"margin:10px 0; max-width:100%; overflow:scroll; border:1px solid #ccc"]);
 				UI::startTag('div', ['style'=>"margin:10px 0; max-width:100%; overflow:scroll; border:1px solid #ccc"]);
 				UI::table([
 				UI::table([
 					'caption' => "Tabela '{$tableName}'",
 					'caption' => "Tabela '{$tableName}'",
@@ -250,14 +254,20 @@ window.location.href='{$redirectUrl}';
 			}
 			}
 
 
 			if ('1' == V::get('_clear', '', $_GET)) {
 			if ('1' == V::get('_clear', '', $_GET)) {
-				foreach ($tableList as $table) {
-					$tableName = $table['TABLE_NAME'];
+				foreach ($tableList as $tableName) {
 					DB::getPDO()->exec("TRUNCATE `{$tableName}`");
 					DB::getPDO()->exec("TRUNCATE `{$tableName}`");
 				}
 				}
 				UI::tag('a', ['class'=>"btn btn-primary", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall"], "Dane usunięte - odśwież stronę");
 				UI::tag('a', ['class'=>"btn btn-primary", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall"], "Dane usunięte - odśwież stronę");
 			} else {
 			} else {
 				UI::tag('a', ['class'=>"btn btn-danger", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall&_clear=1"], "Wyczyść tabele");
 				UI::tag('a', ['class'=>"btn btn-danger", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall&_clear=1"], "Wyczyść tabele");
 			}
 			}
+
+			UI::startTag('pre');
+			foreach ($tableList as $tableName) {
+				echo "DROP TABLE `{$tableName}`;\n";
+			}
+			UI::endTag('pre');
+
 			UI::endContainer();
 			UI::endContainer();
 		} catch (Exception $e) {
 		} catch (Exception $e) {
 			UI::alert('danger', $e->getMessage());
 			UI::alert('danger', $e->getMessage());

+ 32 - 17
SE/se-lib/Schema/DefaultDb/zaliczka/ZaliczkaStorageAcl.php

@@ -14,14 +14,14 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
       'created' => 'xsd:date',
       'created' => 'xsd:date',
       'worker' => [ '@ref' => 'default_objects/AccessOwner' ],// 'alias_ref:default_objects:AccessOwner'
       'worker' => [ '@ref' => 'default_objects/AccessOwner' ],// 'alias_ref:default_objects:AccessOwner'
       // 'worker' => [ '@ref' => 'Worker' ],
       // 'worker' => [ '@ref' => 'Worker' ],
-      'kwota' => 'xsd:decimal',
-      'nierozliczona_kwota' => 'xsd:decimal',
+      'kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2 ],
+      'nierozliczona_kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2 ],
       'pozycja' => [ '@ref' => 'ZaliczkaPozycja', '@maxOccurs' => 'unbounded' ]
       'pozycja' => [ '@ref' => 'ZaliczkaPozycja', '@maxOccurs' => 'unbounded' ]
     ],
     ],
     'ZaliczkaPozycja' => [
     'ZaliczkaPozycja' => [
       '@namespace' => 'default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja',// Api_WfsNs::getBaseWfsUri() . '/default_db/Zaliczka'
       '@namespace' => 'default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja',// Api_WfsNs::getBaseWfsUri() . '/default_db/Zaliczka'
       'id' => 'xsd:integer',
       'id' => 'xsd:integer',
-      'kwota' => 'xsd:decimal',
+      'kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2 ],
       'korespondencja' => [ '@ref' => 'Korespondencja' ],
       'korespondencja' => [ '@ref' => 'Korespondencja' ],
       'projekt' => [ '@ref' => 'Projekt' ]
       'projekt' => [ '@ref' => 'Projekt' ]
     ],
     ],
@@ -86,32 +86,41 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
       where u.ID = {$idUser}
       where u.ID = {$idUser}
     ");
     ");
     if (empty($userLogin)) throw new Exception("User not exists ID={$idUser}");
     if (empty($userLogin)) throw new Exception("User not exists ID={$idUser}");
+    DBG::nicePrint($userLogin, '$userLogin');// TODO: DBG
 
 
     $idTransaction = Core_AclHelper::startTransaction('ZALICZKA', $idUser, $userLogin);
     $idTransaction = Core_AclHelper::startTransaction('ZALICZKA', $idUser, $userLogin);
 
 
+    $zaliczkaRefWorker = Core_AclHelper::getRefTable('Zaliczka', 'worker');// `Zaliczka__#REF__worker`
     $idActiveZaliczka = DB::getPDO()->fetchValue("
     $idActiveZaliczka = DB::getPDO()->fetchValue("
-      select MAX(z.ID)
-      from `ZALICZKA` z
-        join `ADMIN_USERS` u on(z.L_APPOITMENT_USER = u.ADM_ACCOUNT)
-      where u.ID = {$idUser}
+      select MAX(t.ID)
+      from `ZALICZKA` t
+        -- join `ADMIN_USERS` u on(t.L_APPOITMENT_USER = u.ADM_ACCOUNT)
+        left join `{$zaliczkaRefWorker}` ref on(ref.PRIMARY_KEY = t.ID and ref.A_STATUS != 'DELETED')
+        left join `ADMIN_USERS` r on(r.ID = ref.REMOTE_PRIMARY_KEY)
+      where r.ID = {$idUser}
+        and t.A_STATUS in('WAITING', 'NORMAL') -- TODO cache use #INSTANCE table
     ");
     ");
-    // TODO:   right join `ZALICZKA__#REF__worker` or `ZALICZKA__#REF__ADMIN_USERS`
+    $zaliczkaRefWorker = Core_AclHelper::getRefTable('Zaliczka', 'worker');// `Zaliczka__#REF__worker`
     DBG::nicePrint("
     DBG::nicePrint("
-      select MAX(z.ID)
-      from `ZALICZKA` z
-        join `ADMIN_USERS` u on(z.L_APPOITMENT_USER = u.ADM_ACCOUNT)
-      where u.ID = {$idUser}
+      select MAX(t.ID)
+      from `ZALICZKA` t
+        -- join `ADMIN_USERS` u on(t.L_APPOITMENT_USER = u.ADM_ACCOUNT)
+        left join `{$zaliczkaRefWorker}` ref on(ref.PRIMARY_KEY = t.ID and ref.A_STATUS != 'DELETED')
+        left join `ADMIN_USERS` r on(r.ID = ref.REMOTE_PRIMARY_KEY)
+      where r.ID = {$idUser}
+        and t.A_STATUS in('WAITING', 'NORMAL') -- TODO cache use #INSTANCE table
     ", 'sql');// TODO: DBG
     ", 'sql');// TODO: DBG
     DBG::nicePrint($idActiveZaliczka, '$idActiveZaliczka');// TODO: DBG
     DBG::nicePrint($idActiveZaliczka, '$idActiveZaliczka');// TODO: DBG
 
 
     $userSaldo = 0;
     $userSaldo = 0;
     if ($idActiveZaliczka > 0) {
     if ($idActiveZaliczka > 0) {
+      $zaliczkaRefPozycja = Core_AclHelper::getRefTable('Zaliczka', 'pozycja');// `Zaliczka__#REF__pozycja`
       $userSaldo = DB::getPDO()->fetchValue("
       $userSaldo = DB::getPDO()->fetchValue("
-    		select z.KWOTA + z.NIEROZLICZONA_KWOTA - sum(p.KWOTA)
-    		from `ZALICZKA` z
-    			left join `ZALICZKA__#REF__ZALICZKA_POZYCJA` z_p on(z_p.PRIMARY_KEY = z.ID and z_p.A_STATUS != 'DELETED')
-    			left join `ZALICZKA_POZYCJA` p on(p.ID = z_p.REMOTE_PRIMARY_KEY)
-        where z.ID = {$idActiveZaliczka}
+    		select t.KWOTA + t.NIEROZLICZONA_KWOTA - sum(r.KWOTA)
+    		from `ZALICZKA` t
+    			left join `{$zaliczkaRefPozycja}` ref on(ref.PRIMARY_KEY = t.ID and ref.A_STATUS != 'DELETED')
+    			left join `ZALICZKA_POZYCJA` r on(r.ID = ref.REMOTE_PRIMARY_KEY)
+        where t.ID = {$idActiveZaliczka}
     	");
     	");
       DBG::nicePrint($userSaldo, '$userSaldo');// TODO: DBG
       DBG::nicePrint($userSaldo, '$userSaldo');// TODO: DBG
     }
     }
@@ -221,6 +230,12 @@ class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaB
 
 
     Core_AclHelper::getTransactionTable('ZALICZKA');// `ZALICZKA__#TRANSACTION`
     Core_AclHelper::getTransactionTable('ZALICZKA');// `ZALICZKA__#TRANSACTION`
     Core_AclHelper::getTransactionTable('ZALICZKA_POZYCJA');// `ZALICZKA_POZYCJA__#TRANSACTION`
     Core_AclHelper::getTransactionTable('ZALICZKA_POZYCJA');// `ZALICZKA_POZYCJA__#TRANSACTION`
+
+    foreach ($this->_simpleSchema['root'] as $childName => $schema) {
+      if ('@' == substr($childName, 0, 1)) continue;
+      Core_AclHelper::getChildHistTable('ZALICZKA', $childName, $schema);
+      DBG::nicePrint($schema, '$childName('.$childName.')');// TODO: DBG
+    }
 	}
 	}
 
 
 }
 }