Typos in Filtered Doku
[kivitendo-erp.git] / SL / IC.pm
index 0b8924b..f6ceace 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
@@ -40,6 +40,7 @@ use YAML;
 
 use SL::CVar;
 use SL::DBUtils;
+use SL::HTML::Restrict;
 use SL::TransNumber;
 
 use strict;
@@ -50,7 +51,7 @@ sub get_part {
   my ($self, $myconfig, $form) = @_;
 
   # connect to db
-  my $dbh = $form->dbconnect($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   my $sth;
 
@@ -146,15 +147,10 @@ SQL
   }
 
   # get translations
-  $form->{language_values} = "";
   $query = qq|SELECT language_id, translation, longdescription
               FROM translation
               WHERE parts_id = ?|;
-  my $trq = prepare_execute_query($form, $dbh, $query, conv_i($form->{id}));
-  while (my $tr = $trq->fetchrow_hashref("NAME_lc")) {
-    $form->{language_values} .= "---+++---" . join('--++--', @{$tr}{qw(language_id translation longdescription)});
-  }
-  $trq->finish;
+  $form->{translations} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id}));
 
   # is it an orphan
   my @referencing_tables = qw(invoice orderitems inventory);
@@ -176,7 +172,7 @@ SQL
 
   $form->{"unit_changeable"} = $form->{orphaned};
 
-  $dbh->disconnect;
+  Common::webdav_folder($form) if $::lx_office_conf{features}{webdav};
 
   $main::lxdebug->leave_sub();
 }
