<title>Koha › Tools › Inventory</title>
<!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
<!-- TMPL_INCLUDE NAME="calendar.inc" -->
-<script type="text/javascript" src="<!-- TMPL_VAR name="themelang" -->/lib/jquery/plugins/jquery.checkboxes.min.js"></script>
+<script type="text/javascript" src="<!-- TMPL_VAR name="themelang" -->/lib/jquery/plugins/jquery.checkboxes.pack.js"></script>
<script type="text/javascript">
//<![CDATA[
$(document).ready(function(){
<h1>Inventory/Stocktaking</h1>
<!-- TMPL_UNLESS name="loop" -->
<div class="yui-g">
- <div class="yui-u first">
<form method="post" action="/cgi-bin/koha/tools/inventory.pl">
<fieldset class="rows">
+ <legend>Use a barcode file</legend>
+ <ol>
+ <li><label for="uploadbarcodes">Barcode file: </label> <input type="file" id="uploadbarcodes" name="uploadbarcodes" /></li>
+ <li><label for="setdate">Set inventory date to:</label> <input type="text" id="setdate" name="setdate" value="<!-- TMPL_VAR name="today" -->" />
+ <img src="<!-- TMPL_VAR Name="themelang" -->/lib/calendar/cal.gif" id="setdate_button" alt="Show Calendar" />
+ <script type="text/javascript">
+ Calendar.setup(
+ {
+ inputField : "setdate",
+ ifFormat : "<!-- TMPL_VAR NAME="DHTMLcalendar_dateformat" -->",
+ button : "setdate_button"
+ }
+ );
+ </script>
+ </li>
+ </ol>
+ </fieldset>
+ <fieldset class="rows">
<legend>Select items you want to check</legend>
<ol><li>
<label for="branchloop">Library</label><select id="branchloop" name="branchcode" style="width:12em;">
<!-- /TMPL_LOOP -->
</select>
</li>
- <li>
- <label for="itemtype">Item type</label>
- <select name="itemtype" id="itemtype" style="width:12em;">
- <option value="">Any</option>
- <!-- TMPL_LOOP name="itemtypeloop" -->
- <!-- TMPL_IF name="selected" -->
- <option value="<!-- TMPL_VAR NAME="value" -->" selected="selected"><!-- TMPL_VAR NAME="description" --></option>
- <!-- TMPL_ELSE -->
- <option value="<!-- TMPL_VAR NAME="value" -->"><!-- TMPL_VAR NAME="description" --></option>
- <!-- /TMPL_IF -->
- <!-- /TMPL_LOOP -->
- </select>
- </li>
- <li>
- <label for="minlocation">Item location between: </label>
- <input type="text" name="minlocation" id="minlocation" value="<!-- TMPL_VAR NAME="minlocation" -->" /> (items.itemcallnumber) </li>
- <li><label for="maxlocation">...and: </label>
- <input type="text" name="maxlocation" id="maxlocation" value="<!-- TMPL_VAR NAME="maxlocation" -->" />
- </li>
<!-- TMPL_IF NAME="authorised_values" -->
<li>
<label for="locationloop">Item Location (items.location) is</label>
<!-- /TMPL_LOOP -->
</select> </li>
<!-- /TMPL_IF -->
- <li><label for="datelastseen">Not seen since:</label>
+ <li>
+ <label for="minlocation">Item callnumber between: </label>
+ <input type="text" name="minlocation" id="minlocation" value="<!-- TMPL_VAR NAME="minlocation" -->" /> (items.itemcallnumber) </li>
+ <li><label for="maxlocation">...and: </label>
+ <input type="text" name="maxlocation" id="maxlocation" value="<!-- TMPL_VAR NAME="maxlocation" -->" />
+ </li>
+ <!-- TMPL_IF name="statuses" -->
+ <label for="statuses" style="display: block;">Item statuses:</label>
+ <li>
+ <fieldset class="rows">
+ <div name="statuses" style="display: block;">
+ <!-- TMPL_LOOP name="statuses" -->
+ <!-- TMPL_IF name="values" -->
+ <div style="float: left; padding: 5px; margin: 5px;" align="right">
+ <strong style="text-decoration: underline;">
+ <!-- TMPL_VAR name="fieldname" -->
+ </strong>
+ <ul id="statuses-<!-- TMPL_VAR name="fieldname" -->" style="display: inline;">
+ <!-- TMPL_LOOP name="values" -->
+ <li>
+ <strong>
+ <!-- TMPL_VAR name="lib" -->
+ </strong>
+ <input type="checkbox" name="status-<!-- TMPL_VAR name="fieldname" -->-<!-- TMPL_VAR name="id" -->" id="<!-- TMPL_VAR name="id" -->" />
+ </li>
+ <!-- /TMPL_LOOP -->
+ </ul>
+ </div>
+ <!-- /TMPL_IF -->
+ <!-- /TMPL_LOOP -->
+ </div>
+ </fieldset>
+ </li>
+ <!-- /TMPL_IF -->
+ <li><label for="datelastseen">Inventory date:</label>
<input type="text" id="datelastseen" name="datelastseen" value="<!-- TMPL_VAR NAME="datelastseen" -->" />
<img src="<!-- TMPL_VAR Name="themelang" -->/lib/calendar/cal.gif" id="datelastseen_button" alt="Show Calendar" />
<script type="text/javascript">
<input type="text" id="pagesize" name="pagesize" value="<!-- TMPL_VAR NAME="pagesize" -->" maxlength="5" size="5" /> items</li>
<li><label for="offset">Beginning at offset: </label>
<input type="text" id="offset" name="offset" value="<!-- TMPL_VAR NAME="offset" -->" size="5" maxlength="5" />
- </li></ol>
+ </li>
+ <li>
+ <label for="CSVexport">Export to csv file</label>
+ <input type="checkbox" name="CSVexport" />
+ </li>
+ <li>
+ <label for="compareinv2barcd">Compare barcodes list to results</label>
+ <input type="checkbox" name="compareinv2barcd" />
+ </li>
+ </ol>
</fieldset>
<input type="hidden" name="op" value="do_it" />
<fieldset class="action"><input type="submit" value="Submit" class="button" /></fieldset>
</form>
</div>
-
- <div class="yui-u">
- <form name="barcodefile" method="post" action="/cgi-bin/koha/tools/inventory.pl" enctype="multipart/form-data">
- <fieldset class="rows">
- <legend>Use a barcode file</legend>
- <ol>
- <li><label for="uploadbarcodes">Barcode file: </label> <input type="file" id="uploadbarcodes" name="uploadbarcodes" /></li>
- <li><label for="setdate">Set date last seen to:</label> <input type="text" id="setdate" name="setdate" />
- <img src="<!-- TMPL_VAR Name="themelang" -->/lib/calendar/cal.gif" id="setdate_button" alt="Show Calendar" />
- <script type="text/javascript">
- Calendar.setup(
- {
- inputField : "setdate",
- ifFormat : "<!-- TMPL_VAR NAME="DHTMLcalendar_dateformat" -->",
- button : "setdate_button"
- }
- );
- </script>
-</li></ol>
- </fieldset>
- <fieldset class="action"><input type="submit" value="Submit" class="button" /></fieldset>
- </form>
- </div>
</div>
<!--/TMPL_UNLESS-->
<!--TMPL_IF Name="Number" --><div class="dialog message"><!--TMPL_VAR Name="Number"--> items modified : datelastseen set to <!--TMPL_VAR Name="date"--></div><!-- /TMPL_IF-->
<th>Barcode</th>
<th>Title</th>
<th>Unseen since</th>
+ <th>Problems</th>
</tr>
<!-- TMPL_LOOP NAME="loop" -->
<tr>
<td>
<p><!-- TMPL_VAR name="datelastseen" --></p>
</td>
+ <td>
+ <!-- TMPL_IF name="notfoundbarcode" -->
+ <p style="background: red;">Not found among barcodes in barcodes file.</p>
+ <!-- TMPL_ELSIF name="notfoundkoha" -->
+ <p style="background: red;">Not found in koha.</p>
+ <!-- TMPL_ELSE -->
+ <p style="background: green;">None</p>
+ <!-- /TMPL_IF -->
+ </td>
</tr>
<!-- /TMPL_LOOP -->
</table>
<input type="hidden" name="op" value="do_it" />
<input type="submit" value="Continue without Marking >>" class="submit" />
</form>
+ </div>
<!-- /TMPL_IF -->
<!-- /TMPL_IF -->
-
-</div>
</div>
<div class="yui-b">
<!-- TMPL_INCLUDE NAME="tools-menu.inc" -->
#!/usr/bin/perl
-# Copyright 2000-2002 Katipo Communications
+# Copyright 2000-2009 Biblibre S.A
+# John Soros <john.soros@biblibre.com>
#
# This file is part of Koha.
#
# Suite 330, Boston, MA 02111-1307 USA
use strict;
+use warnings;
+
+#need to open cgi and get the fh before anything else opens a new cgi context (see C4::Auth)
use CGI;
+my $input = CGI->new;
+my $uploadbarcodes = $input->param('uploadbarcodes');
+
use C4::Auth;
use C4::Context;
use C4::Output;
use C4::Branch; # GetBranches
use C4::Circulation;
-my $input = new CGI;
my $minlocation=$input->param('minlocation') || '';
my $maxlocation=$input->param('maxlocation');
$maxlocation=$minlocation.'Z' unless ( $maxlocation || ! $minlocation );
$offset=0 unless $offset;
my $pagesize = $input->param('pagesize');
$pagesize=50 unless $pagesize;
-my $uploadbarcodes = $input->param('uploadbarcodes');
my $branchcode = $input->param('branchcode');
my $op = $input->param('op');
+my $res; #contains the results loop
# warn "uploadbarcodes : ".$uploadbarcodes;
# use Data::Dumper; warn Dumper($input);
+
my ($template, $borrowernumber, $cookie)
= get_template_and_user({template_name => "tools/inventory.tmpl",
query => $input,
branchname => $branches->{$branch_hash}->{'branchname'},
selected => ($branch_hash eq $branchcode?1:0)};
}
-
-
-my $itemtypes = GetItemTypes;
-my @itemtypesloop;
-foreach my $thisitemtype (sort keys %$itemtypes) {
- my $selected = 1 if $thisitemtype eq $itemtype;
- my %row =(value => $thisitemtype,
- selected => $selected,
- description => $itemtypes->{$thisitemtype}->{'description'},
- );
- push @itemtypesloop, \%row;
-}
-$template->param(itemtypeloop => \@itemtypesloop);
my @authorised_value_list;
my $authorisedvalue_categories;
-my $dbh=C4::Context->dbh;
-my $rqauthcategorie=$dbh->prepare("SELECT authorised_value FROM marc_subfield_structure WHERE frameworkcode=? AND kohafield='items.location'");
-my $rq=$dbh->prepare("SELECT frameworkcode FROM biblio_framework");
-$rq->execute;
-while (my ($fwkcode)=$rq->fetchrow){
- $rqauthcategorie->execute($fwkcode);
- while (my ($authcat)=$rqauthcategorie->fetchrow){
- if ($authcat && $authorisedvalue_categories!~/\b$authcat\W/){
- $authorisedvalue_categories.="$authcat ";
- my $data=GetAuthorisedValues($authcat);
+my $frameworks = getframeworks();
+for my $fwk (keys %$frameworks){
+ my $fwkcode = $frameworks->{$fwk}->{'frameworkcode'};
+ my $authcode = GetAuthValCode('items.location', $fwkcode);
+ if ($authcode && $authorisedvalue_categories!~/\b$authcode\W/){
+ $authorisedvalue_categories.="$authcode ";
+ my $data=GetAuthorisedValues($authcode);
foreach my $value (@$data){
$value->{selected}=1 if ($value->{authorised_value} eq ($location));
}
push @authorised_value_list,@$data;
- }
- }
+ }
}
+my $statuses = [];
+for my $statfield (qw/items.notforloan items.itemlost items.wthdrawn items.damaged/){
+ my $hash = {};
+ $hash->{fieldname} = $statfield;
+ $hash->{authcode} = GetAuthValCode($statfield);
+ if ($hash->{authcode}){
+ my $arr = GetAuthorisedValues($hash->{authcode});
+ $hash->{values} = $arr;
+ push @$statuses, $hash;
+ }
+}
+$template->param( statuses => $statuses );
+my $staton = {}; #authorized values that are ticked
+for my $authvfield (@$statuses) {
+ $staton->{$authvfield->{fieldname}} = [];
+ for my $authval (@{$authvfield->{values}}){
+ if ( $input->param('status-' . $authvfield->{fieldname} . '-' . $authval->{id}) eq 'on' ){
+ push @{$staton->{$authvfield->{fieldname}}}, $authval->{id};
+ }
+ }
+}
+my $statussth = '';
+for my $authvfield (@$statuses) {
+ if ( scalar @{$staton->{$authvfield->{fieldname}}} > 0 ){
+ my $joinedvals = join ',', @{$staton->{$authvfield->{fieldname}}};
+ $statussth .= "$authvfield->{fieldname} in ($joinedvals) and ";
+ }
+}
+$statussth =~ s, and $,,g;
$template->param(branchloop => \@branch_loop,
authorised_values=>\@authorised_value_list,
DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
+ today => C4::Dates->today(),
minlocation => $minlocation,
maxlocation => $maxlocation,
location=>$location,
pagesize => $pagesize,
datelastseen => $datelastseen,
);
+my @brcditems;
if ($uploadbarcodes && length($uploadbarcodes)>0){
my $dbh=C4::Context->dbh;
my $date = format_date_in_iso($input->param('setdate')) || C4::Dates->today('iso');
my $item = GetItem('', $barcode);
if (defined $item && $item->{'itemnumber'}){
ModItem({ datelastseen => $date }, undef, $item->{'itemnumber'});
+ push @brcditems, $item;
$count++;
$qonloan->execute($barcode);
if ($qonloan->rows){
my $data = $qonloan->fetchrow_hashref;
my ($doreturn, $messages, $iteminformation, $borrower) =AddReturn($barcode, $data->{homebranch});
- if ($doreturn){push @errorloop, {'barcode'=>$barcode,'ERR_ONLOAN_RET'=>1}}
- else {push @errorloop, {'barcode'=>$barcode,'ERR_ONLOAN_NOT_RET'=>1}}
+ if ($doreturn){
+ push @errorloop, {'barcode'=>$barcode,'ERR_ONLOAN_RET'=>1}
+ } else {
+ push @errorloop, {'barcode'=>$barcode,'ERR_ONLOAN_NOT_RET'=>1}
+ }
}
} else {
push @errorloop, {'barcode'=>$barcode,'ERR_BARCODE'=>1};
$template->param(date=>format_date($date),Number=>$count);
# $template->param(errorfile=>$errorfile) if ($errorfile);
$template->param(errorloop=>\@errorloop) if (@errorloop);
-}else{
+}
+#if we want to compare the results to a list of barcodes, or we have no barcode file
+if ( ! ($uploadbarcodes && length($uploadbarcodes)>0 ) || ( $input->param('compareinv2barcd') eq 'on' && length($uploadbarcodes)>0) ) {
if ($markseen) {
foreach ($input->param) {
/SEEN-(.+)/ and &ModDateLastSeen($1);
}
}
if ($markseen or $op) {
- my $res = GetItemsForInventory($minlocation,$maxlocation,$location,$itemtype,$ignoreissued,$datelastseen,$branchcode,$offset,$pagesize);
+ $res = GetItemsForInventory($minlocation,$maxlocation,$location, $ignoreissued,$datelastseen,$branchcode,$offset,$pagesize,$staton);
$template->param(loop =>$res,
nextoffset => ($offset+$pagesize),
prevoffset => ($offset?$offset-$pagesize:0),
);
}
+ if ( ( ( $input->param('compareinv2barcd') eq 'on' ) && ( scalar @brcditems != scalar @$res ) ) && length($uploadbarcodes) > 0 ){
+ if ( scalar @brcditems > scalar @$res ){
+ for my $brcditem (@brcditems) {
+ if (! grep(/$brcditem->{barcode}/, @$res) ){
+ $brcditem->{notfoundkoha} = 1;
+ push @$res, $brcditem;
+ }
+ }
+ } else {
+ my @notfound;
+ for my $item (@$res) {
+ if ( ! grep(/$item->{barcode}/, @brcditems) ){
+ $item->{notfoundbarcode} = 1;
+ push @notfound, $item;
+ }
+ }
+ $res = [@$res, @notfound];
+ }
+ }
}
-output_html_with_http_headers $input, $cookie, $template->output;
-# Local Variables:
-# tab-width: 8
-# End:
+if ($input->param('CSVexport') eq 'on'){
+ eval {use Text::CSV};
+ my $csv = Text::CSV->new or
+ die Text::CSV->error_diag ();
+ print $input->header(
+ -type => 'text/csv',
+ -attachment => 'inventory.csv',
+ );
+ for my $re (@$res){
+ my @line;
+ for my $key (keys %$re) {
+ push @line, $re->{$key};
+ }
+ $csv->combine(@line);
+ print $csv->string, "\n";
+ }
+ exit;
+}
+
+output_html_with_http_headers $input, $cookie, $template->output;