X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=sql-ledger%2FSL%2FAP.pm;h=05bc77a3a5bce681e840c44831ec1408c6a78122;hp=e1870f872a0412c2af9e23ebf025ae42ae58bd13;hb=948b8acdd4b9b3864342062d0c397a11f57c5700;hpb=f6c9088e16c4c083174dd1130ae58d213923cdef diff --git a/sql-ledger/SL/AP.pm b/sql-ledger/SL/AP.pm index e1870f872..05bc77a3a 100644 --- a/sql-ledger/SL/AP.pm +++ b/sql-ledger/SL/AP.pm @@ -1,6 +1,6 @@ #===================================================================== # SQL-Ledger Accounting -# Copyright (C) 2001 +# Copyright (C) 2000 # # Author: Dieter Simader # Email: dsimader@sql-ledger.org @@ -36,12 +36,17 @@ sub post_transaction { # connect to database my $dbh = $form->dbconnect_noauto($myconfig); - my ($null, $taxrate, $amount); + my $null; + my $taxrate; + my $amount; my $exchangerate = 0; # split and store id numbers in link accounts - ($form->{AP}{payables}) = split(/--/, $form->{AP}); - map { ($form->{AP}{"amount_$_"}) = split(/--/, $form->{"AP_amount_$_"}) } (1 .. $form->{rowcount}); + map { ($form->{AP_amounts}{"amount_$_"}) = split(/--/, $form->{"AP_amount_$_"}) } (1 .. $form->{rowcount}); + ($form->{AP_amounts}{payables}) = split(/--/, $form->{AP}); + + ($null, $form->{department_id}) = split(/--/, $form->{department}); + $form->{department_id} *= 1; if ($form->{currency} eq $form->{defaultcurrency}) { $form->{exchangerate} = 1; @@ -54,71 +59,59 @@ sub post_transaction { # reverse and parse amounts for my $i (1 .. $form->{rowcount}) { $form->{"amount_$i"} = $form->round_amount($form->parse_amount($myconfig, $form->{"amount_$i"}) * $form->{exchangerate} * -1, 2); - $amount += ($form->{"amount_$i"} * -1); + $form->{netamount} += ($form->{"amount_$i"} * -1); } - # this is for ap - $form->{amount} = $amount; # taxincluded doesn't make sense if there is no amount - $form->{taxincluded} = 0 if ($form->{amount} == 0); + $form->{taxincluded} = 0 if ($form->{netamount} == 0); for my $item (split / /, $form->{taxaccounts}) { - $form->{AP}{"tax_$item"} = $item; + $form->{AP_amounts}{"tax_$item"} = $item; - $amount = $form->round_amount($form->parse_amount($myconfig, $form->{"tax_$item"}), 2); - - $form->{"tax_$item"} = $form->round_amount($amount * $form->{exchangerate}, 2) * -1; - $form->{total_tax} += ($form->{"tax_$item"} * -1); + $form->{"tax_$item"} = $form->round_amount($form->parse_amount($myconfig, $form->{"tax_$item"}) * $form->{exchangerate}, 2) * -1; + $form->{tax} += ($form->{"tax_$item"} * -1); } # adjust paidaccounts if there is no date in the last row $form->{paidaccounts}-- unless ($form->{"datepaid_$form->{paidaccounts}"}); - $form->{invpaid} = 0; + $form->{paid} = 0; # add payments for my $i (1 .. $form->{paidaccounts}) { $form->{"paid_$i"} = $form->round_amount($form->parse_amount($myconfig, $form->{"paid_$i"}), 2); - $form->{invpaid} += $form->{"paid_$i"}; + $form->{paid} += $form->{"paid_$i"}; $form->{datepaid} = $form->{"datepaid_$i"}; } - $form->{invpaid} = $form->round_amount($form->{invpaid} * $form->{exchangerate}, 2); if ($form->{taxincluded} *= 1) { for $i (1 .. $form->{rowcount}) { - $tax = $form->{total_tax} * $form->{"amount_$i"} / $form->{amount}; + $tax = ($form->{netamount}) ? $form->{tax} * $form->{"amount_$i"} / $form->{netamount} : 0; $amount = $form->{"amount_$i"} - $tax; $form->{"amount_$i"} = $form->round_amount($amount, 2); $diff += $amount - $form->{"amount_$i"}; } - # deduct taxes from amount - $form->{amount} -= $form->{total_tax}; + $form->{netamount} -= $form->{tax}; # deduct difference from amount_1 $form->{amount_1} += $form->round_amount($diff, 2); } - $form->{netamount} = $form->{amount}; + $form->{amount} = $form->{netamount} + $form->{tax}; + $form->{paid} = $form->round_amount($form->{paid} * $form->{exchangerate}, 2); - # store invoice total, this goes into ap table - $form->{invtotal} = $form->{amount} + $form->{total_tax}; - - # amount for total AP - $form->{payables} = $form->{invtotal}; - - - my ($query, $sth); + my $query; + my $sth; # if we have an id delete old records if ($form->{id}) { # delete detail records $query = qq|DELETE FROM acc_trans WHERE trans_id = $form->{id}|; - $dbh->do($query) || $form->dberror($query); } else { @@ -132,37 +125,33 @@ sub post_transaction { $query = qq|SELECT id FROM ap WHERE invnumber = '$uid'|; - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); - - ($form->{id}) = $sth->fetchrow_array; - $sth->finish; - + ($form->{id}) = $dbh->selectrow_array($query); } - # escape ' - $form->{notes} =~ s/'/''/g; - $form->{datepaid} = $form->{transdate} unless ($form->{datepaid}); - my $datepaid = ($form->{invpaid} != 0) ? qq|'$form->{datepaid}'| : 'NULL'; + my $datepaid = ($form->{paid} != 0) ? qq|'$form->{datepaid}'| : 'NULL'; $query = qq|UPDATE ap SET - invnumber = '$form->{invnumber}', + invnumber = |.$dbh->quote($form->{invnumber}).qq|, transdate = '$form->{transdate}', - ordnumber = '$form->{ordnumber}', + ordnumber = |.$dbh->quote($form->{ordnumber}).qq|, vendor_id = $form->{vendor_id}, taxincluded = '$form->{taxincluded}', - amount = $form->{invtotal}, - duedate = '$form->{duedate}', - paid = $form->{invpaid}, + amount = $form->{amount}, + duedate = |.$form->dbquote($form->{duedate}, SQL_DATE).qq|, + paid = $form->{paid}, datepaid = $datepaid, netamount = $form->{netamount}, - curr = '$form->{currency}', - notes = '$form->{notes}' + curr = |.$dbh->quote($form->{currency}).qq|, + notes = |.$dbh->quote($form->{notes}).qq|, + department_id = $form->{department_id} WHERE id = $form->{id} |; $dbh->do($query) || $form->dberror($query); + # amount for AP account + $form->{payables} = $form->{amount}; + # update exchangerate if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { @@ -170,12 +159,14 @@ sub post_transaction { } # add individual transactions - foreach my $item (keys %{ $form->{AP} }) { + foreach my $item (keys %{ $form->{AP_amounts} }) { + if ($form->{$item} != 0) { + $project_id = 'NULL'; if ($item =~ /amount_/) { - if ($form->{"project_id_$'"} && $form->{"projectnumber_$'"}) { - $project_id = $form->{"project_id_$'"}; + if ($form->{"projectnumber_$'"}) { + ($null, $project_id) = split /--/, $form->{"projectnumber_$'"} } } @@ -183,20 +174,25 @@ sub post_transaction { $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id) VALUES ($form->{id}, (SELECT id FROM chart - WHERE accno = '$form->{AP}{$item}'), + WHERE accno = '$form->{AP_amounts}{$item}'), $form->{$item}, '$form->{transdate}', $project_id)|; $dbh->do($query) || $form->dberror($query); } } # if there is no amount but a payment record a payable - if ($form->{amount} == 0 && $form->{invtotal} == 0) { - $form->{payables} = $form->{invpaid}; + if ($form->{amount} == 0) { + $form->{payables} = $form->{paid}; + $form->{payables} -= $form->{paid_1} if $form->{amount_1} != 0; } # add paid transactions for my $i (1 .. $form->{paidaccounts}) { if ($form->{"paid_$i"} != 0) { + + # get paid account + ($form->{AP_amounts}{"paid_$i"}) = split(/--/, $form->{"AP_paid_$i"}); + $form->{"datepaid_$i"} = $form->{transdate} unless ($form->{"datepaid_$i"}); $exchangerate = 0; if ($form->{currency} eq $form->{defaultcurrency}) { @@ -208,22 +204,18 @@ sub post_transaction { } - # get paid account - ($form->{AP}{"paid_$i"}) = split(/--/, $form->{"AP_paid_$i"}); - $form->{"datepaid_$i"} = $form->{transdate} unless ($form->{"datepaid_$i"}); - - # if there is no amount and invtotal is zero there is no exchangerate - if ($form->{amount} == 0 && $form->{invtotal} == 0) { + # if there is no amount + if ($form->{amount} == 0 && $form->{netamount} == 0) { $form->{exchangerate} = $form->{"exchangerate_$i"}; } $amount = $form->round_amount($form->{"paid_$i"} * $form->{exchangerate} * -1, 2); - if ($form->{payables}) { + if ($form->{payables} != 0) { $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate) VALUES ($form->{id}, - (SELECT id FROM chart - WHERE accno = '$form->{AP}{payables}'), + (SELECT id FROM chart + WHERE accno = '$form->{AP_amounts}{payables}'), $amount, '$form->{"datepaid_$i"}')|; $dbh->do($query) || $form->dberror($query); } @@ -231,12 +223,13 @@ sub post_transaction { # add payment $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, - transdate, source) + transdate, source, memo) VALUES ($form->{id}, - (SELECT id FROM chart - WHERE accno = '$form->{AP}{"paid_$i"}'), - $form->{"paid_$i"}, '$form->{"datepaid_$i"}', - '$form->{"source_$i"}')|; + (SELECT id FROM chart + WHERE accno = '$form->{AP_amounts}{"paid_$i"}'), + $form->{"paid_$i"}, '$form->{"datepaid_$i"}', | + .$dbh->quote($form->{"source_$i"}).qq|, | + .$dbh->quote($form->{"memo_$i"}).qq|)|; $dbh->do($query) || $form->dberror($query); # add exchange rate difference @@ -245,8 +238,8 @@ sub post_transaction { $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared) VALUES ($form->{id}, - (SELECT id FROM chart - WHERE accno = '$form->{AP}{"paid_$i"}'), + (SELECT id FROM chart + WHERE accno = '$form->{AP_amounts}{"paid_$i"}'), $amount, '$form->{"datepaid_$i"}', '1', '0')|; $dbh->do($query) || $form->dberror($query); @@ -260,7 +253,7 @@ sub post_transaction { $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared) VALUES ($form->{id}, (SELECT id FROM chart - WHERE accno = '$accno'), + WHERE accno = '$accno'), $amount, '$form->{"datepaid_$i"}', '1', '0')|; $dbh->do($query) || $form->dberror($query); } @@ -271,6 +264,16 @@ sub post_transaction { } } } + + # save printed and queued + $form->save_status($dbh); + + my %audittrail = ( tablename => 'ap', + reference => $form->{invnumber}, + formname => 'transaction', + action => 'posted', + id => $form->{id} ); + $form->audittrail($dbh, "", \%audittrail); my $rc = $dbh->commit; $dbh->disconnect; @@ -283,24 +286,52 @@ sub post_transaction { sub delete_transaction { - my ($self, $myconfig, $form) = @_; + my ($self, $myconfig, $form, $spool) = @_; # connect to database my $dbh = $form->dbconnect_noauto($myconfig); - # check for other foreign currency transactions - $form->delete_exchangerate($dbh) if ($form->{currency} ne $form->{defaultcurrency}); - + my %audittrail = ( tablename => 'ap', + reference => $form->{invnumber}, + formname => 'transaction', + action => 'deleted', + id => $form->{id} ); + $form->audittrail($dbh, "", \%audittrail); + my $query = qq|DELETE FROM ap WHERE id = $form->{id}|; $dbh->do($query) || $form->dberror($query); $query = qq|DELETE FROM acc_trans WHERE trans_id = $form->{id}|; $dbh->do($query) || $form->dberror($query); + + # delete spool files + $query = qq|SELECT spoolfile FROM status + WHERE trans_id = $form->{id} + AND spoolfile IS NOT NULL|; + my $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + my $spoolfile; + my @spoolfiles = (); + + while (($spoolfile) = $sth->fetchrow_array) { + push @spoolfiles, $spoolfile; + } + $sth->finish; + + $query = qq|DELETE FROM status WHERE trans_id = $form->{id}|; + $dbh->do($query) || $form->dberror($query); # commit and redirect my $rc = $dbh->commit; $dbh->disconnect; + if ($rc) { + foreach $spoolfile (@spoolfiles) { + unlink "$spool/$spoolfile" if $spoolfile; + } + } + $rc; } @@ -313,62 +344,114 @@ sub ap_transactions { # connect to database my $dbh = $form->dbconnect($myconfig); - - my $incemp = qq|, (SELECT e.name FROM employee e - WHERE a.employee_id = e.id) AS employee - | if ($form->{l_employee}); - + my $var; + + my $paid = "a.paid"; + + if ($form->{outstanding}) { + $paid = qq|SELECT SUM(ac.amount) + FROM acc_trans ac + JOIN chart c ON (c.id = ac.chart_id) + WHERE ac.trans_id = a.id + AND (c.link LIKE '%AP_paid%' OR c.link = '')|; + $paid .= qq| + AND ac.transdate <= '$form->{transdateto}'| if $form->{transdateto}; + } + my $query = qq|SELECT a.id, a.invnumber, a.transdate, a.duedate, - a.amount, a.paid, a.ordnumber, v.name, a.invoice, - a.netamount, a.datepaid, a.notes - - $incemp - - FROM ap a, vendor v - WHERE a.vendor_id = v.id|; - + a.amount, ($paid) AS paid, a.ordnumber, v.name, + a.invoice, a.netamount, a.datepaid, a.notes, + a.vendor_id, e.name AS employee, m.name AS manager, + a.curr, ex.sell AS exchangerate + FROM ap a + JOIN vendor v ON (a.vendor_id = v.id) + LEFT JOIN employee e ON (a.employee_id = e.id) + LEFT JOIN employee m ON (e.managerid = m.id) + LEFT JOIN exchangerate ex ON (ex.curr = a.curr + AND ex.transdate = a.transdate) + |; + + my %ordinal = ( 'id' => 1, + 'invnumber' => 2, + 'transdate' => 3, + 'duedate' => 4, + 'ordnumber' => 7, + 'name' => 8, + 'datepaid' => 11, + 'employee' => 14, + 'manager' => 15, + 'curr' => 16 + ); + + my @a = (transdate, invnumber, name); + push @a, "employee" if $form->{l_employee}; + push @a, "manager" if $form->{l_manager}; + my $sortorder = $form->sort_order(\@a, \%ordinal); + + my $where = "1 = 1"; + if ($form->{vendor_id}) { - $query .= " AND a.vendor_id = $form->{vendor_id}"; + $where .= " AND a.vendor_id = $form->{vendor_id}"; } else { if ($form->{vendor}) { - my $vendor = $form->like(lc $form->{vendor}); - $query .= " AND lower(v.name) LIKE '$vendor'"; + $var = $form->like(lc $form->{vendor}); + $where .= " AND lower(v.name) LIKE '$var'"; } } + if ($form->{department}) { + my ($null, $department_id) = split /--/, $form->{department}; + $where .= " AND a.department_id = $department_id"; + } if ($form->{invnumber}) { - my $invnumber = $form->like(lc $form->{invnumber}); - $query .= " AND lower(a.invnumber) LIKE '$invnumber'"; + $var = $form->like(lc $form->{invnumber}); + $where .= " AND lower(a.invnumber) LIKE '$var'"; + $form->{open} = $form->{closed} = 0; } if ($form->{ordnumber}) { - my $ordnumber = $form->like(lc $form->{ordnumber}); - $query .= " AND lower(a.ordnumber) LIKE '$ordnumber'"; + $var = $form->like(lc $form->{ordnumber}); + $where .= " AND lower(a.ordnumber) LIKE '$var'"; + $form->{open} = $form->{closed} = 0; } if ($form->{notes}) { - my $notes = $form->like(lc $form->{notes}); - $query .= " AND lower(a.notes) LIKE '$notes'"; + $var = $form->like(lc $form->{notes}); + $where .= " AND lower(a.notes) LIKE '$var'"; } - $query .= " AND a.transdate >= '$form->{transdatefrom}'" if $form->{transdatefrom}; - $query .= " AND a.transdate <= '$form->{transdateto}'" if $form->{transdateto}; + ($form->{transdatefrom}, $form->{transdateto}) = $form->from_to($form->{year}, $form->{month}, $form->{interval}) if $form->{year} && $form->{month}; + + $where .= " AND a.transdate >= '$form->{transdatefrom}'" if $form->{transdatefrom}; + $where .= " AND a.transdate <= '$form->{transdateto}'" if $form->{transdateto}; if ($form->{open} || $form->{closed}) { unless ($form->{open} && $form->{closed}) { - $query .= " AND a.amount <> a.paid" if ($form->{open}); - $query .= " AND a.amount = a.paid" if ($form->{closed}); + $where .= " AND a.amount != a.paid" if ($form->{open}); + $where .= " AND a.amount = a.paid" if ($form->{closed}); } } - my @a = (transdate, invnumber, name); - push @a, "employee" if $self->{l_employee}; - my $sortorder = join ', ', $form->sort_columns(@a); - $sortorder = $form->{sort} unless $sortorder; - $query .= " ORDER by $sortorder"; + if ($form->{AP}) { + my ($accno) = split /--/, $form->{AP}; + $where .= qq| + AND a.id IN (SELECT ac.trans_id + FROM acc_trans ac + JOIN chart c ON (c.id = ac.chart_id) + WHERE a.id = ac.trans_id + AND c.accno = '$accno') + |; + } + + $query .= "WHERE $where + ORDER by $sortorder"; my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); - while (my $ap = $sth->fetchrow_hashref(NAME_lc)) { - push @{ $form->{AP} }, $ap; + while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + $ref->{exchangerate} = 1 unless $ref->{exchangerate}; + if ($form->{outstanding}) { + next if $form->round_amount($ref->{amount}, 2) == $form->round_amount($ref->{paid}, 2); + } + push @{ $form->{transactions} }, $ref; } $sth->finish;