Skip to content
Snippets Groups Projects
Commit 395add40 authored by Patrick Barroca's avatar Patrick Barroca :grin:
Browse files

rel #16499 : SIGB services can provide pickup locations

parent 677af23d
Branches
Tags
5 merge requests!780Master,!772Master,!771Hotline master,!770Stable,!761Hotline#16499 karvi hold
......@@ -541,14 +541,14 @@ class RechercheController extends ZendAfi_Controller_Action {
$viewRenderer = $this->getHelper('ViewRenderer');
$viewRenderer->setNoRender();
if (!$user = Class_Users::getLoader()->getIdentity()) {
if (!$user = Class_Users::getIdentity()) {
$this->_forward('popup-login', 'auth', 'opac', ['redirect' => $this->view->url()]);
return;
}
$id_bib = (int)$this->_request->getParam('id_bib');
$id_origine = $this->_request->getParam('id_origine');
$code_annexe = $this->_request->getParam('code_annexe');
$id_bib = (int)$this->_getParam('id_bib');
$id_origine = $this->_getParam('id_origine');
$code_annexe = $this->_getParam('code_annexe');
$comm = new Class_CommSigb();
$ret = $comm->reserverExemplaire($id_bib, $id_origine, $code_annexe);
......@@ -598,40 +598,78 @@ class RechercheController extends ZendAfi_Controller_Action {
public function reservationPickupAjaxAction() {
if (!Class_CosmoVar::isSiteRetraitResaEnabled()) {
$this->_forward('reservationajax');
if (!$user = Class_Users::getIdentity()) {
$this->_forward('popup-login', 'auth', 'opac', ['redirect' => $this->view->url()]);
return;
}
if ($this->_request->isPost()) {
$this->renderPopup($this->view->url(['action' => 'reservationajax',
'code_annexe' => $this->_request->getPost('code_annexe')]));
if (!Class_CosmoVar::isSiteRetraitResaEnabled()
&& !$this->arePickupLocationsProvidedByComm()) {
$this->_forward('reservationajax');
return;
}
$annexes = Class_CodifAnnexe::findAllByPickup();
$form = $this->view
->newForm(['id' => 'pickup',
'class' => 'zend_form reservation_pickup',
'action' => $this->view->url(['controller' => 'recherche',
'action' => 'reservation-pickup-ajax'])])
->addElement('Radio', 'code_annexe', ['required' => true,
'allowEmpty' => false])
->addDisplayGroup(['code_annexe'], 'group', ['legend' => 'Site de retrait'])
$form = $this->view->newForm(['id' => 'pickup',
'class' => 'zend_form reservation_pickup',
'action' => $this->view->url(['controller' => 'recherche', 'action' => 'reservation-pickup-ajax'])])
->addElement('Radio', 'code_annexe', array('required' => true,
'allowEmpty' => false))
->addDisplayGroup(array('code_annexe'), 'group', array('legend' => 'Site de retrait'))
->addElement('Submit', 'Valider')
->addElement('Button', 'Annuler', array('onclick' => 'opacDialogClose();return false;'));
->addElement('Button', 'Annuler',
['onclick' => 'opacDialogClose();return false;']);
$radio = $form->getElement('code_annexe');
foreach ($annexes as $annexe)
$radio->addMultiOption($annexe->getCode(), $annexe->getLibelle());
$radio->setValue($this->_getParam('code_annexe'));
$this->arePickupLocationsProvidedByComm() ?
$this->_addLocationsFromCommTo($radio) :
$this->_addLocationsFromCodifTo($radio);
if ($this->_request->isPost()
&& $form->isValid($this->_request->getPost())) {
$this->renderPopup($this->view->url(['action' => 'reservationajax',
'code_annexe' => $this->_request->getPost('code_annexe')]));
return;
}
$this->renderPopupResult($this->view->_('Lieu de mise à disposition demandé'),
$this->view->renderForm($form));
}
protected function _addLocationsFromCodifTo($element) {
foreach (Class_CodifAnnexe::findAllByPickup() as $annexe)
$element->addMultiOption($annexe->getCode(), $annexe->getLibelle());
$element->setValue($this->_getParam('code_annexe'));
}
protected function _addLocationsFromCommTo($element) {
if ((!$user = Class_Users::getIdentity())
|| (!$comm = $user->getSIGBComm())
|| (!$item = Class_Exemplaire::find($this->_getParam('id_origine'))))
return;
foreach($comm->pickupLocationsFor($user, $item) as $k => $v)
$element->addMultiOption($k, $v);
}
protected function arePickupLocationsProvidedByComm() {
if ((!$user = Class_Users::getIdentity())
|| (!Class_Exemplaire::find($this->_getParam('id_origine'))))
return false;
return ($comm = $user->getSIGBComm()) ?
$comm->providesPickupLocations() : false;
}
public function setMoteurRecherche($moteur) {
$this->moteur = $moteur;
}
......
......@@ -105,6 +105,16 @@ abstract class Class_WebService_SIGB_AbstractService {
}
public function providesPickupLocations() {
return false;
}
public function pickupLocationsFor($user, $item) {
return [];
}
protected function _success() {
return array('statut' => true, 'erreur' => '');
}
......@@ -112,7 +122,7 @@ abstract class Class_WebService_SIGB_AbstractService {
protected function _error($message) {
return array('statut' => false,
'erreur' => $message);
'erreur' => $message);
}
......
......@@ -16,7 +16,7 @@
*
* You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
* along with BOKEH; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
class Class_WebService_SIGB_Carthame_ReserveInfoResponseReader {
/** @var Class_WebService_XMLParser */
......@@ -39,6 +39,11 @@ class Class_WebService_SIGB_Carthame_ReserveInfoResponseReader {
}
public static function read($xml) {
return (new self())->readXml($xml);
}
/**
* @param string $xml
* @return Class_WebService_SIGB_Emprunteur
......
......@@ -20,10 +20,13 @@
*/
class Class_WebService_SIGB_Carthame_Service extends Class_WebService_SIGB_AbstractRESTService {
const CARTHAME_NAME = 'ktm';
const KARVI_NAME = 'karvi';
protected $_key;
protected $_translate;
protected $_hold_error_messages;
protected $_sigb_field_name = "ktm";
protected $_sigb_field_name = self::CARTHAME_NAME;
/**
* @param string $server_root
......@@ -48,6 +51,34 @@ class Class_WebService_SIGB_Carthame_Service extends Class_WebService_SIGB_Abstr
}
public function providesPickupLocations() {
return $this->isKarvi();
}
public function isKarvi() {
return self::KARVI_NAME == $this->_sigb_field_name;
}
public function pickupLocationsFor($user, $item) {
if (!$this->isKarvi() || !$user || !$item)
return [];
$user_id = $this->_authenticate($user);
$record_id = $item->getIdOrigine();
$xml = $this->_callAction('reserveInfo',
['userid' => $user_id, 'nn' => $record_id]);
if (1 <= (int)$this->_getTagData($xml, 'error'))
return [];
return Class_WebService_SIGB_Carthame_ReserveInfoResponseReader::read($xml)
->getSites();
}
/**
* @param $translate Zend_Translate
* @return self
......@@ -57,11 +88,13 @@ class Class_WebService_SIGB_Carthame_Service extends Class_WebService_SIGB_Abstr
return $this;
}
public function setSigbFieldName($sigb_field_name) {
$this->_sigb_field_name=$sigb_field_name;
return $this;
}
/**
* @param Class_Users $user
* @return Class_WebService_SIGB_Emprunteur
......
......@@ -20,21 +20,28 @@
*/
abstract class CarthameTestCase extends Storm_Test_ModelTestCase {
public function setUp() {
Storm_Model_Loader::defaultToVolatile();
parent::setUp();
}
public function tearDown() {
Class_WebService_SIGB_Carthame::reset();
Storm_Model_Loader::defaultToDb();
parent::tearDown();
}
public function setUp() {
parent::setUp();
}
}
class CarthameGetServiceTest extends CarthameTestCase {
protected $service;
public function setUp() {
parent::setUp();
$this->service = Class_WebService_SIGB_Carthame::getService(['url_serveur' => 'http://ifr.ro/webservices/index.php', 'key' => 'bibkey', 'sigb_field_name' => 'karvi']);
$this->service = Class_WebService_SIGB_Carthame::getService(['url_serveur' => 'http://ifr.ro/webservices/index.php',
'key' => 'bibkey',
'sigb_field_name' => 'karvi']);
}
......@@ -46,16 +53,20 @@ class CarthameGetServiceTest extends CarthameTestCase {
/** @test */
public function serverRootShouldBeIfrDotEU() {
$this->assertEquals('http://ifr.ro/webservices/index.php', $this->service->getServerRoot());
$this->assertEquals('http://ifr.ro/webservices/index.php',
$this->service->getServerRoot());
}
/** @test */
public function getServiceWithoutSchemeShouldAddHttpScheme() {
$this->service = Class_WebService_SIGB_Carthame::getService(['url_serveur' => 'ifr.ro/webservices/index.php']);
$this->assertEquals('http://ifr.ro/webservices/index.php', $this->service->getServerRoot());
$this->assertEquals('http://ifr.ro/webservices/index.php',
$this->service->getServerRoot());
}
}
abstract class CarthameOperationTestCase extends CarthameTestCase {
protected $mock_web_client;
protected $service;
......@@ -93,14 +104,32 @@ class CarthameKtmNoticeAlbatorTest extends CarthameTestCase {
->with('http://ifr.ro/webservices/index.php?sigb=ktm&version=standalone&idclient=bibkey&action=copyDetails&nn=I86355')
->answers(CarthameTestFixtures::createAnonymousNoticeXml());
$this->service = Class_WebService_SIGB_Carthame::getService(['url_serveur' => 'http://ifr.ro/webservices/index.php', 'key' => 'bibkey'])
$this->service = Class_WebService_SIGB_Carthame::getService(['url_serveur' => 'http://ifr.ro/webservices/index.php',
'key' => 'bibkey'])
->setWebClient($this->mock_web_client);
$this->albator = $this->service->getNotice('I86355');
}
/** @test */
public function shouldNotProvidePickupLocations() {
$this->assertFalse($this->service->providesPickupLocations());
}
/** @test */
public function pickupLocationsForUserAndItemShouldBeEmpty() {
$this->assertEmpty($this->service->pickupLocationsFor());
}
/** @test */
public function shouldNotBeKarvi() {
$this->assertFalse($this->service->isKarvi());
}
/** @test */
public function shouldAnswerOneNotice() {
$this->assertInstanceOf('Class_WebService_SIGB_Notice', $this->albator);
......@@ -131,6 +160,7 @@ class CarthameKarviNoticeAlbatorTest extends CarthameOperationTestCase {
$this->albator = $this->service->getNotice('I86355');
}
/** @test */
public function shouldAnswerOneNotice() {
$this->assertInstanceOf('Class_WebService_SIGB_Notice', $this->albator);
......@@ -146,6 +176,78 @@ class CarthameKarviNoticeAlbatorTest extends CarthameOperationTestCase {
class CarthameKarviPickupLocationsTest extends CarthameOperationTestCase {
public function setUp() {
parent::setUp();
$this->service->setWebClient($this->mock()
->whenCalled('open_url')
->with('http://ifr.ro/webservices/index.php?sigb=karvi&version=standalone&idclient=bibkey&action=login&username=90100000119049&password=pass')
->answers('<?xml version="1.0" encoding="utf-8"?>
<root>
<login>
<sigb>karvi</sigb>
<user>90100000119049</user>
<id>L0001910</id>
<fullname>testing test</fullname>
<error>0</error>
<code>0</code>
</login>
</root>
')
->whenCalled('open_url')
->with('http://ifr.ro/webservices/index.php?sigb=karvi&version=standalone&idclient=bibkey&action=reserveInfo&userid=L0001910&nn=DOC00236387')
->answers('<?xml version="1.0" encoding="utf-8"?>
<root>
<reservationInfo>
<sigb>karvi</sigb>
<user>L0001910</user>
<nn>DOC00236387</nn>
<site id="T-21" coche="1">Tournée 027 (prochain passage 14/03/2015)</site>
<site id="1" coche="0">MD68-Colmar</site>
<error>0</error>
<code>0</code>
</reservationInfo>
</root>')
->beStrict());
$user = $this->fixture('Class_Users',
['id' => 34,
'login' => '90100000119049',
'password' => 'pass']);
$item = $this->fixture('Class_Exemplaire',
['id' => 123,
'id_origine' => 'DOC00236387']);
$this->_locations = $this->service->pickupLocationsFor($user, $item);
}
/** @test */
public function shouldBeKarvi() {
$this->assertTrue($this->service->isKarvi());
}
/** @test */
public function shouldProvidePickupLocations() {
$this->assertTrue($this->service->providesPickupLocations());
}
/** @test */
public function shouldProvide2PickupLocations() {
$this->assertEquals(['T-21' => 'Tournée 027 (prochain passage 14/03/2015)',
'1' => 'MD68-Colmar'],
$this->_locations);
}
}
class CarthameAnonymousNoticeTest extends CarthameOperationTestCase {
/** @var Class_WebService_SIGB_Notice */
protected $anonymous;
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment