From 9399a28e4d195dd5f26560773bc151336cca35f8 Mon Sep 17 00:00:00 2001
From: Ghislain Loas <gloas@afi-sa.fr>
Date: Tue, 30 Oct 2018 15:44:12 +0000
Subject: [PATCH] Merge branch
 'dev#80976_gestion_des_integrations_hotline_niveau_1' into 'master'

Dev#80976 gestion des integrations hotline niveau 1

See merge request afi/opacce!2860

(cherry picked from commit 10040601a7bde96f90352321ba7a1f756ab36f62)

b3e6af2a dev #80976 add administration action on inspector gadget to delete an item
7bf031ce dev #80976 fix RT
---
 VERSIONS_WIP/80976                            |  1 +
 .../admin/controllers/RecordsController.php   | 13 +++++
 .../ZendAfi/View/Helper/Notice/Unimarc.php    | 28 +++++++++-
 .../controllers/RecordsControllerTest.php     | 55 +++++++++++++++++++
 .../RechercheControllerViewnoticeTest.php     | 27 ++++++++-
 5 files changed, 120 insertions(+), 4 deletions(-)
 create mode 100644 VERSIONS_WIP/80976

diff --git a/VERSIONS_WIP/80976 b/VERSIONS_WIP/80976
new file mode 100644
index 00000000000..7e4f5109fd3
--- /dev/null
+++ b/VERSIONS_WIP/80976
@@ -0,0 +1 @@
+ - ticket #80976 : page notice : lorque connecté en tant qu'administrateur, l'outil "Inspector Gadget" permet de supprimer un exemplaire
\ No newline at end of file
diff --git a/application/modules/admin/controllers/RecordsController.php b/application/modules/admin/controllers/RecordsController.php
index 1b5e2ee32b4..5287122d64b 100644
--- a/application/modules/admin/controllers/RecordsController.php
+++ b/application/modules/admin/controllers/RecordsController.php
@@ -111,4 +111,17 @@ class Admin_RecordsController extends ZendAfi_Controller_Action {
     $this->_helper->notify($this->_('La bande-annonce a bien été mise à jour'));
     $this->_redirectClose($this->_getReferer());
   }
+
+
+  public function deleteItemAction() {
+    if ($item = Class_Exemplaire::find($this->_getParam('id')))
+      $item->delete();
+
+    $this->_helper->notify($item
+                           ? $this->_('Exemplaire "%s" supprimé',
+                                      $item->getCodeBarres())
+                           : $this->_('Exemplaire non trouvé'));
+
+    $this->_redirectToReferer();
+  }
 }
diff --git a/library/ZendAfi/View/Helper/Notice/Unimarc.php b/library/ZendAfi/View/Helper/Notice/Unimarc.php
index 2e4a2294581..20c0baa7a8b 100644
--- a/library/ZendAfi/View/Helper/Notice/Unimarc.php
+++ b/library/ZendAfi/View/Helper/Notice/Unimarc.php
@@ -152,7 +152,8 @@ class ZendAfi_View_Helper_Notice_Unimarc extends Zend_View_Helper_HtmlElement {
       . $this->_tag('br');
 
     $html .= $this->renderItem995($item)
-      . $this->renderItemDownload($item);
+      . $this->renderItemDownload($item)
+      . $this->renderItemDelete($item);
 
     return $this->_tag('h3', $item->getBibLibelle() . ' ' . $item->getCodeBarres())
       . $this->_tag('div', $html);
@@ -210,6 +211,31 @@ class ZendAfi_View_Helper_Notice_Unimarc extends Zend_View_Helper_HtmlElement {
   }
 
 
+  protected function renderItemDelete($item) {
+    if (!Class_Users::isCurrentUserAdmin())
+      return '';
+
+    $delete_url = $this->view->url(['module' => 'admin',
+                                    'controller' => 'records',
+                                    'action' => 'delete-item',
+                                    'id' => $item->getId()],
+                                   null, true);
+
+    return $this->view->tag('a',
+                            Class_Admin_Skin::current()->renderActionIconOn('delete', $this->view) . $this->_('Supprimer l\'exemplaire'),
+                            ['style' => 'float:right;',
+                             'onclick' => 'return confirm(\'' . $this->_('Supprimer cet exemplaire ?') . '\');',
+                             'href' => $delete_url]);
+
+    $button = (new Class_Entity)
+      ->setText($this->_('Supprimer l\'exemplaire'))
+      ->setImage(Class_Admin_Skin::current()->renderActionIconOn('delete', $this->view))
+      ->setAttribs();
+
+    return $this->view->admin_Button($button);
+  }
+
+
   public function __call($name, $args) {
     if ('visit' != substr($name, 0, 5))
       throw new RuntimeException('Call to unknown method ' . get_class($this) . '::' . $name);
diff --git a/tests/application/modules/admin/controllers/RecordsControllerTest.php b/tests/application/modules/admin/controllers/RecordsControllerTest.php
index ad318269f17..6dfbd331c46 100644
--- a/tests/application/modules/admin/controllers/RecordsControllerTest.php
+++ b/tests/application/modules/admin/controllers/RecordsControllerTest.php
@@ -502,3 +502,58 @@ class RecordsControllerTrailerPostTest extends RecordsControllerTestCase {
                                       'Le service n\'a pas répondu');
   }
 }
