my $delay = shift;
my $supplierid = shift;
my $branch = shift;
+ my $estimateddeliverydatefrom = shift;
+ my $estimateddeliverydateto = shift;
my $dbh = C4::Context->dbh;
#BEWARE, order of parenthesis and LEFT JOIN is important for speed
my $dbdriver = C4::Context->config("db_scheme") || "mysql";
- my @query_params = ($delay); # delay is the first argument regardless
+ my @query_params = ();
my $select = "
SELECT aqbasket.basketno,
aqorders.ordernumber,
biblio.author, biblio.title,
biblioitems.publishercode AS publisher,
biblioitems.publicationyear,
+ ADDDATE(aqbasket.closedate, INTERVAL aqbooksellers.deliverytime DAY) AS estimateddeliverydate,
";
my $from = "
FROM
OR datereceived IS NULL
OR aqorders.quantityreceived < aqorders.quantity
)
+ AND aqbasket.closedate IS NOT NULL
AND (aqorders.datecancellationprinted IS NULL OR aqorders.datecancellationprinted='0000-00-00')
";
my $having = "";
$select .= "
aqorders.quantity - IFNULL(aqorders.quantityreceived,0) AS quantity,
(aqorders.quantity - IFNULL(aqorders.quantityreceived,0)) * aqorders.rrp AS subtotal,
- DATEDIFF(CURDATE( ),closedate) AS latesince
+ DATEDIFF(CAST(now() AS date),closedate) AS latesince
";
- $from .= " AND (closedate <= DATE_SUB(CURDATE( ),INTERVAL ? DAY)) ";
+ if ( defined $delay ) {
+ $from .= " AND (closedate <= DATE_SUB(CAST(now() AS date),INTERVAL ? DAY)) " ;
+ push @query_params, $delay;
+ }
$having = "
HAVING quantity <> 0
AND unitpricesupplier <> 0
$select .= "
aqorders.quantity AS quantity,
aqorders.quantity * aqorders.rrp AS subtotal,
- (CURDATE - closedate) AS latesince
+ (CAST(now() AS date) - closedate) AS latesince
";
- $from .= " AND (closedate <= (CURDATE -(INTERVAL ? DAY)) ";
+ if ( defined $delay ) {
+ $from .= " AND (closedate <= (CAST(now() AS date) -(INTERVAL ? DAY)) ";
+ push @query_params, $delay;
+ }
}
if (defined $supplierid) {
$from .= ' AND aqbasket.booksellerid = ? ';
$from .= ' AND borrowers.branchcode LIKE ? ';
push @query_params, $branch;
}
+ if ( defined $estimateddeliverydatefrom ) {
+ $from .= '
+ AND aqbooksellers.deliverytime IS NOT NULL
+ AND ADDDATE(aqbasket.closedate, INTERVAL aqbooksellers.deliverytime DAY) >= ?';
+ push @query_params, $estimateddeliverydatefrom;
+ }
+ if ( defined $estimateddeliverydatefrom and defined $estimateddeliverydateto ) {
+ $from .= ' AND ADDDATE(aqbasket.closedate, INTERVAL aqbooksellers.deliverytime DAY) <= ?';
+ push @query_params, $estimateddeliverydateto;
+ } elsif ( defined $estimateddeliverydatefrom ) {
+ $from .= ' AND ADDDATE(aqbasket.closedate, INTERVAL aqbooksellers.deliverytime DAY) <= CAST(now() AS date)';
+ }
if (C4::Context->preference("IndependantBranches")
&& C4::Context->userenv
&& C4::Context->userenv->{flags} != 1 ) {
=cut
sub GetBooksellersWithLateOrders {
- my $delay = shift;
- my $dbh = C4::Context->dbh;
-
- # TODO delay should be verified
- my $query_string =
- "SELECT DISTINCT aqbasket.booksellerid, aqbooksellers.name
- FROM aqorders LEFT JOIN aqbasket ON aqorders.basketno=aqbasket.basketno
- LEFT JOIN aqbooksellers ON aqbasket.booksellerid = aqbooksellers.id
- WHERE (closedate < DATE_SUB(CURDATE( ),INTERVAL $delay DAY)
- AND (datereceived = '' OR datereceived IS NULL))";
-
- my $sth = $dbh->prepare($query_string);
- $sth->execute;
+ my ( $delay, $branch, $estimateddeliverydatefrom, $estimateddeliverydateto ) = @_; # FIXME: Branch argument unused.
+ my $dbh = C4::Context->dbh;
+
+ # FIXME NOT quite sure that this operation is valid for DBMs different from Mysql, HOPING so
+ # should be tested with other DBMs
+
+ my $strsth;
+ my @query_params = ();
+ my $dbdriver = C4::Context->config("db_scheme") || "mysql";
+ $strsth = "
+ SELECT DISTINCT aqbasket.booksellerid, aqbooksellers.name
+ FROM aqorders LEFT JOIN aqbasket ON aqorders.basketno=aqbasket.basketno
+ LEFT JOIN aqbooksellers ON aqbasket.booksellerid = aqbooksellers.id
+ WHERE
+ ( datereceived = ''
+ OR datereceived IS NULL
+ OR aqorders.quantityreceived < aqorders.quantity
+ )
+ AND aqorders.rrp <> 0
+ AND aqorders.ecost <> 0
+ AND aqorders.quantity - IFNULL(aqorders.quantityreceived,0) <> 0
+ AND aqbasket.closedate IS NOT NULL
+ ";
+ if ( defined $delay ) {
+ $strsth .= " AND (closedate <= DATE_SUB(CAST(now() AS date),INTERVAL ? DAY)) ";
+ push @query_params, $delay;
+ }
+ if ( defined $estimateddeliverydatefrom ) {
+ $strsth .= '
+ AND aqbooksellers.deliverytime IS NOT NULL
+ AND ADDDATE(aqbasket.closedate, INTERVAL aqbooksellers.deliverytime DAY) >= ?';
+ push @query_params, $estimateddeliverydatefrom;
+ }
+ if ( defined $estimateddeliverydatefrom and defined $estimateddeliverydateto ) {
+ $strsth .= ' AND ADDDATE(aqbasket.closedate, INTERVAL aqbooksellers.deliverytime DAY) <= ?';
+ push @query_params, $estimateddeliverydateto;
+ } elsif ( defined $estimateddeliverydatefrom ) {
+ $strsth .= ' AND ADDDATE(aqbasket.closedate, INTERVAL aqbooksellers.deliverytime DAY) <= CAST(now() AS date)';
+ }
+
+ my $sth = $dbh->prepare($strsth);
+ $sth->execute( @query_params );
my %supplierlist;
while ( my ( $id, $name ) = $sth->fetchrow ) {
$supplierlist{$id} = $name;
contphone=?,contfax=?,contaltphone=?,contemail=?,
contnotes=?,active=?,listprice=?, invoiceprice=?,
gstreg=?,listincgst=?,invoiceincgst=?,
- discount=?,notes=?,gstrate=?
+ discount=?,notes=?,gstrate=?,deliverytime=?
WHERE id=?';
my $sth = $dbh->prepare($query);
$sth->execute(
$data->{'invoiceprice'}, $data->{'gstreg'},
$data->{'listincgst'}, $data->{'invoiceincgst'},
$data->{'discount'}, $data->{'notes'},
- $data->{'gstrate'}, $data->{'id'}
+ $data->{'gstrate'},
+ $data->{deliverytime},
+ $data->{'id'}
);
return;
}
use C4::Members qw/GetMember/; #needed for permissions checking for changing basketgroup of a basket
use C4::Items;
use C4::Suggestions;
+use Date::Calc qw/Add_Delta_Days/;
=head1 NAME
}
unshift( @$basketgroups, \%emptygroup );
}
+
+ # if the basket is closed, calculate estimated delivery date
+ my $estimateddeliverydate;
+ if( $basket->{closedate} ) {
+ my ($year, $month, $day) = ($basket->{closedate} =~ /(\d+)-(\d+)-(\d+)/);
+ ($year, $month, $day) = Add_Delta_Days($year, $month, $day, $bookseller->{deliverytime});
+ $estimateddeliverydate = "$year-$month-$day";
+ }
+
# if new basket, pre-fill infos
$basket->{creationdate} = "" unless ( $basket->{creationdate} );
$basket->{authorisedby} = $loggedinuser unless ( $basket->{authorisedby} );
authorisedby => $basket->{authorisedby},
authorisedbyname => $basket->{authorisedbyname},
closedate => $basket->{closedate},
+ estimateddeliverydate=> $estimateddeliverydate,
active => $bookseller->{'active'},
booksellerid => $bookseller->{'id'},
name => $bookseller->{'name'},
my $booksellerid = $input->param('booksellerid') || undef; # we don't want "" or 0
my $delay = $input->param('delay');
+my $estimateddeliverydatefrom = $input->param('estimateddeliverydatefrom');
+my $estimateddeliverydateto = $input->param('estimateddeliverydateto');
my $branch = $input->param('branch');
my $op = $input->param('op');
my @errors = ();
-$delay = 30 unless defined $delay;
-unless ($delay =~ /^\d{1,3}$/) {
- push @errors, {delay_digits => 1, bad_delay => $delay};
- $delay = 30; #default value for delay
+if ( defined $delay and not $delay =~ /^\d{1,3}$/ ) {
+ push @errors, {delay_digits => 1, bad_delay => $delay};
}
if ($op and $op eq "send_alert"){
}
}
-my %supplierlist = GetBooksellersWithLateOrders($delay);
+my %supplierlist = GetBooksellersWithLateOrders(
+ $delay,
+ $branch,
+ C4::Dates->new($estimateddeliverydatefrom)->output("iso"),
+ C4::Dates->new($estimateddeliverydateto)->output("iso")
+);
+
my (@sloopy); # supplier loop
foreach (keys %supplierlist){
push @sloopy, (($booksellerid and $booksellerid eq $_ ) ?
$template->param(Supplier=>$supplierlist{$booksellerid}) if ($booksellerid);
$template->param(booksellerid=>$booksellerid) if ($booksellerid);
-my @lateorders = GetLateOrders($delay,$booksellerid,$branch);
+my @lateorders = GetLateOrders(
+ $delay,
+ $booksellerid,
+ $branch,
+ C4::Dates->new($estimateddeliverydatefrom)->output("iso"),
+ C4::Dates->new($estimateddeliverydateto)->output("iso")
+);
my $total;
foreach (@lateorders){
$template->param(
lateorders => \@lateorders,
delay => $delay,
+ estimateddeliverydatefrom => $estimateddeliverydatefrom,
+ estimateddeliverydateto => $estimateddeliverydateto,
total => $total,
intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"),
+ DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
);
output_html_with_http_headers $input, $cookie, $template->output;
listincgst => $supplier->{'listincgst'},
invoiceincgst => $supplier->{'invoiceincgst'},
discount => $supplier->{'discount'},
+ deliverytime => $supplier->{deliverytime},
invoiceprice => $supplier->{'invoiceprice'},
listprice => $supplier->{'listprice'},
GST => $tax_rate,
invoiceincgst => $supplier->{'invoiceincgst'},
gstrate => $gstrate,
discount => $supplier->{'discount'},
+ deliverytime => $supplier->{deliverytime},
loop_currency => $loop_currency,
GST => $tax_rate,
enter => 1,
$data{'gstrate'} = $input->param('gstrate')/100;
}
$data{'discount'}=$input->param('discount');
+$data{deliverytime} = $input->param('deliverytime');
$data{'active'}=$input->param('status');
if($data{'name'}) {
if ($data{'id'}){
`gstrate` decimal(6,4) default NULL, -- the tax rate the library is charged
`discount` float(6,4) default NULL, -- discount offered on all items ordered from this vendor
`fax` varchar(50) default NULL, -- vendor fax number
+ `deliverytime` int(11) default NULL, -- vendor delivery time
PRIMARY KEY (`id`),
KEY `listprice` (`listprice`),
KEY `invoiceprice` (`invoiceprice`),
SetVersion($DBversion);
}
+$DBversion = "3.07.00.XXX";
+if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
+ $dbh->do("ALTER TABLE aqbooksellers ADD deliverytime INT DEFAULT NULL");
+ print "Upgrade to $DBversion done (Add deliverytime field in aqbooksellers table)";
+ SetVersion($DBversion);
+}
+
=head1 FUNCTIONS
=head2 DropAllForeignKeys($table)
[% IF ( authorisedbyname ) %]<li><span class="label">Managed by:</span> [% authorisedbyname %]</li>[% END %]
[% IF ( creationdate ) %]<li><span class="label">Opened on:</span> [% creationdate | $KohaDates %]</li>[% END %]
[% IF ( closedate ) %]<li><span class="label">Closed on:</span> [% closedate | $KohaDates %]</li>[% END %]
+ [% IF ( estimateddeliverydate ) %]<li><span class="label">Estimated delivery date:</span> [% estimateddeliverydate | $KohaDates %]</li>[% END %]
</ol>
</div>
+[% USE KohaDates %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Koha › Acquisitions › Late orders</title>
[% INCLUDE 'doc-head-close.inc' %]
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.checkboxes.min.js"></script>
+[% INCLUDE 'calendar.inc' %]
<script type="text/javascript">
//<![CDATA[
$(document).ready(function() {
<table id="late_orders">
<tr>
<th>Order Date</th>
+ <th>Estimated delivery date</th>
<th>Vendor</th>
<th>Information</th>
<th>Total cost</th>
[% lateorder.orderdate %]
([% lateorder.latesince %] days)
</td>
+ <td>
+ [% IF ( lateorder.estimateddeliverydate ) %]
+ [% lateorder.estimateddeliverydate | $KohaDates %]
+ [% END %]
+ </td>
<td>
[% lateorder.supplier %]
</td>
[% END %]
<tr>
<th>Total</th>
- <th colspan="2"> </th>
+ <th colspan="3"> </th>
<th>[% total %]</th>
<th> </th>
<th> </th>
[% FOREACH ERROR_LOO IN ERROR_LOOP %]
[% IF ( ERROR_LOO.delay_digits ) %]<p class="error">The number of days ([% ERROR_LOO.bad_delay %]) must be a number between 0 and 999.</p>[% END %]
[% END %]
-<ol><li><label for="delay">Order date:</label><input size="3" maxlength="3" id="delay" type="text" name="delay" value="[% delay %]" /> days ago</li>
+<ol>
+ <li><label for="delay">Order date:</label><input size="3" maxlength="3" id="delay" type="text" name="delay" value="[% delay %]" /> days ago</li>
+ <li><label for="delay">Estimated Delivery date from: </label>
+ <input type="text" size="10" id="estimateddeliverydatefrom" name="estimateddeliverydatefrom" value="[% estimateddeliverydatefrom %]" />
+ <img src="[% themelang %]/lib/calendar/cal.gif" id="openCalendarFrom" style="cursor: pointer;" alt="Show Calendar" />
+ <div class="hint">[% INCLUDE 'date-format.inc' %]</div>
+ </li>
+ <li><label for="delay">To: </label>
+ <input type="text" size="10" id="estimateddeliverydateto" name="estimateddeliverydateto" value="[% estimateddeliverydateto %]" />
+ <img src="[% themelang %]/lib/calendar/cal.gif" id="openCalendarTo" style="cursor: pointer;" alt="Show Calendar" />
+ <script type="text/javascript">
+ // return true if the date is blocked.
+ function disable_from(date) {var limit = get_Calendar_limit(date,'estimateddeliverydatefrom'); return (limit && limit < date);}
+ function disable_to(date) {var limit = get_Calendar_limit(date,'estimateddeliverydateto'); return (limit && limit < date);}
+ Calendar.setup({
+ inputField : "estimateddeliverydatefrom",
+ ifFormat : "[% DHTMLcalendar_dateformat %]",
+ button : "openCalendarFrom",
+ disableFunc : disable_from,
+ dateStatusFunc : disable_from
+ });
+ Calendar.setup({
+ inputField : "estimateddeliverydateto",
+ ifFormat : "[% DHTMLcalendar_dateformat %]",
+ button : "openCalendarTo",
+ disableFunc : disable_to,
+ dateStatusFunc : disable_to
+ });
+ </script>
+ <div class="hint">[% INCLUDE 'date-format.inc' %]</div>
+ </li>
+
<li><label for="booksellerid">Vendor:</label>
<select id="booksellerid" size="1" tabindex="" name="booksellerid">
<option value=""/>
<li><label for="discount">Discount</label>
<input type="text" size="6" id="discount" name="discount" value="[% discount %]" />%</li>
<li><label for="gstrate">Tax rate</label><input type="text" name="gstrate" id="gstrate" size="6" value="[% gstrate %]"/>% (leave blank for default tax of [% default_gst_rate %]%)</li>
+ <li>
+ <label for="deliverytime">Delivery time</label>
+ <input type="text" size="2" id="deliverytime" name="deliverytime" value="[% deliverytime %]" /> days
+ </li>
<li><label for="notes">Notes</label>
<textarea cols="40" rows="4" id="notes" name="notes" >[% notes %]</textarea></li></ol>
</fieldset>
[% discount %] %</p>
<p><strong>Tax rate: </strong>
[% GST %]%[% UNLESS ( default_tax ) %] (default)[% END %]</p>
+ [% IF deliverytime.defined %]
+ <p><strong>Delivery time: </strong>
+ [% deliverytime %] days</p>
+ [% END %]
[% IF ( notes ) %]<p><strong>Notes: </strong>
[% notes %]</p>[% END %]
</div>