View | Details | Raw Unified | Return to bug 7290
Collapse All | Expand All

(-)a/C4/Acquisition.pm (-1 / +72 lines)
Lines 50-55 BEGIN { Link Here
50
50
51
        &GetBasketUsers &ModBasketUsers
51
        &GetBasketUsers &ModBasketUsers
52
        &CanUserManageBasket
52
        &CanUserManageBasket
53
        &CanUserReceiveOrder
53
54
54
        &ModBasketHeader
55
        &ModBasketHeader
55
56
Lines 722-727 sub CanUserManageBasket { Link Here
722
    return 1;
723
    return 1;
723
}
724
}
724
725
726
=head3 CanUserReceiveBasket
727
728
    my $bool = CanUserReceiveBasket($borrower, $order[, $userflags]);
729
    my $bool = CanUserReceiveBasket($borrowernumber, $orderno[, $userflags]);
730
731
Check if a borrower can receive a order, according to user permissions, current
732
working branch and order and basket branches.
733
734
First parameter can be either a borrowernumber or a hashref as returned by
735
C4::Members::GetMember.
736
737
Second parameter can be either a ordernumber or a hashref as returned by
738
C4::Acquisition::GetOrder.
739
740
The third parameter is optional. If given, it should be a hashref as returned
741
by C4::Auth::getuserflags. If not, getuserflags is called.
742
743
If user is authorised to receive order, returns 1.
744
Otherwise returns 0.
745
746
=cut
747
748
sub CanUserReceiveOrder {
749
    my ($borrower, $order, $userflags) = @_;
750
751
    if (!ref $borrower) {
752
        $borrower = C4::Members::GetMember(borrowernumber => $borrower);
753
    }
754
    if (!ref $order) {
755
        $order = GetOrder($order);
756
    }
757
758
    return 0 unless ($borrower and $order);
759
760
    if (!defined $userflags) {
761
        my $dbh = C4::Context->dbh;
762
        my $sth = $dbh->prepare("SELECT flags FROM borrowers WHERE borrowernumber = ?");
763
        $sth->execute($borrower->{borrowernumber});
764
        my ($flags) = $sth->fetchrow_array;
765
        $sth->finish;
766
767
        $userflags = C4::Auth::getuserflags($flags, $borrower->{userid}, $dbh);
768
    }
769
770
    my $branch = C4::Context->userenv->{'branch'};
771
772
    unless ($userflags->{superlibrarian}
773
    || (!ref $userflags->{acquisition} && $userflags->{acquisition})
774
    || (ref $userflags->{acquisition} && $userflags->{acquisition}->{order_receive_all}) )
775
    {
776
        if (!ref $userflags->{acquisition} && !$userflags->{acquisition}) {
777
            return 0;
778
        }
779
        if (ref $userflags->{acquisition} && !$userflags->{acquisition}->{order_receive}) {
780
            return 0;
781
        }
782
        if (defined $order->{branch} && $order->{branch} ne $branch) {
783
            return 0;
784
        }
785
        if (!defined $order->{branch}) {
786
            my $basket = GetBasket($order->{basketno});
787
            if (!$basket || (defined $basket->{branch} && $basket->{branch} ne $branch)) {
788
                return 0;
789
            }
790
        }
791
    }
792
793
    return 1;
794
}
795
725
#------------------------------------------------------------#
796
#------------------------------------------------------------#
726
797
727
=head3 GetBasketsByBasketgroup
798
=head3 GetBasketsByBasketgroup
Lines 977-983 sub GetPendingOrders { Link Here
977
        SELECT    ".($grouped?"count(*),":"")."aqbasket.basketno,
1048
        SELECT    ".($grouped?"count(*),":"")."aqbasket.basketno,
978
                    surname,firstname,biblio.*,biblioitems.isbn,
1049
                    surname,firstname,biblio.*,biblioitems.isbn,
979
                    aqbasket.closedate, aqbasket.creationdate, aqbasket.basketname,
1050
                    aqbasket.closedate, aqbasket.creationdate, aqbasket.basketname,
980
                    aqorders.*
1051
                    aqorders.*, biblioitems.ean
981
        FROM      aqorders
1052
        FROM      aqorders
982
        LEFT JOIN aqbasket ON aqbasket.basketno=aqorders.basketno
1053
        LEFT JOIN aqbasket ON aqbasket.basketno=aqorders.basketno
983
        LEFT JOIN borrowers ON aqbasket.authorisedby=borrowers.borrowernumber
1054
        LEFT JOIN borrowers ON aqbasket.authorisedby=borrowers.borrowernumber
(-)a/acqui/addorder.pl (+1 lines)
Lines 153-158 my ( $template, $loggedinuser, $cookie ) = get_template_and_user( Link Here
153
my $orderinfo					= $input->Vars;
153
my $orderinfo					= $input->Vars;
154
$orderinfo->{'list_price'}    ||=  0;
154
$orderinfo->{'list_price'}    ||=  0;
155
$orderinfo->{'uncertainprice'} ||= 0;
155
$orderinfo->{'uncertainprice'} ||= 0;
156
$orderinfo->{branch} = undef if (defined $orderinfo->{branch} and $orderinfo->{branch} eq '');
156
#my $ordernumber        = $input->param('ordernumber');
157
#my $ordernumber        = $input->param('ordernumber');
157
#my $basketno      = $input->param('basketno');
158
#my $basketno      = $input->param('basketno');
158
#my $booksellerid  = $input->param('booksellerid');
159
#my $booksellerid  = $input->param('booksellerid');
(-)a/acqui/finishreceive.pl (-1 / +15 lines)
Lines 35-41 use List::MoreUtils qw/any/; Link Here
35
my $input=new CGI;
35
my $input=new CGI;
36
my $flagsrequired = {acquisition => 'order_receive'};
36
my $flagsrequired = {acquisition => 'order_receive'};
37
37
38
checkauth($input, 0, $flagsrequired, 'intranet');
38
my ($userid, $cookie, undef, $userflags)
39
    = checkauth($input, 0, $flagsrequired, 'intranet');
40
39
41
40
my $user=$input->remote_user;
42
my $user=$input->remote_user;
41
my $biblionumber = $input->param('biblionumber');
43
my $biblionumber = $input->param('biblionumber');
Lines 56-61 my $error_url_str; Link Here
56
my $ecost = $input->param('ecost');
58
my $ecost = $input->param('ecost');
57
my $note = $input->param("note");
59
my $note = $input->param("note");
58
60
61
my $borrower = C4::Members::GetMember(userid => $userid);
62
unless (CanUserReceiveOrder($borrower, $ordernumber, $userflags)) {
63
    my $error = "cannot_receive_order";
64
    $error_url_str = "&error=$error";
65
    print $input->redirect(
66
        "/cgi-bin/koha/acqui/parcel.pl?invoice=$invoiceno"
67
        . "&booksellerid=$booksellerid&freight=$freight&gst=$gst"
68
        . "&datereceived=$datereceived$error_url_str"
69
    );
70
    exit;
71
}
72
59
#need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
73
#need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
60
if ($quantityrec > $origquantityrec ) {
74
if ($quantityrec > $origquantityrec ) {
61
    # now, add items if applicable
75
    # now, add items if applicable
(-)a/acqui/neworderempty.pl (-3 / +3 lines)
Lines 66-73 the item's id in the breeding reservoir Link Here
66
66
67
=cut
67
=cut
68
68
69
use warnings;
69
use Modern::Perl;
70
use strict;
70
71
use CGI;
71
use CGI;
72
use C4::Context;
72
use C4::Context;
73
use C4::Input;
73
use C4::Input;
Lines 239-245 foreach my $thisbranch ( sort {$branches->{$a}->{'branchname'} cmp $branches->{$ Link Here
239
        value      => $thisbranch,
239
        value      => $thisbranch,
240
        branchname => $branches->{$thisbranch}->{'branchname'},
240
        branchname => $branches->{$thisbranch}->{'branchname'},
241
    );
241
    );
242
    $row{'selected'} = 1 if( $thisbranch && $data->{branchcode} && $thisbranch eq $data->{branchcode}) ;
242
    $row{'selected'} = 1 if( $thisbranch && $data->{branch} && $thisbranch eq $data->{branch}) ;
243
    push @branchloop, \%row;
243
    push @branchloop, \%row;
244
}
244
}
245
$template->param( branchloop => \@branchloop );
245
$template->param( branchloop => \@branchloop );
(-)a/acqui/orderreceive.pl (-1 / +14 lines)
Lines 97-103 my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst')); Link Here
97
my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
97
my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
98
my $results = SearchOrder($ordernumber,$search);
98
my $results = SearchOrder($ordernumber,$search);
99
99
100
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
100
101
my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
101
    {
102
    {
102
        template_name   => "acqui/orderreceive.tmpl",
103
        template_name   => "acqui/orderreceive.tmpl",
103
        query           => $input,
104
        query           => $input,
Lines 113-118 my $count = scalar @$results; Link Here
113
if ( $count == 1 ) {
114
if ( $count == 1 ) {
114
    my $order = $results->[0];
115
    my $order = $results->[0];
115
116
117
    unless (CanUserReceiveOrder($loggedinuser, $order, $userflags)) {
118
        $template->param(
119
            cannot_receive_order => 1,
120
            ordernumber => $ordernumber,
121
            invoice => $invoice,
122
            booksellerid => $booksellerid,
123
            name => $bookseller->{name}
124
        );
125
        output_html_with_http_headers $input, $cookie, $template->output;
126
        exit;
127
    }
128
116
    # Check if ACQ framework exists
129
    # Check if ACQ framework exists
117
    my $acq_fw = GetMarcStructure(1, 'ACQ');
130
    my $acq_fw = GetMarcStructure(1, 'ACQ');
118
    unless($acq_fw) {
131
    unless($acq_fw) {
(-)a/acqui/parcel.pl (-45 / +13 lines)
Lines 56-63 To filter the results list on this given date. Link Here
56
56
57
=cut
57
=cut
58
58
59
use strict;
59
use Modern::Perl;
60
#use warnings; FIXME - Bug 2505
60
61
use C4::Auth;
61
use C4::Auth;
62
use C4::Acquisition;
62
use C4::Acquisition;
63
use C4::Budgets;
63
use C4::Budgets;
Lines 76-82 my $bookseller=GetBookSellerFromId($booksellerid); Link Here
76
76
77
my $invoice=$input->param('invoice') || '';
77
my $invoice=$input->param('invoice') || '';
78
my $freight=$input->param('freight');
78
my $freight=$input->param('freight');
79
my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst'));
79
my $input_gst = $input->param('gst');
80
$input_gst = (!defined $input_gst or $input_gst eq '') ? undef : $input_gst;
80
my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
81
my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
81
my $datereceived =  ($input->param('op') eq 'new') ? C4::Dates->new($input->param('datereceived')) 
82
my $datereceived =  ($input->param('op') eq 'new') ? C4::Dates->new($input->param('datereceived')) 
82
					:  C4::Dates->new($input->param('datereceived'), 'iso')   ;
83
					:  C4::Dates->new($input->param('datereceived'), 'iso')   ;
Lines 85-96 my $code = $input->param('code'); Link Here
85
my @rcv_err         = $input->param('error');
86
my @rcv_err         = $input->param('error');
86
my @rcv_err_barcode = $input->param('error_bc');
87
my @rcv_err_barcode = $input->param('error_bc');
87
88
88
my $startfrom=$input->param('startfrom');
89
my $format = $input->param('format');
89
my $resultsperpage = $input->param('resultsperpage');
90
if ($format and $format eq 'json'){
90
$resultsperpage = 20 unless ($resultsperpage);
91
$startfrom=0 unless ($startfrom);
92
93
if($input->param('format') eq "json"){
94
    my ($template, $loggedinuser, $cookie)
91
    my ($template, $loggedinuser, $cookie)
95
        = get_template_and_user({template_name => "acqui/ajax.tmpl",
92
        = get_template_and_user({template_name => "acqui/ajax.tmpl",
96
                 query => $input,
93
                 query => $input,
Lines 133-139 if($input->param('format') eq "json"){ Link Here
133
    exit;
130
    exit;
134
}
131
}
135
132
136
my ($template, $loggedinuser, $cookie)
133
my ($template, $loggedinuser, $cookie, $userflags)
137
    = get_template_and_user({template_name => "acqui/parcel.tmpl",
134
    = get_template_and_user({template_name => "acqui/parcel.tmpl",
138
                 query => $input,
135
                 query => $input,
139
				 type => "intranet",
136
				 type => "intranet",
Lines 251-302 for (my $i = 0 ; $i < $countpendings ; $i++) { Link Here
251
    $line{biblios}              = $countbiblio - 1;
248
    $line{biblios}              = $countbiblio - 1;
252
    $line{left_subscription}    = 1 if scalar @subscriptions >= 1;
249
    $line{left_subscription}    = 1 if scalar @subscriptions >= 1;
253
    $line{subscriptions}        = scalar @subscriptions;
250
    $line{subscriptions}        = scalar @subscriptions;
254
    $line{left_holds}           = 1 if $holds >= 1;
251
    $line{left_holds}           = ($holds >= 1) ? 1 : 0;
255
    $line{left_holds_on_order}  = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds );
252
    $line{left_holds_on_order}  = 1 if $line{left_holds}==1 && ($line{items} == 0 || $itemholds );
256
    $line{holds}                = $holds;
253
    $line{holds}                = $holds;
257
    $line{holds_on_order}       = $itemholds?$itemholds:$holds if $line{left_holds_on_order};
254
    $line{holds_on_order}       = $itemholds?$itemholds:$holds if $line{left_holds_on_order};
258
    
255
    
256
    $line{can_receive} = CanUserReceiveOrder($loggedinuser, $pendingorders->[$i], $userflags);
259
    
257
    
260
    push @loop_orders, \%line if ($i >= $startfrom and $i < $startfrom + $resultsperpage);
258
    push @loop_orders, \%line;
261
}
259
}
262
$freight = $totalfreight unless $freight;
260
$freight = $totalfreight unless $freight;
263
261
264
my $count = $countpendings;
262
my $count = $countpendings;
265
263
266
if ($count>$resultsperpage){
264
$tototal //= 0;
267
    my $displaynext=0;
268
    my $displayprev=$startfrom;
269
    if(($count - ($startfrom+$resultsperpage)) > 0 ) {
270
        $displaynext = 1;
271
    }
272
273
    my @numbers = ();
274
    for (my $i=1; $i<$count/$resultsperpage+1; $i++) {
275
            my $highlight=0;
276
            ($startfrom/$resultsperpage==($i-1)) && ($highlight=1);
277
            push @numbers, { number => $i,
278
                highlight => $highlight ,
279
                startfrom => ($i-1)*$resultsperpage};
280
    }
281
282
    my $from = $startfrom*$resultsperpage+1;
283
    my $to;
284
    if($count < (($startfrom+1)*$resultsperpage)){
285
        $to = $count;
286
    } else {
287
        $to = (($startfrom+1)*$resultsperpage);
288
    }
289
    $template->param(numbers=>\@numbers,
290
                     displaynext=>$displaynext,
291
                     displayprev=>$displayprev,
292
                     nextstartfrom=>(($startfrom+$resultsperpage<$count)?$startfrom+$resultsperpage:$count),
293
                     prevstartfrom=>(($startfrom-$resultsperpage>0)?$startfrom-$resultsperpage:0)
294
                    );
295
}
296
297
#$totalfreight=$freight;
298
$tototal = $tototal + $freight;
265
$tototal = $tototal + $freight;
299
266
267
warn Data::Dumper::Dumper \@loop_orders;
268
300
$template->param(
269
$template->param(
301
    invoice               => $invoice,
270
    invoice               => $invoice,
302
    datereceived          => $datereceived->output('iso'),
271
    datereceived          => $datereceived->output('iso'),
Lines 322-328 $template->param( Link Here
322
    totalPquantity        => $totalPquantity,
291
    totalPquantity        => $totalPquantity,
323
    totalPqtyrcvd         => $totalPqtyrcvd,
292
    totalPqtyrcvd         => $totalPqtyrcvd,
324
    totalPecost           => sprintf("%.2f", $totalPecost),
293
    totalPecost           => sprintf("%.2f", $totalPecost),
325
    resultsperpage        => $resultsperpage,
326
    (uc(C4::Context->preference("marcflavour"))) => 1
294
    (uc(C4::Context->preference("marcflavour"))) => 1
327
);
295
);
328
output_html_with_http_headers $input, $cookie, $template->output;
296
output_html_with_http_headers $input, $cookie, $template->output;
(-)a/installer/data/mysql/de-DE/mandatory/userpermissions.sql (+1 lines)
Lines 18-23 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
18
   (11, 'order_manage_all', 'Manage all orders & baskets'),
18
   (11, 'order_manage_all', 'Manage all orders & baskets'),
19
   (11, 'group_manage', 'Bestellgruppen vewalten'),
19
   (11, 'group_manage', 'Bestellgruppen vewalten'),
20
   (11, 'order_receive', 'Lieferungen verwalten'),
20
   (11, 'order_receive', 'Lieferungen verwalten'),
21
   (11, 'order_receive_all', 'Receive all orders'),
21
   (11, 'budget_add_del', 'Konten hinzufügen/ändern, aber bestehende nicht ändern'),
22
   (11, 'budget_add_del', 'Konten hinzufügen/ändern, aber bestehende nicht ändern'),
22
   (11, 'budget_manage_all', 'Manage all budgets'),
23
   (11, 'budget_manage_all', 'Manage all budgets'),
23
   (13, 'edit_news', 'Nachrichten für OPAC und Dienstoberfläche verfassen'),
24
   (13, 'edit_news', 'Nachrichten für OPAC und Dienstoberfläche verfassen'),
(-)a/installer/data/mysql/en/mandatory/userpermissions.sql (+1 lines)
Lines 18-23 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
18
   (11, 'order_manage_all', 'Manage all orders & baskets'),
18
   (11, 'order_manage_all', 'Manage all orders & baskets'),
19
   (11, 'group_manage', 'Manage orders & basketgroups'),
19
   (11, 'group_manage', 'Manage orders & basketgroups'),
20
   (11, 'order_receive', 'Manage orders & basket'),
20
   (11, 'order_receive', 'Manage orders & basket'),
21
   (11, 'order_receive_all', 'Receive all orders'),
21
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
22
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
22
   (11, 'budget_manage_all', 'Manage all budgets'),
23
   (11, 'budget_manage_all', 'Manage all budgets'),
23
   (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
24
   (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
(-)a/installer/data/mysql/es-ES/mandatory/userpermissions.sql (+1 lines)
Lines 18-23 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
18
   (11, 'order_manage_all', 'Manage all orders & baskets'),
18
   (11, 'order_manage_all', 'Manage all orders & baskets'),
19
   (11, 'group_manage', 'Manage orders & basketgroups'),
19
   (11, 'group_manage', 'Manage orders & basketgroups'),
20
   (11, 'order_receive', 'Manage orders & basket'),
20
   (11, 'order_receive', 'Manage orders & basket'),
21
   (11, 'order_receive_all', 'Receive all orders'),
21
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
22
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
22
   (11, 'budget_manage_all', 'Manage all budgets'),
23
   (11, 'budget_manage_all', 'Manage all budgets'),
23
   (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
24
   (13, 'edit_news', 'Write news for the OPAC and staff interfaces'),
(-)a/installer/data/mysql/fr-FR/1-Obligatoire/userpermissions.sql (+1 lines)
Lines 35-40 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
35
   (11, 'order_manage_all', 'Gérer toutes les commandes et panier'),
35
   (11, 'order_manage_all', 'Gérer toutes les commandes et panier'),
36
   (11, 'group_manage', 'Gérer les commandes et les bons de commande'),
36
   (11, 'group_manage', 'Gérer les commandes et les bons de commande'),
37
   (11, 'order_receive', 'Gérer les réceptions'),
37
   (11, 'order_receive', 'Gérer les réceptions'),
38
   (11, 'order_receive_all', 'Gérer toutes les réceptions'),
38
   (11, 'budget_add_del', 'Ajouter et supprimer les budgets (mais pas modifier)'),
39
   (11, 'budget_add_del', 'Ajouter et supprimer les budgets (mais pas modifier)'),
39
   (11, 'budget_manage_all', 'Gérer tous les budgets'),
40
   (11, 'budget_manage_all', 'Gérer tous les budgets'),
40
   (13, 'manage_csv_profiles', 'Gérer les profils d''export CSV'),
41
   (13, 'manage_csv_profiles', 'Gérer les profils d''export CSV'),
(-)a/installer/data/mysql/it-IT/necessari/userpermissions.sql (+1 lines)
Lines 20-25 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
20
   (11, 'order_manage_all', 'Manage all orders & baskets'),
20
   (11, 'order_manage_all', 'Manage all orders & baskets'),
21
   (11, 'group_manage', 'Gestisci ordini e raccoglitori raggruppati'),
21
   (11, 'group_manage', 'Gestisci ordini e raccoglitori raggruppati'),
22
   (11, 'order_receive', 'Gestisci arrivi'),
22
   (11, 'order_receive', 'Gestisci arrivi'),
23
   (11, 'order_receive_all', 'Receive all orders'),
23
   (11, 'budget_add_del', 'Aggiungi e cancella budgets (senza modificarli)'),
24
   (11, 'budget_add_del', 'Aggiungi e cancella budgets (senza modificarli)'),
24
   (11, 'budget_manage_all', 'Manage all budgets'),
25
   (11, 'budget_manage_all', 'Manage all budgets'),
25
   (13, 'edit_news', 'Scrivi le news per l\'OPAC e per l\'interfaccia staff'),
26
   (13, 'edit_news', 'Scrivi le news per l\'OPAC e per l\'interfaccia staff'),
(-)a/installer/data/mysql/kohastructure.sql (-1 / +4 lines)
Lines 2786-2797 CREATE TABLE `aqorders` ( -- information related to the basket line items Link Here
2786
  `uncertainprice` tinyint(1), -- was this price uncertain (1 for yes, 0 for no)
2786
  `uncertainprice` tinyint(1), -- was this price uncertain (1 for yes, 0 for no)
2787
  `claims_count` int(11) default 0, -- count of claim letters generated
2787
  `claims_count` int(11) default 0, -- count of claim letters generated
2788
  `claimed_date` date default NULL, -- last date a claim was generated
2788
  `claimed_date` date default NULL, -- last date a claim was generated
2789
  branch varchar(10) default NULL, -- order line branch
2789
  PRIMARY KEY  (`ordernumber`),
2790
  PRIMARY KEY  (`ordernumber`),
2790
  KEY `basketno` (`basketno`),
2791
  KEY `basketno` (`basketno`),
2791
  KEY `biblionumber` (`biblionumber`),
2792
  KEY `biblionumber` (`biblionumber`),
2792
  KEY `budget_id` (`budget_id`),
2793
  KEY `budget_id` (`budget_id`),
2794
  KEY branch (branch),
2793
  CONSTRAINT `aqorders_ibfk_1` FOREIGN KEY (`basketno`) REFERENCES `aqbasket` (`basketno`) ON DELETE CASCADE ON UPDATE CASCADE,
2795
  CONSTRAINT `aqorders_ibfk_1` FOREIGN KEY (`basketno`) REFERENCES `aqbasket` (`basketno`) ON DELETE CASCADE ON UPDATE CASCADE,
2794
  CONSTRAINT `aqorders_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE SET NULL ON UPDATE CASCADE
2796
  CONSTRAINT `aqorders_ibfk_2` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE SET NULL ON UPDATE CASCADE,
2797
  CONSTRAINT aqorders_ibfk_3 FOREIGN KEY (branch) REFERENCES branches (branchcode) ON UPDATE CASCADE ON DELETE SET NULL
2795
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2798
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2796
2799
2797
2800
(-)a/installer/data/mysql/nb-NO/1-Obligatorisk/userpermissions.sql (+1 lines)
Lines 39-44 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
39
   (11, 'order_manage_all', 'Manage all orders & baskets'),
39
   (11, 'order_manage_all', 'Manage all orders & baskets'),
40
   (11, 'group_manage', 'Administrere bestillinger og kurv-grupper'),
40
   (11, 'group_manage', 'Administrere bestillinger og kurv-grupper'),
41
   (11, 'order_receive', 'Administrere bestillinger og kurver'),
41
   (11, 'order_receive', 'Administrere bestillinger og kurver'),
42
   (11, 'order_receive_all', 'Receive all orders'),
42
   (11, 'budget_add_del', 'Legge til og slette budsjetter (men ikke endre budsjetter)'),
43
   (11, 'budget_add_del', 'Legge til og slette budsjetter (men ikke endre budsjetter)'),
43
   (11, 'budget_manage_all', 'Manage all budgets'),
44
   (11, 'budget_manage_all', 'Manage all budgets'),
44
   (13, 'edit_news', 'Legge ut nyhter i OPACen og det interne grensesnittet'),
45
   (13, 'edit_news', 'Legge ut nyhter i OPACen og det interne grensesnittet'),
(-)a/installer/data/mysql/pl-PL/mandatory/userpermissions.sql (+1 lines)
Lines 18-23 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
18
   (11, 'order_manage_all', 'Manage all orders & baskets'),
18
   (11, 'order_manage_all', 'Manage all orders & baskets'),
19
   (11, 'group_manage', 'Manage orders & basketgroups'),
19
   (11, 'group_manage', 'Manage orders & basketgroups'),
20
   (11, 'order_receive', 'Manage orders & basket'),
20
   (11, 'order_receive', 'Manage orders & basket'),
21
   (11, 'order_receive_all', 'Receive all orders'),
21
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
22
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
22
   (11, 'budget_manage_all', 'Manage all budgets'),
23
   (11, 'budget_manage_all', 'Manage all budgets'),
23
   (13, 'edit_news', 'RTworzeniei publikowanie wiadomości w interfejsie bibliotekarza i OPAC'),
24
   (13, 'edit_news', 'RTworzeniei publikowanie wiadomości w interfejsie bibliotekarza i OPAC'),
(-)a/installer/data/mysql/ru-RU/mandatory/permissions_and_user_flags.sql (+1 lines)
Lines 42-47 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
42
   (11, 'order_manage_all', 'Manage all orders & baskets'),
42
   (11, 'order_manage_all', 'Manage all orders & baskets'),
43
   (11, 'group_manage', 'Manage orders & basketgroups'),
43
   (11, 'group_manage', 'Manage orders & basketgroups'),
44
   (11, 'order_receive', 'Manage orders & basket'),
44
   (11, 'order_receive', 'Manage orders & basket'),
45
   (11, 'order_receive_all', 'Receive all orders'),
45
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
46
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
46
   (11, 'budget_manage_all', 'Manage all budgets'),
47
   (11, 'budget_manage_all', 'Manage all budgets'),
47
   (13, 'edit_news',                   'Написание новостей для электронного каталога и интерфейса библиотекарей'),
48
   (13, 'edit_news',                   'Написание новостей для электронного каталога и интерфейса библиотекарей'),
(-)a/installer/data/mysql/uk-UA/mandatory/permissions_and_user_flags.sql (+1 lines)
Lines 42-47 INSERT INTO permissions (module_bit, code, description) VALUES Link Here
42
   (11, 'order_manage_all', 'Manage all orders & baskets'),
42
   (11, 'order_manage_all', 'Manage all orders & baskets'),
43
   (11, 'group_manage', 'Manage orders & basketgroups'),
43
   (11, 'group_manage', 'Manage orders & basketgroups'),
44
   (11, 'order_receive', 'Manage orders & basket'),
44
   (11, 'order_receive', 'Manage orders & basket'),
45
   (11, 'order_receive_all', 'Receive all orders'),
45
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
46
   (11, 'budget_add_del', 'Add and delete budgets (but cant modify budgets)'),
46
   (11, 'budget_manage_all', 'Manage all budgets'),
47
   (11, 'budget_manage_all', 'Manage all budgets'),
47
   (13, 'edit_news',                   'Написання новин для електронного каталогу та інтерфейсу бібліотекарів'),
48
   (13, 'edit_news',                   'Написання новин для електронного каталогу та інтерфейсу бібліотекарів'),
(-)a/installer/data/mysql/updatedatabase.pl (+16 lines)
Lines 5668-5673 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { Link Here
5668
    SetVersion($DBversion);
5668
    SetVersion($DBversion);
5669
}
5669
}
5670
5670
5671
$DBversion = "XXX";
5672
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
5673
    $dbh->do("
5674
        ALTER TABLE aqorders
5675
          ADD COLUMN branch VARCHAR(10) DEFAULT NULL,
5676
          ADD CONSTRAINT aqorders_ibfk_3 FOREIGN KEY (branch)
5677
            REFERENCES branches (branchcode) ON UPDATE CASCADE ON DELETE SET NULL
5678
    ");
5679
    $dbh->do("
5680
        INSERT INTO permissions (module_bit, code, description)
5681
          VALUES (11, 'order_receive_all', 'Receive all orders')
5682
    ");
5683
    print "Upgrade to $DBversion done (Add aqorders.branch and permission order_receive_all)\n";
5684
    SetVersion($DBversion);
5685
}
5686
5671
5687
5672
=head1 FUNCTIONS
5688
=head1 FUNCTIONS
5673
5689
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/neworderempty.tt (+19 lines)
Lines 208-213 $(document).ready(function() Link Here
208
<form action="/cgi-bin/koha/acqui/addorder.pl" method="post" id="Aform" onsubmit="return Check(this);">
208
<form action="/cgi-bin/koha/acqui/addorder.pl" method="post" id="Aform" onsubmit="return Check(this);">
209
209
210
<fieldset class="rows">
210
<fieldset class="rows">
211
    <legend>Order details</legend>
212
    <ol>
213
        <li>
214
            <span class="label">Branch:</span>
215
            <select name="branch">
216
                <option value="">&nbsp;</option>
217
                [% FOREACH branch IN branchloop %]
218
                    [% IF branch.selected %]
219
                        <option selected="selected" value="[% branch.value %]">[% branch.branchname %]</option>
220
                    [% ELSE %]
221
                        <option value="[% branch.value %]">[% branch.branchname %]</option>
222
                    [% END %]
223
                [% END %]
224
            </select>
225
        </li>
226
    </ol>
227
</fieldset>
228
229
<fieldset class="rows">
211
        <legend>
230
        <legend>
212
            Catalog details
231
            Catalog details
213
            [% IF ( biblionumber ) %]
232
            [% IF ( biblionumber ) %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt (+5 lines)
Lines 113-118 Link Here
113
113
114
<h1>Receive items from : [% name %] [% IF ( invoice ) %][[% invoice %]] [% END %] (order #[% ordernumber %])</h1>
114
<h1>Receive items from : [% name %] [% IF ( invoice ) %][[% invoice %]] [% END %] (order #[% ordernumber %])</h1>
115
115
116
    [% IF (cannot_receive_order) %]
117
        <p class="error">You are not authorised to receive this order.</p>
118
    [% ELSE %]
119
116
[% IF ( count ) %]
120
[% IF ( count ) %]
117
    <form action="/cgi-bin/koha/acqui/finishreceive.pl" method="post" onsubmit="return Check(this);">
121
    <form action="/cgi-bin/koha/acqui/finishreceive.pl" method="post" onsubmit="return Check(this);">
118
<div class="yui-g">
122
<div class="yui-g">
Lines 329-334 Link Here
329
</div>
333
</div>
330
[% END %]
334
[% END %]
331
335
336
[% END %][%# IF (cannot_receive_order) %]
332
</div>
337
</div>
333
</div>
338
</div>
334
<div class="yui-b">
339
<div class="yui-b">
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/parcel.tt (-150 / +53 lines)
Lines 8-161 Link Here
8
<script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>
8
<script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>
9
[% INCLUDE 'greybox.inc' %]
9
[% INCLUDE 'greybox.inc' %]
10
<script type="text/javascript" src="[% yuipath %]/json/json-min.js"></script>
10
<script type="text/javascript" src="[% yuipath %]/json/json-min.js"></script>
11
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.min.js"></script>
12
[% INCLUDE 'datatables-strings.inc' %]
13
<script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>
11
<script type="text/javascript">
14
<script type="text/javascript">
12
//<![CDATA[
15
//<![CDATA[
13
16
    var pendingt;
14
    var rowsToCollapse = 5;
15
17
16
    $(document).ready(function(){
18
    $(document).ready(function(){
17
        var pendingt = $("#pendingt").dataTable($.extend(true, {}, dataTablesDefaults, {
19
        pendingt = $("#pendingt").dataTable($.extend(true, {}, dataTablesDefaults, {
18
            "aoColumnDefs": [
20
            "aoColumnDefs": [
19
                { "aTargets": [ 3, 7, 8 ], "bSortable": false, "bSearchable": false },
21
                { "aTargets": [ 4, 8, 9 ], "bSortable": false, "bSearchable": false },
20
            ],
22
                { "aTargets": [ 0, 1 ], "sType": "num-html" },
21
            "aoColumns": [
23
                { "aTargets": [ 3 ], "bVisible": false }
22
                { "sType": "num-html" },
23
                { "sType": "num-html" },
24
                null,
25
                null,
26
                null,
27
                null,
28
                null,
29
                null,
30
                null,
31
            ],
24
            ],
32
            "sPaginationType": "four_button"
25
            "sPaginationType": "four_button"
33
        } ) );
26
        } ) );
34
        var receivedt = $("#receivedt").dataTable($.extend(true, {}, dataTablesDefaults, {
27
        var receivedt = $("#receivedt").dataTable($.extend(true, {}, dataTablesDefaults, {
35
            "aoColumnDefs": [
28
            "aoColumnDefs": [
36
                { "aTargets": [ 3 ], "bSortable": false, "bSearchable": false },
29
                { "aTargets": [ 3 ], "bSortable": false, "bSearchable": false },
37
            ],
30
                { "aTargets": [ 0, 1 ], "sType": "num-html" }
38
            "aoColumns": [
39
                { "sType": "num-html" },
40
                { "sType": "num-html" },
41
                null,
42
                null,
43
                null,
44
                null,
45
                null,
46
                null,
47
            ],
31
            ],
48
            "sPaginationType": "four_button"
32
            "sPaginationType": "four_button"
49
        } ) );
33
        } ) );
50
51
	rowCountPending  = $("#pendingt tbody.filterclass tr").length;
52
	rowCountReceived = $("#receivedt tbody.filterclass tr").length;
53
	if (rowCountPending  > rowsToCollapse) { pendingCollapse(); }
54
	if (rowCountReceived > rowsToCollapse) { receivedCollapse(); }
55
    });
34
    });
56
35
57
     // Case-insensitive version of jquery's contains function
58
     jQuery.extend(jQuery.expr[':'], {
59
	    icontains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0"
60
     });
61
62
     // Contains exactly function
63
     jQuery.extend(jQuery.expr[':'], {
64
          containsExactly: "$(a).text() == m[3]"
65
     });
66
67
68
    // Collapse pending items table
69
    function pendingCollapse() {
70
	$("#pendingcollapserow").remove();
71
    $("#pendingt tr").show();
72
	$("#pendingt tbody.filterclass tr:gt(" + (rowsToCollapse-1) + ")").hide();
73
	$("#pendingt").before("<p id=\"pendingcollapserow\">" + _("Only the first ")  + rowsToCollapse +  _(" items are displayed.") + "<a href=\"javascript:pendingExpand();\">" + _("Click here to show all ")  + rowCountPending + _(" items") + "<\/a>.<\/p>");
74
75
    }
76
77
    // Expend pending items table
78
    function pendingExpand() {
79
	$("#pendingcollapserow").remove();
80
	$("#pendingt tr").show();
81
    $("#pendingt tbody.filterclass tr.orderfound").remove();
82
	$("#pendingt").before("<p id=\"pendingcollapserow\">" + rowCountPending + _(" items are displayed.") + "<a href=\"javascript:pendingCollapse();\">" + _("Click here to show only the first ") + rowsToCollapse + _(" items") + "<\/a>.<\/p>");
83
    }
84
85
    // Collapse already received items table
86
    function receivedCollapse() {
87
	$("#receivedcollapserow").remove();
88
	$("#receivedt tbody.filterclass tr:gt(" + (rowsToCollapse-1) + ")").hide();
89
	$("#receivedt").before("<p id=\"receivedcollapserow\">" + _("Only the first ") + rowsToCollapse + _(" items are displayed.") + "<a href=\"javascript:receivedExpand();\">" + _("Click here to show all ") + rowCountReceived + _(" items") + "<\/a>.<\/p>");
90
    }
91
92
    // Expand already received items table
93
    function receivedExpand() {
94
	$("#receivedcollapserow").remove();
95
	$("#receivedt tr").show();
96
	$("#receivedt").before("<p id=\"receivedcollapserow\">" + _("All ") + rowCountReceived + _(" items are displayed.") + "<a href=\"javascript:receivedCollapse();\">" + _("Click here to show only the first ") + rowsToCollapse + _(" items") + "<\/a>.<\/p>");
97
    }
98
99
    // Launch filtering
100
    function filter() {
36
    function filter() {
101
37
        var summaryStatus = jQuery.trim($("#summaryfilter").val());
102
    var summaryStatus = jQuery.trim($("#summaryfilter").val());
38
        var basketStatus  = $("#basketfilter").val();
103
	var basketStatus  = $("#basketfilter").val();
39
        var orderStatus   = $("#orderfilter").val();
104
	var orderStatus   = $("#orderfilter").val();
40
        var eanfilter = $("#eanfilter").val();
105
    var eanStatus     = $("#eanfilter").val() || '';
41
106
42
        if (summaryStatus == '' && basketStatus == '' && orderStatus == '' && eanfilter == '') {
107
    if (summaryStatus == '' && basketStatus == '' && orderStatus == '' && eanStatus == '') { clearFilters(); return false; }
43
            clearFilters();
108
44
            return false;
109
	var filtered = "table#pendingt tbody.filterclass tr";
45
        }
110
46
        pendingt.fnFilter(summaryStatus,2);
111
	// We hide everything
47
        pendingt.fnFilter(orderStatus,1);
112
	$("#nothingfoundrow").remove();
48
        pendingt.fnFilter(basketStatus,0);
113
	$(filtered).hide();
49
        pendingt.fnFilter(eanfilter, 3);
114
50
115
	// Do the search
51
        return false;
116
	var callback =  {
117
		success: function(o) {
118
			var jsonString = o.responseText;
119
			var gst = "[% gst %]";
120
			try {
121
				var orders = YAHOO.lang.JSON.parse(jsonString);
122
				var foundCount = orders.length;
123
124
				for( i = 0 ; i < orders.length ; i++){
125
					order = orders[i];
126
					$('<tr class="orderfound">'
127
                       + '<td class="basketfilterclass"><a href="/cgi-bin/koha/acqui/basket.pl?basketno=' + order.basketno + '">' + order.basketno + '</a></td>'
128
                       + '<td class="orderfilterclass"> <a href="neworderempty.pl?ordernumber=' + order.ordernumber + '&booksellerid=' + order.booksellerid + '">' + order.ordernumber + ' </a></td>'
129
                       + '<td class="summaryfilterclass">'
130
                       + '<a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=' + order.biblionumber + '">' + order.title + '</a>' + _(" by ") + order.author + '&nbsp;&ndash;&nbsp;' + order.isbn + '</td>'
131
                       + '<td><a href="/cgi-bin/koha/catalogue/showmarc.pl?id=' + order.biblionumber + '" title="MARC" rel="gb_page_center[600,500]">MARC</a> | <a href="/cgi-bin/koha/catalogue/showmarc.pl?viewas=card&amp;id=' + order.biblionumber + '" title="MARC" rel="gb_page_center[600,500]">Card</a></td>'
132
                       + '<td>' + order.quantity + '</td>'
133
                       + '<td>' + order.ecost + '</td>'
134
                       + '<td>' + order.ordertotal + '</td>'
135
                       + '<td>'
136
                       + '<a href="orderreceive.pl?ordernumber=' + order.ordernumber + '&amp;datereceived=[% invoicedatereceived %]&amp;invoice=[% invoice %]&amp;gst=' + gst + '&amp;freight=' + order.freight + '&amp;booksellerid=[% booksellerid %]">Receive</a> /'
137
                       + '<a href="parcel.pl?type=intra&amp;ordernumber=' + order.ordernumber + '&amp;biblionumber=' + order.biblionumber + '&amp;action=cancelorder&amp;booksellerid=[% booksellerid %]&amp;datereceived=[% invoicedatereceived %]&amp;invoice=[% invoice %]" onclick="return confirm(\'' + _('Are you sure you want to cancel this order?') + '\');">Cancel</a>'
138
                       + '</td></tr>').appendTo("table#pendingt");
139
				}
140
141
				// If nothing has been found, we tell the user so
142
				if (orders.length == 0) {
143
				    $("<tr><td id=\"nothingfoundrow\" colspan=\"8\">No items match your criteria.<\/tr>").appendTo("#pendingt");
144
				}
145
			}catch(e){alert(e);}
146
		}
147
	}
148
    var transaction = YAHOO.util.Connect.asyncRequest('GET', '/cgi-bin/koha/acqui/parcel.pl?booksellerid=[% booksellerid %]&search='+summaryStatus+'&basketno='+basketStatus+'&orderno='+orderStatus+'&ean='+eanStatus+'&format=json', callback, null);
149
150
	return false;
151
    }
52
    }
152
53
153
    // Clear already applied filters
54
    // Clear already applied filters
154
    function clearFilters() {
55
    function clearFilters() {
155
	$("#nothingfoundrow").remove();
56
        $("#summaryfilter").val('');
156
        $("#pendingt tbody.filterclass tr").show();
57
        $("#basketfilter").val('');
157
        //$("#pendingt tbody.filterclass tr.orderfound").remove();
58
        $("#orderfilter").val('');
158
	pendingExpand();
59
        $("#eanfilter").val('');
60
        var oSettings = pendingt.fnSettings();
61
        for(iCol = 0; iCol < oSettings.aoPreSearchCols.length; iCol++) {
62
            oSettings.aoPreSearchCols[ iCol ].sSearch = '';
63
        }
64
        pendingt.fnDraw();
159
    }
65
    }
160
66
161
//]]>
67
//]]>
Lines 197-207 Link Here
197
	<div class="yui-b">
103
	<div class="yui-b">
198
	[% IF ( receive_error ) %]
104
	[% IF ( receive_error ) %]
199
	<div class="dialog alert">
105
	<div class="dialog alert">
200
	<h3>Error adding items:</h3>
106
	<h3>Error receiving items:</h3>
201
	<ul>
107
	<ul>
202
	[% FOREACH error_loo IN error_loop %]
108
        [% FOREACH error IN error_loop %]
203
		<li>[% error_loo.error_param %][% IF ( error_loo.error_duplicate_barcode ) %]Duplicate Barcode[% END %] <!-- todo: other error conditions come here. --></li>
109
            <li>
204
	[% END %]
110
                [% error.error_param %]
111
                [% IF ( error.error_duplicate_barcode ) %]
112
                    Duplicate Barcode
113
                [% ELSIF (error.error_cannot_receive_order) %]
114
                    You were not authorised to receive this order
115
                [% END %]
116
                <!-- todo: other error conditions come here. -->
117
            </li>
118
        [% END %]
205
	</ul>
119
	</ul>
206
	</div>
120
	</div>
207
	[% END %]
121
	[% END %]
Lines 237-242 Link Here
237
            <th>Basket</th>
151
            <th>Basket</th>
238
            <th>Order line</th>
152
            <th>Order line</th>
239
            <th>Summary</th>
153
            <th>Summary</th>
154
            <th>EAN</th>
240
        <th>View record</th>
155
        <th>View record</th>
241
            <th>Quantity</th>
156
            <th>Quantity</th>
242
            <th>Unit cost</th>
157
            <th>Unit cost</th>
Lines 246-252 Link Here
246
        </tr>
161
        </tr>
247
    </thead>
162
    </thead>
248
		<tfoot>
163
		<tfoot>
249
            <tr><td colspan="4" class="total">TOTAL</td>
164
            <tr><td colspan="5" class="total">TOTAL</td>
250
                <td> [% totalPquantity %] </td>
165
                <td> [% totalPquantity %] </td>
251
				<td>&nbsp;</td>
166
				<td>&nbsp;</td>
252
                <td>[% ordergrandtotal %]</td>
167
                <td>[% ordergrandtotal %]</td>
Lines 276-288 Link Here
276
                    [<a href="/cgi-bin/koha/acqui/modordernotes.pl?ordernumber=[% loop_order.ordernumber %]&amp;referrer=/cgi-bin/koha/acqui/parcel.pl%3Fbooksellerid=[% loop_order.booksellerid %]&amp;datereceived=[% loop_order.invoicedatereceived %]&amp;invoice=[% loop_order.invoice %]">Add note</a>]
191
                    [<a href="/cgi-bin/koha/acqui/modordernotes.pl?ordernumber=[% loop_order.ordernumber %]&amp;referrer=/cgi-bin/koha/acqui/parcel.pl%3Fbooksellerid=[% loop_order.booksellerid %]&amp;datereceived=[% loop_order.invoicedatereceived %]&amp;invoice=[% loop_order.invoice %]">Add note</a>]
277
                [% END %]
192
                [% END %]
278
                </td>
193
                </td>
194
                <td>[% loop_order.ean %]</td>
279
                <td><a href="/cgi-bin/koha/catalogue/showmarc.pl?id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">MARC</a> | <a href="/cgi-bin/koha/catalogue/showmarc.pl?viewas=card&amp;id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">Card</a></td>
195
                <td><a href="/cgi-bin/koha/catalogue/showmarc.pl?id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">MARC</a> | <a href="/cgi-bin/koha/catalogue/showmarc.pl?viewas=card&amp;id=[% loop_order.biblionumber %]" title="MARC" rel="gb_page_center[600,500]">Card</a></td>
280
                <td>[% loop_order.quantity %]</td>
196
                <td>[% loop_order.quantity %]</td>
281
                <td>[% loop_order.ecost %]</td>
197
                <td>[% loop_order.ecost %]</td>
282
                <td>[% loop_order.ordertotal %]</td>
198
                <td>[% loop_order.ordertotal %]</td>
283
				<td>
199
				<td>
284
                              <a href="orderreceive.pl?ordernumber=[% loop_order.ordernumber %]&amp;datereceived=[% invoicedatereceived %]&amp;invoice=[% invoice %]&amp;gst=[% loop_order.gst %]&amp;freight=[% loop_order.freight %]&amp;booksellerid=[% loop_order.booksellerid %]">Receive</a>
200
                    [% IF (loop_order.can_receive) %]
285
				    
201
                        <a href="orderreceive.pl?ordernumber=[% loop_order.ordernumber %]&amp;datereceived=[% invoicedatereceived %]&amp;invoice=[% invoice %]&amp;gst=[% loop_order.gst %]&amp;freight=[% loop_order.freight %]&amp;booksellerid=[% loop_order.booksellerid %]">Receive</a>
202
                    [% ELSE %]
203
                        Can't receive order
204
                    [% END %]
286
				</td>
205
				</td>
287
				<td>
206
				<td>
288
				    [% IF ( loop_order.left_holds_on_order ) %]
207
				    [% IF ( loop_order.left_holds_on_order ) %]
Lines 312-333 Link Here
312
        [% END %]
231
        [% END %]
313
    </tbody>
232
    </tbody>
314
     </table>[% ELSE %]There are no pending orders.[% END %]
233
     </table>[% ELSE %]There are no pending orders.[% END %]
315
   <div id="resultnumber">
316
	<!-- Row of numbers corresponding to search result pages -->
317
	[% IF ( displayprev ) %]
318
		<a href="parcel.pl?type=intra&amp;booksellerid=[% booksellerid %]&amp;startfrom=[% prevstartfrom %][% IF ( datereceived ) %]&amp;datereceived=[% datereceived %][% END %][% IF ( invoice ) %]&amp;invoice=[% invoice %][% END %][% IF ( resultsperpage ) %]&amp;resultsperpage=[% resultsperpage %][% END %]#resultnumber">&lt;&lt; Previous</a>
319
	[% END %]
320
	[% FOREACH number IN numbers %]
321
		[% IF ( number.highlight ) %]
322
		<span class="current">[% number.number %]</span>
323
		[% ELSE %]
324
		<a href="parcel.pl?type=intra&amp;booksellerid=[% booksellerid %]&amp;startfrom=[% number.startfrom %][% IF ( datereceived ) %]&amp;datereceived=[% datereceived %][% END %][% IF ( invoice ) %]&amp;invoice=[% invoice %][% END %][% IF ( resultsperpage ) %]&amp;resultsperpage=[% resultsperpage %][% END %]#resultnumber">[% number.number %]</a>
325
		[% END %]
326
	[% END %]
327
	[% IF ( displaynext ) %]
328
		<a href="parcel.pl?type=intra&amp;booksellerid=[% booksellerid %]&amp;startfrom=[% nextstartfrom %][% IF ( datereceived ) %]&amp;datereceived=[% datereceived %][% END %][% IF ( invoice ) %]&amp;invoice=[% invoice %][% END %][% IF ( resultsperpage ) %]&amp;resultsperpage=[% resultsperpage %][% END %]#resultnumber">Next &gt;&gt;</a>
329
	[% END %]
330
	</div>
331
</div>
234
</div>
332
<div id="acqui_receive_receivelist">
235
<div id="acqui_receive_receivelist">
333
    <h3>Already received</h3>
236
    <h3>Already received</h3>
(-)a/t/Acquisition/CanUserReceiveBasket.t (-1 / +111 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
use Test::MockModule;
5
use Test::More tests => 30;
6
7
use C4::Acquisition;
8
9
my $C4_Acquisition_module = new Test::MockModule('C4::Acquisition');
10
$C4_Acquisition_module->mock('GetBasket', \&Mock_GetBasket);
11
my $C4_Context_module = new Test::MockModule('C4::Context');
12
$C4_Context_module->mock('userenv', \&Mock_userenv);
13
14
my $baskets = {
15
    1 => {},
16
    2 => {
17
        branch => 'B1'
18
    },
19
    3 => {
20
        branch => 'B2'
21
    }
22
};
23
24
my $userenv = {};
25
26
my $borrower = {};
27
28
my $order1 = {
29
    basketno => 1
30
};
31
my $order2 = {
32
    basketno => 1,
33
    branch => 'B1'
34
};
35
my $order3 = {
36
    basketno => 1,
37
    branch => 'B2'
38
};
39
my $order4 = {
40
    basketno => 2
41
};
42
my $order5 = {
43
    basketno => 2,
44
    branch => 'B1'
45
};
46
my $order6 = {
47
    basketno => 2,
48
    branch => 'B2'
49
};
50
my $order7 = {
51
    basketno => 3
52
};
53
my $order8 = {
54
    basketno => 3,
55
    branch => 'B1'
56
};
57
my $order9 = {
58
    basketno => 3,
59
    branch => 'B2'
60
};
61
62
$userenv->{branch} = 'B1';
63
64
ok( CanUserReceiveOrder($borrower, $order1, {superlibrarian => 1}) );
65
ok( CanUserReceiveOrder($borrower, $order1, {acquisition => 1}) );
66
ok( CanUserReceiveOrder($borrower, $order1, {acquisition => { order_receive_all => 1 }}) );
67
68
ok( not CanUserReceiveOrder($borrower, $order1, {}) );
69
ok( not CanUserReceiveOrder($borrower, $order1, {acquisition => 0}) );
70
ok( not CanUserReceiveOrder($borrower, $order1, {acquisition => { order_receive => 0 }}) );
71
72
ok( CanUserReceiveOrder($borrower, $order1, {acquisition => { order_receive => 1 }}) );
73
ok( CanUserReceiveOrder($borrower, $order2, {acquisition => { order_receive => 1 }}) );
74
ok( not CanUserReceiveOrder($borrower, $order3, {acquisition => { order_receive => 1 }}) );
75
ok( CanUserReceiveOrder($borrower, $order4, {acquisition => { order_receive => 1 }}) );
76
ok( CanUserReceiveOrder($borrower, $order5, {acquisition => { order_receive => 1 }}) );
77
ok( not CanUserReceiveOrder($borrower, $order6, {acquisition => { order_receive => 1 }}) );
78
ok( not CanUserReceiveOrder($borrower, $order7, {acquisition => { order_receive => 1 }}) );
79
ok( CanUserReceiveOrder($borrower, $order8, {acquisition => { order_receive => 1 }}) );
80
ok( not CanUserReceiveOrder($borrower, $order9, {acquisition => { order_receive => 1 }}) );
81
82
83
$userenv->{branch} = 'B2';
84
85
ok( CanUserReceiveOrder($borrower, $order1, {superlibrarian => 1}) );
86
ok( CanUserReceiveOrder($borrower, $order1, {acquisition => 1}) );
87
ok( CanUserReceiveOrder($borrower, $order1, {acquisition => { order_receive_all => 1 }}) );
88
89
ok( not CanUserReceiveOrder($borrower, $order1, {}) );
90
ok( not CanUserReceiveOrder($borrower, $order1, {acquisition => 0}) );
91
ok( not CanUserReceiveOrder($borrower, $order1, {acquisition => { order_receive => 0 }}) );
92
93
ok( CanUserReceiveOrder($borrower, $order1, {acquisition => { order_receive => 1 }}) );
94
ok( not CanUserReceiveOrder($borrower, $order2, {acquisition => { order_receive => 1 }}) );
95
ok( CanUserReceiveOrder($borrower, $order3, {acquisition => { order_receive => 1 }}) );
96
ok( not CanUserReceiveOrder($borrower, $order4, {acquisition => { order_receive => 1 }}) );
97
ok( not CanUserReceiveOrder($borrower, $order5, {acquisition => { order_receive => 1 }}) );
98
ok( CanUserReceiveOrder($borrower, $order6, {acquisition => { order_receive => 1 }}) );
99
ok( CanUserReceiveOrder($borrower, $order7, {acquisition => { order_receive => 1 }}) );
100
ok( not CanUserReceiveOrder($borrower, $order8, {acquisition => { order_receive => 1 }}) );
101
ok( CanUserReceiveOrder($borrower, $order9, {acquisition => { order_receive => 1 }}) );
102
103
sub Mock_GetBasket {
104
    my ($basketno) = @_;
105
106
    return $baskets->{$basketno};
107
}
108
109
sub Mock_userenv {
110
    return $userenv;
111
}

Return to bug 7290