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

(-)a/C4/Circulation.pm (+5 lines)
Lines 1597-1602 sub AddReturn { Link Here
1597
        $messages->{'wthdrawn'} = 1;
1597
        $messages->{'wthdrawn'} = 1;
1598
        $doreturn = 0;
1598
        $doreturn = 0;
1599
    }
1599
    }
1600
    
1601
    # book is reserved to a teacher
1602
    if ( $doreturn && ($item->{'notforloan'} == 101 || $item->{'notforloan'} == -101 )) {
1603
        $messages->{'coursereserve'} = 1;
1604
    }
1600
1605
1601
    # case of a return of document (deal with issues and holdingbranch)
1606
    # case of a return of document (deal with issues and holdingbranch)
1602
    if ($doreturn) {
1607
    if ($doreturn) {
(-)a/C4/Courses.pm (+65 lines)
Line 0 Link Here
1
package C4::Courses;
2
3
use strict;
4
use warnings;
5
use vars qw($VERSION);
6
use Data::Dumper;
7
use C4::Context;
8
9
BEGIN {
10
    $VERSION = 1.00;        # set the version for version checking
11
}
12
13
sub GetReserveFromItemNumber {
14
    my ($itemnumber) = @_;
15
    my $dbh       = C4::Context->dbh;
16
    my $sth       = $dbh->prepare("SELECT * FROM reserve_courses WHERE itemnumber = ?");
17
18
    $sth->execute($itemnumber);
19
     my $data = $sth->fetchrow_hashref;
20
    $sth->finish;
21
    return ($data);
22
}
23
24
sub GetAllReserves {
25
    my @results;
26
    my $dbh       = C4::Context->dbh;
27
    my $sth       = $dbh->prepare('SELECT *,
28
        ExtractValue(biblioitems.marcxml,"//record/datafield[@tag=\"245\"]/subfield[@code=\"h\"]") AS typedocument,
29
        ExtractValue(biblioitems.marcxml,"//record/datafield[@tag=\"245\"]/subfield[@code=\"b\"]") AS subtitle
30
        FROM items
31
        JOIN reserve_courses USING (itemnumber)
32
        JOIN biblio USING (biblionumber)
33
        JOIN biblioitems USING (biblionumber)
34
        JOIN branches b ON (b.branchcode = holdingbranch)
35
        LEFT OUTER JOIN authorised_values av ON (av.authorised_value = items.location)
36
        WHERE notforloan = 101 OR notforloan = -101');
37
    $sth->execute();
38
    while ( my $data = $sth->fetchrow_hashref ) {
39
        push @results, $data;
40
    }
41
42
    $sth->finish;
43
    return @results;
44
}
45
46
sub DeleteReserveFromItemNumber {
47
    my ($itemnumber) = @_;
48
    my $dbh = C4::Context->dbh;
49
    my $sth = $dbh->prepare("DELETE FROM reserve_courses WHERE itemnumber = ?");
50
    $sth->execute($itemnumber);
51
    return;
52
}
53
54
sub SaveReserve {
55
    my ($itemnumber, $teacher_name, $course_name) = @_;
56
    my $dbh       = C4::Context->dbh;
57
    my $sth       = $dbh->prepare("DELETE FROM reserve_courses WHERE itemnumber = ?");
58
    $sth->execute($itemnumber);
59
    $sth       = $dbh->prepare("INSERT INTO reserve_courses(teacher_name, course_name, itemnumber)
60
        VALUES (?, ?, ?)");
61
    $sth->execute($teacher_name, $course_name, $itemnumber);
62
    return;
63
}
64
65
1;
(-)a/C4/Items.pm (+4 lines)
Lines 32-37 use C4::Log; Link Here
32
use List::MoreUtils qw/any/;
32
use List::MoreUtils qw/any/;
33
use Data::Dumper; # used as part of logging item record changes, not just for
33
use Data::Dumper; # used as part of logging item record changes, not just for
34
                  # debugging; so please don't remove this
34
                  # debugging; so please don't remove this
35
use C4::Courses; #DeleteReserveFromItemNumber
35
36
36
use vars qw($VERSION @ISA @EXPORT);
37
use vars qw($VERSION @ISA @EXPORT);
Lines 2246-2251 Internal function to delete an item record from the koha tables Link Here
2246
2247
2247
sub _koha_delete_item {
2248
sub _koha_delete_item {
2248
    my ( $dbh, $itemnum ) = @_;
2249
    my ( $dbh, $itemnum ) = @_;
2250
    
2251
    # delete the course reservations
2252
    C4::Courses::DeleteReserveFromItemNumber($itemnum);
2249
2253
2250
    # save the deleted item to deleteditems table
2254
    # save the deleted item to deleteditems table
2251
    my $sth = $dbh->prepare("SELECT * FROM items WHERE itemnumber=?");
2255
    my $sth = $dbh->prepare("SELECT * FROM items WHERE itemnumber=?");
(-)a/C4/XSLT.pm (+3 lines)
Lines 249-254 sub buildKohaItemsNamespace { Link Here
249
            if ( $item->{itemnotforloan} > 0 || $item->{notforloan} > 0 || $itemtypes->{ $item->{itype} }->{notforloan} == 1 ) {
249
            if ( $item->{itemnotforloan} > 0 || $item->{notforloan} > 0 || $itemtypes->{ $item->{itype} }->{notforloan} == 1 ) {
250
                $status = "reference";
250
                $status = "reference";
251
            }
251
            }
252
            if ( $item->{itemnotforloan} == 101 || $item->{notforloan} == -101  ) {
253
                $status = "reserveprofs";
254
            }
252
            if ($item->{onloan}) {
255
            if ($item->{onloan}) {
253
                $status = "Checked out";
256
                $status = "Checked out";
254
            }
257
            }
(-)a/cataloguing/additem.pl (+7 lines)
Lines 33-38 use C4::ClassSource; Link Here
33
use C4::Dates;
33
use C4::Dates;
34
use List::MoreUtils qw/any/;
34
use List::MoreUtils qw/any/;
35
use C4::Search;
35
use C4::Search;
36
use C4::Courses;
36
37
37
use MARC::File::XML;
38
use MARC::File::XML;
38
use URI::Escape;
39
use URI::Escape;
Lines 348-353 if ($op eq "additem") { Link Here
348
	# if barcode exists, don't create, but report The problem.
349
	# if barcode exists, don't create, but report The problem.
349
    unless ($exist_itemnumber) {
350
    unless ($exist_itemnumber) {
350
	    my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItemFromMarc($record,$biblionumber);
351
	    my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItemFromMarc($record,$biblionumber);
352
        C4::Courses::SaveReserve($oldbibitemnum, $input->param('teacher_name'), $input->param('course_name'));
351
        set_item_default_location($oldbibitemnum);
353
        set_item_default_location($oldbibitemnum);
352
    }
354
    }
353
	$nextop = "additem";
355
	$nextop = "additem";
Lines 517-522 if ($op eq "additem") { Link Here
517
        push @errors,"barcode_not_unique";
519
        push @errors,"barcode_not_unique";
518
    } else {
520
    } else {
519
        ModItemFromMarc($itemtosave,$biblionumber,$itemnumber);
521
        ModItemFromMarc($itemtosave,$biblionumber,$itemnumber);
522
        C4::Courses::SaveReserve($itemnumber, $input->param('teacher_name'), $input->param('course_name'));
520
        $itemnumber="";
523
        $itemnumber="";
521
    }
524
    }
522
    $nextop="additem";
525
    $nextop="additem";
Lines 710-715 foreach my $tag ( keys %{$tagslib}){ Link Here
710
}
712
}
711
@loop_data = sort {$a->{subfield} cmp $b->{subfield} } @loop_data;
713
@loop_data = sort {$a->{subfield} cmp $b->{subfield} } @loop_data;
712
714
715
my $reserve = C4::Courses::GetReserveFromItemNumber($itemnumber);
716
713
# what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit.
717
# what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit.
714
$template->param( title => $record->title() ) if ($record ne "-1");
718
$template->param( title => $record->title() ) if ($record ne "-1");
715
$template->param(
719
$template->param(
Lines 725-730 $template->param( Link Here
725
    op      => $nextop,
729
    op      => $nextop,
726
    opisadd => ($nextop eq "saveitem") ? 0 : 1,
730
    opisadd => ($nextop eq "saveitem") ? 0 : 1,
727
    C4::Search::enabled_staff_search_views,
731
    C4::Search::enabled_staff_search_views,
732
    teacher_name => $reserve->{teacher_name},
733
    course_name => $reserve->{course_name},
728
);
734
);
729
735
730
if ($frameworkcode eq 'FA'){
736
if ($frameworkcode eq 'FA'){
(-)a/circ/returns.pl (+10 lines)
Lines 334-339 if ( $messages->{'Wrongbranch'} ){ Link Here
334
    );
334
    );
335
}
335
}
336
336
337
if ( $messages->{'coursereserve'} ){
338
    $template->param(
339
        found         => 1,
340
        coursereserve => 1
341
    );
342
}
343
337
# case of wrong transfert, if the document wasn't transfered to the right library (according to branchtransfer (tobranch) BDD)
344
# case of wrong transfert, if the document wasn't transfered to the right library (according to branchtransfer (tobranch) BDD)
338
345
339
if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'}) {
346
if ( $messages->{'WrongTransfer'} and not $messages->{'WasTransfered'}) {
Lines 470-475 foreach my $code ( keys %$messages ) { Link Here
470
        $err{debarborrowernumber} = $borrower->{borrowernumber};
477
        $err{debarborrowernumber} = $borrower->{borrowernumber};
471
        $err{debarname}           = "$borrower->{firstname} $borrower->{surname}";
478
        $err{debarname}           = "$borrower->{firstname} $borrower->{surname}";
472
    }
479
    }
480
    elsif ( $code eq 'coursereserve' ) {
481
    }
482
473
    else {
483
    else {
474
        die "Unknown error code $code";    # note we need all the (empty) elsif's above, or we die.
484
        die "Unknown error code $code";    # note we need all the (empty) elsif's above, or we die.
475
        # This forces the issue of staying in sync w/ Circulation.pm
485
        # This forces the issue of staying in sync w/ Circulation.pm
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt (+37 lines)
Lines 16-21 $(document).ready(function(){ Link Here
16
			$(this).append("<span class=\"linktools\"><a href=\"/cgi-bin/koha/cataloguing/additem.pl?op=edititem&frameworkcode=[% frameworkcode %]&biblionumber=[% biblionumber %]&itemnumber="+num_rowid+"#edititem\">Edit Item</a> <a href=\"/cgi-bin/koha/cataloguing/additem.pl?op=delitem&frameworkcode=[% frameworkcode %]&biblionumber=[% biblionumber %]&itemnumber="+num_rowid+"\" onclick=\"confirm_deletion([% biblionumber %],"+num_rowid+"); return false;\">Delete Item</a></span>");
16
			$(this).append("<span class=\"linktools\"><a href=\"/cgi-bin/koha/cataloguing/additem.pl?op=edititem&frameworkcode=[% frameworkcode %]&biblionumber=[% biblionumber %]&itemnumber="+num_rowid+"#edititem\">Edit Item</a> <a href=\"/cgi-bin/koha/cataloguing/additem.pl?op=delitem&frameworkcode=[% frameworkcode %]&biblionumber=[% biblionumber %]&itemnumber="+num_rowid+"\" onclick=\"confirm_deletion([% biblionumber %],"+num_rowid+"); return false;\">Delete Item</a></span>");
17
		}
17
		}
18
		});
18
		});
19
20
    lstNotLoad = $('[id^="tag_952_subfield_7"]');
21
    divNotLoan = lstNotLoad.parent().parent();
22
    //Move the course and teacher fields below the not_for_load field
23
    $("#course_name").insertAfter(divNotLoan);
24
    $("#teacher_name").insertAfter(divNotLoan);
25
    //Hide the course and teacher fields if not_for_loan isn't "Réservé par professeur"
26
    if (lstNotLoad.val() != 101 && lstNotLoad.val() != -101)
27
    {
28
        $("#course_name").hide();
29
        $("#teacher_name").hide();
30
    }
31
    lstNotLoad.bind('change', function() {
32
        //If not_for_loan changes to "Réservé par professeur" show the course and teacher fields
33
        if ($(this).val() == 101 || $(this).val() == -101)
34
        {
35
            $("#course_name").show();
36
            $("#teacher_name").show();
37
        }
38
        else //Else, hide them
39
        {
40
            $("#course_name").hide();
41
            $("#teacher_name").hide();
42
        }
43
    });
19
});
44
});
20
function active(numlayer)
45
function active(numlayer)
21
{
46
{
Lines 244-249 $(document).ready(function() { Link Here
244
                [% IF ( ite.mandatory ) %] <span class="required">Required</span>[% END %]
269
                [% IF ( ite.mandatory ) %] <span class="required">Required</span>[% END %]
245
            </div></li>
270
            </div></li>
246
        [% END %]
271
        [% END %]
272
        <li id="teacher_name">
273
            <div class="subfield_line">
274
            <label>Teacher</label>
275
            <input type="text" name="teacher_name" value="[% teacher_name %]" />
276
            </div>
277
        </li>
278
        <li id="course_name">
279
            <div class="subfield_line">
280
            <label>Course</label>
281
            <input type="text" name="course_name" value="[% course_name %]" />
282
            </div>
283
        </li>
247
    </ol>
284
    </ol>
248
    </fieldset>
285
    </fieldset>
249
    <input type="hidden" name="indicator" value=" " />
286
    <input type="hidden" name="indicator" value=" " />
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt (+7 lines)
Lines 208-213 $(document).ready(function () { Link Here
208
        <audio src="/intranet-tmpl/prog/sound/opening.ogg" autoplay="autoplay" autobuffer="autobuffer"></audio>
208
        <audio src="/intranet-tmpl/prog/sound/opening.ogg" autoplay="autoplay" autobuffer="autobuffer"></audio>
209
        [% END %]
209
        [% END %]
210
    [% END %]
210
    [% END %]
211
        
212
    [% IF ( coursereserve ) %]
213
    <!-- the item has to be returned to the reserved items -->
214
    <div class="error dialog" style="text-align:center;margin-right:0px;margin:auto;">
215
        <h3>Please return <a href="/cgi-bin/koha/catalogue/detail.pl?type=intra&amp;biblionumber=[% itembiblionumber%]">[% title or "item" |html %]</a> to the reserved items</h3>
216
    </div>
217
    [% END %]
211
218
212
    [% IF ( needstransfer ) %]
219
    [% IF ( needstransfer ) %]
213
	<!-- needstransfer -->
220
	<!-- needstransfer -->
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchMod-edit.tt (+38 lines)
Lines 37-42 $("input[name='disable_input']").click(function() { Link Here
37
    }
37
    }
38
});
38
});
39
39
40
$(document).ready(function() {
41
    lstNotLoad = $('[id^="tag_952_subfield_7"]');
42
    divNotLoan = lstNotLoad.parent().parent();
43
    //Move the course and teacher fields below the not_for_load field
44
    $("#course_name").insertAfter(divNotLoan);
45
    $("#teacher_name").insertAfter(divNotLoan);
46
    //Hide the course and teacher fields if not_for_loan isn't "Réservé par professeur"
47
    if (lstNotLoad.val() != 101 && lstNotLoad.val() != -101)
48
    {
49
        $("#course_name").hide();
50
        $("#teacher_name").hide();
51
    }
52
    lstNotLoad.bind('change', function() {
53
        //If not_for_loan changes to "Réservé par professeur" show the course and teacher fields
54
        if ($(this).val() == 101 || $(this).val() == -101)
55
        {
56
            $("#course_name").show();
57
            $("#teacher_name").show();
58
        }
59
        else //Else, hide them
60
        {
61
            $("#course_name").hide();
62
            $("#teacher_name").hide();
63
        }
64
    });
65
});
40
//]]>
66
//]]>
41
</script>
67
</script>
42
<script type="text/javascript" src="[% themelang %]/js/pages/batchMod.js"></script>
68
<script type="text/javascript" src="[% themelang %]/js/pages/batchMod.js"></script>
Lines 160-165 $("input[name='disable_input']").click(function() { Link Here
160
   
186
   
161
            </div></li>
187
            </div></li>
162
        [% END %]
188
        [% END %]
189
        <li id="teacher_name">
190
            <div class="subfield_line">
191
            <label>Teacher</label>
192
            <input type="text" name="teacher_name" value="[% teacher_name %]" />
193
            </div>
194
        </li>
195
        <li id="course_name">
196
            <div class="subfield_line">
197
            <label>Course</label>
198
            <input type="text" name="course_name" value="[% course_name %]" />
199
            </div>
200
        </li>
163
    </ol>
201
    </ol>
164
    </fieldset>
202
    </fieldset>
165
    <fieldset class="action">    
203
    <fieldset class="action">    
(-)a/koha-tmpl/opac-tmpl/prog/en/css/datatables.css (-21 / +21 lines)
Lines 3-25 input.search_init { Link Here
3
}
3
}
4
.sorting_asc {
4
.sorting_asc {
5
    padding-right: 19px;
5
    padding-right: 19px;
6
    background: url("../../img/asc.gif") no-repeat scroll right center #EEEEEE;
6
    background: url("../../images/asc.gif") no-repeat scroll right center #EEEEEE;
7
}
7
}
8
.sorting_desc {
8
.sorting_desc {
9
    padding-right: 19px;
9
    padding-right: 19px;
10
    background: url("../../img/desc.gif") no-repeat scroll right center #EEEEEE;
10
    background: url("../../images/desc.gif") no-repeat scroll right center #EEEEEE;
11
}
11
}
12
.sorting {
12
.sorting {
13
    padding-right: 19px;
13
    padding-right: 19px;
14
    background: url("../../img/ascdesc.gif") no-repeat scroll right center #EEEEEE;
14
    background: url("../../images/ascdesc.gif") no-repeat scroll right center #EEEEEE;
15
}
15
}
16
.sorting_asc_disabled {
16
.sorting_asc_disabled {
17
    padding-right: 19px;
17
    padding-right: 19px;
18
    background: url("../../img/datatables/sort_asc_disabled.png") no-repeat scroll right center #EEEEEE;
18
    background: url("../../images/datatables/sort_asc_disabled.png") no-repeat scroll right center #EEEEEE;
19
}
19
}
20
.sorting_desc_disabled {
20
.sorting_desc_disabled {
21
    padding-right: 19px;
21
    padding-right: 19px;
22
    background: url("../../img/datatables/sort_desc_disabled.png") no-repeat scroll right center #EEEEEE;
22
    background: url("../../images/datatables/sort_desc_disabled.png") no-repeat scroll right center #EEEEEE;
23
}
23
}
24
.sorting_disabled {
24
.sorting_disabled {
25
    padding-right: 19px;
25
    padding-right: 19px;
Lines 83-107 div.dataTables_paginate { Link Here
83
    color : #0000CC;
83
    color : #0000CC;
84
}
84
}
85
.paging_full_numbers span.paginate_button.first {
85
.paging_full_numbers span.paginate_button.first {
86
    background-image : url('../../img/first.png');
86
    background-image : url('../../images/first.png');
87
    background-repeat: no-repeat;
87
    background-repeat: no-repeat;
88
    background-position : 2px center;
88
    background-position : 2px center;
89
    padding-left : 2em;
89
    padding-left : 2em;
90
}
90
}
91
.paging_full_numbers span.paginate_button.previous {
91
.paging_full_numbers span.paginate_button.previous {
92
    background-image : url('../../img/prev.png');
92
    background-image : url('../../images/prev.png');
93
    background-repeat: no-repeat;
93
    background-repeat: no-repeat;
94
    background-position : 2px center;
94
    background-position : 2px center;
95
    padding-left : 2em;
95
    padding-left : 2em;
96
}
96
}
97
.paging_full_numbers span.paginate_button.next {
97
.paging_full_numbers span.paginate_button.next {
98
    background-image : url('../../img/next.png');
98
    background-image : url('../../images/next.png');
99
    background-repeat: no-repeat;
99
    background-repeat: no-repeat;
100
    background-position : right center;
100
    background-position : right center;
101
    padding-right : 2em;
101
    padding-right : 2em;
102
}
102
}
103
.paging_full_numbers span.paginate_button.last {
103
.paging_full_numbers span.paginate_button.last {
104
    background-image : url('../../img/last.png');
104
    background-image : url('../../images/last.png');
105
    background-repeat: no-repeat;
105
    background-repeat: no-repeat;
106
    background-position : right center;
106
    background-position : right center;
107
    border-right : 1px solid #686868;
107
    border-right : 1px solid #686868;
Lines 147-177 div.dataTables_paginate.paging_four_button { Link Here
147
    width: 16px;
147
    width: 16px;
148
}
148
}
149
.paginate_disabled_first {
149
.paginate_disabled_first {
150
    background-image: url("../../img/first-disabled.png");
150
    background-image: url("../../images/first-disabled.png");
151
}
151
}
152
.paginate_enabled_first {
152
.paginate_enabled_first {
153
    background-image: url("../../img/first.png");
153
    background-image: url("../../images/first.png");
154
    cursor: pointer;
154
    cursor: pointer;
155
}
155
}
156
.paginate_disabled_previous {
156
.paginate_disabled_previous {
157
    background-image: url("../../img/prev-disabled.png");
157
    background-image: url("../../images/prev-disabled.png");
158
}
158
}
159
.paginate_enabled_previous {
159
.paginate_enabled_previous {
160
    background-image: url("../../img/prev.png");
160
    background-image: url("../../images/prev.png");
161
    cursor: pointer;
161
    cursor: pointer;
162
}
162
}
163
.paginate_disabled_next {
163
.paginate_disabled_next {
164
    background-image: url("../../img/next-disabled.png");
164
    background-image: url("../../images/next-disabled.png");
165
}
165
}
166
.paginate_enabled_next {
166
.paginate_enabled_next {
167
    background-image: url("../../img/next.png");
167
    background-image: url("../../images/next.png");
168
    cursor: pointer;
168
    cursor: pointer;
169
}
169
}
170
.paginate_disabled_last {
170
.paginate_disabled_last {
171
    background-image: url("../../img/last-disabled.png");
171
    background-image: url("../../images/last-disabled.png");
172
}
172
}
173
.paginate_enabled_last {
173
.paginate_enabled_last {
174
    background-image: url("../../img/last.png");
174
    background-image: url("../../images/last.png");
175
    cursor: pointer;
175
    cursor: pointer;
176
}
176
}
177
177
Lines 248-263 table.display thead th { Link Here
248
    width: 19px;
248
    width: 19px;
249
}
249
}
250
.paginate_disabled_previous {
250
.paginate_disabled_previous {
251
    background-image: url("../../img/datatables/back_disabled.jpg");
251
    background-image: url("../../images/datatables/back_disabled.jpg");
252
}
252
}
253
.paginate_enabled_previous {
253
.paginate_enabled_previous {
254
    background-image: url("../../img/datatables/back_enabled.jpg");
254
    background-image: url("../../images/datatables/back_enabled.jpg");
255
}
255
}
256
.paginate_disabled_next {
256
.paginate_disabled_next {
257
    background-image: url("../../img/datatables/forward_disabled.jpg");
257
    background-image: url("../../images/datatables/forward_disabled.jpg");
258
}
258
}
259
.paginate_enabled_next {
259
.paginate_enabled_next {
260
    background-image: url("../../img/datatables/forward_enabled.jpg");
260
    background-image: url("../../images/datatables/forward_enabled.jpg");
261
}
261
}
262
.spacer {
262
.spacer {
263
    clear: both;
263
    clear: both;
(-)a/koha-tmpl/opac-tmpl/prog/en/includes/masthead.inc (+1 lines)
Lines 121-126 Link Here
121
  [% ELSIF ( OPACViewOthersSuggestions ) %]<span class="pipe"> | </span><a href="/cgi-bin/koha/opac-suggestions.pl">Purchase suggestions</a>
121
  [% ELSIF ( OPACViewOthersSuggestions ) %]<span class="pipe"> | </span><a href="/cgi-bin/koha/opac-suggestions.pl">Purchase suggestions</a>
122
  [% END %]
122
  [% END %]
123
[% END %]
123
[% END %]
124
<span class="pipe"> | </span><a href="/cgi-bin/koha/opac-coursereserves.pl">Course reserves</a>
124
</div>
125
</div>
125
 </div>
126
 </div>
126
</div>
127
</div>
(-)a/koha-tmpl/opac-tmpl/prog/en/modules/opac-coursereserves.tt (+48 lines)
Line 0 Link Here
1
[% INCLUDE 'doc-head-open.inc' %][% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha Online[% END %] Catalog &rsaquo; Course Reserves Search
2
[% INCLUDE 'doc-head-close.inc' %]
3
<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" />
4
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.min.js"></script>
5
[% INCLUDE 'datatables-strings.inc' %]
6
<script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>
7
<script language="JavaScript">
8
 $(document).ready(function() {
9
    var srlt = $("#course_reserves").dataTable($.extend(true, {}, dataTablesDefaults, {
10
        "iDisplayLength": 25,
11
        "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, _("All")]],
12
        "sPaginationType": "four_button"
13
    } ) );
14
 });
15
</script>
16
</head>
17
<body>
18
[% INCLUDE 'masthead.inc' %]
19
<h1 style="text-align:center">Course reserves</h1>
20
<div style="margin: auto;width:98%;clear:both;">
21
<table style="clear:both;" id="course_reserves">
22
    <thead><tr>
23
        <th>Title</th>
24
        <th>Author</th>
25
        <th>Call Number</th>
26
        <th>Location</th>
27
        <th>Teacher</th>
28
        <th>Course</th>
29
    </tr></thead>
30
    <tbody>
31
[% FOREACH course_reserves_loo IN course_reserves_loop %]
32
    <tr>
33
    <td>
34
        <a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% course_reserves_loo.biblionumber %]">
35
            [% course_reserves_loo.title %] [% course_reserves_loo.typedocument %] [% course_reserves_loo.subtitle %]
36
        </a>
37
    </td>
38
    <td>[% course_reserves_loo.author %]</td>
39
    <td>[% course_reserves_loo.itemcallnumber %]</td>
40
    <td>[% course_reserves_loo.lib_opac %]</td>
41
    <td>[% course_reserves_loo.teacher_name %]</td>
42
    <td>[% course_reserves_loo.course_name %]</td>
43
    </tr>
44
[% END %]
45
    </tbody>
46
</table>
47
</div>
48
[% INCLUDE 'opac-bottom.inc' %]
(-)a/koha-tmpl/opac-tmpl/prog/en/xslt/MARC21slim2OPACResults.xsl (+6 lines)
Lines 1074-1079 Link Here
1074
                       <xsl:value-of select="count(key('item-by-status', 'Withdrawn'))"/>
1074
                       <xsl:value-of select="count(key('item-by-status', 'Withdrawn'))"/>
1075
                       <xsl:text>). </xsl:text>                   </span>
1075
                       <xsl:text>). </xsl:text>                   </span>
1076
				   </xsl:if>
1076
				   </xsl:if>
1077
                   <xsl:if test="count(key('item-by-status', 'reserveprofs'))>0">
1078
                   <span class="unavailable">
1079
                       <xsl:text>Reserved by teacher (</xsl:text>
1080
                       <xsl:value-of select="count(key('item-by-status', 'reserveprofs'))"/>
1081
                       <xsl:text>). </xsl:text>                   </span>
1082
                   </xsl:if>
1077
                    <xsl:if test="$hidelostitems='0' and count(key('item-by-status', 'Lost'))>0">
1083
                    <xsl:if test="$hidelostitems='0' and count(key('item-by-status', 'Lost'))>0">
1078
                   <span class="unavailable">
1084
                   <span class="unavailable">
1079
                       <xsl:text>Lost (</xsl:text>
1085
                       <xsl:text>Lost (</xsl:text>
(-)a/lbo_sql/lbo_RM1738_reserve_profs.sql (+23 lines)
Line 0 Link Here
1
/* Maxime Pelletier, 27-09-2011 */
2
3
CREATE  TABLE `reserve_courses` (
4
  `id` INT NOT NULL AUTO_INCREMENT ,
5
  `teacher_name` VARCHAR(80) NULL ,
6
  `course_name` VARCHAR(80) NULL ,
7
  `itemnumber` INT NULL ,
8
  PRIMARY KEY (`id`) ,
9
  INDEX `itemnumber` (`itemnumber` ASC) ,
10
  CONSTRAINT `itemnumber`
11
    FOREIGN KEY (`itemnumber` )
12
    REFERENCES `items` (`itemnumber` )
13
    ON DELETE NO ACTION
14
    ON UPDATE NO ACTION)
15
ENGINE = InnoDB;
16
17
INSERT INTO `authorised_values` (`category`, `authorised_value`, `lib`, `lib_opac`)
18
        VALUES ('NOT_LOAN', '101', 'Réserve des profs', 'Réserve des profs');
19
UPDATE `authorised_values` SET lib = 'Réserve des profs avec alerte', lib_opac = 'Réserve des profs avec alerte'
20
    WHERE authorised_value = 101;
21
22
INSERT INTO `authorised_values` (`category`, `authorised_value`, `lib`, `lib_opac`)
23
        VALUES ('NOT_LOAN', '-101', 'Réserve des profs', 'Réserve des profs');
(-)a/opac/opac-coursereserves.pl (+33 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
use strict;
4
5
use CGI;
6
use C4::Context;
7
use C4::Auth;
8
use C4::Output;
9
use C4::Members;
10
use C4::Dates qw(format_date_in_iso);
11
use C4::Courses qw(GetCourse GetCourses GetCourseReserves);
12
use Date::Calc qw(Today Date_to_Days);
13
use C4::Branch qw(GetBranchName GetBranchesLoop);
14
use C4::Koha;
15
use C4::Items;
16
use Data::Dumper;
17
18
my $query = new CGI;
19
20
my ($template, $loggedinuser, $cookie)
21
= get_template_and_user({
22
    template_name => "opac-coursereserves.tt",
23
    query => $query,
24
    type => "opac",
25
    authnotrequired => 1
26
   });
27
28
my @course_reserves = C4::Courses::GetAllReserves();
29
30
$template->param('course_reserves_loop' => \@course_reserves);
31
32
output_html_with_http_headers $query, $cookie, $template->output;
33
(-)a/t/db_dependent/Courses.t (+41 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
#
3
# This is to test C4/Courses
4
# It requires a working Koha database with the sample data
5
6
use strict;
7
use warnings;
8
9
use Test::More tests => 8;
10
11
BEGIN {
12
    use_ok('C4::Courses');
13
    use_ok('C4::Items');
14
}
15
16
#No reserves for item 1
17
my $reserve = C4::Courses::GetReserveFromItemNumber(1);
18
is ($reserve, undef);
19
20
#No reserves in the db
21
my $reserves = C4::Courses::GetAllReserves();
22
is ($reserves, 0);
23
24
#Create reserve for item 1 and check if properly added
25
C4::Courses::SaveReserve(1, 'teacher', 'course');
26
$reserve = C4::Courses::GetReserveFromItemNumber(1);
27
is ($reserve->{teacher_name}, 'teacher');
28
is ($reserve->{course_name}, 'course');
29
30
#Set the item to the proper notloan value for teacher reserve
31
C4::Items::ModItem({ notforloan => 101 }, undef, 1);
32
33
#Newly created reserve should be returned
34
$reserves = C4::Courses::GetAllReserves();
35
is ($reserves, 1);
36
37
C4::Courses::DeleteReserveFromItemNumber(1);
38
39
#No reserves for item 1
40
$reserve = C4::Courses::GetReserveFromItemNumber(1);
41
is ($reserve, undef);
(-)a/tools/batchMod.pl (-1 / +4 lines)
Lines 34-39 use C4::ClassSource; Link Here
34
use C4::Dates;
34
use C4::Dates;
35
use C4::Debug;
35
use C4::Debug;
36
use MARC::File::XML;
36
use MARC::File::XML;
37
use C4::Courses;
37
38
38
my $input = new CGI;
39
my $input = new CGI;
39
my $dbh = C4::Context->dbh;
40
my $dbh = C4::Context->dbh;
Lines 189-194 if ($op eq "action") { Link Here
189
                                LostItem($itemnumber, 'MARK RETURNED', 'CHARGE FEE') if $item->{itemlost};
190
                                LostItem($itemnumber, 'MARK RETURNED', 'CHARGE FEE') if $item->{itemlost};
190
                            }
191
                            }
191
                        };
192
                        };
193
            # LIBEO - st_6478_reserve_profs
194
            C4::Courses::SaveReserve($itemnumber, $input->param('teacher_name'), $input->param('course_name'));
195
            # /LIBEO
192
		    }
196
		    }
193
		}
197
		}
194
		$i++;
198
		$i++;
195
- 

Return to bug 8551