@@ -186,7 +182,7 @@ sub get_pricegroups {
 
   my ($self, $myconfig, $form) = @_;
 
-  my $dbh = $form->dbconnect($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   # get pricegroups
   my $query = qq|SELECT id, pricegroup FROM pricegroup ORDER BY lower(pricegroup)|;
@@ -204,8 +200,6 @@ sub get_pricegroups {
   #correct rows
   $form->{price_rows} = $i - 1;
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 
   return $pricegroups;
@@ -218,7 +212,7 @@ sub retrieve_buchungsgruppen {
 
   my ($query, $sth);
 
-  my $dbh = $form->dbconnect($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   # get buchungsgruppen
   $query = qq|SELECT id, description FROM buchungsgruppen ORDER BY sortkey|;
@@ -234,6 +228,7 @@ sub save {
   my @values;
   # connect to database, turn off AutoCommit
   my $dbh = $form->get_standard_dbh;
+  my $restricter = SL::HTML::Restrict->create;
 
   # save the part
   # make up a unique handle and store in partnumber field
@@ -248,7 +243,7 @@ sub save {
   map { $form->{$_} = $form->parse_amount($myconfig, $form->{$_}) }
     qw(rop weight listprice sellprice gv lastcost);
 
-  my $makemodel = (($form->{make_1}) || ($form->{model_1})) ? 1 : 0;
+  my $makemodel = ($form->{make_1} || $form->{model_1} || ($form->{makemodel_rows} > 1)) ? 1 : 0;
 
   $form->{assembly} = ($form->{item} eq 'assembly') ? 1 : 0;
 
@@ -324,13 +319,15 @@ sub save {
 
   if ($form->{"item"} ne "assembly") {
     $subq_expense =
-      qq|(SELECT bg.expense_accno_id_0
-          FROM buchungsgruppen bg
-          WHERE bg.id = | . conv_i($form->{"buchungsgruppen_id"}, 'NULL') . qq|)|;
+      qq|(SELECT tc.expense_accno_id
+          FROM taxzone_charts tc
+          WHERE tc.buchungsgruppen_id = | . conv_i($form->{"buchungsgruppen_id"}, 'NULL') . qq| and tc.taxzone_id = 0)|;
   } else {
     $subq_expense = "NULL";
   }
 
+  normalize_text_blocks();
+
   $query =
     qq|UPDATE parts SET
          partnumber = ?,
@@ -351,7 +348,7 @@ sub save {
          buchungsgruppen_id = ?,
          payment_id = ?,
          inventory_accno_id = $subq_inventory,
-         income_accno_id = (SELECT bg.income_accno_id_0 FROM buchungsgruppen bg WHERE bg.id = ?),
+         income_accno_id = (SELECT tc.income_accno_id FROM taxzone_charts tc WHERE tc.taxzone_id = 0 and tc.buchungsgruppen_id = ?),
          expense_accno_id = $subq_expense,
          obsolete = ?,
          image = ?,
@@ -376,7 +373,7 @@ sub save {
              $form->{lastcost},
              $form->{weight},
              $form->{unit},
-             $form->{notes},
+             $restricter->process($form->{notes}),
              $form->{formel},
              $form->{rop},
              conv_i($form->{warehouse_id}),
@@ -403,16 +400,17 @@ sub save {
   # delete translation records
   do_query($form, $dbh, qq|DELETE FROM translation WHERE parts_id = ?|, conv_i($form->{id}));
 
-  if ($form->{language_values} ne "") {
-    foreach my $item (split(/---\+\+\+---/, $form->{language_values})) {
-      my ($language_id, $translation, $longdescription) = split(/--\+\+--/, $item);
-      if ($translation ne "") {
-        $query = qq|INSERT into translation (parts_id, language_id, translation, longdescription)
-                    VALUES ( ?, ?, ?, ? )|;
-        @values = (conv_i($form->{id}), conv_i($language_id), $translation, $longdescription);
-        do_query($form, $dbh, $query, @values);
-      }
+  my @translations = grep { $_->{language_id} && $_->{translation} } @{ $form->{translations} || [] };
+  if (@translations) {
+    $query = qq|INSERT into translation (parts_id, language_id, translation, longdescription)
+                VALUES ( ?, ?, ?, ? )|;
+    $sth   = $dbh->prepare($query);
+
+    foreach my $translation (@translations) {
+      do_statement($form, $sth, $query, conv_i($form->{id}), conv_i($translation->{language_id}), $translation->{translation}, $restricter->process($translation->{longdescription}));
     }
+
+    $sth->finish();
   }
 
   # delete price records
@@ -459,6 +457,22 @@ sub save {
 
   # add assembly records
   if ($form->{item} eq 'assembly') {
+    # check additional assembly row
+    my $i = $form->{assembly_rows};
+    # if last row is not empty add them
+    if ($form->{"partnumber_$i"} ne "") {
+      $query = qq|SELECT id FROM parts WHERE partnumber = ?|;
+      my ($partid) = selectrow_query($form, $dbh, $query,$form->{"partnumber_$i"} );
+      if ( $partid ) {
+        $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"});
+        $form->{"id_$i"} = $partid;
+        $form->{"bom_$i"} = 0;
+        $form->{assembly_rows}++;
+      }
+      else {
+        $::form->error($::locale->text("uncorrect partnumber ").$form->{"partnumber_$i"});
+      }
+    }
 
     for my $i (1 .. $form->{assembly_rows}) {
       $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"});
@@ -471,7 +485,6 @@ sub save {
         do_query($form, $dbh, $query, @values);
       }
     }
-
     my @a = localtime;
     $a[5] += 1900;
     $a[4]++;
@@ -551,7 +564,7 @@ sub retrieve_assemblies {
   my ($self, $myconfig, $form) = @_;
 
   # connect to database
-  my $dbh = $form->dbconnect($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   my $where = qq|NOT p.obsolete|;
   my @values;
@@ -578,8 +591,6 @@ sub retrieve_assemblies {
 
   $form->{assembly_items} = selectall_hashref_query($form, $dbh, $query, @values);
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 }
 
@@ -589,7 +600,7 @@ sub delete {
   my ($self, $myconfig, $form) = @_;
   my @values = (conv_i($form->{id}));
   # connect to database, turn off AutoCommit
-  my $dbh = $form->dbconnect_noauto($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   my %columns = ( "assembly" => "id", "parts" => "id" );
 
@@ -600,7 +611,6 @@ sub delete {
 
   # commit
   my $rc = $dbh->commit;
-  $dbh->disconnect;
 
   $main::lxdebug->leave_sub();
 
@@ -643,7 +653,7 @@ sub assembly_item {
   }
 
   # connect to database
-  my $dbh = $form->dbconnect($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   my $query =
     qq|SELECT p.id, p.partnumber, p.description, p.sellprice,
@@ -655,8 +665,6 @@ sub assembly_item {
        WHERE $where|;
   $form->{item_list} = selectall_hashref_query($form, $dbh, $query, @values);
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 }
 
@@ -1203,7 +1211,7 @@ sub update_prices {
   my $num_updated = 0;
 
   # connect to database
-  my $dbh = $form->dbconnect_noauto($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   for my $column (qw(sellprice listprice)) {
     next if ($form->{$column} eq "");
@@ -1264,7 +1272,6 @@ sub update_prices {
   $sth_multiply->finish();
 
   my $rc= $dbh->commit;
-  $dbh->disconnect;
 
   $main::lxdebug->leave_sub();
 
@@ -1277,7 +1284,7 @@ sub create_links {
   my ($self, $module, $myconfig, $form) = @_;
 
   # connect to database
-  my $dbh = $form->dbconnect($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   my @values = ('%' . $module . '%');
   my $query;
@@ -1333,7 +1340,6 @@ sub create_links {
     ($form->{priceupdate}) = selectrow_query($form, $dbh, qq|SELECT current_date|);
   }
 
-  $dbh->disconnect;
   $main::lxdebug->leave_sub();
 }
 
@@ -1342,7 +1348,7 @@ sub get_parts {
   $main::lxdebug->enter_sub();
 
   my ($self, $myconfig, $form, $sortorder) = @_;
-  my $dbh   = $form->dbconnect($myconfig);
+  my $dbh   = $form->get_standard_dbh;
   my $order = qq| p.partnumber|;
   my $where = qq|1 = 1|;
   my @values;
@@ -1385,7 +1391,6 @@ sub get_parts {
   }    #while
   $form->{rows} = $j;
   $sth->finish;
-  $dbh->disconnect;
 
   $main::lxdebug->leave_sub();
 
@@ -1413,7 +1418,7 @@ sub retrieve_languages {
   my ($self, $myconfig, $form) = @_;
 
   # connect to database
-  my $dbh = $form->dbconnect($myconfig);
+  my $dbh = $form->get_standard_dbh;
 
   my @values;
   my $where;
@@ -1435,8 +1440,6 @@ sub retrieve_languages {
 
   my $languages = selectall_hashref_query($form, $dbh, $query, @values);
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 
   return $languages;
@@ -1538,17 +1541,21 @@ sub retrieve_accounts {
     SELECT
       p.id, p.inventory_accno_id AS is_part,
       bg.inventory_accno_id,
-      bg.income_accno_id_$form->{taxzone_id} AS income_accno_id,
-      bg.expense_accno_id_$form->{taxzone_id} AS expense_accno_id,
+      tc.income_accno_id AS income_accno_id,
+      tc.expense_accno_id AS expense_accno_id,
       c1.accno AS inventory_accno,
       c2.accno AS income_accno,
       c3.accno AS expense_accno
     FROM parts p
     LEFT JOIN buchungsgruppen bg ON p.buchungsgruppen_id = bg.id
+    LEFT JOIN taxzone_charts tc on bg.id = tc.buchungsgruppen_id
     LEFT JOIN chart c1 ON bg.inventory_accno_id = c1.id
-    LEFT JOIN chart c2 ON bg.income_accno_id_$form->{taxzone_id} = c2.id
-    LEFT JOIN chart c3 ON bg.expense_accno_id_$form->{taxzone_id} = c3.id
-    WHERE p.id IN ($in)
+    LEFT JOIN chart c2 ON tc.income_accno_id = c2.id
+    LEFT JOIN chart c3 ON tc.expense_accno_id = c3.id
+    WHERE
+    tc.taxzone_id = '$form->{taxzone_id}'
+    and
+    p.id IN ($in)
 SQL
 
   my $sth_tax = prepare_query($::form, $dbh, <<SQL);
@@ -1695,8 +1702,37 @@ sub prepare_parts_for_printing {
     }
   }
 
+  my $parts = SL::DB::Manager::Part->get_all(query => [ id => \@part_ids ]);
+  my %parts_by_id = map { $_->id => $_ } @$parts;
+
+  for my $i (1..$rowcount) {
+    my $id = $form->{"${prefix}${i}"};
+    next unless $id;
+
+    push @{ $form->{TEMPLATE_ARRAYS}{part_type} },  $parts_by_id{$id}->type;
+  }
+
   $main::lxdebug->leave_sub();
 }
 
+sub normalize_text_blocks {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  my $form     = $params{form}     || $main::form;
+
+  # check if feature is enabled (select normalize_part_descriptions from defaults)
+  return unless ($::instance_conf->get_normalize_part_descriptions);
+
+  foreach (qw(description notes)) {
+    $form->{$_} =~ s/\s+$//s;
+    $form->{$_} =~ s/^\s+//s;
+    $form->{$_} =~ s/ {2,}/ /g;
+  }
+   $main::lxdebug->leave_sub();
+}
+
 
 1;