Umstellung der HTML-Vorlagen aus templates/webpages/report_generator von HTML::Templa...
[kivitendo-erp.git] / bin / mozilla / ic.pl
index 913c92d..4b563e6 100644 (file)
@@ -46,6 +46,7 @@ use SL::ReportGenerator;
 our ($form, $locale, %myconfig, $lxdebug);
 
 require "bin/mozilla/io.pl";
+require "bin/mozilla/invoice_io.pl";
 require "bin/mozilla/common.pl";
 require "bin/mozilla/reportgenerator.pl";
 
@@ -109,44 +110,33 @@ sub search {
      |;
 
     #write Trigger
-    $jsscript =
-      Form->write_trigger(\%myconfig, "2", "transdatefrom", "BL", "trigger1",
-                          "transdateto", "BL", "trigger2");
+    $jsscript = Form->write_trigger(\%myconfig, "2", "transdatefrom", "BL", "trigger1", "transdateto", "BL", "trigger2");
   } else {
 
     # without JavaScript Calendar
-    $button1 = qq|
-                              <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}"></td>|;
-    $button2 = qq|
-                              <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}"></td>|;
+    $button1 = qq| <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}"></td>|;
+    $button2 = qq| <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}"></td>|;
   }
 
   unless ($form->{searchitems} eq 'service') {
 
-    $onhand = qq|
-            <input name=itemstatus class=radio type=radio value=onhand>&nbsp;|
-      . $locale->text('On Hand') . qq|
-            <input name=itemstatus class=radio type=radio value=short>&nbsp;|
-      . $locale->text('Short') . qq|
+    $onhand = qq| <input name=itemstatus class=radio type=radio value=onhand>&nbsp;| . $locale->text('On Hand') . qq|
+                  <input name=itemstatus class=radio type=radio value=short>&nbsp;| . $locale->text('Short') . qq|
 |;
 
     $makemodel = qq|
         <tr>
-          <th align=right nowrap>| . $locale->text('Make') . qq|</th>
-          <td><input name=make size=20></td>
-          <th align=right nowrap>| . $locale->text('Model') . qq|</th>
-          <td><input name=model size=20></td>
+          <th align=right nowrap>| . $locale->text('Make') . qq|</th> <td><input name=make size=20></td>
+          <th align=right nowrap>| . $locale->text('Model') . qq|</th> <td><input name=model size=20></td>
         </tr>
 |;
 
     $serialnumber = qq|
-          <th align=right nowrap>| . $locale->text('Serial Number') . qq|</th>
-          <td><input name=serialnumber size=20></td>
+          <th align=right nowrap>| . $locale->text('Serial Number') . qq|</th> <td><input name=serialnumber size=20></td>
 |;
 
     $l_serialnumber = qq|
-        <td><input name=l_serialnumber class=checkbox type=checkbox value=Y>&nbsp;|
-      . $locale->text('Serial Number') . qq|</td>
+        <td><input name=l_serialnumber class=checkbox type=checkbox value=Y>&nbsp;| . $locale->text('Serial Number') . qq|</td>
 |;
 
   }
