diff options
author | christopherm <christopherm@4979c152-3d1c-0410-bac9-87ea11338e46> | 2006-09-01 01:16:38 +0000 |
---|---|---|
committer | christopherm <christopherm@4979c152-3d1c-0410-bac9-87ea11338e46> | 2006-09-01 01:16:38 +0000 |
commit | ac5b087ea2d9ba7428d367aaeb288534158fee9a (patch) | |
tree | 2dbe0bdea0b653a215ba9ddfdf627cb57855050d /LedgerSMB/GL.pm |
Initial Import
git-svn-id: https://ledger-smb.svn.sourceforge.net/svnroot/ledger-smb/ledger-smb@1 4979c152-3d1c-0410-bac9-87ea11338e46
Diffstat (limited to 'LedgerSMB/GL.pm')
-rwxr-xr-x | LedgerSMB/GL.pm | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/LedgerSMB/GL.pm b/LedgerSMB/GL.pm new file mode 100755 index 00000000..7c1d4fdd --- /dev/null +++ b/LedgerSMB/GL.pm @@ -0,0 +1,526 @@ +#===================================================================== +# LedgerSMB +# Small Medium Business Accounting software +# +# See COPYRIGHT file for copyright information +#====================================================================== +# +# This file has undergone whitespace cleanup. +# +#====================================================================== +# +# General ledger backend code +# +#====================================================================== + +package GL; + + +sub delete_transaction { + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->dbconnect_noauto($myconfig); + + my %audittrail = ( tablename => 'gl', + reference => $form->{reference}, + formname => 'transaction', + action => 'deleted', + id => $form->{id} ); + + $form->audittrail($dbh, "", \%audittrail); + + my $query = qq|DELETE FROM gl 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); + + # commit and redirect + my $rc = $dbh->commit; + $dbh->disconnect; + + $rc; +} + + +sub post_transaction { + + my ($self, $myconfig, $form) = @_; + + my $null; + my $project_id; + my $department_id; + my $i; + + # connect to database, turn off AutoCommit + my $dbh = $form->dbconnect_noauto($myconfig); + + my $query; + my $sth; + + if ($form->{id}) { + + $query = qq|SELECT id FROM gl WHERE id = $form->{id}|; + ($form->{id}) = $dbh->selectrow_array($query); + + if ($form->{id}) { + # delete individual transactions + $query = qq|DELETE FROM acc_trans + WHERE trans_id = $form->{id}|; + + $dbh->do($query) || $form->dberror($query); + } + } + + if (! $form->{id}) { + + my $uid = localtime; + $uid .= "$$"; + + $query = qq|INSERT INTO gl (reference, employee_id) + VALUES ('$uid', (SELECT id FROM employee + WHERE login = '$form->{login}'))|; + + $dbh->do($query) || $form->dberror($query); + + $query = qq|SELECT id + FROM gl + WHERE reference = '$uid'|; + + ($form->{id}) = $dbh->selectrow_array($query); + } + + ($null, $department_id) = split /--/, $form->{department}; + $department_id *= 1; + + $form->{reference} = $form->update_defaults($myconfig, 'glnumber', $dbh) unless $form->{reference}; + $form->{reference} ||= $form->{id}; + + $query = qq|UPDATE gl + SET reference = |.$dbh->quote($form->{reference}).qq|, + description = |.$dbh->quote($form->{description}).qq|, + notes = |.$dbh->quote($form->{notes}).qq|, + transdate = '$form->{transdate}', + department_id = $department_id + WHERE id = $form->{id}|; + + $dbh->do($query) || $form->dberror($query); + + my $amount = 0; + my $posted = 0; + my $debit; + my $credit; + + # insert acc_trans transactions + for $i (1 .. $form->{rowcount}) { + + $debit = $form->parse_amount($myconfig, $form->{"debit_$i"}); + $credit = $form->parse_amount($myconfig, $form->{"credit_$i"}); + + # extract accno + ($accno) = split(/--/, $form->{"accno_$i"}); + + if ($credit) { + $amount = $credit; + $posted = 0; + } + + if ($debit) { + $amount = $debit * -1; + $posted = 0; + } + + # add the record + if (! $posted) { + + ($null, $project_id) = split /--/, $form->{"projectnumber_$i"}; + $project_id ||= 'NULL'; + + for (qw(fx_transaction cleared)) { $form->{"${_}_$i"} *= 1 } + + + $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, + transdate, source, project_id, + fx_transaction, memo, cleared) + VALUES ($form->{id}, (SELECT id + FROM chart + WHERE accno = '$accno'), + $amount, '$form->{transdate}', |. + $dbh->quote($form->{"source_$i"}) .qq|, + $project_id, '$form->{"fx_transaction_$i"}', |. + $dbh->quote($form->{"memo_$i"}).qq|, + '$form->{"cleared_$i"}')|; + + $dbh->do($query) || $form->dberror($query); + + $posted = 1; + } + } + + my %audittrail = ( tablename => 'gl', + reference => $form->{reference}, + formname => 'transaction', + action => 'posted', + id => $form->{id} ); + + $form->audittrail($dbh, "", \%audittrail); + + $form->save_recurring($dbh, $myconfig); + + # commit and redirect + my $rc = $dbh->commit; + $dbh->disconnect; + + $rc; +} + + + +sub all_transactions { + + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->dbconnect($myconfig); + my $query; + my $sth; + my $var; + my $null; + + my ($glwhere, $arwhere, $apwhere) = ("1 = 1", "1 = 1", "1 = 1"); + + if ($form->{reference} ne "") { + $var = $form->like(lc $form->{reference}); + $glwhere .= " AND lower(g.reference) LIKE '$var'"; + $arwhere .= " AND lower(a.invnumber) LIKE '$var'"; + $apwhere .= " AND lower(a.invnumber) LIKE '$var'"; + } + + if ($form->{department} ne "") { + ($null, $var) = split /--/, $form->{department}; + $glwhere .= " AND g.department_id = $var"; + $arwhere .= " AND a.department_id = $var"; + $apwhere .= " AND a.department_id = $var"; + } + + if ($form->{source} ne "") { + $var = $form->like(lc $form->{source}); + $glwhere .= " AND lower(ac.source) LIKE '$var'"; + $arwhere .= " AND lower(ac.source) LIKE '$var'"; + $apwhere .= " AND lower(ac.source) LIKE '$var'"; + } + + if ($form->{memo} ne "") { + $var = $form->like(lc $form->{memo}); + $glwhere .= " AND lower(ac.memo) LIKE '$var'"; + $arwhere .= " AND lower(ac.memo) LIKE '$var'"; + $apwhere .= " AND lower(ac.memo) LIKE '$var'"; + } + + ($form->{datefrom}, $form->{dateto}) = $form->from_to($form->{year}, $form->{month}, $form->{interval}) if $form->{year} && $form->{month}; + + if ($form->{datefrom}) { + $glwhere .= " AND ac.transdate >= '$form->{datefrom}'"; + $arwhere .= " AND ac.transdate >= '$form->{datefrom}'"; + $apwhere .= " AND ac.transdate >= '$form->{datefrom}'"; + } + + if ($form->{dateto}) { + $glwhere .= " AND ac.transdate <= '$form->{dateto}'"; + $arwhere .= " AND ac.transdate <= '$form->{dateto}'"; + $apwhere .= " AND ac.transdate <= '$form->{dateto}'"; + } + + if ($form->{amountfrom}) { + $glwhere .= " AND abs(ac.amount) >= $form->{amountfrom}"; + $arwhere .= " AND abs(ac.amount) >= $form->{amountfrom}"; + $apwhere .= " AND abs(ac.amount) >= $form->{amountfrom}"; + } + + if ($form->{amountto}) { + $glwhere .= " AND abs(ac.amount) <= $form->{amountto}"; + $arwhere .= " AND abs(ac.amount) <= $form->{amountto}"; + $apwhere .= " AND abs(ac.amount) <= $form->{amountto}"; + } + + if ($form->{description}) { + + $var = $form->like(lc $form->{description}); + $glwhere .= " AND lower(g.description) LIKE '$var'"; + $arwhere .= " AND (lower(ct.name) LIKE '$var' + OR lower(ac.memo) LIKE '$var' + OR a.id IN (SELECT DISTINCT trans_id + FROM invoice + WHERE lower(description) LIKE '$var'))"; + + $apwhere .= " AND (lower(ct.name) LIKE '$var' + OR lower(ac.memo) LIKE '$var' + OR a.id IN (SELECT DISTINCT trans_id + FROM invoice + WHERE lower(description) LIKE '$var'))"; + } + + if ($form->{notes}) { + $var = $form->like(lc $form->{notes}); + $glwhere .= " AND lower(g.notes) LIKE '$var'"; + $arwhere .= " AND lower(a.notes) LIKE '$var'"; + $apwhere .= " AND lower(a.notes) LIKE '$var'"; + } + + if ($form->{accno}) { + $glwhere .= " AND c.accno = '$form->{accno}'"; + $arwhere .= " AND c.accno = '$form->{accno}'"; + $apwhere .= " AND c.accno = '$form->{accno}'"; + } + + if ($form->{gifi_accno}) { + $glwhere .= " AND c.gifi_accno = '$form->{gifi_accno}'"; + $arwhere .= " AND c.gifi_accno = '$form->{gifi_accno}'"; + $apwhere .= " AND c.gifi_accno = '$form->{gifi_accno}'"; + } + + if ($form->{category} ne 'X') { + $glwhere .= " AND c.category = '$form->{category}'"; + $arwhere .= " AND c.category = '$form->{category}'"; + $apwhere .= " AND c.category = '$form->{category}'"; + } + + if ($form->{accno}) { + + # get category for account + $query = qq|SELECT category, link, contra, description + FROM chart + WHERE accno = '$form->{accno}'|; + + ($form->{category}, $form->{link}, $form->{contra}, + $form->{account_description}) = $dbh->selectrow_array($query); + + if ($form->{datefrom}) { + + $query = qq|SELECT SUM(ac.amount) + FROM acc_trans ac + JOIN chart c ON (ac.chart_id = c.id) + WHERE c.accno = '$form->{accno}' + AND ac.transdate < date '$form->{datefrom}' |; + + ($form->{balance}) = $dbh->selectrow_array($query); + } + } + + if ($form->{gifi_accno}) { + + # get category for account + $query = qq|SELECT c.category, c.link, c.contra, g.description + FROM chart c + LEFT JOIN gifi g ON (g.accno = c.gifi_accno) + WHERE c.gifi_accno = '$form->{gifi_accno}'|; + + ($form->{category}, $form->{link}, $form->{contra}, + $form->{gifi_account_description}) = $dbh->selectrow_array($query); + + if ($form->{datefrom}) { + + $query = qq|SELECT SUM(ac.amount) + FROM acc_trans ac + JOIN chart c ON (ac.chart_id = c.id) + WHERE c.gifi_accno = '$form->{gifi_accno}' + AND ac.transdate < date '$form->{datefrom}' |; + + ($form->{balance}) = $dbh->selectrow_array($query); + } + } + + my $false = ($myconfig->{dbdriver} =~ /Pg/) ? FALSE : q|'0'|; + + my %ordinal = ( id => 1, + reference => 4, + description => 5, + transdate => 6, + source => 7, + accno => 9, + department => 15, + memo => 16 ); + + my @a = (id, transdate, reference, source, description, accno); + my $sortorder = $form->sort_order(\@a, \%ordinal); + + my $query = qq|SELECT g.id, 'gl' AS type, $false AS invoice, g.reference, + g.description, ac.transdate, ac.source, + ac.amount, c.accno, c.gifi_accno, g.notes, c.link, + '' AS till, ac.cleared, d.description AS department, + ac.memo + FROM gl AS g + JOIN acc_trans ac ON (g.id = ac.trans_id) + JOIN chart c ON (ac.chart_id = c.id) + LEFT JOIN department d ON (d.id = g.department_id) + WHERE $glwhere + + UNION ALL + + SELECT a.id, 'ar' AS type, a.invoice, a.invnumber, + ct.name, ac.transdate, ac.source, + ac.amount, c.accno, c.gifi_accno, a.notes, c.link, + a.till, ac.cleared, d.description AS department, + ac.memo + FROM ar a + JOIN acc_trans ac ON (a.id = ac.trans_id) + JOIN chart c ON (ac.chart_id = c.id) + JOIN customer ct ON (a.customer_id = ct.id) + LEFT JOIN department d ON (d.id = a.department_id) + WHERE $arwhere + + UNION ALL + + SELECT a.id, 'ap' AS type, a.invoice, a.invnumber, + ct.name, ac.transdate, ac.source, + ac.amount, c.accno, c.gifi_accno, a.notes, c.link, + a.till, ac.cleared, d.description AS department, + ac.memo + FROM ap a + JOIN acc_trans ac ON (a.id = ac.trans_id) + JOIN chart c ON (ac.chart_id = c.id) + JOIN vendor ct ON (a.vendor_id = ct.id) + LEFT JOIN department d ON (d.id = a.department_id) + WHERE $apwhere + ORDER BY $sortorder|; + + my $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { + + # gl + if ($ref->{type} eq "gl") { + $ref->{module} = "gl"; + } + + # ap + if ($ref->{type} eq "ap") { + + if ($ref->{invoice}) { + $ref->{module} = "ir"; + } else { + $ref->{module} = "ap"; + } + } + + # ar + if ($ref->{type} eq "ar") { + + if ($ref->{invoice}) { + $ref->{module} = ($ref->{till}) ? "ps" : "is"; + } else { + $ref->{module} = "ar"; + } + } + + if ($ref->{amount} < 0) { + $ref->{debit} = $ref->{amount} * -1; + $ref->{credit} = 0; + } else { + $ref->{credit} = $ref->{amount}; + $ref->{debit} = 0; + } + + push @{ $form->{GL} }, $ref; + } + + $sth->finish; + $dbh->disconnect; +} + + +sub transaction { + + my ($self, $myconfig, $form) = @_; + + my ($query, $sth, $ref); + + # connect to database + my $dbh = $form->dbconnect($myconfig); + + if ($form->{id}) { + + $query = "SELECT closedto, revtrans + FROM defaults"; + + $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + ($form->{closedto}, $form->{revtrans}) = $sth->fetchrow_array; + $sth->finish; + + $query = qq|SELECT g.*, d.description AS department + FROM gl g + LEFT JOIN department d ON (d.id = g.department_id) + WHERE g.id = $form->{id}|; + + $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + $ref = $sth->fetchrow_hashref(NAME_lc); + for (keys %$ref) { $form->{$_} = $ref->{$_} } + $sth->finish; + + # retrieve individual rows + $query = qq|SELECT ac.*, c.accno, c.description, p.projectnumber + FROM acc_trans ac + JOIN chart c ON (ac.chart_id = c.id) + LEFT JOIN project p ON (p.id = ac.project_id) + WHERE ac.trans_id = $form->{id} + ORDER BY accno|; + + $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + while ($ref = $sth->fetchrow_hashref(NAME_lc)) { + + if ($ref->{fx_transaction}) { + $form->{transfer} = 1; + } + push @{ $form->{GL} }, $ref; + } + + # get recurring transaction + $form->get_recurring($dbh); + + } else { + $query = "SELECT current_date AS transdate, closedto, revtrans + FROM defaults"; + + $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + ($form->{transdate}, $form->{closedto}, $form->{revtrans}) = $sth->fetchrow_array; + } + + $sth->finish; + + # get chart of accounts + $query = qq|SELECT accno,description + FROM chart + WHERE charttype = 'A' + ORDER BY accno|; + + $sth = $dbh->prepare($query); + $sth->execute || $form->dberror($query); + + while ($ref = $sth->fetchrow_hashref(NAME_lc)) { + push @{ $form->{all_accno} }, $ref; + } + + $sth->finish; + + # get departments + $form->all_departments($myconfig, $dbh); + + # get projects + $form->all_projects($myconfig, $dbh, $form->{transdate}); + + $dbh->disconnect; + +} + +1; |