Bug 10402: Add ability to enter multiple contacts
authorJared Camins-Esakov <jcamins@cpbibliography.com>
Thu, 13 Jun 2013 15:31:21 +0000 (11:31 -0400)
committerTomas Cohen Arazi <tomascohen@gmail.com>
Tue, 26 Aug 2014 14:45:52 +0000 (11:45 -0300)
Some vendors may have more than one contact. For example, a technical
contact and a billing contact, or a contact for journals and a contact
for monographs. Rather than require that each contact be either made
into a separate vendor or recorded somewhere outside of Koha, it would
be really useful of Koha had the ability to add multiple additional
contacts to vendors in the Acquisitions module.

To test:
1) Apply patch.
2) Edit a bookseller, making sure to add a contact.
3) View the bookseller's information, making sure the contact
   information is there.
4) Run the unit test:
    > prove t/db_dependent/Bookseller.t
5) Add multiple contacts to a vendor, see that they show up.
6) Delete one contact from a vendor with multiple contacts,
   see that the result is correct.
7) Sign off.

Note: This test plan can supersede that on the previous two patches,
as all functionality of the previous two patches is required by this
one.

Signed-off-by: Owen Leonard <oleonard@myacpl.org>
Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
Signed-off-by: Paola Rossi <paola.rossi@cineca.it>

Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>

C4/Bookseller.pm
acqui/updatesupplier.pl
koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css
koha-tmpl/intranet-tmpl/prog/en/modules/acqui/supplier.tt
t/db_dependent/Bookseller.t

index 6ceb606..4386bb4 100644 (file)
@@ -209,10 +209,12 @@ sub AddBookseller {
     # return the id of this new supplier
     my $id = $dbh->{'mysql_insertid'};
     if ($id && $contacts) {
-        $contacts->[0] = C4::Bookseller::Contact->new( $contacts->[0] )
-          unless ref $contacts->[0] eq 'C4::Bookseller::Contact';
-        $contacts->[0]->bookseller($id);
-        $contacts->[0]->save();
+        foreach my $contact (@$contacts) {
+            $contact = C4::Bookseller::Contact->new( $contact )
+                unless ref $contacts eq 'C4::Bookseller::Contact';
+            $contact->bookseller($id);
+            $contact->save();
+        }
     }
     return $id;
 }