+
+
+
+
+class RecordsControllerDeleteItemTest extends RecordsControllerTestCase {
+  public function setUp() {
+    parent::setUp();
+    $this->fixture('Class_Exemplaire',
+                   ['id' => 4,
+                    'id_notice' => '12345',
+                    'cote' => '234',
+                    'code_barres' => 'ABC4' ]);
+    $this->dispatch('/admin/records/delete-item/id/4', true);
+  }
+
+
+  /** @test */
+  public function itemShouldBeDeleted() {
+    $this->assertNull(Class_Exemplaire::find(4));
+  }
+
+
+  /** @test */
+  public function responseShouldRedirectToReferer() {
+    $this->assertRedirect();
+  }
+
+
+  /** @test */
+  public function responseShouldNotifyDeletion() {
+    $this->assertFlashMessengerContentContains('Exemplaire "ABC4" supprimé');
+  }
+}
+
+
+
+
+class RecordsControllerDeleteInexistingItemTest extends RecordsControllerTestCase {
+  public function setUp() {
+    parent::setUp();
+    $this->dispatch('/admin/records/delete-item/id/4', true);
+  }
+
+
+  /** @test */
+  public function responseShouldRedirectToReferer() {
+    $this->assertRedirect();
+  }
+
+
+  /** @test */
+  public function responseShouldNotifyDeletion() {
+    $this->assertFlashMessengerContentContains('Exemplaire non trouvé');
+  }
+}
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/RechercheControllerViewnoticeTest.php b/tests/application/modules/opac/controllers/RechercheControllerViewnoticeTest.php
index 2f5cac70a8a..0a598c72ce3 100644
--- a/tests/application/modules/opac/controllers/RechercheControllerViewnoticeTest.php
+++ b/tests/application/modules/opac/controllers/RechercheControllerViewnoticeTest.php
@@ -65,16 +65,37 @@ class RechercheControllerViewnoticeWithInspectorGadgetTest extends AbstractContr
                    ['id' => 2,
                     'unimarc' => '',
                     'alpha_titre' => '',
-                    'alpha_auteur' => '']);
-
-    $this->dispatch('/opac/recherche/viewnotice/id/2/inspector_gadget/1', true);
+                    'alpha_auteur' => '',
+                    'exemplaires' => [ $this->fixture('Class_Exemplaire',
+                                                      ['id' => 4,
+                                                       'cote' => '234',
+                                                       'code_barres' => 'ABC4' ]) ]]);
   }
 
 
   /** @test */
   public function buttonNoticeBokehShouldBePresent() {
+    $this->dispatch('/opac/recherche/viewnotice/id/2/inspector_gadget/1', true);
+
     $this->assertXPathContentContains('//button', 'Notice Bokeh');
   }
+
+
+  /** @test */
+  public function inspectorShouldContainsButtonToDeleteItem() {
+    $this->dispatch('/opac/recherche/viewnotice/id/2/inspector_gadget/1', true);
+
+    $this->assertXPath('//button[contains(@onclick, "\/admin\/records\/delete-item\/id\/4")]');
+  }
+
+
+  /** @test */
+  public function inspectorAsRegularUserShouldNotContainsButtonToDeleteItem() {
+    Class_Users::getIdentity()->beModoBib();
+    $this->dispatch('/opac/recherche/viewnotice/id/2/inspector_gadget/1', true);
+
+    $this->assertNotXPath('//button[contains(@onclick, "\/admin\/records\/delete-item\/id\/4")]');
+  }
 }
 
 
-- 
GitLab