From f3d2d2fa2454d58ac353f20aedb9ff1060fd9875 Mon Sep 17 00:00:00 2001 From: Jared Camins-Esakov Date: Sat, 28 Sep 2013 12:22:34 -0400 Subject: [PATCH] Bug 10402 follow-up: choose contacts for serials and acq claims This patch makes it possible to choose a particular contact for acquisitions and serials claims. To test: 1) Select a contact to use for claiming late orders and a contact to use for claiming late issues. 2) Send a claim for a late order and a claim for a late issue. 3) Note that the claims went out to the proper people. 4) Run the unit test with: > prove t/db_dependent/Letters.t 5) Sign off. Note: the claim messages are recorded in the logs in the *Acquisitions* module, not the Letters module as you might expect --- C4/Bookseller/Contact.pm | 23 +++-- C4/Letters.pm | 9 +- acqui/updatesupplier.pl | 14 +-- installer/data/mysql/kohastructure.sql | 5 +- installer/data/mysql/updatedatabase.pl | 16 +++- .../prog/en/modules/acqui/supplier.tt | 35 ++++++++ t/db_dependent/Letters.t | 92 ++++++++++++++++++++ 7 files changed, 173 insertions(+), 21 deletions(-) create mode 100644 t/db_dependent/Letters.t diff --git a/C4/Bookseller/Contact.pm b/C4/Bookseller/Contact.pm index 09ec8da..7004cb1 100644 --- a/C4/Bookseller/Contact.pm +++ b/C4/Bookseller/Contact.pm @@ -63,10 +63,13 @@ Contact's e-mail address. Notes about contact. -=item rank +=item claimacquistion -Ranking of the contact so that the contact can be given the correct -priority in display. +Whether the contact should receive acquisitions claims. + +=item claimissues + +Whether the contact should receive serials claims. =item bookseller @@ -81,7 +84,7 @@ use C4::Context; use base qw(Class::Accessor); -__PACKAGE__->mk_accessors(qw(id name position phone altphone fax email notes rank bookseller)); +__PACKAGE__->mk_accessors(qw(id name position phone altphone fax email notes claimacquisition claimissues bookseller)); =head1 METHODS @@ -152,12 +155,18 @@ sub save { my ($self) = @_; my $query; - my @params = ($self->name, $self->position, $self->phone, $self->altphone, $self->fax, $self->email, $self->notes, $self->rank, $self->bookseller); + my @params = ( + $self->name, $self->position, + $self->phone, $self->altphone, + $self->fax, $self->email, + $self->notes, $self->claimacquisition ? 1 : 0, + $self->claimissues ? 1 : 0, $self->bookseller + ); if ($self->id) { - $query = 'UPDATE aqcontacts SET name = ?, position = ?, phone = ?, altphone = ?, fax = ?, email = ?, notes = ?, rank = ?, booksellerid = ? WHERE id = ?;'; + $query = 'UPDATE aqcontacts SET name = ?, position = ?, phone = ?, altphone = ?, fax = ?, email = ?, notes = ?, claimacquisition = ?, claimissues = ?, booksellerid = ? WHERE id = ?;'; push @params, $self->id; } else { - $query = 'INSERT INTO aqcontacts (name, position, phone, altphone, fax, email, notes, rank, booksellerid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);'; + $query = 'INSERT INTO aqcontacts (name, position, phone, altphone, fax, email, notes, claimacquisition, claimissues, booksellerid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);'; } my $dbh = C4::Context->dbh; my $sth = $dbh->prepare($query); diff --git a/C4/Letters.pm b/C4/Letters.pm index 93bc34d..55190fc 100644 --- a/C4/Letters.pm +++ b/C4/Letters.pm @@ -346,10 +346,14 @@ sub SendAlerts { $dbh->prepare("select * from aqbooksellers where id=?"); $sthbookseller->execute( $dataorders->[0]->{booksellerid} ); my $databookseller = $sthbookseller->fetchrow_hashref; + my $sthcontact = + $dbh->prepare("SELECT * FROM aqcontacts WHERE booksellerid=? AND $type=1 LIMIT 1"); + $sthcontact->execute( $dataorders->[0]->{booksellerid} ); + my $datacontact = $sthcontact->fetchrow_hashref; my @email; push @email, $databookseller->{bookselleremail} if $databookseller->{bookselleremail}; - push @email, $databookseller->{contemail} if $databookseller->{contemail}; + push @email, $datacontact->{email} if ( $datacontact && $datacontact->{email} ); unless (@email) { warn "Bookseller $dataorders->[0]->{booksellerid} without emails"; return { error => "no_email" }; @@ -363,6 +367,7 @@ sub SendAlerts { tables => { 'branches' => $userenv->{branch}, 'aqbooksellers' => $databookseller, + 'aqcontacts' => $datacontact, }, repeat => $dataorders, want_librarian => 1, @@ -383,7 +388,7 @@ sub SendAlerts { $type eq 'claimissues' ? "CLAIM ISSUE" : "ACQUISITION CLAIM", undef, "To=" - . $databookseller->{contemail} + . join( ',', @email ) . " Title=" . $letter->{title} . " Content=" diff --git a/acqui/updatesupplier.pl b/acqui/updatesupplier.pl index 7ce5633..33a9297 100755 --- a/acqui/updatesupplier.pl +++ b/acqui/updatesupplier.pl @@ -37,10 +37,12 @@ All informations regarding this supplier are listed on input parameter. Here is the list : supplier, id, company, company_postal, physical, company_phone, -physical, company_phone, company_fax, website, company_contact_name, -company_contact_position, contact_phone, contact_phone_2, contact_fax, -company_email, contact_notes, notes, status, publishers_imprints, -list_currency, gst, list_gst, invoice_gst, discount, gstrate. +physical, company_phone, company_fax, website, company_email, notes, +status, publishers_imprints, list_currency, gst, list_gst, invoice_gst, +discount, gstrate, contact_name, contact_position, contact_phone, +contact_altphone, contact_fax, contact_email, contact_notes, +contact_claimacquisition, contact_claimissues. + =cut @@ -102,14 +104,14 @@ $data{'active'}=$input->param('status'); my @contacts; my %contact_info; -foreach (qw(id name position phone altphone fax email notes)) { +foreach (qw(id name position phone altphone fax email notes claimacquisition claimissues)) { $contact_info{$_} = [ $input->param('contact_' . $_) ]; } for my $cnt (0..scalar(@{$contact_info{'id'}})) { my %contact; my $real_contact; - foreach (qw(id name position phone altphone fax email notes)) { + foreach (qw(id name position phone altphone fax email notes claimacquisition claimissues)) { $contact{$_} = $contact_info{$_}->[$cnt]; $real_contact = 1 if $contact{$_}; } diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 11ebc41..8cddebd 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -2869,10 +2869,11 @@ CREATE TABLE aqcontacts ( fax varchar(100) default NULL, -- contact's fax number email varchar(100) default NULL, -- contact's email address notes mediumtext, -- notes related to the contact - rank SMALLINT default 0, -- display rank for the contact + claimacquisition BOOLEAN NOT NULL DEFAULT 0, -- should this contact receive acquisitions claims + claimissues BOOLEAN NOT NULL DEFAULT 0, -- should this contact receive serial claims booksellerid int(11) not NULL, PRIMARY KEY (id), - CONSTRAINT booksellerid_fk2 FOREIGN KEY (booksellerid) + CONSTRAINT booksellerid_aqcontacts_fk FOREIGN KEY (booksellerid) REFERENCES aqbooksellers (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 00f92ca..9074d11 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -7166,20 +7166,28 @@ if ( CheckVersion($DBversion) ) { fax varchar(100) default NULL, email varchar(100) default NULL, notes mediumtext, - rank SMALLINT default 0, + claimacquisition BOOLEAN NOT NULL DEFAULT 0, + claimissues BOOLEAN NOT NULL DEFAULT 0, booksellerid int(11) not NULL, PRIMARY KEY (id), - CONSTRAINT booksellerid_fk2 FOREIGN KEY (booksellerid) + CONSTRAINT booksellerid_aqcontacts_fk FOREIGN KEY (booksellerid) REFERENCES aqbooksellers (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;"); $dbh->do("INSERT INTO aqcontacts (name, position, phone, altphone, fax, - email, notes, booksellerid) + email, notes, booksellerid, claimacquisition, claimissues) SELECT contact, contpos, contphone, contaltphone, contfax, contemail, - contnotes, id FROM aqbooksellers;"); + contnotes, id, 1, 1 FROM aqbooksellers;"); $dbh->do("ALTER TABLE aqbooksellers DROP COLUMN contact, DROP COLUMN contpos, DROP COLUMN contphone, DROP COLUMN contaltphone, DROP COLUMN contfax, DROP COLUMN contemail, DROP COLUMN contnotes;"); + $dbh->do("UPDATE letter SET content = replace(content, '<>', '<>')"); + $dbh->do("UPDATE letter SET content = replace(content, '<>', '<>')"); + $dbh->do("UPDATE letter SET content = replace(content, '<>', '<>')"); + $dbh->do("UPDATE letter SET content = replace(content, '<>', '<>')"); + $dbh->do("UPDATE letter SET content = replace(content, '<>', '<>')"); + $dbh->do("UPDATE letter SET content = replace(content, '<>', '<>')"); + $dbh->do("UPDATE letter SET content = replace(content, '<>', '<>')"); print "Upgrade to $DBversion done (Bug 10402: Move bookseller contacts to separate table)\n"; SetVersion($DBversion); } diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/supplier.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/supplier.tt index 853ff54..45eb50e 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/supplier.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/supplier.tt @@ -16,6 +16,21 @@
  • +
  • + [% IF contact.claimacquisition %] + + [% ELSE %] + + [% END %] + +
  • + [% IF contact.claimissues %] + + [% ELSE %] + + [% END %] + +
  • [% IF contact.id %]
  • [% END %] [% END %] @@ -32,6 +47,12 @@ [% IF ( contact.notes ) %]

    Notes: [% contact.notes %]

    [% END %] + [% IF ( contact.claimacquisition ) %] +

    Receives claims for late orders

    + [% END %] + [% IF ( contact.claimissues ) %] +

    Receives claims for late issues

    + [% END %] [% END %] [% INCLUDE 'doc-head-open.inc' %] @@ -93,6 +114,20 @@ function delete_contact() { } ) ); $('.delete-contact').click(delete_contact); $('#add-contact').click(add_contact); + $('.contact_claimacquisition').click(function () { + $('.contact_claimacquisition').filter(':checked').not(this).removeAttr('checked'); + $('.contact_claimacquisition_hidden').each(function () { + $(this).val('0'); + }); + $(this).next('.contact_claimacquisition_hidden').val('1'); + }); + $('.contact_claimissues').click(function () { + $('.contact_claimissues').filter(':checked').not(this).removeAttr('checked'); + $('.contact_claimissues_hidden').each(function () { + $(this).val('0'); + }); + $(this).next('.contact_claimissues_hidden').val('1'); + }); }); //]]> diff --git a/t/db_dependent/Letters.t b/t/db_dependent/Letters.t new file mode 100644 index 0000000..0206903 --- /dev/null +++ b/t/db_dependent/Letters.t @@ -0,0 +1,92 @@ +#!/usr/bin/perl +# +# This Koha test module is a stub! +# Add more tests here!!! + +use strict; +use warnings; +use Test::MockModule; +use Test::More tests => 9; + +my %mail; +my $module = new Test::MockModule('Mail::Sendmail'); +$module->mock( + 'sendmail', + sub { + %mail = @_; + } +); + +use_ok('C4::Context'); +use_ok('C4::Acquisition'); +use_ok('C4::Biblio'); +use_ok('C4::Bookseller'); + +my $dbh = C4::Context->dbh; +$dbh->{AutoCommit} = 0; +$dbh->{RaiseError} = 1; + +$dbh->do(q{INSERT INTO letter (module, code, name, title, content) VALUES ('claimacquisition','TESTACQCLAIM','Acquisition Claim','Item Not Received','<>|<>|Ordernumber <> (<>) (<> ordered)');}); + +use_ok('C4::Letters'); + +my $booksellerid = C4::Bookseller::AddBookseller( + { + name => "my vendor", + address1 => "bookseller's address", + phone => "0123456", + active => 1, + deliverytime => 5, + }, + [ + { name => 'John Smith', phone => '0123456x1', claimacquisition => 1 }, + { name => 'Leo Tolstoy', phone => '0123456x2', claimissues => 1 }, + ] +); +my $basketno = NewBasket($booksellerid, 1); + +my $budgetid = C4::Budgets::AddBudget({ + budget_code => "budget_code_test_letters", + budget_name => "budget_name_test_letters", +}); + +my $ordernumber; +my $bib = MARC::Record->new(); +if (C4::Context->preference('marcflavour') eq 'UNIMARC') { + $bib->append_fields( + MARC::Field->new('200', ' ', ' ', a => 'Silence in the library'), + ); +} else { + $bib->append_fields( + MARC::Field->new('245', ' ', ' ', a => 'Silence in the library'), + ); +} + +my ($biblionumber, $biblioitemnumber) = AddBiblio($bib, ''); +( undef, $ordernumber ) = C4::Acquisition::NewOrder( + { + basketno => $basketno, + quantity => 1, + biblionumber => $biblionumber, + budget_id => $budgetid, + } +); + +C4::Acquisition::CloseBasket( $basketno ); +my $err; +eval { + warn "This test may issue a warning. Please ignore it.\n"; + $err = SendAlerts( 'claimacquisition', [ $ordernumber ], 'TESTACQCLAIM' ); +}; +is($err->{'error'}, 'no_email', "Trying to send an alert when there's no e-mail results in an error"); + +my $bookseller = C4::Bookseller::GetBookSellerFromId($booksellerid); +$bookseller->{'contacts'}->[0]->email('testemail@mydomain.com'); +C4::Bookseller::ModBookseller($bookseller); + +eval { + $err = SendAlerts( 'claimacquisition', [ $ordernumber ], 'TESTACQCLAIM' ); +}; +is($err, 1, "Successfully sent claim"); +is($mail{'To'}, 'testemail@mydomain.com'); +is($mail{'Message'}, 'my vendor|John Smith|Ordernumber ' . $ordernumber . ' (Silence in the library) (1 ordered)', 'Claim notice text constructed successfully'); -- 1.7.9.5