diff --git a/src/Payutc/Bom/ExternalData.php b/src/Payutc/Bom/ExternalData.php new file mode 100644 index 0000000..31ad13c --- /dev/null +++ b/src/Payutc/Bom/ExternalData.php @@ -0,0 +1,184 @@ +from('t_external_data_exd', 'exd') + ->where('fun_id = :fun_id') + ->andWhere('exd_removed is NULL') + ->setParameter('fun_id', $fun_id); + + if ($usr_id === null) { + $qb->andWhere('usr_id is NULL'); + } + else { + $qb->andWhere('usr_id = :usr_id') + ->setParameter('usr_id', $usr_id); + } + } + + protected static function insert($fun_id, $key, $val, $usr_id = null) { + $conn = Dbal::conn(); + $a = $conn->insert('t_external_data_exd', array( + 'fun_id' => $fun_id, + 'usr_id' => $usr_id, + 'exd_key' => $key, + 'exd_val' => $val, + 'exd_inserted' => 'NOW()')); + } + + /** + * @param $fun_id + * @param $key + * @param $usr_id + * @param $full true to get full record, false to get only the value + * @param $for_update true to do a SELECT ... FOR UPDATE statement + */ + public static function get($fun_id, $key, $usr_id = null, $full = false, $for_update = false) { + static::checkKey($key); + $qb = Dbal::createQueryBuilder(); + $qb->select($full ? '*' : 'exd_val'); + if ($for_update) { + $qb->forUpdate(); + } + static::addSelectConditions($qb, $fun_id, $usr_id); + $qb->andWhere('exd_key = :exd_key') + ->setParameter('exd_key', $key); + $res = $qb->execute()->fetch(); + if ($res === false) { + throw new ExternalDataException("Not found : fun=$fun_id, key=$key, usr_id=$usr_id", 404); + } + return $full ? $res : $res['exd_val']; + } + + /** + * + * @param $fun_id + * @param $key + * @param $val + * @param $usr_id + */ + public static function set($fun_id, $key, $val, $usr_id = null) { + static::checkKey($key); + $conn = Dbal::conn(); + + $conn->beginTransaction(); + try { + + $affected_rows = static::del($fun_id, $key, $usr_id); + + if ($affected_rows == 0) { + Log::info("create new external data ($fun_id, $key, $val, $usr_id)"); + } + + // insert the new record + static::insert($fun_id, $key, $val, $usr_id); + + $conn->commit(); + } + catch (Exception $e) { + $conn->rollback(); + throw $e; + } + } + + /** + * @param $fun_id + * @param $key + * @param $usr_id + */ + public static function del($fun_id, $key, $usr_id = null) { + static::checkKey($key); + + $qb = Dbal::createQueryBuilder(); + $qb->update('t_external_data_exd', 'exd') + ->where('fun_id = :fun_id') + ->setParameter('fun_id', $fun_id) + ->where('exd_key = :key') + ->setParameter('key', $key) + ->andWhere('exd_removed is NULL') + ->set('exd_removed', 'NOW()'); + + if ($usr_id === null) { + $qb->andWhere('usr_id is NULL'); + } + else { + $qb->andWhere('usr_id = :usr_id') + ->setParameter('usr_id', $usr_id); + } + + $affected_rows = $qb->execute(); + + if ($affected_rows > 1) { + Log::warning("multiple rows has been deleted ($fun_id, $key, $usr_id)"); // TODO + } + // one row affected, the record was already existing + else if ($affected_rows == 1) { + + } + // 0 row affected, the record does not exist + else { + + } + + return $affected_rows; + } + + + /** + * Available transformations ($func): + * array('$inc'=> (int)) + * array('$dec'=> (int)) + * + * @param $fun_id + * @param $key + * @param $fun the transformation to apply + * @param $usr_id + * @return the new value + */ + public static function transform($fun_id, $key, array $func, $usr_id = null) { + static::checkKey($key); + $conn = Dbal::conn(); + + $conn->beginTransaction(); + try { + $full = false; + $res = self::get($fun_id, $key, $usr_id, $full, true); + $transform = key($func); + $value = reset($func); + switch ($transform) { + case '$dec': + $value = -(int)$value; + break; + case '$inc': + $res = (int)$res + (int)$value; + break; + default: + throw new ExternalDataException('Invalid transformation'); + break; + } + self::set($fun_id, $key, $res, $usr_id); + $conn->commit(); + } + catch (Exception $e) { + $conn->rollback(); + Log::error("Impossible d\'effectuer la transformation ($fun_id, $key, $func, $usr_id) ".$e->getMessage()); + } + + return $res; + } + + protected static function checkKey($key) { + $pattern = '/^[a-zA-Z0-9_-]+$/'; + if(preg_match($pattern, $key) === 0) { + throw new ExternalDataException("Invalid key, allowed char are [a-zA-Z0-9_-]", 442); + } + } +} + diff --git a/src/Payutc/Exception/ExternalDataException.php b/src/Payutc/Exception/ExternalDataException.php new file mode 100644 index 0000000..b81bdc2 --- /dev/null +++ b/src/Payutc/Exception/ExternalDataException.php @@ -0,0 +1,6 @@ +addSql("ALTER TABLE `t_purchase_pur2` + $this->addSql("ALTER TABLE `t_purchase_pur` DROP `pur_qte`, DROP `pur_unit_price`;"); } diff --git a/src/Payutc/Migrations/Version20131002042353.php b/src/Payutc/Migrations/Version20131002042353.php new file mode 100644 index 0000000..af65dde --- /dev/null +++ b/src/Payutc/Migrations/Version20131002042353.php @@ -0,0 +1,39 @@ +addSql(" + CREATE TABLE IF NOT EXISTS `t_external_data_exd` ( + `exd_id` int(11) NOT NULL AUTO_INCREMENT, + `fun_id` int(11) unsigned NOT NULL, + `usr_id` int(11) unsigned, + `exd_key` varchar(128) NOT NULL, + `exd_val` varchar(1024) NOT NULL, + `exd_inserted` datetime NOT NULL, + `exd_removed` datetime, + PRIMARY KEY (`exd_id`), + KEY `fun_id` (`fun_id`), + KEY `usr_id` (`usr_id`), + KEY `exd_key` (`exd_key`(127)) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;"); + $this->addSql(" + ALTER TABLE `t_external_data_exd` + ADD CONSTRAINT `t_external_data_exd_ibfk_2` FOREIGN KEY (`usr_id`) REFERENCES `ts_user_usr` (`usr_id`), + ADD CONSTRAINT `t_external_data_exd_ibfk_1` FOREIGN KEY (`fun_id`) REFERENCES `t_fundation_fun` (`fun_id`)"); + } + + public function down(Schema $schema) + { + $this->addSql("DROP TABLE `t_external_data_exd`;"); + } +} diff --git a/src/Payutc/Service/DATAADMIN.php b/src/Payutc/Service/DATAADMIN.php new file mode 100644 index 0000000..e24ba84 --- /dev/null +++ b/src/Payutc/Service/DATAADMIN.php @@ -0,0 +1,126 @@ + 'trecouvr'); + * $usr = array('badge' => 'ABCDEABCDE'); + * $usr = array('id' => 1); + * $usr = null + * + * output: + * id : int or null + */ + protected function convertUsrArg($usr) { + if ($usr !== null) { + if (isset($usr['badge'])) { + $u = User::getUserFromBadge($usr['badge']); + $usr = $u->getId(); + } + else if (isset($usr['login'])) { + $u = new User($usr['login']); + $usr = $u->getId(); + } + else if (isset($usr['id'])) { + $usr = $usr['id']; + + } + } + return $usr; + } + + protected function get($fun_id, $key, $usr = null) { + $this->checkRight(true, true, true, $fun_id); + $usr = $this->convertUsrArg($usr); + return ExternalData::get($fun_id, $key, $usr); + } + + protected function set($fun_id, $key, $val, $usr = null) { + $this->checkRight(true, true, true, $fun_id); + $usr = $this->convertUsrArg($usr); + return ExternalData::set($fun_id, $key, $val, $usr); + } + + protected function del($fun_id, $key, $usr = null) { + $this->checkRight(true, true, true, $fun_id); + $usr = $this->convertUsrArg($usr); + return ExternalData::del($fun_id, $key, $usr); + } + + protected function transform($fun_id, $key, $func, $usr = null) { + $this->checkRight(true, true, true, $fun_id); + $usr = $this->convertUsrArg($usr); + $func = json_decode($func, true); + if ($func === null) { + Log::warning("'$func' is not a valid format for transform method"); + throw new ExternalDataException('Invalid format'); + } + return ExternalData::transform($fun_id, $key, $func, $usr); + } + + + /// FUN DATA + + public function getFunData($fun_id, $key) { + return $this->get($fun_id, $key); + } + + public function setFunData($fun_id, $key, $val) { + return $this->set($fun_id, $key, $val); + } + + public function delFunData($fun_id, $key) { + return $this->del($fun_id, $key); + } + + public function transformFunData($fun_id, $key, $func) { + return $this->transform($fun_id, $key, $func); + } + + /// USR DATA + + public function getUsrDataByLogin($fun_id, $login, $key) { + return $this->get($fun_id, $key, array('login'=>$login)); + } + + public function setUsrDataByLogin($fun_id, $login, $key, $val) { + return $this->set($fun_id, $key, $val, array('login'=>$login)); + } + + public function getUsrDataByBadge($fun_id, $badge, $key) { + return $this->get($fun_id, $key, array('badge'=>$badge)); + } + + public function setUsrDataByBadge($fun_id, $badge, $key, $val) { + return $this->set($fun_id, $key, $val, array('badge'=>$badge)); + } + + public function delUsrDataByLogin($fun_id, $login, $key) { + return $this->del($fun_id, $key, array('login'=>$login)); + } + + public function delUsrDataByBadge($fun_id, $badge, $key) { + return $this->del($fun_id, $key, array('badge'=>$badge)); + } + + public function transformUsrDataByLogin($fun_id, $login, $key, $func) { + return $this->transform($fun_id, $key, $func, array('login'=>$login)); + } + + public function transformUsrDataByBadge($fun_id, $badge, $key, $func) { + return $this->transform($fun_id, $key, $func, array('badge'=>$login)); + } +} + + diff --git a/tests/Payutc/Bom/ExternalDataRodbTest.php b/tests/Payutc/Bom/ExternalDataRodbTest.php new file mode 100644 index 0000000..0452ba8 --- /dev/null +++ b/tests/Payutc/Bom/ExternalDataRodbTest.php @@ -0,0 +1,73 @@ +computeDataset(array( + 'fundations.yml', + 'users.yml', + 'externaldata.yml' + )); + } + + /** + * @requires PHP 5.4 + */ + public function testGetUserData() + { + $a = ExternalData::get(1, 'key-user', 1); + $this->assertEquals('value1', $a); + } + + public function testGetFunData() + { + $a = ExternalData::get(1, 'key-fun'); + $this->assertEquals('value2', $a); + } + + public function testGetUsrDataCastArg() + { + $a = ExternalData::get(1, 'key-user', "1"); + $this->assertEquals('value1', $a); + } + + /** + * Test get throw an exception when the key does not exist + * + * @expectedException \Payutc\Exception\ExternalDataException + * @expectedExceptionCode 404 + */ + public function testGetUserDataWhichDoesNotExist() + { + ExternalData::get(1, 'key-no-exist', 1); + } + + /** + * Test get throw an exception when the key does not exist + * + * @expectedException \Payutc\Exception\ExternalDataException + * @expectedExceptionCode 404 + */ + public function testGetFunDataWhichDoesNotExist() + { + ExternalData::get(1, 'key-no-exist'); + } + + public function testGetFunDataWithSimilarKeyThanUser() + { + $a = ExternalData::get(1, 'key-user'); + $this->assertEquals('value3', $a); + } + +} + + + + diff --git a/tests/Payutc/Bom/ExternalDataRwdbTest.php b/tests/Payutc/Bom/ExternalDataRwdbTest.php new file mode 100644 index 0000000..483467a --- /dev/null +++ b/tests/Payutc/Bom/ExternalDataRwdbTest.php @@ -0,0 +1,189 @@ +computeDataset(array( + 'fundations.yml', + 'users.yml', + 'externaldata.yml' + )); + } + + + public function testSetUsrData() + { + $a = ExternalData::get(1, 'key-user', 1); + ExternalData::set(1, 'key-user', $a.'-newvalue', 1); + $b = ExternalData::get(1, 'key-user', 1); + $this->assertEquals($a.'-newvalue', $b); + } + + public function testSetFunData() + { + $orig_user = ExternalData::get(1, 'key-user', 1); + $orig_fun = ExternalData::get(1, 'key-user', 1); + $a = ExternalData::get(1, 'key-fun'); + ExternalData::set(1, 'key-fun', $a.'-newvalue'); + $b = ExternalData::get(1, 'key-fun'); + $this->assertEquals($a.'-newvalue', $b); + + // check that this does not affect the others + $this->assertEquals($orig_user, ExternalData::get(1, 'key-user', 1)); + $this->assertEquals($orig_fun, ExternalData::get(1, 'key-user', 1)); + } + + public function testSetFunData2() + { + $orig_user = ExternalData::get(1, 'key-user', 1); + $orig_fun = ExternalData::get(1, 'key-user', 1); + $a = ExternalData::get(1, 'key-user'); + ExternalData::set(1, 'key-user', $a.'-newvalue'); + $b = ExternalData::get(1, 'key-user'); + $this->assertEquals($a.'-newvalue', $b); + // check that this does not affect the others + $this->assertEquals($orig_user, ExternalData::get(1, 'key-user', 1)); + $this->assertEquals($orig_fun, ExternalData::get(1, 'key-user', 1)); + } + + public function testSetUsrDataInsert() + { + ExternalData::set(1, 'key-user-2', 'myvalue', 1); + $a = ExternalData::get(1, 'key-user-2', 1); + $this->assertEquals('myvalue', $a); + } + + public function testSetFunDataInsert() + { + ExternalData::set(1, 'key-fun-2', 'myvalue-fun'); + $a = ExternalData::get(1, 'key-fun-2'); + $this->assertEquals('myvalue-fun', $a); + } + + /** + * Test set throw an exception when the key is invalide + * + * @expectedException \Payutc\Exception\ExternalDataException + * @expectedExceptionCode 442 + */ + public function testSetDataOnInvalidKey() + { + ExternalData::set(1, 'key fun 2', 'myvalue-fun'); + } + + /** + * Test set throw an exception when the key is invalide + * + * @expectedException \Payutc\Exception\ExternalDataException + * @expectedExceptionCode 442 + */ + public function testSetDataOnInvalidKey2() + { + ExternalData::set(1, 'key\'', 'myvalue-fun'); + } + + /** + * Test get throw an exception when the key is invalide + * + * @expectedException \Payutc\Exception\ExternalDataException + * @expectedExceptionCode 442 + */ + public function testGetDataOnInvalidKey() + { + ExternalData::get(1, 'key fun 2'); + } + + /** + * Test get throw an exception when the key is invalide + * + * @expectedException \Payutc\Exception\ExternalDataException + * @expectedExceptionCode 442 + */ + public function testGetDataOnInvalidKey2() + { + ExternalData::get(1, 'key\''); + } + + /** + * Test delete + */ + public function testDelUsrData() + { + // create new data + ExternalData::set(1, 'key-usr-to-delete', 'blabla', 1); + + // count rows + $qb = Dbal::createQueryBuilder(); + $qb->select('count(*) as c') + ->from('t_external_data_exd', 'exd') + ->where('exd_removed is NULL'); + $res = $qb->execute()->fetch(); + $c = $res['c']; + + // delete + ExternalData::del(1, 'key-usr-to-delete', 1); + + // count rows + $qb = Dbal::createQueryBuilder(); + $qb->select('count(*) as c') + ->from('t_external_data_exd', 'exd') + ->where('exd_removed is NULL'); + $res = $qb->execute()->fetch(); + $c2 = $res['c']; + + $this->assertEquals($c - 1, $c2); + } + + /** + * Test delete + */ + public function testDelFunData() + { + // create new data + ExternalData::set(1, 'key-fun-to-delete', 'blabla'); + + // count rows + $qb = Dbal::createQueryBuilder(); + $qb->select('count(*) as c') + ->from('t_external_data_exd', 'exd') + ->where('exd_removed is NULL'); + $res = $qb->execute()->fetch(); + $c = $res['c']; + + // delete + ExternalData::del(1, 'key-fun-to-delete'); + + // count rows + $qb = Dbal::createQueryBuilder(); + $qb->select('count(*) as c') + ->from('t_external_data_exd', 'exd') + ->where('exd_removed is NULL'); + $res = $qb->execute()->fetch(); + $c2 = $res['c']; + + $this->assertEquals($c - 1, $c2); + } + + /** + * Test increment + */ + public function testIncFunData() + { + $a = 42; + $inc = 3; + ExternalData::set(1, 'key-testinc', $a); + $aa = ExternalData::transform(1, 'key-testinc', array('$inc'=>$inc)); + $this->assertEquals($a+$inc, $aa); + $aa = ExternalData::get(1, 'key-testinc'); + $this->assertEquals($a+$inc, $aa); + } +} + diff --git a/tests/Payutc/Service/DataAdminRodbTest.php b/tests/Payutc/Service/DataAdminRodbTest.php new file mode 100644 index 0000000..3bcf7f7 --- /dev/null +++ b/tests/Payutc/Service/DataAdminRodbTest.php @@ -0,0 +1,81 @@ +computeDataset(array( + 'users.yml', + 'fundations.yml', + 'applications.yml', + 'fundationrights.yml', + 'applicationright.yml', + 'externaldata.yml' + )); + } + + public function setUp() + { + parent::setUp(); + if (PHP_VERSION_ID >= 50400) { + $this->cookie = ''; + $this->loginCas($this->cookie, $r, 'trecouvr@DATAADMIN', 'DATAADMIN'); + $this->assertEquals(200, $r->code); + $this->loginApp($this->cookie, $r, 'my_app'); + $this->assertEquals(200, $r->code); + } + } + + public function tearDown() + { + $this->cookie = ''; + } + + /** + * @requires PHP 5.4 + */ + public function testGetUsrDataByLogin() + { + $r = httpSend('DATAADMIN', 'getUsrDataByLogin', $this->cookie, array( + 'fun_id' => '1', + 'login' => 'trecouvr', + 'key' => 'key-user' + )); + $this->assertEquals(200, $r->code); + $this->assertEquals('value1', $r->body); + } + + /** + * @requires PHP 5.4 + */ + public function testGetUsrDataByBadge() + { + $r = httpSend('DATAADMIN', 'getUsrDataByBadge', $this->cookie, array( + 'fun_id' => '1', + 'badge' => 'ABCDABCD', + 'key' => 'key-user' + )); + $this->assertEquals(200, $r->code); + $this->assertEquals('value1', $r->body); + } + + /** + * @requires PHP 5.4 + */ + public function testGetFunData() + { + $r = httpSend('DATAADMIN', 'getFunData', $this->cookie, array( + 'fun_id' => '1', + 'key' => 'key-user' + )); + $this->assertEquals(200, $r->code); + $this->assertEquals('value3', $r->body); + } +} + diff --git a/tests/Payutc/Service/DataAdminRwdbTest.php b/tests/Payutc/Service/DataAdminRwdbTest.php new file mode 100644 index 0000000..78579eb --- /dev/null +++ b/tests/Payutc/Service/DataAdminRwdbTest.php @@ -0,0 +1,135 @@ +computeDataset(array( + 'users.yml', + 'fundations.yml', + 'applications.yml', + 'fundationrights.yml', + 'applicationright.yml', + 'externaldata.yml' + )); + } + + public function setUp() + { + parent::setUp(); + if (PHP_VERSION_ID >= 50400) { + $this->cookie = ''; + $this->loginCas($this->cookie, $r, 'trecouvr@DATAADMIN', 'DATAADMIN'); + $this->assertEquals(200, $r->code); + $this->loginApp($this->cookie, $r, 'my_app'); + $this->assertEquals(200, $r->code); + } + } + + public function tearDown() + { + $this->cookie = ''; + } + + /** + * @requires PHP 5.4 + */ + public function testSetFunData() + { + $orig_fun = ExternalData::get(1, 'key-fun'); + + $r = httpSend('DATAADMIN', 'setFunData', $this->cookie, array( + 'fun_id' => '1', + 'key' => 'key-fun', + 'val' => $orig_fun.'n' + )); + $this->assertEquals(200, $r->code); + $this->assertEquals($orig_fun.'n', ExternalData::get(1, 'key-fun')); + } + + + /** + * @requires PHP 5.4 + */ + public function testSetUsrDataByLogin() + { + $orig_usr = ExternalData::get(1, 'key-user', 1); + + $r = httpSend('DATAADMIN', 'setUsrDataByLogin', $this->cookie, array( + 'fun_id' => '1', + 'login' => 'trecouvr', + 'key' => 'key-user', + 'val' => $orig_usr.'n' + )); + $this->assertEquals(200, $r->code); + $this->assertEquals($orig_usr.'n', ExternalData::get(1, 'key-user', 1)); + } + + + /** + * @requires PHP 5.4 + */ + public function testSetUsrDataByBadge() + { + $orig_usr = ExternalData::get(1, 'key-user', 1); + + $r = httpSend('DATAADMIN', 'setUsrDataByBadge', $this->cookie, array( + 'fun_id' => '1', + 'badge' => 'ABCDABCD', + 'key' => 'key-user', + 'val' => $orig_usr.'n' + )); + $this->assertEquals(200, $r->code); + $this->assertEquals($orig_usr.'n', ExternalData::get(1, 'key-user', 1)); + } + + + /** + * @requires PHP 5.4 + */ + public function testDelData() + { + $provider = array( + 'delUsrDataByBadge' => array('badge' => 'ABCDABCD'), + 'delUsrDataByLogin' => array('login' => 'trecouvr'), + 'delFunData' => null + ); + foreach ($provider as $meth=>$data) { + $args = array( + 'fun_id' => '1', + 'key' => 'key-doesnotexist', + ); + if ($data !== null) { + $args = array_merge($args, $data); + } + $r = httpSend('DATAADMIN', $meth, $this->cookie, $args); + $this->assertEquals(200, $r->code); + $this->assertEquals(0, $r->body); + } + } + + /** + * @requires PHP 5.4 + */ + public function testTransformData() + { + $a = 42; + $inc = 5; + ExternalData::set(1, 'key-transform', $a); + + $r = httpSend('DATAADMIN', 'transformFunData', $this->cookie, array( + 'fun_id' => 1, + 'key' => 'key-transform', + 'func' => '{"$inc": '.$inc.'}' + )); + var_dump($r->body); + $this->assertEquals(200, $r->code); + $this->assertEquals($a+$inc, $r->body); + } +} + diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 2f1e3a6..e6cfba9 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -93,7 +93,7 @@ protected function getConnection() * called in setUp() */ protected function getSetUpOperation() - { + { $cascadeTruncates = false; // True if you want cascading truncates, false otherwise. If unsure choose false. return new \PHPUnit_Extensions_Database_Operation_Composite(array( new TruncateOperation($cascadeTruncates), @@ -107,9 +107,10 @@ protected function getSetUpOperation() */ protected function getTearDownOperation() { - return $this->getOperations()->DELETE_ALL(); - } - + $cascadeTruncates = false; // True if you want cascading truncates, false otherwise. If unsure choose false. + return new TruncateOperation($cascadeTruncates); + } + function computeDataset($fixture) { if (!is_array($fixture)) { diff --git a/tests/seed/applicationright.yml b/tests/seed/applicationright.yml index 7e00723..a7ba8e9 100644 --- a/tests/seed/applicationright.yml +++ b/tests/seed/applicationright.yml @@ -14,6 +14,10 @@ tj_app_fun_afu: app_id: 1 fun_id: 1 afu_service: ADMINRIGHT + - + app_id: 1 + fun_id: 1 + afu_service: DATAADMIN - app_id: 3 fun_id: 1 diff --git a/tests/seed/externaldata.yml b/tests/seed/externaldata.yml new file mode 100644 index 0000000..8e0e2b7 --- /dev/null +++ b/tests/seed/externaldata.yml @@ -0,0 +1,21 @@ +t_external_data_exd: + - + exd_id: 1 + usr_id: 1 + fun_id: 1 + exd_key: key-user + exd_val: value1 + exd_inserted: 2013-09-01 + - + exd_id: 2 + fun_id: 1 + exd_key: key-fun + exd_val: value2 + exd_inserted: 2013-09-01 + - + exd_id: 3 + fun_id: 1 + exd_key: key-user + exd_val: value3 + exd_inserted: 2013-09-01 + diff --git a/tests/seed/fundationrights.yml b/tests/seed/fundationrights.yml index a77a818..b2b6e68 100644 --- a/tests/seed/fundationrights.yml +++ b/tests/seed/fundationrights.yml @@ -1,12 +1,6 @@ tj_usr_fun_ufu: - usr_id: 1 - fun_id: 1 - ufu_service: POSS3 - - - usr_id: 1 - fun_id: 1 - ufu_service: ADMINRIGHT - usr_id: 9447 fun_id: 1