#!/usr/bin/perl


#script to show display basket of orders


# Copyright 2000-2002 Katipo Communications
# Copyright 2008-2009 BibLibre SARL
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.

=head1 NAME

parcels.pl

=head1 DESCRIPTION

This script shows all orders/parcels receipt or pending for a given supplier.
It allows to write an order/parcels as 'received' when it arrives.

=head1 CGI PARAMETERS

=over 4

=item booksellerid

To know the supplier this script has to show orders.

=item orderby

sort list of order by 'orderby'.
Orderby can be equals to
    * datereceived desc (default value)
    * invoicenumber
    * datereceived
    * invoicenumber desc

=item filter

=item datefrom

To filter on date

=item dateto

To filter on date

=item resultsperpage

To know how many results have to be display / page.

=back

=cut

use Modern::Perl;
use CGI qw ( -utf8 );
use C4::Auth qw( get_template_and_user );
use C4::Output qw( output_html_with_http_headers );

use C4::Acquisition qw( GetInvoices GetInvoice AddInvoice );
use C4::Budgets qw( GetBudgetHierarchy GetBudget CanUserUseBudget );

use Koha::Acquisition::Booksellers;
use Koha::Acquisition::Invoices;
use Koha::AdditionalFields;
use Koha::DateUtils qw( dt_from_string );

my $input          = CGI->new;
my $booksellerid     = $input->param('booksellerid');
my $order          = $input->param('orderby') || 'shipmentdate desc';
my $startfrom      = $input->param('startfrom');
my $code           = $input->param('filter');
my $datefrom       = $input->param('datefrom');
my $dateto         = $input->param('dateto');
my $resultsperpage = $input->param('resultsperpage');
my $op             = $input->param('op');
$resultsperpage ||= 20;

our ( $template, $loggedinuser, $cookie, $flags ) = get_template_and_user(
    {   template_name   => 'acqui/parcels.tt',
        query           => $input,
        type            => 'intranet',
        flagsrequired   => { acquisition => 'order_receive' },
    }
);

my $invoicenumber = $input->param('invoice');
my $shipmentcost = $input->param('shipmentcost');
my $shipmentcost_budgetid = $input->param('shipmentcost_budgetid');
my $shipmentdate = $input->param('shipmentdate');

if ( $op and $op eq 'new' ) {
    if ( C4::Context->preference('AcqWarnOnDuplicateInvoice') ) {
        my @invoices = GetInvoices(
            supplierid    => $booksellerid,
            invoicenumber => $invoicenumber,
        );
        if ( scalar @invoices > 0 ) {
            $template->{'VARS'}->{'duplicate_invoices'} = \@invoices;
            $template->{'VARS'}->{'invoicenumber'}      = $invoicenumber;
            $template->{'VARS'}->{'shipmentdate'}       = $shipmentdate;
            $template->{'VARS'}->{'shipmentcost'}       = $shipmentcost;
            $template->{'VARS'}->{'shipmentcost_budgetid'} =
              $shipmentcost_budgetid;
        }
    }
    $op = 'confirm' unless $template->{'VARS'}->{'duplicate_invoices'};
}

if ($op and $op eq 'confirm') {
    my $invoiceid = AddInvoice(
        invoicenumber => $invoicenumber,
        booksellerid => $booksellerid,
        shipmentdate => $shipmentdate,
        shipmentcost => $shipmentcost,
        shipmentcost_budgetid => $shipmentcost_budgetid,
    );
    if (defined $invoiceid) {

        my @additional_fields;
        my $invoice_fields = Koha::AdditionalFields->search({ tablename => 'aqinvoices' });
        while ( my $field = $invoice_fields->next ) {
            my $value = $input->param('additional_field_' . $field->id);
            if (defined $value) {
                push @additional_fields, {
                    id    => $field->id,
                    value => $value,
                };
            }
        }
        if (@additional_fields) {
            my $invoice = Koha::Acquisition::Invoices->find( $invoiceid );
            $invoice->set_additional_fields(\@additional_fields);
        }
        # Successful 'Add'
        print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=$invoiceid");
        exit 0;
    } else {
        $template->param(error_failed_to_create_invoice => 1);
    }
}

