Bindestriche und ID aus den PopupMenus entfernt und in der FOrm.pm die Speicherung...
[kivitendo-erp.git] / SL / AM.pm
index be5d8a4..af52ae9 100644 (file)
--- a/SL/AM.pm
+++ b/SL/AM.pm
@@ -47,20 +47,23 @@ sub get_account {
 
   # connect to database
   my $dbh = $form->dbconnect($myconfig);
-  my $query =
-    qq!SELECT c.accno, c.description, c.charttype, c.gifi_accno, c.category,! .
-    qq!  c.link, c.pos_bilanz, c.pos_eur, c.new_chart_id, c.valid_from, ! .
-    qq!  c.pos_bwa, ! .
-    qq!  tk.taxkey_id, tk.pos_ustva, tk.tax_id, ! .
-    qq!  tk.tax_id || '--' || tk.taxkey_id AS tax, tk.startdate ! .
-    qq!FROM chart c ! .
-    qq!LEFT JOIN taxkeys tk ! .
-    qq!ON (c.id=tk.chart_id AND tk.id = ! .
-    qq!  (SELECT id FROM taxkeys ! .
-    qq!   WHERE taxkeys.chart_id = c.id AND startdate <= current_date ! .
-    qq!   ORDER BY startdate DESC LIMIT 1)) ! .
-    qq!WHERE c.id = ?!;
-
+  my $query = qq{
+    SELECT c.accno, c.description, c.charttype, c.category,
+      c.link, c.pos_bilanz, c.pos_eur, c.new_chart_id, c.valid_from, 
+      c.pos_bwa, datevautomatik,
+      tk.taxkey_id, tk.pos_ustva, tk.tax_id,
+      tk.tax_id || '--' || tk.taxkey_id AS tax, tk.startdate
+    FROM chart c 
+    LEFT JOIN taxkeys tk 
+    ON (c.id=tk.chart_id AND tk.id = 
+      (SELECT id FROM taxkeys 
+       WHERE taxkeys.chart_id = c.id AND startdate <= current_date 
+       ORDER BY startdate DESC LIMIT 1)) 
+    WHERE c.id = ?
+    };
+
+  
+  $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query");
   my $sth = $dbh->prepare($query);
   $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})");
 
@@ -75,6 +78,7 @@ sub get_account {
   # get default accounts
   $query = qq|SELECT inventory_accno_id, income_accno_id, expense_accno_id
               FROM defaults|;
+  $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query");
   $sth = $dbh->prepare($query);
   $sth->execute || $form->dberror($query);
 
@@ -84,9 +88,20 @@ sub get_account {
 
   $sth->finish;
 
+
+
   # get taxkeys and description
-  $query = qq§SELECT id, taxkey,id||'--'||taxkey AS tax, taxdescription
-              FROM tax ORDER BY taxkey§;
+  $query = qq{
+    SELECT 
+      id, 
+      (SELECT accno FROM chart WHERE id=tax.chart_id) AS chart_accno,
+      taxkey,
+      id||'--'||taxkey AS tax, 
+      taxdescription, 
+      rate
+    FROM tax ORDER BY taxkey
+  };
+  $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query");
   $sth = $dbh->prepare($query);
   $sth->execute || $form->dberror($query);
 
@@ -100,7 +115,10 @@ sub get_account {
   if ($form->{id}) {
     # get new accounts
     $query = qq|SELECT id, accno,description
-                FROM chart WHERE link = ?|;
+                FROM chart 
+                WHERE link = ? 
+                ORDER BY accno|;
+    $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query");
     $sth = $dbh->prepare($query);
     $sth->execute($form->{link}) || $form->dberror($query . " ($form->{link})");
 
@@ -110,10 +128,45 @@ sub get_account {
     }
 
     $sth->finish;
+
+    # get the taxkeys of account
+    
+    $query = qq{
+      SELECT
+        tk.id,
+        tk.chart_id,
+        c.accno,
+        tk.tax_id,
+        t.taxdescription,
+        t.rate,
+        tk.taxkey_id, 
+        tk.pos_ustva, 
+        tk.startdate
+      FROM taxkeys tk
+      LEFT JOIN   tax t ON (t.id = tk.tax_id)
+      LEFT JOIN chart c ON (c.id = t.chart_id)
+
+      WHERE tk.chart_id = ?
+      ORDER BY startdate DESC 
+    };
+    $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query");
+    $sth = $dbh->prepare($query);
+
+    $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})");
+
+    $form->{ACCOUNT_TAXKEYS} = [];
+
+    while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
+      push @{ $form->{ACCOUNT_TAXKEYS} }, $ref;
+    }
+
+    $sth->finish;    
+
   }
   # check if we have any transactions
   $query = qq|SELECT a.trans_id FROM acc_trans a
               WHERE a.chart_id = ?|;
