diff options
Diffstat (limited to 'sql-ledger/SL')
| -rw-r--r-- | sql-ledger/SL/AM.pm | 694 | ||||
| -rw-r--r-- | sql-ledger/SL/AP.pm | 381 | ||||
| -rw-r--r-- | sql-ledger/SL/AR.pm | 381 | ||||
| -rw-r--r-- | sql-ledger/SL/CA.pm | 262 | ||||
| -rw-r--r-- | sql-ledger/SL/CP.pm | 308 | ||||
| -rw-r--r-- | sql-ledger/SL/CT.pm | 447 | ||||
| -rw-r--r-- | sql-ledger/SL/Form.pm | 1397 | ||||
| -rw-r--r-- | sql-ledger/SL/GL.pm | 462 | ||||
| -rw-r--r-- | sql-ledger/SL/IC.pm | 936 | ||||
| -rw-r--r-- | sql-ledger/SL/IR.pm | 995 | ||||
| -rw-r--r-- | sql-ledger/SL/IS.pm | 1231 | ||||
| -rw-r--r-- | sql-ledger/SL/Inifile.pm | 87 | ||||
| -rw-r--r-- | sql-ledger/SL/Mailer.pm | 147 | ||||
| -rw-r--r-- | sql-ledger/SL/Menu.pm | 117 | ||||
| -rw-r--r-- | sql-ledger/SL/Num2text.pm | 162 | ||||
| -rw-r--r-- | sql-ledger/SL/OE.pm | 674 | ||||
| -rw-r--r-- | sql-ledger/SL/PE.pm | 276 | ||||
| -rw-r--r-- | sql-ledger/SL/RC.pm | 186 | ||||
| -rw-r--r-- | sql-ledger/SL/RP.pm | 1310 | ||||
| -rw-r--r-- | sql-ledger/SL/User.pm | 692 | 
20 files changed, 0 insertions, 11145 deletions
| diff --git a/sql-ledger/SL/AM.pm b/sql-ledger/SL/AM.pm deleted file mode 100644 index d691b3ce6..000000000 --- a/sql-ledger/SL/AM.pm +++ /dev/null @@ -1,694 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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"}; -  } - -  $sth->finish; - - -  # 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; -  $dbh->disconnect; - -} - - -sub save_account { -  my ($self, $myconfig, $form) = @_; - -  # connect to database, turn off AutoCommit -  my $dbh = $form->dbconnect_noauto($myconfig); - -  # sanity check, can't have AR with AR_... -  if ($form->{AR} || $form->{AP} || $form->{IC}) { -    map { delete $form->{$_} } qw(AR_amount AR_tax AR_paid AP_amount AP_tax AP_paid IC_sale IC_cogs IC_taxpart IC_income IC_expense IC_taxservice); -  } -   -  $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}; - -  # if we have an id then replace the old record -  $form->{description} =~ s/'/''/g; - -  # strip blanks from accno -  map { $form->{$_} =~ s/ //g; } qw(accno gifi_accno); -   -  my ($query, $sth); -   -  if ($form->{id}) { -    $query = qq|UPDATE chart SET -                accno = '$form->{accno}', -		description = '$form->{description}', -		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}', '$form->{description}', -		'$form->{charttype}', '$form->{gifi_accno}', -		'$form->{category}', '$form->{link}')|; -  } -  $dbh->do($query) || $form->dberror($query); -   - -  if ($form->{IC_taxpart} || $form->{IC_taxservice} || $form->{CT_tax}) { - -    my $chart_id = $form->{id}; -     -    unless ($form->{id}) { -      # get id from chart -      $query = qq|SELECT id -                  FROM chart -		  WHERE accno = '$form->{accno}'|; -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      ($chart_id) = $sth->fetchrow_array; -      $sth->finish; -    } -     -    # add account if it doesn't exist in tax -    $query = qq|SELECT chart_id -                FROM tax -		WHERE chart_id = $chart_id|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    my ($tax_id) = $sth->fetchrow_array; -    $sth->finish; -     -    # 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); - -  # 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; -  } - -  $sth->finish; -  $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}'|; -  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_gifi { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  $form->{description} =~ s/'/''/g; -  $form->{accno} =~ s/ //g; - -  # id is the old account number! -  if ($form->{id}) { -    $query = qq|UPDATE gifi SET -                accno = '$form->{accno}', -		description = '$form->{description}' -		WHERE accno = '$form->{id}'|; -  } else { -    $query = qq|INSERT INTO gifi  -                (accno, description) -                VALUES ('$form->{accno}', '$form->{description}')|; -  } -  $dbh->do($query) || $form->dberror($query); -   -  $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 load_template { -  my ($self, $form) = @_; -   -  open(TEMPLATE, "$form->{file}") or $form->error("$form->{file} : $!"); - -  while (<TEMPLATE>) { -    $form->{body} .= $_; -  } - -  close(TEMPLATE); - -} - - -sub save_template { -  my ($self, $form) = @_; -   -  open(TEMPLATE, ">$form->{file}") or $form->error("$form->{file} : $!"); -   -  # strip 
 -  $form->{body} =~ s/\r\n/\n/g; -  print TEMPLATE $form->{body}; - -  close(TEMPLATE); - -} - - - -sub save_preferences { -  my ($self, $myconfig, $form, $memberfile, $userspath) = @_; - -  map { ($form->{$_}) = split /--/, $form->{$_} } qw(inventory_accno income_accno expense_accno fxgain_accno fxloss_accno); -   -  my @a; -  $form->{curr} =~ s/ //g; -  map { push(@a, uc pack "A3", $_) if $_ } split /:/, $form->{curr}; -  $form->{curr} = join ':', @a; -     -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); -   -  # these defaults are database wide -  # user specific variables are in myconfig -  # save defaults -  my $query = qq|UPDATE defaults SET -                 inventory_accno_id =  -		     (SELECT id FROM chart -		                WHERE accno = '$form->{inventory_accno}'), -                 income_accno_id = -		     (SELECT id FROM chart -		                WHERE accno = '$form->{income_accno}'), -	         expense_accno_id = -		     (SELECT id FROM chart -		                WHERE accno = '$form->{expense_accno}'), -	         fxgain_accno_id = -		     (SELECT id FROM chart -		                WHERE accno = '$form->{fxgain_accno}'), -	         fxloss_accno_id = -		     (SELECT id FROM chart -		                WHERE accno = '$form->{fxloss_accno}'), -	         invnumber = '$form->{invnumber}', -	         sonumber = '$form->{sonumber}', -	         ponumber = '$form->{ponumber}', -		 yearend = '$form->{yearend}', -		 curr = '$form->{curr}', -		 weightunit = '$form->{weightunit}', -		 businessnumber = '$form->{businessnumber}' -		|; -  $dbh->do($query) || $form->dberror($query); - -  # update name -  my $name = $form->{name}; -  $name =~ s/'/''/g; -  $query = qq|UPDATE employee -              SET name = '$name' -	      WHERE login = '$form->{login}'|; -  $dbh->do($query) || $form->dberror($query); -   -  foreach my $item (split / /, $form->{taxaccounts}) { -    $query = qq|UPDATE tax -		SET rate = |.($form->{$item} / 100).qq|, -		taxnumber = '$form->{"taxnumber_$item"}' -		WHERE chart_id = $item|; -    $dbh->do($query) || $form->dberror($query); -  } - -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  # save first currency in myconfig -  $form->{currency} = substr($form->{curr},0,3); -   -  my $myconfig = new User "$memberfile", "$form->{login}"; -   -  foreach my $item (keys %$form) { -    $myconfig->{$item} = $form->{$item}; -  } - -  $myconfig->save_member($memberfile, $userspath); - -  $rc; -   -} - - -sub defaultaccounts { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  # get defaults from defaults table -  my $query = qq|SELECT * FROM defaults|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -   -  $form->{defaults} = $sth->fetchrow_hashref(NAME_lc); -  $form->{defaults}{IC} = $form->{defaults}{inventory_accno_id}; -  $form->{defaults}{IC_income} = $form->{defaults}{income_accno_id}; -  $form->{defaults}{IC_expense} = $form->{defaults}{expense_accno_id}; -  $form->{defaults}{FX_gain} = $form->{defaults}{fxgain_accno_id}; -  $form->{defaults}{FX_loss} = $form->{defaults}{fxloss_accno_id}; -   -   -  $sth->finish; - - -  $query = qq|SELECT id, accno, description, link -              FROM chart -              WHERE link LIKE '%IC%' -              ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    foreach my $key (split(/:/, $ref->{link})) { -      if ($key =~ /IC/) { -	$nkey = $key; -	if ($key =~ /cogs/) { -	  $nkey = "IC_expense"; -	} -	if ($key =~ /sale/) { -	  $nkey = "IC_income"; -	} -        %{ $form->{IC}{$nkey}{$ref->{accno}} } = ( id => $ref->{id}, -                                        description => $ref->{description} ); -      } -    } -  } -  $sth->finish; - - -  $query = qq|SELECT id, accno, description -              FROM chart -	      WHERE category = 'I' -	      AND charttype = 'A' -              ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    %{ $form->{IC}{FX_gain}{$ref->{accno}} } = ( id => $ref->{id}, -                                      description => $ref->{description} ); -  } -  $sth->finish; - -  $query = qq|SELECT id, accno, description -              FROM chart -	      WHERE category = 'E' -	      AND charttype = 'A' -              ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    %{ $form->{IC}{FX_loss}{$ref->{accno}} } = ( id => $ref->{id}, -                                      description => $ref->{description} ); -  } -  $sth->finish; - - -  # now get the tax rates and numbers -  $query = qq|SELECT chart.id, chart.accno, chart.description, -              tax.rate * 100 AS rate, tax.taxnumber -              FROM chart, tax -	      WHERE chart.id = tax.chart_id|; - -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    $form->{taxrates}{$ref->{accno}}{id} = $ref->{id}; -    $form->{taxrates}{$ref->{accno}}{description} = $ref->{description}; -    $form->{taxrates}{$ref->{accno}}{taxnumber} = $ref->{taxnumber} if $ref->{taxnumber}; -    $form->{taxrates}{$ref->{accno}}{rate} = $ref->{rate} if $ref->{rate}; -  } - -  $sth->finish; -  $dbh->disconnect; -   -} - - -sub backup { -  my ($self, $myconfig, $form, $userspath) = @_; -   -  my ($tmpfile, $out, $mail); -   -  if ($form->{media} eq 'email') { - -    my $boundary = time; -    $tmpfile = "$userspath/$boundary.$myconfig->{dbname}-$form->{dbversion}.sql"; -    $out = $form->{OUT}; -    $form->{OUT} = ">$tmpfile"; -     -    use SL::Mailer; -    $mail = new Mailer; - -    $mail->{to} = qq|"$myconfig->{name}" <$myconfig->{email}>|; -    $mail->{from} = qq|"$myconfig->{name}" <$myconfig->{email}>|; -    $mail->{subject} = "SQL-Ledger Backup / $myconfig->{dbname}-$form->{dbversion}.sql"; -    @{ $mail->{attachments} } = ($tmpfile); -    $mail->{version} = $form->{version}; -    $mail->{fileid} = "$boundary."; - -    $myconfig->{signature} =~ s/\\n/\r\n/g; -    $mail->{message} = "--\n$myconfig->{signature}"; -     -  } -     -  if ($form->{OUT}) { -    open(OUT, "$form->{OUT}") or $form->error("$form->{OUT} : $!"); -  } else { -    open(OUT, ">-") or $form->error("STDOUT : $!"); -  } - -  if ($form->{media} eq 'file') { -    print OUT qq|Content-Type: Application/File; -Content-Disposition: filename="$myconfig->{dbname}-$form->{dbversion}.sql"\n\n|; -  } - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  # get all the tables -  my @tables = $dbh->tables; -   -  my $today = scalar localtime; -   - -  $myconfig->{dbhost} = 'localhost' unless $myconfig->{dbhost}; -   -  print OUT qq|-- SQL-Ledger Backup --- Dataset: $myconfig->{dbname} --- Version: $form->{dbversion} --- Host: $myconfig->{dbhost} --- Login: $form->{login} --- User: $myconfig->{name} --- Date: $today --- --- set options -$myconfig->{dboptions}; --- -|; - -  foreach $table (@tables) { -    my $query = qq|SELECT * FROM $table|; -     -    my $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $query = qq|INSERT INTO $table (|; -    map { $query .= qq|$sth->{NAME}->[$_],| } (0 .. $sth->{NUM_OF_FIELDS} - 1); -    chop $query; - -    $query .= qq|) VALUES|; -     -    print OUT qq|-- -DELETE FROM $table; -|; -    while (my @arr = $sth->fetchrow_array) { - -      $fields = "("; -      foreach my $item (@arr) { -	if (defined $item) { -	  $item =~ s/'/''/g; -	  $fields .= qq|'$item',|; -	} else { -	  $fields .= 'NULL,'; -	} -      } -	 -      chop $fields; -      $fields .= ")"; -	 -      print OUT qq|$query $fields;\n|; -    } -     -    $sth->finish; -  } - -  $query = qq|SELECT last_value FROM id|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my ($id) = $sth->fetchrow_array; -  $sth->finish; -   -  print OUT qq|-- -DROP SEQUENCE id; -CREATE SEQUENCE id START $id; -|; -   -  close(OUT); -   -  $dbh->disconnect; - -  if ($form->{media} eq 'email') { -    my $err = $mail->send($out); -    $_ = $tmpfile; -    unlink; -  } -     -} - - -sub closedto { -  my ($self, $myconfig, $form) = @_; - -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT closedto, revtrans FROM defaults|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($form->{closedto}, $form->{revtrans}) = $sth->fetchrow_array; -   -  $sth->finish; -   -  $dbh->disconnect; - -} - -  -sub closebooks { -  my ($self, $myconfig, $form) = @_; - -  my $dbh = $form->dbconnect($myconfig); - -  if ($form->{revtrans}) { -    -    $query = qq|UPDATE defaults SET closedto = NULL, -				    revtrans = '1'|; -  } else { -    if ($form->{closedto}) { -     -      $query = qq|UPDATE defaults SET closedto = '$form->{closedto}', -				      revtrans = '0'|; -    } else { -       -      $query = qq|UPDATE defaults SET closedto = NULL, -				      revtrans = '0'|; -    } -  } - -  # set close in defaults -  $dbh->do($query) || $form->dberror($query); -   -  $dbh->disconnect; -   -} - - -1; - diff --git a/sql-ledger/SL/AP.pm b/sql-ledger/SL/AP.pm deleted file mode 100644 index e1870f872..000000000 --- a/sql-ledger/SL/AP.pm +++ /dev/null @@ -1,381 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Accounts Payables database backend routines -# -#====================================================================== - - -package AP; - - -sub post_transaction { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); -   -  my ($null, $taxrate, $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}); - -  if ($form->{currency} eq $form->{defaultcurrency}) { -    $form->{exchangerate} = 1; -  } else { -    $exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, 'sell'); - -    $form->{exchangerate} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{exchangerate}); -  } -   -  # 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); -  } - -  # this is for ap -  $form->{amount} = $amount; -   -  # taxincluded doesn't make sense if there is no amount -  $form->{taxincluded} = 0 if ($form->{amount} == 0); - -  for my $item (split / /, $form->{taxaccounts}) { -    $form->{AP}{"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); -  } -  - -  # adjust paidaccounts if there is no date in the last row -  $form->{paidaccounts}-- unless ($form->{"datepaid_$form->{paidaccounts}"}); -   -  $form->{invpaid} = 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->{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}; -      $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}; -    # deduct difference from amount_1 -    $form->{amount_1} += $form->round_amount($diff, 2); -  } - -  $form->{netamount} = $form->{amount}; -   -  # 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); - -  # 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 { -    my $uid = time; -    $uid .= $form->{login}; - -    $query = qq|INSERT INTO ap (invnumber, employee_id) -                VALUES ('$uid', (SELECT id FROM employee -		                 WHERE login = '$form->{login}') )|; -    $dbh->do($query) || $form->dberror($query); -     -    $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; -    -  } - -  # escape ' -  $form->{notes} =~ s/'/''/g; -     -  $form->{datepaid} = $form->{transdate} unless ($form->{datepaid}); -  my $datepaid = ($form->{invpaid} != 0) ? qq|'$form->{datepaid}'| : 'NULL'; - -  $query = qq|UPDATE ap SET -	      invnumber = '$form->{invnumber}', -	      transdate = '$form->{transdate}', -	      ordnumber = '$form->{ordnumber}', -	      vendor_id = $form->{vendor_id}, -	      taxincluded = '$form->{taxincluded}', -	      amount = $form->{invtotal}, -	      duedate = '$form->{duedate}', -	      paid = $form->{invpaid}, -	      datepaid = $datepaid, -	      netamount = $form->{netamount}, -	      curr = '$form->{currency}', -	      notes = '$form->{notes}' -	      WHERE id = $form->{id} -	     |; -  $dbh->do($query) || $form->dberror($query); - - -  # update exchangerate -  if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -    $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, 0, $form->{exchangerate}); -  } - -  # add individual transactions -  foreach my $item (keys %{ $form->{AP} }) { -    if ($form->{$item} != 0) { -      $project_id = 'NULL'; -      if ($item =~ /amount_/) { -	if ($form->{"project_id_$'"} && $form->{"projectnumber_$'"}) {  -	  $project_id = $form->{"project_id_$'"}; -	} -      } - -      # insert detail records in acc_trans -      $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}'), -		  $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}; -  } -  -  # add paid transactions -  for my $i (1 .. $form->{paidaccounts}) { -    if ($form->{"paid_$i"} != 0) { - -      $exchangerate = 0; -      if ($form->{currency} eq $form->{defaultcurrency}) { -	$form->{"exchangerate_$i"} = 1; -      } else { -	$exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{"datepaid_$i"}, 'sell'); - -	$form->{"exchangerate_$i"} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{"exchangerate_$i"}); -      } -       -       -      # 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) { -	$form->{exchangerate} = $form->{"exchangerate_$i"}; -      } -       -      $amount = $form->round_amount($form->{"paid_$i"} * $form->{exchangerate} * -1, 2); -      if ($form->{payables}) { -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -		    transdate) -		    VALUES ($form->{id}, -		           (SELECT id FROM chart -			    WHERE accno = '$form->{AP}{payables}'), -		    $amount, '$form->{"datepaid_$i"}')|; -	$dbh->do($query) || $form->dberror($query); -      } -      $form->{payables} = $amount; - -      # add payment -      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -                  transdate, source) -                  VALUES ($form->{id}, -		         (SELECT id FROM chart -		          WHERE accno = '$form->{AP}{"paid_$i"}'), -		  $form->{"paid_$i"}, '$form->{"datepaid_$i"}', -		  '$form->{"source_$i"}')|; -      $dbh->do($query) || $form->dberror($query); -       -      # add exchange rate difference -      $amount = $form->round_amount($form->{"paid_$i"} * ($form->{"exchangerate_$i"} - 1), 2); -      if ($amount != 0) { -	$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"}'), -		    $amount, '$form->{"datepaid_$i"}', '1', '0')|; - -	$dbh->do($query) || $form->dberror($query); -      } - -      # exchangerate gain/loss -      $amount = $form->round_amount($form->{"paid_$i"} * ($form->{exchangerate} - $form->{"exchangerate_$i"}), 2); - -      if ($amount != 0) { -	$accno = ($amount > 0) ? $form->{fxgain_accno} : $form->{fxloss_accno}; -	$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'), -		    $amount, '$form->{"datepaid_$i"}', '1', '0')|; -	$dbh->do($query) || $form->dberror($query); -      } - -      # update exchange rate record -      if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -	$form->update_exchangerate($dbh, $form->{currency}, $form->{"datepaid_$i"}, 0, $form->{"exchangerate_$i"}); -      } -    } -  } -   -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - - - -sub delete_transaction { -  my ($self, $myconfig, $form) = @_; - -  # 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 $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); -   -  # commit and redirect -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; - -} - - - - -sub ap_transactions { -  my ($self, $myconfig, $form) = @_; - -  # 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 $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|; - -  if ($form->{vendor_id}) { -    $query .= " 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'"; -    } -  } -  if ($form->{invnumber}) { -    my $invnumber = $form->like(lc $form->{invnumber}); -    $query .= " AND lower(a.invnumber) LIKE '$invnumber'"; -  } -  if ($form->{ordnumber}) { -    my $ordnumber = $form->like(lc $form->{ordnumber}); -    $query .= " AND lower(a.ordnumber) LIKE '$ordnumber'"; -  } -  if ($form->{notes}) { -    my $notes = $form->like(lc $form->{notes}); -    $query .= " AND lower(a.notes) LIKE '$notes'"; -  } - -  $query .= " AND a.transdate >= '$form->{transdatefrom}'" if $form->{transdatefrom}; -  $query .= " 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}); -    } -  } - -  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"; - -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ap = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{AP} }, $ap; -  } -   -  $sth->finish; -  $dbh->disconnect; -   -} - - -1; - diff --git a/sql-ledger/SL/AR.pm b/sql-ledger/SL/AR.pm deleted file mode 100644 index 4ea3d82c3..000000000 --- a/sql-ledger/SL/AR.pm +++ /dev/null @@ -1,381 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Accounts Receivable module backend routines -# -#====================================================================== - -package AR; - - -sub post_transaction { -  my ($self, $myconfig, $form) = @_; - -  my ($null, $taxrate, $amount, $tax, $diff); -  my $exchangerate = 0; -  my $i; - -  # split and store id numbers in link accounts -  map { ($form->{AR}{"amount_$_"}) = split(/--/, $form->{"AR_amount_$_"}) } (1 .. $form->{rowcount}); -  ($form->{AR}{receivables}) = split(/--/, $form->{AR}); - -  if ($form->{currency} eq $form->{defaultcurrency}) { -    $form->{exchangerate} = 1; -  } else { -    $exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, 'buy'); -  } -   -  $form->{exchangerate} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{exchangerate});  - -  for $i (1 .. $form->{rowcount}) { -    $form->{"amount_$i"} = $form->round_amount($form->parse_amount($myconfig, $form->{"amount_$i"}) * $form->{exchangerate}, 2); -    $amount += $form->{"amount_$i"}; -  } -   -  # this is for ar -  $form->{amount} = $amount; - -  # taxincluded doesn't make sense if there is no amount -  $form->{taxincluded} = 0 if ($form->{amount} == 0); - -  foreach my $item (split / /, $form->{taxaccounts}) { -    $form->{AR}{"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); -    $form->{total_tax} += $form->{"tax_$item"}; - -  } - -  # adjust paidaccounts if there is no date in the last row -  $form->{paidaccounts}-- unless ($form->{"datepaid_$form->{paidaccounts}"}); - -  $form->{invpaid} = 0; -  # add payments -  for $i (1 .. $form->{paidaccounts}) { -    $form->{"paid_$i"} = $form->round_amount($form->parse_amount($myconfig, $form->{"paid_$i"}), 2); -     -    $form->{invpaid} += $form->{"paid_$i"}; -    $form->{datepaid} = $form->{"datepaid_$i"}; - -    # reverse payment -    $form->{"paid_$i"} *= -1; - -  } -   -  $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}; -      $amount = $form->{"amount_$i"} - $tax; -      $form->{"amount_$i"} = $form->round_amount($amount, 2); -      $diff += $amount - $form->{"amount_$i"}; -    } -     -    $form->{amount} -= $form->{total_tax}; -    # deduct difference from amount_1 -    $form->{amount_1} += $form->round_amount($diff, 2); -  } - -  # store invoice total, this goes into ar table -  $form->{invtotal} = $form->{amount} + $form->{total_tax}; -   -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my ($query, $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 { -    my $uid = time; -    $uid .= $form->{login}; - -    $query = qq|INSERT INTO ar (invnumber, employee_id) -                VALUES ('$uid', (SELECT id FROM employee -		                 WHERE login = '$form->{login}') )|; -    $dbh->do($query) || $form->dberror($query); -     -    $query = qq|SELECT id FROM ar -                WHERE invnumber = '$uid'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{id}) = $sth->fetchrow_array; -    $sth->finish; - -  } - -  # escape ' -  $form->{notes} =~ s/'/''/g; - -  # record last payment date in ar table -  $form->{datepaid} = $form->{transdate} unless $form->{datepaid}; -  my $datepaid = ($form->{invpaid} != 0) ? qq|'$form->{datepaid}'| : 'NULL'; -   -  $query = qq|UPDATE ar set -	      invnumber = '$form->{invnumber}', -	      ordnumber = '$form->{ordnumber}', -	      transdate = '$form->{transdate}', -	      customer_id = $form->{customer_id}, -	      taxincluded = '$form->{taxincluded}', -	      amount = $form->{invtotal}, -	      duedate = '$form->{duedate}', -	      paid = $form->{invpaid}, -	      datepaid = $datepaid, -	      netamount = $form->{amount}, -	      curr = '$form->{currency}', -	      notes = '$form->{notes}' -	      WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -   -  # amount for AR account -  $form->{receivables} = $form->round_amount($form->{invtotal} * -1, 2); -   - -  # update exchangerate -  if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -    $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, $form->{exchangerate}, 0); -  } -   -  # add individual transactions for AR, amount and taxes -  foreach my $item (keys %{ $form->{AR} }) { -    if ($form->{$item} != 0) { -      $project_id = 'NULL'; -      if ($item =~ /amount_/) { -	if ($form->{"project_id_$'"} && $form->{"projectnumber_$'"}) { -	  $project_id = $form->{"project_id_$'"}; -	} -      } -       -      # insert detail records in acc_trans -      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, -                                         project_id) -		  VALUES ($form->{id}, (SELECT id FROM chart -		                        WHERE accno = '$form->{AR}{$item}'), -		  $form->{$item}, '$form->{transdate}', $project_id)|; -      $dbh->do($query) || $form->dberror($query); -    } -  } - -  # if there is no amount but a payment record a receivables -  if ($form->{amount} == 0 && $form->{invtotal} == 0) { -    $form->{receivables} = $form->{invpaid} * -1; -  } -   -  # add paid transactions -  for my $i (1 .. $form->{paidaccounts}) { -    if ($form->{"paid_$i"} != 0) { -       -       ($form->{AR}{"paid_$i"}) = split(/--/, $form->{"AR_paid_$i"}); -      $form->{"datepaid_$i"} = $form->{transdate} unless ($form->{"datepaid_$i"}); -      -      $exchangerate = 0; -      if ($form->{currency} eq $form->{defaultcurrency}) { -	$form->{"exchangerate_$i"} = 1; -      } else { -	$exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{"datepaid_$i"}, 'buy'); -	 -	$form->{"exchangerate_$i"} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{"exchangerate_$i"});  -      } -       - -      # if there is no amount and invtotal is zero there is no exchangerate -      if ($form->{amount} == 0 && $form->{invtotal} == 0) { -	$form->{exchangerate} = $form->{"exchangerate_$i"}; -      } -       -      # receivables amount -      $amount = $form->round_amount($form->{"paid_$i"} * $form->{exchangerate} * -1, 2); -       -      if ($form->{receivables} != 0) { -	# add receivable -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -		    transdate) -		    VALUES ($form->{id}, -		           (SELECT id FROM chart -			    WHERE accno = '$form->{AR}{receivables}'), -		    $amount, '$form->{"datepaid_$i"}')|; -	$dbh->do($query) || $form->dberror($query); -      } -      $form->{receivables} = $amount; -       -      # add payment -      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -		  transdate, source) -		  VALUES ($form->{id}, -		         (SELECT id FROM chart -			  WHERE accno = '$form->{AR}{"paid_$i"}'), -		  $form->{"paid_$i"}, '$form->{"datepaid_$i"}', -		  '$form->{"source_$i"}')|; -      $dbh->do($query) || $form->dberror($query); -       -       -      # exchangerate difference for payment -      $amount = $form->round_amount($form->{"paid_$i"} * ($form->{"exchangerate_$i"} - 1), 2); -	 -      if ($amount != 0) { -	$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->{AR}{"paid_$i"}'), -		    $amount, '$form->{"datepaid_$i"}', '1', '0')|; -	$dbh->do($query) || $form->dberror($query); -      } -	 -      # exchangerate gain/loss -      $amount = $form->round_amount($form->{"paid_$i"} * ($form->{exchangerate} - $form->{"exchangerate_$i"}), 2); -       -      if ($amount != 0) { -	$accno = ($amount > 0) ? $form->{fxgain_accno} : $form->{fxloss_accno}; -	$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'), -		    $amount, '$form->{"datepaid_$i"}', '1', '0')|; -	$dbh->do($query) || $form->dberror($query); -      } -       -      # update exchangerate record -      if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -	$form->update_exchangerate($dbh, $form->{currency}, $form->{"datepaid_$i"}, $form->{"exchangerate_$i"}, 0); -      } -    } -  } - - -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - - -sub delete_transaction { -  my ($self, $myconfig, $form) = @_; - -  # connect to database, turn AutoCommit off -  my $dbh = $form->dbconnect_noauto($myconfig); - -  # check for other foreign currency transactions -  $form->delete_exchangerate($dbh) if ($form->{currency} ne $form->{defaultcurrency}); - -  my $query = qq|DELETE FROM ar 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 -  my $rc = $dbh->commit; -  $dbh->disconnect; -   -  $rc; - -} - - - -sub ar_transactions { -  my ($self, $myconfig, $form) = @_; - -  # 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 $query = qq|SELECT a.id, a.invnumber, a.ordnumber, a.transdate, -                 a.duedate, a.netamount, a.amount, a.paid, c.name, -		 a.invoice, a.datepaid, a.terms, a.notes, a.shippingpoint -		  -		 $incemp -		  -	         FROM ar a, customer c -	         WHERE a.customer_id = c.id|; -   -  if ($form->{customer_id}) { -    $query .= " AND a.customer_id = $form->{customer_id}"; -  } else { -    if ($form->{customer}) { -      my $customer = $form->like(lc $form->{customer}); -      $query .= " AND lower(c.name) LIKE '$customer'"; -    } -  } -  if ($form->{invnumber}) { -    my $invnumber = $form->like(lc $form->{invnumber}); -    $query .= " AND lower(a.invnumber) LIKE '$invnumber'"; -  } -  if ($form->{ordnumber}) { -    my $ordnumber = $form->like(lc $form->{ordnumber}); -    $query .= " AND lower(a.ordnumber) LIKE '$ordnumber'"; -  } -  if ($form->{notes}) { -    my $notes = $form->like(lc $form->{notes}); -    $query .= " AND lower(a.notes) LIKE '$notes'"; -  } -   -  $query .= " AND a.transdate >= '$form->{transdatefrom}'" if $form->{transdatefrom}; -  $query .= " 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}); -    } -  } - -  my @a = (transdate, invnumber, name); -  push @a, "employee" if $form->{l_employee}; -  my $sortorder = join ', ', $form->sort_columns(@a); -  $sortorder = $form->{sort} unless $sortorder; -   -  $query .= " ORDER by $sortorder"; -   -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ar = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{AR} }, $ar; -  } -   -  $sth->finish; -  $dbh->disconnect; - -} - - -1; - diff --git a/sql-ledger/SL/CA.pm b/sql-ledger/SL/CA.pm deleted file mode 100644 index b71749d7c..000000000 --- a/sql-ledger/SL/CA.pm +++ /dev/null @@ -1,262 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# chart of accounts -# -# CHANGE LOG: -#   DS. 2000-07-04  Created -# -#====================================================================== - - -package CA; - - -sub all_accounts { -  my ($self, $myconfig, $form) = @_; - -  my $amount = (); -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT accno, -                 SUM(acc_trans.amount) AS amount -                 FROM chart, acc_trans -		 WHERE chart.id = acc_trans.chart_id -		 GROUP BY accno|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    $amount{$ref->{accno}} = $ref->{amount} -  } -  $sth->finish; -  -  $query = qq|SELECT accno, description -              FROM gifi|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $gifi = (); -  while (my ($accno, $description) = $sth->fetchrow_array) { -    $gifi{$accno} = $description; -  } -  $sth->finish; - -  $query = qq|SELECT c.id, c.accno, c.description, c.charttype, c.gifi_accno, -              c.category, c.link -              FROM chart c -	      ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -  -  while (my $ca = $sth->fetchrow_hashref(NAME_lc)) { -    $ca->{amount} = $amount{$ca->{accno}}; -    $ca->{gifi_description} = $gifi{$ca->{gifi_accno}}; -    if ($ca->{amount} < 0) { -      $ca->{debit} = $ca->{amount} * -1; -    } else { -      $ca->{credit} = $ca->{amount}; -    } -    push @{ $form->{CA} }, $ca; -  } - -  $sth->finish; -  $dbh->disconnect; - -} - - -sub all_transactions { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  # get chart_id -  my $query = qq|SELECT id FROM chart -                 WHERE accno = '$form->{accno}'|; -  if ($form->{accounttype} eq 'gifi') { -    $query = qq|SELECT id FROM chart -                WHERE gifi_accno = '$form->{gifi_accno}'|; -  } -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my @id = (); -  while (my ($id) = $sth->fetchrow_array) { -    push @id, $id; -  } - -  $sth->finish; - -  my $where = '1 = 1'; -  # build WHERE clause from dates if any -  if ($form->{fromdate}) { -    $where .= " AND ac.transdate >= '$form->{fromdate}'"; -  } -  if ($form->{todate}) { -    $where .= " AND ac.transdate <= '$form->{todate}'"; -  } - -  my $sortorder = join ', ', $form->sort_columns(qw(transdate reference description)); -  my $false = ($myconfig->{dbdriver} eq 'Pg') ? FALSE : q|'0'|; -   -  # Oracle workaround, use ordinal positions -  my %ordinal = ( transdate => 4, -		  reference => 2, -		  description => 3 ); -  map { $sortorder =~ s/$_/$ordinal{$_}/ } keys %ordinal; - -    -  if ($form->{accno}) { -    # get category for account -    $query = qq|SELECT category -                FROM chart -		WHERE accno = '$form->{accno}'|; -    $sth = $dbh->prepare($query); - -    $sth->execute || $form->dberror($query); -    ($form->{category}) = $sth->fetchrow_array; -    $sth->finish; -     -    if ($form->{fromdate}) { -      # get beginning balance -      $query = qq|SELECT SUM(ac.amount) -		  FROM acc_trans ac, chart c -		  WHERE ac.chart_id = c.id -		  AND c.accno = '$form->{accno}' -		  AND ac.transdate < date '$form->{fromdate}' -		  |; -      $sth = $dbh->prepare($query); - -      $sth->execute || $form->dberror($query); -      ($form->{balance}) = $sth->fetchrow_array; -      $sth->finish; -    } -  } -   -  if ($form->{accounttype} eq 'gifi' && $form->{gifi_accno}) { -    # get category for account -    $query = qq|SELECT category -                FROM chart -		WHERE gifi_accno = '$form->{gifi_accno}'|; -    $sth = $dbh->prepare($query); - -    $sth->execute || $form->dberror($query); -    ($form->{category}) = $sth->fetchrow_array; -    $sth->finish; -  -    if ($form->{fromdate}) { -      # get beginning balance -      $query = qq|SELECT SUM(ac.amount) -		  FROM acc_trans ac, chart c -		  WHERE ac.chart_id = c.id -		  AND c.gifi_accno = '$form->{gifi_accno}' -		  AND ac.transdate < date '$form->{fromdate}' -		  |; -      $sth = $dbh->prepare($query); - -      $sth->execute || $form->dberror($query); -      ($form->{balance}) = $sth->fetchrow_array; -      $sth->finish; -    } -  } -  -  $query = ""; -   -  foreach my $id (@id) { -     -    # get all transactions -    $query .= qq| -      SELECT g.id, g.reference, g.description, ac.transdate, -		$false AS invoice, -		ac.amount, 'gl' as charttype -		FROM gl g, acc_trans ac -		WHERE $where -		AND ac.chart_id = $id -		AND ac.trans_id = g.id -      UNION ALL -      SELECT a.id, a.invnumber, c.name, ac.transdate, -		a.invoice, -		ac.amount, 'ar' as charttype -		FROM ar a, acc_trans ac, customer c -		WHERE $where -		AND ac.chart_id = $id -		AND ac.trans_id = a.id -		AND a.customer_id = c.id -      UNION ALL -      SELECT a.id, a.invnumber, v.name, ac.transdate, -		a.invoice, -		ac.amount, 'ap' as charttype -		FROM ap a, acc_trans ac, vendor v -		WHERE $where -		AND ac.chart_id = $id -		AND ac.trans_id = a.id -		AND a.vendor_id = v.id -      UNION ALL|; -  } - -  $query =~ s/UNION ALL$//; -  $query .= qq| -      ORDER BY $sortorder|; - -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ca = $sth->fetchrow_hashref(NAME_lc)) { - -    # gl -    if ($ca->{charttype} eq "gl") { -      $ca->{module} = "gl"; -    } - -    # ap -    if ($ca->{charttype} eq "ap") { -      $ca->{module} = ($ca->{invoice}) ? 'ir' : 'ap'; -    } - -    # ar -    if ($ca->{charttype} eq "ar") { -      $ca->{module} = ($ca->{invoice}) ? 'is' : 'ar'; -    } - -    if ($ca->{amount} < 0) { -      $ca->{debit} = $ca->{amount} * -1; -      $ca->{credit} = 0; -    } else { -      $ca->{credit} = $ca->{amount}; -      $ca->{debit} = 0; -    } - -    push @{ $form->{CA} }, $ca; - -  } -  -  $sth->finish; -  $dbh->disconnect; - -} - -1; - diff --git a/sql-ledger/SL/CP.pm b/sql-ledger/SL/CP.pm deleted file mode 100644 index f84bd1594..000000000 --- a/sql-ledger/SL/CP.pm +++ /dev/null @@ -1,308 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2002 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Check and receipt printing payment module backend routines -# Number to text conversion routines are in -# locale/{countrycode}/Num2text -# -#====================================================================== - -package CP; - - -sub new { -  my ($type, $countrycode) = @_; - -  $self = {}; - -  if ($countrycode) { -    if (-f "locale/$countrycode/Num2text") { -      require "locale/$countrycode/Num2text"; -    } else { -      use SL::Num2text; -    } -  } else { -    use SL::Num2text; -  } - -  bless $self, $type; - -} - - -sub paymentaccounts { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  my $query = qq|SELECT accno, description -                 FROM chart -		 WHERE link LIKE '%$form->{arap}_paid%' -		 ORDER BY accno|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{PR} }, $ref; -  } -  $sth->finish; -   -  # get currencies and closedto -  $query = qq|SELECT curr, closedto -              FROM defaults|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -   -  ($form->{currencies}, $form->{closedto}) = $sth->fetchrow_array; -  $sth->finish; - -  $dbh->disconnect; - -} - - -sub get_openvc { -  my ($self, $myconfig, $form) = @_; - -  my $dbh = $form->dbconnect($myconfig); - -  my $arap = ($form->{vc} eq 'customer') ? 'ar' : 'ap'; -   -  my $query = qq|SELECT count(*) -                 FROM $form->{vc} ct, $arap a -		 WHERE a.$form->{vc}_id = ct.id -                 AND a.amount != a.paid|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -  my ($count) = $sth->fetchrow_array; -  $sth->finish; - -  # build selection list -  if ($count < $myconfig->{vclimit}) { -    $query = qq|SELECT DISTINCT ct.id, ct.name -                FROM $form->{vc} ct, $arap a -		WHERE a.$form->{vc}_id = ct.id -		AND a.amount != a.paid -		ORDER BY name|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -      push @{ $form->{"all_$form->{vc}"} }, $ref; -    } - -    $sth->finish; - -  } - -  $dbh->disconnect; - -} - - -sub get_openinvoices { -  my ($self, $myconfig, $form) = @_; - -  return unless $form->{"$form->{vc}_id"}; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $where = qq|WHERE $form->{vc}_id = $form->{"$form->{vc}_id"} -                 AND curr = '$form->{currency}' -	         AND NOT amount = paid|; -   -  if ($form->{transdatefrom}) { -    $where .= " AND transdate >= '$form->{transdatefrom}'"; -  } -  if ($form->{transdateto}) { -    $where .= " AND transdate <= '$form->{transdateto}'"; -  } -   -  my ($arap, $buysell); -  if ($form->{vc} eq 'customer') { -    $arap = "ar"; -    $buysell = "buy"; -  } else { -    $arap = "ap"; -    $buysell = "sell"; -  } -   -  my $query = qq|SELECT id, invnumber, transdate, amount, paid, curr -	         FROM $arap -		 $where -		 ORDER BY id|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    # if this is a foreign currency transaction get exchangerate -    $ref->{exchangerate} = $form->get_exchangerate($dbh, $ref->{curr}, $ref->{transdate}, $buysell) if ($form->{currency} ne $form->{defaultcurrency}); -    push @{ $form->{PR} }, $ref; -  } -   -  $sth->finish; -  $dbh->disconnect; - -} - - - -sub process_payment { -  my ($self, $myconfig, $form) = @_; -     -  # connect to database, turn AutoCommit off -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my ($paymentaccno) = split /--/, $form->{account}; -   -  # if currency ne defaultcurrency update exchangerate -  if ($form->{currency} ne $form->{defaultcurrency}) { -    $form->{exchangerate} = $form->parse_amount($myconfig, $form->{exchangerate}); - -    if ($form->{vc} eq 'customer') { -      $form->update_exchangerate($dbh, $form->{currency}, $form->{datepaid}, $form->{exchangerate}, 0); -    } else { -      $form->update_exchangerate($dbh, $form->{currency}, $form->{datepaid}, 0, $form->{exchangerate}); -    } -  } else { -    $form->{exchangerate} = 1; -  } - -  my $query = qq|SELECT fxgain_accno_id, fxloss_accno_id -                 FROM defaults|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my ($fxgain_accno_id, $fxloss_accno_id) = $sth->fetchrow_array; -  $sth->finish; - -  my ($ARAP, $arap, $buysell); -   -  if ($form->{vc} eq 'customer') { -    $ARAP = "AR"; -    $arap = "ar"; -    $buysell = "buy"; -  } else { -    $ARAP = "AP"; -    $arap = "ap"; -    $buysell = "sell"; -  } -   -  # go through line by line -  for my $i (1 .. $form->{rowcount}) { - -    if ($form->{"paid_$i"}) { - -      $form->{"paid_$i"} = $form->parse_amount($myconfig, $form->{"paid_$i"}); -       -      # get exchangerate for original  -      $query = qq|SELECT $buysell FROM exchangerate e, $arap a -		  WHERE e.curr = '$form->{currency}' -		  AND a.transdate = e.transdate -		  AND a.id = $form->{"id_$i"}|; -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      my ($exchangerate) = $sth->fetchrow_array; -      $sth->finish; - -      $exchangerate = 1 unless $exchangerate; - -      $query = qq|SELECT c.id FROM chart c, acc_trans a -                  WHERE a.chart_id = c.id -	  	  AND c.link = '$ARAP' -		  AND a.trans_id = $form->{"id_$i"}|; -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      my ($id) = $sth->fetchrow_array; -      $sth->finish; - -      my $amount = $form->round_amount($form->{"paid_$i"} * $exchangerate * -1, 2); -      $ml = ($ARAP eq 'AR') ? -1 : 1; -      # add AR/AP -      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, transdate, amount) -                  VALUES ($form->{"id_$i"}, $id, -		  '$form->{datepaid}', $amount * $ml)|; -      $dbh->do($query) || $form->dberror($query); -       -      # add payment -      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, transdate, amount, -                  source) -                  VALUES ($form->{"id_$i"}, -		         (SELECT id FROM chart -		          WHERE accno = '$paymentaccno'), -		  '$form->{datepaid}', $form->{"paid_$i"} * $ml, -		  '$form->{source}')|; -      $dbh->do($query) || $form->dberror($query); - -      # add exchangerate difference if currency ne defaultcurrency -      $amount = $form->round_amount($form->{"paid_$i"} * ($form->{exchangerate} - 1), 2); - -      if ($amount != 0) { -        # exchangerate difference -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, transdate, -		    amount, cleared, fx_transaction) -		    VALUES ($form->{"id_$i"}, -		           (SELECT id FROM chart -			    WHERE accno = '$paymentaccno'), -		  '$form->{datepaid}', $amount * $ml, '0', '1')|; -	$dbh->do($query) || $form->dberror($query); - -        # gain/loss -         -	$amount = $form->round_amount($form->{"paid_$i"} * ($exchangerate - $form->{exchangerate}) * $ml, 2); -	if ($amount != 0) { -	  my $accno_id = ($amount > 0) ? $fxgain_accno_id : $fxloss_accno_id; -	  $query = qq|INSERT INTO acc_trans (trans_id, chart_id, transdate, -		      amount, cleared, fx_transaction) -		      VALUES ($form->{"id_$i"}, $accno_id, -		      '$form->{datepaid}', $amount, '0', '1')|; -	  $dbh->do($query) || $form->dberror($query); -	} -      } - -      $form->{"paid_$i"} = $form->round_amount($form->{"paid_$i"} * $exchangerate, 2); - -      # update AR/AP transaction -      $query = qq|UPDATE $arap set -		  paid = paid + $form->{"paid_$i"}, -		  datepaid = '$form->{datepaid}' -		  WHERE id = $form->{"id_$i"}|; -      $dbh->do($query) || $form->dberror($query); -    } -  } -   -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; - -} - - -1; - diff --git a/sql-ledger/SL/CT.pm b/sql-ledger/SL/CT.pm deleted file mode 100644 index 7c42cb843..000000000 --- a/sql-ledger/SL/CT.pm +++ /dev/null @@ -1,447 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# backend code for customers and vendors -# -# CHANGE LOG: -#   DS. 2000-07-04  Created -# -#====================================================================== - -package CT; - - -sub get_tuple { -  my ($self, $myconfig, $form) = @_; - -  my $dbh = $form->dbconnect($myconfig); -  my $query = qq|SELECT * -                 FROM $form->{db} -                 WHERE id = $form->{id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -   -  my $ref = $sth->fetchrow_hashref(NAME_lc); -   -  map { $form->{$_} = $ref->{$_} } keys %$ref; - -  $sth->finish; - - -  # get ship to -  $query = qq|SELECT * -              FROM shipto -	      WHERE trans_id = $form->{id}|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  $ref = $sth->fetchrow_hashref(NAME_lc); - -  map { $form->{$_} = $ref->{$_} } keys %$ref; - -  $sth->finish; - - -  # get tax labels -  $query = qq|SELECT accno, description -              FROM chart, tax -	      WHERE link LIKE '%CT_tax%' -	      AND chart.id = tax.chart_id -	      ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    $form->{taxaccounts} .= "$ref->{accno} "; -    $form->{tax}{$ref->{accno}}{description} = $ref->{description}; -  } -  $sth->finish; -  chop $form->{taxaccounts}; - -  # get taxes for customer/vendor -  $query = qq|SELECT chart_id, accno -              FROM $form->{db}tax, chart -              WHERE chart_id = chart.id -              AND $form->{db}_id = $form->{id}|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    $form->{tax}{$ref->{accno}}{taxable} = 1; -  } -  $sth->finish; - -   -  $dbh->disconnect; - -} - - -sub taxaccounts { -  my ($self, $myconfig, $form) = @_; - -  my $dbh = $form->dbconnect($myconfig); - -  # get tax labels -  my $query = qq|SELECT accno, description -                 FROM chart, tax -		 WHERE link LIKE '%CT_tax%' -	         AND chart.id = tax.chart_id -		 ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $taxref = $sth->fetchrow_hashref(NAME_lc)) { -    $form->{taxaccounts} .= "$taxref->{accno} "; -    $form->{tax}{$taxref->{accno}}{description} = $taxref->{description}; -  } -  $sth->finish; -  chop $form->{taxaccounts}; - -  $dbh->disconnect; - -} - - -sub delete_customer { -  my ($self, $myconfig, $form) = @_; - -  # connect to database, turn AutoCommit off -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my $query = qq|SELECT id FROM ar -                 WHERE customer_id = $form->{id} -		 UNION -		 SELECT id FROM oe -		 WHERE customer_id = $form->{id}|; -  my $sth = $dbh->prepare($query) || $form->dberror($query); -  $sth->execute; - -  my ($rc) = $sth->fetchrow_array; -  $sth->finish; - -  if ($rc) { -    $dbh->disconnect; -    $rc = -1; -  } else { -     -    # delete customer -    $query = qq|DELETE FROM customer -                WHERE id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -    $query = qq|DELETE FROM shipto -                WHERE trans_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); -     -    $query = qq|DELETE FROM customertax -                WHERE customer_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -    # commit and redirect -    $rc = $dbh->commit; -    $dbh->disconnect; -     -  } - -  $rc; -   -} - - -sub save_customer { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  # escape ' -  map { $form->{$_} =~ s/'/''/g } qw(customernumber name addr1 addr2 addr3 addr4 contact notes); - -  # assign value discount, terms, creditlimit -  $form->{discount} /= 100; -  $form->{terms} *= 1; -  $form->{taxincluded} *= 1; -  $form->{creditlimit} = $form->parse_amount($myconfig, $form->{creditlimit}); -   -  my ($query, $sth); - -  if ($form->{id}) { -    $query = qq|DELETE FROM customertax -                WHERE customer_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -    $query = qq|DELETE FROM shipto -                WHERE trans_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); -  } else { -    my $uid = time; -    $uid .= $form->{login}; - -    $query = qq|INSERT INTO customer (name) -                VALUES ('$uid')|; -    $dbh->do($query) || $form->dberror($query); -     -    $query = qq|SELECT id FROM customer -                WHERE name = '$uid'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{id}) = $sth->fetchrow_array; -    $sth->finish; - -  } -		 -  $query = qq|UPDATE customer SET -              customernumber = '$form->{customernumber}', -	      name = '$form->{name}', -	      addr1 = '$form->{addr1}', -	      addr2 = '$form->{addr2}', -	      addr3 = '$form->{addr3}', -	      addr4 = '$form->{addr4}', -	      contact = '$form->{contact}', -	      phone = '$form->{phone}', -	      fax = '$form->{fax}', -	      email = '$form->{email}', -	      cc = '$form->{cc}', -	      bcc = '$form->{bcc}', -	      notes = '$form->{notes}', -	      discount = $form->{discount}, -	      creditlimit = $form->{creditlimit}, -	      terms = $form->{terms}, -	      taxincluded = '$form->{taxincluded}' -	      WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  # save taxes -  foreach $item (split / /, $form->{taxaccounts}) { -    if ($form->{"tax_$item"}) { -      $query = qq|INSERT INTO customertax (customer_id, chart_id) -		  VALUES ($form->{id}, (SELECT id -				        FROM chart -				        WHERE accno = '$item'))|; -      $dbh->do($query) || $form->dberror($query); -    } -  } -   -  # add shipto -  $form->add_shipto($dbh, $form->{id}); - -  $dbh->disconnect; - -} - - -sub save_vendor { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  # escape ' -  map { $form->{$_} =~ s/'/''/g } qw(vendornumber name addr1 addr2 addr3 addr4 contact notes); - -  $form->{terms} *= 1; -  $form->{taxincluded} *= 1; -   -  my $query; -   -  if ($form->{id}) { -    $query = qq|DELETE FROM vendortax -                WHERE vendor_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -    $query = qq|DELETE FROM shipto -                WHERE trans_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); -  } else { -    my $uid = time; -    $uid .= $form->{login}; -     -    $query = qq|INSERT INTO vendor (name) -                VALUES ('$uid')|; -    $dbh->do($query) || $form->dberror($query); -    -    $query = qq|SELECT id FROM vendor -                WHERE name = '$uid'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{id}) = $sth->fetchrow_array; -    $sth->finish; - -  } -    - -  $query = qq|UPDATE vendor SET -              vendornumber = '$form->{vendornumber}', -	      name = '$form->{name}', -	      addr1 = '$form->{addr1}', -	      addr2 = '$form->{addr2}', -	      addr3 = '$form->{addr3}', -	      addr4 = '$form->{addr4}', -	      contact = '$form->{contact}', -	      phone = '$form->{phone}', -	      fax = '$form->{fax}', -	      email = '$form->{email}', -	      cc = '$form->{cc}', -	      bcc = '$form->{bcc}', -	      notes = '$form->{notes}', -	      terms = $form->{terms}, -	      taxincluded = '$form->{taxincluded}' -	      WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  # save taxes -  foreach $item (split / /, $form->{taxaccounts}) { -    if ($form->{"tax_$item"}) { -      $query = qq|INSERT INTO vendortax (vendor_id, chart_id) -		  VALUES ($form->{id}, (SELECT id -				        FROM chart -				        WHERE accno = '$item'))|; -      $dbh->do($query) || $form->dberror($query); -    } -  } - -  # add shipto -  $form->add_shipto($dbh, $form->{id}); - -  $dbh->disconnect; - -} - - - -sub delete_vendor { -  my ($self, $myconfig, $form) = @_; - -  # connect to database, turn AutoCommit off -  my $dbh = $form->dbconnect_noauto($myconfig); - -  # check if there are any transactions on file -  my $query = qq|SELECT id FROM ap -                 WHERE vendor_id = $form->{id} -		 UNION -		 SELECT id FROM oe -		 WHERE vendor_id = $form->{id}|; -  my $sth = $dbh->prepare($query) || $form->dberror($query); -  $sth->execute; -   -  my ($rc) = $sth->fetchrow_array; -  $sth->finish; -   -  if ($rc) { -    $dbh->disconnect; -    $rc = -1; -  } else { -     -    # delete vendor -    $query = qq|DELETE FROM vendor -                WHERE id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -    $query = qq|DELETE FROM shipto -                WHERE trans_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -    $query = qq|DELETE FROM vendortax -                WHERE vendor_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -    # commit and redirect -    $rc = $dbh->commit; -    $dbh->disconnect; - -  } - -  $rc; - -} - - -sub search { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $where = "1 = 1"; -  $form->{sort} = "name" unless ($form->{sort}); -   -  if ($form->{"$form->{db}number"}) { -    my $companynumber = $form->like(lc $form->{"$form->{db}number"}); -    $where .= " AND lower($form->{db}number) LIKE '$companynumber'"; -  } -  if ($form->{name}) { -    my $name = $form->like(lc $form->{name}); -    $where .= " AND lower(name) LIKE '$name'"; -  } -  if ($form->{contact}) { -    my $contact = $form->like(lc $form->{contact}); -    $where .= " AND lower(contact) LIKE '$contact'"; -  } -  if ($form->{email}) { -    my $email = $form->like(lc $form->{email}); -    $where .= " AND lower(email) LIKE '$email'"; -  } - -  if ($form->{status} eq 'orphaned') { -    $where .= qq| AND id NOT IN (SELECT o.$form->{db}_id -                                 FROM oe o, $form->{db} ct -		 	         WHERE ct.id = o.$form->{db}_id)|; -    if ($form->{db} eq 'customer') { -      $where .= qq| AND id NOT IN (SELECT a.customer_id -                                   FROM ar a, customer ct -				   WHERE ct.id = a.customer_id)|; -    } -    if ($form->{db} eq 'vendor') { -      $where .= qq| AND id NOT IN (SELECT a.vendor_id -                                   FROM ap a, vendor ct -				   WHERE ct.id = a.vendor_id)|; -    } -  } -   -  my $query = qq~SELECT id, name, $form->{db}number,  -                 addr1 || ' ' || addr2 || ' ' || addr3 || ' ' || addr4 AS address, -                 contact, phone, fax, email, cc, terms -                 FROM $form->{db} -                 WHERE $where -		 ORDER BY $form->{sort}~; - -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{CT} }, $ref; -  } - -  $sth->finish; -  $dbh->disconnect; - -} - - -1; - diff --git a/sql-ledger/SL/Form.pm b/sql-ledger/SL/Form.pm deleted file mode 100644 index ef5f2ca81..000000000 --- a/sql-ledger/SL/Form.pm +++ /dev/null @@ -1,1397 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 1998-2003 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -# Contributors: Thomas Bayen <bayen@gmx.de> -#               Antti Kaihola <akaihola@siba.fi> -#               Moritz Bunkus (tex code) -# -# 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. -#====================================================================== -# Utilities for parsing forms -# and supporting routines for linking account numbers -# used in AR, AP and IS, IR modules -# -#====================================================================== - -package Form; - - -sub new { -  my $type = shift; -   -  my $self = {}; - -  read(STDIN, $_, $ENV{CONTENT_LENGTH}); -   -  if ($ENV{QUERY_STRING}) { -    $_ = $ENV{QUERY_STRING}; -  } - -  if ($ARGV[0]) { -    $_ = $ARGV[0]; -  } - -  foreach $item (split(/&/)) { -    ($key, $value) = split(/=/, $item); -    $self->{$key} = &unescape("",$value); -  } - -  $self->{action} = lc $self->{action}; -  $self->{action} =~ s/( |-|,)/_/g; - -  $self->{version} = "2.0.8"; -  $self->{dbversion} = "2.0.8"; - -  bless $self, $type; -   -} - - -sub debug { -  my ($self) = @_; -   -  print "\n"; -   -  map { print "$_ = $self->{$_}\n" } (sort keys %{$self}); -   -}  - -   -sub escape { -  my ($self, $str, $beenthere) = @_; - -  # for Apache 2 we escape strings twice -  if (($ENV{SERVER_SOFTWARE} =~ /Apache\/2/) && !$beenthere) { -    $str = $self->escape($str, 1); -  } -	     -  $str =~ s/([^a-zA-Z0-9_.-])/sprintf("%%%02x", ord($1))/ge; -  $str; - -} - - -sub unescape { -  my ($self, $str) = @_; -   -  $str =~ tr/+/ /; -  $str =~ s/\\$//; - -  $str =~ s/%([0-9a-fA-Z]{2})/pack("c",hex($1))/eg; - -  $str; - -} - - -sub error { -  my ($self, $msg) = @_; - -  if ($ENV{HTTP_USER_AGENT}) { -    $msg =~ s/\n/<br>/g; - -    print qq|Content-Type: text/html - -    <body bgcolor=ffffff> - -    <h2><font color=red>Error!</font></h2> - -    <p><b>$msg</b> -     -    </body> -    </html> -    |; - -    die "Error: $msg\n"; - -  } else { -   -    if ($self->{error_function}) { -      &{ $self->{error_function} }($msg); -    } else { -      die "Error: $msg\n"; -    } -  } -   -} - - - -sub info { -  my ($self, $msg) = @_; - -  if ($ENV{HTTP_USER_AGENT}) { -    $msg =~ s/\n/<br>/g; - -    if (!$self->{header}) { -      $self->header; -      print qq| -      <body>|; -    } - -    print qq| - -    <p><b>$msg</b> -    |; -     -  } else { -   -    if ($self->{info_function}) { -      &{ $self->{info_function} }($msg); -    } else { -      print "$msg\n"; -    } -  } -   -} - - -sub numtextrows { -  my ($self, $str, $cols, $maxrows) = @_; - -  my $rows; - -  map { $rows += int ((length $_)/$cols) + 1 } (split /\r/, $str); - -  $rows = $maxrows if (defined $maxrows && ($rows > $maxrows)); -   -  $rows; - -} - - -sub dberror { -  my ($self, $msg) = @_; - -  $self->error("$msg\n".$DBI::errstr); -   -} - - -sub isblank { -  my ($self, $name, $msg) = @_; - -  if ($self->{$name} =~ /^\s*$/) { -    $self->error($msg); -  } -} -   - -sub header { -  my ($self) = @_; - -  my ($nocache, $stylesheet, $charset); -   -  # use expire tag to prevent caching -#  $nocache = qq|<META HTTP-EQUIV="Expires" CONTENT="Tue, 01 Jan 1980 1:00:00 GMT"> -#  <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> -#|; - -  if ($self->{stylesheet} && (-f "css/$self->{stylesheet}")) { -    $stylesheet = qq|<LINK REL="stylesheet" HREF="css/$self->{stylesheet}" TYPE="text/css" TITLE="SQL-Ledger style sheet"> -|; -  } - -  if ($self->{charset}) { -    $charset = qq|<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$self->{charset}"> -|; -  } - -  $self->{titlebar} = ($self->{title}) ? "$self->{title} - $self->{titlebar}" : $self->{titlebar}; -   -  print qq|Content-Type: text/html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> -<head> -  <title>$self->{titlebar}</title> -  $nocache -  $stylesheet -  $charset -</head> - -|; - -} - - -sub redirect { -  my ($self, $msg) = @_; - -  if ($self->{callback}) { - -    ($script, $argv) = split(/\?/, $self->{callback}); - -    exec ("perl", "$script", $argv); -    -  } else { -     -    if ($ENV{HTTP_USER_AGENT}) { -      $msg =~ s/\n/<br>/g; - -      print qq|Content-Type: text/html - -<body bgcolor=ffffff> - -<h2>$msg</h2> - -</body> -</html> -|; - -    } else { -      print "$msg\n"; -    } - -    exit; -     -  } - -} - - -sub sort_columns { -  my ($self, @columns) = @_; - -  @columns = grep !/^$self->{sort}$/, @columns; -  splice @columns, 0, 0, $self->{sort}; - -  @columns; -   -} - - -sub format_amount { -  my ($self, $myconfig, $amount, $places, $dash) = @_; - -  if ($places =~ /\d/) { -    $amount = $self->round_amount($amount, $places); -  } - -  # is the amount negative -  my $negative = ($amount < 0); -   -  if ($amount != 0) { -    if ($myconfig->{numberformat} && ($myconfig->{numberformat} ne '1000.00')) { -      my ($whole, $dec) = split /\./, "$amount"; -      $whole =~ s/-//; -      $amount = join '', reverse split //, $whole; -       -      if ($myconfig->{numberformat} eq '1,000.00') { -	$amount =~ s/\d{3,}?/$&,/g; -	$amount =~ s/,$//; -	$amount = join '', reverse split //, $amount; -	$amount .= "\.$dec" if ($dec ne ""); -      } -       -      if ($myconfig->{numberformat} eq '1.000,00') { -	$amount =~ s/\d{3,}?/$&./g; -	$amount =~ s/\.$//; -	$amount = join '', reverse split //, $amount; -	$amount .= ",$dec" if ($dec ne ""); -      } -       -      if ($myconfig->{numberformat} eq '1000,00') { -	$amount = "$whole"; -	$amount .= ",$dec" if ($dec ne ""); -      } - -      if ($dash =~ /-/) { -	$amount = ($negative) ? "($amount)" : "$amount"; -      } elsif ($dash =~ /DRCR/) { -	$amount = ($negative) ? "$amount DR" : "$amount CR"; -      } else { -	$amount = ($negative) ? "-$amount" : "$amount"; -      } -    } -  } else { -    if ($dash eq "0" && $places) { -      if ($myconfig->{numberformat} eq '1.000,00') { -	$amount = "0".","."0" x $places; -      } else { -	$amount = "0"."."."0" x $places; -      } -    } else { -      $amount = ($dash ne "") ? "$dash" : ""; -    } -  } - -  $amount; - -} - - -sub parse_amount { -  my ($self, $myconfig, $amount) = @_; - -  if (($myconfig->{numberformat} eq '1.000,00') || -      ($myconfig->{numberformat} eq '1000,00')) { -    $amount =~ s/\.//g; -    $amount =~ s/,/\./; -  } - -  $amount =~ s/,//g; -   -  return ($amount * 1); - -} - - -sub round_amount { -  my ($self, $amount, $places) = @_; - -#  $places = 3 if $places == 2; -   -  if (($places * 1) >= 0) { -    # compensate for perl behaviour, add 1/10^$places+3 -    sprintf("%.${places}f", $amount + (1 / (10 ** ($places + 3))) * (($amount > 0) ? 1 : -1)); -  } else { -    $places *= -1; -    sprintf("%.f", $amount / (10 ** $places) + (($amount > 0) ? 0.1 : -0.1)) * (10 ** $places); -  } - -} - - -sub parse_template { -  my ($self, $myconfig, $userspath) = @_; - -  # { Moritz Bunkus -  # Some variables used for page breaks -  my ($chars_per_line, $lines_on_first_page, $lines_on_second_page) = (0, 0, 0); -  my ($current_page, $current_line) = (1, 1); -  my $pagebreak = ""; -  my $sum = 0; -  # } Moritz Bunkus - -  open(IN, "$self->{templates}/$self->{IN}") or $self->error("$self->{IN} : $!"); - -  @_ = <IN>; -  close(IN); -   -  $self->{copies} = 1 if (($self->{copies} *= 1) <= 0); -   -  # OUT is used for the media, screen, printer, email -  # for postscript we store a copy in a temporary file -  my $fileid = time; -  $self->{tmpfile} = "$userspath/${fileid}.$self->{IN}"; -  if ($self->{format} =~ /(postscript|pdf)/ || $self->{media} eq 'email') { -    $out = $self->{OUT}; -    $self->{OUT} = ">$self->{tmpfile}"; -  } -   -   -  if ($self->{OUT}) { -    open(OUT, "$self->{OUT}") or $self->error("$self->{OUT} : $!"); -  } else { -    open(OUT, ">-") or $self->error("STDOUT : $!"); -    $self->header; -  } - - -  # first we generate a tmpfile -  # read file and replace <%variable%> -  while ($_ = shift) { -       -    $par = ""; -    $var = $_; - - -    # { Moritz Bunkus -    # detect pagebreak block and its parameters -    if (/<%pagebreak ([0-9]+) ([0-9]+) ([0-9]+)%>/) { -      $chars_per_line = $1; -      $lines_on_first_page = $2; -      $lines_on_second_page = $3; -       -      while ($_ = shift) { -        last if (/<\%end pagebreak%>/); -        $pagebreak .= $_; -      } -    } -    # } Moritz Bunkus - -     -    if (/<%foreach /) { -       -      # this one we need for the count -      chomp $var; -      $var =~ s/<%foreach (.+?)%>/$1/; -      while ($_ = shift) { -	last if (/<%end /); - -	# store line in $par -	$par .= $_; -      } -       -      # display contents of $self->{number}[] array -      for $i (0 .. $#{ $self->{$var} }) { - -        # { Moritz Bunkus -        # Try to detect whether a manual page break is necessary -        # but only if there was a <%pagebreak ...%> block before -	 -        if ($chars_per_line) { -          my $lines = int(length($self->{"description"}[$i]) / $chars_per_line + 0.95); -          my $lpp; -	   -          if ($current_page == 1) { -            $lpp = $lines_on_first_page; -          } else { -            $lpp = $lines_on_second_page; -          } - -          # Yes we need a manual page break -          if (($current_line + $lines) > $lpp) { -            my $pb = $pagebreak; -	     -            # replace the special variables <%sumcarriedforward%> -            # and <%lastpage%> -	     -            my $psum = $self->format_amount($myconfig, $sum, 2); -            $pb =~ s/<%sumcarriedforward%>/$psum/g; -            $pb =~ s/<%lastpage%>/$current_page/g; -             -	    # only "normal" variables are supported here -            # (no <%if, no <%foreach, no <%include) -             -	    $pb =~ s/<%(.+?)%>/$self->{$1}/g; -             -	    # page break block is ready to rock -            print(OUT $pb); -            $current_page++; -            $current_line = 1; -          } -          $current_line += $lines; -        } -        $sum += $self->parse_amount($myconfig, $self->{"linetotal"}[$i]); -        # } Moritz Bunkus - - -	# don't parse par, we need it for each line -	$_ = $par; -	s/<%(.+?)%>/$self->{$1}[$i]/mg; -	print OUT; -      } -      next; -    } - -    # if not comes before if! -    if (/<%if not /) { -      # check if it is not set and display -      chop; -      s/<%if not (.+?)%>/$1/; - -      unless ($self->{$_}) { -	while ($_ = shift) { -	  last if (/<%end /); - -	  # store line in $par -	  $par .= $_; -	} -	 -	$_ = $par; -	 -      } else { -	while ($_ = shift) { -	  last if (/<%end /); -	} -	next; -      } -    } -  -    if (/<%if /) { -      # check if it is set and display -      chop; -      s/<%if (.+?)%>/$1/; - -      if ($self->{$_}) { -	while ($_ = shift) { -	  last if (/<%end /); - -	  # store line in $par -	  $par .= $_; -	} -	 -	$_ = $par; -	 -      } else { -	while ($_ = shift) { -	  last if (/<%end /); -	} -	next; -      } -    } -    -    # check for <%include filename%> -    if (/<%include /) { -       -      # get the filename -      chomp $var; -      $var =~ s/<%include (.+?)%>/$1/; - -      # mangle filename if someone tries to be cute -      $var =~ s/\///g; - -      # prevent the infinite loop! -      next if ($self->{"$var"}); - -      open(INC, "$self->{templates}/$var") or $self->error($self->cleanup."$self->{templates}/$var : $!"); -      unshift(@_, <INC>); -      close(INC); - -      $self->{"$var"} = 1; - -      next; -    } -     -    s/<%(.+?)%>/$self->{$1}/g; -    print OUT; -  } - -  close(OUT); - - -  # { Moritz Bunkus -  # Convert the tex file to postscript -  if ($self->{format} =~ /(postscript|pdf)/) { - -    use Cwd; -    $self->{cwd} = cwd(); -    chdir("$userspath") or $self->error($self->cleanup."chdir : $!"); - -    $self->{tmpfile} =~ s/$userspath\///g; - -    # DS. added screen and email option in addition to printer -    # screen -    if ($self->{format} eq 'postscript') { -      system("latex --interaction=nonstopmode $self->{tmpfile} > $self->{tmpfile}.err"); -      $self->error($self->cleanup) if ($?); -       -      $self->{tmpfile} =~ s/tex$/dvi/; - -      system("dvips $self->{tmpfile} -o -q > /dev/null"); -      $self->error($self->cleanup."dvips : $!") if ($?); -      $self->{tmpfile} =~ s/dvi$/ps/; -    } -    if ($self->{format} eq 'pdf') { -      system("pdflatex --interaction=nonstopmode $self->{tmpfile} > $self->{tmpfile}.err"); -      $self->error($self->cleanup) if ($?); -      $self->{tmpfile} =~ s/tex$/pdf/; -    } - -  } - -  if ($self->{format} =~ /(postscript|pdf)/ || $self->{media} eq 'email') { - -    if ($self->{media} eq 'email') { -       -      use SL::Mailer; - -      my $mail = new Mailer; -       -      $self->{email} =~ s/,/>,</g; -       -      map { $mail->{$_} = $self->{$_} } qw(cc bcc subject message version format charset); -      $mail->{to} = qq|"$self->{name}" <$self->{email}>|; -      $mail->{from} = qq|"$myconfig->{name}" <$myconfig->{email}>|; -      $mail->{fileid} = "$fileid."; - -      # if we send html or plain text inline -      if (($self->{format} eq 'html') && ($self->{sendmode} eq 'inline')) { -	$mail->{contenttype} = "text/html"; - -        $mail->{message} =~ s/\r\n/<br>\n/g; -	$myconfig->{signature} =~ s/\\n/<br>\n/g; -	$mail->{message} .= "<br>\n--<br>\n$myconfig->{signature}\n<br>"; -	 -	open(IN, $self->{tmpfile}) or $self->error($self->cleanup."$self->{tmpfile} : $!"); -	while (<IN>) { -	  $mail->{message} .= $_; -	} - -	close(IN); - -      } else { -	 -	@{ $mail->{attachments} } = ($self->{tmpfile}); - -	$myconfig->{signature} =~ s/\\n/\r\n/g; -	$mail->{message} .= "\r\n--\r\n$myconfig->{signature}"; - -      } -  -      my $err = $mail->send($out); -      $self->error($self->cleanup."$err") if ($err); -       -    } else { -       -      $self->{OUT} = $out; -      open(IN, $self->{tmpfile}) or $self->error($self->cleanup."$self->{tmpfile} : $!"); - -      $self->{copies} = 1 unless $self->{media} eq 'printer'; -       -      for my $i (1 .. $self->{copies}) { -	   -	if ($self->{OUT}) { -	  open(OUT, $self->{OUT}) or $self->error($self->cleanup."$self->{OUT} : $!"); -	} else { -	  open(OUT, ">-") or $self->error($self->cleanup."$!: STDOUT"); -	   -	  # launch application -	  print qq|Content-Type: application/$self->{format}; name="$self->{tmpfile}" -  Content-Disposition: filename="$self->{tmpfile}" - -  |; -	} -        -	while (<IN>) { -	  print OUT $_; -	} -	close(OUT); -	seek IN, 0, 0; -      } - -      close(IN); -    } - -    $self->cleanup; - -  } -  # } Moritz Bunkus - -} - - -sub cleanup { -  my $self = shift; - -  my @err = (); -  if (-f "$self->{tmpfile}.err") { -    open(FH, "$self->{tmpfile}.err"); -    @err = <FH>; -    close(FH); -  } -   -  if ($self->{tmpfile}) { -    # strip extension -    $self->{tmpfile} =~ s/\.\w+$//g; -    my $tmpfile = $self->{tmpfile}; -    unlink(<$tmpfile.*>); -  } - - -  chdir("$self->{cwd}"); -   -  "@err"; -   -} - - -sub format_string { -  my ($self, @fields) = @_; - -  my $format = $self->{format}; -  if ($self->{format} =~ /(postscript|pdf)/) { -    $format = 'tex'; -  } - -  my %replace = ( 'order' => { 'html' => [ quotemeta('\n'), '
' ], -                               'tex'  => [ '&', quotemeta('\n'), '
', -					   '\$', '%', '_', '#', quotemeta('^'), -					   '{', '}', '<', '>', '£' ] }, -                  'html' => { -                quotemeta('\n') => '<br>', '
' => '<br>' -		            }, -	           'tex' => { -	        '&' => '\&', '\$' => '\$', '%' => '\%', '_' => '\_', -		'#' => '\#', quotemeta('^') => '\^\\', '{' => '\{', '}' => '\}', -		'<' => '$<$', '>' => '$>$', -		quotemeta('\n') => '\newline ', '
' => '\newline ', -		'£' => '\pounds ', -                            } -	        ); - -  foreach my $key (@{ $replace{order}{$format} }) { -    map { $self->{$_} =~ s/$key/$replace{$format}{$key}/g; } @fields; -  } - -} - - -sub datetonum { -  my ($self, $date, $myconfig) = @_; - -  if ($date) { -    # get separator -    my $spc = $myconfig->{dateformat}; -    $spc =~ s/\w//g; -    $spc = substr($spc, 1, 1); - -    if ($spc eq '.') { -      $spc = '\.'; -    } -    if ($spc eq '/') { -      $spc = '\/'; -    } - -    if ($myconfig->{dateformat} =~ /^yy/) { -      ($yy, $mm, $dd) = split /$spc/, $date; -    } -    if ($myconfig->{dateformat} =~ /^mm/) { -      ($mm, $dd, $yy) = split /$spc/, $date; -    } -    if ($myconfig->{dateformat} =~ /^dd/) { -      ($dd, $mm, $yy) = split /$spc/, $date; -    } -     -    $dd *= 1; -    $mm *= 1; -    $yy = ($yy < 70) ? $yy + 2000 : $yy; -    $yy = ($yy >= 70 && $yy <= 99) ? $yy + 1900 : $yy; - -    $dd = "0$dd" if ($dd < 10); -    $mm = "0$mm" if ($mm < 10); -     -    $date = "$yy$mm$dd"; -  } - -  $date; -   -} - - - -# Database routines used throughout - -sub dbconnect { -  my ($self, $myconfig) = @_; - -  # connect to database -  my $dbh = DBI->connect($myconfig->{dbconnect}, $myconfig->{dbuser}, $myconfig->{dbpasswd}) or $self->dberror; - -  # set db options -  if ($myconfig->{dboptions}) { -    $dbh->do($myconfig->{dboptions}) || $self->dberror($myconfig->{dboptions}); -  } - -  $dbh; - -} - - -sub dbconnect_noauto { -  my ($self, $myconfig) = @_; - -  # connect to database -  $dbh = DBI->connect($myconfig->{dbconnect}, $myconfig->{dbuser}, $myconfig->{dbpasswd}, {AutoCommit => 0}) or $self->dberror; - -  # set db options -  if ($myconfig->{dboptions}) { -    $dbh->do($myconfig->{dboptions}) || $self->dberror($myconfig->{dboptions}); -  } - -  $dbh; - -} - - -sub update_balance { -  my ($self, $dbh, $table, $field, $where, $value) = @_; - -  # if we have a value, go do it -  if ($value != 0) { -    # retrieve balance from table -    my $query = "SELECT $field FROM $table WHERE $where"; -    my $sth = $dbh->prepare($query); - -    $sth->execute || $self->dberror($query); -    my ($balance) = $sth->fetchrow_array; -    $sth->finish; - -    $balance += $value; -    # update balance -    $query = "UPDATE $table SET $field = $balance WHERE $where"; -    $dbh->do($query) || $self->dberror($query); -  } -} - - - -sub update_exchangerate { -  my ($self, $dbh, $curr, $transdate, $buy, $sell) = @_; - -  # some sanity check for currency -  return if ($curr eq ''); - -  my $query = qq|SELECT curr FROM exchangerate -                 WHERE curr = '$curr' -	         AND transdate = '$transdate'|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); -   -  my $set; -  if ($buy != 0 && $sell != 0) { -    $set = "buy = $buy, sell = $sell"; -  } elsif ($buy != 0) { -    $set = "buy = $buy"; -  } elsif ($sell != 0) { -    $set = "sell = $sell"; -  } -   -  if ($sth->fetchrow_array) { -    $query = qq|UPDATE exchangerate -                SET $set -		WHERE curr = '$curr' -		AND transdate = '$transdate'|; -  } else { -    $query = qq|INSERT INTO exchangerate (curr, buy, sell, transdate) -                VALUES ('$curr', $buy, $sell, '$transdate')|; -  } -  $sth->finish; -  $dbh->do($query) || $self->dberror($query); -   -} - - -sub get_exchangerate { -  my ($self, $dbh, $curr, $transdate, $fld) = @_; -   -  my $query = qq|SELECT $fld FROM exchangerate -                 WHERE curr = '$curr' -		 AND transdate = '$transdate'|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  my ($exchangerate) = $sth->fetchrow_array; -  $sth->finish; - -  $exchangerate; - -} - - -sub delete_exchangerate { -  my ($self, $dbh) = @_; - -  my @transdate = (); -  my $transdate; - -  my $query = qq|SELECT DISTINCT transdate -                 FROM acc_trans -		 WHERE trans_id = $self->{id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  while ($transdate = $sth->fetchrow_array) { -    push @transdate, $transdate; -  } -  $sth->finish; - -  $query = qq|SELECT transdate FROM acc_trans -              WHERE ar.id = trans_id -	      AND ar.curr = '$self->{currency}' -	      AND transdate IN -	          (SELECT transdate FROM acc_trans -		  WHERE trans_id = $self->{id}) -              AND trans_id != $self->{id} -        UNION SELECT transdate FROM acc_trans -	      WHERE ap.id = trans_id -	      AND ap.curr = '$self->{currency}' -	      AND transdate IN -	          (SELECT transdate FROM acc_trans -		  WHERE trans_id = $self->{id}) -              AND trans_id != $self->{id} -        UNION SELECT transdate FROM oe -	        WHERE oe.curr = '$self->{currency}' -		AND transdate IN -		    (SELECT transdate FROM acc_trans -		    WHERE trans_id = $self->{id})|; -  $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  while ($transdate = $sth->fetchrow_array) { -    @transdate = grep !/^$transdate$/, @transdate; -  } -  $sth->finish; - -  foreach $transdate (@transdate) { -    $query = qq|DELETE FROM exchangerate -                WHERE curr = '$self->{currency}' -		AND transdate = '$transdate'|; -    $dbh->do($query) || $self->dberror($query); -  } -   -} - - -sub check_exchangerate { -  my ($self, $myconfig, $currency, $transdate, $fld) = @_; - -  return "" unless $transdate; -   -  my $dbh = $self->dbconnect($myconfig); - -  my $query = qq|SELECT $fld FROM exchangerate -                 WHERE curr = '$currency' -		 AND transdate = '$transdate'|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  my ($exchangerate) = $sth->fetchrow_array; -  $sth->finish; -  $dbh->disconnect; -   -  $exchangerate; -   -} - - -sub add_shipto { -  my ($self, $dbh, $id) = @_; - -  my $shipto; -  foreach my $item (qw(name addr1 addr2 addr3 addr4 contact phone fax email)) { -    if ($self->{"shipto$item"}) { -      $shipto = 1 if ($self->{$item} ne $self->{"shipto$item"}); -    } -    $self->{"shipto$item"} =~ s/'/''/g; -  } - -  if ($shipto) { -    my $query = qq|INSERT INTO shipto (trans_id, shiptoname, shiptoaddr1, -                   shiptoaddr2, shiptoaddr3, shiptoaddr4, shiptocontact, -		   shiptophone, shiptofax, shiptoemail) VALUES ($id, -		   '$self->{shiptoname}', '$self->{shiptoaddr1}', -		   '$self->{shiptoaddr2}', '$self->{shiptoaddr3}', -		   '$self->{shiptoaddr4}', '$self->{shiptocontact}', -		   '$self->{shiptophone}', '$self->{shiptofax}', -		   '$self->{shiptoemail}')|; -    $dbh->do($query) || $self->dberror($query); -  } - -} - - -sub get_employee { -  my ($self, $dbh) = @_; - -  my $query = qq|SELECT name FROM employee  -                 WHERE login = '$self->{login}'|;  -  my $sth = $dbh->prepare($query);  -  $sth->execute || $self->dberror($query);  - -  ($self->{employee}) = $sth->fetchrow_array; -  $sth->finish;  - -} - - -# this sub gets the id and name from $table -sub get_name { -  my ($self, $myconfig, $table) = @_; - -  # connect to database -  my $dbh = $self->dbconnect($myconfig); -   -  my $name = $self->like(lc $self->{$table}); -  my $query = qq~SELECT id, name, -                 addr1 || ' ' || addr2 || ' ' || addr3 || ' ' || addr4 AS address -                 FROM $table -		 WHERE lower(name) LIKE '$name' -		 ORDER BY name~; -  my $sth = $dbh->prepare($query); - -  $sth->execute || $self->dberror($query); - -  my $i = 0; -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    push(@{ $self->{name_list} }, $ref); -    $i++; -  } -  $sth->finish; -  $dbh->disconnect; - -  $i; -   -} - - -# the selection sub is used in the AR, AP, IS, IR and OE module -# -sub all_vc { -  my ($self, $myconfig, $table) = @_; -   -  my $dbh = $self->dbconnect($myconfig); -   -  my $query = qq|SELECT count(*) FROM $table|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); -  my ($count) = $sth->fetchrow_array; -  $sth->finish; -   -  # build selection list -  if ($count < $myconfig->{vclimit}) { -    $query = qq|SELECT id, name -		FROM $table -		ORDER BY name|; -    $sth = $dbh->prepare($query); -    $sth->execute || $self->dberror($query); - -    while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -      push @{ $self->{"all_$table"} }, $ref; -    } -     -    $sth->finish; -     -  } - -  $dbh->disconnect; - -} - - -sub create_links { -  my ($self, $module, $myconfig, $table) = @_; - -  $self->all_vc($myconfig, $table); -   -  # get last customers or vendors -  my ($query, $sth); -   -  my $dbh = $self->dbconnect($myconfig); -   -  my %xkeyref = (); - - -  # now get the account numbers -  $query = qq|SELECT accno, description, link -              FROM chart -	      WHERE link LIKE '%$module%' -	      ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  $self->{accounts} = ""; -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -     -    foreach my $key (split(/:/, $ref->{link})) { -      if ($key =~ /$module/) { -	# cross reference for keys -	$xkeyref{$ref->{accno}} = $key; -	 -	push @{ $self->{"${module}_links"}{$key} }, { accno => $ref->{accno}, -                                       description => $ref->{description} }; - -        $self->{accounts} .= "$ref->{accno} " unless $key =~ /tax/; -      } -    } -  } -  $sth->finish; -   -  -  if ($self->{id}) { -    my $arap = ($table eq 'customer') ? 'ar' : 'ap'; -     -    $query = qq|SELECT a.invnumber, a.transdate, -                a.${table}_id, a.datepaid, a.duedate, a.ordnumber, -		a.taxincluded, a.curr AS currency, a.notes, c.name AS $table, -		a.amount AS oldinvtotal, a.paid AS oldtotalpaid -		FROM $arap a, $table c -		WHERE a.${table}_id = c.id -		AND a.id = $self->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $self->dberror($query); -     -    $ref = $sth->fetchrow_hashref(NAME_lc); -    foreach $key (keys %$ref) { -      $self->{$key} = $ref->{$key}; -    } -    $sth->finish; - -    # get amounts from individual entries -    $query = qq|SELECT c.accno, c.description, a.source, a.amount, -                a.transdate, a.cleared, a.project_id, p.projectnumber -		FROM acc_trans a -		JOIN chart c ON (c.id = a.chart_id) -		LEFT JOIN project p ON (a.project_id = p.id) -		WHERE a.trans_id = $self->{id} -		AND a.fx_transaction = '0' -		ORDER BY transdate|; -    $sth = $dbh->prepare($query); -    $sth->execute || $self->dberror($query); - -    my $fld = ($table eq 'customer') ? 'buy' : 'sell'; -    # get exchangerate for currency -    $self->{exchangerate} = $self->get_exchangerate($dbh, $self->{currency}, $self->{transdate}, $fld); -     -    # store amounts in {acc_trans}{$key} for multiple accounts -    while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -      $ref->{exchangerate} = $self->get_exchangerate($dbh, $self->{currency}, $ref->{transdate}, $fld); - -      push @{ $self->{acc_trans}{$xkeyref{$ref->{accno}}} }, $ref; -    } - -    $sth->finish; - -    $query = qq|SELECT d.curr AS currencies, d.closedto, d.revtrans, -                  (SELECT c.accno FROM chart c -		   WHERE d.fxgain_accno_id = c.id) AS fxgain_accno, -                  (SELECT c.accno FROM chart c -		   WHERE d.fxloss_accno_id = c.id) AS fxloss_accno -		FROM defaults d|; -    $sth = $dbh->prepare($query); -    $sth->execute || $self->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $self->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; - -  } else { -    -    # get date -    $query = qq|SELECT current_date AS transdate, -                d.curr AS currencies, d.closedto, d.revtrans, -                  (SELECT c.accno FROM chart c -		   WHERE d.fxgain_accno_id = c.id) AS fxgain_accno, -                  (SELECT c.accno FROM chart c -		   WHERE d.fxloss_accno_id = c.id) AS fxloss_accno -		FROM defaults d|; -    $sth = $dbh->prepare($query); -    $sth->execute || $self->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $self->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; - -    if ($self->{"$self->{vc}_id"}) { -      # only setup currency -      ($self->{currency}) = split /:/, $self->{currencies}; -       -    } else { -       -      $self->lastname_used($dbh, $myconfig, $table, $module); -     -      my $fld = ($table eq 'customer') ? 'buy' : 'sell'; -      # get exchangerate for currency -      $self->{exchangerate} = $self->get_exchangerate($dbh, $self->{currency}, $self->{transdate}, $fld); -    -    } - -  } - -  $dbh->disconnect; - -} - - -sub lastname_used { -  my ($self, $dbh, $myconfig, $table, $module) = @_; - -  my $arap = ($table eq 'customer') ? "ar" : "ap"; -  $arap = 'oe' if ($self->{type} =~ /_order/); - -  my $query = qq|SELECT id FROM $arap -                 WHERE id IN (SELECT MAX(id) FROM $arap -		              WHERE ${table}_id > 0)|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); -   -  my ($trans_id) = $sth->fetchrow_array; -  $sth->finish; -   -  $trans_id *= 1; -  $query = qq|SELECT ct.name, a.curr, a.${table}_id, -              current_date + ct.terms AS duedate -	      FROM $arap a -	      JOIN $table ct ON (a.${table}_id = ct.id) -	      WHERE a.id = $trans_id|; -  $sth = $dbh->prepare($query); -  $sth->execute || $self->dberror($query); - -  ($self->{$table}, $self->{currency}, $self->{"${table}_id"}, $self->{duedate}) = $sth->fetchrow_array; -  $sth->finish; - -} - - - -sub current_date { -  my ($self, $myconfig, $thisdate, $days) = @_; -   -  my $dbh = $self->dbconnect($myconfig); -  my ($sth, $query); - -  $days *= 1; -  if ($thisdate) { -    my $dateformat = $myconfig->{dateformat}; -    $dateformat .= "yy" if $myconfig->{dateformat} !~ /^y/; -     -    $query = qq|SELECT to_date('$thisdate', '$dateformat') + $days AS thisdate -                FROM defaults|; -     $sth = $dbh->prepare($query); -     $sth->execute || $self->dberror($query); -  } else { -    $query = qq|SELECT current_date AS thisdate -                FROM defaults|; -     $sth = $dbh->prepare($query); -     $sth->execute || $self->dberror($query); -  } - -  ($thisdate) = $sth->fetchrow_array; -  $sth->finish; - -  $dbh->disconnect; - -  $thisdate; - -} - - -sub like { -  my ($self, $string) = @_; -   -  unless ($string =~ /%/) { -    $string = "%$string%"; -  } - -  $string =~ s/'/''/g; -  $string; -   -} - - -sub redo_rows { -  my ($self, $flds, $new, $count, $numrows) = @_; - -  my @ndx = (); - -  map { push @ndx, { num => $new->[$_-1]->{runningnumber}, ndx => $_ } } (1 .. $count); - -  my $i = 0; -  # fill rows -  foreach my $item (sort { $a->{num} <=> $b->{num} } @ndx) { -    $i++; -    $j = $item->{ndx} - 1; -    map { $self->{"${_}_$i"} = $new->[$j]->{$_} } @{$flds}; -  } - -  # delete empty rows -  for $i ($count + 1 .. $numrows) { -    map { delete $self->{"${_}_$i"} } @{$flds};  -  } - -} - -   -package Locale; - - -sub new { -  my ($type, $country, $NLS_file) = @_; -  my $self = {}; - -  %self = (); -  if ($country && -d "locale/$country") { -    $self->{countrycode} = $country; -    eval { require "locale/$country/$NLS_file"; }; -  } - -  $self->{NLS_file} = $NLS_file; -   -  push @{ $self->{LONG_MONTH} }, ("January", "February", "March", "April", "May ", "June", "July", "August", "September", "October", "November", "December"); -  push @{ $self->{SHORT_MONTH} }, (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)); -   -  bless $self, $type; - -} - - -sub text { -  my ($self, $text) = @_; -   -  return (exists $self{texts}{$text}) ? $self{texts}{$text} : $text; -   -} - - -sub findsub { -  my ($self, $text) = @_; - -  if (exists $self{subs}{$text}) { -    $text = $self{subs}{$text}; -  } else { -    if ($self->{countrycode} && $self->{NLS_file}) { -      Form->error("$text not defined in locale/$self->{countrycode}/$self->{NLS_file}"); -    } -  } - -  $text; - -} - - -sub date { -  my ($self, $myconfig, $date, $longformat) = @_; - -  my $longdate = ""; -  my $longmonth = ($longformat) ? 'LONG_MONTH' : 'SHORT_MONTH'; - -  if ($date) { -    # get separator -    $spc = $myconfig->{dateformat}; -    $spc =~ s/\w//g; -    $spc = substr($spc, 1, 1); - -    if ($spc eq '.') { -      $spc = '\.'; -    } -    if ($spc eq '/') { -      $spc = '\/'; -    } - -    if ($myconfig->{dateformat} =~ /^yy/) { -      ($yy, $mm, $dd) = split /$spc/, $date; -    } -    if ($myconfig->{dateformat} =~ /^mm/) { -      ($mm, $dd, $yy) = split /$spc/, $date; -    } -    if ($myconfig->{dateformat} =~ /^dd/) { -      ($dd, $mm, $yy) = split /$spc/, $date; -    } -     -    $dd *= 1; -    $mm--; -    $yy = ($yy < 70) ? $yy + 2000 : $yy; -    $yy = ($yy >= 70 && $yy <= 99) ? $yy + 1900 : $yy; - -    if ($myconfig->{dateformat} =~ /^dd/) { -      $longdate = "$dd. ".&text($self, $self->{$longmonth}[$mm])." $yy"; -    } else { -      $longdate = &text($self, $self->{$longmonth}[$mm])." $dd, $yy"; -    } - -  } - -  $longdate; - -} - - -1; - diff --git a/sql-ledger/SL/GL.pm b/sql-ledger/SL/GL.pm deleted file mode 100644 index 5bceb078a..000000000 --- a/sql-ledger/SL/GL.pm +++ /dev/null @@ -1,462 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# General ledger backend code -# -# CHANGE LOG: -#   DS. 2000-07-04  Created -#   DS. 2001-06-12  Changed relations from accno to chart_id -# -#====================================================================== - -package GL; - - -sub delete_transaction { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); - -  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 ($debit, $credit) = (0, 0); -  my $project_id; - -  my $i; -  # check if debit and credit balances -  for $i (1 .. $form->{rowcount}) { -    if ($form->{"debit_$i"} && $form->{"credit_$i"}) { -      return -1; -    } - -    $form->{"debit_$i"} = $form->parse_amount($myconfig, $form->{"debit_$i"}); -    $form->{"credit_$i"} = $form->parse_amount($myconfig, $form->{"credit_$i"}); - -    $debit += $form->{"debit_$i"}; -    $credit += $form->{"credit_$i"}; -  } - -  $debit = $form->round_amount($debit, 2); -  $credit = $form->round_amount($credit, 2); -   -  if ($debit != $credit) { -    return -2; -  } - -  if (($debit + $credit) == 0) { -    return -3; -  } -   -  # connect to database, turn off AutoCommit -  my $dbh = $form->dbconnect_noauto($myconfig); - -  # post the transaction -  # make up a unique handle and store in reference field -  # then retrieve the record based on the unique handle to get the id -  # replace the reference field with the actual variable -  # add records to acc_trans - -  # if there is a $form->{id} replace the old transaction -  # delete all acc_trans entries and add the new ones - -  # escape ' -  map { $form->{$_} =~ s/'/''/g } qw(reference description); - - -  my ($query, $sth); -   -  if ($form->{id}) { -    # delete individual transactions -    $query = qq|DELETE FROM acc_trans  -                WHERE trans_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); -     -  } else { -    my $uid = time; -    $uid .= $form->{login}; - -    $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'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{id}) = $sth->fetchrow_array; -    $sth->finish; - -  } -   -  $query = qq|UPDATE gl SET  -	      reference = '$form->{reference}', -	      description = '$form->{description}', -	      notes = '$form->{notes}', -	      transdate = '$form->{transdate}' -	      WHERE id = $form->{id}|; -	    -  $dbh->do($query) || $form->dberror($query); - -  -  # insert acc_trans transactions -  for $i (1 .. $form->{rowcount}) { -    # extract accno -    ($accno) = split(/--/, $form->{"accno_$i"}); -    my $amount = 0; -     -    if ($form->{"credit_$i"} != 0) { -      $amount = $form->{"credit_$i"}; -    } -    if ($form->{"debit_$i"} != 0) { -      $amount = $form->{"debit_$i"} * -1; -    } - - -    # if there is an amount, add the record -    if ($amount != 0) { -      $project_id = ($form->{"project_id_$i"}) ? $form->{"project_id_$i"} : 'NULL';  -      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, -                  source, project_id) -		  VALUES -		  ($form->{id}, (SELECT id -		                 FROM chart -				 WHERE accno = '$accno'), -		   $amount, '$form->{transdate}', '$form->{reference}', -		  $project_id)|; -     -      $dbh->do($query) || $form->dberror($query); -    } -  } - -  # 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 ($glwhere, $arwhere, $apwhere) = ("1 = 1", "1 = 1", "1 = 1"); -   -  if ($form->{reference}) { -    my $source = $form->like(lc $form->{reference}); -    $glwhere .= " AND lower(g.reference) LIKE '$source'"; -    $arwhere .= " AND lower(a.invnumber) LIKE '$source'"; -    $apwhere .= " AND lower(a.invnumber) LIKE '$source'"; -  } -  if ($form->{source}) { -    my $source = $form->like(lc $form->{source}); -    $glwhere .= " AND lower(ac.source) LIKE '$source'"; -    $arwhere .= " AND lower(ac.source) LIKE '$source'"; -    $apwhere .= " AND lower(ac.source) LIKE '$source'"; -  } -  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->{description}) { -    my $description = $form->like(lc $form->{description}); -    $glwhere .= " AND lower(g.description) LIKE '$description'"; -    $arwhere .= " AND lower(ct.name) LIKE '$description'"; -    $apwhere .= " AND lower(ct.name) LIKE '$description'"; -  } -  if ($form->{notes}) { -    my $notes = $form->like(lc $form->{notes}); -    $glwhere .= " AND lower(g.notes) LIKE '$notes'"; -    $arwhere .= " AND lower(a.notes) LIKE '$notes'"; -    $apwhere .= " AND lower(a.notes) LIKE '$notes'"; -  } -  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 -                FROM chart -		WHERE accno = '$form->{accno}'|; -    $sth = $dbh->prepare($query);  - -    $sth->execute || $form->dberror($query);  -    ($form->{ml}) = $sth->fetchrow_array;  -    $sth->finish;  -     -    if ($form->{datefrom}) { -      $query = qq|SELECT SUM(ac.amount) -		  FROM acc_trans ac, chart c -		  WHERE ac.chart_id = c.id -		  AND c.accno = '$form->{accno}' -		  AND ac.transdate < date '$form->{datefrom}' -		  |; -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      ($form->{balance}) = $sth->fetchrow_array; -      $sth->finish; -    } -  } -   -  if ($form->{gifi_accno}) { -    # get category for account -    $query = qq|SELECT category -                FROM chart -		WHERE gifi_accno = '$form->{gifi_accno}'|; -    $sth = $dbh->prepare($query);  - -    $sth->execute || $form->dberror($query);  -    ($form->{ml}) = $sth->fetchrow_array;  -    $sth->finish;  -    -    if ($form->{datefrom}) { -      $query = qq|SELECT SUM(ac.amount) -		  FROM acc_trans ac, chart c -		  WHERE ac.chart_id = c.id -		  AND c.gifi_accno = '$form->{gifi_accno}' -		  AND ac.transdate < date '$form->{datefrom}' -		  |; -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      ($form->{balance}) = $sth->fetchrow_array; -      $sth->finish; -    } -  } - -  my $false = ($myconfig->{dbdriver} eq 'Pg') ? FALSE : q|'0'|; - -  my $sortorder = join ', ', $form->sort_columns(qw(transdate reference source description accno)); -  my %ordinal = ( transdate => 6, -                  reference => 4, -                  source => 7, -		  description => 5 ); -  map { $sortorder =~ s/$_/$ordinal{$_}/ } keys %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 -                 FROM gl g, acc_trans ac, chart c -                 WHERE $glwhere -		 AND ac.chart_id = c.id -		 AND g.id = ac.trans_id -	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 -		 FROM ar a, acc_trans ac, chart c, customer ct -		 WHERE $arwhere -		 AND ac.chart_id = c.id -		 AND a.customer_id = ct.id -		 AND a.id = ac.trans_id -	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 -		 FROM ap a, acc_trans ac, chart c, vendor ct -		 WHERE $apwhere -		 AND ac.chart_id = c.id -		 AND a.vendor_id = ct.id -		 AND a.id = ac.trans_id -	         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} = "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; - -  if ($form->{accno}) { -    $query = qq|SELECT description FROM chart WHERE accno = '$form->{accno}'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{account_description}) = $sth->fetchrow_array; -    $sth->finish; -  } -  if ($form->{gifi_accno}) { -    $query = qq|SELECT description FROM gifi WHERE accno = '$form->{gifi_accno}'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{gifi_account_description}) = $sth->fetchrow_array; -    $sth->finish; -  } -  -  $dbh->disconnect; - -} - - -sub transaction { -  my ($self, $myconfig, $form) = @_; -   -  my ($query, $sth); -   -  # 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 = "SELECT reference, description, notes, transdate -              FROM gl -	      WHERE id = $form->{id}"; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{reference}, $form->{description}, $form->{notes}, $form->{transdate}) = $sth->fetchrow_array; -    $sth->finish; -   -    # retrieve individual rows -    $query = "SELECT c.accno, a.amount, project_id, -                (SELECT p.projectnumber FROM project p -		 WHERE a.project_id = p.id) AS projectnumber -	      FROM acc_trans a, chart c -	      WHERE a.chart_id = c.id -	      AND a.trans_id = $form->{id} -	      ORDER BY accno"; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); -     -    while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -      push @{ $form->{GL} }, $ref; -    } -  } 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); -  $form->{chart} = ""; -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{chart} }, $ref; -  } -  $sth->finish; -   -  $dbh->disconnect; - -} - - -1; - diff --git a/sql-ledger/SL/IC.pm b/sql-ledger/SL/IC.pm deleted file mode 100644 index f4a2f75ff..000000000 --- a/sql-ledger/SL/IC.pm +++ /dev/null @@ -1,936 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Inventory Control backend -# -#====================================================================== - -package IC; - - -sub get_part { -  my ($self, $myconfig, $form) = @_; - -  # connect to db -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT p.*, -                 c1.accno AS inventory_accno, -                 c2.accno AS income_accno, -                 c3.accno AS expense_accno, -		 pg.partsgroup -	         FROM parts p -		 LEFT JOIN chart c1 ON (p.inventory_accno_id = c1.id) -		 LEFT JOIN chart c2 ON (p.income_accno_id = c2.id) -		 LEFT JOIN chart c3 ON (p.expense_accno_id = c3.id) -		 LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -                 WHERE p.id = $form->{id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -  my $ref = $sth->fetchrow_hashref(NAME_lc); - -  # copy to $form variables -  map { $form->{$_} = $ref->{$_} } ( keys %{ $ref } ); -   -  $sth->finish; -   -  my %oid = ('Pg'	=> 'a.oid', -             'Oracle'	=> 'a.rowid' -	    ); -   -   -  # part or service item -  $form->{item} = ($form->{inventory_accno}) ? 'part' : 'service'; -  if ($form->{assembly}) { -    $form->{item} = 'assembly'; - -    # retrieve assembly items -    $query = qq|SELECT p.id, p.partnumber, p.description, -                p.sellprice, p.weight, a.qty, a.bom, p.unit, -		pg.partsgroup -                FROM parts p -		JOIN assembly a ON (a.parts_id = p.id) -		LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		WHERE a.id = $form->{id} -		ORDER BY $oid{$myconfig->{dbdriver}}|; - -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); -     -    $form->{assembly_rows} = 0; -    while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -      $form->{assembly_rows}++; -      foreach my $key ( keys %{ $ref } ) { -	$form->{"${key}_$form->{assembly_rows}"} = $ref->{$key}; -      } -    } -    $sth->finish; - -  } - -  # setup accno hash for <option checked> {amount} is used in create_links -  $form->{amount}{IC} = $form->{inventory_accno}; -  $form->{amount}{IC_income} = $form->{income_accno}; -  $form->{amount}{IC_sale} = $form->{income_accno}; -  $form->{amount}{IC_expense} = $form->{expense_accno}; -  $form->{amount}{IC_cogs} = $form->{expense_accno}; -   - -  if ($form->{item} ne 'service') { -    # get makes -    if ($form->{makemodel}) { -      $query = qq|SELECT name FROM makemodel -                  WHERE parts_id = $form->{id}|; - -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); -       -      my $i = 1; -      while (($form->{"make_$i"}, $form->{"model_$i"}) = split(/:/, $sth->fetchrow_array)) { -	$i++; -      } -      $sth->finish; -      $form->{makemodel_rows} = $i - 1; - -    } -  } - -  # now get accno for taxes -  $query = qq|SELECT c.accno -              FROM chart c, partstax pt -	      WHERE pt.chart_id = c.id -	      AND pt.parts_id = $form->{id}|; -   -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (($key) = $sth->fetchrow_array) { -    $form->{amount}{$key} = $key; -  } - -  $sth->finish; - -  # is it an orphan -  $query = qq|SELECT parts_id -              FROM invoice -	      WHERE parts_id = $form->{id} -	      UNION -	      SELECT parts_id -	      FROM orderitems -	      WHERE parts_id = $form->{id} -	      UNION -	      SELECT parts_id -	      FROM assembly -	      WHERE parts_id = $form->{id}|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($form->{orphaned}) = $sth->fetchrow_array; -  $form->{orphaned} = !$form->{orphaned}; -  $sth->finish; -   -  $dbh->disconnect; -   -} - - - -sub save { -  my ($self, $myconfig, $form) = @_; - -  ($form->{inventory_accno}) = split(/--/, $form->{IC}); -  ($form->{expense_accno}) = split(/--/, $form->{IC_expense}); -  ($form->{income_accno}) = split(/--/, $form->{IC_income}); - -  # connect to database, turn off AutoCommit -  my $dbh = $form->dbconnect_noauto($myconfig); - -  # save the part -  # make up a unique handle and store in partnumber field -  # then retrieve the record based on the unique handle to get the id -  # replace the partnumber field with the actual variable -  # add records for makemodel - -  # if there is a $form->{id} then replace the old entry -  # delete all makemodel entries and add the new ones - -  # escape ' -  map { $form->{$_} =~ s/'/''/g } qw(partnumber description notes unit bin); - -  # undo amount formatting -  map { $form->{$_} = $form->parse_amount($myconfig, $form->{$_}) } qw(rop weight listprice sellprice lastcost stock); -   -  # set date to NULL if nothing entered -  $form->{priceupdate} = ($form->{priceupdate}) ? qq|'$form->{priceupdate}'| : "NULL"; -   -  $form->{makemodel} = (($form->{make_1}) || ($form->{model_1})) ? 1 : 0; - -  $form->{alternate} = 0; -  $form->{assembly} = ($form->{item} eq 'assembly') ? 1 : 0; -  $form->{obsolete} *= 1; -  $form->{onhand} *= 1; - -  my ($query, $sth); -   -  if ($form->{id}) { - -    # get old price -    $query = qq|SELECT sellprice, weight -                FROM parts -		WHERE id = $form->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    my ($sellprice, $weight) = $sth->fetchrow_array; -    $sth->finish; - -    # if item is part of an assembly adjust all assemblies -    $query = qq|SELECT id, qty -                FROM assembly -		WHERE parts_id = $form->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while (my ($id, $qty) = $sth->fetchrow_array) { -      &update_assembly($dbh, $form, $id, $qty * 1, $sellprice * 1, $weight * 1); -    } -    $sth->finish; - - -    if ($form->{item} ne 'service') { -      # delete makemodel records -      $query = qq|DELETE FROM makemodel -		  WHERE parts_id = $form->{id}|; -      $dbh->do($query) || $form->dberror($query); -    } - -    if ($form->{item} eq 'assembly') { -      if ($form->{onhand} != 0) { -	&adjust_inventory($dbh, $form, $form->{id}, $form->{onhand} * -1); -      } -       -      if ($form->{orphaned}) { -	# delete assembly records -	$query = qq|DELETE FROM assembly -		    WHERE id = $form->{id}|; -	$dbh->do($query) || $form->dberror($query); -      } else { -        # update BOM only -	$query = qq|UPDATE assembly -	            SET bom = ? -		    WHERE id = ? -		    AND parts_id = ?|; -	$sth = $dbh->prepare($query); -	 -	for $i (1 .. $form->{assembly_rows} - 1) { -          $sth->execute(($form->{"bom_$i"}) ? '1' : '0', $form->{id}, $form->{"id_$i"}) || $form->dberror($query); -	} -	$sth->finish; -      } -       -      $form->{onhand} += $form->{stock}; -    } -     -    # delete tax records -    $query = qq|DELETE FROM partstax -		WHERE parts_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -  } else { -    my $uid = time; -    $uid .= $form->{login}; - -    $query = qq|INSERT INTO parts (partnumber) -                VALUES ('$uid')|; -    $dbh->do($query) || $form->dberror($query); - -    $query = qq|SELECT id FROM parts -                WHERE partnumber = '$uid'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{id}) = $sth->fetchrow_array; -    $sth->finish; - -    $form->{orphaned} = 1; -    $form->{onhand} = ($form->{stock} * 1) if $form->{item} eq 'assembly'; -     -  } -   -  my $partsgroup_id = 0; -  if ($form->{partsgroup}) { -    my $partsgroup = lc $form->{partsgroup}; -    $query = qq|SELECT DISTINCT id FROM partsgroup -		WHERE lower(partsgroup) = '$partsgroup'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($partsgroup_id) = $sth->fetchrow_array; -    $sth->finish; - -    if (!$partsgroup_id) { -      $query = qq|INSERT INTO partsgroup (partsgroup) -                  VALUES ('$form->{partsgroup}')|; -      $dbh->do($query) || $form->dberror($query); - -      $query = qq|SELECT id FROM partsgroup -                  WHERE partsgroup = '$form->{partsgroup}'|; -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      ($partsgroup_id) = $sth->fetchrow_array; -      $sth->finish; -    } -  } -   -   -  $query = qq|UPDATE parts SET  -	      partnumber = '$form->{partnumber}', -	      description = '$form->{description}', -	      makemodel = '$form->{makemodel}', -	      alternate = '$form->{alternate}', -	      assembly = '$form->{assembly}', -	      listprice = $form->{listprice}, -	      sellprice = $form->{sellprice}, -	      lastcost = $form->{lastcost}, -	      weight = $form->{weight}, -	      priceupdate = $form->{priceupdate}, -	      unit = '$form->{unit}', -	      notes = '$form->{notes}', -	      rop = $form->{rop}, -	      bin = '$form->{bin}', -	      inventory_accno_id = (SELECT id FROM chart -				    WHERE accno = '$form->{inventory_accno}'), -	      income_accno_id = (SELECT id FROM chart -				 WHERE accno = '$form->{income_accno}'), -	      expense_accno_id = (SELECT id FROM chart -				  WHERE accno = '$form->{expense_accno}'), -              obsolete = '$form->{obsolete}', -	      image = '$form->{image}', -	      drawing = '$form->{drawing}', -	      microfiche = '$form->{microfiche}', -	      partsgroup_id = $partsgroup_id -	      WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  -  # insert makemodel records -  unless ($form->{item} eq 'service') { -    for my $i (1 .. $form->{makemodel_rows}) { -      # put make and model together -      if (($form->{"make_$i"}) || ($form->{"model_$i"})) { -	map { $form->{"${_}_$i"} =~ s/'/''/g } qw(make model); -	 -	$query = qq|INSERT INTO makemodel (parts_id, name) -		    VALUES ($form->{id}, -		    '$form->{"make_$i"}:$form->{"model_$i"}')|; -	$dbh->do($query) || $form->dberror($query); -      } -    } -  } - - -  # insert taxes -  foreach $item (split / /, $form->{taxaccounts}) { -    if ($form->{"IC_tax_$item"}) { -      $query = qq|INSERT INTO partstax (parts_id, chart_id) -                  VALUES ($form->{id},  -		          (SELECT id -			   FROM chart -			   WHERE accno = '$item'))|; -      $dbh->do($query) || $form->dberror($query); -    } -  } - -  # add assembly records -  if ($form->{item} eq 'assembly') { -     -    if ($form->{orphaned}) { -      for my $i (1 .. $form->{assembly_rows}) { -	$form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); -	 -	if ($form->{"qty_$i"} != 0) { -	  $form->{"bom_$i"} *= 1; -	  $query = qq|INSERT INTO assembly (id, parts_id, qty, bom) -		      VALUES ($form->{id}, $form->{"id_$i"}, -		      $form->{"qty_$i"}, '$form->{"bom_$i"}')|; -	  $dbh->do($query) || $form->dberror($query); -	} -      } -    } -     -    # adjust onhand for the assembly -    if ($form->{onhand} != 0) { -      &adjust_inventory($dbh, $form, $form->{id}, $form->{onhand}); -    } -     -  } - -  -  # commit -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - - -sub update_assembly { -  my ($dbh, $form, $id, $qty, $sellprice, $weight) = @_; - -  my $query = qq|SELECT id, qty -                 FROM assembly -		 WHERE parts_id = $id|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my ($pid, $aqty) = $sth->fetchrow_array) { -    &update_assembly($dbh, $form, $pid, $aqty * $qty, $sellprice, $weight); -  } -  $sth->finish; - -  $query = qq|UPDATE parts -              SET sellprice = sellprice + -	          $qty * ($form->{sellprice} - $sellprice), -                  weight = weight + -		  $qty * ($form->{weight} - $weight) -	      WHERE id = $id|; -  $dbh->do($query) || $form->dberror($query); - -} - - - -sub retrieve_assemblies { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $where = '1 = 1'; -   -  if ($form->{partnumber}) { -    my $partnumber = $form->like(lc $form->{partnumber}); -    $where .= " AND lower(p.partnumber) LIKE '$partnumber'"; -  } -   -  if ($form->{description}) { -    my $description = $form->like(lc $form->{description}); -    $where .= " AND lower(p.description) LIKE '$description'"; -  } -  $where .= " AND NOT p.obsolete = '1'"; - -  # retrieve assembly items -  my $query = qq|SELECT p.id, p.partnumber, p.description, -                 p.bin, p.onhand, p.rop, -		   (SELECT sum(p2.inventory_accno_id) -		    FROM parts p2, assembly a -		    WHERE p2.id = a.parts_id -		    AND a.id = p.id) AS inventory -                 FROM parts p - 		 WHERE $where -		 AND assembly = '1'|; - -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -   -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{assembly_items} }, $ref if $ref->{inventory}; -  } -  $sth->finish; - -  $dbh->disconnect; -   -} - - -sub restock_assemblies { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); -   -  for my $i (1 .. $form->{rowcount}) { - -    $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); - -    if ($form->{"qty_$i"} != 0) { -      &adjust_inventory($dbh, $form, $form->{"id_$i"}, $form->{"qty_$i"}); -    } - -  } -   -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; - -} - - -sub adjust_inventory { -  my ($dbh, $form, $id, $qty) = @_; - -  my $query = qq|SELECT p.id, p.inventory_accno_id, p.assembly, a.qty -		 FROM parts p -		 JOIN assembly a ON (a.parts_id = p.id) -		 WHERE a.id = $id|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - -    my $allocate = $qty * $ref->{qty}; -     -    # is it a service item, then loop -    $ref->{inventory_accno_id} *= 1; -    next if (($ref->{inventory_accno_id} == 0) && !$ref->{assembly}); -     -    # adjust parts onhand -    $form->update_balance($dbh, -			  "parts", -			  "onhand", -			  qq|id = $ref->{id}|, -			  $allocate * -1); -  } - -  $sth->finish; - -  # update assembly -  $form->update_balance($dbh, -			"parts", -			"onhand", -			qq|id = $id|, -			$qty); -  -} - - -sub delete { -  my ($self, $myconfig, $form) = @_; - -  # connect to database, turn off AutoCommit -  my $dbh = $form->dbconnect_noauto($myconfig); -   -  if ($form->{item} eq 'assembly' && $form->{onhand} != 0) { -    # adjust onhand for the assembly -    &adjust_inventory($dbh, $form, $form->{id}, $form->{onhand} * -1); -  } - -  my $query = qq|DELETE FROM parts - 	         WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  $query = qq|DELETE FROM partstax -	      WHERE parts_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  # check if it is a part, assembly or service -  if ($form->{item} eq 'part') { -    $query = qq|DELETE FROM makemodel -		WHERE parts_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); -  } - -  if ($form->{item} eq 'assembly') { -    $query = qq|DELETE FROM assembly -		WHERE id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); -  } -   -  if ($form->{item} eq 'alternate') { -    $query = qq|DELETE FROM alternate -		WHERE id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); -  } - -  # commit -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - -sub assembly_item { -  my ($self, $myconfig, $form) = @_; - -  my $i = $form->{assembly_rows}; -  my $var; -  my $where = "1 = 1"; - -  if ($form->{"partnumber_$i"}) { -    $var = $form->like(lc $form->{"partnumber_$i"}); -    $where .= " AND lower(p.partnumber) LIKE '$var'"; -  } -  if ($form->{"description_$i"}) { -    $var = $form->like(lc $form->{"description_$i"}); -    $where .= " AND lower(p.description) LIKE '$var'"; -  } -  if ($form->{"partsgroup_$i"}) { -    $var = $form->like(lc $form->{"partsgroup_$i"}); -    $where .= " AND lower(pg.partsgroup) LIKE '$var'"; -  } -   -  if ($form->{id}) { -    $where .= " AND NOT p.id = $form->{id}"; -  } - -  if ($partnumber) { -    $where .= " ORDER BY p.partnumber"; -  } else { -    $where .= " ORDER BY p.description"; -  } - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT p.id, p.partnumber, p.description, p.sellprice, -                 p.weight, p.onhand, p.unit, -		 pg.partsgroup -		 FROM parts p -		 LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		 WHERE $where|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{item_list} }, $ref; -  } -   -  $sth->finish; -  $dbh->disconnect; -   -} - - -sub all_parts { -  my ($self, $myconfig, $form) = @_; - -  my $where = '1 = 1'; -  my $var; -   -  foreach my $item (qw(partnumber drawing microfiche)) { -    if ($form->{$item}) { -      $var = $form->like(lc $form->{$item}); -      $where .= " AND lower(p.$item) LIKE '$var'"; -    } -  } -  # special case for description -  if ($form->{description}) { -    unless ($form->{bought} || $form->{sold} || $form->{onorder} || $form->{ordered}) { -      $var = $form->like(lc $form->{description}); -      $where .= " AND lower(p.description) LIKE '$var'"; -    } -  } - -  if ($form->{searchitems} eq 'part') { -    $where .= " AND p.inventory_accno_id > 0"; -  } -  if ($form->{searchitems} eq 'assembly') { -    $form->{bought} = ""; -    $where .= " AND p.assembly = '1'"; -  } -  if ($form->{searchitems} eq 'service') { -    $where .= " AND p.inventory_accno_id IS NULL AND NOT p.assembly = '1'"; -    # irrelevant for services -    $form->{make} = $form->{model} = ""; -  } - -  # items which were never bought, sold or on an order -  if ($form->{itemstatus} eq 'orphaned') { -    $form->{onhand} = $form->{short} = 0; -    $form->{bought} = $form->{sold} = 0; -    $form->{onorder} = $form->{ordered} = 0; -    $form->{transdatefrom} = $form->{transdateto} = ""; -     -    $where .= " AND p.onhand = 0 -                AND p.id NOT IN (SELECT p.id FROM parts p, invoice i -				 WHERE p.id = i.parts_id) -		AND p.id NOT IN (SELECT p.id FROM parts p, assembly a -				 WHERE p.id = a.parts_id) -                AND p.id NOT IN (SELECT p.id FROM parts p, orderitems o -				 WHERE p.id = o.parts_id)"; -  } -   -  if ($form->{itemstatus} eq 'active') { -    $where .= " AND p.obsolete = '0'"; -  } -  if ($form->{itemstatus} eq 'obsolete') { -    $where .= " AND p.obsolete = '1'"; -    $form->{onhand} = $form->{short} = 0; -  } -  if ($form->{itemstatus} eq 'onhand') { -    $where .= " AND p.onhand > 0"; -  } -  if ($form->{itemstatus} eq 'short') { -    $where .= " AND p.onhand < 0"; -  } - -  if ($form->{make}) { -    $var = $form->like(lc $form->{make}).":%"; -    $where .= " AND p.id IN (SELECT DISTINCT ON (m.parts_id) m.parts_id -                           FROM makemodel m WHERE lower(m.name) LIKE '$var')"; -  } -  if ($form->{model}) { -    $var = "%:".$form->like($form->{model}); -    $where .= " AND p.id IN (SELECT DISTINCT ON (m.parts_id) m.parts_id -                           FROM makemodel m WHERE lower(m.name) LIKE '$var')"; -  } -  if ($form->{partsgroup}) { -    $var = $form->like(lc $form->{partsgroup}); -    $where .= " AND lower(pg.partsgroup) LIKE '$var'"; -     -  } - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -   -  my $sortorder = join ', ', $form->sort_columns(qw(partnumber description bin priceupdate partsgroup)); -  $sortorder = $form->{sort} unless $sortorder; - -  my $query = qq|SELECT p.id, p.partnumber, p.description, p.onhand, p.unit, -                 p.bin, p.sellprice, p.listprice, p.lastcost, p.rop, p.weight, -		 p.priceupdate, p.image, p.drawing, p.microfiche, -		 pg.partsgroup -                 FROM parts p -                 LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -  	         WHERE $where -	         ORDER BY $sortorder|; - -  # rebuild query for bought and sold items -  if ($form->{bought} || $form->{sold} || $form->{onorder} || $form->{ordered}) { -     -    my $union = ""; -    $query = ""; -   -    if ($form->{bought} || $form->{sold}) { -       -      my $invwhere = "$where"; -      $invwhere .= " AND i.assemblyitem = '0'"; -      $invwhere .= " AND a.transdate >= '$form->{transdatefrom}'" if $form->{transdatefrom}; -      $invwhere .= " AND a.transdate <= '$form->{transdateto}'" if $form->{transdateto}; - -      if ($form->{description}) { -	$var = $form->like(lc $form->{description}); -	$invwhere .= " AND lower(i.description) LIKE '$var'"; -      } - -      my $flds = qq|p.id, p.partnumber, i.description, -                    i.qty AS onhand, i.unit, p.bin, i.sellprice, -		    p.listprice, p.lastcost, p.rop, p.weight, -		    p.priceupdate, p.image, p.drawing, p.microfiche, -		    pg.partsgroup, -		    a.invnumber, a.ordnumber, i.trans_id|; - -      if ($form->{bought}) { -	$query = qq| -	            SELECT $flds, 'ir' AS module, '' AS type, -		    1 AS exchangerate -		    FROM parts p -		    JOIN invoice i ON (i.parts_id = p.id) -		    JOIN ap a ON (i.trans_id = a.id) -                    LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		    WHERE $invwhere|; -	$union = " -	          UNION"; -      } - -      if ($form->{sold}) { -	$query .= qq|$union -                     SELECT $flds, 'is' AS module, '' AS type, -		     1 As exchangerate -		     FROM parts p -		     JOIN invoice i ON (i.parts_id = p.id) -		     JOIN ar a ON (i.trans_id = a.id) -                     LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		     WHERE $invwhere|; -	$union = " -	          UNION"; -      } -    } - -    if ($form->{onorder} || $form->{ordered}) { -      my $ordwhere = "$where"; -      $ordwhere .= " AND o.closed = '0'" unless $form->{closed}; -       -      $ordwhere .= " AND o.transdate >= '$form->{transdatefrom}'" if $form->{transdatefrom}; -      $ordwhere .= " AND o.transdate <= '$form->{transdateto}'" if $form->{transdateto}; - -      if ($form->{description}) { -	$var = $form->like(lc $form->{description}); -	$ordwhere .= " AND lower(oi.description) LIKE '$var'"; -      } - -      $flds = qq|p.id, p.partnumber, oi.description, -                 oi.qty AS onhand, oi.unit, p.bin, oi.sellprice, -	         p.listprice, p.lastcost, p.rop, p.weight, -		 p.priceupdate, p.image, p.drawing, p.microfiche, -		 pg.partsgroup, -		 '' AS invnumber, o.ordnumber, oi.trans_id|; - -      if ($form->{ordered}) { -	$query .= qq|$union -                     SELECT $flds, 'oe' AS module, 'sales_order' AS type, -		    (SELECT buy FROM exchangerate ex -		     WHERE ex.curr = o.curr -		     AND ex.transdate = o.transdate) AS exchangerate -		     FROM parts p -		     JOIN orderitems oi ON (oi.parts_id = p.id) -		     JOIN oe o ON (oi.trans_id = o.id) -                     LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		     WHERE $ordwhere -		     AND o.customer_id > 0|; -	$union = " -	          UNION"; -      } -       -      if ($form->{onorder}) { -        $flds = qq|p.id, p.partnumber, oi.description, -                   oi.qty * -1 AS onhand, oi.unit, p.bin, oi.sellprice, -		   p.listprice, p.lastcost, p.rop, p.weight, -		   p.priceupdate, p.image, p.drawing, p.microfiche, -		   pg.partsgroup, -		   '' AS invnumber, o.ordnumber, oi.trans_id|; - -	$query .= qq|$union -	            SELECT $flds, 'oe' AS module, 'purchase_order' AS type, -		    (SELECT sell FROM exchangerate ex -		     WHERE ex.curr = o.curr -		     AND ex.transdate = o.transdate) AS exchangerate -		    FROM parts p -		    JOIN orderitems oi ON (oi.parts_id = p.id) -		    JOIN oe o ON (oi.trans_id = o.id) -                    LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		    WHERE $ordwhere -		    AND o.vendor_id > 0|; -      } - -    } - -    $query .= qq| -		 ORDER BY $sortorder|; - -  } - -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{parts} }, $ref; -  } - -  $sth->finish; - - -  # include individual items for assemblies -  if ($form->{searchitems} eq 'assembly' && $form->{bom}) { -    foreach $item (@{ $form->{parts} }) { -      push @assemblies, $item; -      $query = qq|SELECT p.id, p.partnumber, p.description, a.qty AS onhand, -                  p.unit, p.bin, -                  p.sellprice, p.listprice, p.lastcost, -		  p.rop, p.weight, p.priceupdate, -		  p.image, p.drawing, p.microfiche -		  FROM parts p -		  JOIN assembly a ON (p.id = a.parts_id) -		  WHERE a.id = $item->{id}|; -       -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -	$ref->{assemblyitem} = 1; -	push @assemblies, $ref; -      } -      $sth->finish; - -      push @assemblies, {id => $item->{id}}; - -    } - -    # copy assemblies to $form->{parts} -    @{ $form->{parts} } = @assemblies; -     -  } - -  $dbh->disconnect; - -} - - -sub create_links { -  my ($self, $module, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT accno, description, link -                 FROM chart -		 WHERE link LIKE '%$module%' -		 ORDER BY accno|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    foreach my $key (split(/:/, $ref->{link})) { -      if ($key =~ /$module/) { -	push @{ $form->{"${module}_links"}{$key} }, { accno => $ref->{accno}, -				      description => $ref->{description} }; -      } -    } -  } - -  $sth->finish; - -  if ($form->{id}) { -    $query = qq|SELECT weightunit -                FROM defaults|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{weightunit}) = $sth->fetchrow_array; -    $sth->finish; - -  } else { -    $query = qq|SELECT weightunit, current_date -                FROM defaults|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{weightunit}, $form->{priceupdate}) = $sth->fetchrow_array; -    $sth->finish; -  } -   -  $dbh->disconnect; - -} - - -1; - diff --git a/sql-ledger/SL/IR.pm b/sql-ledger/SL/IR.pm deleted file mode 100644 index 357533e17..000000000 --- a/sql-ledger/SL/IR.pm +++ /dev/null @@ -1,995 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Inventory received module -# -#====================================================================== - -package IR; - - -sub post_invoice { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database, turn off autocommit -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my ($query, $sth, $null, $project_id); -  my $exchangerate = 0; - -  if ($form->{id}) { - -    &reverse_invoice($dbh, $form); - -  } else { -    my $uid = time; -    $uid .= $form->{login}; - -    $query = qq|INSERT INTO ap (invnumber, employee_id) -                VALUES ('$uid', (SELECT id FROM employee -		                 WHERE login = '$form->{login}'))|; -    $dbh->do($query) || $form->dberror($query); -     -    $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; -  } - -  map { $form->{$_} =~ s/'/''/g } qw(invnumber ordnumber); -   -  my ($amount, $linetotal, $lastinventoryaccno, $lastexpenseaccno); -  my ($netamount, $invoicediff, $expensediff) = (0, 0, 0); - -  if ($form->{currency} eq $form->{defaultcurrency}) { -    $form->{exchangerate} = 1; -  } else { -    $exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, 'sell'); -  } -   -  $form->{exchangerate} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{exchangerate}); - -   -  for my $i (1 .. $form->{rowcount}) { -    $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); -     -    if ($form->{"qty_$i"} != 0) { -       -      map { $form->{"${_}_$i"} =~ s/'/''/g } qw(partnumber description unit); -       -      my ($allocated, $taxrate) = (0, 0); -      my $taxamount; -       -      $form->{"sellprice_$i"} = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); -      my $fxsellprice = $form->{"sellprice_$i"}; - -      my ($dec) = ($fxsellprice =~ /\.(\d+)/); -      $dec = length $dec; -      my $decimalplaces = ($dec > 2) ? $dec : 2; -       -       -      map { $taxrate += $form->{"${_}_rate"} } split / /, $form->{"taxaccounts_$i"}; - -      if ($form->{"inventory_accno_$i"}) { - -	$linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2); -	 -	if ($form->{taxincluded}) { -	  $taxamount = $linetotal * ($taxrate / (1 + $taxrate)); -	  $form->{"sellprice_$i"} = $form->{"sellprice_$i"} * (1 / (1 + $taxrate)); -	} else { -	  $taxamount = $linetotal * $taxrate; -	} - -	$netamount += $linetotal; -	 -	if ($taxamount != 0) { -	  map { $form->{amount}{$form->{id}}{$_} -= $taxamount * $form->{"${_}_rate"} / $taxrate } split / /, $form->{"taxaccounts_$i"}; -	} - -	# add purchase to inventory, this one is without the tax! -	$amount = $form->{"sellprice_$i"} * $form->{"qty_$i"} * $form->{exchangerate}; -	$linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2) * $form->{exchangerate}; -	$linetotal = $form->round_amount($linetotal, 2); - -        # this is the difference for the inventory -	$invoicediff += ($amount - $linetotal); -	 -	$form->{amount}{$form->{id}}{$form->{"inventory_accno_$i"}} -= $linetotal; - -        # adjust and round sellprice -	$form->{"sellprice_$i"} = $form->round_amount($form->{"sellprice_$i"} * $form->{exchangerate}, $decimalplaces); - -	 -	# update parts table -	$query = qq|UPDATE parts SET -		    lastcost = $form->{"sellprice_$i"}, -		    onhand = onhand + $form->{"qty_$i"} -	            WHERE id = $form->{"id_$i"}|; -	$dbh->do($query) || $form->dberror($query); - - -        # check if we sold the item already and -        # make an entry for the expense and inventory -	$query = qq|SELECT i.id, i.qty, i.allocated, i.trans_id, -		    p.inventory_accno_id, p.expense_accno_id, a.transdate -		    FROM invoice i, ar a, parts p -		    WHERE i.parts_id = p.id -	            AND i.parts_id = $form->{"id_$i"} -		    AND (i.qty + i.allocated) > 0 -		    AND i.trans_id = a.id -		    ORDER BY transdate|; -	$sth = $dbh->prepare($query); -	$sth->execute || $form->dberror($query); - - -        my $totalqty = $form->{"qty_$i"}; -	 -	while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -	   -	  my $qty = $ref->{qty} + $ref->{allocated}; -	   -	  if (($qty - $totalqty) > 0) { -	    $qty = $totalqty; -	  } - - -          $linetotal = $form->round_amount($form->{"sellprice_$i"} * $qty, 2); -	   -	  if ($ref->{allocated} < 0) { -	    # we have an entry for it already, adjust amount -	    $form->update_balance($dbh, -				  "acc_trans", -				  "amount", -				  qq|trans_id = $ref->{trans_id} AND chart_id = $ref->{inventory_accno_id} AND transdate = '$ref->{transdate}'|, -				  $linetotal); - -	    $form->update_balance($dbh, -				  "acc_trans", -				  "amount", -				  qq|trans_id = $ref->{trans_id} AND chart_id = $ref->{expense_accno_id} AND transdate = '$ref->{transdate}'|, -				  $linetotal * -1); - -	  } else { -	    # add entry for inventory, this one is for the sold item -	    if ($linetotal != 0) { -	      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,  -			  transdate) -			  VALUES ($ref->{trans_id}, $ref->{inventory_accno_id}, -			  $linetotal, '$ref->{transdate}')|; -	      $dbh->do($query) || $form->dberror($query); - -	      # add expense -	      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,  -			  transdate) -			  VALUES ($ref->{trans_id}, $ref->{expense_accno_id}, -			  |. ($linetotal * -1) .qq|, '$ref->{transdate}')|; -	      $dbh->do($query) || $form->dberror($query); -	    } -	  } -	 -	  # update allocated for sold item -	  $form->update_balance($dbh, -				"invoice", -				"allocated", -				qq|id = $ref->{id}|, -				$qty * -1); -	 -	  $allocated += $qty; - -	  last if (($totalqty -= $qty) <= 0); -	} - -	$sth->finish; - -        $lastinventoryaccno = $form->{"inventory_accno_$i"}; -	 -      } else { -	 -	$linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2); -	 -        if ($form->{taxincluded}) { -	  $taxamount = $linetotal * ($taxrate / (1 + $taxrate)); -	   -	  $form->{"sellprice_$i"} = $form->{"sellprice_$i"} * (1 / (1 + $taxrate)); -	} else { -	  $taxamount = $linetotal * $taxrate; -	} -	 -	$netamount += $linetotal; -	 -        if ($taxamount != 0) { -	  map { $form->{amount}{$form->{id}}{$_} -= $taxamount * $form->{"${_}_rate"} / $taxrate } split / /, $form->{"taxaccounts_$i"}; -	} - -        $amount = $form->{"sellprice_$i"} * $form->{"qty_$i"} * $form->{exchangerate}; -	$linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2) * $form->{exchangerate}; -	$linetotal = $form->round_amount($linetotal, 2); - -        # this is the difference for expense -	$expensediff += ($amount - $linetotal); -	 -	# add amount to expense -	$form->{amount}{$form->{id}}{$form->{"expense_accno_$i"}} -= $linetotal; - -	$lastexpenseaccno = $form->{"expense_accno_$i"}; - -        # adjust and round sellprice -        $form->{"sellprice_$i"} = $form->round_amount($form->{"sellprice_$i"} * $form->{exchangerate}, $decimalplaces); -	 -	# update lastcost -	$query = qq|UPDATE parts SET -		    lastcost = $form->{"sellprice_$i"} -	            WHERE id = $form->{"id_$i"}|; -	$dbh->do($query) || $form->dberror($query); - -      } - -      $project_id = 'NULL'; -      if ($form->{"project_id_$i"}) { -	$project_id = $form->{"project_id_$i"}; -      } -      $deliverydate = ($form->{"deliverydate_$i"}) ? qq|'$form->{"deliverydate_$i"}'| : "NULL"; -       -      # save detail record in invoice table -      $query = qq|INSERT INTO invoice (trans_id, parts_id, description, qty, -                  sellprice, fxsellprice, allocated, unit, deliverydate) -		  VALUES ($form->{id}, $form->{"id_$i"}, -		  '$form->{"description_$i"}', |. ($form->{"qty_$i"} * -1) .qq|, -		  $form->{"sellprice_$i"}, $fxsellprice, $allocated, -		  '$form->{"unit_$i"}', $deliverydate)|; -      $dbh->do($query) || $form->dberror($query); - -    } -  } - - -  $form->{datepaid} = $form->{invdate}; - -  # all amounts are in natural state, netamount includes the taxes -  # if tax is included, netamount is rounded to 2 decimal places, -  # taxes are not -   -  # total payments -  for my $i (1 .. $form->{paidaccounts}) { -    $form->{"paid_$i"} = $form->parse_amount($myconfig, $form->{"paid_$i"}); -    $form->{paid} += $form->{"paid_$i"}; -    $form->{datepaid} = $form->{"datepaid_$i"} if ($form->{"datepaid_$i"});  -  } - -  my ($tax, $paiddiff) = (0, 0); - -  $netamount = $form->round_amount($netamount, 2); -   -  # figure out rounding errors for amount paid and total amount -  if ($form->{taxincluded}) { - -    $amount = $form->round_amount($netamount * $form->{exchangerate}, 2); -    $paiddiff = $amount - $netamount * $form->{exchangerate}; -    $netamount = $amount; - -    foreach my $item (split / /, $form->{taxaccounts}) { -      $amount = $form->{amount}{$form->{id}}{$item} * $form->{exchangerate}; -      $form->{amount}{$form->{id}}{$item} = $form->round_amount($amount, 2); -      $amount = $form->{amount}{$form->{id}}{$item} * -1; -      $tax += $amount; -      $netamount -= $amount; -    } - -    $invoicediff += $paiddiff; -    $expensediff += $paiddiff; -     -    ######## this only applies to tax included -    if ($lastinventoryaccno) { -      $form->{amount}{$form->{id}}{$lastinventoryaccno} -= $invoicediff; -    } -    if ($lastexpenseaccno) { -      $form->{amount}{$form->{id}}{$lastexpenseaccno} -= $expensediff; -    } - -  } else { -    $amount = $form->round_amount($netamount * $form->{exchangerate}, 2); -    $paiddiff = $amount - $netamount * $form->{exchangerate}; -    $netamount = $amount; -    foreach my $item (split / /, $form->{taxaccounts}) { -      $form->{amount}{$form->{id}}{$item} = $form->round_amount($form->{amount}{$form->{id}}{$item}, 2); -      $amount = $form->round_amount($form->{amount}{$form->{id}}{$item} * $form->{exchangerate} * -1, 2); -      $paiddiff += $amount - $form->{amount}{$form->{id}}{$item} * $form->{exchangerate} * -1; -      $form->{amount}{$form->{id}}{$item} = $form->round_amount($amount * -1, 2); -      $amount = $form->{amount}{$form->{id}}{$item} * -1; -      $tax += $amount; -    } -  } - - -  $form->{amount}{$form->{id}}{$form->{AP}} = $netamount + $tax; - -  if ($form->{paid} != 0) { -    $form->{paid} = $form->round_amount($form->{paid} * $form->{exchangerate} + $paiddiff, 2); -  } - - -  # update exchangerate -  if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -    $form->update_exchangerate($dbh, $form->{currency}, $form->{invdate}, 0, $form->{exchangerate}); -  } -   -  # record acc_trans transactions -  foreach my $trans_id (keys %{$form->{amount}}) { -    foreach my $accno (keys %{ $form->{amount}{$trans_id} }) { -      if (($form->{amount}{$trans_id}{$accno} = $form->round_amount($form->{amount}{$trans_id}{$accno}, 2)) != 0) { -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,  -		    transdate) -		    VALUES ($trans_id, (SELECT id FROM chart -		                         WHERE accno = '$accno'), -		    $form->{amount}{$trans_id}{$accno}, '$form->{invdate}')|; -	$dbh->do($query) || $form->dberror($query); -      } -    } -  } - -  # deduct payment differences from paiddiff -  for my $i (1 .. $form->{paidaccounts}) { -    if ($form->{"paid_$i"} != 0) { -      $amount = $form->round_amount($form->{"paid_$i"} * $form->{exchangerate}, 2); -      $paiddiff -= $amount - $form->{"paid_$i"} * $form->{exchangerate}; -    } -  } - -  # force AP entry if 0 -  $form->{amount}{$form->{id}}{$form->{AP}} = $form->{paid} if ($form->{amount}{$form->{id}}{$form->{AP}} == 0); -   -  # record payments and offsetting AP -  for my $i (1 .. $form->{paidaccounts}) { - -    if ($form->{"paid_$i"} != 0) { -      my ($accno) = split /--/, $form->{"AP_paid_$i"}; -      $form->{"datepaid_$i"} = $form->{invdate} unless ($form->{"datepaid_$i"}); -      $form->{datepaid} = $form->{"datepaid_$i"}; -       -      $amount = ($form->round_amount($form->{"paid_$i"} * $form->{exchangerate} + $paiddiff, 2)) * -1; -       -      # record AP -       -      if ($form->{amount}{$form->{id}}{$form->{AP}} != 0) { -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -		    transdate) -		    VALUES ($form->{id}, (SELECT id FROM chart -					WHERE accno = '$form->{AP}'), -		    $amount, '$form->{"datepaid_$i"}')|; -	$dbh->do($query) || $form->dberror($query); -      } - -      # record payment -       -      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, -                  source) -                  VALUES ($form->{id}, (SELECT id FROM chart -		                      WHERE accno = '$accno'), -                  $form->{"paid_$i"}, '$form->{"datepaid_$i"}', -		  '$form->{"source_$i"}')|; -      $dbh->do($query) || $form->dberror($query); - - -      $exchangerate = 0; - -      if ($form->{currency} eq $form->{defaultcurrency}) { -	$form->{"exchangerate_$i"} = 1; -      } else { -	$exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{"datepaid_$i"}, 'sell'); - -	$form->{"exchangerate_$i"} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{"exchangerate_$i"}); -      } -       - -      # exchangerate difference -      $form->{fx}{$accno}{$form->{"datepaid_$i"}} += $form->{"paid_$i"} * ($form->{"exchangerate_$i"} - 1) + $paiddiff; -       - -      # gain/loss -      $amount = ($form->{"paid_$i"} * $form->{exchangerate}) - ($form->{"paid_$i"} * $form->{"exchangerate_$i"}); -      if ($amount > 0) { -	$form->{fx}{$form->{fxgain_accno}}{$form->{"datepaid_$i"}} += $amount; -      } else { -	$form->{fx}{$form->{fxloss_accno}}{$form->{"datepaid_$i"}} += $amount; -      } -       -      $paiddiff = 0; - -      # update exchange rate -      if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -	$form->update_exchangerate($dbh, $form->{currency}, $form->{"datepaid_$i"}, 0, $form->{"exchangerate_$i"}); -      } -    } -  } - -  # record exchange rate differences and gains/losses -  foreach my $accno (keys %{$form->{fx}}) { -    foreach my $transdate (keys %{ $form->{fx}{$accno} }) { -      if (($form->{fx}{$accno}{$transdate} = $form->round_amount($form->{fx}{$accno}{$transdate}, 2)) != 0) { - -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -	            transdate, cleared, fx_transaction) -	            VALUES ($form->{id}, (SELECT id FROM chart -		                        WHERE accno = '$accno'), -                    $form->{fx}{$accno}{$transdate}, '$transdate', '0', '1')|; -        $dbh->do($query) || $form->dberror($query); -      } -    } -  } - - -  $amount = $netamount + $tax; - -  # set values which could be empty -  $form->{taxincluded} *= 1; -  my $datepaid = ($form->{paid}) ? qq|'$form->{datepaid}'| : "NULL"; -  my $duedate = ($form->{duedate}) ? qq|'$form->{duedate}'| : "NULL"; -   -  # save AP record -  $query = qq|UPDATE ap set -              invnumber = '$form->{invnumber}', -	      ordnumber = '$form->{ordnumber}', -              transdate = '$form->{invdate}', -              vendor_id = $form->{vendor_id}, -              amount = $amount, -              netamount = $netamount, -              paid = $form->{paid}, -	      datepaid = $datepaid, -	      duedate = $duedate, -	      invoice = '1', -	      taxincluded = '$form->{taxincluded}', -	      notes = '$form->{notes}', -	      curr = '$form->{currency}' -              WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  # add shipto -  $form->{name} = $form->{vendor}; -  $form->{name} =~ s/--$form->{vendor_id}//; -  $form->add_shipto($dbh, $form->{id}); -   -  # delete zero entries -  $query = qq|DELETE FROM acc_trans -              WHERE amount = 0|; -  $dbh->do($query) || $form->dberror($query); -  -  my $rc = $dbh->commit; -  $dbh->disconnect; -  $rc; -   -} - - - -sub reverse_invoice { -  my ($dbh, $form) = @_; -   -  # reverse inventory items -  my $query = qq|SELECT i.parts_id, p.inventory_accno_id, p.expense_accno_id, -                 i.qty, i.allocated, i.sellprice -                 FROM invoice i, parts p -		 WHERE i.parts_id = p.id -                 AND i.trans_id = $form->{id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $netamount = 0; -   -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    $netamount += $form->round_amount($ref->{sellprice} * $ref->{qty} * -1, 2); - -    if ($ref->{inventory_accno_id}) { -      # update onhand -      $form->update_balance($dbh, -			    "parts", -			    "onhand", -			    qq|id = $ref->{parts_id}|, -			    $ref->{qty}); -  -      # if $ref->{allocated} > 0 than we sold that many items -      if ($ref->{allocated} > 0) { - -	# get references for sold items -	$query = qq|SELECT i.id, i.trans_id, i.allocated, a.transdate -	            FROM invoice i, ar a -		    WHERE i.parts_id = $ref->{parts_id} -		    AND i.allocated < 0 -		    AND i.trans_id = a.id -		    ORDER BY transdate DESC|; -	my $sth = $dbh->prepare($query); -	$sth->execute || $form->dberror($query); - -	while (my $pthref = $sth->fetchrow_hashref(NAME_lc)) { -	  my $qty = $ref->{allocated}; -	  if (($ref->{allocated} + $pthref->{allocated}) > 0) { -	    $qty = $pthref->{allocated} * -1; -	  } - -	  my $amount = $form->round_amount($ref->{sellprice} * $qty, 2); -	   -	  #adjust allocated -	  $form->update_balance($dbh, -				"invoice", -				"allocated", -				qq|id = $pthref->{id}|, -				$qty); -	   -	  $form->update_balance($dbh, -				"acc_trans", -				"amount", -				qq|trans_id = $pthref->{trans_id} AND chart_id = $ref->{expense_accno_id} AND transdate = '$pthref->{transdate}'|, -				$amount); -		       -	  $form->update_balance($dbh, -				"acc_trans", -				"amount", -				qq|trans_id = $pthref->{trans_id} AND chart_id = $ref->{inventory_accno_id} AND transdate = '$pthref->{transdate}'|, -				$amount * -1); - -	  last if (($ref->{allocated} -= $qty) <= 0); -	} -	$sth->finish; -      } -    } -  } -  $sth->finish; -   -  # delete acc_trans -  $query = qq|DELETE FROM acc_trans -              WHERE trans_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  # delete invoice entries -  $query = qq|DELETE FROM invoice -              WHERE trans_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  $query = qq|DELETE FROM shipto -              WHERE trans_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); -   -}  - - - -sub delete_invoice { -  my ($self, $myconfig, $form) = @_; - -  # 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}); - -  &reverse_invoice($dbh, $form); -   -  # delete zero entries -  my $query = qq|DELETE FROM acc_trans -                 WHERE amount = 0|; -  $dbh->do($query) || $form->dberror($query); - -  # delete AP record -  my $query = qq|DELETE FROM ap -                 WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - - -sub retrieve_invoice { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my $query; - -  if ($form->{id}) { -    # get default accounts and last invoice number -    $query = qq|SELECT (SELECT c.accno FROM chart c -                        WHERE d.inventory_accno_id = c.id) AS inventory_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.income_accno_id = c.id) AS income_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.expense_accno_id = c.id) AS expense_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.fxgain_accno_id = c.id) AS fxgain_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.fxloss_accno_id = c.id) AS fxloss_accno, -                d.curr AS currencies -	 	FROM defaults d|; -  } else { -    $query = qq|SELECT (SELECT c.accno FROM chart c -                        WHERE d.inventory_accno_id = c.id) AS inventory_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.income_accno_id = c.id) AS income_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.expense_accno_id = c.id) AS expense_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.fxgain_accno_id = c.id) AS fxgain_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.fxloss_accno_id = c.id) AS fxloss_accno, -                d.ponumber AS invnumber, d.curr AS currencies, -		current_date AS invdate -	 	FROM defaults d|; -  } -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $ref = $sth->fetchrow_hashref(NAME_lc); -  map { $form->{$_} = $ref->{$_} } keys %$ref; -  $sth->finish; - - -  if ($form->{id}) { -     -    # retrieve invoice -    $query = qq|SELECT a.invnumber, a.transdate AS invdate, a.duedate, -                a.ordnumber, a.paid, a.taxincluded, a.notes, a.curr AS currency -		FROM ap a -		WHERE id = $form->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $form->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; - -    $form->{exchangerate} = $form->get_exchangerate($dbh, $form->{currency}, $form->{invdate}, "sell"); -     -    # get shipto -    $query = qq|SELECT * FROM shipto -                WHERE trans_id = $form->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $form->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; -     -    # retrieve individual items -    $query = qq|SELECT c1.accno AS inventory_accno, -                       c2.accno AS income_accno, -		       c3.accno AS expense_accno, -		p.partnumber, i.description, i.qty, i.fxsellprice AS sellprice, -		i.parts_id AS id, i.unit, p.bin, i.deliverydate, -		pr.projectnumber, -                i.project_id, -		pg.partsgroup -		FROM invoice i -		JOIN parts p ON (i.parts_id = p.id) -		LEFT JOIN chart c1 ON (p.inventory_accno_id = c1.id) -		LEFT JOIN chart c2 ON (p.income_accno_id = c2.id) -		LEFT JOIN chart c3 ON (p.expense_accno_id = c3.id) -		LEFT JOIN project pr ON (i.project_id = pr.id) -		LEFT JOIN partsgroup pg ON (pg.id = p.partsgroup_id) -		WHERE trans_id = $form->{id} -		ORDER BY i.id|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while ($ref = $sth->fetchrow_hashref(NAME_lc)) { - -      # get tax rates for part -      $query = qq|SELECT c.accno -                  FROM chart c, partstax pt -	          WHERE pt.chart_id = c.id -	          AND pt.parts_id = $ref->{id}|; -      my $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      $ref->{taxaccounts} = ""; -      my $taxrate = 0; -       -      while (my $ptref = $sth->fetchrow_hashref(NAME_lc)) { -        $ref->{taxaccounts} .= "$ptref->{accno} "; -        $taxrate += $form->{"$ptref->{accno}_rate"}; -      } -       -      $sth->finish; -      chop $ref->{taxaccounts}; - -      $ref->{qty} *= -1; -       -      push @{ $form->{invoice_details} }, $ref; -       -    } -     -    $sth->finish; -     -  } else { - -    # up invoice number by 1 -    $form->{invnumber}++; - -    # save the new number -    $query = qq|UPDATE defaults -                SET ponumber = '$form->{invnumber}'|; -    $dbh->do($query) || $form->dberror($query); - -  } -   -   -  my $rc = $dbh->commit; -  $dbh->disconnect; -   -  $rc; -   -} - - - -sub get_vendor { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  my $dateformat = $myconfig->{dateformat}; -  $dateformat .= "yy" if $myconfig->{dateformat} !~ /^y/; - -  my $duedate = ($form->{invdate}) ? "to_date('$form->{invdate}', '$dateformat')" : "current_date"; - -  $form->{vendor_id} *= 1; -  # get vendor -  my $query = qq|SELECT taxincluded, terms, email, cc, bcc, -                 addr1, addr2, addr3, addr4, -                 $duedate + terms AS duedate -                 FROM vendor -	         WHERE id = $form->{vendor_id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  $ref = $sth->fetchrow_hashref(NAME_lc); -  map { $form->{$_} = $ref->{$_} } keys %$ref; -  $sth->finish; -   -  # get shipto if we do not convert an order or invoice -  if (!$form->{shipto}) { -    map { delete $form->{$_} } qw(shiptoname shiptoaddr1 shiptoaddr2 shiptoaddr3 shiptoaddr4 shiptocontact shiptophone shiptofax shiptoemail); - -    $query = qq|SELECT * FROM shipto -                WHERE trans_id = $form->{vendor_id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $form->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; -  } -   -  # get taxes for vendor -  $query = qq|SELECT c.accno -              FROM chart c, vendortax v -	      WHERE v.chart_id = c.id -	      AND v.vendor_id = $form->{vendor_id}|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $vendortax = (); -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    $vendortax{$ref->{accno}} = 1; -  } -  $sth->finish; - - -  # get tax rates and description -  $query = qq|SELECT c.accno, c.description, c.link, t.rate -              FROM chart c, tax t -              WHERE c.id = t.chart_id -	      AND c.link LIKE '%CT_tax%' -	      ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  $form->{taxaccounts} = ""; -  $form->{taxpart} = ""; -  $form->{taxservice} = ""; -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    if ($vendortax{$ref->{accno}}) { -      $form->{"$ref->{accno}_rate"} = $ref->{rate}; -      $form->{"$ref->{accno}_description"} = $ref->{description}; -      $form->{taxaccounts} .= "$ref->{accno} "; -    } -     -    foreach my $item (split /:/, $ref->{link}) { -      if ($item =~ /IC_taxpart/) { -	$form->{taxpart} .= "$ref->{accno} "; -      } -       -      if ($item =~ /IC_taxservice/) { -	$form->{taxservice} .= "$ref->{accno} "; -      } -    } -  } -  $sth->finish; -  chop $form->{taxaccounts}; -  chop $form->{taxpart}; -  chop $form->{taxservice}; - -  if (!$form->{id} && $form->{type} !~ /_order/) { -    # setup last accounts used -    $query = qq|SELECT c.accno, c.description, c.link, c.category -                FROM chart c -		JOIN acc_trans ac ON (ac.chart_id = c.id) -		JOIN ap a ON (a.id = ac.trans_id) -		WHERE a.vendor_id = $form->{vendor_id} -		AND NOT (c.link LIKE '%_tax%' OR c.link LIKE '%_paid%') -		AND a.id IN (SELECT max(id) FROM ap -		             WHERE vendor_id = $form->{vendor_id})|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    my $i = 0; -    while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -      if ($ref->{category} eq 'E') { -	$i++; -	$form->{"AP_amount_$i"} = "$ref->{accno}--$ref->{description}"; -      } -      if ($ref->{category} eq 'L') { -	$form->{AP} = $form->{AP_1} = "$ref->{accno}--$ref->{description}"; -      } -    } -    $sth->finish; -    $form->{rowcount} = $i if ($i && !$form->{type}); -  } - -  $dbh->disconnect; -   -} - - -sub retrieve_item { -  my ($self, $myconfig, $form) = @_; - -  my $i = $form->{rowcount}; -  my $var; -   -  # don't include assemblies or obsolete parts -  my $where = "NOT p.assembly = '1' AND NOT p.obsolete = '1'"; -   -  if ($form->{"partnumber_$i"}) { -    $var = $form->like(lc $form->{"partnumber_$i"}); -    $where .= " AND lower(p.partnumber) LIKE '$var'"; -  } -   -  if ($form->{"description_$i"}) { -    $var = $form->like(lc $form->{"description_$i"}); -    $where .= " AND lower(p.description) LIKE '$var'"; -  } - -  if ($form->{"partsgroup_$i"}) { -    $var = $form->like(lc $form->{"partsgroup_$i"}); -    $where .= " AND lower(pg.partsgroup) LIKE '$var'"; -  } - -  if ($form->{"description_$i"}) { -    $where .= " ORDER BY description"; -  } else { -    $where .= " ORDER BY partnumber"; -  } - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT p.id, p.partnumber, p.description, -                 c1.accno AS inventory_accno, -		 c2.accno AS income_accno, -		 c3.accno AS expense_accno, -		 pg.partsgroup -                 FROM parts p -		 LEFT JOIN chart c1 ON (p.inventory_accno_id = c1.id) -		 LEFT JOIN chart c2 ON (p.income_accno_id = c2.id) -		 LEFT JOIN chart c3 ON (p.expense_accno_id = c3.id) -		 LEFT JOIN partsgroup pg ON (pg.id = p.partsgroup_id) -	         WHERE $where|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    # get tax rates for part -    $query = qq|SELECT c.accno -                FROM chart c -		JOIN partstax pt ON (pt.chart_id = c.id) -		WHERE pt.parts_id = $ref->{id}|; -    my $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref->{taxaccounts} = ""; -    while (my $ptref = $sth->fetchrow_hashref(NAME_lc)) { -      $ref->{taxaccounts} .= "$ptref->{accno} "; -    } -    $sth->finish; -    chop $ref->{taxaccounts}; -     -    push @{ $form->{item_list} }, $ref; -  } -   -  $sth->finish; -  $dbh->disconnect; -   -} - - - -sub vendor_details { -  my ($self, $myconfig, $form) = @_; -       -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  # get rest for the vendor -  my $query = qq|SELECT vendornumber, name, addr1, addr2, addr3, addr4, -                 contact, phone as vendorphone, fax as vendorfax, vendornumber -                 FROM vendor -                 WHERE id = $form->{vendor_id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  $ref = $sth->fetchrow_hashref(NAME_lc); -  map { $form->{$_} = $ref->{$_} } keys %$ref; - -  $sth->finish; -  $dbh->disconnect; - -} - - -sub item_links { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT accno, description, link -	         FROM chart -	         WHERE link LIKE '%IC%' -		 ORDER BY accno|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    foreach my $key (split(/:/, $ref->{link})) { -      if ($key =~ /IC/) { -        push @{ $form->{IC_links}{$key} }, { accno => $ref->{accno}, -                                       description => $ref->{description} }; -      } -    } -  } - -  $sth->finish; -} - -1; - diff --git a/sql-ledger/SL/IS.pm b/sql-ledger/SL/IS.pm deleted file mode 100644 index dc11e3677..000000000 --- a/sql-ledger/SL/IS.pm +++ /dev/null @@ -1,1231 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 1998-2002 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Inventory invoicing module -# -#====================================================================== - -package IS; - - -sub invoice_details { -  my ($self, $myconfig, $form) = @_; - -  $form->{duedate} = $form->{invdate} unless ($form->{duedate}); - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT date '$form->{duedate}' - date '$form->{invdate}' -                 AS terms -		 FROM defaults|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($form->{terms}) = $sth->fetchrow_array; -  $sth->finish; - -  my $tax = 0; -  my $item; -  my $i; -  my @partsgroup = (); -  my $partsgroup; -  my %oid = ( 'Pg' => 'oid', -              'Oracle' => 'rowid' ); -   -  # sort items by partsgroup -  for $i (1 .. $form->{rowcount}) { -    $partsgroup = ""; -    if ($form->{"partsgroup_$i"} && $form->{groupitems}) { -      $form->format_string("partsgroup_$i"); -      $partsgroup = $form->{"partsgroup_$i"}; -    } -    push @partsgroup, [ $i, $partsgroup ]; -  } -   -  my $sameitem = ""; -  foreach $item (sort { $a->[1] cmp $b->[1] } @partsgroup) { -    $i = $item->[0]; - -    if ($item->[1] ne $sameitem) { -      push(@{ $form->{description} }, qq|$item->[1]|); -      $sameitem = $item->[1]; - -      map { push(@{ $form->{$_} }, "") } qw(runningnumber number bin qty unit deliverydate sellprice listprice netprice discount linetotal); -    } -     -    $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); -     -    if ($form->{"qty_$i"} != 0) { - -      # add number, description and qty to $form->{number}, .... -      push(@{ $form->{runningnumber} }, $i); -      push(@{ $form->{number} }, qq|$form->{"partnumber_$i"}|); -      push(@{ $form->{bin} }, qq|$form->{"bin_$i"}|); -      push(@{ $form->{description} }, qq|$form->{"description_$i"}|); -      push(@{ $form->{qty} }, $form->format_amount($myconfig, $form->{"qty_$i"})); -      push(@{ $form->{unit} }, qq|$form->{"unit_$i"}|); -      push(@{ $form->{deliverydate} }, qq|$form->{"deliverydate_$i"}|); -       -      push(@{ $form->{sellprice} }, $form->{"sellprice_$i"}); -       -      # listprice -      push(@{ $form->{listprice} }, $form->{"listprice_$i"}); - -      my $sellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); -      my ($dec) = ($sellprice =~ /\.(\d+)/); -      $dec = length $dec; -      my $decimalplaces = ($dec > 2) ? $dec : 2; -       -      my $discount = $form->round_amount($sellprice * $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100, $decimalplaces); -       -      # keep a netprice as well, (sellprice - discount) -      $form->{"netprice_$i"} = $sellprice - $discount; -      push(@{ $form->{netprice} }, ($form->{"netprice_$i"} != 0) ? $form->format_amount($myconfig, $form->{"netprice_$i"}, $decimalplaces) : " "); - -       -      my $linetotal = $form->round_amount($form->{"qty_$i"} * $form->{"netprice_$i"}, 2); - -      $discount = ($discount != 0) ? $form->format_amount($myconfig, $discount * -1, $decimalplaces) : " "; -      $linetotal = ($linetotal != 0) ? $linetotal : " "; -       -      push(@{ $form->{discount} }, $discount); - -      $form->{total} += $linetotal; - -      push(@{ $form->{linetotal} }, $form->format_amount($myconfig, $linetotal, 2)); -       -      my $taxrate = 0; -      my ($taxamount, $taxbase); -       -      map { $taxrate += $form->{"${_}_rate"} } split / /, $form->{"taxaccounts_$i"}; - -      if ($form->{taxincluded}) { -	# calculate tax -	$taxamount = $linetotal * ($taxrate / (1 + $taxrate)); -	$taxbase = $linetotal - $taxamount; -      } else { -        $taxamount = $linetotal * $taxrate; -	$taxbase = $linetotal; -      } -       -      if ($taxamount != 0) { -	foreach my $item (split / /, $form->{"taxaccounts_$i"}) { -	  $taxaccounts{$item} += $taxamount * $form->{"${item}_rate"} / $taxrate; -	  $taxbase{$item} += $taxbase; -	} -      } - -      if ($form->{"assembly_$i"}) { -	$sameitem = ""; -	 -        # get parts and push them onto the stack -	my $sortorder = ""; -	if ($form->{groupitems}) {  -	  $sortorder = qq|ORDER BY pg.partsgroup, a.$oid{$myconfig->{dbdriver}}|; -	} else { -	  $sortorder = qq|ORDER BY a.$oid{$myconfig->{dbdriver}}|; -	} -	 -	$query = qq|SELECT p.partnumber, p.description, p.unit, a.qty, -	            pg.partsgroup -	            FROM assembly a -		    JOIN parts p ON (a.parts_id = p.id) -		    LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		    WHERE a.bom = '1' -		    AND a.id = '$form->{"id_$i"}' -		    $sortorder|; -        $sth = $dbh->prepare($query); -        $sth->execute || $form->dberror($query); - -	while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -	  if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) { -	    map { push(@{ $form->{$_} }, "") } qw(runningnumber number unit qty bin sellprice listprice netprice discount linetotal); -	    $sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--"; -	    push(@{ $form->{description} }, $sameitem); -	  } -	     -	  push(@{ $form->{number} }, qq|$ref->{partnumber}|); -	  push(@{ $form->{description} }, qq|$ref->{description}|); -	  push(@{ $form->{unit} }, qq|$ref->{unit}|); -	  push(@{ $form->{qty} }, $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"})); - -          map { push(@{ $form->{$_} }, "") } qw(runningnumber bin sellprice listprice netprice discount linetotal); -	   -	} -	$sth->finish; -      } -       -    } -  } - - -  foreach my $item (sort keys %taxaccounts) { -    if ($form->round_amount($taxaccounts{$item}, 2) != 0) { -      push(@{ $form->{taxbase} }, $form->format_amount($myconfig, $taxbase{$item}, 2)); -       -      $tax += $taxamount = $form->round_amount($taxaccounts{$item}, 2); -       -      push(@{ $form->{tax} }, $form->format_amount($myconfig, $taxamount)); -      push(@{ $form->{taxdescription} }, $form->{"${item}_description"}); -      push(@{ $form->{taxrate} }, $form->format_amount($myconfig, $form->{"${item}_rate"} * 100)); -      push(@{ $form->{taxnumber} }, $form->{"${item}_taxnumber"}); -    } -  } -     - -  for my $i (1 .. $form->{paidaccounts}) { -    if ($form->{"paid_$i"}) { -      push(@{ $form->{payment} }, $form->{"paid_$i"}); -      my ($accno, $description) = split /--/, $form->{"AR_paid_$i"}; -      push(@{ $form->{paymentaccount} }, $description);  -      push(@{ $form->{paymentdate} }, $form->{"datepaid_$i"}); -      push(@{ $form->{paymentsource} }, $form->{"source_$i"}); - -      $form->{paid} += $form->parse_amount($myconfig, $form->{"paid_$i"}); -    } -  } -   -  $form->{subtotal} = $form->format_amount($myconfig, $form->{total}, 2); -  $form->{invtotal} = ($form->{taxincluded}) ? $form->{total} : $form->{total} + $tax; -  $form->{total} = $form->format_amount($myconfig, $form->{invtotal} - $form->{paid}, 2); -  $form->{invtotal} = $form->format_amount($myconfig, $form->{invtotal}, 2); - -  $form->{paid} = $form->format_amount($myconfig, $form->{paid}, 2); - -  # myconfig variables -  map { $form->{$_} = $myconfig->{$_} } (qw(company address tel fax signature businessnumber)); -  $form->{username} = $myconfig->{name}; - -  $dbh->disconnect; -   -} - - -sub project_description { -  my ($self, $dbh, $id) = @_; - -  my $query = qq|SELECT description -                 FROM project -		 WHERE id = $id|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($_) = $sth->fetchrow_array; - -  $sth->finish; - -  $_; - -} - - -sub customer_details { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  # get rest for the customer -  my $query = qq|SELECT customernumber, name, addr1, addr2, addr3, addr4, -	         phone as customerphone, fax as customerfax, contact -	         FROM customer -	         WHERE id = $form->{customer_id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  $ref = $sth->fetchrow_hashref(NAME_lc); -  map { $form->{$_} = $ref->{$_} } keys %$ref; - -  $sth->finish; -  $dbh->disconnect; - -} - - -sub post_invoice { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database, turn off autocommit -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my ($query, $sth, $null, $project_id, $deliverydate); -  my $exchangerate = 0; -  -  if ($form->{id}) { - -    &reverse_invoice($dbh, $form); - -  } else { -    my $uid = time; -    $uid .= $form->{login}; -     -    $query = qq|INSERT INTO ar (invnumber, employee_id) -                VALUES ('$uid', (SELECT id FROM employee -		                 WHERE login = '$form->{login}') )|; -    $dbh->do($query) || $form->dberror($query); - -    $query = qq|SELECT id FROM ar -                WHERE invnumber = '$uid'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{id}) = $sth->fetchrow_array; -    $sth->finish; -  } - - -  map { $form->{$_} =~ s/'/''/g } (qw(invnumber shippingpoint notes message)); - -  my ($netamount, $invoicediff) = (0, 0); -  my ($amount, $linetotal, $lastincomeaccno); - -  if ($form->{currency} eq $form->{defaultcurrency}) { -    $form->{exchangerate} = 1; -  } else { -    $exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, 'buy'); -  } - -  $form->{exchangerate} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{exchangerate}); -   - -  foreach my $i (1 .. $form->{rowcount}) { -    $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); -     -    if ($form->{"qty_$i"} != 0) { - -      map { $form->{"${_}_$i"} =~ s/'/''/g } (qw(partnumber description unit)); -       -      # undo discount formatting -      $form->{"discount_$i"} = $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100; - -      my ($allocated, $taxrate) = (0, 0); -      my $taxamount; -       -      # keep entered selling price -      my $fxsellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); -       -      my ($dec) = ($fxsellprice =~ /\.(\d+)/); -      $dec = length $dec; -      my $decimalplaces = ($dec > 2) ? $dec : 2; -       -      # deduct discount -      my $discount = $form->round_amount($fxsellprice * $form->{"discount_$i"}, $decimalplaces); -      $form->{"sellprice_$i"} = $fxsellprice - $discount; -       -      # add tax rates -      map { $taxrate += $form->{"${_}_rate"} } split / /, $form->{"taxaccounts_$i"}; - -      # round linetotal to 2 decimal places -      $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2); -       -      if ($form->{taxincluded}) { -	$taxamount = $linetotal * ($taxrate / (1 + $taxrate)); -	$form->{"sellprice_$i"} = $form->{"sellprice_$i"} * (1 / (1 + $taxrate)); -      } else { -	$taxamount = $linetotal * $taxrate; -      } - -      $netamount += $linetotal; -       -      if ($taxamount != 0) { -	map { $form->{amount}{$form->{id}}{$_} += $taxamount * $form->{"${_}_rate"} / $taxrate } split / /, $form->{"taxaccounts_$i"}; -      } -     -     -      # add amount to income, $form->{amount}{trans_id}{accno} -      $amount = $form->{"sellprice_$i"} * $form->{"qty_$i"} * $form->{exchangerate}; -       -      $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2) * $form->{exchangerate}; -      $linetotal = $form->round_amount($linetotal, 2); -       -      # this is the difference from the inventory -      $invoicediff += ($amount - $linetotal); -		       -      $form->{amount}{$form->{id}}{$form->{"income_accno_$i"}} += $linetotal; -       -      $lastincomeaccno = $form->{"income_accno_$i"}; -       - -      # adjust and round sellprice -      $form->{"sellprice_$i"} = $form->round_amount($form->{"sellprice_$i"} * $form->{exchangerate}, $decimalplaces); -       -      if ($form->{"inventory_accno_$i"} || $form->{"assembly_$i"}) { -        # adjust parts onhand quantity - -        if ($form->{"assembly_$i"}) { -	  # do not update if assembly consists of all services -	  $query = qq|SELECT sum(p.inventory_accno_id) -		      FROM parts p, assembly a -		      WHERE a.parts_id = p.id -		      AND a.id = $form->{"id_$i"}|; -	  $sth = $dbh->prepare($query); -	  $sth->execute || $form->dberror($query); - -	  if ($sth->fetchrow_array) { -	    $form->update_balance($dbh, -				  "parts", -				  "onhand", -				  qq|id = $form->{"id_$i"}|, -				  $form->{"qty_$i"} * -1); -	  } -	  $sth->finish; -	    -	  # record assembly item as allocated -	  &process_assembly($dbh, $form, $form->{"id_$i"}, $form->{"qty_$i"}); -	} else { -	  $form->update_balance($dbh, -				"parts", -				"onhand", -				qq|id = $form->{"id_$i"}|, -				$form->{"qty_$i"} * -1); -	   -	  $allocated = &cogs($dbh, $form, $form->{"id_$i"}, $form->{"qty_$i"}); -	} -      } - -      $project_id = 'NULL'; -      if ($form->{"project_id_$i"}) { -	$project_id = $form->{"project_id_$i"}; -      } -      $deliverydate = ($form->{"deliverydate_$i"}) ? qq|'$form->{"deliverydate_$i"}'| : "NULL"; - -      # save detail record in invoice table -      $query = qq|INSERT INTO invoice (trans_id, parts_id, description, qty, -                  sellprice, fxsellprice, discount, allocated, assemblyitem, -		  unit, deliverydate, project_id) -		  VALUES ($form->{id}, $form->{"id_$i"}, -		  '$form->{"description_$i"}', $form->{"qty_$i"}, -		  $form->{"sellprice_$i"}, $fxsellprice, -		  $form->{"discount_$i"}, $allocated, 'f', -		  '$form->{"unit_$i"}', $deliverydate, $project_id)|; -      $dbh->do($query) || $form->dberror($query); - -    } -  } - - -  $form->{datepaid} = $form->{invdate}; -   -  # total payments, don't move we need it here -  for my $i (1 .. $form->{paidaccounts}) { -    $form->{"paid_$i"} = $form->parse_amount($myconfig, $form->{"paid_$i"}); -    $form->{paid} += $form->{"paid_$i"}; -    $form->{datepaid} = $form->{"datepaid_$i"} if ($form->{"datepaid_$i"}); -  } -   -  my ($tax, $diff) = (0, 0); -   -  $netamount = $form->round_amount($netamount, 2); -   -  # figure out rounding errors for total amount vs netamount + taxes -  if ($form->{taxincluded}) { -     -    $amount = $form->round_amount($netamount * $form->{exchangerate}, 2); -    $diff += $amount - $netamount * $form->{exchangerate}; -    $netamount = $amount; -     -    foreach my $item (split / /, $form->{taxaccounts}) { -      $amount = $form->{amount}{$form->{id}}{$item} * $form->{exchangerate}; -      $form->{amount}{$form->{id}}{$item} = $form->round_amount($amount, 2); -      $tax += $form->{amount}{$form->{id}}{$item}; -      $netamount -= $form->{amount}{$form->{id}}{$item}; -    } - -    $invoicediff += $diff; -    ######## this only applies to tax included -    if ($lastincomeaccno) { -      $form->{amount}{$form->{id}}{$lastincomeaccno} += $invoicediff; -    } - -  } else { -    $amount = $form->round_amount($netamount * $form->{exchangerate}, 2); -    $diff = $amount - $netamount * $form->{exchangerate}; -    $netamount = $amount; -    foreach my $item (split / /, $form->{taxaccounts}) { -      $form->{amount}{$form->{id}}{$item} = $form->round_amount($form->{amount}{$form->{id}}{$item}, 2); -      $amount = $form->round_amount($form->{amount}{$form->{id}}{$item} * $form->{exchangerate}, 2); -      $diff += $amount - $form->{amount}{$form->{id}}{$item} * $form->{exchangerate}; -      $form->{amount}{$form->{id}}{$item} = $form->round_amount($amount, 2); -      $tax += $form->{amount}{$form->{id}}{$item}; -    } -  } - -   -  $form->{amount}{$form->{id}}{$form->{AR}} = $netamount + $tax; - -  if ($form->{paid} != 0) { -    $form->{paid} = $form->round_amount($form->{paid} * $form->{exchangerate} + $diff, 2); -  } -   -  # reverse AR -  $form->{amount}{$form->{id}}{$form->{AR}} *= -1; - - -  # update exchangerate -  if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -    $form->update_exchangerate($dbh, $form->{currency}, $form->{invdate}, $form->{exchangerate}, 0); -  } -     -  foreach my $trans_id (keys %{$form->{amount}}) { -    foreach my $accno (keys %{ $form->{amount}{$trans_id} }) { -      if (($form->{amount}{$trans_id}{$accno} = $form->round_amount($form->{amount}{$trans_id}{$accno}, 2)) != 0) { -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -	            transdate) -		    VALUES ($trans_id, (SELECT id FROM chart -		                        WHERE accno = '$accno'), -		    $form->{amount}{$trans_id}{$accno}, '$form->{invdate}')|; -	$dbh->do($query) || $form->dberror($query); -      } -    } -  } - -  # deduct payment differences from diff -  for my $i (1 .. $form->{paidaccounts}) { -    if ($form->{"paid_$i"} != 0) { -      $amount = $form->round_amount($form->{"paid_$i"} * $form->{exchangerate}, 2); -      $diff -= $amount - $form->{"paid_$i"} * $form->{exchangerate}; -    } -  } - -  # force AR entry if 0 -  $form->{amount}{$form->{id}}{$form->{AR}} = 1 if ($form->{amount}{$form->{id}}{$form->{AR}} == 0); -   -  # record payments and offsetting AR -  for my $i (1 .. $form->{paidaccounts}) { -     -    if ($form->{"paid_$i"} != 0) { -      my ($accno) = split /--/, $form->{"AR_paid_$i"}; -      $form->{"datepaid_$i"} = $form->{invdate} unless ($form->{"datepaid_$i"}); -      $form->{datepaid} = $form->{"datepaid_$i"}; -       -      # record AR -      $amount = $form->round_amount($form->{"paid_$i"} * $form->{exchangerate} + $diff, 2); - -      if ($form->{amount}{$form->{id}}{$form->{AR}} != 0) { -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -	            transdate) -		    VALUES ($form->{id}, (SELECT id FROM chart -					WHERE accno = '$form->{AR}'), -		    $amount, '$form->{"datepaid_$i"}')|; -	$dbh->do($query) || $form->dberror($query); -      } - -      # record payment -      $form->{"paid_$i"} *= -1; - -      $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, -                  source) -                  VALUES ($form->{id}, (SELECT id FROM chart -		                      WHERE accno = '$accno'), -		  $form->{"paid_$i"}, '$form->{"datepaid_$i"}', -		  '$form->{"source_$i"}')|; -      $dbh->do($query) || $form->dberror($query); - -       -      $exchangerate = 0; -       -      if ($form->{currency} eq $form->{defaultcurrency}) { -	$form->{"exchangerate_$i"} = 1; -      } else { -	$exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{"datepaid_$i"}, 'buy'); -	 -	$form->{"exchangerate_$i"} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{"exchangerate_$i"}); -      } -       -       -      # exchangerate difference -      $form->{fx}{$accno}{$form->{"datepaid_$i"}} += $form->{"paid_$i"} * ($form->{"exchangerate_$i"} - 1) + $diff; - -       -      # gain/loss -      $amount = $form->{"paid_$i"} * $form->{exchangerate} - $form->{"paid_$i"} * $form->{"exchangerate_$i"}; -      if ($amount > 0) { -	$form->{fx}{$form->{fxgain_accno}}{$form->{"datepaid_$i"}} += $amount; -      } else { -	$form->{fx}{$form->{fxloss_accno}}{$form->{"datepaid_$i"}} += $amount; -      } - -      $diff = 0; - -      # update exchange rate -      if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -	$form->update_exchangerate($dbh, $form->{currency}, $form->{"datepaid_$i"}, $form->{"exchangerate_$i"}, 0); -      } -    } -  } - -   -  # record exchange rate differences and gains/losses -  foreach my $accno (keys %{$form->{fx}}) { -    foreach my $transdate (keys %{ $form->{fx}{$accno} }) { -      if (($form->{fx}{$accno}{$transdate} = $form->round_amount($form->{fx}{$accno}{$transdate}, 2)) != 0) { - -	$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, -	            transdate, cleared, fx_transaction) -		    VALUES ($form->{id}, -		           (SELECT id FROM chart -		            WHERE accno = '$accno'), -		    $form->{fx}{$accno}{$transdate}, '$transdate', '0', '1')|; -	$dbh->do($query) || $form->dberror($query); -      } -    } -  } -  - -  $amount = $netamount + $tax; -   -  # set values which could be empty to 0 -  $form->{terms} *= 1; -  $form->{taxincluded} *= 1; -  my $datepaid = ($form->{paid}) ? qq|'$form->{datepaid}'| : "NULL"; -  my $duedate = ($form->{duedate}) ? qq|'$form->{duedate}'| : "NULL"; - -  # fill in subject if there is none -  $form->{subject} = qq|$form->{label} $form->{invnumber}| unless $form->{subject}; -  # if there is a message stuff it into the notes -  my $cc = "Cc: $form->{cc}\\r\n" if $form->{cc}; -  my $bcc = "Bcc: $form->{bcc}\\r\n" if $form->{bcc}; -  $form->{notes} .= qq|\r -\r -[email]\r -To: $form->{email}\r -$cc${bcc}Subject: $form->{subject}\r -\r -Message: $form->{message}\r| if $form->{message}; - -  # save AR record -  $query = qq|UPDATE ar set -              invnumber = '$form->{invnumber}', -	      ordnumber = '$form->{ordnumber}', -              transdate = '$form->{invdate}', -              customer_id = $form->{customer_id}, -              amount = $amount, -              netamount = $netamount, -              paid = $form->{paid}, -	      datepaid = $datepaid, -	      duedate = $duedate, -	      invoice = '1', -	      shippingpoint = '$form->{shippingpoint}', -	      terms = $form->{terms}, -	      notes = '$form->{notes}', -	      taxincluded = '$form->{taxincluded}', -	      curr = '$form->{currency}' -              WHERE id = $form->{id} -             |; -  $dbh->do($query) || $form->dberror($query); - -  # add shipto -  $form->{name} = $form->{customer}; -  $form->{name} =~ s/--$form->{customer_id}//; -  $form->add_shipto($dbh, $form->{id}); - -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - -sub process_assembly { -  my ($dbh, $form, $id, $totalqty) = @_; - -  my $query = qq|SELECT a.parts_id, a.qty, p.assembly, -                 p.partnumber, p.description, p.unit, -                 p.inventory_accno_id, p.income_accno_id, -		 p.expense_accno_id -                 FROM assembly a, parts p -		 WHERE a.parts_id = p.id -		 AND a.id = $id|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -   -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - -    my $allocated = 0; -     -    $ref->{inventory_accno_id} *= 1; -    $ref->{expense_accno_id} *= 1; - -    map { $ref->{$_} =~ s/'/''/g } (qw(partnumber description unit)); -     -    # multiply by number of assemblies -    $ref->{qty} *= $totalqty; -     -    if ($ref->{assembly}) { -      &process_assembly($dbh, $form, $ref->{parts_id}, $ref->{qty}); -      next; -    } else { -      if ($ref->{inventory_accno_id}) { -	$allocated = &cogs($dbh, $form, $ref->{parts_id}, $ref->{qty}); -      } -    } - -    # save detail record for individual assembly item in invoice table -    $query = qq|INSERT INTO invoice (trans_id, description, parts_id, qty, -                sellprice, fxsellprice, allocated, assemblyitem, unit) -		VALUES -		($form->{id}, '$ref->{description}', -		$ref->{parts_id}, $ref->{qty}, 0, 0, $allocated, 't', -		'$ref->{unit}')|; -    $dbh->do($query) || $form->dberror($query); -	  -  } - -  $sth->finish; - -} - - -sub cogs { -  my ($dbh, $form, $id, $totalqty) = @_; -     -  my $query = qq|SELECT i.id, i.trans_id, i.qty, i.allocated, i.sellprice, -                        (SELECT c.accno FROM chart c -			 WHERE p.inventory_accno_id = c.id) -			 AS inventory_accno, -			(SELECT c.accno FROM chart c -			 WHERE p.expense_accno_id = c.id) -			 AS expense_accno -		  FROM invoice i, parts p -		  WHERE i.parts_id = p.id -		  AND i.parts_id = $id -		  AND (i.qty + i.allocated) < 0 -		  ORDER BY trans_id|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $allocated = 0; -  my $qty; -   -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    if (($qty = (($ref->{qty} * -1) - $ref->{allocated})) > $totalqty) { -      $qty = $totalqty; -    } -     -    $form->update_balance($dbh, -			  "invoice", -			  "allocated", -			  qq|id = $ref->{id}|, -			  $qty); - -    # total expenses and inventory -    # sellprice is the cost of the item -    $linetotal = $form->round_amount($ref->{sellprice} * $qty, 2); -     -    # add to expense -    $form->{amount}{$form->{id}}{$ref->{expense_accno}} += -$linetotal; - -    # deduct inventory -    $form->{amount}{$form->{id}}{$ref->{inventory_accno}} -= -$linetotal; - -    # add allocated -    $allocated += -$qty; -     -    last if (($totalqty -= $qty) <= 0); -  } - -  $sth->finish; - -  $allocated; -   -} - - - -sub reverse_invoice { -  my ($dbh, $form) = @_; -   -  # reverse inventory items -  my $query = qq|SELECT i.id, i.parts_id, i.qty, i.assemblyitem, p.assembly, -		 p.inventory_accno_id -                 FROM invoice i, parts p -		 WHERE i.parts_id = p.id -		 AND i.trans_id = $form->{id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - -    if ($ref->{inventory_accno_id} || $ref->{assembly}) { - -      # if the invoice item is not an assemblyitem adjust parts onhand -      unless ($ref->{assemblyitem}) { -	# adjust onhand in parts table -	$form->update_balance($dbh, -			      "parts", -			      "onhand", -			      qq|id = $ref->{parts_id}|, -			      $ref->{qty}); -      } - -      # loop if it is an assembly -      next if ($ref->{assembly}); -       -      # de-allocated purchases -      $query = qq|SELECT id, trans_id, allocated -                  FROM invoice -		  WHERE parts_id = $ref->{parts_id} -		  AND allocated > 0 -		  ORDER BY trans_id DESC|; -      my $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      while (my $inhref = $sth->fetchrow_hashref(NAME_lc)) { -	$qty = $ref->{qty}; -	if (($ref->{qty} - $inhref->{allocated}) > 0) { -	  $qty = $inhref->{allocated}; -	} -	 -	# update invoice -	$form->update_balance($dbh, -			      "invoice", -			      "allocated", -			      qq|id = $inhref->{id}|, -			      $qty * -1); - -        last if (($ref->{qty} -= $qty) <= 0); -      } -      $sth->finish; -    } -  } -   -  $sth->finish; -   -  # delete acc_trans -  $query = qq|DELETE FROM acc_trans -              WHERE trans_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); -  -  # delete invoice entries -  $query = qq|DELETE FROM invoice -              WHERE trans_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  $query = qq|DELETE FROM shipto -              WHERE trans_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -} - - - -sub delete_invoice { -  my ($self, $myconfig, $form) = @_; - -  # 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}); -  -  &reverse_invoice($dbh, $form); -   -  # delete AR record -  my $query = qq|DELETE FROM ar -                 WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  my $rc = $dbh->commit; -  $dbh->disconnect; -   -  $rc; -   -} - - - -sub retrieve_invoice { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my $query; -   -  if ($form->{id}) { -    # get default accounts and last invoice number -    $query = qq|SELECT (SELECT c.accno FROM chart c -                        WHERE d.inventory_accno_id = c.id) AS inventory_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.income_accno_id = c.id) AS income_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.expense_accno_id = c.id) AS expense_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.fxgain_accno_id = c.id) AS fxgain_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.fxloss_accno_id = c.id) AS fxloss_accno, -                d.curr AS currencies -		FROM defaults d|; -  } else { -    $query = qq|SELECT (SELECT c.accno FROM chart c -                        WHERE d.inventory_accno_id = c.id) AS inventory_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.income_accno_id = c.id) AS income_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.expense_accno_id = c.id) AS expense_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.fxgain_accno_id = c.id) AS fxgain_accno, -		       (SELECT c.accno FROM chart c -		        WHERE d.fxloss_accno_id = c.id) AS fxloss_accno, -                d.invnumber, d.curr AS currencies, current_date AS invdate -                FROM defaults d|; -  } -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $ref = $sth->fetchrow_hashref(NAME_lc); -  map { $form->{$_} = $ref->{$_} } keys %$ref; -  $sth->finish; - -   -  if ($form->{id}) { -     -    # retrieve invoice -    $query = qq|SELECT a.invnumber, a.ordnumber, a.transdate AS invdate, a.paid, -                a.shippingpoint, a.terms, a.notes, a.duedate, a.taxincluded, -		a.curr AS currency, (SELECT e.name FROM employee e -		                     WHERE e.id = a.employee_id) AS employee -		FROM ar a -		WHERE a.id = $form->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $form->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; - -    $form->{exchangerate} = $form->get_exchangerate($dbh, $form->{currency}, $form->{invdate}, "buy"); - -    # get shipto -    $query = qq|SELECT * FROM shipto -                WHERE trans_id = $form->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $form->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; -     -    # retrieve individual items -    $query = qq|SELECT c1.accno AS inventory_accno, -                       c2.accno AS income_accno, -		       c3.accno AS expense_accno, -                i.description, i.qty, i.fxsellprice AS sellprice, -		i.discount, i.parts_id AS id, i.unit, i.deliverydate, -		pr.projectnumber, -                i.project_id, -		p.partnumber, p.assembly, p.bin, -		pg.partsgroup -		FROM invoice i -		JOIN parts p ON (i.parts_id = p.id) -		LEFT JOIN chart c1 ON (p.inventory_accno_id = c1.id) -		LEFT JOIN chart c2 ON (p.income_accno_id = c2.id) -		LEFT JOIN chart c3 ON (p.expense_accno_id = c3.id) -		LEFT JOIN project pr ON (i.project_id = pr.id) -		LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		WHERE i.trans_id = $form->{id} -		AND NOT i.assemblyitem = '1' -		ORDER BY i.id|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -      # get taxes -      $query = qq|SELECT c.accno -                  FROM chart c, partstax pt -		  WHERE pt.chart_id = c.id -		  AND pt.parts_id = $ref->{id}|; -      my $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      $ref->{taxaccounts} = ""; -      my $taxrate = 0; -       -      while (my $ptref = $sth->fetchrow_hashref(NAME_lc)) { -	$ref->{taxaccounts} .= "$ptref->{accno} "; -	$taxrate += $form->{"$ptref->{accno}_rate"}; -      } -      $sth->finish; -      chop $ref->{taxaccounts}; - -      push @{ $form->{invoice_details} }, $ref; -    } -    $sth->finish; - -  } else { - -    $form->{shippingpoint} = $myconfig->{shippingpoint} unless $form->{shippingpoint}; - -    # up invoice number by 1 -    $form->{invnumber}++; - -    # save the new number -    $query = qq|UPDATE defaults -                SET invnumber = '$form->{invnumber}'|; -    $dbh->do($query) || $form->dberror($query); - -    $form->get_employee($dbh); - -  } - - -  my $rc = $dbh->commit; -  $dbh->disconnect; -   -  $rc; - -} - - -sub get_customer { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $dateformat = $myconfig->{dateformat}; -  $dateformat .= "yy" if $myconfig->{dateformat} !~ /^y/; - -  my $duedate = ($form->{invdate}) ? "to_date('$form->{invdate}', '$dateformat')" : "current_date"; - -  $form->{customer_id} *= 1; -  # get customer -  my $query = qq|SELECT c.name AS customer, c.discount, c.creditlimit, c.terms, -                 c.email, c.cc, c.bcc, c.taxincluded, -		 c.addr1, c.addr2, c.addr3, c.addr4, -	         $duedate + c.terms AS duedate -                 FROM customer c -	         WHERE c.id = $form->{customer_id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  $ref = $sth->fetchrow_hashref(NAME_lc); - -  map { $form->{$_} = $ref->{$_} } keys %$ref; -  $sth->finish; -   -  $form->{creditremaining} = $form->{creditlimit}; -  $query = qq|SELECT SUM(amount - paid) -	      FROM ar -	      WHERE customer_id = $form->{customer_id}|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($form->{creditremaining}) -= $sth->fetchrow_array; - -  $sth->finish; -   -  $query = qq|SELECT o.amount, -                (SELECT e.buy FROM exchangerate e -		 WHERE e.curr = o.curr -		 AND e.transdate = o.transdate) -	      FROM oe o -	      WHERE o.customer_id = $form->{customer_id} -	      AND o.closed = '0'|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my ($amount, $exch) = $sth->fetchrow_array) { -    $exch = 1 unless $exch; -    $form->{creditremaining} -= $amount * $exch; -  } -  $sth->finish; - - -  # get shipto if we did not converted an order or invoice -  if (!$form->{shipto}) { -    map { delete $form->{$_} } qw(shiptoname shiptoaddr1 shiptoaddr2 shiptoaddr3 shiptoaddr4 shiptocontact shiptophone shiptofax shiptoemail); - -    $query = qq|SELECT * FROM shipto -                WHERE trans_id = $form->{customer_id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $form->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; -  } -       -  # get taxes we charge for this customer -  $query = qq|SELECT c.accno -              FROM chart c, customertax ct -	      WHERE ct.chart_id = c.id -	      AND ct.customer_id = $form->{customer_id}|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -   -  my $customertax = (); -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    $customertax{$ref->{accno}} = 1; -  } -  $sth->finish; -     -  # get tax rates and description -  $query = qq|SELECT c.accno, c.description, t.rate, t.taxnumber -	      FROM chart c, tax t -	      WHERE c.id = t.chart_id -	      AND c.link LIKE '%CT_tax%' -	      ORDER BY accno|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  $form->{taxaccounts} = ""; -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    if ($customertax{$ref->{accno}}) { -      $form->{"$ref->{accno}_rate"} = $ref->{rate}; -      $form->{"$ref->{accno}_description"} = $ref->{description}; -      $form->{"$ref->{accno}_taxnumber"} = $ref->{taxnumber}; -      $form->{taxaccounts} .= "$ref->{accno} "; -    } -  } -  $sth->finish; -  chop $form->{taxaccounts}; - -  # setup last accounts used for this customer -  if (!$form->{id} && $form->{type} !~ /_order/) { -    $query = qq|SELECT c.accno, c.description, c.link, c.category -                FROM chart c -		JOIN acc_trans ac ON (ac.chart_id = c.id) -		JOIN ar a ON (a.id = ac.trans_id) -		WHERE a.customer_id = $form->{customer_id} -		AND NOT (c.link LIKE '%_tax%' OR c.link LIKE '%_paid%') -		AND a.id IN (SELECT max(id) FROM ar -		             WHERE customer_id = $form->{customer_id})|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    my $i = 0; -    while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -      if ($ref->{category} eq 'I') { -	$i++; -	$form->{"AR_amount_$i"} = "$ref->{accno}--$ref->{description}"; -      } -      if ($ref->{category} eq 'A') { -	$form->{AR} = $form->{AR_1} = "$ref->{accno}--$ref->{description}"; -      } -    } -    $sth->finish; -    $form->{rowcount} = $i if ($i && !$form->{type}); -  } -   -  $dbh->disconnect; - -} - - - -sub retrieve_item { -  my ($self, $myconfig, $form) = @_; - -  my $i = $form->{rowcount}; -  my $var; -  my $where = "NOT obsolete = '1'"; - -  if ($form->{"partnumber_$i"}) { -    $var = $form->like(lc $form->{"partnumber_$i"}); -    $where .= " AND lower(p.partnumber) LIKE '$var'"; -  } -  if ($form->{"description_$i"}) { -    $var = $form->like(lc $form->{"description_$i"}); -    $where .= " AND lower(p.description) LIKE '$var'"; -  } - -  if ($form->{"partsgroup_$i"}) { -    $var = $form->like(lc $form->{"partsgroup_$i"}); -    $where .= " AND lower(pg.partsgroup) LIKE '$var'"; -  } - -  if ($form->{"description_$i"}) { -    $where .= " ORDER BY description"; -  } else { -    $where .= " ORDER BY partnumber"; -  } -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT p.id, p.partnumber, p.description, p.sellprice, -                        p.listprice, -			c1.accno AS inventory_accno, -			c2.accno AS income_accno, -			c3.accno AS expense_accno, -		 p.unit, p.assembly, p.bin, p.onhand, p.makemodel, -		 pg.partsgroup -                 FROM parts p -		 LEFT JOIN chart c1 ON (p.inventory_accno_id = c1.id) -		 LEFT JOIN chart c2 ON (p.income_accno_id = c2.id) -		 LEFT JOIN chart c3 ON (p.expense_accno_id = c3.id) -		 LEFT JOIN partsgroup pg ON (pg.id = p.partsgroup_id) -	         WHERE $where|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - -    # get taxes for part -    $query = qq|SELECT c.accno -                FROM chart c -		JOIN partstax pt ON (c.id = pt.chart_id) -		WHERE pt.parts_id = $ref->{id}|; -    my $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref->{taxaccounts} = ""; -    while (my $ptref = $sth->fetchrow_hashref(NAME_lc)) { -      $ref->{taxaccounts} .= "$ptref->{accno} "; -    } -    $sth->finish; -    chop $ref->{taxaccounts}; - -    # get makemodel -    if ($ref->{makemodel}) { -      $query = qq|SELECT name -		  FROM makemodel -		  WHERE parts_id = $ref->{id}|; -      $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); -       -      $ref->{makemodel} = ""; -      while (my $ptref = $sth->fetchrow_hashref(NAME_lc)) { -	$ref->{makemodel} .= "$ptref->{name}:"; -      } -      $sth->finish; -      chop $ref->{makemodel}; -    } - -    push @{ $form->{item_list} }, $ref; - -  } -   -  $sth->finish; -  $dbh->disconnect; -   -} - - -1; - diff --git a/sql-ledger/SL/Inifile.pm b/sql-ledger/SL/Inifile.pm deleted file mode 100644 index e9de47a8f..000000000 --- a/sql-ledger/SL/Inifile.pm +++ /dev/null @@ -1,87 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#===================================================================== -# -# routines to retrieve / manipulate win ini style files -# ORDER is used to keep the elements in the order they appear in .ini -# -#===================================================================== - -package Inifile; - - -sub new { -  my ($type, $file, $level) = @_; -   -  my $id = ""; -  my $skip; -   -  $type = ref($self) || $self; -   -  open FH, "$file" or Form->error("$file : $!"); - -  while (<FH>) { -    next if /^(#|;|\s)/; -    last if /^\./; - -    chop; - -    # strip comments -    s/\s*(#|;).*//g; -     -    # remove any trailing whitespace -    s/^\s*(.*?)\s*$/$1/; - -    if (/^\[/) { -      s/(\[|\])//g; - -      $id = $_; - -      # if there is a level skip -      if ($skip = ($id !~ /^$level/)) { -	next; -      } - -      push @{$self->{ORDER}}, $_; -       -      next; -       -    } - -    if (!$skip) { -      # add key=value to $id -      my ($key, $value) = split /=/, $_, 2; -       -      $self->{$id}{$key} = $value; -    } - -  } -  close FH; -   -  bless $self, $type; -   -} - - -1; - diff --git a/sql-ledger/SL/Mailer.pm b/sql-ledger/SL/Mailer.pm deleted file mode 100644 index 934ad3690..000000000 --- a/sql-ledger/SL/Mailer.pm +++ /dev/null @@ -1,147 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -# Contributors:  -# -# 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. -#====================================================================== - -package Mailer; - -sub new { -  my ($type) = @_; -  my $self = {}; - -  bless $self, $type; -} - - -sub send { -  my ($self, $out) = @_; - -  my $boundary = time; -  $boundary = "SL-$self->{version}-$boundary"; -  my $domain = $self->{from}; -  $domain =~ s/(.*?\@|>)//g; -  my $msgid = "$boundary\@$domain"; -   -  $self->{charset} = "ISO-8859-1" unless $self->{charset}; -   -  if ($out) { -    open(OUT, $out) or return "$out : $!"; -  } else { -    open(OUT, ">-") or return "STDOUT : $!"; -  } - -  $self->{contenttype} = "text/plain" unless $self->{contenttype}; -   -  my ($cc, $bcc); -  $cc = "Cc: $self->{cc}\n" if $self->{cc}; -  $bcc = "Bcc: $self->{bcc}\n" if $self->{bcc}; -   -  print OUT qq|From: $self->{from} -To: $self->{to} -${cc}${bcc}Subject: $self->{subject} -Message-ID: <$msgid> -X-Mailer: SQL-Ledger $self->{version} -MIME-Version: 1.0 -|; - - -  if ($self->{attachments}) { -    print OUT qq|Content-Type: multipart/mixed; boundary="$boundary" - ---${boundary} -Content-Type: $self->{contenttype}; charset="$self->{charset}" - -$self->{message} - -|; - -    foreach my $attachment (@{ $self->{attachments} }) { -       -      my $application = ($attachment =~ /(^\w+$)|\.(html|text|txt|sql)$/) ? "text" : "application"; -       -      open(IN, $attachment); -      if ($?) { -	close(OUT); -	return "$attachment : $!"; -      } -       -      my $filename = $attachment; -      # strip path -      $filename =~ s/(.*\/|$self->{fileid})//g; -       -      print OUT qq|--${boundary} -Content-Type: $application/$self->{format}; name="$filename"; charset="$self->{charset}" -Content-Transfer-Encoding: BASE64 -Content-Disposition: attachment; filename="$filename"\n\n|; - -      my $msg = ""; -      while (<IN>) {; -        $msg .= $_; -      } -      print OUT &encode_base64($msg); - -      close(IN); -       -    } -    print OUT qq|--${boundary}--\n|; - -  } else { -    print OUT qq|Content-Type: $self->{contenttype}; charset="$self->{charset}" - -$self->{message} -|; -  } - -  close(OUT); - -  return ""; -   -} - - -sub encode_base64 ($;$) { - -  # this code is from the MIME-Base64-2.12 package -  # Copyright 1995-1999,2001 Gisle Aas <gisle@ActiveState.com> - -  my $res = ""; -  my $eol = $_[1]; -  $eol = "\n" unless defined $eol; -  pos($_[0]) = 0;                          # ensure start at the beginning - -  $res = join '', map( pack('u',$_)=~ /^.(\S*)/, ($_[0]=~/(.{1,45})/gs)); - -  $res =~ tr|` -_|AA-Za-z0-9+/|;               # `# help emacs -  # fix padding at the end -  my $padding = (3 - length($_[0]) % 3) % 3; -  $res =~ s/.{$padding}$/'=' x $padding/e if $padding; -  # break encoded string into lines of no more than 60 characters each -  if (length $eol) { -    $res =~ s/(.{1,60})/$1$eol/g; -  } -  return $res; -   -} - - -1; - diff --git a/sql-ledger/SL/Menu.pm b/sql-ledger/SL/Menu.pm deleted file mode 100644 index 661d35408..000000000 --- a/sql-ledger/SL/Menu.pm +++ /dev/null @@ -1,117 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#===================================================================== -# -# routines for menu items -# -#===================================================================== - -package Menu; - - -sub new { -  my ($type, $menufile, $level) = @_; - -  use SL::Inifile; -  my $self = Inifile->new($menufile, $level); -   -  bless $self, $type; - -} - - -sub menuitem { -  my ($self, $myconfig, $form, $item) = @_; - -  my $module = $form->{script}; -  my $action = "section_menu"; -  my $target = ""; - -  if ($self->{$item}{module}) { -    $module = $self->{$item}{module}; -  } -  if ($self->{$item}{action}) { -    $action = $self->{$item}{action}; -  } -  if ($self->{$item}{target}) { -    $target = $self->{$item}{target}; -  } - -  my $level = $form->escape($item); -  my $str = qq|<a href=$module?path=$form->{path}&action=$action&level=$level&login=$form->{login}&password=$form->{password}|; -  my @vars = qw(module action target href); -   -  if ($self->{$item}{href}) { -    $str = qq|<a href=$self->{$item}{href}|; -    @vars = qw(module target href); -  } - -  map { delete $self->{$item}{$_} } @vars; -   -   -  # add other params -  foreach my $key (keys %{ $self->{$item} }) { -    $str .= "&".$form->escape($key,1)."="; -    ($value, $conf) = split /=/, $self->{$item}{$key}, 2; -    $value = $myconfig->{$value}."/$conf" if ($conf); -    $str .= $form->escape($value, 1); -  } - -  if ($target) { -    $str .= qq| target=$target|; -  } - -  $str .= ">"; -   -} - - -sub access_control { -  my ($self, $myconfig, $menulevel) = @_; -   -  my @menu = (); - -  if ($menulevel eq "") { -    @menu = grep { !/--/ } @{ $self->{ORDER} }; -  } else { -    @menu = grep { /^${menulevel}--/ } @{ $self->{ORDER} }; -  } - -  my @a = split /;/, $myconfig->{acs}; -  my $excl = (); - -  # remove --AR, --AP from array -  grep { ($a, $b) = split /--/; s/--$a$//; } @a; - -  map { $excl{$_} = 1 } @a; - -  @a = (); -  map { push @a, $_ unless $excl{$_} } (@menu); - -  @a; - -} - - -1; - diff --git a/sql-ledger/SL/Num2text.pm b/sql-ledger/SL/Num2text.pm deleted file mode 100644 index f09121c23..000000000 --- a/sql-ledger/SL/Num2text.pm +++ /dev/null @@ -1,162 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#===================================================================== -# -# this is the default code for the Check package -# -#===================================================================== - - -sub init { -  my $self = shift; - -  %{ $self->{numbername} } = -                   (0 => 'Zero', -                    1 => 'One', -                    2 => 'Two', -	            3 => 'Three', -		    4 => 'Four', -		    5 => 'Five', -		    6 => 'Six', -		    7 => 'Seven', -		    8 => 'Eight', -		    9 => 'Nine', -		   10 => 'Ten', -		   11 => 'Eleven', -		   12 => 'Twelve', -		   13 => 'Thirteen', -		   14 => 'Fourteen', -		   15 => 'Fifteen', -		   16 => 'Sixteen', -		   17 => 'Seventeen', -		   18 => 'Eighteen', -		   19 => 'Nineteen', -		   20 => 'Twenty', -		   30 => 'Thirty', -		   40 => 'Forty', -		   50 => 'Fifty', -		   60 => 'Sixty', -		   70 => 'Seventy', -		   80 => 'Eighty', -		   90 => 'Ninety', -                10**2 => 'Hundred', -                10**3 => 'Thousand', -		10**6 => 'Million', -		10**9 => 'Billion', -	       10**12 => 'Trillion', -		); - -} - - -sub num2text { -  my ($self, $amount) = @_; - -  return $self->{numbername}{0} unless $amount; - -  my @textnumber = (); - -  # split amount into chunks of 3 -  my @num = reverse split //, $amount; -  my @numblock = (); -  my @a; -  my $i; - -  while (@num) { -    @a = (); -    for (1 .. 3) { -      push @a, shift @num; -    } -    push @numblock, join / /, reverse @a; -  } -     -  while (@numblock) { - -    $i = $#numblock; -    @num = split //, $numblock[$i]; -     -    if ($numblock[$i] == 0) { -      pop @numblock; -      next; -    } -    -    if ($numblock[$i] > 99) { -      # the one from hundreds -      push @textnumber, $self->{numbername}{$num[0]}; -      -      # add hundred designation -      push @textnumber, $self->{numbername}{10**2}; - -      # reduce numblock -      $numblock[$i] -= $num[0] * 100; -       -    } -     -    $numblock[$i] *= 1; -     -    if ($numblock[$i] > 9) { -      # tens -      push @textnumber, $self->format_ten($numblock[$i]); -    } elsif ($numblock[$i] > 0) { -      # ones -      push @textnumber, $self->{numbername}{$numblock[$i]}; -    } -     -    # add thousand, million -    if ($i) { -      $num = 10**($i * 3); -      push @textnumber, $self->{numbername}{$num}; -    } -       -    pop @numblock; -     -  } - -  join ' ', @textnumber; - -} - - -sub format_ten { -  my ($self, $amount) = @_; -   -  my $textnumber = ""; -  my @num = split //, $amount; - -  if ($amount > 20) { -    $textnumber = $self->{numbername}{$num[0]*10}; -    $amount = $num[1]; -  } else { -    $textnumber = $self->{numbername}{$amount}; -    $amount = 0; -  } - -  $textnumber .= " ".$self->{numbername}{$amount} if $amount; - -  $textnumber; -   -} - - -1; - diff --git a/sql-ledger/SL/OE.pm b/sql-ledger/SL/OE.pm deleted file mode 100644 index a742ca7a2..000000000 --- a/sql-ledger/SL/OE.pm +++ /dev/null @@ -1,674 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Order entry module -# -#====================================================================== - -package OE; - - -sub transactions { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -  -  my $query; - -  my $rate = ($form->{vc} eq 'customer') ? 'buy' : 'sell'; -   -  my $query = qq|SELECT o.id, o.ordnumber, o.transdate, o.reqdate, -                 o.amount, ct.name, o.netamount, o.$form->{vc}_id, -		 (SELECT $rate FROM exchangerate ex -		  WHERE ex.curr = o.curr -		  AND ex.transdate = o.transdate) AS exchangerate, -		 o.closed -	         FROM oe o, $form->{vc} ct -	         WHERE o.$form->{vc}_id = ct.id|; -	       -  my $ordnumber = $form->like(lc $form->{ordnumber}); -   -  if ($form->{"$form->{vc}_id"}) { -    $query .= qq| AND o.$form->{vc}_id = $form->{"$form->{vc}_id"}|; -  } else { -    if ($form->{$form->{vc}}) { -      my $name = $form->like(lc $form->{$form->{vc}}); -      $query .= " AND lower(name) LIKE '$name'"; -    } -  } -  unless ($form->{open} && $form->{closed}) { -    $query .= ($form->{open}) ? " AND o.closed = '0'" : " AND o.closed = '1'"; -  } - -  my $sortorder = join ', ', $form->sort_columns(qw(transdate ordnumber name)); -  $sortorder = $form->{sort} unless $sortorder; -   -  $query .= " AND lower(ordnumber) LIKE '$ordnumber'" if $form->{ordnumber}; -  $query .= " AND transdate >= '$form->{transdatefrom}'" if $form->{transdatefrom}; -  $query .= " AND transdate <= '$form->{transdateto}'" if $form->{transdateto}; -  $query .= " ORDER by $sortorder"; - -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $oe = $sth->fetchrow_hashref(NAME_lc)) { -    $oe->{exchangerate} = 1 unless $oe->{exchangerate}; -    push @{ $form->{OE} }, $oe; -  } - -  $sth->finish; -  $dbh->disconnect; -   -} - - -sub save_order { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database, turn off autocommit -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my ($query, $sth); -  my $exchangerate = 0; - -  if ($form->{id}) { - -    $query = qq|DELETE FROM orderitems -                WHERE trans_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -    $query = qq|DELETE FROM shipto -                WHERE trans_id = $form->{id}|; -    $dbh->do($query) || $form->dberror($query); - -  } else { -    my $uid = time; -    $uid .= $form->{login}; -     -    $query = qq|INSERT INTO oe (ordnumber, employee_id) -                VALUES ('$uid', (SELECT id FROM employee -		                 WHERE login = '$form->{login}') )|; -    $dbh->do($query) || $form->dberror($query); -    -    $query = qq|SELECT id FROM oe -                WHERE ordnumber = '$uid'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    ($form->{id}) = $sth->fetchrow_array; -    $sth->finish; -  } - -  map { $form->{$_} =~ s/'/''/g } qw(ordnumber shippingpoint notes message); -   -  my ($amount, $linetotal, $discount, $project_id, $reqdate); -  my ($taxrate, $taxamount, $fxsellprice); -  my %taxbase = (); -  my %taxaccounts = (); -  my ($netamount, $tax) = (0, 0); - -  for my $i (1 .. $form->{rowcount}) { -     -    $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); -     -    if ($form->{"qty_$i"} != 0) { -       -      map { $form->{"${_}_$i"} =~ s/'/''/g } qw(partnumber description unit); -       -      # set values to 0 if nothing entered -      $form->{"discount_$i"} = $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100; - -      $form->{"sellprice_$i"} = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); -      $fxsellprice = $form->{"sellprice_$i"}; - -      my ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/); -      $dec = length $dec; -      my $decimalplaces = ($dec > 2) ? $dec : 2; -       -      $discount = $form->round_amount($form->{"sellprice_$i"} * $form->{"discount_$i"}, $decimalplaces); -      $form->{"sellprice_$i"} = $form->round_amount($form->{"sellprice_$i"} - $discount, $decimalplaces); -       -      $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"}, 2); -      $taxrate = 0; -      map { $taxrate += $form->{"${_}_rate"} } split / /, $form->{"taxaccounts_$i"}; - -      if ($form->{taxincluded}) { -	$taxamount = $linetotal * $taxrate / (1 + $taxrate); -	$taxbase = $linetotal - $taxamount; -	# we are not keeping a natural price, do not round -	$form->{"sellprice_$i"} = $form->{"sellprice_$i"} * (1 / (1 + $taxrate)); -      } else { -	$taxamount = $linetotal * $taxrate; -	$taxbase = $linetotal; -      } - -      if ($taxamount != 0) { -	foreach my $item (split / /, $form->{"taxaccounts_$i"}) { -	  $taxaccounts{$item} += $taxamount * $form->{"${item}_rate"} / $taxrate; -	  $taxbase{$item} += $taxbase; -	} -      } -       -      $netamount += $form->{"sellprice_$i"} * $form->{"qty_$i"}; -       -      $project_id = 'NULL'; -      if ($form->{"project_id_$i"}) { -	$project_id = $form->{"project_id_$i"}; -      } -      $reqdate = ($form->{"reqdate_$i"}) ? qq|'$form->{"reqdate_$i"}'| : "NULL"; -       -      # save detail record in orderitems table -      $query = qq|INSERT INTO orderitems -		 (trans_id, parts_id, description, qty, sellprice, discount, -		  unit, reqdate, project_id) VALUES ( -		  $form->{id}, $form->{"id_$i"}, '$form->{"description_$i"}', -		  $form->{"qty_$i"}, $fxsellprice, $form->{"discount_$i"}, -		  '$form->{"unit_$i"}', $reqdate, $project_id)|; -      $dbh->do($query) || $form->dberror($query); - -      $form->{"sellprice_$i"} = $fxsellprice; -      $form->{"discount_$i"} *= 100; -    } -  } - - -  # set values which could be empty -  map { $form->{$_} *= 1 } qw(vendor_id customer_id taxincluded closed); - -  $reqdate = ($form->{reqdate}) ? qq|'$form->{reqdate}'| : "NULL"; -   -  # add up the tax -  foreach my $item (sort keys %taxaccounts) { -    $taxamount = $form->round_amount($taxaccounts{$item}, 2); -    $tax += $taxamount; -  } -   -  $amount = $form->round_amount($netamount + $tax, 2); -  $netamount = $form->round_amount($netamount, 2); - -  if ($form->{currency} eq $form->{defaultcurrency}) { -    $form->{exchangerate} = 1; -  } else { -    $exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, ($form->{vc} eq 'customer') ? 'buy' : 'sell'); -  } -   -  $form->{exchangerate} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{exchangerate}); -   -  # fill in subject if there is none -  $form->{subject} = qq|$form->{label} $form->{ordnumber}| unless $form->{subject}; -  # if there is a message stuff it into the notes -  my $cc = "Cc: $form->{cc}\\r\n" if $form->{cc}; -  my $bcc = "Bcc: $form->{bcc}\\r\n" if $form->{bcc}; -  $form->{notes} .= qq|\r -\r -[email]\r -To: $form->{email}\r -$cc${bcc}Subject: $form->{subject}\r -\r -Message: $form->{message}\r| if $form->{message}; -   -  # save OE record -  $query = qq|UPDATE oe set -	      ordnumber = '$form->{ordnumber}', -              transdate = '$form->{orddate}', -              vendor_id = $form->{vendor_id}, -	      customer_id = $form->{customer_id}, -              amount = $amount, -              netamount = $netamount, -	      reqdate = $reqdate, -	      taxincluded = '$form->{taxincluded}', -	      shippingpoint = '$form->{shippingpoint}', -	      notes = '$form->{notes}', -	      curr = '$form->{currency}', -	      closed = '$form->{closed}' -              WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  $form->{ordtotal} = $amount; - -  # add shipto -  $form->{name} = $form->{$form->{vc}}; -  $form->{name} =~ s/--$form->{"$form->{vc}_id"}//; -  $form->add_shipto($dbh, $form->{id}); -   -  if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) { -    if ($form->{vc} eq 'customer') { -      $form->update_exchangerate($dbh, $form->{currency}, $form->{orddate}, $form->{exchangerate}, 0); -    } -    if ($form->{vc} eq 'vendor') { -      $form->update_exchangerate($dbh, $form->{currency}, $form->{orddate}, 0, $form->{exchangerate}); -    } -  } -   -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - - -sub delete_order { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my $query; - -  # can't use $form->delete_exchangerate -  if ($form->{currency} ne $form->{defaultcurrency}) { -       $query = qq|SELECT transdate FROM acc_trans -		   WHERE ar.id = trans_id -		   AND ar.curr = '$form->{currency}' -		   AND transdate = '$form->{orddate}' -	   UNION SELECT transdate FROM acc_trans -		   WHERE ap.id = trans_id -		   AND ap.curr = '$form->{currency}' -		   AND transdate = '$form->{orddate}'|; -    my $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); -     -    my ($transdate) = $sth->fetchrow_array; -    $sth->finish; - -    if (!$transdate) { -      $query = qq|DELETE FROM exchangerate -		  WHERE curr = '$form->{currency}' -		  AND transdate = '$form->{orddate}'|; -      $dbh->do($query) || $self->dberror($query); -    } -  } -	       -   -  # delete OE record -  $query = qq|DELETE FROM oe -              WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  # delete individual entries -  $query = qq|DELETE FROM orderitems -              WHERE trans_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); - -  $query = qq|DELETE FROM shipto -              WHERE trans_id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); -   -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - - -sub retrieve_order { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my $query; - -  if ($form->{id}) { -    # get default accounts and last order number -    $query = qq|SELECT (SELECT c.accno FROM chart c -                        WHERE d.inventory_accno_id = c.id) AS inventory_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.income_accno_id = c.id) AS income_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.expense_accno_id = c.id) AS expense_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.fxgain_accno_id = c.id) AS fxgain_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.fxloss_accno_id = c.id) AS fxloss_accno, -                d.curr AS currencies -	 	FROM defaults d|; -  } else { -    my $ordnumber = ($form->{vc} eq 'customer') ? 'sonumber' : 'ponumber'; -    $query = qq|SELECT (SELECT c.accno FROM chart c -                        WHERE d.inventory_accno_id = c.id) AS inventory_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.income_accno_id = c.id) AS income_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.expense_accno_id = c.id) AS expense_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.fxgain_accno_id = c.id) AS fxgain_accno, -                       (SELECT c.accno FROM chart c -		        WHERE d.fxloss_accno_id = c.id) AS fxloss_accno, -                $ordnumber AS ordnumber, d.curr AS currencies, -		current_date AS orddate, current_date AS reqdate -	 	FROM defaults d|; -  } -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $ref = $sth->fetchrow_hashref(NAME_lc); -  map { $form->{$_} = $ref->{$_} } keys %$ref; -  $sth->finish; - -  ($form->{currency}) = split /:/, $form->{currencies}; -   -  if ($form->{id}) { -     -    # retrieve order -    $query = qq|SELECT o.ordnumber, o.transdate AS orddate, o.reqdate, -                o.taxincluded, o.shippingpoint, o.notes, o.curr AS currency, -		(SELECT name FROM employee e -		 WHERE e.id = o.employee_id) AS employee, -		o.$form->{vc}_id, cv.name AS $form->{vc}, o.amount AS invtotal, -		o.closed, o.reqdate -		FROM oe o, $form->{vc} cv -		WHERE o.$form->{vc}_id = cv.id -		AND o.id = $form->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $form->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; -     -    -    $query = qq|SELECT * FROM shipto -                WHERE trans_id = $form->{id}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    $ref = $sth->fetchrow_hashref(NAME_lc); -    map { $form->{$_} = $ref->{$_} } keys %$ref; -    $sth->finish; -     -    my %oid = ( 'Pg'		=> 'oid', -                'Oracle'	=> 'rowid', -                'DB2'		=> '' ); - -    # retrieve individual items -    $query = qq|SELECT c1.accno AS inventory_accno, -                       c2.accno AS income_accno, -		       c3.accno AS expense_accno, -                p.partnumber, p.assembly, o.description, o.qty, -		o.sellprice, o.parts_id AS id, o.unit, o.discount, p.bin, -                o.reqdate, o.project_id, -		pr.projectnumber, -		pg.partsgroup -		FROM orderitems o -		JOIN parts p ON (o.parts_id = p.id) -		LEFT JOIN chart c1 ON (p.inventory_accno_id = c1.id) -		LEFT JOIN chart c2 ON (p.income_accno_id = c2.id) -		LEFT JOIN chart c3 ON (p.expense_accno_id = c3.id) -		LEFT JOIN project pr ON (o.project_id = pr.id) -		LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		WHERE trans_id = $form->{id} -                ORDER BY o.$oid{$myconfig->{dbdriver}}|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while ($ref = $sth->fetchrow_hashref(NAME_lc)) { - -      # get tax rates for part -      $query = qq|SELECT c.accno -                  FROM chart c, partstax pt -	          WHERE pt.chart_id = c.id -	          AND pt.parts_id = $ref->{id}|; -      my $pth = $dbh->prepare($query); -      $pth->execute || $form->dberror($query); - -      $ref->{taxaccounts} = ""; -      my $taxrate = 0; -       -      while (my $ptref = $pth->fetchrow_hashref(NAME_lc)) { -        $ref->{taxaccounts} .= "$ptref->{accno} "; -        $taxrate += $form->{"$ptref->{accno}_rate"}; -      } -      $pth->finish; -      chop $ref->{taxaccounts}; - -      push @{ $form->{order_details} }, $ref; -       -    } -    $sth->finish; - -  } else { - -    my $ordnumber = ($form->{vc} eq 'customer') ? 'sonumber' : 'ponumber'; -    # up order number by 1 -    $form->{ordnumber}++; - -    # save the new number -    $query = qq|UPDATE defaults -                SET $ordnumber = '$form->{ordnumber}'|; -    $dbh->do($query) || $form->dberror($query); - -    $form->get_employee($dbh); -     -    # get last name used -    $form->lastname_used($dbh, $myconfig, $form->{vc}) unless $form->{"$form->{vc}_id"}; - -  } -   -  $form->{exchangerate} = $form->get_exchangerate($dbh, $form->{currency}, $form->{orddate}, ($form->{vc} eq 'customer') ? "buy" : "sell"); -   -  my $rc = $dbh->commit; -  $dbh->disconnect; - -  $rc; -   -} - - - -sub order_details { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -     -  my $tax = 0; -  my $item; -  my $i; -  my @partsgroup = (); -  my $partsgroup; -  my %oid = ( 'Pg' => 'oid', -	      'Oracle' => 'rowid' ); - -  # sort items by partsgroup -  for $i (1 .. $form->{rowcount}) { -    $partsgroup = ""; -    if ($form->{"partsgroup_$i"} && $form->{groupitems}) { -      $form->format_string("partsgroup_$i"); -      $partsgroup = $form->{"partsgroup_$i"}; -    } -    push @partsgroup, [ $i, $partsgroup ]; -  } -   -  my $sameitem = ""; -  foreach $item (sort { $a->[1] cmp $b->[1] } @partsgroup) { -    $i = $item->[0]; - -    if ($item->[1] ne $sameitem) { -      push(@{ $form->{description} }, qq|$item->[1]|); -      $sameitem = $item->[1]; - -      map { push(@{ $form->{$_} }, "") } qw(runningnumber number bin qty unit reqdate sellprice listprice netprice discount linetotal); -    } - -    $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); -     -    if ($form->{"qty_$i"} != 0) { - -      # add number, description and qty to $form->{number}, .... -      push(@{ $form->{runningnumber} }, $i); -      push(@{ $form->{number} }, qq|$form->{"partnumber_$i"}|); -      push(@{ $form->{description} }, qq|$form->{"description_$i"}|); -      push(@{ $form->{qty} }, $form->format_amount($myconfig, $form->{"qty_$i"})); -      push(@{ $form->{unit} }, qq|$form->{"unit_$i"}|); -      push(@{ $form->{reqdate} }, qq|$form->{"reqdate_$i"}|); -       -      push(@{ $form->{sellprice} }, $form->{"sellprice_$i"}); -       -      push(@{ $form->{listprice} }, $form->{"listprice_$i"}); -       -      my $sellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"}); -      my ($dec) = ($sellprice =~ /\.(\d+)/); -      $dec = length $dec; -      my $decimalplaces = ($dec > 2) ? $dec : 2; - -      my $discount = $form->round_amount($sellprice * $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100, $decimalplaces); - -      # keep a netprice as well, (sellprice - discount) -      $form->{"netprice_$i"} = $sellprice - $discount; - -      my $linetotal = $form->round_amount($form->{"qty_$i"} * $form->{"netprice_$i"}, 2); - -      push(@{ $form->{netprice} }, ($form->{"netprice_$i"} != 0) ? $form->format_amount($myconfig, $form->{"netprice_$i"}, $decimalplaces) : " "); -       -      $discount = ($discount != 0) ? $form->format_amount($myconfig, $discount * -1, $decimalplaces) : " "; -      $linetotal = ($linetotal != 0) ? $linetotal : " "; - -      push(@{ $form->{discount} }, $discount); -       -      $form->{ordtotal} += $linetotal; - -      push(@{ $form->{linetotal} }, $form->format_amount($myconfig, $linetotal, 2)); -       -      my ($taxamount, $taxbase); -      my $taxrate = 0; -       -      map { $taxrate += $form->{"${_}_rate"} } split / /, $form->{"taxaccounts_$i"}; - -      if ($form->{taxincluded}) { -	# calculate tax -	$taxamount = $linetotal * $taxrate / (1 + $taxrate); -	$taxbase = $linetotal / (1 + $taxrate); -      } else { -        $taxamount = $linetotal * $taxrate; -	$taxbase = $linetotal; -      } - - -      if ($taxamount != 0) { -	foreach my $item (split / /, $form->{"taxaccounts_$i"}) { -	  $taxaccounts{$item} += $taxamount * $form->{"${item}_rate"} / $taxrate; -	  $taxbase{$item} += $taxbase; -	} -      } - -      if ($form->{"assembly_$i"}) { -        $sameitem = ""; -	 -        # get parts and push them onto the stack -	my $sortorder = ""; -	if ($form->{groupitems}) { -	  $sortorder = qq|ORDER BY pg.partsgroup, a.$oid{$myconfig->{dbdriver}}|; -	} else { -	  $sortorder = qq|ORDER BY a.$oid{$myconfig->{dbdriver}}|; -	} -	 -	$query = qq|SELECT p.partnumber, p.description, p.unit, a.qty, -	            pg.partsgroup -	            FROM assembly a -		    JOIN parts p ON (a.parts_id = p.id) -		    LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id) -		    WHERE a.bom = '1' -		    AND a.id = '$form->{"id_$i"}' -		    $sortorder|; -        $sth = $dbh->prepare($query); -        $sth->execute || $form->dberror($query); - -	while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -	  if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) { -	    map { push(@{ $form->{$_} }, "") } qw(runningnumber number unit bin qty sellprice listprice netprice discount linetotal); -	    $sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--"; -	    push(@{ $form->{description} }, $sameitem); -	  } -	     -	  push(@{ $form->{number} }, qq|$ref->{partnumber}|); -	  push(@{ $form->{description} }, qq|$ref->{description}|); -	  push(@{ $form->{unit} }, qq|$ref->{unit}|); -	  push(@{ $form->{qty} }, $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"})); - -          map { push(@{ $form->{$_} }, "") } qw(runningnumber bin sellprice listprice netprice discount linetotal); -	   -	} -	$sth->finish; -      } - -    } -  } - - -  foreach $item (sort keys %taxaccounts) { -    if ($form->round_amount($taxaccounts{$item}, 2) != 0) { -      push(@{ $form->{taxbase} }, $form->format_amount($myconfig, $taxbase{$item}, 2)); -       -      $taxamount = $form->round_amount($taxaccounts{$item}, 2); -      $tax += $taxamount; -       -      push(@{ $form->{tax} }, $form->format_amount($myconfig, $taxamount, 2)); -      push(@{ $form->{taxdescription} }, $form->{"${item}_description"}); -      push(@{ $form->{taxrate} }, $form->format_amount($myconfig, $form->{"${item}_rate"} * 100)); -      push(@{ $form->{taxnumber} }, $form->{"${item}_taxnumber"}); -    } -  } - - -  $form->{subtotal} = $form->format_amount($myconfig, $form->{ordtotal}, 2); -  $form->{ordtotal} = ($form->{taxincluded}) ? $form->{ordtotal} : $form->{ordtotal} + $tax; -   -  # format amounts -  $form->{ordtotal} = $form->format_amount($myconfig, $form->{ordtotal}, 2); - -  # myconfig variables -  map { $form->{$_} = $myconfig->{$_} } (qw(company address tel fax signature businessnumber)); -  $form->{username} = $myconfig->{name}; - -  $dbh->disconnect; - -} - - -sub project_description { -  my ($self, $dbh, $id) = @_; - -  my $query = qq|SELECT description -                 FROM project -		 WHERE id = $id|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($_) = $sth->fetchrow_array; -   -  $sth->finish; - -  $_; - -} - - -1; - diff --git a/sql-ledger/SL/PE.pm b/sql-ledger/SL/PE.pm deleted file mode 100644 index dec04bb4f..000000000 --- a/sql-ledger/SL/PE.pm +++ /dev/null @@ -1,276 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 1998-2002 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Project module -# also used for partsgroups -# -#====================================================================== - -package PE; - - -sub projects { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $sortorder = ($form->{sort}) ? $form->{sort} : "projectnumber"; - -  my $query = qq|SELECT id, projectnumber, description -                 FROM project -		 WHERE 1 = 1|; - -  if ($form->{projectnumber}) { -    my $projectnumber = $form->like(lc $form->{projectnumber}); -    $query .= " AND lower(projectnumber) LIKE '$projectnumber'"; -  } -  if ($form->{projectdescription}) { -    my $description = $form->like(lc $form->{projectdescription}); -    $query .= " AND lower(description) LIKE '$description'"; -  } -  if ($form->{status} eq 'orphaned') { -    $query .= " AND id NOT IN (SELECT p.id -                               FROM project p, acc_trans a -			       WHERE p.id = a.project_id) -                AND id NOT IN (SELECT p.id -		               FROM project p, invoice i -			       WHERE p.id = i.project_id) -		AND id NOT IN (SELECT p.id -		               FROM project p, orderitems o -			       WHERE p.id = o.project_id)"; -  } - -  $query .= qq| -		 ORDER BY $sortorder|; - -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $i = 0; -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{project_list} }, $ref; -    $i++; -  } - -  $sth->finish; -  $dbh->disconnect; -   -  $i; - -} - - -sub get_project { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  my $query = qq|SELECT * -                 FROM project -	         WHERE id = $form->{id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $ref = $sth->fetchrow_hashref(NAME_lc); -   -  map { $form->{$_} = $ref->{$_} } keys %$ref; - -  $sth->finish; - -  # check if it is orphaned -  $query = qq|SELECT count(*) -              FROM acc_trans -	      WHERE project_id = $form->{id}|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($form->{orphaned}) = $sth->fetchrow_array; -  $form->{orphaned} = !$form->{orphaned}; -        -  $sth->finish; -   -  $dbh->disconnect; - -} - - -sub save_project { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  map { $form->{$_} =~ s/'/''/g } (projectnumber, description); - -  if ($form->{id}) { -    $query = qq|UPDATE project SET -                projectnumber = '$form->{projectnumber}', -		description = '$form->{description}' -		WHERE id = $form->{id}|; -  } else { -    $query = qq|INSERT INTO project -                (projectnumber, description) -                VALUES ('$form->{projectnumber}', '$form->{description}')|; -  } -  $dbh->do($query) || $form->dberror($query); -   -  $dbh->disconnect; - -} - - -sub partsgroups { -  my ($self, $myconfig, $form) = @_; -   -  my $var; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $sortorder = ($form->{sort}) ? $form->{sort} : "partsgroup"; - -  my $query = qq|SELECT g.* -                 FROM partsgroup g|; - -  my $where = "1 = 1"; -   -  if ($form->{partsgroup}) { -    $var = $form->like(lc $form->{partsgroup}); -    $where .= " AND lower(partsgroup) LIKE '$var'"; -  } -  $query .= qq| -               WHERE $where -	       ORDER BY $sortorder|; -   -  if ($form->{status} eq 'orphaned') { -    $query = qq|SELECT g.* -                FROM partsgroup g -                LEFT JOIN parts p ON (p.partsgroup_id = g.id) -		WHERE $where -                EXCEPT -                SELECT g.* -	        FROM partsgroup g -	        JOIN parts p ON (p.partsgroup_id = g.id) -	        WHERE $where -		ORDER BY $sortorder|; -  } - -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $i = 0; -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{item_list} }, $ref; -    $i++; -  } - -  $sth->finish; -  $dbh->disconnect; -   -  $i; - -} - - -sub save_partsgroup { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  map { $form->{$_} =~ s/'/''/g } (partsgroup); - - -  if ($form->{id}) { -    $query = qq|UPDATE partsgroup SET -                partsgroup = '$form->{partsgroup}' -		WHERE id = $form->{id}|; -  } else { -    $query = qq|INSERT INTO partsgroup -                (partsgroup) -                VALUES ('$form->{partsgroup}')|; -  } -  $dbh->do($query) || $form->dberror($query); -   -  $dbh->disconnect; - -} - - -sub get_partsgroup { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  my $query = qq|SELECT * -                 FROM partsgroup -	         WHERE id = $form->{id}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  my $ref = $sth->fetchrow_hashref(NAME_lc); -  -  map { $form->{$_} = $ref->{$_} } keys %$ref; - -  $sth->finish; - -  # check if it is orphaned -  $query = qq|SELECT count(*) -              FROM parts -	      WHERE partsgroup_id = $form->{id}|; -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($form->{orphaned}) = $sth->fetchrow_array; -  $form->{orphaned} = !$form->{orphaned}; -        -  $sth->finish; -   -  $dbh->disconnect; - -} - - - -sub delete_tuple { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -   -  $query = qq|DELETE FROM $form->{type} -	      WHERE id = $form->{id}|; -  $dbh->do($query) || $form->dberror($query); -   -  $dbh->disconnect; - -} - - - -1; - diff --git a/sql-ledger/SL/RC.pm b/sql-ledger/SL/RC.pm deleted file mode 100644 index 9957d7349..000000000 --- a/sql-ledger/SL/RC.pm +++ /dev/null @@ -1,186 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2002 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#====================================================================== -# -# Account reconciliation routines -# -#====================================================================== - -package RC; - - -sub paymentaccounts { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT accno, description -                 FROM chart -		 WHERE link LIKE '%_paid%' -		 AND category = 'A' -		 ORDER BY accno|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{PR} }, $ref; -  } -  $sth->finish; -  $dbh->disconnect; - -} - - -sub payment_transactions { -  my ($self, $myconfig, $form) = @_; - -  # connect to database, turn AutoCommit off -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my ($query, $sth); -   -  # get cleared balance -  if ($form->{fromdate}) { -    $query = qq|SELECT sum(a.amount) -		FROM acc_trans a, chart c -		WHERE a.transdate < date '$form->{fromdate}' -		AND a.cleared = '1' -		AND c.id = a.chart_id -		AND c.accno = '$form->{accno}' -		|; -  } else { -    $query = qq|SELECT sum(a.amount) -		FROM acc_trans a, chart c -		WHERE a.cleared = '1' -		AND c.id = a.chart_id -		AND c.accno = '$form->{accno}' -		|; -  } -   -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  ($form->{beginningbalance}) = $sth->fetchrow_array; - -  $sth->finish; - -  my %oid = ( 'Pg'      => 'ac.oid', -              'Oracle'  => 'ac.rowid'); - -  $query = qq|SELECT c.name, ac.source, ac.transdate, ac.cleared, -	      ac.fx_transaction, ac.amount, a.id, -	      $oid{$myconfig->{dbdriver}} AS oid -	      FROM customer c, acc_trans ac, ar a, chart ch -	      WHERE c.id = a.customer_id -	      AND ac.cleared = '0' -	      AND ac.trans_id = a.id -	      AND ac.chart_id = ch.id -	      AND ch.accno = '$form->{accno}' -	      |; -	       -  $query .= " AND ac.transdate >= '$form->{fromdate}'" if $form->{fromdate}; -  $query .= " AND ac.transdate <= '$form->{todate}'" if $form->{todate}; - - -  $query .= qq| -   -      UNION -              SELECT v.name, ac.source, ac.transdate, ac.cleared, -	      ac.fx_transaction, ac.amount, a.id, -	      $oid{$myconfig->{dbdriver}} AS oid -	      FROM vendor v, acc_trans ac, ap a, chart ch -	      WHERE v.id = a.vendor_id -	      AND ac.cleared = '0' -	      AND ac.trans_id = a.id -	      AND ac.chart_id = ch.id -	      AND ch.accno = '$form->{accno}' -	     |; -	       -  $query .= " AND ac.transdate >= '$form->{fromdate}'" if $form->{fromdate}; -  $query .= " AND ac.transdate <= '$form->{todate}'" if $form->{todate}; - -  $query .= qq| -   -      UNION -	      SELECT g.description, ac.source, ac.transdate, ac.cleared, -	      ac.fx_transaction, ac.amount, g.id, -	      $oid{$myconfig->{dbdriver}} AS oid -	      FROM gl g, acc_trans ac, chart ch -	      WHERE g.id = ac.trans_id -	      AND ac.cleared = '0' -	      AND ac.trans_id = g.id -	      AND ac.chart_id = ch.id -	      AND ch.accno = '$form->{accno}' -	      |; - -  $query .= " AND ac.transdate >= '$form->{fromdate}'" if $form->{fromdate}; -  $query .= " AND ac.transdate <= '$form->{todate}'" if $form->{todate}; - -  $query .= " ORDER BY 3,7,8"; - -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while (my $pr = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{PR} }, $pr; -  } -  $sth->finish; - -  $dbh->disconnect; -   -} - - -sub reconcile { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my ($query, $i); -  my %oid = ( 'Pg'      => 'oid', -              'Oracle'  => 'rowid'); -   -  # clear flags -  for $i (1 .. $form->{rowcount}) { -    if ($form->{"cleared_$i"}) { -      $query = qq|UPDATE acc_trans SET cleared = '1' -                  WHERE $oid{$myconfig->{dbdriver}} = $form->{"oid_$i"}|; -      $dbh->do($query) || $form->dberror($query); - -      # clear fx_transaction -      if ($form->{"fxoid_$i"}) { -	$query = qq|UPDATE acc_trans SET cleared = '1' -		    WHERE $oid{$myconfig->{dbdriver}} = $form->{"fxoid_$i"}|; -	$dbh->do($query) || $form->dberror($query); -      } -    } -  } - -  $dbh->disconnect; - -} - -1; - diff --git a/sql-ledger/SL/RP.pm b/sql-ledger/SL/RP.pm deleted file mode 100644 index 3f07bb525..000000000 --- a/sql-ledger/SL/RP.pm +++ /dev/null @@ -1,1310 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 1998-2002 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: Benjamin Lee <benjaminlee@consultant.com> -# -# 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. -#====================================================================== -# -# backend code for reports -# -#====================================================================== - -package RP; - - -sub income_statement { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $last_period = 0; -  my @categories = qw(I E); -  my $category; - -  $form->{decimalplaces} *= 1; - -  &get_accounts($dbh, $last_period, $form->{fromdate}, $form->{todate}, $form, \@categories); -   -  # if there are any compare dates -  if ($form->{comparefromdate} || $form->{comparetodate}) { -    $last_period = 1; - -    &get_accounts($dbh, $last_period, $form->{comparefromdate}, $form->{comparetodate}, $form, \@categories); -  }   - -   -  # disconnect -  $dbh->disconnect; - - -  # now we got $form->{I}{accno}{ } -  # and $form->{E}{accno}{  } -   -  my %account = ( 'I' => { 'label' => 'income', -                           'labels' => 'income', -			   'ml' => 1 }, -		  'E' => { 'label' => 'expense', -		           'labels' => 'expenses', -			   'ml' => -1 } -		); -   -  my $str; -   -  foreach $category (@categories) { -     -    foreach $key (sort keys %{ $form->{$category} }) { -      # push description onto array -       -      $str = ($form->{l_heading}) ? $form->{padding} : ""; -       -      if ($form->{$category}{$key}{charttype} eq "A") { -	$str .= ($form->{l_accno}) ? "$form->{$category}{$key}{accno} - $form->{$category}{$key}{description}" : "$form->{$category}{$key}{description}"; -      } -      if ($form->{$category}{$key}{charttype} eq "H") { -	if ($account{$category}{subtotal} && $form->{l_subtotal}) { -	  $dash = "- "; -	  push(@{$form->{"$account{$category}{label}_account"}}, "$str$form->{bold}$account{$category}{subdescription}$form->{endbold}"); -	  push(@{$form->{"$account{$category}{labels}_this_period"}}, $form->format_amount($myconfig, $account{$category}{subthis} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -	   -	  if ($last_period) { -	    push(@{$form->{"$account{$category}{labels}_last_period"}}, $form->format_amount($myconfig, $account{$category}{sublast} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -	  } -	   -	} -	 -	$str = "$form->{br}$form->{bold}$form->{$category}{$key}{description}$form->{endbold}"; - -	$account{$category}{subthis} = $form->{$category}{$key}{this}; -	$account{$category}{sublast} = $form->{$category}{$key}{last}; -	$account{$category}{subdescription} = $form->{$category}{$key}{description}; -	$account{$category}{subtotal} = 1; - -	$form->{$category}{$key}{this} = 0; -	$form->{$category}{$key}{last} = 0; - -	next unless $form->{l_heading}; - -	$dash = " "; -      } -       -      push(@{$form->{"$account{$category}{label}_account"}}, $str); -       -      if ($form->{$category}{$key}{charttype} eq 'A') { -	$form->{"total_$account{$category}{labels}_this_period"} += $form->{$category}{$key}{this} * $account{$category}{ml}; -	$dash = "- "; -      } -       -      push(@{$form->{"$account{$category}{labels}_this_period"}}, $form->format_amount($myconfig, $form->{$category}{$key}{this} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -       -      # add amount or - for last period -      if ($last_period) { -	$form->{"total_$account{$category}{labels}_last_period"} += $form->{$category}{$key}{last} * $account{$category}{ml}; - -	push(@{$form->{"$account{$category}{labels}_last_period"}}, $form->format_amount($myconfig,$form->{$category}{$key}{last} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -      } -    } - -    $str = ($form->{l_heading}) ? $form->{padding} : ""; -    if ($account{$category}{subtotal} && $form->{l_subtotal}) { -      push(@{$form->{"$account{$category}{label}_account"}}, "$str$form->{bold}$account{$category}{subdescription}$form->{endbold}"); -      push(@{$form->{"$account{$category}{labels}_this_period"}}, $form->format_amount($myconfig, $account{$category}{subthis} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); - -      if ($last_period) { -	push(@{$form->{"$account{$category}{labels}_last_period"}}, $form->format_amount($myconfig, $account{$category}{sublast} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -      } -    } -       -  } - -   -  # totals for income and expenses -  $form->{total_income_this_period} = $form->round_amount($form->{total_income_this_period}, $form->{decimalplaces}); -  $form->{total_expenses_this_period} = $form->round_amount($form->{total_expenses_this_period}, $form->{decimalplaces}); - -  # total for income/loss -  $form->{total_this_period} = $form->{total_income_this_period} - $form->{total_expenses_this_period}; -   -  if ($last_period) { -    # total for income/loss -    $form->{total_last_period} = $form->format_amount($myconfig, $form->{total_income_last_period} - $form->{total_expenses_last_period}, $form->{decimalplaces}, "- "); -     -    # totals for income and expenses for last_period -    $form->{total_income_last_period} = $form->format_amount($myconfig, $form->{total_income_last_period}, $form->{decimalplaces}, "- "); -    $form->{total_expenses_last_period} = $form->format_amount($myconfig, $form->{total_expenses_last_period}, $form->{decimalplaces}, "- "); - -  } - - -  $form->{total_income_this_period} = $form->format_amount($myconfig,$form->{total_income_this_period}, $form->{decimalplaces}, "- "); -  $form->{total_expenses_this_period} = $form->format_amount($myconfig,$form->{total_expenses_this_period}, $form->{decimalplaces}, "- "); -  $form->{total_this_period} = $form->format_amount($myconfig,$form->{total_this_period}, $form->{decimalplaces}, "- "); - -} - - - -sub balance_sheet { -  my ($self, $myconfig, $form) = @_; -   -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $last_period = 0; -  my @categories = qw(A L Q); - -  # if there are any dates construct a where -  if ($form->{asofdate}) { -     -    $form->{this_period} = "$form->{asofdate}"; -    $form->{period} = "$form->{asofdate}"; -     -  } - -  $form->{decimalplaces} *= 1; - -  &get_accounts($dbh, $last_period, "", $form->{asofdate}, $form, \@categories); -   -  # if there are any compare dates -  if ($form->{compareasofdate}) { - -    $last_period = 1; -    &get_accounts($dbh, $last_period, "", $form->{compareasofdate}, $form, \@categories); -   -    $form->{last_period} = "$form->{compareasofdate}"; - -  }   - -   -  # disconnect -  $dbh->disconnect; - - -  # now we got $form->{A}{accno}{ }    assets -  # and $form->{L}{accno}{ }           liabilities -  # and $form->{Q}{accno}{ }           equity -  # build asset accounts -   -  my $str; -  my $key; -   -  my %account  = ( 'A' => { 'label' => 'asset', -                            'labels' => 'assets', -			    'ml' => -1 }, -		   'L' => { 'label' => 'liability', -		            'labels' => 'liabilities', -			    'ml' => 1 }, -		   'Q' => { 'label' => 'equity', -		            'labels' => 'equities', -			    'ml' => 1 } -		);	     -			     -  foreach $category (@categories) { - -    foreach $key (sort keys %{ $form->{$category} }) { - -      $str = ($form->{l_heading}) ? $form->{padding} : ""; - -      if ($form->{$category}{$key}{charttype} eq "A") { -	$str .= ($form->{l_accno}) ? "$form->{$category}{$key}{accno} - $form->{$category}{$key}{description}" : "$form->{$category}{$key}{description}"; -      } -      if ($form->{$category}{$key}{charttype} eq "H") { -	if ($account{$category}{subtotal} && $form->{l_subtotal}) { -	  $dash = "- "; -	  push(@{$form->{"$account{$category}{label}_account"}}, "$str$form->{bold}$account{$category}{subdescription}$form->{endbold}"); -	  push(@{$form->{"$account{$category}{label}_this_period"}}, $form->format_amount($myconfig, $account{$category}{subthis} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -	   -	  if ($last_period) { -	    push(@{$form->{"$account{$category}{label}_last_period"}}, $form->format_amount($myconfig, $account{$category}{sublast} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -	  } -	} - -	$str = "$form->{bold}$form->{$category}{$key}{description}$form->{endbold}"; -	 -	$account{$category}{subthis} = $form->{$category}{$key}{this}; -	$account{$category}{sublast} = $form->{$category}{$key}{last}; -	$account{$category}{subdescription} = $form->{$category}{$key}{description}; -	$account{$category}{subtotal} = 1; -	 -	$form->{$category}{$key}{this} = 0; -	$form->{$category}{$key}{last} = 0; - -	next unless $form->{l_heading}; - -	$dash = " "; -      } -       -      # push description onto array -      push(@{$form->{"$account{$category}{label}_account"}}, $str); -       -      if ($form->{$category}{$key}{charttype} eq 'A') { -	$form->{"total_$account{$category}{labels}_this_period"} += $form->{$category}{$key}{this} * $account{$category}{ml}; -	$dash = "- "; -      } - -      push(@{$form->{"$account{$category}{label}_this_period"}}, $form->format_amount($myconfig, $form->{$category}{$key}{this} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -       -      if ($last_period) { -	$form->{"total_$account{$category}{labels}_last_period"} += $form->{$category}{$key}{last} * $account{$category}{ml}; - -	push(@{$form->{"$account{$category}{label}_last_period"}}, $form->format_amount($myconfig, $form->{$category}{$key}{last} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -      } -    } - -    $str = ($form->{l_heading}) ? $form->{padding} : ""; -    if ($account{$category}{subtotal} && $form->{l_subtotal}) { -      push(@{$form->{"$account{$category}{label}_account"}}, "$str$form->{bold}$account{$category}{subdescription}$form->{endbold}"); -      push(@{$form->{"$account{$category}{label}_this_period"}}, $form->format_amount($myconfig, $account{$category}{subthis} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -       -      if ($last_period) { -	push(@{$form->{"$account{$category}{label}_last_period"}}, $form->format_amount($myconfig, $account{$category}{sublast} * $account{$category}{ml}, $form->{decimalplaces}, $dash)); -      } -    } - -  } - -   -  # totals for assets, liabilities -  $form->{total_assets_this_period} = $form->round_amount($form->{total_assets_this_period}, $form->{decimalplaces}); -  $form->{total_liabilities_this_period} = $form->round_amount($form->{total_liabilities_this_period}, $form->{decimalplaces}); -   - -  # calculate retained earnings -  $form->{earnings_this_period} = $form->{total_assets_this_period} - $form->{total_liabilities_this_period} - $form->{total_equity_this_period}; - -  push(@{$form->{equity_this_period}}, $form->format_amount($myconfig, $form->{earnings_this_period}, $form->{decimalplaces}, "- ")); -   -  $form->{total_equity_this_period} = $form->round_amount($form->{total_equity_this_period} + $form->{earnings_this_period}, $form->{decimalplaces}); -   -  # add liability + equity -  $form->{total_this_period} = $form->format_amount($myconfig, $form->{total_liabilities_this_period} + $form->{total_equity_this_period}, $form->{decimalplaces}, "- "); - - -  if ($last_period) { -    # totals for assets, liabilities -    $form->{total_assets_last_period} = $form->round_amount($form->{total_assets_last_period}, $form->{decimalplaces}); -    $form->{total_liabilities_last_period} = $form->round_amount($form->{total_liabilities_last_period}, $form->{decimalplaces}); -     - -    # calculate retained earnings -    $form->{earnings_last_period} = $form->{total_assets_last_period} - $form->{total_liabilities_last_period} - $form->{total_equity_last_period}; - -    push(@{$form->{equity_last_period}}, $form->format_amount($myconfig,$form->{earnings_last_period}, $form->{decimalplaces}, "- ")); -     -    $form->{total_equity_last_period} = $form->round_amount($form->{total_equity_last_period} + $form->{earnings_last_period}, $form->{decimalplaces}); - -    # add liability + equity -    $form->{total_last_period} = $form->format_amount($myconfig, $form->{total_liabilities_last_period} + $form->{total_equity_last_period}, $form->{decimalplaces}, "- "); - -  } - -   -  $form->{total_liabilities_last_period} = $form->format_amount($myconfig, $form->{total_liabilities_last_period}, $form->{decimalplaces}, "- ") if ($form->{total_liabilities_last_period} != 0); -   -  $form->{total_equity_last_period} = $form->format_amount($myconfig, $form->{total_equity_last_period}, $form->{decimalplaces}, "- ") if ($form->{total_equity_last_period} != 0); -   -  $form->{total_assets_last_period} = $form->format_amount($myconfig, $form->{total_assets_last_period}, $form->{decimalplaces}, "- ") if ($form->{total_assets_last_period} != 0); -   -  $form->{total_assets_this_period} = $form->format_amount($myconfig, $form->{total_assets_this_period}, $form->{decimalplaces}, "- "); -   -  $form->{total_liabilities_this_period} = $form->format_amount($myconfig, $form->{total_liabilities_this_period}, $form->{decimalplaces}, "- "); -   -  $form->{total_equity_this_period} = $form->format_amount($myconfig, $form->{total_equity_this_period}, $form->{decimalplaces}, "- "); -   -} - - - -sub get_accounts { -  my ($dbh, $last_period, $fromdate, $todate, $form, $categories) = @_; - -  my $query; -  my $where = "WHERE 1 = 1"; -  my $subwhere; -  my $item; -  -  my $category = "AND ("; -  foreach $item (@{ $categories }) { -    $category .= qq|c.category = '$item' OR |; -  } -  $category =~ s/OR $/\)/; - - -  # get headings -  $query = qq|SELECT accno, description, category -	      FROM chart c -	      WHERE c.charttype = 'H' -	      $category -	      ORDER by c.accno|; - -  if ($form->{accounttype} eq 'gifi') -  { -    $query = qq|SELECT g.accno, g.description, c.category -		FROM gifi g -		JOIN chart c ON (c.gifi_accno = g.accno) -		WHERE c.charttype = 'H' -		$category -		ORDER BY g.accno|; -  } - -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -   -  my @headingaccounts = (); -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) -  { -    $form->{$ref->{category}}{$ref->{accno}}{description} = "$ref->{description}"; -    $form->{$ref->{category}}{$ref->{accno}}{charttype} = "H"; -    $form->{$ref->{category}}{$ref->{accno}}{accno} = $ref->{accno}; -     -    push @headingaccounts, $ref->{accno}; -  } - -  $sth->finish; - - -  $where .= " AND ac.transdate >= '$fromdate'" if $fromdate; - -  if ($todate) { -    $where .= " AND ac.transdate <= '$todate'"; -    $subwhere = " AND transdate <= '$todate'"; -  } -     - -  if ($form->{project_id}) -  { -    $project = qq| -                 AND ac.project_id = $form->{project_id} -		 |; -  } - - -  if ($form->{accounttype} eq 'gifi') -  { -     -    if ($form->{method} eq 'cash') -    { - -	$query = qq| -	 -	         SELECT g.accno, sum(ac.amount) AS amount, -		 g.description, c.category -		 FROM acc_trans ac -	         JOIN chart c ON (c.id = ac.chart_id) -	         JOIN ar a ON (a.id = ac.trans_id) -	         JOIN gifi g ON (g.accno = c.gifi_accno) -		 $where -		 $category -		 AND ac.trans_id IN -		   ( -		     SELECT trans_id -		     FROM acc_trans -		     JOIN chart ON (chart_id = id) -		     WHERE link LIKE '%AR_paid%' -		     $subwhere -		   ) -		 $project -		 GROUP BY g.accno, g.description, c.category -		  -       UNION -        -		 SELECT '' AS accno, SUM(ac.amount) AS amount, -		 '' AS description, c.category -		 FROM acc_trans ac -	         JOIN chart c ON (c.id = ac.chart_id) -	         JOIN ar a ON (a.id = ac.trans_id) -		 $where -		 $category -		 AND c.gifi_accno = '' -		 AND ac.trans_id IN -		   ( -		     SELECT trans_id -		     FROM acc_trans -		     JOIN chart ON (chart_id = id) -		     WHERE link LIKE '%AR_paid%' -		     $subwhere -		   ) -		 $project -		 GROUP BY c.category - -       UNION - -       	         SELECT g.accno, sum(ac.amount) AS amount, -		 g.description, c.category -		 FROM acc_trans ac -	         JOIN chart c ON (c.id = ac.chart_id) -	         JOIN ap a ON (a.id = ac.trans_id) -	         JOIN gifi g ON (g.accno = c.gifi_accno) -		 $where -		 $category -		 AND ac.trans_id IN -		   ( -		     SELECT trans_id -		     FROM acc_trans -		     JOIN chart ON (chart_id = id) -		     WHERE link LIKE '%AP_paid%' -		     $subwhere -		   ) -		 $project -		 GROUP BY g.accno, g.description, c.category -		  -       UNION -        -		 SELECT '' AS accno, SUM(ac.amount) AS amount, -		 '' AS description, c.category -		 FROM acc_trans ac -	         JOIN chart c ON (c.id = ac.chart_id) -	         JOIN ap a ON (a.id = ac.trans_id) -		 $where -		 $category -		 AND c.gifi_accno = '' -		 AND ac.trans_id IN -		   ( -		     SELECT trans_id -		     FROM acc_trans -		     JOIN chart ON (chart_id = id) -		     WHERE link LIKE '%AP_paid%' -		     $subwhere -		   ) -		 $project -		 GROUP BY c.category - -       UNION - --- add gl -	 -	         SELECT g.accno, sum(ac.amount) AS amount, -		 g.description, c.category -		 FROM acc_trans ac -	         JOIN chart c ON (c.id = ac.chart_id) -	         JOIN gifi g ON (g.accno = c.gifi_accno) -	         JOIN gl a ON (a.id = ac.trans_id) -		 $where -		 $category -		 AND NOT (c.link = 'AR' OR c.link = 'AP') -		 $project -		 GROUP BY g.accno, g.description, c.category -		  -       UNION -        -		 SELECT '' AS accno, SUM(ac.amount) AS amount, -		 '' AS description, c.category -		 FROM acc_trans ac -	         JOIN chart c ON (c.id = ac.chart_id) -	         JOIN gl a ON (a.id = ac.trans_id) -		 $where -		 $category -		 AND c.gifi_accno = '' -		 AND NOT (c.link = 'AR' OR c.link = 'AP') -		 $project -		 GROUP BY c.category -		 |; - -    } else { - -      $query = qq| -       -	      SELECT g.accno, SUM(ac.amount) AS amount, -	      g.description, c.category -	      FROM acc_trans ac -	      JOIN chart c ON (c.id = ac.chart_id) -	      JOIN gifi g ON (c.gifi_accno = g.accno) -	      $where -	      $category -	      $project -	      GROUP BY g.accno, g.description, c.category -	       -	   UNION -	    -	      SELECT '' AS accno, SUM(ac.amount) AS amount, -	      '' AS description, c.category -	      FROM acc_trans ac -	      JOIN chart c ON (c.id = ac.chart_id) -	      $where -	      $category -	      AND c.gifi_accno = '' -	      $project -	      GROUP by c.category -	      |; -	       -    } -     -  } else { - -    if ($form->{method} eq 'cash') -    { - - -      $query = qq| -	 -	         SELECT c.accno, sum(ac.amount) AS amount, -		 c.description, c.category -		 FROM acc_trans ac -		 JOIN chart c ON (c.id = ac.chart_id) -		 JOIN ar a ON (a.id = ac.trans_id) -		 $where -		 $category -		 AND ac.trans_id IN -		   ( -		     SELECT trans_id -		     FROM acc_trans -		     JOIN chart ON (chart_id = id) -		     WHERE link LIKE '%AR_paid%' -		     $subwhere -		   ) -		      -		 $project -		 GROUP BY c.accno, c.description, c.category -		  -	UNION -	 -	         SELECT c.accno, sum(ac.amount) AS amount, -		 c.description, c.category -		 FROM acc_trans ac -		 JOIN chart c ON (c.id = ac.chart_id) -		 JOIN ap a ON (a.id = ac.trans_id) -		 $where -		 $category -		 AND ac.trans_id IN -		   ( -		     SELECT trans_id -		     FROM acc_trans -		     JOIN chart ON (chart_id = id) -		     WHERE link LIKE '%AP_paid%' -		     $subwhere -		   ) -		      -		 $project -		 GROUP BY c.accno, c.description, c.category -		  -        UNION - -		 SELECT c.accno, sum(ac.amount) AS amount, -		 c.description, c.category -		 FROM acc_trans ac -		 JOIN chart c ON (c.id = ac.chart_id) -		 JOIN gl a ON (a.id = ac.trans_id) -		 $where -		 $category -		 AND NOT (c.link = 'AR' OR c.link = 'AP') -		 $project -		 GROUP BY c.accno, c.description, c.category -		 |; -		  -    } else { -      -      $query = qq| -       -		 SELECT c.accno, sum(ac.amount) AS amount, -		 c.description, c.category -		 FROM acc_trans ac -		 JOIN chart c ON (c.id = ac.chart_id) -		 $where -		 $category -		 $project -		 GROUP BY c.accno, c.description, c.category -		 |; - -    } -     -  } - - -  my @accno; -  my $accno; -  my $ref; -   -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) -  { - -    if ($ref->{category} eq 'C') { -      $ref->{category} = 'A'; -    } -       -    # get last heading account -    @accno = grep { $_ le "$ref->{accno}" } @headingaccounts; -    $accno = pop @accno; -    if ($accno) { -      if ($last_period) -      { -	$form->{$ref->{category}}{$accno}{last} += $ref->{amount}; -      } else { -	$form->{$ref->{category}}{$accno}{this} += $ref->{amount}; -      } -    } -     -    $form->{$ref->{category}}{$ref->{accno}}{accno} = $ref->{accno}; -    $form->{$ref->{category}}{$ref->{accno}}{description} = $ref->{description}; -    $form->{$ref->{category}}{$ref->{accno}}{charttype} = "A"; -     -    if ($last_period) -    { -      $form->{$ref->{category}}{$ref->{accno}}{last} += $ref->{amount}; -    } else { -      $form->{$ref->{category}}{$ref->{accno}}{this} += $ref->{amount}; -    } -  } -  $sth->finish; - -   -  # remove accounts with zero balance -  foreach $category (@{ $categories }) { -    foreach $accno (keys %{ $form->{$category} }) { -      $form->{$category}{$accno}{last} = $form->round_amount($form->{$category}{$accno}{last}, $form->{decimalplaces}); -      $form->{$category}{$accno}{this} = $form->round_amount($form->{$category}{$accno}{this}, $form->{decimalplaces}); - -      delete $form->{$category}{$accno} if ($form->{$category}{$accno}{this} == 0 && $form->{$category}{$accno}{last} == 0); -    } -  } - -} - - - -sub trial_balance_details { -  my ($self, $myconfig, $form) = @_; - -  my $dbh = $form->dbconnect($myconfig); - -  my ($query, $sth, $ref); -  my %balance = (); -  my %trb = (); - -  my $where = "WHERE 1 = 1"; - -  if ($form->{project_id}) { -    $where .= qq| -                AND a.project_id = $form->{project_id} -		|; -  } -   -  # get beginning balances -  if ($form->{fromdate}) { - -    if ($form->{accounttype} eq 'gifi') { -       -      $query = qq|SELECT g.accno, c.category, SUM(a.amount) AS amount, -                  g.description -		  FROM acc_trans a -		  JOIN chart c ON (a.chart_id = c.id) -		  JOIN gifi g ON (c.gifi_accno = g.accno) -		  $where -		  AND a.transdate < '$form->{fromdate}' -		  GROUP BY g.accno, c.category, g.description -		  |; -    -    } else { -       -      $query = qq|SELECT c.accno, c.category, SUM(a.amount) AS amount, -                  c.description -		  FROM acc_trans a -		  JOIN chart c ON (a.chart_id = c.id) -		  $where -		  AND a.transdate < '$form->{fromdate}' -		  GROUP BY c.accno, c.category, c.description -		  |; -    } - -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -      $balance{$ref->{accno}} = $ref->{amount}; - -      if ($ref->{amount} != 0 && $form->{all_accounts}) { -	$trb{$ref->{accno}}{description} = $ref->{description}; -	$trb{$ref->{accno}}{charttype} = 'A'; -	$trb{$ref->{accno}}{category} = $ref->{category}; -      } - -    } -    $sth->finish; - -  } - - -  # get headings -  $query = qq|SELECT c.accno, c.description, c.category -	      FROM chart c -	      WHERE c.charttype = 'H' -	      ORDER by c.accno|; - -  if ($form->{accounttype} eq 'gifi') -  { -    $query = qq|SELECT g.accno, g.description, c.category -		FROM gifi g -		JOIN chart c ON (c.gifi_accno = g.accno) -		WHERE c.charttype = 'H' -		ORDER BY g.accno|; -  } - -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -   -  my @headingaccounts = (); -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) -  { -    $trb{$ref->{accno}}{description} = $ref->{description}; -    $trb{$ref->{accno}}{charttype} = 'H'; -    $trb{$ref->{accno}}{category} = $ref->{category}; -    -    push @headingaccounts, $ref->{accno}; -  } - -  $sth->finish; - - -  if ($form->{fromdate} || $form->{todate}) { -    if ($form->{fromdate}) { -      $where .= " AND a.transdate >= '$form->{fromdate}'"; -    } -    if ($form->{todate}) { -      $where .= " AND a.transdate <= '$form->{todate}'"; -    } -  } - - -  if ($form->{accounttype} eq 'gifi') { - -    $query = qq|SELECT g.accno, g.description, c.category, -                SUM(a.amount) AS amount -		FROM acc_trans a -		JOIN chart c ON (c.id = a.chart_id) -		JOIN gifi g ON (c.gifi_accno = g.accno) -		$where -		GROUP BY g.accno, g.description, c.category -		 -	      UNION - -		SELECT '' AS accno, '' AS description, c.category, -		SUM(a.amount) AS amount -		FROM acc_trans a -		JOIN chart c ON (c.id = a.chart_id) -		$where -		AND c.gifi_accno = '' -		GROUP BY c.category -		ORDER BY accno|; -     -  } else { - -    $query = qq|SELECT c.accno, c.description, c.category, -                SUM(a.amount) AS amount -		FROM acc_trans a -		JOIN chart c ON (c.id = a.chart_id) -		$where -		GROUP BY c.accno, c.description, c.category -                ORDER BY accno|; - -  } -   -  $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - - -  # prepare query for each account -     -  $query = qq|SELECT (SELECT SUM(a.amount) * -1 -	      FROM acc_trans a -	      JOIN chart c ON (c.id = a.chart_id) -	      $where -	      AND a.amount < 0 -	      AND c.accno = ?) AS debit, -	     (SELECT SUM(a.amount) -	      FROM acc_trans a -	      JOIN chart c ON (c.id = a.chart_id) -	      $where -	      AND a.amount > 0 -	      AND c.accno = ?) AS credit -	      |; - -  if ($form->{accounttype} eq 'gifi') { - -    $query = qq|SELECT (SELECT SUM(a.amount) * -1 -		FROM acc_trans a -		JOIN chart c ON (c.id = a.chart_id) -		$where -		AND a.amount < 0 -		AND c.gifi_accno = ?) AS debit, -	       (SELECT SUM(a.amount) -		FROM acc_trans a -		JOIN chart c ON (c.id = a.chart_id) -		$where -		AND a.amount > 0 -		AND c.gifi_accno = ?) AS credit|; -   -  } -    -  $drcr = $dbh->prepare($query); -   -  # calculate the debit and credit in the period -  while ($ref = $sth->fetchrow_hashref(NAME_lc)) { -    $trb{$ref->{accno}}{description} = $ref->{description}; -    $trb{$ref->{accno}}{charttype} = 'A'; -    $trb{$ref->{accno}}{category} = $ref->{category}; -    $trb{$ref->{accno}}{amount} += $ref->{amount}; - -  } -  $sth->finish; - -  my ($debit, $credit); -   -  foreach my $accno (sort keys %trb) { -    $ref = (); - -    $ref->{accno} = $accno; -    map { $ref->{$_} = $trb{$accno}{$_} } qw(description category charttype amount); -     -    $ref->{balance} = $form->round_amount($balance{$ref->{accno}}, 2); - -    if ($trb{$accno}{charttype} eq 'A') { -      # get DR/CR -      $drcr->execute($ref->{accno}, $ref->{accno}) || $form->dberror($query); -       -      ($debit, $credit) = (0,0); -      while (($debit, $credit) = $drcr->fetchrow_array) { -	$ref->{debit} += $debit; -	$ref->{credit} += $credit; -      } -      $drcr->finish; - -      $ref->{debit} = $form->round_amount($ref->{debit}, 2); -      $ref->{credit} = $form->round_amount($ref->{credit}, 2); -     -    } - - -    # add subtotal -    @accno = grep { $_ le "$ref->{accno}" } @headingaccounts; -    $accno = pop @accno; -    if ($accno) { -      $trb{$accno}{debit} += $ref->{debit}; -      $trb{$accno}{credit} += $ref->{credit}; -    } -    -    push @{ $form->{TB} }, $ref; -     -  } - -  $dbh->disconnect; - -  # debits and credits for headings -  foreach $accno (@headingaccounts) { -    foreach $ref (@{ $form->{TB} }) { -      if ($accno eq $ref->{accno}) { -        $ref->{debit} = $trb{$accno}{debit}; -        $ref->{credit} = $trb{$accno}{credit}; -      } -    } -  } - -} - - - -sub aging { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); -  my $invoice = ($form->{arap} eq 'ar') ? 'is' : 'ir'; -   -  $form->{todate} = $form->current_date($myconfig) unless ($form->{todate}); - -  my $where = "1 = 1"; -  my $name; - -  if ($form->{"$form->{ct}_id"}) { -    $where .= qq| AND ct.id = $form->{"$form->{ct}_id"}|; -  } else { -    if ($form->{$form->{ct}}) { -      $name = $form->like(lc $form->{$form->{ct}}); -      $where .= qq| AND lower(ct.name) LIKE '$name'| if $form->{$form->{ct}}; -    } -  } - -  # select outstanding vendors or customers, depends on $ct -  my $query = qq|SELECT DISTINCT ct.id, ct.name -                 FROM $form->{ct} ct, $form->{arap} a -		 WHERE $where -                 AND a.$form->{ct}_id = ct.id -                 AND a.paid != a.amount -                 AND (a.transdate <= '$form->{todate}') -                 ORDER BY ct.name|; - -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror; - -  my $buysell = ($form->{arap} eq 'ar') ? 'buy' : 'sell'; -   -  # for each company that has some stuff outstanding -  while ( my ($id) = $sth->fetchrow_array ) { -   -    $query = qq| - --- between 0-30 days - -	SELECT $form->{ct}.id AS ctid, $form->{ct}.name, -	addr1, addr2, addr3, addr4, contact, -	phone as customerphone, fax as customerfax, $form->{ct}number, -	"invnumber", "transdate", -	(amount - paid) as "c0", 0.00 as "c30", 0.00 as "c60", 0.00 as "c90", -	"duedate", invoice, $form->{arap}.id, -	  (SELECT $buysell FROM exchangerate -	   WHERE $form->{arap}.curr = exchangerate.curr -	   AND exchangerate.transdate = $form->{arap}.transdate) AS exchangerate -  FROM $form->{arap}, $form->{ct}  -	WHERE paid != amount -	AND $form->{arap}.$form->{ct}_id = $form->{ct}.id -	AND $form->{ct}.id = $id -	AND ( -	        transdate <= (date '$form->{todate}' - interval '0 days')  -	        AND transdate >= (date '$form->{todate}' - interval '30 days') -	    ) -	 -	UNION - --- between 31-60 days - -	SELECT $form->{ct}.id AS ctid, $form->{ct}.name, -	addr1, addr2, addr3, addr4, contact, -	phone as customerphone, fax as customerfax, $form->{ct}number, -	"invnumber", "transdate",  -	0.00 as "c0", (amount - paid) as "c30", 0.00 as "c60", 0.00 as "c90", -	"duedate", invoice, $form->{arap}.id, -	  (SELECT $buysell FROM exchangerate -	   WHERE $form->{arap}.curr = exchangerate.curr -	   AND exchangerate.transdate = $form->{arap}.transdate) AS exchangerate -  FROM $form->{arap}, $form->{ct} -	WHERE paid != amount  -	AND $form->{arap}.$form->{ct}_id = $form->{ct}.id  -	AND $form->{ct}.id = $id -	AND ( -		transdate < (date '$form->{todate}' - interval '30 days')  -		AND transdate >= (date '$form->{todate}' - interval '60 days') -		) - -	UNION -   --- between 61-90 days - -	SELECT $form->{ct}.id AS ctid, $form->{ct}.name, -	addr1, addr2, addr3, addr4, contact, -	phone as customerphone, fax as customerfax, $form->{ct}number, -	"invnumber", "transdate",  -	0.00 as "c0", 0.00 as "c30", (amount - paid) as "c60", 0.00 as "c90", -	"duedate", invoice, $form->{arap}.id, -	  (SELECT $buysell FROM exchangerate -	   WHERE $form->{arap}.curr = exchangerate.curr -	   AND exchangerate.transdate = $form->{arap}.transdate) AS exchangerate -	FROM $form->{arap}, $form->{ct}  -	WHERE paid != amount -	AND $form->{arap}.$form->{ct}_id = $form->{ct}.id  -	AND $form->{ct}.id = $id -	AND ( -		transdate < (date '$form->{todate}' - interval '60 days')  -		AND transdate >= (date '$form->{todate}' - interval '90 days') -		) - -	UNION -   --- over 90 days - -	SELECT $form->{ct}.id AS ctid, $form->{ct}.name, -	addr1, addr2, addr3, addr4, contact, -	phone as customerphone, fax as customerfax, $form->{ct}number, -	"invnumber", "transdate",  -	0.00 as "c0", 0.00 as "c30", 0.00 as "c60", (amount - paid) as "c90", -	"duedate", invoice, $form->{arap}.id, -	  (SELECT $buysell FROM exchangerate -	   WHERE $form->{arap}.curr = exchangerate.curr -	   AND exchangerate.transdate = $form->{arap}.transdate) AS exchangerate -	FROM $form->{arap}, $form->{ct}  -	WHERE paid != amount -	AND $form->{arap}.$form->{ct}_id = $form->{ct}.id  -	AND $form->{ct}.id = $id -	AND transdate < (date '$form->{todate}' - interval '90 days')  - -	ORDER BY -   -  ctid, invnumber, transdate -   -		|; - -    my $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror; - -    while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -      $ref->{module} = ($ref->{invoice}) ? $invoice : $form->{arap}; -      $ref->{exchangerate} = 1 unless $ref->{exchangerate}; -      push @{ $form->{AG} }, $ref; -    } -     -    $sth->finish; - -  } - -  $sth->finish; -  # disconnect -  $dbh->disconnect; - -} - - -sub get_customer { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  my $query = qq|SELECT name, email, cc, bcc -                 FROM $form->{ct} ct -		 WHERE ct.id = $form->{"$form->{ct}_id"}|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror; - -  ($form->{$form->{ct}}, $form->{email}, $form->{cc}, $form->{bcc}) = $sth->fetchrow_array; -  $sth->finish; -  $dbh->disconnect; - -} - - -sub get_taxaccounts { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  # get tax accounts -  my $query = qq|SELECT accno, description -                 FROM chart -		 WHERE link LIKE '%CT_tax%' -                 ORDER BY accno|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror; - -  while ( my ($accno, $description) = $sth->fetchrow_array ) { -    push @{ $form->{taxaccounts} }, "$accno--$description"; -  } -  $sth->finish; - -  # get gifi tax accounts -  my $query = qq|SELECT DISTINCT ON (g.accno) g.accno, g.description -                 FROM gifi g, chart c -		 WHERE g.accno = c.gifi_accno -		 AND c.link LIKE '%CT_tax%' -                 ORDER BY accno|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror; - -  while ( my ($accno, $description) = $sth->fetchrow_array ) { -    push @{ $form->{gifi_taxaccounts} }, "$accno--$description"; -  } -  $sth->finish; - -  $dbh->disconnect; - -} - - - -sub tax_report { -  my ($self, $myconfig, $form) = @_; - -  # connect to database -  my $dbh = $form->dbconnect($myconfig); - -  # build WHERE -  my $where = qq|WHERE ac.trans_id = a.id -	         AND ac.chart_id = ch.id|; -		  - -  if ($form->{accno} =~ /^gifi_/) { -    my ($null, $accno) = split /_/, $form->{accno}; -    $where .= qq| AND ch.gifi_accno = '$accno'|; -  } else { -    $where .= qq| AND ch.accno = '$form->{accno}'|; -  } - -  my $table; -   -  if ($form->{db} eq 'ar') { -    $where .= " AND n.id = a.customer_id"; -    $table = "customer"; -  } -  if ($form->{db} eq 'ap') { -    $where .= " AND n.id = a.vendor_id"; -    $table = "vendor"; -  } - -  my $transdate = ($form->{cashbased}) ? "a.datepaid" : "ac.transdate"; -  if ($form->{cashbased}) { -    $where .= " AND a.amount = a.paid"; -  } - -  # if there are any dates construct a where -  if ($form->{fromdate} || $form->{todate}) { -    if ($form->{fromdate}) { -      $where .= " AND $transdate >= '$form->{fromdate}'"; -    } -    if ($form->{todate}) { -      $where .= " AND $transdate <= '$form->{todate}'"; -    } -  } -   -  my $query = qq|SELECT a.id, a.invoice, $transdate AS transdate, a.invnumber, -                        n.name, a.netamount,|; -  my $sortorder = join ', ', $form->sort_columns(qw(transdate invnumber name)); -  $sortorder = $form->{sort} unless $sortorder; -   -  if ($form->{db} eq 'ar') { -    $query .= " ac.amount AS tax"; -  } -  if ($form->{db} eq 'ap') { -    $query .= " ac.amount * -1 AS tax"; -  } - -  $query .= qq| -               FROM acc_trans ac, "$form->{db}" a, "$table" n, chart ch -	       $where -	       ORDER by $sortorder|; - -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); - -  while ( my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{TR} }, $ref; -  } - -  $sth->finish; -  $dbh->disconnect; - -} - - -sub paymentaccounts { -  my ($self, $myconfig, $form) = @_; -  -  # connect to database, turn AutoCommit off -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my $arap = uc $form->{db}; -  $arap .= "_paid"; -   -  # get A(R|P)_paid accounts -  my $query = qq|SELECT accno, description -                 FROM chart -                 WHERE link LIKE '%$arap%'|; -  my $sth = $dbh->prepare($query); -  $sth->execute || $form->dberror($query); -  -  while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { -    push @{ $form->{PR} }, $ref; -  } - -  $sth->finish; -  $dbh->disconnect; - -} - -  -sub payments { -  my ($self, $myconfig, $form) = @_; - -  # connect to database, turn AutoCommit off -  my $dbh = $form->dbconnect_noauto($myconfig); - -  my $ml = 1; -  if ($form->{db} eq 'ar') { -    $table = 'customer'; -    $ml = -1; -  } -  if ($form->{db} eq 'ap') { -    $table = 'vendor'; -  } -   -  my ($query, $sth); -   -  # cycle through each id -  foreach my $accno (split(/ /, $form->{paymentaccounts})) { - -    $query = qq|SELECT id, accno, description -                FROM chart -		WHERE accno = '$accno'|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    my $ref = $sth->fetchrow_hashref(NAME_lc); -    push @{ $form->{PR} }, $ref; -    $sth->finish; - -    $query = qq|SELECT c.name, a.invnumber, a.ordnumber, -		ac.transdate, -		ac.amount * $ml AS paid, ac.source, a.invoice, a.id, -		'$form->{db}' AS module -		FROM $table c, acc_trans ac, $form->{db} a -		WHERE c.id = a.${table}_id -		AND ac.trans_id = a.id -		AND ac.chart_id = $ref->{id}|; -		 -    $query .= " AND ac.transdate >= '$form->{fromdate}'" if $form->{fromdate}; -    $query .= " AND ac.transdate <= '$form->{todate}'" if $form->{todate}; - -    $query .= qq| - 	UNION -		SELECT g.description, g.reference, NULL AS ordnumber, -		 ac.transdate, -		 ac.amount * $ml AS paid, ac.source, '0' as invoice, g.id, -		 'gl' AS module -		 FROM gl g, acc_trans ac -		 WHERE g.id = ac.trans_id -		 AND ac.chart_id = $ref->{id} -		 AND (ac.amount * $ml) > 0 -		|; - -    $query .= " AND ac.transdate >= '$form->{fromdate}'" if $form->{fromdate}; -    $query .= " AND ac.transdate <= '$form->{todate}'" if $form->{todate}; - - -    my $sortorder = join ', ', $form->sort_columns(qw(name invnumber ordnumber transdate source)); -     -    $query .= " ORDER BY $sortorder"; - -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while (my $pr = $sth->fetchrow_hashref(NAME_lc)) { -      push @{ $form->{$ref->{id}} }, $pr; -    } -    $sth->finish; - -  } -   -  $dbh->disconnect; -   -} - - -1; - - diff --git a/sql-ledger/SL/User.pm b/sql-ledger/SL/User.pm deleted file mode 100644 index d9b463d6b..000000000 --- a/sql-ledger/SL/User.pm +++ /dev/null @@ -1,692 +0,0 @@ -#===================================================================== -# SQL-Ledger Accounting -# Copyright (C) 2001 -# -#  Author: Dieter Simader -#   Email: dsimader@sql-ledger.org -#     Web: http://www.sql-ledger.org -# -#  Contributors: -# -# 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. -#===================================================================== -# -# user related functions -# -#===================================================================== - -package User; - - -sub new { -  my ($type, $memfile, $login) = @_; -  my $self = {}; - -  if ($login ne "") { -    # check if the file is locked -    &error("", "$memfile locked!") if (-f "${memfile}.LCK"); -     -    open(MEMBER, "$memfile") or &error("", "$memfile : $!"); -     -    while (<MEMBER>) { -      if (/^\[$login\]/) { -	while (<MEMBER>) { -	  last if /^\[/; -	  next if /^(#|\s)/; -	   -	  # remove comments -	  s/\s#.*//g; - -	  # remove any trailing whitespace -	  s/^\s*(.*?)\s*$/$1/; - -	  ($key, $value) = split /=/, $_, 2; -	   -	  $self->{$key} = $value; -	} -	 -	$self->{login} = $login; - -	last; -      } -    } -    close MEMBER; -  } -   -  bless $self, $type; -} - - -sub country_codes { - -  my %cc = (); -  my @language = (); -   -  # scan the locale directory and read in the LANGUAGE files -  opendir DIR, "locale"; - -  my @dir = grep !/(^\.\.?$|\..*)/, readdir DIR; -   -  foreach my $dir (@dir) { -    next unless open(FH, "locale/$dir/LANGUAGE"); -    @language = <FH>; -    close FH; - -    $cc{$dir} = "@language"; -  } - -  closedir(DIR); -   -  %cc; - -} - - -sub login { -  my ($self, $form, $userspath) = @_; - - -  if ($self->{login}) { -     -    if ($self->{password}) { -      $form->{password} = crypt $form->{password}, substr($self->{login}, 0, 2); -      if ($self->{password} ne $form->{password}) { -	return -1; -      } -    } -     -    unless (-e "$userspath/$self->{login}.conf") { -      $self->create_config("$userspath/$self->{login}.conf"); -    } -     -    do "$userspath/$self->{login}.conf"; -    $myconfig{dbpasswd} = unpack 'u', $myconfig{dbpasswd}; -   -    # check if database is down -    my $dbh = DBI->connect($myconfig{dbconnect}, $myconfig{dbuser}, $myconfig{dbpasswd}) or $self->error(DBI::errstr); - -    # we got a connection, check the version -    my $query = qq|SELECT version FROM defaults|; -    my $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    my ($dbversion) = $sth->fetchrow_array; -    $sth->finish; - -    # add login to employee table if it does not exist -    # no error check for employee table, ignore if it does not exist -    $query = qq|SELECT id FROM employee WHERE login = '$self->{login}'|; -    $sth = $dbh->prepare($query); -    $sth->execute; - -    my ($login) = $sth->fetchrow_array; -    $sth->finish; - -    if (!$login) { -      $query = qq|INSERT INTO employee (login, name, workphone) -                  VALUES ('$self->{login}', '$myconfig{name}', '$myconfig{tel}')|; -      $dbh->do($query); -    } -    $dbh->disconnect; - -    if ($form->{dbversion} ne $dbversion) { -      return -2; -    } - -  } else { -    return -3; -  } - -} - - - -sub dbconnect_vars { -  my ($form, $db) = @_; -   -  my %dboptions = ( -     'Pg' => { -        'yy-mm-dd' => 'set DateStyle to \'ISO\'', -	'mm/dd/yy' => 'set DateStyle to \'SQL, US\'', -	'mm-dd-yy' => 'set DateStyle to \'POSTGRES, US\'', -	'dd/mm/yy' => 'set DateStyle to \'SQL, EUROPEAN\'', -	'dd-mm-yy' => 'set DateStyle to \'POSTGRES, EUROPEAN\'', -	'dd.mm.yy' => 'set DateStyle to \'GERMAN\'' -	     }, -     'Oracle' => { -	'yy-mm-dd' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'YY-MM-DD\'', -	'mm/dd/yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'MM/DD/YY\'', -	'mm-dd-yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'MM-DD-YY\'', -	'dd/mm/yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD/MM/YY\'', -	'dd-mm-yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD-MM-YY\'', -	'dd.mm.yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD.MM.YY\'', -	         } -     ); -			      -  $form->{dboptions} = $dboptions{$form->{dbdriver}}{$form->{dateformat}}; - -  if ($form->{dbdriver} eq 'Pg') { -    $form->{dbconnect} = "dbi:Pg:dbname=$db"; -  } - -  if ($form->{dbdriver} eq 'Oracle') { -    $form->{dbconnect} = "dbi:Oracle:sid=$form->{sid}"; -  } - -  if ($form->{dbhost}) { -    $form->{dbconnect} .= ";host=$form->{dbhost}"; -  } -  if ($form->{dbport}) { -    $form->{dbconnect} .= ";port=$form->{dbport}"; -  } -   -} - - -sub dbdrivers { - -  my @drivers = DBI->available_drivers(); - -  return (grep { /(Pg|Oracle)$/ } @drivers); - -} - - -sub dbsources { -  my ($self, $form) = @_; - -  my @dbsources = (); -  my ($sth, $query); -   -  $form->{dbdefault} = $form->{dbuser} unless $form->{dbdefault}; -  $form->{sid} = $form->{dbdefault}; -  &dbconnect_vars($form, $form->{dbdefault}); - -  my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; - - -  if ($form->{dbdriver} eq 'Pg') { - -    $query = qq|SELECT datname FROM pg_database|; -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); -     -    while (my ($db) = $sth->fetchrow_array) { - -      if ($form->{only_acc_db}) { -	 -	next if ($db =~ /^template/); - -	&dbconnect_vars($form, $db); -	my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; - -	$query = qq|SELECT tablename FROM pg_tables -		    WHERE tablename = 'defaults' -		    AND tableowner = '$form->{dbuser}'|; -	my $sth = $dbh->prepare($query); -	$sth->execute || $form->dberror($query); - -	if ($sth->fetchrow_array) { -	  push @dbsources, $db; -	} -	$sth->finish; -	$dbh->disconnect; -	next; -      } -      push @dbsources, $db; -    } -  } - -  if ($form->{dbdriver} eq 'Oracle') { -    if ($form->{only_acc_db}) { -      $query = qq|SELECT owner FROM dba_objects -		  WHERE object_name = 'DEFAULTS' -		  AND object_type = 'TABLE'|; -    } else { -      $query = qq|SELECT username FROM dba_users|; -    } - -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while (my ($db) = $sth->fetchrow_array) { -      push @dbsources, $db; -    } -  } - -  $sth->finish; -  $dbh->disconnect; -   -  return @dbsources; - -} - - -sub dbcreate { -  my ($self, $form) = @_; - -  my %dbcreate = ( 'Pg' => qq|CREATE DATABASE "$form->{db}"|, -               'Oracle' => qq|CREATE USER "$form->{db}" DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP IDENTIFIED BY "$form->{db}"|); - -  $dbcreate{Pg} .= " WITH ENCODING = '$form->{encoding}'" if $form->{encoding}; -   -  $form->{sid} = $form->{dbdefault}; -  &dbconnect_vars($form, $form->{dbdefault}); -  my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; -  my $query = qq|$dbcreate{$form->{dbdriver}}|; -  $dbh->do($query) || $form->dberror($query); - -  if ($form->{dbdriver} eq 'Oracle') { -    $query = qq|GRANT CONNECT,RESOURCE TO "$form->{db}"|; -    $dbh->do($query) || $form->dberror($query); -  } -  $dbh->disconnect; - - -  # setup variables for the new database -  if ($form->{dbdriver} eq 'Oracle') { -    $form->{dbuser} = $form->{db}; -    $form->{dbpasswd} = $form->{db}; -  } -   -   -  &dbconnect_vars($form, $form->{db}); -   -  $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; -   -  # create the tables -  my $filename = qq|sql/$form->{dbdriver}-tables.sql|; -  $self->processquery($form, $dbh, $filename); - -  # load gifi -  ($filename) = split /_/, $form->{chart}; -  $filename =~ s/_//; -  $self->processquery($form, $dbh, "sql/${filename}-gifi.sql"); - -  # load chart of accounts -  $filename = qq|sql/$form->{chart}-chart.sql|; -  $self->processquery($form, $dbh, $filename); - -  # create indices -  $filename = qq|sql/$form->{dbdriver}-indices.sql|; -  $self->processquery($form, $dbh, $filename); -   -  $dbh->disconnect; - -} - - - -sub processquery { -  my ($self, $form, $dbh, $filename) = @_; -   -  return unless (-f $filename); -   -  open(FH, "$filename") or $form->error("$filename : $!\n"); -  my $query = ""; -   -  while (<FH>) { -    $query .= $_; - -    if (/;\s*$/) { -      # strip ;... Oracle doesn't like it -      $query =~ s/;\s*$//; -      $dbh->do($query) || $form->dberror($query); -      $query = ""; -    } -  } -  close FH; - -} -   - - -sub dbdelete { -  my ($self, $form) = @_; - -  my %dbdelete = ( 'Pg' => qq|DROP DATABASE "$form->{db}"|, -               'Oracle' => qq|DROP USER $form->{db} CASCADE| -	         ); -   -  $form->{sid} = $form->{dbdefault}; -  &dbconnect_vars($form, $form->{dbdefault}); -  my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; -  my $query = qq|$dbdelete{$form->{dbdriver}}|; -  $dbh->do($query) || $form->dberror($query); - -  $dbh->disconnect; - -} -   - - -sub dbsources_unused { -  my ($self, $form, $memfile) = @_; - -  my @dbexcl = (); -  my @dbsources = (); -   -  $form->error('File locked!') if (-f "${memfile}.LCK"); -   -  # open members file -  open(FH, "$memfile") or $form->error("$memfile : $!"); - -  while (<FH>) { -    if (/^dbname=/) { -      my ($null,$item) = split /=/; -      push @dbexcl, $item; -    } -  } - -  close FH; - -  $form->{only_acc_db} = 1; -  my @db = &dbsources("", $form); - -  push @dbexcl, $form->{dbdefault}; - -  foreach $item (@db) { -    unless (grep /$item$/, @dbexcl) { -      push @dbsources, $item; -    } -  } - -  return @dbsources; - -} - - -sub dbneedsupdate { -  my ($self, $form) = @_; - -  my %dbsources = (); -  my $query; -   -  $form->{sid} = $form->{dbdefault}; -  &dbconnect_vars($form, $form->{dbdefault}); - -  my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; - -  if ($form->{dbdriver} eq 'Pg') { - -    $query = qq|SELECT d.datname FROM pg_database d, pg_user u -                WHERE d.datdba = u.usesysid -		AND u.usename = '$form->{dbuser}'|; -    my $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); -     -    while (my ($db) = $sth->fetchrow_array) { - -      next if ($db =~ /^template/); - -      &dbconnect_vars($form, $db); -       -      my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; - -      $query = qq|SELECT tablename FROM pg_tables -		  WHERE tablename = 'defaults'|; -      my $sth = $dbh->prepare($query); -      $sth->execute || $form->dberror($query); - -      if ($sth->fetchrow_array) { -	$query = qq|SELECT version FROM defaults|; -	my $sth = $dbh->prepare($query); -	$sth->execute; -	 -	if (my ($version) = $sth->fetchrow_array) { -	  $dbsources{$db} = $version; -	} -	$sth->finish; -      } -      $sth->finish; -      $dbh->disconnect; -    } -    $sth->finish; -  } - - -  if ($form->{dbdriver} eq 'Oracle') { -    $query = qq|SELECT owner FROM dba_objects -		WHERE object_name = 'DEFAULTS' -		AND object_type = 'TABLE'|; - -    $sth = $dbh->prepare($query); -    $sth->execute || $form->dberror($query); - -    while (my ($db) = $sth->fetchrow_array) { -       -      $form->{dbuser} = $db; -      &dbconnect_vars($form, $db); -       -      my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; - -      $query = qq|SELECT version FROM defaults|; -      my $sth = $dbh->prepare($query); -      $sth->execute; -       -      if (my ($version) = $sth->fetchrow_array) { -	$dbsources{$db} = $version; -      } -      $sth->finish; -      $dbh->disconnect; -    } -    $sth->finish; -  } -   -  $dbh->disconnect; -   -  %dbsources; - -} - - -sub dbupdate { -  my ($self, $form) = @_; - -  $form->{sid} = $form->{dbdefault}; -   -  my @upgradescripts = (); -  my $query; -   -  if ($form->{dbupdate}) { -    # read update scripts into memory -    opendir SQLDIR, "sql/." or $form-error($!); -    @upgradescripts = sort grep /$form->{dbdriver}-upgrade-.*?\.sql/, readdir SQLDIR; -    closedir SQLDIR; -  } - -   -  foreach my $db (split / /, $form->{dbupdate}) { - -    next unless $form->{$db}; - -    # strip db from dataset -    $db =~ s/^db//; -    &dbconnect_vars($form, $db); - -    my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror; - -    # check version -    $query = qq|SELECT version FROM defaults|; -    my $sth = $dbh->prepare($query); -    # no error check, let it fall through -    $sth->execute; - -    my $version = $sth->fetchrow_array; -    $sth->finish; -     -    next unless $version; - -    foreach my $upgradescript (@upgradescripts) { -      my $a = $upgradescript; -      $a =~ s/(^$form->{dbdriver}-upgrade-|\.sql$)//g; -       -      my ($mindb, $maxdb) = split /-/, $a; - -      next if ($version ge $maxdb); - -      # if there is no upgrade script exit -      last if ($version lt $mindb); - -      # apply upgrade -      $self->processquery($form, $dbh, "sql/$upgradescript"); - -      $version = $maxdb; -  -    } -     -    $dbh->disconnect; -     -  } -} -   - - -sub create_config { -  my ($self, $filename) = @_; - - -  @config = &config_vars; -   -  open(CONF, ">$filename") or $self->error("$filename : $!"); -   -  # create the config file -  print CONF qq|# configuration file for $self->{login} - -\%myconfig = ( -|; - -  foreach $key (sort @config) { -    $self->{$key} =~ s/'/\\'/g; -    print CONF qq|  $key => '$self->{$key}',\n|; -  } - -    -  print CONF qq|);\n\n|; - -  close CONF; - -} - - -sub save_member { -  my ($self, $memberfile, $userspath) = @_; - -  my $newmember = 1; -   -  # format dbconnect and dboptions string -  map { $self->{$_} = lc $self->{$_} } qw(dbname host); -  &dbconnect_vars($self, $self->{dbname}); -   -  $self->error('File locked!') if (-f "${memberfile}.LCK"); -  open(FH, ">${memberfile}.LCK") or $self->error("${memberfile}.LCK : $!"); -  close(FH); -   -  open(CONF, "+<$memberfile") or $self->error("$memberfile : $!"); -   -  @config = <CONF>; -   -  seek(CONF, 0, 0); -  truncate(CONF, 0); -   -  while ($line = shift @config) { -    if ($line =~ /^\[$self->{login}\]/) { -      $newmember = 0; -      last; -    } -    print CONF $line; -  } - -  # remove everything up to next login or EOF -  while ($line = shift @config) { -    last if ($line =~ /^\[/); -  } - -  # this one is either the next login or EOF -  print CONF $line; - -  while ($line = shift @config) { -    print CONF $line; -  } - -  print CONF qq|[$self->{login}]\n|; -   -  if ((($self->{dbpasswd} ne $self->{old_dbpasswd}) || $newmember) && $self->{root}) { -    $self->{dbpasswd} = pack 'u', $self->{dbpasswd}; -    chop $self->{dbpasswd}; -  } -   -  if ($self->{password} ne $self->{old_password}) { -    $self->{password} = crypt $self->{password}, substr($self->{login}, 0, 2) if $self->{password}; -  } -   -  if ($self->{'root login'}) { -    @config = ("password"); -  } else { -    @config = &config_vars; -  } -   -  # replace \r\n with \n -  $self->{address} =~ s/\r\n/\\n/g if $self->{address}; -  $self->{signature} =~ s/\r\n/\\n/g if $self->{signature}; - -  foreach $key (sort @config) { -    print CONF qq|$key=$self->{$key}\n|; -  } - -  print CONF "\n"; -  close CONF; -  unlink "${memberfile}.LCK"; -   -  # create conf file -  $self->create_config("$userspath/$self->{login}.conf") unless $self->{'root login'}; -  -} - - -sub config_vars { -   -  my @conf = qw(acs address admin businessnumber charset company countrycode -             currency dateformat dbconnect dbdriver dbhost dbport dboptions -	     dbname dbuser dbpasswd email fax name numberformat password -	     printer sid shippingpoint signature stylesheet tel templates -	     vclimit); - -  @conf; - -} - - -sub error { -  my ($self, $msg) = @_; - -  if ($ENV{HTTP_USER_AGENT}) { -    print qq|Content-Type: text/html - -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> - -<body bgcolor=ffffff> - -<h2><font color=red>Error!</font></h2> -<p><b>$msg</b>|; - -  } -   -  die "Error: $msg\n"; -   -} - - -1; - | 
