Aktualisierung der RDBO-Models anhand des aktuellen Datebankschemas
[kivitendo-erp.git] / SL / DB / VC.pm
1 package SL::DB::VC;
2
3 use strict;
4
5 require Exporter;
6 use SL::DBUtils;
7
8 our @ISA    = qw(Exporter);
9 our @EXPORT = qw(get_credit_remaining);
10
11 sub get_credit_remaining {
12   my $vc               = shift;
13   my ($type, $arap)    = ref $vc eq 'SL::DB::Customer' ? ('customer', 'ar') : ('vendor', 'ap');
14   my %params           = @_;
15
16   my $credit_remaining = $vc->creditlimit || 0;
17
18   my $query            = <<SQL;
19     SELECT SUM(${arap}.amount - ${arap}.paid)
20     FROM ${arap}
21     WHERE ${type}_id = ?
22 SQL
23   my ($amount_unpaid)  = selectfirst_array_query($::form, $vc->dbh, $query, $vc->id);
24   $credit_remaining   -= $amount_unpaid;
25
26   $query = <<SQL;
27     SELECT o.amount,
28       (SELECT e.buy FROM exchangerate e
29        WHERE e.curr = o.curr
30          AND e.transdate = o.transdate)
31     FROM oe o
32     WHERE (o.${type}_id = ?)
33       AND NOT COALESCE(o.quotation, FALSE)
34       AND NOT COALESCE(o.closed,    FALSE)
35 SQL
36
37   my @values;
38   if ($params{exclude_order_id}) {
39     $query .= qq| AND (o.id <> ?)|;
40     push @values, $params{exclude_order_id};
41   }
42
43   my $sth = prepare_execute_query($::form, $vc->dbh, $query, $vc->id, @values);
44
45   while (my ($amount, $exch) = $sth->fetchrow_array) {
46     $credit_remaining -= $amount * ($exch || 1);
47   }
48   $sth->finish;
49
50   return $credit_remaining;
51 }
52
53 1;