#===================================================================== # SQL-Ledger Accounting # Copyright (C) 2000 # # Author: Dieter Simader # Email: dsimader@sql-ledger.org # Web: http://www.sql-ledger.org # # Contributors: Jim Rawlings # # This program 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 2 of the License, or # (at your option) any later version. # # This program 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 this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #====================================================================== # # Administration module # Chart of Accounts # template routines # preferences # #====================================================================== package AM; sub get_account { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT accno, description, charttype, gifi_accno, category, link FROM chart WHERE id = $form->{id}|; my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); my $ref = $sth->fetchrow_hashref(NAME_lc); foreach my $key (keys %$ref) { $form->{"$key"} = $ref->{"$key"}; } # get default accounts $query = qq|SELECT inventory_accno_id, income_accno_id, expense_accno_id FROM defaults|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); $ref = $sth->fetchrow_hashref(NAME_lc); map { $form->{$_} = $ref->{$_} } keys %ref; $sth->finish; # check if we have any transactions $query = qq|SELECT trans_id FROM acc_trans WHERE chart_id = $form->{id}|; ($form->{orphaned}) = $dbh->selectrow_array($query); $form->{orphaned} = !$form->{orphaned}; $dbh->disconnect; } sub save_account { my ($self, $myconfig, $form) = @_; # connect to database, turn off AutoCommit my $dbh = $form->dbconnect_noauto($myconfig); $form->{link} = ""; foreach my $item ($form->{AR}, $form->{AR_amount}, $form->{AR_tax}, $form->{AR_paid}, $form->{AP}, $form->{AP_amount}, $form->{AP_tax}, $form->{AP_paid}, $form->{IC}, $form->{IC_sale}, $form->{IC_cogs}, $form->{IC_taxpart}, $form->{IC_income}, $form->{IC_expense}, $form->{IC_taxservice}, $form->{CT_tax} ) { $form->{link} .= "${item}:" if ($item); } chop $form->{link}; # strip blanks from accno map { $form->{$_} =~ s/( |')//g } qw(accno gifi_accno); foreach my $item (qw(accno gifi_accno description)) { $form->{$item} =~ s/-(-+)/-/g; $form->{$item} =~ s/ ( )+/ /g; } my $query; my $sth; # if we have an id then replace the old record if ($form->{id}) { $query = qq|UPDATE chart SET accno = '$form->{accno}', description = |.$dbh->quote($form->{description}).qq|, charttype = '$form->{charttype}', gifi_accno = '$form->{gifi_accno}', category = '$form->{category}', link = '$form->{link}' WHERE id = $form->{id}|; } else { $query = qq|INSERT INTO chart (accno, description, charttype, gifi_accno, category, link) VALUES ('$form->{accno}',| .$dbh->quote($form->{description}).qq|, '$form->{charttype}', '$form->{gifi_accno}', '$form->{category}', '$form->{link}')|; } $dbh->do($query) || $form->dberror($query); $chart_id = $form->{id}; if (! $form->{id}) { # get id from chart $query = qq|SELECT id FROM chart WHERE accno = '$form->{accno}'|; ($chart_id) = $dbh->selectrow_array($query); } if ($form->{IC_taxpart} || $form->{IC_taxservice} || $form->{CT_tax}) { # add account if it doesn't exist in tax $query = qq|SELECT chart_id FROM tax WHERE chart_id = $chart_id|; my ($tax_id) = $dbh->selectrow_array($query); # add tax if it doesn't exist unless ($tax_id) { $query = qq|INSERT INTO tax (chart_id, rate) VALUES ($chart_id, 0)|; $dbh->do($query) || $form->dberror($query); } } else { # remove tax if ($form->{id}) { $query = qq|DELETE FROM tax WHERE chart_id = $form->{id}|; $dbh->do($query) || $form->dberror($query); } } # commit my $rc = $dbh->commit; $dbh->disconnect; $rc; } sub delete_account { my ($self, $myconfig, $form) = @_; # connect to database, turn off AutoCommit my $dbh = $form->dbconnect_noauto($myconfig); my $query = qq|SELECT * FROM acc_trans WHERE chart_id = $form->{id}|; if ($dbh->selectrow_array($query)) { $dbh->disconnect; return; } # delete chart of account record $query = qq|DELETE FROM chart WHERE id = $form->{id}|; $dbh->do($query) || $form->dberror($query); # set inventory_accno_id, income_accno_id, expense_accno_id to defaults $query = qq|UPDATE parts SET inventory_accno_id = (SELECT inventory_accno_id FROM defaults) WHERE inventory_accno_id = $form->{id}|; $dbh->do($query) || $form->dberror($query); $query = qq|UPDATE parts SET income_accno_id = (SELECT income_accno_id FROM defaults) WHERE income_accno_id = $form->{id}|; $dbh->do($query) || $form->dberror($query); $query = qq|UPDATE parts SET expense_accno_id = (SELECT expense_accno_id FROM defaults) WHERE expense_accno_id = $form->{id}|; $dbh->do($query) || $form->dberror($query); foreach my $table (qw(partstax customertax vendortax tax)) { $query = qq|DELETE FROM $table WHERE chart_id = $form->{id}|; $dbh->do($query) || $form->dberror($query); } # commit and redirect my $rc = $dbh->commit; $dbh->disconnect; $rc; } sub gifi_accounts { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT accno, description FROM gifi ORDER BY accno|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { push @{ $form->{ALL} }, $ref; } $dbh->disconnect; } sub get_gifi { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT accno, description FROM gifi WHERE accno = '$form->{accno}'|; ($form->{accno}, $form->{description}) = $dbh->selectrow_array($query); # check for transactions $query = qq|SELECT * FROM acc_trans a JOIN chart c ON (a.chart_id = c.id) JOIN gifi g ON (c.gifi_accno = g.accno) WHERE g.accno = '$form->{accno}'|; ($form->{orphaned}) = $dbh->selectrow_array($query); $form->{orphaned} = !$form->{orphaned}; $dbh->disconnect; } sub save_gifi { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->{accno} =~ s/( |')//g; foreach my $item (qw(accno description)) { $form->{$item} =~ s/-(-+)/-/g; $form->{$item} =~ s/ ( )+/ /g; } # id is the old account number! if ($form->{id}) { $query = qq|UPDATE gifi SET accno = '$form->{accno}', description = |.$dbh->quote($form->{description}).qq| WHERE accno = '$form->{id}'|; } else { $query = qq|INSERT INTO gifi (accno, description) VALUES ('$form->{accno}',| .$dbh->quote($form->{description}).qq|)|; } $dbh->do($query) || $form->dberror; $dbh->disconnect; } sub delete_gifi { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); # id is the old account number! $query = qq|DELETE FROM gifi WHERE accno = '$form->{id}'|; $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub warehouses { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->sort_order(); my $query = qq|SELECT id, description FROM warehouse ORDER BY 2 $form->{direction}|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { push @{ $form->{ALL} }, $ref; } $dbh->disconnect; } sub get_warehouse { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT description FROM warehouse WHERE id = $form->{id}|; ($form->{description}) = $dbh->selectrow_array($query); # see if it is in use $query = qq|SELECT * FROM inventory WHERE warehouse_id = $form->{id}|; ($form->{orphaned}) = $dbh->selectrow_array($query); $form->{orphaned} = !$form->{orphaned}; $dbh->disconnect; } sub save_warehouse { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->{description} =~ s/-(-)+/-/g; $form->{description} =~ s/ ( )+/ /g; if ($form->{id}) { $query = qq|UPDATE warehouse SET description = |.$dbh->quote($form->{description}).qq| WHERE id = $form->{id}|; } else { $query = qq|INSERT INTO warehouse (description) VALUES (|.$dbh->quote($form->{description}).qq|)|; } $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub delete_warehouse { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $query = qq|DELETE FROM warehouse WHERE id = $form->{id}|; $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub departments { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->sort_order(); my $query = qq|SELECT id, description, role FROM department ORDER BY 2 $form->{direction}|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { push @{ $form->{ALL} }, $ref; } $dbh->disconnect; } sub get_department { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT description, role FROM department WHERE id = $form->{id}|; ($form->{description}, $form->{role}) = $dbh->selectrow_array($query); map { $form->{$_} = $ref->{$_} } keys %$ref; # see if it is in use $query = qq|SELECT * FROM dpt_trans WHERE department_id = $form->{id}|; ($form->{orphaned}) = $dbh->selectrow_array($query); $form->{orphaned} = !$form->{orphaned}; $dbh->disconnect; } sub save_department { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->{description} =~ s/-(-)+/-/g; $form->{description} =~ s/ ( )+/ /g; if ($form->{id}) { $query = qq|UPDATE department SET description = |.$dbh->quote($form->{description}).qq|, role = '$form->{role}' WHERE id = $form->{id}|; } else { $query = qq|INSERT INTO department (description, role) VALUES (| .$dbh->quote($form->{description}).qq|, '$form->{role}')|; } $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub delete_department { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $query = qq|DELETE FROM department WHERE id = $form->{id}|; $dbh->do($query); $dbh->disconnect; } sub business { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->sort_order(); my $query = qq|SELECT id, description, discount FROM business ORDER BY 2 $form->{direction}|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { push @{ $form->{ALL} }, $ref; } $dbh->disconnect; } sub get_business { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT description, discount FROM business WHERE id = $form->{id}|; ($form->{description}, $form->{discount}) = $dbh->selectrow_array($query); $dbh->disconnect; } sub save_business { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->{description} =~ s/-(-)+/-/g; $form->{description} =~ s/ ( )+/ /g; $form->{discount} /= 100; if ($form->{id}) { $query = qq|UPDATE business SET description = |.$dbh->quote($form->{description}).qq|, discount = $form->{discount} WHERE id = $form->{id}|; } else { $query = qq|INSERT INTO business (description, discount) VALUES (| .$dbh->quote($form->{description}).qq|, $form->{discount})|; } $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub delete_business { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $query = qq|DELETE FROM business WHERE id = $form->{id}|; $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub sic { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->{sort} = "code" unless $form->{sort}; my @a = qw(code description); my %ordinal = ( code => 1, description => 3 ); my $sortorder = $form->sort_order(\@a, \%ordinal); my $query = qq|SELECT code, sictype, description FROM sic ORDER BY $sortorder|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { push @{ $form->{ALL} }, $ref; } $dbh->disconnect; } sub get_sic { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT code, sictype, description FROM sic WHERE code = |.$dbh->quote($form->{code}); my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); my $ref = $sth->fetchrow_hashref(NAME_lc); map { $form->{$_} = $ref->{$_} } keys %$ref; $sth->finish; $dbh->disconnect; } sub save_sic { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); foreach my $item (qw(code description)) { $form->{$item} =~ s/-(-)+/-/g; } # if there is an id if ($form->{id}) { $query = qq|UPDATE sic SET code = |.$dbh->quote($form->{code}).qq|, sictype = '$form->{sictype}', description = |.$dbh->quote($form->{description}).qq| WHERE code = |.$dbh->quote($form->{id}); } else { $query = qq|INSERT INTO sic (code, sictype, description) VALUES (| .$dbh->quote($form->{code}).qq|, '$form->{sictype}',| .$dbh->quote($form->{description}).qq|)|; } $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub delete_sic { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $query = qq|DELETE FROM sic WHERE code = |.$dbh->quote($form->{code}); $dbh->do($query); $dbh->disconnect; } sub language { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->{sort} = "code" unless $form->{sort}; my @a = qw(code description); my %ordinal = ( code => 1, description => 2 ); my $sortorder = $form->sort_order(\@a, \%ordinal); my $query = qq|SELECT code, description FROM language ORDER BY $sortorder|; $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { push @{ $form->{ALL} }, $ref; } $dbh->disconnect; } sub get_language { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); my $query = qq|SELECT * FROM language WHERE code = |.$dbh->quote($form->{code}); my $sth = $dbh->prepare($query); $sth->execute || $form->dberror($query); my $ref = $sth->fetchrow_hashref(NAME_lc); map { $form->{$_} = $ref->{$_} } keys %$ref; $sth->finish; $dbh->disconnect; } sub save_language { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $form->{code} =~ s/ //g; foreach my $item (qw(code description)) { $form->{$item} =~ s/-(-)+/-/g; $form->{$item} =~ s/ ( )+/-/g; } # if there is an id if ($form->{id}) { $query = qq|UPDATE language SET code = |.$dbh->quote($form->{code}).qq|, description = |.$dbh->quote($form->{description}).qq| WHERE code = |.$dbh->quote($form->{id}); } else { $query = qq|INSERT INTO language (code, description) VALUES (| .$dbh->quote($form->{code}).qq|,| .$dbh->quote($form->{description}).qq|)|; } $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub delete_language { my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); $query = qq|DELETE FROM language WHERE code = |.$dbh->quote($form->{code}); $dbh->do($query) || $form->dberror($query); $dbh->disconnect; } sub load_template { my ($self, $form) = @_; open(TEMPLATE, "$form->{file}") or $form->error("$form->{file} : $!"); while (