get_session(); $this->usr_id = $session->get_usr_id(); $this->sselcont_id = (int) $sselcont_id; $this->load(); return $this; } protected function load() { try { $datas = $this->get_data_from_cache(); $this->ssel_id = $datas['ssel_id']; $this->order = $datas['order']; $this->record = new record_adapter($datas['sbas_id'], $datas['record_id'], $this->order); $this->avrDisAgree = $datas['avrDisAgree']; $this->avrAgree = $datas['avrAgree']; $this->is_validation_item = $datas['is_validation_item']; $this->my_agreement = $datas['my_agreement']; $this->my_note = $datas['my_note']; $this->validate_id = $datas['validate_id']; $this->choices = $datas['choices']; $this->avrAgree = $datas['avrAgree']; $this->avrDisAgree = $datas['avrDisAgree']; return $this; } catch (Exception $e) { } $sql = 'SELECT s.usr_id as owner, v.id as validate_id, v.can_see_others, c.base_id, c.record_id, c.ord, c.ssel_id, v.usr_id, d.agreement, d.note, d.updated_on FROM (sselcont c, ssel s) LEFT JOIN (validate v, validate_datas d) ON (d.sselcont_id = c.sselcont_id AND d.validate_id = v.id ) WHERE s.ssel_id = c.ssel_id AND c.sselcont_id = :sselcont_id'; try { $conn = connection::getPDOConnection(); $stmt = $conn->prepare($sql); $stmt->execute(array(':sselcont_id' => $this->sselcont_id)); $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); } catch (Exception $e) { } $first = true; foreach ($rs as $row) { if ($row['validate_id']) { $this->is_validation_item = true; if ($row['owner'] == $this->usr_id) $see_others = true; else $see_others = ($row['can_see_others'] == '1'); if (!$see_others) { if ($row['usr_id'] != $this->usr_id) continue; } } if ($first) { $sbas_id = (int) phrasea::sbasFromBas($row['base_id']); $record_id = (int) $row['record_id']; $this->ssel_id = (int) $row['ssel_id']; $this->order = $number = (int) $row['ord']; $this->record = new record_adapter($sbas_id, $record_id, $number); if ($this->is_validation_item) { $this->choices = array(); $this->avrAgree = 0; $this->avrDisAgree = 0; } $first = false; } if ($this->is_validation_item) { if ($row['usr_id'] == $this->usr_id) { $this->my_agreement = (int) $row['agreement']; $this->my_note = $row['note']; $this->validate_id = (int) $row['validate_id']; } $this->choices[$row['usr_id']] = array( 'usr_id' => $row['usr_id'], 'usr_name' => User_Adapter::getInstance($row['usr_id'], appbox::get_instance())->get_display_name(), 'is_mine' => ($row['usr_id'] == $this->usr_id), 'agreement' => $row['agreement'], 'updated_on' => $row['updated_on'], 'note' => $row['note'] ); $this->avrAgree += $row["agreement"] > 0 ? 1 : 0; $this->avrDisAgree += $row["agreement"] < 0 ? 1 : 0; } } $datas = array( 'ssel_id' => $this->ssel_id , 'sbas_id' => (int) $sbas_id , 'record_id' => $record_id , 'order' => $this->order , 'is_validation_item' => $this->is_validation_item , 'my_agreement' => $this->my_agreement , 'my_note' => $this->my_note , 'validate_id' => $this->validate_id , 'choices' => $this->choices , 'avrAgree' => $this->avrAgree , 'avrDisAgree' => $this->avrDisAgree ); $this->set_data_to_cache($datas); return $this; } public function get_record() { return $this->record; } /** * * @return int */ public function get_order() { return $this->order; } /** * * @param int $number * @return basket_element_adapter */ public function set_order($order) { $this->order = (int) $order; return $this; } /** * @return basket_element_adapter */ public static function getInstance($sselcont_id) { if (!isset(self::$_instance[$sselcont_id])) { self::$_instance[$sselcont_id] = new self($sselcont_id); } return array_key_exists($sselcont_id, self::$_instance) ? self::$_instance[$sselcont_id] : false; } /** * * @param basket_adapter $basket * @param int $base_id * @param int $record_id * @param int $parent_record_id * @param string $adjust_validation_datas * @param boolean $fixing * @return basket_element_adapter */ public static function create(basket_adapter $basket, $base_id, $record_id, $parent_record_id, $adjust_validation_datas, $fixing) { $appbox = appbox::get_instance(); $session = $appbox->get_session(); $user = User_Adapter::getInstance($session->get_usr_id(), $appbox); $sbas_id = phrasea::sbasFromBas($base_id); $record = new record_adapter($sbas_id, $record_id); $ssel_id = $basket->get_ssel_id(); if (!$user->ACL()->has_right_on_base($base_id, 'canputinalbum')) throw new Exception('You do not have rights' . ' to use this document in basket.'); $exists = false; $sql = 'SELECT sselcont_id FROM sselcont WHERE ssel_id = :ssel_id AND base_id = :base_id AND record_id = :record_id '; $stmt = $appbox->get_connection()->prepare($sql); $params = array( ':ssel_id' => $basket->get_ssel_id() , ':base_id' => $base_id , ':record_id' => $record_id ); $stmt->execute($params); $row = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($row) { return new self($row['sselcont_id']); } $connbas = connection::getPDOConnection($sbas_id); if (!$sbas_id) throw new Exception('Unknown database'); if ($parent_record_id && $fixing === false) { if (!$user->ACL()->has_right_on_base($base_id, 'canaddrecord')) throw new Exception('You do not have the right'); if ($record->is_grouping()) throw new Exception('Can\'t add grouping to grouping'); $ord = 0; $sql = "SELECT (max(ord)+1) as ord FROM regroup WHERE rid_parent = :parent_record_id"; $stmt = $connbas->prepare($sql); $stmt->execute(array(':parent_record_id' => $parent_record_id)); $row = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($row) { $ord = is_null($row["ord"]) ? 0 : $row["ord"]; } else { $ord = 0; } $sql = 'INSERT INTO regroup (id, rid_parent, rid_child, dateadd, ord) VALUES (null, :parent_record_id, :record_id, NOW(), :ord)'; $params = array( ':parent_record_id' => $parent_record_id , ':record_id' => $record_id , ':ord' => $ord ); $stmt = $connbas->prepare($sql); $stmt->execute($params); $stmt->closeCursor(); $sql = 'UPDATE record SET moddate = NOW() WHERE record_id = :parent_record_id'; $stmt = $connbas->prepare($sql); $stmt->execute(array(':parent_record_id' => $parent_record_id)); $stmt->closeCursor(); } $sql = 'SELECT max(ord) as ord FROM sselcont WHERE ssel_id = :ssel_id'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(array(':ssel_id' => $basket->get_ssel_id())); $row = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($row) { $ord = (int) $row['ord'] + 1; } else { $ord = 0; } $sql = ' INSERT INTO sselcont (sselcont_id, ssel_id, base_id, record_id, ord) VALUES (null, :ssel_id, :base_id, :record_id, :ord) '; $stmt = $appbox->get_connection()->prepare($sql); $params = array( ':ssel_id' => $basket->get_ssel_id() , ':base_id' => $base_id , ':record_id' => $record_id , ':ord' => $ord ); $stmt->execute($params); $stmt->closeCursor(); $sselcont_id = $appbox->get_connection()->lastInsertId(); $ret['error'] = false; $ret['datas'][] = $sselcont_id; $sql = 'UPDATE ssel SET updater=NOW() WHERE ssel_id = :ssel_id'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(array(':ssel_id' => $basket->get_ssel_id())); $stmt->closeCursor(); if ($adjust_validation_datas == 'myvalid') { $sql = 'INSERT INTO validate_datas (SELECT distinct null as id, id as validate_id , :sselcont_id as sselcont_id , null as updated_on, 0 as agreement, "" as note FROM validate WHERE ssel_id = :ssel_id)'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(array(':sselcont_id' => $sselcont_id, ':ssel_id' => $basket->get_ssel_id())); $stmt->closeCursor(); $sql = 'SELECT usr_id FROM validate WHERE ssel_id = :ssel_id'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(array(':ssel_id' => $basket->get_ssel_id())); $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); foreach ($rs as $row) { if ($session->get_usr_id() != $row['usr_id']) { $basket->set_unread($row['usr_id']); } } } if ($parent_record_id) { $sql = 'SELECT null as id, ssel_id, usr_id FROM ssel WHERE usr_id != :usr_id AND rid = :parent_record_id AND sbas_id = :sbas_id AND temporaryType="1"'; $stmt = $appbox->get_connection()->prepare($sql); $params = array( ':usr_id' => $session->get_usr_id() , ':parent_record_id' => $parent_record_id , ':sbas_id' => $sbas_id ); $stmt->execute($params); $rs = $stmt->fetchAll(PDO::FETCH_ASSOC); $stmt->closeCursor(); foreach ($rs as $row) { $sql = 'SELECT max(ord) as ord FROM sselcont WHERE ssel_id = :ssel_id'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(array(':ssel_id' => $row['ssel_id'])); $row2 = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($row) { $ord = (int) $row2['ord'] + 1; } else { $ord = 0; } $sqlUp = ' INSERT INTO sselcont (sselcont_id, ssel_id, base_id, record_id,ord) VALUES (null, :ssel_id, :base_id, :record_id, :ord) '; $stmt = $appbox->get_connection()->prepare($sql); $params = array( ':ssel_id' => $row['ssel_id'] , ':base_id' => $base_id , ':record_id' => $record_id , ':ord' => $ord ); $stmt->execute($params); $stmt->closeCursor(); $sql = 'UPDATE ssel SET updater=NOW() WHERE ssel_id = :ssel_id'; $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute(array(':ssel_id' => $row['ssel_id'])); $stmt->closeCursor(); try { $basket_to_clean = basket_adapter::getInstance($appbox, $row['ssel_id'], $user->get_id()); $basket_to_clean->set_unread($row['usr_id']); } catch (Exception $e) { } } } $basket->delete_cache(); return new self($sselcont_id); } /** * * @param string $note * @return boolean */ function set_note($note) { if (!$this->is_validation_item) { throw new Exception('Element ' . $this->sselcont_id . ' is not a validation item'); } $note = strip_tags($note); if (!$this->validate_id) return false; $appbox = appbox::get_instance(); $usr_id = $appbox->get_session()->get_usr_id(); $sql = 'UPDATE validate_datas SET note = :note WHERE sselcont_id = :sselcont_id AND validate_id = :validate_id '; $stmt = $appbox->get_connection()->prepare($sql); $params = array( ':note' => $note , ':sselcont_id' => $this->sselcont_id , ':validate_id' => $this->validate_id ); $stmt->execute($params); $stmt->closeCursor(); $this->my_note = $note; foreach ($this->choices as $key => $values) { if ($values['is_mine']) { $this->choices[$key]['note'] = $note; break; } } try { $basket = basket_adapter::getInstance($appbox, $this->ssel_id, $usr_id); $basket->delete_cache(); } catch (Exception $e) { } return $this; } /** * * @return void */ function load_users_infos() { if (!$this->is_validation_item) { throw new Exception('Element is not a validation item'); return false; } foreach ($this->choices as $key => $value) { $this->choices[$key]['usr_display'] = User_Adapter::getInstance($value['usr_id'], appbox::get_instance())->get_display_name(); } } /** * * @return int */ function get_note_count() { if (!$this->is_validation_item) { throw new Exception('Element is not a validation item'); return false; } $n = 0; foreach ($this->choices as $key => $value) { if (trim($value['note']) != '') $n++; } return $n; } /** * * @param boolean $boolean * @return string */ function set_agreement($boolean) { if (!$this->is_validation_item) { throw new Exception('not a validation item'); } if (!$this->validate_id) throw new Exception('not a validation item'); $appbox = appbox::get_instance(); $usr_id = $appbox->get_session()->get_usr_id(); $boolean = in_array($boolean, array('1', '-1')) ? $boolean : '0'; $sql = 'UPDATE validate_datas SET agreement = :agreement WHERE sselcont_id = :sselcont_id AND validate_id = :validate_id'; $params = array( ':agreement' => $boolean , ':sselcont_id' => $this->sselcont_id , ':validate_id' => $this->validate_id ); $stmt = $appbox->get_connection()->prepare($sql); $stmt->execute($params); $stmt->closeCursor(); $this->delete_data_from_cache(); $basket = basket_adapter::getInstance($appbox, $this->ssel_id, $usr_id); $basket->delete_cache(); return $this; } /** * * @return int */ public function get_sselcont_id() { return $this->sselcont_id; } /** * * @return boolean */ public function is_validation_item() { return $this->is_validation_item; } /** * * @return int */ public function get_my_agreement() { return $this->my_agreement; } /** * * @return string */ public function get_my_note() { return $this->my_note; } /** * * @return Array */ public function get_choices() { return $this->choices; } /** * * @return int */ public function get_ssel_id() { return $this->ssel_id; } public static function is_in_validation_session(record_Interface $record, User_Interface $user) { $conn = connection::getPDOConnection(); $sql = 'SELECT v.id FROM sselcont c, validate v WHERE c.base_id = :base_id AND c.record_id = :record_id AND v.usr_id = :usr_id AND c.ssel_id = v.ssel_id'; $params = array( ':base_id' => $record->get_base_id() , ':record_id' => $record->get_record_id() , ':usr_id' => $user->get_id() ); $stmt = $conn->prepare($sql); $stmt->execute($params); $row = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); return!!$row; } public static function has_been_received(record_Interface $record, User_Interface $user) { $conn = connection::getPDOConnection(); $sql = 'SELECT sselcont_id FROM sselcont c, ssel s WHERE c.ssel_id=s.ssel_id AND c.record_id = :record_id AND c.base_id = :base_id AND s.pushFrom > 0 AND s.usr_id = :usr_id'; $params = array( ':base_id' => $record->get_base_id() , ':record_id' => $record->get_record_id() , ':usr_id' => $user->get_id() ); $stmt = $conn->prepare($sql); $stmt->execute($params); $row = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); return!!$row; } public function get_avrAgree() { return $this->avrAgree; } public function get_avrDisAgree() { return $this->avrDisAgree; } public function validate(user_adapter $from_user, User_Adapter $to_user, $validate_id, $can_hd) { $appbox = appbox::get_instance(); if ($can_hd) $to_user->ACL()->grant_hd_on($this->get_record(), $from_user, 'validate'); else $to_user->ACL()->grant_preview_on($this->get_record(), $from_user, 'validate'); $sql = 'REPLACE INTO validate_datas (id, validate_id, sselcont_id, updated_on, agreement) VALUES (null, :validate_id, :sselcont_id, null, 0)'; $stmt = $appbox->get_connection()->prepare($sql); $params = array( ':validate_id' => $validate_id , ':sselcont_id' => $this->get_sselcont_id() ); $stmt->execute($params); $stmt->closeCursor(); if (!$this->is_validation_item) { $this->choices = array(); $this->avrAgree = 0; $this->avrDisAgree = 0; } $this->is_validation_item = true; $this->choices[$to_user->get_id()] = array( 'usr_id' => $to_user->get_id(), 'usr_name' => $to_user->get_display_name(), 'is_mine' => ($to_user->get_id() == $this->usr_id), 'agreement' => 0, 'updated_on' => new DateTime(), 'note' => '' ); if ($to_user->get_id() == $this->usr_id) { $this->validate_id = (int) $validate_id; } $this->delete_data_from_cache(); return $this; } public function get_cache_key($option = null) { return 'basket_element_' . $this->usr_id . '_' . $this->sselcont_id . ($option ? '_' . $option : ''); ; } public function get_data_from_cache($option = null) { $appbox = appbox::get_instance(); return $appbox->get_data_from_cache($this->get_cache_key($option)); } public function set_data_to_cache($value, $option = null, $duration = 0) { $appbox = appbox::get_instance(); return $appbox->set_data_to_cache($value, $this->get_cache_key($option), $duration); } public function delete_data_from_cache($option = null) { $appbox = appbox::get_instance(); return $appbox->delete_data_from_cache($this->get_cache_key($option)); } }