Subversion Repositories sql-ledger-old

Rev

Rev 114 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#=====================================================================
# 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 %ordinal = ( 'transdate' => 3,
                  'ordnumber' => 2,
                  'name' => 6
                );
 
  my $sortorder = join ',', $form->sort_columns(qw(transdate ordnumber name));
  map { $sortorder =~ s/$_/$ordinal{$_}/ } keys %ordinal;
  $sortorder = $form->{sort} unless $sortorder;

 
  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'";
    }
  }

  if ($form->{ordnumber}) {
    my $ordnumber = $form->like(lc $form->{ordnumber});
    $query .= " AND lower(ordnumber) LIKE '$ordnumber'";
    $form->{open} = $form->{closed} = 1;
  }
 
  unless ($form->{open} && $form->{closed}) {
    $query .= ($form->{open}) ? " AND o.closed = '0'" : " AND o.closed = '1'";
  }
 
  $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 projectnumber);
     
      # 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->{"projectnumber_$i"}) {
        $project_id = qq|(SELECT id
                          FROM project
                          WHERE projectnumber = '$form->{"projectnumber_$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'            => 'o.oid',
                'PgPP'          => 'o.oid',
                'Oracle'        => 'o.rowid',
                'DB2'           => '1'
              );

    # 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 $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");
 
  $form->get_project($dbh);
 
  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'      => 'a.oid',
              'PgPP'    => 'a.oid',
              'Oracle'  => 'a.rowid',
              'DB2'     => '1'
            );

  # 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 projectnumber 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->{projectnumber} }, qq|$form->{"projectnumber_$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, $oid{$myconfig->{dbdriver}}|;
        } else {
          $sortorder = qq|ORDER BY $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 reqdate projectnumber 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 reqdate projectnumber 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;

}


1;