| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- <?php
- Lib::loadClass('BaseModel');
- class ProcesLogModel extends BaseModel {
- function __construct($dao) {
- parent::__construct($dao);
- $this->fields['ID'] = '';
- $this->fields['TYPE'] = '';
- $this->fields['ID_PROCES_INIT'] = '';
- $this->fields['ID_STEP'] = '';// ID procesu
- $this->fields['ID_STEP_WSKAZNIK'] = '';// ID wskaznika w danym procesie ID_STEP
- $this->fields['ID_STANOWISKA'] = '';// ID stanowisk kroku aktualnie do wykonania
- $this->fields['ID_USER'] = '';// 0 - nie przypisane - patrz ID_STANOWISKA, przypisane do konkretnego stanowiska
- $this->fields['ID_KEY'] = '';// ID from external table - defined in ID_STEP_WSKAZNIK (parent zasob table), TODO: clear after next step? Yes
- $this->fields['A_UPDATE_ZASOB_ID'] = '';
- $this->fields['A_UPDATE_HIST_ID'] = '';
- $this->fields['log'] = '';
- //$this->fields['TIMESTAMPP'] = '';// automatic field - not used
- $this->fields['A_RECORD_CREATE_DATE'] = '';
- $this->fields['A_RECORD_CREATE_AUTHOR'] = '';
- $this->fields['A_RECORD_UPDATE_DATE'] = '';
- $this->fields['A_RECORD_UPDATE_AUTHOR'] = '';
- }
- /**
- * Get list of next step (Proces).
- * @returns array [ID] = DESC
- * TODO: use IF_GO_TO
- */
- function get_next_step() {
- $ret = array();
- if (!$this->get('ID')) {
- return $ret;
- }
- $cur_step_id = $this->get('ID_STEP');
- if ($cur_step_id <= 0) {
- $cur_step_id = $this->get('ID_PROCES_INIT');
- }
- $ret = $this->dao->get_proces_next_steps($cur_step_id);
- return $ret;
- }
- /**
- * Get list of next step wskaznik (Proces).
- * @returns wskaznik
- */
- function get_next_step_wskaznik() {
- $ret = null;
- if (!$this->get('ID')) {
- return $ret;
- }
- $cur_step_id = $this->get('ID_STEP');
- if ($cur_step_id <= 0) {
- $cur_step_id = $this->get('ID_PROCES_INIT');
- }
- $wsk_grouped = $this->get_wskazniki_grouped($cur_step_id);
- if (empty($wsk_grouped)) {
- return $ret;
- }
- $wsk_grouped_keys = array_keys($wsk_grouped);
- $cur_step_wsk_id = $this->get('ID_STEP_WSKAZNIK');
- // check if current id_step_wsk is set to last group
- if ($cur_step_wsk_id > 0) {
- if ($cur_step_wsk_id == end($wsk_grouped_keys) && $this->get('ID_KEY') > 0) {
- return $ret;// is finished
- }
- }
- // set default id_step_wsk if not set
- if (!in_array($cur_step_wsk_id, $wsk_grouped_keys)) {
- $cur_step_wsk_id = reset($wsk_grouped_keys);
- }
- // find current and return next
- $found_current = false;
- foreach ($wsk_grouped as $k_wsk_id => $v_edit) {
- if ($found_current) {
- return $v_edit;
- }
- if ($k_wsk_id == $cur_step_wsk_id) {
- $found_current = true;
- }
- }
- return $ret;
- }
- /**
- *
- * @retruns array of wskazniki - grouped
- * [first wsk id] => ProcesLogEdit
- * Cache in PROCES_LOG_WSK_GROUPED = array( log_id => array( step_id => array( wsk_id => array from ProcesLogEdit->to_array() ) ) )
- */
- function get_wskazniki_grouped($step_id) {
- static $_wsk;// TODO: save to ses by $this->get('ID') and $step_id
- if (!is_array($_wsk)) $_wsk = array();
- Lib::loadClass('ProcesLogEdit');
- if (!empty($_wsk[$step_id])) {
- // update _last_id_key in ProcesLogEdit
- foreach ($_wsk[$step_id] as $k_wsk_id => $v_plog_edit) {
- $v_plog_edit->set_last_id_key($this->get('ID_KEY'));
- $_SESSION['PROCES_LOG_WSK_GROUPED'][$this->get('ID')][$step_id][$k_wsk_id] = $v_plog_edit->to_array();
- }
- return $_wsk[$step_id];
- }
- $cache_on = false;
- if (empty($_SESSION['PROCES_LOG_WSK_GROUPED'])) $_SESSION['PROCES_LOG_WSK_GROUPED'] = array();
- if ($cache_on && !empty($_SESSION['PROCES_LOG_WSK_GROUPED'][$this->get('ID')][$step_id])) {
- $_wsk[$step_id] = array();
- foreach ($_SESSION['PROCES_LOG_WSK_GROUPED'][$this->get('ID')][$step_id] as $k_wsk_id => $v_plog_edit_array) {
- $_wsk[$step_id][$k_wsk_id] = new ProcesLogEdit($this->get('ID'), $k_wsk_id);
- $_wsk[$step_id][$k_wsk_id]->from_array($v_plog_edit_array);
- }
- DEBUG_S(1, "wsk from ses:", $_SESSION['PROCES_LOG_WSK_GROUPED'][$this->get('ID')][$step_id], __FILE__, __FUNCTION__, __LINE__);
- DEBUG_S(1, "wsk from ses done:", $_wsk[$step_id], __FILE__, __FUNCTION__, __LINE__);
- }
- else {
- $_wsk[$step_id] = array();
- $wskazniki = $this->dao->get_wskazniki($step_id);
- $wskazniki_tables = $this->dao->get_wskazniki_parent_tables($wskazniki);
- DEBUG_S(1, "wskazniki:", $wskazniki, __FILE__, __FUNCTION__, __LINE__);
- DEBUG_S(1, "wskazniki_tables:", $wskazniki_tables, __FILE__, __FUNCTION__, __LINE__);
- // TYPE to search parents: KOMORKA, TODO: add DANE
- $children_types = array('KOMORKA');
- if (!empty($wskazniki_tables)) {
- // add _tbl_parent
- foreach ($wskazniki as $k_id => $v_wsk) {
- if (!in_array($v_wsk->TYPE, $children_types)) {
- continue;// eg. pomin TYPE='TABELA'
- }
- if (array_key_exists($v_wsk->ID, $wskazniki_tables)) {
- $v_wsk->_tbl_parent = $wskazniki_tables[$v_wsk->ID];
- // TODO: find parent zasob ID
- if (!is_object($v_wsk->_tbl_parent)) {
- $v_wsk->_tbl_parent = $wskazniki_tables[$v_wsk->_tbl_parent];
- }
- if (!is_object($wskazniki[$k_id]->_tbl_parent)) {
- $v_wsk->_tbl_parent = $wskazniki_tables[$v_wsk->_tbl_parent];
- }
- } else {
- // no zasob ID in tables tree
- }
- }
- DEBUG_S(1, "wskazniki 2:", $wskazniki, __FILE__, __FUNCTION__, __LINE__);
- $last_group_wsk_id = 0;
- foreach ($wskazniki as $k_id => $v_wsk) {
- if (isset($v_wsk->_tbl_parent)) {
- if ($last_group_wsk_id == 0) {
- $last_group_wsk_id = $k_id;
- }
- if (!array_key_exists($last_group_wsk_id, $_wsk[$step_id])) {
- $_wsk[$step_id][$last_group_wsk_id] = new ProcesLogEdit($this->get('ID'), $last_group_wsk_id);
- $_wsk[$step_id][$last_group_wsk_id]->set_tbl_zasob_id($v_wsk->_tbl_parent->ID);
- // set_last_id_key if action is done - ID_KEY is set
- if ($this->get('ID_KEY') > 0 && $last_group_wsk_id == $this->get('ID_STEP_WSKAZNIK')) {
- $_wsk[$step_id][$last_group_wsk_id]->set_last_id_key($this->get('ID_KEY'));
- }
- }
- $_wsk[$step_id][$last_group_wsk_id]->add_komorka($v_wsk);
- } else {
- $last_group_wsk_id = 0;
- }
- }
- }
- DEBUG_S(1, "wsk[" . $step_id . "]:", $_wsk[$step_id], __FILE__, __FUNCTION__, __LINE__);
- // save data into SES cache
- if (!empty($_wsk[$step_id])) {
- foreach ($_wsk[$step_id] as $k_wsk_id => $v_plog_edit) {
- $sql_types = $this->dao->get_sql_types($v_plog_edit->get_table_name());
- DEBUG_S(1, "sql_types:", $sql_types, __FILE__, __FUNCTION__, __LINE__);
- $v_plog_edit->set_komorki_sql_types($sql_types);
- $_SESSION['PROCES_LOG_WSK_GROUPED'][$this->get('ID')][$step_id][$k_wsk_id] = $v_plog_edit->to_array();
- }
- $this->_garbage_collection();
- DEBUG_S(1, "wsk[" . $step_id . "] save into SES:", $_SESSION['PROCES_LOG_WSK_GROUPED'][$this->get('ID')][$step_id], __FILE__, __FUNCTION__, __LINE__);
- }
- }
- return $_wsk[$step_id];
- }
- /**
- * Garbage collection (GC) is a form of automatic memory management.
- */
- function _garbage_collection() {
- $max_cache_log_count = 10;// save 3 last log
- $max_cache_step_count = 10;// save 10 last steps
- if (empty($_SESSION['PROCES_LOG_WSK_GROUPED'])) $_SESSION['PROCES_LOG_WSK_GROUPED'] = array();
- if (count($_SESSION['PROCES_LOG_WSK_GROUPED']) > $max_cache_log_count) {
- // TODO: remove from the beginnig of array - without current log id $this->get('ID')
- DEBUG_S(1, "TODO: PROCES_LOG_WSK_GROUPED remove LOG $max_cache_log_count:", $_SESSION['PROCES_LOG_WSK_GROUPED'], __FILE__, __FUNCTION__, __LINE__);
- }
- if (count($_SESSION['PROCES_LOG_WSK_GROUPED'][$this->get('ID')]) > $max_cache_step_count) {
- // TODO: remove from the beginnig of array - without current step id
- DEBUG_S(1, "TODO: PROCES_LOG_WSK_GROUPED remove STEP $max_cache_step_count:", $_SESSION['PROCES_LOG_WSK_GROUPED'][$this->get('ID')], __FILE__, __FUNCTION__, __LINE__);
- }
- }
- /**
- *
- * @returns ProcesLogEdit object or null
- */
- function get_current_edit() {
- $ret = null;
- if ($this->get('TYPE') == 'END') {
- return $ret;
- }
- $wsk_group = $this->get_wskazniki_grouped($this->get('ID_STEP'));
- if (empty($wsk_group)) {
- return $ret;
- }
- $cur_wsk_id = null;
- if ($this->get('ID_STEP_WSKAZNIK') > 0) {
- if (array_key_exists($this->get('ID_STEP_WSKAZNIK'), $wsk_group)) {
- $cur_wsk_id = $this->get('ID_STEP_WSKAZNIK');
- } else {
- // TODO: Error w danych ID_STEP_WSKAZNIK!
- }
- }
- if (!$cur_wsk_id) {
- $cur_wsk_id = reset(array_keys($wsk_group));
- }
- if ($cur_wsk_id) {
- $ret = $wsk_group[$cur_wsk_id];
- }
- return $ret;
- }
- /**
- * Check if current step is finished.
- * @returns boolean.
- */
- function is_step_finished() {
- // TODO: ID_STEP_WSKAZNIK is in the end of array of wskazniki grouped by TABELA and record ID is saved, found (ID_KEY)
- $wsk_grouped = $this->get_wskazniki_grouped($this->get('ID_STEP'));
- if (empty($wsk_grouped)) {
- return true;
- } else {
- if ($this->get('ID_STEP_WSKAZNIK') > 0) {
- if ($this->get('ID_STEP_WSKAZNIK') == end(array_keys($wsk_grouped)) && $this->get('ID_KEY') > 0) {
- return true;
- }
- } else {
- return false;
- }
- }
- return false;
- }
- /**
- * Check if allow to move to next step.
- * @returns boolean.
- */
- function allow_next_step($next_id) {
- if (!$this->is_step_finished()) {
- return false;
- }
- $next_processes = $this->get_next_step();
- return array_key_exists($next_id, $next_processes);
- }
- /**
- * Check if allow to move to next step.
- * @returns boolean.
- */
- function allow_next_step_wskaznik($next_wsk_id) {
- if ($this->is_step_finished()) {
- return false;
- }
- $next_step_wsk = $this->get_next_step_wskaznik();
- if ($next_step_wsk != null && $next_step_wsk->get_log_wsk_id() == $next_wsk_id) {
- return true;
- }
- return false;
- }
- /**
- * Check if allow to move to end.
- * @returns boolean.
- */
- function allow_end() {
- $next_step_list = $this->get_next_step();
- if (empty($next_step_list)) {
- if ($this->is_step_finished()) {
- return true;
- }
- }
- return false;
- }
- /**
- * Change ProcesLog state to next step.
- * @returns true / false
- */
- function go_to_next_step($next_id) {
- // get proces
- // get wskazniki for this proces
- $wskazniki = ProcesHelper::get_wskazniki($next_id);
- $wsk_stanowiska = array();// [ID wskaznika] = ID zasobu (stanowiska)
- foreach ($wskazniki as $k => $v_wsk) {
- if ($v_wsk->TYPE == 'STANOWISKO') {
- $wsk_stanowiska [$v_wsk->CW_ID] = $v_wsk->ID;
- }
- }
- if (!empty($wsk_stanowiska)) {
- $this->set('ID_USER', 0);
- $this->set('ID_STANOWISKA', implode(",", array_values($wsk_stanowiska)));
- }
- $this->set('TYPE', 'STEP');// always set to STEP after update
- $this->set('ID_STEP', $next_id);
- $this->set('ID_STEP_WSKAZNIK', '');
- $this->set('ID_KEY', 0);// clear key ID - used only in _HIST
- $this->set('A_UPDATE_ZASOB_ID', 0);// clear key A_UPDATE_ZASOB_ID - used only in _HIST
- $this->set('A_UPDATE_HIST_ID', 0);// clear key A_UPDATE_HIST_ID - used only in _HIST
- if ($this->dao->save($this)) {
- return true;
- }
- return false;
- }
- /**
- * Change ProcesLog state to next step wskaznik.
- * @returns true / false
- */
- function go_to_next_step_wskaznik($next_wsk_id) {
- $wskazniki_grouped = $this->get_wskazniki_grouped($this->get('ID_STEP'));
- if (!array_key_exists($next_wsk_id, $wskazniki_grouped)) {
- return false;
- }
- // TODO: verify if $next_wsk_id is after current wskaznik
- $this->set('TYPE', 'STEP');// always set to STEP after update
- //$this->set('ID_STEP', );// dont change
- $this->set('ID_STEP_WSKAZNIK', $next_wsk_id);
- $this->set('ID_KEY', 0);// clear key ID - used only in _HIST
- $this->set('A_UPDATE_ZASOB_ID', 0);// clear key A_UPDATE_ZASOB_ID - used only in _HIST
- $this->set('A_UPDATE_HIST_ID', 0);// clear key A_UPDATE_HIST_ID - used only in _HIST
- if ($this->dao->save($this)) {
- return true;
- }
- return false;
- }
- /**
- * Change ProcesLog state quit.
- * @returns true / false
- */
- function go_to_end() {
- $this->set('TYPE', 'END');
- $this->set('ID_STEP', 0);
- $this->set('ID_STEP_WSKAZNIK', 0);
- $this->set('ID_STANOWISKA', '');
- $this->set('ID_KEY', 0);
- $this->set('A_UPDATE_ZASOB_ID', 0);
- $this->set('A_UPDATE_HIST_ID', 0);
- if ($this->dao->save($this)) {
- return true;
- }
- return false;
- }
- }
|