@@ -265,7 +267,7 @@ sub ModBookseller {
     if ($contacts) {
         foreach my $contact (@$contacts) {
             $contact = C4::Bookseller::Contact->new( $contact )
-                unless ref $contacts->[0] eq 'C4::Bookseller::Contact';
+                unless ref $contacts eq 'C4::Bookseller::Contact';
             $contact->bookseller($data->{'id'});
             $contact->save();
             push @contactparams, $contact->id if $contact->id;
index 77fa276..7ce5633 100755 (executable)
@@ -108,10 +108,12 @@ foreach (qw(id name position phone altphone fax email notes)) {
 
 for my $cnt (0..scalar(@{$contact_info{'id'}})) {
     my %contact;
+    my $real_contact;
     foreach (qw(id name position phone altphone fax email notes)) {
         $contact{$_} = $contact_info{$_}->[$cnt];
+        $real_contact = 1 if $contact{$_};
     }
-    push @contacts, C4::Bookseller::Contact->new(\%contact);
+    push @contacts, C4::Bookseller::Contact->new(\%contact) if $real_contact;
 }
 
 if($data{'name'}) {
index f08fe54..93dd519 100644 (file)
@@ -1966,6 +1966,14 @@ div#acqui_order_supplierlist > div.supplier > div.baskets {
     float: left;
 }
 
+#add-contact {
+    margin: 0 0 8px 8px;
+}
+
+#contact-template {
+    display: none;
+}
+
 /* Override core jQueryUI widgets */
 .ui-widget-content { border: 1px solid #B9D8D9; background: #ffffff none; color: #222222; }
 .ui-widget-header { border: 1px solid #B9D8D9; background: #E6F0F2 none; color: #222222; font-weight: bold; }
index e851a64..549ea49 100644 (file)
@@ -2,20 +2,21 @@
 [% BLOCK edit_contact %]
     <ol id="contact-form">
         <input type="hidden" name="contact_id" value="[% contact.id %]" />
-        <li><label for="contact_name">Contact name: </label>
-            <input type="text" size="40" id="contact_name" name="contact_name" value="[% contact.name %]" /></li>
-        <li><label for="contact_position">Position: </label>
-            <input type="text" size="40" id="contact_position" name="contact_position" value="[% contact.position %]" /></li>
-        <li><label for="contact_phone">Phone: </label>
-                <input type="text" size="20" id="contact_phone" name="contact_phone" value="[% contact.phone %]" /> </li>
-        <li><label for="contact_phone_2">Alternative phone: </label>
-            <input type="text" size="20" id="contact_altphone" name="contact_altphone" value="[% contact.altphone %]" /></li>
-        <li><label for="contact_fax">Fax: </label>
-            <input type="text" size="20" id="contact_fax" name="contact_fax" value="[% contact.fax %]" /></li>
-        <li><label for="contact_email">Email: </label>
-            <input type="text" size="40" id="contact_email" name="contact_email" value="[% contact.email %]" /></li>
-        <li><label for="contact_notes">Notes: </label>
-            <textarea id="contact_notes" name="contact_notes" cols="40" rows="4">[% contnotes %]</textarea></li>
+        <li><label for="contact_name[% contact.id %]">Contact name: </label>
+            <input type="text" size="40" id="contact_name[% contact.id %]" name="contact_name" value="[% contact.name %]" /></li>
+        <li><label for="contact_position[% contact.id %]">Position: </label>
+            <input type="text" size="40" id="contact_position[% contact.id %]" name="contact_position" value="[% contact.position %]" /></li>
+        <li><label for="contact_phone[% contact.id %]">Phone: </label>
+                <input type="text" size="20" id="contact_phone[% contact.id %]" name="contact_phone" value="[% contact.phone %]" /> </li>
+        <li><label for="contact_altphone[% contact.id %]">Alternative phone: </label>
+            <input type="text" size="20" id="contact_altphone[% contact.id %]" name="contact_altphone" value="[% contact.altphone %]" /></li>
+        <li><label for="contact_fax[% contact.id %]">Fax: </label>
+            <input type="text" size="20" id="contact_fax[% contact.id %]" name="contact_fax" value="[% contact.fax %]" /></li>
+        <li><label for="contact_email[% contact.id %]">Email: </label>
+            <input type="text" size="40" id="contact_email[% contact.id %]" name="contact_email" value="[% contact.email %]" /></li>
+        <li><label for="contact_notes[% contact.id %]">Notes: </label>
+            <textarea id="contact_notes[% contact.id %]" name="contact_notes" cols="40" rows="4">[% contnotes %]</textarea></li>
+        [% IF contact.id %]<li><button class="btn" class="delete-contact"><i class="icon-remove"></i>Delete contact</li>[% END %]
     </ol>
 [% END %]
 [% BLOCK show_contact %]
@@ -46,6 +47,23 @@ function confirm_deletion() {
 }
 
 function add_contact() {
+    var new_contact = $('#contact-template').clone();
+    var timestamp = new Date().getTime();
+    $(new_contact).removeAttr('id');
+    $('input, textarea', new_contact).each(function () {
+        $(this).attr('id', $(this).attr('id') + '_' + timestamp);
+    });
+    $('label', new_contact).each(function () {
+        $(this).attr('for', $(this).attr('for') + '_' + timestamp);
+    });
+    $(new_contact).insertBefore(this);
+    $('input[name="contact_name"]', new_contact).focus();
+    return false;
+}
+
+function delete_contact() {
+    $(this).parents('fieldset').delete();
+    return false;
 }
 
  $(document).ready(function() {
@@ -56,6 +74,8 @@ function add_contact() {
         ],
         'sDom': 't'
     } ) );
+    $('.delete-contact').click(delete_contact);
+    $('#add-contact').click(add_contact);
  });
 //]]>
 </script>
@@ -100,12 +120,20 @@ function add_contact() {
             <li><label for="accountnumber">Account number: </label>
                 <input type="text" size="40" id="accountnumber" name="accountnumber" value="[% accountnumber %]" /></li></ol>
         </fieldset>
-        [% FOREACH contact IN contacts %]
-            <fieldset class="supplier-contact rows">
+        <fieldset class="rows">
+            <legend>Contacts</legend>
+            <fieldset id="contact-template" class="supplier-contact">
                 <legend>Contact details</legend>
                 [% INCLUDE edit_contact %]
             </fieldset>
-        [% END %]
+            [% FOREACH contact IN contacts %]
+                <fieldset class="supplier-contact">
+                    <legend>Contact details</legend>
+                    [% INCLUDE edit_contact %]
+                </fieldset>
+            [% END %]
+            <button id="add-contact" class="btn"><i class="icon-plus"></i>Add contact</button>
+        </fieldset>
     </div>
         <div class="yui-g">
         <fieldset class="rows">
index 2f73c81..5de547a 100644 (file)
@@ -710,12 +710,15 @@ my $booksellerid = C4::Bookseller::AddBookseller(
         phone    => "0123456",
         active   => 1
     },
-    [ { name => 'John Smith', phone => '0123456x1' } ]
+    [
+        { name => 'John Smith',  phone => '0123456x1' },
+        { name => 'Leo Tolstoy', phone => '0123456x2' },
+    ]
 );
 
 my @booksellers = C4::Bookseller::GetBookSeller('my vendor');
 ok(
-    (grep { $_->{'id'} == $booksellerid } @booksellers),
+    ( grep { $_->{'id'} == $booksellerid } @booksellers ),
     'GetBookSeller returns correct record when passed a name'
 );
 
@@ -731,7 +734,9 @@ is(
 );
 is( $bookseller->{'contacts'}->[0]->phone,
     '0123456x1', 'Contact has expected phone number' );
+is( scalar @{ $bookseller->{'contacts'} }, 2, 'Saved two contacts' );
 
+pop @{ $bookseller->{'contacts'} };
 $bookseller->{'name'} = 'your vendor';
 $bookseller->{'contacts'}->[0]->phone('654321');
 C4::Bookseller::ModBookseller($bookseller);
@@ -742,6 +747,8 @@ is( $bookseller->{'name'}, 'your vendor',
 is( $bookseller->{'contacts'}->[0]->phone,
     '654321',
     'Successfully changed contact phone number by modifying bookseller hash' );
+is( scalar @{ $bookseller->{'contacts'} },
+    1, 'Only one contact after modification' );
 
 C4::Bookseller::ModBookseller( $bookseller,
     [ { name => 'John Jacob Jingleheimer Schmidt' } ] );
@@ -754,6 +761,8 @@ is(
 );
 is( $bookseller->{'contacts'}->[0]->phone,
     undef, 'Removed phone number from contact' );
+is( scalar @{ $bookseller->{'contacts'} },
+    1, 'Only one contact after modification' );
 
 #End transaction
 $dbh->rollback;