$template->param(
    available_additional_fields => [ Koha::AdditionalFields->search({ tablename => 'aqinvoices' })->as_list ]
);

my $bookseller = Koha::Acquisition::Booksellers->find( $booksellerid );
my @parcels = GetInvoices(
    supplierid => $booksellerid,
    invoicenumber => $code,
    ( $datefrom ? ( shipmentdatefrom => $datefrom ) : () ),
    ( $dateto   ? ( shipmentdateto   => $dateto   ) : () ),
    order_by => $order
);
my $count_parcels = @parcels;

# multi page display gestion
$startfrom ||= 0;
if ( $count_parcels > $resultsperpage ) {
    set_page_navigation( $count_parcels, $startfrom, $resultsperpage );
}
my $loopres = [];

my $next_page_start = $startfrom + $resultsperpage;
my $last_row = ( $next_page_start < $count_parcels  ) ? $next_page_start - 1 : $count_parcels - 1;
for my $i ( $startfrom .. $last_row) {
    my $p = $parcels[$i];

    push @{$loopres},
      { number           => $i + 1,
        invoiceid        => $p->{invoiceid},
        code             => $p->{invoicenumber},
        nullcode         => $p->{invoicenumber} eq 'NULL',
        emptycode        => $p->{invoicenumber} eq q{},
        raw_datereceived => $p->{shipmentdate},
        datereceived     => $p->{shipmentdate},
        bibcount         => $p->{receivedbiblios} || 0,
        reccount         => $p->{receiveditems} || 0,
        itemcount        => $p->{itemsexpected} || 0,
      };
}
if ($count_parcels) {
    $template->param( searchresults => $loopres, count => $count_parcels );
}

# build budget list
my $budget_loop = [];
my $budgets = GetBudgetHierarchy;
foreach my $r (@{$budgets}) {
    next unless (CanUserUseBudget($loggedinuser, $r, $flags));
    push @{$budget_loop}, {
        b_id  => $r->{budget_id},
        b_txt => $r->{budget_name},
        b_active => $r->{budget_period_active},
    };
}

@{$budget_loop} =
  sort { uc( $a->{b_txt}) cmp uc( $b->{b_txt}) } @{$budget_loop};


$template->param(
    orderby                  => $order,
    filter                   => $code,
    datefrom                 => $datefrom,
    dateto                   => $dateto,
    resultsperpage           => $resultsperpage,
    name                     => $bookseller->name,
    shipmentdate_today       => dt_from_string,
    booksellerid             => $booksellerid,
    GST                      => C4::Context->preference('TaxRates'),
    budgets                  => $budget_loop,
);

output_html_with_http_headers $input, $cookie, $template->output;

sub set_page_navigation {
    my ( $total_rows, $startfrom, $resultsperpage ) = @_;
    my $displaynext = 0;
    my $displayprev = $startfrom;
    my $next_row    = $startfrom + $resultsperpage;
    my $prev_row    = $startfrom - $resultsperpage;

    if ( $total_rows - $next_row > 0 ) {
        $displaynext = 1;
    }

    # set up index numbers for paging
    my $numbers = [];
    if ( $total_rows > $resultsperpage ) {
        my $pages = $total_rows / $resultsperpage;
        if ( $total_rows % $resultsperpage ) {
            ++$pages;
        }

        # set up page indexes for at max 15 pages
        my $max_idx = ( $pages < 15 ) ? $pages : 15;
        my $current_page = ( $startfrom / $resultsperpage ) - 1;
        for my $idx ( 1 .. $max_idx ) {
            push @{$numbers},
              { number    => $idx,
                startfrom => ( $idx - 1 ) * $resultsperpage,
                highlight => ( $idx == $current_page ),
              };
        }
    }

    $template->param(
        numbers     => $numbers,
        displaynext => $displaynext,
        displayprev => $displayprev,
        nextstartfrom => ( ( $next_row < $total_rows ) ? $next_row : $total_rows ),
        prevstartfrom => ( ( $prev_row > 0 ) ? $prev_row : 0 )
    );
    return;
}