+  $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query");
   $sth = $dbh->prepare($query);
   $sth->execute($form->{id}) || $form->dberror($query . " ($form->{id})");
 
@@ -126,6 +179,7 @@ sub get_account {
   if ($form->{new_chart_id}) {
     $query = qq|SELECT current_date-valid_from FROM chart
                 WHERE id = ?|;
+    $main::lxdebug->message(LXDebug::QUERY, "\$query=\n $query");
     my ($count) = selectrow_query($form, $dbh, $query, $form->{id});
     if ($count >=0) {
       $form->{new_chart_valid} = 1;
@@ -177,71 +231,189 @@ sub save_account {
 
   my @values;
 
-  my ($tax_id, $taxkey) = split(/--/, $form->{tax});
-  my $startdate = $form->{startdate} ? $form->{startdate} : "1970-01-01";
-
-  if ($form->{id} && $form->{orphaned}) {
+  if ($form->{id}) {
     $query = qq|UPDATE chart SET
-                accno = ?, description = ?, charttype = ?,
-                gifi_accno = ?, category = ?, link = ?,
-                taxkey_id = ?,
-                pos_ustva = ?, pos_bwa   = ?, pos_bilanz = ?,
-                pos_eur = ?, new_chart_id = ?, valid_from = ?
+                  accno = ?, 
+                  description = ?, 
+                  charttype = ?,
+                  category = ?, 
+                  link = ?,
+                  pos_bwa   = ?, 
+                  pos_bilanz = ?,
+                  pos_eur = ?, 
+                  new_chart_id = ?, 
+                  valid_from = ?,
+                  datevautomatik = ?
                 WHERE id = ?|;
-    @values = ($form->{accno}, $form->{description}, $form->{charttype},
-               $form->{gifi_accno}, $form->{category}, $form->{link},
-               conv_i($taxkey),
-               conv_i($form->{pos_ustva}), conv_i($form->{pos_bwa}),
-               conv_i($form->{pos_bilanz}), conv_i($form->{pos_eur}),
-               conv_i($form->{new_chart_id}),
-               conv_date($form->{valid_from}),
-               $form->{id});
-
-  } elsif ($form->{id} && !$form->{new_chart_valid}) {
-    $query = qq|UPDATE chart SET new_chart_id = ?, valid_from = ?
-                WHERE id = ?|;
-    @values = (conv_i($form->{new_chart_id}), conv_date($form->{valid_from}),
-               $form->{id});
-  } else {
-    $query = qq|INSERT INTO chart
-                (accno, description, charttype,
-                 gifi_accno, category, link,
-                 taxkey_id,
-                 pos_ustva, pos_bwa, pos_bilanz, pos_eur,
-                 new_chart_id, valid_from)
-                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)|;
-    @values = ($form->{accno}, $form->{description}, $form->{charttype},
-               $form->{gifi_accno}, $form->{category}, $form->{link},
-               conv_i($taxkey),
-               conv_i($form->{pos_ustva}), conv_i($form->{pos_bwa}),
-               conv_i($form->{pos_bilanz}), conv_i($form->{pos_eur}),
-               conv_i($form->{new_chart_id}),
-               conv_date($form->{valid_from}));
+                
+    @values = (   
+                  $form->{accno}, 
+                  $form->{description}, 
+                  $form->{charttype},
+                  $form->{category}, 
+                  $form->{link},
+                  conv_i($form->{pos_bwa}),
+                  conv_i($form->{pos_bilanz}), 
+                  conv_i($form->{pos_eur}),
+                  conv_i($form->{new_chart_id}),
+                  conv_date($form->{valid_from}),
+                  ($form->{datevautomatik} eq 'T') ? 'true':'false',
+                $form->{id},
+    );
+
+  } 
+  elsif ($form->{id} && !$form->{new_chart_valid}) {
+
+    $query = qq|
+                  UPDATE chart 
+                  SET new_chart_id = ?, 
+                  valid_from = ?
+                  WHERE id = ?
+             |;
+             
+    @values = (   
+                  conv_i($form->{new_chart_id}), 
+                  conv_date($form->{valid_from}),
+                  $form->{id}
+              );
+  } 
+  else {
+
+    $query = qq|
+                  INSERT INTO chart (
+                      accno, 
+                      description, 
+                      charttype,
+                      category, 
+                      link,
+                      pos_bwa, 
+                      pos_bilanz, 
+                      pos_eur,
+                      new_chart_id, 
+                      valid_from,
+                      datevautomatik )
+                  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+             |;
+
+    @values = (
+                      $form->{accno}, 
+                      $form->{description}, 
+                      $form->{charttype},
+                      $form->{category}, $form->{link},
+                      conv_i($form->{pos_bwa}),
+                      conv_i($form->{pos_bilanz}), conv_i($form->{pos_eur}),
+                      conv_i($form->{new_chart_id}),
+                      conv_date($form->{valid_from}),
+                      ($form->{datevautomatik} eq 'T') ? 'true':'false',
+              );
 
   }
+  
   do_query($form, $dbh, $query, @values);
 
-  #Save Taxes
-  if (!$form->{id}) {
-    $query =
-      qq|INSERT INTO taxkeys | .
-      qq|(chart_id, tax_id, taxkey_id, pos_ustva, startdate) | .
-      qq|VALUES ((SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?)|;
-    do_query($form, $dbh, $query,
-             $form->{accno}, conv_i($tax_id), conv_i($taxkey),
-             conv_i($form->{pos_ustva}), conv_date($startdate));
+  #Save Taxkeys
+
+  my @taxkeys = ();
+  
+  my $MAX_TRIES = 10; # Maximum count of taxkeys in form
+  my $tk_count;
+  
+  READTAXKEYS:
+  for $tk_count (0 .. $MAX_TRIES) {
+    
+    # Loop control
+    
+    # Check if the account already exists, else cancel
+    last READTAXKEYS if ( $form->{'id'} == 0);
+
+    # check if there is a startdate
+    if ( $form->{"taxkey_startdate_$tk_count"} eq '' ) {
+      $tk_count++;
+      next READTAXKEYS;
+    }
 
-  } else {
-    $query = qq|DELETE FROM taxkeys WHERE chart_id = ? AND tax_id = ?|;
-    do_query($form, $dbh, $query, $form->{id}, conv_i($tax_id));
+    # check if there is at least one relation to pos_ustva or tax_id
+    if ( $form->{"taxkey_pos_ustva_$tk_count"} eq '' && $form->{"taxkey_tax_$tk_count"} == 0 ) {
+      $tk_count++;
+      next READTAXKEYS;
+    }
 
-    $query =
-      qq|INSERT INTO taxkeys | .
-      qq|(chart_id, tax_id, taxkey_id, pos_ustva, startdate) | .
-      qq|VALUES (?, ?, ?, ?, ?)|;
-    do_query($form, $dbh, $query,
-             $form->{id}, conv_i($tax_id), conv_i($taxkey),
-             conv_i($form->{pos_ustva}), conv_date($startdate));
+    # Add valid taxkeys into the array
+    push @taxkeys , 
+      {
+        id        => ($form->{"taxkey_id_$tk_count"} eq 'NEW') ? conv_i('') : conv_i($form->{"taxkey_id_$tk_count"}),
+        tax_id    => conv_i($form->{"taxkey_tax_$tk_count"}),
+        startdate => conv_date($form->{"taxkey_startdate_$tk_count"}),
+        chart_id  => conv_i($form->{"id"}),
+        pos_ustva => conv_i($form->{"taxkey_pos_ustva_$tk_count"}),
+        delete    => ( $form->{"taxkey_del_$tk_count"} eq 'delete' ) ? '1' : '',
+      };
+      
+    $tk_count++;
+  }
+
+  TAXKEY:
+  for my $j (0 .. $#taxkeys){
+    if ( defined $taxkeys[$j]{'id'} ){
+      # delete Taxkey?
+      
+      if ($taxkeys[$j]{'delete'}){
+        $query = qq{
+          DELETE FROM taxkeys WHERE id = ?
+        };
+
+        @values = ($taxkeys[$j]{'id'});
+
+        do_query($form, $dbh, $query, @values);
+      
+        next TAXKEY;
+      }
+
+      # UPDATE Taxkey
+      
+      $query = qq{
+        UPDATE taxkeys
+        SET taxkey_id = (SELECT taxkey FROM tax WHERE tax.id = ?),
+            chart_id  = ?,
+            tax_id    = ?,
+            pos_ustva = ?,
+            startdate = ?
+        WHERE id = ?
+      };    
+      @values = (
+        $taxkeys[$j]{'tax_id'},
+        $taxkeys[$j]{'chart_id'},
+        $taxkeys[$j]{'tax_id'}, 
+        $taxkeys[$j]{'pos_ustva'},
+        $taxkeys[$j]{'startdate'}, 
+        $taxkeys[$j]{'id'},  
+      );
+      do_query($form, $dbh, $query, @values);
+    }
+    else {
+      # INSERT Taxkey
+      
+      $query = qq{
+        INSERT INTO taxkeys (
+          taxkey_id,
+          chart_id,
+          tax_id,
+          pos_ustva,
+          startdate
+        )
+        VALUES ((SELECT taxkey FROM tax WHERE tax.id = ?), ?, ?, ?, ?)
+      };    
+      @values = (
+        $taxkeys[$j]{'tax_id'}, 
+        $taxkeys[$j]{'chart_id'},  
+        $taxkeys[$j]{'tax_id'}, 
+        $taxkeys[$j]{'pos_ustva'},
+        $taxkeys[$j]{'startdate'}, 
+      );
+      
+      do_query($form, $dbh, $query, @values);
+    }
+  
   }
 
   # commit
@@ -291,6 +463,11 @@ sub delete_account {
               WHERE id = ?|;
   do_query($form, $dbh, $query, $form->{id});
 
+  # delete account taxkeys
+  $query = qq|DELETE FROM taxkeys
+              WHERE chart_id = ?|;
+  do_query($form, $dbh, $query, $form->{id});
+
   # commit and redirect
   my $rc = $dbh->commit;
   $dbh->disconnect;
@@ -506,7 +683,7 @@ sub business {
   # connect to database
   my $dbh = $form->dbconnect($myconfig);
 
-  my $query = qq|SELECT id, description, discount, customernumberinit, salesman
+  my $query = qq|SELECT id, description, discount, customernumberinit
                  FROM business
                  ORDER BY 2|;
 
@@ -533,7 +710,7 @@ sub get_business {
   my $dbh = $form->dbconnect($myconfig);
 
   my $query =
-    qq|SELECT b.description, b.discount, b.customernumberinit, b.salesman
+    qq|SELECT b.description, b.discount, b.customernumberinit
        FROM business b
        WHERE b.id = ?|;
   my $sth = $dbh->prepare($query);
@@ -559,20 +736,19 @@ sub save_business {
   my $dbh = $form->dbconnect($myconfig);
 
   my @values = ($form->{description}, $form->{discount},
-                $form->{customernumberinit}, $form->{salesman} ? 't' : 'f');
+                $form->{customernumberinit});
   # id is the old record
   if ($form->{id}) {
     $query = qq|UPDATE business SET
                 description = ?,
                 discount = ?,
-                customernumberinit = ?,
-                salesman = ?
+                customernumberinit = ?
                 WHERE id = ?|;
     push(@values, $form->{id});
   } else {
     $query = qq|INSERT INTO business
-                (description, discount, customernumberinit, salesman)
-                VALUES (?, ?, ?, ?)|;
+                (description, discount, customernumberinit)
+                VALUES (?, ?, ?)|;
   }
   do_query($form, $dbh, $query, @values);
 
@@ -825,14 +1001,13 @@ sub get_buchungsgruppe {
       qq|SELECT count(id) = 0 AS orphaned
          FROM parts
          WHERE buchungsgruppen_id = ?|;
-    ($form->{orphaned}) = selectrow_arra($query, undef, $form->{id});
-    $form->dberror($query . " ($form->{id})") if ($dbh->err);
+    ($form->{orphaned}) = selectrow_query($form, $dbh, $query, $form->{id});
   }
 
   $query = "SELECT inventory_accno_id, income_accno_id, expense_accno_id ".
     "FROM defaults";
   ($form->{"std_inventory_accno_id"}, $form->{"std_income_accno_id"},
-   $form->{"std_expense_accno_id"}) = $dbh->selectrow_array($query);
+   $form->{"std_expense_accno_id"}) = selectrow_query($form, $dbh, $query);
 
   my $module = "IC";
   $query = qq|SELECT c.accno, c.description, c.link, c.id,
@@ -1224,36 +1399,85 @@ sub delete_payment {
   $main::lxdebug->leave_sub();
 }
 
-sub load_template {
+
+sub prepare_template_filename {
   $main::lxdebug->enter_sub();
 
-  my ($self, $form) = @_;
+  my ($self, $myconfig, $form) = @_;
+
+  my ($filename, $display_filename);
 
-  open(TEMPLATE, "$form->{file}") or $form->error("$form->{file} : $!");
+  if ($form->{type} eq "stylesheet") {
+    $filename = "css/$myconfig->{stylesheet}";
+    $display_filename = $myconfig->{stylesheet};
 
-  while (<TEMPLATE>) {
-    $form->{body} .= $_;
+  } else {
+    $filename = $form->{formname};
+
+    if ($form->{language}) {
+      my ($id, $template_code) = split(/--/, $form->{language});
+      $filename .= "_${template_code}";
+    }
+
+    if ($form->{printer}) {
+      my ($id, $template_code) = split(/--/, $form->{printer});
+      $filename .= "_${template_code}";
+    }
+
+    $filename .= "." . ($form->{format} eq "html" ? "html" : "tex");
+    $filename =~ s|.*/||;
+    $display_filename = $filename;
+    $filename = "$myconfig->{templates}/$filename";
   }
 
-  close(TEMPLATE);
+  $main::lxdebug->leave_sub();
+
+  return ($filename, $display_filename);
+}
+
+
+sub load_template {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $filename) = @_;
+
+  my ($content, $lines) = ("", 0);
+
+  local *TEMPLATE;
+
+  if (open(TEMPLATE, $filename)) {
+    while (<TEMPLATE>) {
+      $content .= $_;
+      $lines++;
+    }
+    close(TEMPLATE);
+  }
 
   $main::lxdebug->leave_sub();
+
+  return ($content, $lines);
 }
 
 sub save_template {
   $main::lxdebug->enter_sub();
 
-  my ($self, $form) = @_;
+  my ($self, $filename, $content) = @_;
 
-  open(TEMPLATE, ">$form->{file}") or $form->error("$form->{file} : $!");
+  local *TEMPLATE;
 
-  # strip
-  $form->{body} =~ s/\r\n/\n/g;
-  print TEMPLATE $form->{body};
+  my $error = "";
 
-  close(TEMPLATE);
+  if (open(TEMPLATE, ">$filename")) {
+    $content =~ s/\r\n/\n/g;
+    print(TEMPLATE $content);
+    close(TEMPLATE);
+  } else {
+    $error = $!;
+  }
 
   $main::lxdebug->leave_sub();
+
+  return $error;
 }
 
 sub save_preferences {
@@ -1673,7 +1897,7 @@ sub unit_select_data {
     push(@{$select}, { "name" => "", "base_unit" => "", "factor" => "", "selected" => "" });
   }
 
-  foreach my $unit (sort({ $a->{"sortkey"} <=> $b->{"sortkey"} } keys(%{$units}))) {
+  foreach my $unit (sort({ $units->{$a}->{"sortkey"} <=> $units->{$b}->{"sortkey"} } keys(%{$units}))) {
     push(@{$select}, { "name" => $unit,
                        "base_unit" => $units->{$unit}->{"base_unit"},
                        "factor" => $units->{$unit}->{"factor"},
@@ -1692,7 +1916,7 @@ sub unit_select_html {
 
   my $select = "<select name=${name}>";
 
-  foreach my $unit (sort({ $a->{"sortkey"} <=> $b->{"sortkey"} } keys(%{$units}))) {
+  foreach my $unit (sort({ $units->{$a}->{"sortkey"} <=> $units->{$b}->{"sortkey"} } keys(%{$units}))) {
     if (!$convertible_into ||
         ($units->{$convertible_into} &&
          ($units->{$convertible_into}->{"base_unit"} eq $units->{$unit}->{"base_unit"}))) {