@@ -1549,7 +1539,7 @@ sub generate_report {
   $form->{ledgerchecks} = 'Y' if (   $form->{bought} || $form->{sold} || $form->{onorder}
                                   || $form->{ordered} || $form->{rfq} || $form->{quoted});
 
-  # if something should be aktivated if something else is active, enter it here
+  # if something should be activated if something else is active, enter it here
   my %dependencies = (
     onhand       => [ qw(l_onhand) ],
     short        => [ qw(l_onhand) ],
@@ -1714,7 +1704,7 @@ sub generate_report {
                        'output_format'         => 'HTML',
                        'title'                 => $form->{title},
                        'attachment_basename'   => $attachment_basenames{$form->{searchitems}} . strftime('_%Y%m%d', localtime time),
-    );
+  );
   $report->set_options_from_form();
 
   $report->set_columns(%column_defs);
@@ -1728,22 +1718,26 @@ sub generate_report {
   my %subtotals = map { $_ => 0 } ('onhand', @subtotal_columns);
   my %totals    = map { $_ => 0 } @subtotal_columns;
   my $idx       = 0;
-  my $same_item = $form->{parts}->[0]->{ $form->{sort} } if (scalar @{ $form->{parts} });
+  my $same_item = $form->{parts}[0]{ $form->{sort} } if (scalar @{ $form->{parts} });
 
+  # postprocess parts
   foreach my $ref (@{ $form->{parts} }) {
+
+    # fresh row, for inserting later
     my $row = { map { $_ => { 'data' => $ref->{$_} } } @columns };
 
-    $ref->{exchangerate}  = 1 unless $ref->{exchangerate};
-    $ref->{sellprice}    *= $ref->{exchangerate};
-    $ref->{listprice}    *= $ref->{exchangerate};
-    $ref->{lastcost}     *= $ref->{exchangerate};
+    $ref->{exchangerate} ||= 1;
+    $ref->{price_factor} ||= 1;
+    $ref->{sellprice}     *= $ref->{exchangerate} / $ref->{price_factor};
+    $ref->{listprice}     *= $ref->{exchangerate} / $ref->{price_factor};
+    $ref->{lastcost}      *= $ref->{exchangerate} / $ref->{price_factor};
 
     # use this for assemblies
     my $onhand = $ref->{onhand};
 
     if ($ref->{assemblyitem}) {
-      $row->{partnumber}->{align} = 'right';
-      $row->{onhand}->{data}      = 0;
+      $row->{partnumber}{align}   = 'right';
+      $row->{onhand}{data}        = 0;
       $onhand                     = 0 if ($form->{sold});
     }
 
@@ -1752,11 +1746,11 @@ sub generate_report {
     $row->{description}->{link} = $edit_link;
 
     foreach (qw(sellprice listprice lastcost)) {
-      $row->{$_}->{data}            = $form->format_amount(\%myconfig, $ref->{$_}, -2);
-      $row->{"linetotal$_"}->{data} = $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{$_}, 2);
+      $row->{$_}{data}            = $form->format_amount(\%myconfig, $ref->{$_}, -2);
+      $row->{"linetotal$_"}{data} = $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{$_}, 2);
     }
 
-    map { $row->{$_}->{data} = $form->format_amount(\%myconfig, $ref->{$_}); } qw(onhand rop weight soldtotal);
+    map { $row->{$_}{data} = $form->format_amount(\%myconfig, $ref->{$_}); } qw(onhand rop weight soldtotal);
 
     if (!$ref->{assemblyitem}) {
       foreach my $col (@subtotal_columns) {
@@ -1767,25 +1761,28 @@ sub generate_report {
       $subtotals{onhand} += $onhand;
     }
 
+    # set module stuff
     if ($ref->{module} eq 'oe') {
       my $edit_oe_link = build_std_url("script=oe.pl", 'action=edit', 'type=' . E($ref->{type}), 'id=' . E($ref->{trans_id}), 'callback');
-      $row->{ordnumber}->{link} = $edit_oe_link;
-      $row->{quonumber}->{link} = $edit_oe_link if (!$ref->{ordnumber});
+      $row->{ordnumber}{link} = $edit_oe_link;
+      $row->{quonumber}{link} = $edit_oe_link if (!$ref->{ordnumber});
 
     } else {
-      $row->{invnumber}->{link} = build_std_url("script=$ref->{module}.pl", 'action=edit', 'type=invoice', 'id=' . E($ref->{trans_id}), 'callback');
+      $row->{invnumber}{link} = build_std_url("script=$ref->{module}.pl", 'action=edit', 'type=invoice', 'id=' . E($ref->{trans_id}), 'callback');
     }
 
+    # set properties of images
     if ($ref->{image} && (lc $report->{options}->{output_format} eq 'html')) {
-      $row->{image}->{data}     = '';
-      $row->{image}->{raw_data} = '<a href="' . H($ref->{image}) . '"><img src="' . H($ref->{image}) . '" height="32" border="0"></a>';
+      $row->{image}{data}     = '';
+      $row->{image}{raw_data} = '<a href="' . H($ref->{image}) . '"><img src="' . H($ref->{image}) . '" height="32" border="0"></a>';
     }
-    map { $row->{$_}->{link} = $ref->{$_} } qw(drawing microfiche);
+    map { $row->{$_}{link} = $ref->{$_} } qw(drawing microfiche);
 
     $report->add_data($row);
 
-    my $next_ref = $form->{parts}->[$idx + 1];
+    my $next_ref = $form->{parts}[$idx + 1];
 
+    # insert subtotal rows
     if (($form->{l_subtotal} eq 'Y') &&
         (!$next_ref ||
          (!$next_ref->{assemblyitem} && ($same_item ne $next_ref->{ $form->{sort} })))) {
@@ -1903,7 +1900,7 @@ sub link_part {
 
       # if this is a tax field
       if ($key =~ /IC_tax/) {
-        if ($key =~ /$item/) {
+        if ($key =~ /\Q$item\E/) {
           $form->{taxaccounts} .= "$ref->{accno} ";
           $form->{"IC_tax_$ref->{accno}_description"} =
             "$ref->{accno}--$ref->{description}";
@@ -1980,6 +1977,7 @@ sub form_header {
   my ($notdiscountableok, $notdiscountable);
   my ($formula, $formula_label, $imagelinks, $obsolete, $shopok, $shop);
 
+  $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS');
 
   map({ $form->{$_} = $form->format_amount(\%myconfig, $form->{$_}, -2) }
       qw(sellprice listprice lastcost gv));
@@ -2320,6 +2318,22 @@ sub form_header {
     $unit_select .= AM->unit_select_html($units, "unit", $form->{"unit"});
   }
 
+  my $price_factor;
+  if (0 < scalar @{ $form->{ALL_PRICE_FACTORS} }) {
+    my @values = ('', map { $_->{id}                      } @{ $form->{ALL_PRICE_FACTORS} });
+    my %labels =      map { $_->{id} => $_->{description} } @{ $form->{ALL_PRICE_FACTORS} };
+
+    $price_factor =
+        qq|<tr><th align="right">|
+      . $locale->text('Price Factor')
+      . qq|</th><td>|
+      . NTI($cgi->popup_menu('-name'    => 'price_factor_id',
+                             '-default' => $form->{price_factor_id},
+                             '-values'  => \@values,
+                             '-labels'  => \%labels))
+      . qq|</td></tr>|;
+  }
+
   $form->{fokus} = "ic.partnumber";
   $form->header;
 
@@ -2371,16 +2385,14 @@ sub form_header {
         <tr valign=top>
           <td width=70%>
             <table width="100%" height="100%">
-              <tr class="listheading">
-                <th class="listheading" align="center" colspan=2>|
-    . $locale->text('') . qq|</th>
+              <tr>
+                <td colspan=2>
+                  <table>
+                    $buchungsgruppe
+                    $linkaccounts
+                  </table>
+                </td>
               </tr>
-              <td colspan=2>
-                <table>
-                  $buchungsgruppe
-                  $linkaccounts
-                </table>
-              </td>
               <tr>
                 <th align="left">| . $locale->text('Notes') . qq|</th>
                 <th align="left">$formula_label</th>
@@ -2433,6 +2445,7 @@ sub form_header {
                <td><input name=sellprice size=11 value=$form->{sellprice}></td>
              </tr>
              $lastcost
+             $price_factor
              <tr>
                <th align="right" nowrap="true">| . $locale->text('Unit') . qq|</th>
                <td>$unit_select</td>
@@ -2886,7 +2899,7 @@ sub save {
 
     # now take it apart and restore original values
     foreach my $item (split /&/, $previousform) {
-      my ($key, $value) = split /=/, $item, 2;
+      my ($key, $value) = split m/=/, $item, 2;
       $value =~ s/%26/&/g;
       $form->{$key} = $value;
     }
@@ -2906,8 +2919,7 @@ sub save {
       $form->{weight}    -= $form->{"weight_$i"} * $form->{"qty_$i"};
 
       # change/add values for assembly item
-      map { $form->{"${_}_$i"} = $newform{$_} }
-        qw(partnumber description bin unit weight listprice sellprice inventory_accno income_accno expense_accno);
+      map { $form->{"${_}_$i"} = $newform{$_} } qw(partnumber description bin unit weight listprice sellprice inventory_accno income_accno expense_accno price_factor_id);
 
       $form->{sellprice} += $form->{"sellprice_$i"} * $form->{"qty_$i"};
       $form->{weight}    += $form->{"weight_$i"} * $form->{"qty_$i"};
@@ -2918,15 +2930,17 @@ sub save {
       $i = $form->{rowcount};
       $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"});
 
-      map { $form->{"${_}_$i"} = $newform{$_} }
-        qw(partnumber description bin unit listprice inventory_accno income_accno expense_accno sellprice);
+      map { $form->{"${_}_$i"} = $newform{$_} } qw(partnumber description bin unit listprice inventory_accno income_accno expense_accno sellprice lastcost price_factor_id);
+
       $form->{"sellprice_$i"} = $newform{lastcost} if ($form->{vendor_id});
+
       if ($form->{exchangerate} != 0) {
         $form->{"sellprice_$i"} /= $form->{exchangerate};
       }
+
       $lxdebug->message($LXDebug::DEBUG1, qq|sellprice_$i in previousform 2 = | . $form->{"sellprice_$i"} . qq|\n|);
-      map { $form->{"taxaccounts_$i"} .= "$_ " } split / /,
-        $newform{taxaccount};
+
+      map { $form->{"taxaccounts_$i"} .= "$_ " } split / /, $newform{taxaccount};
       chop $form->{"taxaccounts_$i"};
       foreach my $item (qw(description rate taxnumber)) {
         my $index = $form->{"taxaccounts_$i"} . "_$item";
@@ -2934,26 +2948,28 @@ sub save {
       }
 
       # credit remaining calculation
-      $amount =
-        $form->{"sellprice_$i"} * (1 - $form->{"discount_$i"} / 100) *
-        $form->{"qty_$i"};
-      map { $form->{"${_}_base"} += $amount }
-        (split / /, $form->{"taxaccounts_$i"});
-      map { $amount += ($form->{"${_}_base"} * $form->{"${_}_rate"}) }
-        split / /, $form->{"taxaccounts_$i"}
-        if !$form->{taxincluded};
+      $amount = $form->{"sellprice_$i"} * (1 - $form->{"discount_$i"} / 100) * $form->{"qty_$i"};
+
+      map { $form->{"${_}_base"} += $amount } (split / /, $form->{"taxaccounts_$i"});
+      map { $amount += ($form->{"${_}_base"} * $form->{"${_}_rate"}) } split / /, $form->{"taxaccounts_$i"} if !$form->{taxincluded};
 
       $form->{creditremaining} -= $amount;
 
       # redo number formatting, because invoice parse them!
-      $i = $form->{rowcount};
-      map {
-        $form->{"${_}_$i"} =
-          $form->format_amount(\%myconfig, $form->{"${_}_$i"})
-      } qw(weight listprice sellprice rop);
+      map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}) } qw(weight listprice sellprice rop);
     }
 
     $form->{"id_$i"} = $parts_id;
+
+    # Get the actual price factor (not just the ID) for the marge calculation.
+    $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS');
+    foreach my $pfac (@{ $form->{ALL_PRICE_FACTORS} }) {
+      next if ($pfac->{id} != $newform{price_factor_id});
+      $form->{"marge_price_factor_$i"} = $pfac->{factor};
+      last;
+    }
+    delete $form->{ALL_PRICE_FACTORS};
+
     delete $form->{action};
 
     # restore original callback
@@ -3057,10 +3073,19 @@ sub parts_language_selection {
 
   my $languages = IC->retrieve_languages(\%myconfig, $form);
 
+  if ($form->{language_values} ne "") {
+    foreach $item (split(/---\+\+\+---/, $form->{language_values})) {
+      my ($language_id, $translation, $longdescription) = split(/--\+\+--/, $item);
+
+      foreach my $language (@{ $languages }) {
+        next unless ($language->{id} == $language_id);
 
-  my $callback = "$form->{script}?action=parts_language_selection&";
-  map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
-      (qw(login password name input_name), grep({ /^[fl]_/ } keys %$form)));
+        $language->{translation}     = $translation;
+        $language->{longdescription} = $longdescription;
+        last;
+      }
+    }
+  }
 
   my @header_sort = qw(name longdescription);
   my %header_title = ( "name" => $locale->text("Name"),
@@ -3076,9 +3101,9 @@ sub parts_language_selection {
 
   $form->{"title"} = $locale->text("Language Values");
   $form->header();
-  print($form->parse_html_template("ic/parts_language_selection", { "HEADER" => \@header,
-                                                                   "LANGUAGES" => $languages,
-                                                                   "onload" => $onload }));
+  print $form->parse_html_template2("ic/parts_language_selection", { "HEADER"    => \@header,
+                                                                     "LANGUAGES" => $languages,
+                                                                     "onload"    => $onload });
 
   $lxdebug->leave_sub();
 }