#!/usr/bin/perl

# Copyright 2000-2002 Katipo Communications
#
# 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 <https://www.gnu.org/licenses>.

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

=head1 DESCRIPTION

This script checks the amount unallocated from the new parent budget , or the period - if no parent_id is given

This script is called from aqbudgets.pl during an 'cud-add' or 'cud-mod' budget, from the JSscript Check() function, 
to determine whether the new parent budget (or period) has enough unallocated funds for the save to complete.

=cut

my $dbh   = C4::Context->dbh;
my $input = CGI->new;

my $total     = $input->param('total');
my $budget_id = $input->param('budget_id');
my $parent_id = $input->param('parent_id');
my $period_id = $input->param('period_id');
my $returncode;

my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
    {
        template_name => "acqui/ajax.tt",
        query         => $input,
        type          => "intranet",
    }
);
my ( $period, $parent, $budget );
$period = GetBudgetPeriod($period_id) if $period_id;
$parent = GetBudget($parent_id)       if defined $parent_id;
$budget = GetBudget($budget_id)       if defined $budget_id;

# CHECK THE PARENT BUDGET FOR ENOUGH AMOUNT UNALLOCATED,  IF NOT THEN RETURN 1
my ( $sub_unalloc, $period_sum, $budget_period_unalloc );

if ($parent) {
    my $query = "  SELECT SUM(budget_amount) as sum FROM aqbudgets where budget_parent_id = ? ";
    my @sql_params;
    my $sth = $dbh->prepare($query);
    $sth->execute( $parent->{'budget_id'} );
    my $sum = $sth->fetchrow_hashref;
    $sth->finish;
    $sub_unalloc = $parent->{'budget_amount'} - $sum->{sum};

    #    TRICKY.. , IF THE PARENT IS THE CURRENT PARENT  - THEN SUBTRACT CURRENT BUDGET FROM TOTAL
    $sub_unalloc += $budget->{'budget_amount'} if ( $budget->{'budget_parent_id'} == $parent_id );
}

# ELSE , IF NO PARENT PASSED, THEN CHECK UNALLOCATED FOR PERIOD, IF NOT THEN RETURN 2
else {
    my $query = qq| SELECT SUM(budget_amount) as sum
                FROM aqbudgets WHERE budget_period_id = ? and budget_parent_id IS NULL |;
    my @sql_params;
    push @sql_params, $period_id;
    if ($budget_id) {
        $query .= qq| and budget_id <> ? |;
        push @sql_params, $budget_id;
    }

    my $sth = $dbh->prepare($query);
    $sth->execute(@sql_params);
    $period_sum = $sth->fetchrow_hashref;
    $sth->finish;
    $budget_period_unalloc = $period->{'budget_period_total'} - $period_sum->{'sum'}
        if $period->{'budget_period_total'};
}

# FIXME - we really need a better way to do this consistently
# and across the board, be it bigints, Math::FixedPoint, a
# modernized version of Math::Currency that isn't tied to the system
# locale, or something else.
$total                 = sprintf( "%.2f", $total );
$sub_unalloc           = sprintf( "%.2f", $sub_unalloc );
$budget_period_unalloc = sprintf( "%.2f", $budget_period_unalloc );

if ($parent_id) {
    if ( ( $total > $sub_unalloc ) && $sub_unalloc ) {
        $returncode = 1;
    }
} elsif ( ( $total > $budget_period_unalloc ) && $budget_period_unalloc ) {
    $returncode = 2;

} else {
    $returncode = 0;
}

output_html_with_http_headers $input, $cookie, $returncode;
1;
