Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 91ab1ef6

Von Sven Schöling vor mehr als 17 Jahren hinzugefügt

  • ID 91ab1ef646193de9359076a876a33a74d7691145
  • Vorgänger d1e4ee79
  • Nachfolger ac7a6ae3

Um die Benutzung des Template Systems mal ein wenig zu foerdern.

Die bin/mozilla/oe.pl noch einmal umgeschrieben, so dass jetzt noch mehr Funktionen ins Frontend ausgelagert sind.

Ein neues Highlight ist die template/generic/multibox.html, die es erlaubt aus wenigen Steuerkommandos ein HTML-Eingabefeld zu erstellen, was bei kleinen Datenmengen als Dropdownbox erscheint, udn bei grossen asl Textfeld, mit dazugehörigem Popup-Button, um eine Auswahlliste aufzumachen. Saemtliche Funktionen lassen sich ueber Perlfunktionsreferenzen wieder zurück ins Backend leiten, und dort wieder mit komplexer Logik füllen. Dokumentation ist im Template direkt enthalten.

Die Customer/Vendor Eingabe macht auch gleich Gebrauch davon und erzeugt bei zu grosser Anzahl ein Textfeld, und daneben einen Suchbutton, der die passenden Kunden in einer Liste anzeigt.

Der "Kundendetails"-Button wurde von "?" umbenannt in "D" (immernoch gruselig)

Auf Wunsch von Moritz habe ich die display_row von bin/mozilla/oe.pl wieder verlagert in die bin/mozilla/io.pl, und dafuer die Version in bin/mozilla/invoice_io.pl deaktiviert.

Unterschiede anzeigen:

SL/Common.pm
return $employees;
}
sub retrieve_customers_or_vendors {
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form, $order_by, $order_dir, $is_vendor, $allow_both) = @_;
my $dbh = $form->dbconnect($myconfig);
my (@filter_values, $filter);
if ($form->{"name"}) {
$filter .= " AND (TABLE.name ILIKE ?)";
push(@filter_values, '%' . $form->{"name"} . '%');
}
if (!$form->{"obsolete"}) {
$filter .= " AND NOT TABLE.obsolete";
}
substr($filter, 1, 3) = "WHERE" if ($filter);
$order_by =~ s/[^a-zA-Z_]//g;
$order_dir = $order_dir ? "ASC" : "DESC";
my (@queries, @query_parameters);
if ($allow_both || !$is_vendor) {
my $c_filter = $filter;
$c_filter =~ s/TABLE/c/g;
push(@queries, qq|SELECT
c.id, c.name, 0 AS customer_is_vendor,
c.street, c.zipcode, c.city,
ct.cp_greeting, ct.cp_title, ct.cp_givenname, ct.cp_name
FROM customer c
LEFT JOIN contacts ct ON (c.id = ct.cp_cv_id)
$c_filter|);
push(@query_parameters, @filter_values);
}
if ($allow_both || $is_vendor) {
my $v_filter = $filter;
$v_filter =~ s/TABLE/v/g;
push(@queries, qq|SELECT
v.id, v.name, 1 AS customer_is_vendor,
v.street, v.zipcode, v.city,
ct.cp_greeting, ct.cp_title, ct.cp_givenname, ct.cp_name
FROM vendor v
LEFT JOIN contacts ct ON (v.id = ct.cp_cv_id)
$v_filter|);
push(@query_parameters, @filter_values);
}
my $query = join(" UNION ", @queries) . " ORDER BY $order_by $order_dir";
my $sth = $dbh->prepare($query);
$sth->execute(@query_parameters) || $form->dberror($query . " (" . join(", ", @query_parameters) . ")");
my $customers = [];
while (my $ref = $sth->fetchrow_hashref()) {
push(@{$customers}, $ref);
}
$sth->finish();
$dbh->disconnect();
$main::lxdebug->leave_sub();
return $customers;
}
sub retrieve_delivery_customer {
$main::lxdebug->enter_sub();
SL/Form.pm
$file = $self->_prepare_html_template($file, $additional_params);
my $template = Template->new({ 'INTERPOLATE' => 0,
'EVAL_PERL' => 0,
'ABSOLUTE' => 1,
'CACHE_SIZE' => 0,
'PLUGIN_BASE' => 'SL::Template::Plugin',
my $template = Template->new({ 'INTERPOLATE' => 0,
'EVAL_PERL' => 0,
'ABSOLUTE' => 1,
'CACHE_SIZE' => 0,
'PLUGIN_BASE' => 'SL::Template::Plugin',
'INCLUDE_PATH' => '.:templates/webpages',
}) || die;
map { $additional_params->{$_} ||= $self->{$_} } keys %{ $self };
SL/Template/Plugin/LxERP.pm
use base qw( Template::Plugin );
use Template::Plugin;
use List::Util qw(first);
sub new {
my $class = shift;
bin/mozilla/common.pl
$lxdebug->leave_sub();
}
## Customers/Vendors
sub check_customer_or_vendor {
$lxdebug->enter_sub();
my ($field, $cov_selected_nextsub, $is_vendor) = @_;
if ($form->{"f_${field}"} eq $form->{"f_old_${field}"}) {
$lxdebug->leave_sub();
return 1;
}
my $type = $is_vendor ? $locale->text("vendor") : $locale->text("customer");
my $old_form = save_form();
$form->{"name"} = $form->{"f_${field}"};
$form->{"obsolete"} = 1;
my $covs;
$covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, "name", 1, $is_vendor);
restore_form($old_form);
if (0 == scalar(@{$covs})) {
$form->header();
$form->show_generic_error(sprintf($locale->text("There is no %s whose name matches '%s'."), $type, $form->{"f_${field}"}));
$lxdebug->leave_sub();
return 0;
}
if (1 != scalar(@{$covs})) {
# If there is more than one CoV with the same name
# then we have to check if the ID is set, too. Otherwise
# we'd be stuck in an endless loop.
if ($form->{"f_${field}_id"}) {
foreach my $cov (@{$covs}) {
if (($form->{"f_${field}_id"} == $cov->{"id"}) &&
($form->{"f_${field}"} eq $cov->{"name"})) {
$lxdebug->leave_sub();
return 1;
}
}
}
$form->{"cov_selected_nextsub"} = $cov_selected_nextsub;
$form->{"check_cov_field"} = $field;
select_customer_or_vendor("cov_selected", $is_vendor, @{$covs});
$lxdebug->leave_sub();
return 0;
}
$form->{"f_${field}_id"} = $covs->[0]->{"id"};
$form->{"f_${field}"} = $covs->[0]->{"name"};
$lxdebug->leave_sub();
return 1;
}
sub select_customer_or_vendor {
$lxdebug->enter_sub();
my ($callback_sub, $is_vendor, @covs) = @_;
my $old_form = save_form();
if (0 == scalar(@covs)) {
delete($form->{"name"});
$form->{"obsolete"} = 1;
my $c = Common->retrieve_customers_or_vendors(\%myconfig, $form, "name", 1, $is_vendor);
restore_form($old_form);
@covs = @{$c};
}
$form->header();
print($form->parse_html_template("generic/select_customer_or_vendor",
{ "COVS" => \@covs,
"old_form" => $old_form,
"title" => $is_vendor ? $locale->text("Select a vendor") : $locale->text("Select a customer"),
"nextsub" => "select_cov_internal",
"callback_sub" => $callback_sub }));
$lxdebug->leave_sub();
}
sub cov_selected {
$lxdebug->enter_sub();
my ($new_id, $new_name) = @_;
my $field = $form->{"check_cov_field"};
delete($form->{"check_cov_field"});
$form->{"f_${field}_id"} = $new_id;
$form->{"f_${field}"} = $new_name;
$form->{"f_old_${field}"} = $new_name;
&{ $form->{"cov_selected_nextsub"} }();
$lxdebug->leave_sub();
}
sub select_cov_internal {
$lxdebug->enter_sub();
my ($new_id, $new_name, $callback_sub);
my $new_id = $form->{"new_id_" . $form->{"selection"}};
my $new_name = $form->{"new_name_" . $form->{"selection"}};
my $callback_sub = $form->{"callback_sub"};
restore_form($form->{"old_form"});
&{ $callback_sub }($new_id, $new_name);
$lxdebug->leave_sub();
}
sub select_part {
$lxdebug->enter_sub();
......
$lxdebug->leave_sub();
}
sub cov_selection_internal {
$lxdebug->enter_sub();
$order_by = "name";
$order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
$order_dir = 1;
$order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
my $type = $form->{"is_vendor"} ? $locale->text("vendor") : $locale->text("customer");
$covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, $order_by, $order_dir, $form->{"is_vendor"}, $form->{"allow_both"});
map({ $covs->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$covs}));
if (0 == scalar(@{$covs})) {
$form->show_generic_information(sprintf($locale->text("No %s was found matching the search parameters."), $type));
} elsif (1 == scalar(@{$covs})) {
$onload = "cov_selected('1')";
}
my $callback = "$form->{script}?action=cov_selection_internal&";
map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
(qw(login path password name input_name input_id is_vendor allow_both), grep({ /^[fl]_/ } keys %$form)));
my @header_sort = qw(name address contact);
my %header_title = ( "name" => $locale->text("Name"),
"address" => $locale->text("Address"),
"contact" => $locale->text("Contact"),
);
my @header =
map(+{ "column_title" => $header_title{$_},
"column" => $_,
"callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
},
@header_sort);
foreach my $cov (@{ $covs }) {
$cov->{address} = "$cov->{street}, $cov->{zipcode} $cov->{city}";
$cov->{address} =~ s{^,}{}x;
$cov->{address} =~ s{\ +}{\ }gx;
$cov->{contact} = join " ", map { $cov->{$_} } qw(cp_greeting cp_title cp_givenname cp_name);
$cov->{contact} =~ s{\ +}{\ }gx;
}
$form->{"title"} = $form->{is_vendor} ? $locale->text("Select a vendor") : $locale->text("Select a customer");
$form->header();
print($form->parse_html_template("generic/cov_selection", { "HEADER" => \@header,
"COVS" => $covs,
"onload" => $onload }));
$lxdebug->leave_sub();
}
sub check_cov2 {
$lxdebug->enter_sub();
my $callback_sub = shift;
if (!$form->{customer}
|| ($form->{customer} eq $form->{old_customer})
|| ("$form->{customer}--$form->{customer_id}" eq $form->{old_customer})) {
$lxdebug->leave_sub();
return;
}
$old_name = $form->{name};
$form->{name} = $form->{customer};
my $covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, "name", "ASC", 0, 1);
$form->{name} = $old_name;
if (0 == scalar @{$covs}) {
$form->show_generic_information(sprintf($locale->text("No %s was found matching the search parameters."), $type));
} elsif (1 == scalar @{ $covs }) {
$form->{customer} = $covs->[0]->{name};
$form->{old_customer} = $covs->[0]->{name};
$form->{customer_id} = $covs->[0]->{id};
$form->{customer_is_vendor} = $covs->[0]->{customer_is_vendor};
} else {
$form->{new_cov_nextsub} = $callback_sub;
delete @{$form}{qw(customer customer_is_vendor customer_id old_customer action)};
my @hidden = map { { 'key' => $_, 'value' => $form->{$_} } } grep { '' eq ref $form->{$_} } keys %{ $form };
foreach my $cov (@{ $covs }) {
$cov->{address} = "$cov->{street}, $cov->{zipcode} $cov->{city}";
$cov->{address} =~ s{^,}{}x;
$cov->{address} =~ s{\ +}{\ }gx;
$cov->{contact} = join " ", map { $cov->{$_} } qw(cp_greeting cp_title cp_givenname cp_name);
$cov->{contact} =~ s{\ +}{\ }gx;
}
$form->{title} = $locale->text("Select a vendor or customer");
$form->header();
print $form->parse_html_template("generic/cov_selection2", { "COVS" => $covs, "HIDDEN" => \@hidden });
exit 0;
}
$lxdebug->leave_sub();
}
sub cov_selected2 {
$lxdebug->enter_sub();
if (!$form->{new_cov} || !$form->{new_cov_nextsub}) {
$form->error($locale->text('No customer has been selected.'));
}
map { $form->{$_} = $form->{"new_cov_${_}_$form->{new_cov}"} } qw(customer customer_id customer_is_vendor);
$form->{old_customer} = $form->{customer};
&{ $form->{new_cov_nextsub} }();
$lxdebug->leave_sub();
}
sub select_item_selection_internal {
$lxdebug->enter_sub();
@items = SystemBrace->retrieve_select_items(\%myconfig, $form, $form->{"select_item_type"});
if (0 == scalar(@items)) {
$form->show_generic_information($locale->text("No item was found."));
} elsif (1 == scalar(@items)) {
$onload = "select_item_selected('1')";
}
$form->{"title"} = $locale->text("Select an entry");
$form->header();
print($form->parse_html_template("generic/select_item_selection", { "SELECT_ITEMS" => \@items,
"onload" => $onload }));
$lxdebug->leave_sub();
}
1;
bin/mozilla/invoice_io.pl
# Eintrag fuer Version 2.2.0 geaendert #
# neue Optik im Rechnungsformular #
########################################
sub display_row {
$lxdebug->enter_sub();
my $numrows = shift;
my $is_sales =
(substr($form->{type}, 0, 6) eq "sales_")
|| (($form->{type} eq "invoice") && ($form->{script} eq "is.pl"))
|| ($form->{type} eq 'credit_note');
if ($lizenzen && $form->{vc} eq "customer") {
if ($form->{type} =~ /sales_order/) {
@column_index = (runningnumber, partnumber, description, ship, qty);
} elsif ($form->{type} =~ /sales_quotation/) {
@column_index = (runningnumber, partnumber, description, qty);
} else {
@column_index = (runningnumber, partnumber, description, qty);
}
} else {
if ( ($form->{type} =~ /purchase_order/)
|| ($form->{type} =~ /sales_order/)) {
@column_index = (runningnumber, partnumber, description, ship, qty);
} else {
@column_index = (runningnumber, partnumber, description, qty);
}
}
############## ENDE Neueintrag ##################
my $dimension_units = AM->retrieve_units(\%myconfig, $form, "dimension");
my $service_units = AM->retrieve_units(\%myconfig, $form, "service");
my $all_units = AM->retrieve_units(\%myconfig, $form);
my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} };
push @column_index, qw(unit);
#for pricegroups column
if ( $form->{type} =~ (/sales_quotation/)
or (($form->{level} =~ /Sales/) and ($form->{type} =~ /invoice/))
or (($form->{level} eq undef) and ($form->{type} =~ /invoice/))
or ($form->{type} =~ /sales_order/)) {
push @column_index, qw(sellprice_pg);
}
push @column_index, qw(sellprice);
if ($form->{vc} eq 'customer') {
push @column_index, qw(discount);
}
push @column_index, "linetotal";
my $colspan = $#column_index + 1;
$form->{invsubtotal} = 0;
map { $form->{"${_}_base"} = 0 } (split(/ /, $form->{taxaccounts}));
########################################
# Eintrag fuer Version 2.2.0 geaendert #
# neue Optik im Rechnungsformular #
########################################
$column_data{runningnumber} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('No.') . qq|</th>|;
$column_data{partnumber} = qq|<th align="left" nowrap width="12%" class="listheading">| . $locale->text('Number') . qq|</th>|;
$column_data{description} = qq|<th align="left" nowrap width="30%" class="listheading">| . $locale->text('Part Description') . qq|</th>|;
if ($form->{"type"} eq "purchase_order") {
$column_data{ship} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('Ship rcvd') . qq|</th>|;
} else {
$column_data{ship} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('Ship') . qq|</th>|;
}
$column_data{qty} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('Qty') . qq|</th>|;
$column_data{unit} = qq|<th align="left" nowrap width="20%" class="listheading">| . $locale->text('Unit') . qq|</th>|;
$column_data{license} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('License') . qq|</th>|;
$column_data{serialnr} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('Serial No.') . qq|</th>|;
$column_data{projectnr} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('Project') . qq|</th>|;
$column_data{sellprice} = qq|<th align="left" nowrap width="15%" class="listheading">| . $locale->text('Price') . qq|</th>|;
$column_data{sellprice_pg} = qq|<th align="left" nowrap width="15%" class="listheading">| . $locale->text('Pricegroup') . qq|</th>|;
$column_data{discount} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('Discount') . qq|</th>|;
$column_data{linetotal} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('Extended') . qq|</th>|;
$column_data{bin} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('Bin') . qq|</th>|;
############## ENDE Neueintrag ##################
$myconfig{"show_form_details"} = 1
unless (defined($myconfig{"show_form_details"}));
$form->{"show_details"} = $myconfig{"show_form_details"}
unless (defined($form->{"show_details"}));
$form->{"show_details"} = $form->{"show_details"} ? 1 : 0;
my $show_details_new = 1 - $form->{"show_details"};
my $show_details_checked = $form->{"show_details"} ? "checked" : "";
print qq|
<tr>
<td>| . $cgi->hidden("-name" => "show_details", "-value" => $form->{show_details}) . qq|
<input type="checkbox" id="cb_show_details" onclick="show_form_details($show_details_new);" $show_details_checked>
<label for="cb_show_details">| . $locale->text("Show details") . qq|</label><br>
<table width="100%">
<tr class="listheading">|;
map { print "\n$column_data{$_}" } @column_index;
print qq|
</tr>
|;
$runningnumber = $locale->text('No.');
$deliverydate = $locale->text('Delivery Date');
$serialnumber = $locale->text('Serial No.');
$projectnumber = $locale->text('Project');
$partsgroup = $locale->text('Group');
$reqdate = $locale->text('Reqdate');
$delvar = 'deliverydate';
if ($form->{type} =~ /_order$/ || $form->{type} =~ /_quotation$/) {
$deliverydate = $locale->text('Required by');
$delvar = 'reqdate';
}
$form->{marge_total} = 0;
$form->{sellprice_total} = 0;
$form->{lastcost_total} = 0;
my %projectnumber_labels = ();
my @projectnumber_values = ("");
foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
push(@projectnumber_values, $item->{"id"});
$projectnumber_labels{$item->{"id"}} = $item->{"projectnumber"};
}
for $i (1 .. $numrows) {
# undo formatting
map {
$form->{"${_}_$i"} =
$form->parse_amount(\%myconfig, $form->{"${_}_$i"})
} qw(qty ship discount sellprice price_new price_old) unless ($form->{simple_save});
if (!$form->{"unit_old_$i"}) {
# Neue Ware aus der Datenbank. In diesem Fall ist unit_$i die
# Einheit, wie sie in den Stammdaten hinterlegt wurde.
# Es sollte also angenommen werden, dass diese ausgewaehlt war.
$form->{"unit_old_$i"} = $form->{"unit_$i"};
}
# Die zuletzt ausgewaehlte mit der aktuell ausgewaehlten Einheit
# vergleichen und bei Unterschied den Preis entsprechend umrechnen.
$form->{"selected_unit_$i"} = $form->{"unit_$i"} unless ($form->{"selected_unit_$i"});
my $check_units = $form->{"inventory_accno_$i"} ? $dimension_units : $service_units;
if (!$check_units->{$form->{"selected_unit_$i"}} ||
($check_units->{$form->{"selected_unit_$i"}}->{"base_unit"} ne
$all_units->{$form->{"unit_old_$i"}}->{"base_unit"})) {
# Die ausgewaehlte Einheit ist fuer diesen Artikel nicht gueltig
# (z.B. Dimensionseinheit war ausgewaehlt, es handelt sich aber
# um eine Dienstleistung). Dann keinerlei Umrechnung vornehmen.
$form->{"unit_old_$i"} = $form->{"selected_unit_$i"} = $form->{"unit_$i"};
}
if ((!$form->{"prices_$i"}) || ($form->{"new_pricegroup_$i"} == $form->{"old_pricegroup_$i"})) {
if ($form->{"unit_old_$i"} ne $form->{"selected_unit_$i"}) {
my $basefactor = 1;
if (defined($all_units->{$form->{"unit_old_$i"}}->{"factor"}) &&
$all_units->{$form->{"unit_old_$i"}}->{"factor"}) {
$basefactor = $all_units->{$form->{"selected_unit_$i"}}->{"factor"} /
$all_units->{$form->{"unit_old_$i"}}->{"factor"};
}
$form->{"sellprice_$i"} *= $basefactor;
$form->{"unit_old_$i"} = $form->{"selected_unit_$i"};
}
}
($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
$decimalplaces = max length($dec), 2;
$price_factor = $price_factors{$form->{"price_factor_id_$i"}} || 1;
$discount = (100 - $form->{"discount_$i"} * 1) / 100;
$linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"} * $discount / $price_factor, $decimalplaces);
my $real_sellprice = $form->{"sellprice_$i"} * $discount / $price_factor;
# marge calculations
my ($marge_font_start, $marge_font_end);
$form->{"lastcost_$i"} *= 1;
$marge_price_factor = $form->{"marge_price_factor_$i"} * 1 || 1;
if ($real_sellprice && ($form->{"qty_$i"} * 1)) {
$form->{"marge_percent_$i"} = ($real_sellprice - $form->{"lastcost_$i"} / $marge_price_factor) * 100 / $real_sellprice;
$myconfig{"marge_percent_warn"} = 15 unless (defined($myconfig{"marge_percent_warn"}));
if ($form->{"id_$i"} &&
($form->{"marge_percent_$i"} < (1 * $myconfig{"marge_percent_warn"}))) {
$marge_font_start = "<font color=\"#ff0000\">";
$marge_font_end = "</font>";
}
} else {
$form->{"marge_percent_$i"} = 0;
}
my $marge_adjust_credit_note = $form->{type} eq 'credit_note' ? -1 : 1;
$form->{"marge_total_$i"} = ($real_sellprice - $form->{"lastcost_$i"} / $marge_price_factor) * $form->{"qty_$i"} * $marge_adjust_credit_note;
$form->{"marge_total"} += $form->{"marge_total_$i"};
$form->{"lastcost_total"} += $form->{"lastcost_$i"} * $form->{"qty_$i"} / $marge_price_factor;
$form->{"sellprice_total"} += $real_sellprice * $form->{"qty_$i"};
map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) } qw(marge_total marge_percent);
# convert " to &quot;
map { $form->{"${_}_$i"} =~ s/\"/&quot;/g }
qw(partnumber description unit unit_old);
########################################
# Eintrag fuer Version 2.2.0 geaendert #
# neue Optik im Rechnungsformular #
########################################
$column_data{runningnumber} =
qq|<td><input name="runningnumber_$i" size="5" value="$i"></td>|; # HuT
############## ENDE Neueintrag ##################
$column_data{partnumber} =
qq|<td><input name="partnumber_$i" size=12 value="$form->{"partnumber_$i"}"></td>|;
if (($rows = $form->numtextrows($form->{"description_$i"}, 30, 6)) > 1) {
$column_data{description} =
qq|<td><textarea name="description_$i" rows="$rows" cols="30" wrap="soft">| . H($form->{"description_$i"}) . qq|</textarea><button type="button" onclick="set_longdescription_window('longdescription_$i')">| . $locale->text('L') . qq|</button></td>|;
} else {
$column_data{description} =
qq|<td><input name="description_$i" size="30" value="| . $form->quote($form->{"description_$i"}) . qq|"><button type="button" onclick="set_longdescription_window('longdescription_$i')">| . $locale->text('L') . qq|</button></td>|;
}
(my $qty_dec) = ($form->{"qty_$i"} =~ /\.(\d+)/);
$qty_dec = length $qty_dec;
$column_data{qty} =
qq|<td align="right"><input name="qty_$i" size="5" value="|
. $form->format_amount(\%myconfig, $form->{"qty_$i"}, $qty_dec) .qq|">|;
if ($form->{"formel_$i"}) {
$column_data{qty} .= qq|<button type="button" onclick="calculate_qty_selection_window('qty_$i','alu_$i', 'formel_$i', $i)">| . $locale->text('*/') . qq|</button>|
. $cgi->hidden("-name" => "formel_$i", "-value" => $form->{"formel_$i"}) . $cgi->hidden("-name" => "alu_$i", "-value" => $form->{"alu_$i"});
}
$column_data{qty} .= qq|</td>|;
$column_data{ship} =
qq|<td align="right"><input name="ship_$i" size=5 value="|
. $form->format_amount(\%myconfig, $form->{"ship_$i"})
. qq|"></td>|;
my $is_part = $form->{"inventory_accno_$i"};
my $is_assembly = $form->{"assembly_$i"};
my $is_assigned = $form->{"id_$i"};
my $this_unit = $form->{"unit_$i"};
if ($form->{"selected_unit_$i"} && $this_unit &&
$all_units->{$form->{"selected_unit_$i"}} && $all_units->{$this_unit} &&
($all_units->{$form->{"selected_unit_$i"}}->{"base_unit"} eq $all_units->{$this_unit}->{"base_unit"})) {
$this_unit = $form->{"selected_unit_$i"};
} elsif (!$is_assigned ||
($is_part && !$this_unit && ($all_units->{$this_unit} && ($all_units->{$this_unit}->{"base_unit"} eq $all_units->{"kg"}->{"base_unit"})))) {
$this_unit = "kg";
}
my $price_factor_select;
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_select =
NTI($cgi->popup_menu('-name' => "price_factor_id_$i",
'-default' => $form->{"price_factor_id_$i"},
'-values' => \@values,
'-labels' => \%labels,
'-style' => 'width:90px'))
. ' ';
}
$column_data{"unit"} = "<td>" .
$price_factor_select .
AM->unit_select_html($is_part || $is_assembly ? $dimension_units :
$is_assigned ? $service_units : $all_units,
"unit_$i", $this_unit,
$is_assigned ? $form->{"unit_$i"} : undef)
. "</td>";
# build in drop down list for pricesgroups
if ($form->{"prices_$i"}) {
if ($form->{"new_pricegroup_$i"} != $form->{"old_pricegroup_$i"}) {
$price_tmp = $form->format_amount(\%myconfig, $form->{"price_new_$i"}, $decimalplaces);
} else {
$price_tmp = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces);
}
$column_data{sellprice_pg} =
qq|<td align="right"><select name="sellprice_pg_$i">$form->{"prices_$i"}</select></td>|;
$column_data{sellprice} =
qq|<td><input name="sellprice_$i" size="10" value="$price_tmp" onBlur=\"check_right_number_format(this)\"></td>|;
} else {
# for last row and report
# set pricegroup drop down list from report menu
if ($form->{"sellprice_$i"} != 0) {
$prices =
qq|<option value="$form->{"sellprice_$i"}--$form->{"pricegroup_id_$i"}" selected>$form->{"pricegroup_$i"}</option>\n|;
$form->{"pricegroup_old_$i"} = $form->{"pricegroup_id_$i"};
$column_data{sellprice_pg} =
qq|<td align="right"><select name="sellprice_pg_$i">$prices</select></td>|;
} else {
# for last row
$column_data{sellprice_pg} = qq|<td align="right">&nbsp;</td>|;
}
$column_data{sellprice} =
qq|<td><input name="sellprice_$i" size="10" onBlur=\"check_right_number_format(this)\" value="|
. $form->format_amount(\%myconfig, $form->{"sellprice_$i"},
$decimalplaces)
. qq|"></td>|;
}
$column_data{discount} =
qq|<td align="right"><input name="discount_$i" size=3 value="|
. $form->format_amount(\%myconfig, $form->{"discount_$i"})
. qq|"></td>|;
$column_data{linetotal} =
qq|<td align="right">|
. $form->format_amount(\%myconfig, $linetotal, 2)
. qq|</td>|;
$column_data{bin} = qq|<td>$form->{"bin_$i"}</td>|;
########################################
# Eintrag fuer Version 2.2.0 geaendert #
# neue Optik im Rechnungsformular #
########################################
# if ($lizenzen && $form->{type} eq "invoice" && $form->{vc} eq "customer") {
# $column_data{license} = qq|<td><select name="licensenumber_$i">$form->{"lizenzen_$i"}></select></td>|;
# }
#
# if ($form->{type} !~ /_quotation/) {
# $column_data{serialnr} = qq|<td><input name="serialnumber_$i" size=10 value="$form->{"serialnumber_$i"}"></td>|;
# }
#
# $column_data{projectnr} = qq|<td><input name="projectnumber_$i" size=10 value="$form->{"projectnumber_$i"}"></td>|;
############## ENDE Neueintrag ##################
my $j = $i % 2;
print qq|
<tr valign="top" class="listrow$j">|;
map { print "\n$column_data{$_}" } @column_index;
print("</tr>\n" .
$cgi->hidden("-name" => "unit_old_$i",
"-value" => $form->{"selected_unit_$i"})
. "\n" .
$cgi->hidden("-name" => "price_new_$i",
"-value" => $form->format_amount(\%myconfig, $form->{"price_new_$i"}))
. "\n");
map({ print($cgi->hidden("-name" => $_, "-value" => $form->{$_}) . "\n"); }
("orderitems_id_$i", "bo_$i", "pricegroup_old_$i", "price_old_$i",
"id_$i", "inventory_accno_$i", "bin_$i", "partsgroup_$i", "partnotes_$i",
"income_accno_$i", "expense_accno_$i", "listprice_$i", "assembly_$i",
"taxaccounts_$i", "ordnumber_$i", "transdate_$i", "cusordnumber_$i",
"longdescription_$i", "basefactor_$i", "marge_total_$i", "marge_percent_$i", "lastcost_$i",
"marge_price_factor_$i"));
########################################
# Eintrag fuer Version 2.2.0 geaendert #
# neue Optik im Rechnungsformular #
########################################
my $row_style_attr =
'style="display:none;"' if (!$form->{"show_details"});
# print second row
print qq|
<tr class="listrow$j" $row_style_attr>
<td colspan="$colspan">
|;
if ($lizenzen && $form->{type} eq "invoice" && $form->{vc} eq "customer") {
my $selected = $form->{"licensenumber_$i"};
my $lizenzen_quoted;
$form->{"lizenzen_$i"} =~ s/ selected//g;
$form->{"lizenzen_$i"} =~
s/value="${selected}"\>/value="${selected}" selected\>/;
$lizenzen_quoted = $form->{"lizenzen_$i"};
$lizenzen_quoted =~ s/\"/&quot;/g;
print qq|
<b>Lizenz\#</b>&nbsp;<select name="licensenumber_$i" size="1">
$form->{"lizenzen_$i"}
</select>
<input type="hidden" name="lizenzen_$i" value="${lizenzen_quoted}">
|;
}
if ($form->{type} !~ /_quotation/) {
print qq|
<b>$serialnumber</b>&nbsp;<input name="serialnumber_$i" size="15" value="$form->{"serialnumber_$i"}">|;
}
print qq|<b>$projectnumber</b>&nbsp;| .
NTI($cgi->popup_menu('-name' => "project_id_$i",
'-values' => \@projectnumber_values,
'-labels' => \%projectnumber_labels,
'-default' => $form->{"project_id_$i"}));
if ($form->{type} eq 'invoice' or $form->{type} =~ /order/) {
my $reqdate_term =
($form->{type} eq 'invoice')
? 'deliverydate'
: 'reqdate'; # invoice uses a different term for the same thing.
print qq|
<b>${$reqdate_term}</b>&nbsp;<input name="${reqdate_term}_$i" size="11" onBlur="check_right_date_format(this)" value="$form->{"${reqdate_term}_$i"}">
|;
}
my $subtotalchecked = ($form->{"subtotal_$i"}) ? "checked" : "";
print qq|
<b>|.$locale->text('Subtotal').qq|</b>&nbsp;<input type="checkbox" name="subtotal_$i" value="1" $subtotalchecked>
|;
if ($form->{"id_$i"} && $is_sales) {
my $marge_price_factor;
$form->{"marge_price_factor_$i"} *= 1;
if ($form->{"marge_price_factor_$i"} && (1 != $form->{"marge_price_factor_$i"})) {
$marge_price_factor = '/' . $form->format_amount(\%myconfig, $form->{"marge_price_factor_$i"});
}
print qq|
${marge_font_start}<b>| . $locale->text('Ertrag') . qq|</b>&nbsp;$form->{"marge_total_$i"}&nbsp;$form->{"marge_percent_$i"} % ${marge_font_end}|;
}
print qq|
&nbsp;<b>| . $locale->text('LP') . qq|</b>&nbsp;| . $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2) . qq|
&nbsp;<b>| . $locale->text('EK') . qq|</b>&nbsp;| . $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, 2) . $marge_price_factor;
print qq|
</td>
</tr>
|;
############## ENDE Neueintrag ##################
map { $form->{"${_}_base"} += $linetotal }
(split(/ /, $form->{"taxaccounts_$i"}));
$form->{invsubtotal} += $linetotal;
}
print qq|
</table>
</td>
</tr>
|;
if (0 != ($form->{sellprice_total} * 1)) {
$form->{marge_percent} = ($form->{sellprice_total} - $form->{lastcost_total}) / $form->{sellprice_total} * 100;
}
$lxdebug->leave_sub();
}
#sub display_row {
# $lxdebug->enter_sub();
# my $numrows = shift;
#
# my $is_sales =
# (substr($form->{type}, 0, 6) eq "sales_")
# || (($form->{type} eq "invoice") && ($form->{script} eq "is.pl"))
# || ($form->{type} eq 'credit_note');
#
# if ($lizenzen && $form->{vc} eq "customer") {
# if ($form->{type} =~ /sales_order/) {
# @column_index = (runningnumber, partnumber, description, ship, qty);
# } elsif ($form->{type} =~ /sales_quotation/) {
# @column_index = (runningnumber, partnumber, description, qty);
# } else {
# @column_index = (runningnumber, partnumber, description, qty);
# }
# } else {
# if ( ($form->{type} =~ /purchase_order/)
# || ($form->{type} =~ /sales_order/)) {
# @column_index = (runningnumber, partnumber, description, ship, qty);
# } else {
# @column_index = (runningnumber, partnumber, description, qty);
# }
# }
############### ENDE Neueintrag ##################
#
# my $dimension_units = AM->retrieve_units(\%myconfig, $form, "dimension");
# my $service_units = AM->retrieve_units(\%myconfig, $form, "service");
# my $all_units = AM->retrieve_units(\%myconfig, $form);
#
# my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} };
#
# push @column_index, qw(unit);
#
# #for pricegroups column
# if ( $form->{type} =~ (/sales_quotation/)
# or (($form->{level} =~ /Sales/) and ($form->{type} =~ /invoice/))
# or (($form->{level} eq undef) and ($form->{type} =~ /invoice/))
# or ($form->{type} =~ /sales_order/)) {
# push @column_index, qw(sellprice_pg);
# }
#
# push @column_index, qw(sellprice);
#
# if ($form->{vc} eq 'customer') {
# push @column_index, qw(discount);
# }
#
# push @column_index, "linetotal";
#
# my $colspan = $#column_index + 1;
#
# $form->{invsubtotal} = 0;
# map { $form->{"${_}_base"} = 0 } (split(/ /, $form->{taxaccounts}));
#
#########################################
# # Eintrag fuer Version 2.2.0 geaendert #
# # neue Optik im Rechnungsformular #
#########################################
# $column_data{runningnumber} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('No.') . qq|</th>|;
# $column_data{partnumber} = qq|<th align="left" nowrap width="12%" class="listheading">| . $locale->text('Number') . qq|</th>|;
# $column_data{description} = qq|<th align="left" nowrap width="30%" class="listheading">| . $locale->text('Part Description') . qq|</th>|;
# if ($form->{"type"} eq "purchase_order") {
# $column_data{ship} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('Ship rcvd') . qq|</th>|;
# } else {
# $column_data{ship} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('Ship') . qq|</th>|;
# }
# $column_data{qty} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('Qty') . qq|</th>|;
# $column_data{unit} = qq|<th align="left" nowrap width="20%" class="listheading">| . $locale->text('Unit') . qq|</th>|;
# $column_data{license} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('License') . qq|</th>|;
# $column_data{serialnr} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('Serial No.') . qq|</th>|;
# $column_data{projectnr} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('Project') . qq|</th>|;
# $column_data{sellprice} = qq|<th align="left" nowrap width="15%" class="listheading">| . $locale->text('Price') . qq|</th>|;
# $column_data{sellprice_pg} = qq|<th align="left" nowrap width="15%" class="listheading">| . $locale->text('Pricegroup') . qq|</th>|;
# $column_data{discount} = qq|<th align="left" nowrap width="5%" class="listheading">| . $locale->text('Discount') . qq|</th>|;
# $column_data{linetotal} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('Extended') . qq|</th>|;
# $column_data{bin} = qq|<th align="left" nowrap width="10%" class="listheading">| . $locale->text('Bin') . qq|</th>|;
############### ENDE Neueintrag ##################
#
# $myconfig{"show_form_details"} = 1
# unless (defined($myconfig{"show_form_details"}));
# $form->{"show_details"} = $myconfig{"show_form_details"}
# unless (defined($form->{"show_details"}));
# $form->{"show_details"} = $form->{"show_details"} ? 1 : 0;
# my $show_details_new = 1 - $form->{"show_details"};
# my $show_details_checked = $form->{"show_details"} ? "checked" : "";
#
# print qq|
# <tr>
# <td>| . $cgi->hidden("-name" => "show_details", "-value" => $form->{show_details}) . qq|
# <input type="checkbox" id="cb_show_details" onclick="show_form_details($show_details_new);" $show_details_checked>
# <label for="cb_show_details">| . $locale->text("Show details") . qq|</label><br>
# <table width="100%">
# <tr class="listheading">|;
#
# map { print "\n$column_data{$_}" } @column_index;
#
# print qq|
# </tr>
#|;
#
# $runningnumber = $locale->text('No.');
# $deliverydate = $locale->text('Delivery Date');
# $serialnumber = $locale->text('Serial No.');
# $projectnumber = $locale->text('Project');
# $partsgroup = $locale->text('Group');
# $reqdate = $locale->text('Reqdate');
#
# $delvar = 'deliverydate';
#
# if ($form->{type} =~ /_order$/ || $form->{type} =~ /_quotation$/) {
# $deliverydate = $locale->text('Required by');
# $delvar = 'reqdate';
# }
#
# $form->{marge_total} = 0;
# $form->{sellprice_total} = 0;
# $form->{lastcost_total} = 0;
# my %projectnumber_labels = ();
# my @projectnumber_values = ("");
# foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
# push(@projectnumber_values, $item->{"id"});
# $projectnumber_labels{$item->{"id"}} = $item->{"projectnumber"};
# }
#
# for $i (1 .. $numrows) {
#
# # undo formatting
# map {
# $form->{"${_}_$i"} =
# $form->parse_amount(\%myconfig, $form->{"${_}_$i"})
# } qw(qty ship discount sellprice price_new price_old) unless ($form->{simple_save});
#
# if (!$form->{"unit_old_$i"}) {
# # Neue Ware aus der Datenbank. In diesem Fall ist unit_$i die
# # Einheit, wie sie in den Stammdaten hinterlegt wurde.
# # Es sollte also angenommen werden, dass diese ausgewaehlt war.
# $form->{"unit_old_$i"} = $form->{"unit_$i"};
# }
#
# # Die zuletzt ausgewaehlte mit der aktuell ausgewaehlten Einheit
# # vergleichen und bei Unterschied den Preis entsprechend umrechnen.
# $form->{"selected_unit_$i"} = $form->{"unit_$i"} unless ($form->{"selected_unit_$i"});
#
# my $check_units = $form->{"inventory_accno_$i"} ? $dimension_units : $service_units;
# if (!$check_units->{$form->{"selected_unit_$i"}} ||
# ($check_units->{$form->{"selected_unit_$i"}}->{"base_unit"} ne
# $all_units->{$form->{"unit_old_$i"}}->{"base_unit"})) {
# # Die ausgewaehlte Einheit ist fuer diesen Artikel nicht gueltig
# # (z.B. Dimensionseinheit war ausgewaehlt, es handelt sich aber
# # um eine Dienstleistung). Dann keinerlei Umrechnung vornehmen.
# $form->{"unit_old_$i"} = $form->{"selected_unit_$i"} = $form->{"unit_$i"};
# }
# if ((!$form->{"prices_$i"}) || ($form->{"new_pricegroup_$i"} == $form->{"old_pricegroup_$i"})) {
# if ($form->{"unit_old_$i"} ne $form->{"selected_unit_$i"}) {
# my $basefactor = 1;
# if (defined($all_units->{$form->{"unit_old_$i"}}->{"factor"}) &&
# $all_units->{$form->{"unit_old_$i"}}->{"factor"}) {
# $basefactor = $all_units->{$form->{"selected_unit_$i"}}->{"factor"} /
# $all_units->{$form->{"unit_old_$i"}}->{"factor"};
# }
# $form->{"sellprice_$i"} *= $basefactor;
# $form->{"unit_old_$i"} = $form->{"selected_unit_$i"};
# }
# }
#
# ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
# $decimalplaces = max length($dec), 2;
#
# $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || 1;
# $discount = (100 - $form->{"discount_$i"} * 1) / 100;
#
# $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"} * $discount / $price_factor, $decimalplaces);
#
# my $real_sellprice = $form->{"sellprice_$i"} * $discount / $price_factor;
#
# # marge calculations
# my ($marge_font_start, $marge_font_end);
#
# $form->{"lastcost_$i"} *= 1;
#
# $marge_price_factor = $form->{"marge_price_factor_$i"} * 1 || 1;
#
# if ($real_sellprice && ($form->{"qty_$i"} * 1)) {
# $form->{"marge_percent_$i"} = ($real_sellprice - $form->{"lastcost_$i"} / $marge_price_factor) * 100 / $real_sellprice;
# $myconfig{"marge_percent_warn"} = 15 unless (defined($myconfig{"marge_percent_warn"}));
#
# if ($form->{"id_$i"} &&
# ($form->{"marge_percent_$i"} < (1 * $myconfig{"marge_percent_warn"}))) {
# $marge_font_start = "<font color=\"#ff0000\">";
# $marge_font_end = "</font>";
# }
#
# } else {
# $form->{"marge_percent_$i"} = 0;
# }
#
# my $marge_adjust_credit_note = $form->{type} eq 'credit_note' ? -1 : 1;
# $form->{"marge_total_$i"} = ($real_sellprice - $form->{"lastcost_$i"} / $marge_price_factor) * $form->{"qty_$i"} * $marge_adjust_credit_note;
# $form->{"marge_total"} += $form->{"marge_total_$i"};
# $form->{"lastcost_total"} += $form->{"lastcost_$i"} * $form->{"qty_$i"} / $marge_price_factor;
# $form->{"sellprice_total"} += $real_sellprice * $form->{"qty_$i"};
#
# map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) } qw(marge_total marge_percent);
#
# # convert " to &quot;
# map { $form->{"${_}_$i"} =~ s/\"/&quot;/g }
# qw(partnumber description unit unit_old);
#
#########################################
# # Eintrag fuer Version 2.2.0 geaendert #
# # neue Optik im Rechnungsformular #
#########################################
# $column_data{runningnumber} =
# qq|<td><input name="runningnumber_$i" size="5" value="$i"></td>|; # HuT
############### ENDE Neueintrag ##################
#
# $column_data{partnumber} =
# qq|<td><input name="partnumber_$i" size=12 value="$form->{"partnumber_$i"}"></td>|;
#
# if (($rows = $form->numtextrows($form->{"description_$i"}, 30, 6)) > 1) {
# $column_data{description} =
# qq|<td><textarea name="description_$i" rows="$rows" cols="30" wrap="soft">| . H($form->{"description_$i"}) . qq|</textarea><button type="button" onclick="set_longdescription_window('longdescription_$i')">| . $locale->text('L') . qq|</button></td>|;
# } else {
# $column_data{description} =
# qq|<td><input name="description_$i" size="30" value="| . $form->quote($form->{"description_$i"}) . qq|"><button type="button" onclick="set_longdescription_window('longdescription_$i')">| . $locale->text('L') . qq|</button></td>|;
# }
#
# (my $qty_dec) = ($form->{"qty_$i"} =~ /\.(\d+)/);
# $qty_dec = length $qty_dec;
#
# $column_data{qty} =
# qq|<td align="right"><input name="qty_$i" size="5" value="|
# . $form->format_amount(\%myconfig, $form->{"qty_$i"}, $qty_dec) .qq|">|;
# if ($form->{"formel_$i"}) {
# $column_data{qty} .= qq|<button type="button" onclick="calculate_qty_selection_window('qty_$i','alu_$i', 'formel_$i', $i)">| . $locale->text('*/') . qq|</button>|
# . $cgi->hidden("-name" => "formel_$i", "-value" => $form->{"formel_$i"}) . $cgi->hidden("-name" => "alu_$i", "-value" => $form->{"alu_$i"});
# }
# $column_data{qty} .= qq|</td>|;
# $column_data{ship} =
# qq|<td align="right"><input name="ship_$i" size=5 value="|
# . $form->format_amount(\%myconfig, $form->{"ship_$i"})
# . qq|"></td>|;
#
# my $is_part = $form->{"inventory_accno_$i"};
# my $is_assembly = $form->{"assembly_$i"};
# my $is_assigned = $form->{"id_$i"};
# my $this_unit = $form->{"unit_$i"};
# if ($form->{"selected_unit_$i"} && $this_unit &&
# $all_units->{$form->{"selected_unit_$i"}} && $all_units->{$this_unit} &&
# ($all_units->{$form->{"selected_unit_$i"}}->{"base_unit"} eq $all_units->{$this_unit}->{"base_unit"})) {
# $this_unit = $form->{"selected_unit_$i"};
# } elsif (!$is_assigned ||
# ($is_part && !$this_unit && ($all_units->{$this_unit} && ($all_units->{$this_unit}->{"base_unit"} eq $all_units->{"kg"}->{"base_unit"})))) {
# $this_unit = "kg";
# }
#
# my $price_factor_select;
# 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_select =
# NTI($cgi->popup_menu('-name' => "price_factor_id_$i",
# '-default' => $form->{"price_factor_id_$i"},
# '-values' => \@values,
# '-labels' => \%labels,
# '-style' => 'width:90px'))
# . ' ';
# }
#
# $column_data{"unit"} = "<td>" .
# $price_factor_select .
# AM->unit_select_html($is_part || $is_assembly ? $dimension_units :
# $is_assigned ? $service_units : $all_units,
# "unit_$i", $this_unit,
# $is_assigned ? $form->{"unit_$i"} : undef)
# . "</td>";
#
# # build in drop down list for pricesgroups
# if ($form->{"prices_$i"}) {
# if ($form->{"new_pricegroup_$i"} != $form->{"old_pricegroup_$i"}) {
# $price_tmp = $form->format_amount(\%myconfig, $form->{"price_new_$i"}, $decimalplaces);
# } else {
# $price_tmp = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces);
# }
#
# $column_data{sellprice_pg} =
# qq|<td align="right"><select name="sellprice_pg_$i">$form->{"prices_$i"}</select></td>|;
# $column_data{sellprice} =
# qq|<td><input name="sellprice_$i" size="10" value="$price_tmp" onBlur=\"check_right_number_format(this)\"></td>|;
# } else {
#
# # for last row and report
# # set pricegroup drop down list from report menu
# if ($form->{"sellprice_$i"} != 0) {
# $prices =
# qq|<option value="$form->{"sellprice_$i"}--$form->{"pricegroup_id_$i"}" selected>$form->{"pricegroup_$i"}</option>\n|;
#
# $form->{"pricegroup_old_$i"} = $form->{"pricegroup_id_$i"};
#
# $column_data{sellprice_pg} =
# qq|<td align="right"><select name="sellprice_pg_$i">$prices</select></td>|;
#
# } else {
#
# # for last row
# $column_data{sellprice_pg} = qq|<td align="right">&nbsp;</td>|;
# }
#
# $column_data{sellprice} =
# qq|<td><input name="sellprice_$i" size="10" onBlur=\"check_right_number_format(this)\" value="|
# . $form->format_amount(\%myconfig, $form->{"sellprice_$i"},
# $decimalplaces)
# . qq|"></td>|;
# }
# $column_data{discount} =
# qq|<td align="right"><input name="discount_$i" size=3 value="|
# . $form->format_amount(\%myconfig, $form->{"discount_$i"})
# . qq|"></td>|;
# $column_data{linetotal} =
# qq|<td align="right">|
# . $form->format_amount(\%myconfig, $linetotal, 2)
# . qq|</td>|;
# $column_data{bin} = qq|<td>$form->{"bin_$i"}</td>|;
#
#########################################
# # Eintrag fuer Version 2.2.0 geaendert #
# # neue Optik im Rechnungsformular #
#########################################
# # if ($lizenzen && $form->{type} eq "invoice" && $form->{vc} eq "customer") {
# # $column_data{license} = qq|<td><select name="licensenumber_$i">$form->{"lizenzen_$i"}></select></td>|;
# # }
# #
# # if ($form->{type} !~ /_quotation/) {
# # $column_data{serialnr} = qq|<td><input name="serialnumber_$i" size=10 value="$form->{"serialnumber_$i"}"></td>|;
# # }
# #
# # $column_data{projectnr} = qq|<td><input name="projectnumber_$i" size=10 value="$form->{"projectnumber_$i"}"></td>|;
############### ENDE Neueintrag ##################
# my $j = $i % 2;
# print qq|
#
# <tr valign="top" class="listrow$j">|;
#
# map { print "\n$column_data{$_}" } @column_index;
#
# print("</tr>\n" .
# $cgi->hidden("-name" => "unit_old_$i",
# "-value" => $form->{"selected_unit_$i"})
# . "\n" .
# $cgi->hidden("-name" => "price_new_$i",
# "-value" => $form->format_amount(\%myconfig, $form->{"price_new_$i"}))
# . "\n");
# map({ print($cgi->hidden("-name" => $_, "-value" => $form->{$_}) . "\n"); }
# ("orderitems_id_$i", "bo_$i", "pricegroup_old_$i", "price_old_$i",
# "id_$i", "inventory_accno_$i", "bin_$i", "partsgroup_$i", "partnotes_$i",
# "income_accno_$i", "expense_accno_$i", "listprice_$i", "assembly_$i",
# "taxaccounts_$i", "ordnumber_$i", "transdate_$i", "cusordnumber_$i",
# "longdescription_$i", "basefactor_$i", "marge_total_$i", "marge_percent_$i", "lastcost_$i",
# "marge_price_factor_$i"));
#
#########################################
# # Eintrag fuer Version 2.2.0 geaendert #
# # neue Optik im Rechnungsformular #
#########################################
#
# my $row_style_attr =
# 'style="display:none;"' if (!$form->{"show_details"});
#
# # print second row
# print qq|
# <tr class="listrow$j" $row_style_attr>
# <td colspan="$colspan">
#|;
# if ($lizenzen && $form->{type} eq "invoice" && $form->{vc} eq "customer") {
# my $selected = $form->{"licensenumber_$i"};
# my $lizenzen_quoted;
# $form->{"lizenzen_$i"} =~ s/ selected//g;
# $form->{"lizenzen_$i"} =~
# s/value="${selected}"\>/value="${selected}" selected\>/;
# $lizenzen_quoted = $form->{"lizenzen_$i"};
# $lizenzen_quoted =~ s/\"/&quot;/g;
# print qq|
# <b>Lizenz\#</b>&nbsp;<select name="licensenumber_$i" size="1">
# $form->{"lizenzen_$i"}
# </select>
# <input type="hidden" name="lizenzen_$i" value="${lizenzen_quoted}">
#|;
# }
# if ($form->{type} !~ /_quotation/) {
# print qq|
# <b>$serialnumber</b>&nbsp;<input name="serialnumber_$i" size="15" value="$form->{"serialnumber_$i"}">|;
# }
#
# print qq|<b>$projectnumber</b>&nbsp;| .
# NTI($cgi->popup_menu('-name' => "project_id_$i",
# '-values' => \@projectnumber_values,
# '-labels' => \%projectnumber_labels,
# '-default' => $form->{"project_id_$i"}));
#
# if ($form->{type} eq 'invoice' or $form->{type} =~ /order/) {
# my $reqdate_term =
# ($form->{type} eq 'invoice')
# ? 'deliverydate'
# : 'reqdate'; # invoice uses a different term for the same thing.
# print qq|
# <b>${$reqdate_term}</b>&nbsp;<input name="${reqdate_term}_$i" size="11" onBlur="check_right_date_format(this)" value="$form->{"${reqdate_term}_$i"}">
#|;
# }
# my $subtotalchecked = ($form->{"subtotal_$i"}) ? "checked" : "";
# print qq|
# <b>|.$locale->text('Subtotal').qq|</b>&nbsp;<input type="checkbox" name="subtotal_$i" value="1" $subtotalchecked>
#|;
#
# if ($form->{"id_$i"} && $is_sales) {
# my $marge_price_factor;
#
# $form->{"marge_price_factor_$i"} *= 1;
#
# if ($form->{"marge_price_factor_$i"} && (1 != $form->{"marge_price_factor_$i"})) {
# $marge_price_factor = '/' . $form->format_amount(\%myconfig, $form->{"marge_price_factor_$i"});
# }
#
# print qq|
# ${marge_font_start}<b>| . $locale->text('Ertrag') . qq|</b>&nbsp;$form->{"marge_total_$i"}&nbsp;$form->{"marge_percent_$i"} % ${marge_font_end}|;
# }
# print qq|
# &nbsp;<b>| . $locale->text('LP') . qq|</b>&nbsp;| . $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2) . qq|
# &nbsp;<b>| . $locale->text('EK') . qq|</b>&nbsp;| . $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, 2) . $marge_price_factor;
#
#
# print qq|
# </td>
# </tr>
#|;
#
############### ENDE Neueintrag ##################
#
# map { $form->{"${_}_base"} += $linetotal }
# (split(/ /, $form->{"taxaccounts_$i"}));
#
# $form->{invsubtotal} += $linetotal;
# }
#
# print qq|
# </table>
# </td>
# </tr>
#|;
#
# if (0 != ($form->{sellprice_total} * 1)) {
# $form->{marge_percent} = ($form->{sellprice_total} - $form->{lastcost_total}) / $form->{sellprice_total} * 100;
# }
#
# $lxdebug->leave_sub();
#}
sub set_pricegroup {
$lxdebug->enter_sub();
bin/mozilla/io.pl
# Eintrag fuer Version 2.2.0 geaendert #
# neue Optik im Rechnungsformular #
########################################
sub display_row {
$lxdebug->enter_sub();
my $numrows = shift;
# column_index
my @header_sort = qw(runningnumber partnumber description ship qty unit sellprice_pg sellprice discount linetotal);
my @HEADER = (
{ id => 'runningnumber', width => 5, value => $locale->text('No.'), display => 1, },
{ id => 'partnumber', width => 12, value => $locale->text('Number'), display => 1, },
{ id => 'description', width => 30, value => $locale->text('Part Description'), display => 1, },
{ id => 'ship', width => 5, value => ($form->{type} eq 'purchase_order' ? $locale->text('Ship rcvd') : $locale->text('Ship')),
display => $form->{type} =~ /sales_order/ || ($form->{type} =~ /purchase_order/ && !($lizenzen && $form->{vc} eq "customer")) , },
{ id => 'qty', width => 5, value => $locale->text('Qty'), display => 1, },
{ id => 'unit', width => 5, value => $locale->text('Unit'), display => 1, },
{ id => 'license', width => 10, value => $locale->text('License'), display => 0, },
{ id => 'serialnr', width => 10, value => $locale->text('Serial No.'), display => 0, },
{ id => 'projectnr', width => 10, value => $locale->text('Project'), display => 0, },
{ id => 'sellprice', width => 15, value => $locale->text('Price'), display => 1, },
{ id => 'sellprice_pg', width => 15, value => $locale->text('Pricegroup'), display => $form->{type} =~ /^sales_/, },
{ id => 'discount', width => 5, value => $locale->text('Discount'), display => $form->{vc} eq 'customer', },
{ id => 'linetotal', width => 10, value => $locale->text('Extended'), display => 1, },
{ id => 'bin', width => 10, value => $locale->text('Bin'), display => 0, },
);
my @column_index = map { $_->{id} } grep { $_->{display} } @HEADER;
# cache units
my $dimension_units = AM->retrieve_units(\%myconfig, $form, "dimension");
my $service_units = AM->retrieve_units(\%myconfig, $form, "service");
my $all_units = AM->retrieve_units(\%myconfig, $form);
my $colspan = scalar @column_index;
$form->{invsubtotal} = 0;
map { $form->{"${_}_base"} = 0 } (split(/ /, $form->{taxaccounts}));
# about details
$myconfig{show_form_details} = 1 unless (defined($myconfig{show_form_details}));
$form->{show_details} = $myconfig{show_form_details} unless (defined($form->{show_details}));
# /about details
# translations, unused commented out
# $runningnumber = $locale->text('No.');
$deliverydate = $locale->text('Delivery Date');
$serialnumber = $locale->text('Serial No.');
$projectnumber = $locale->text('Project');
# $partsgroup = $locale->text('Group');
$reqdate = $locale->text('Reqdate');
$deliverydate = $locale->text('Required by');
# special alignings
my %align = map { $_ => 'right' } qw(qty ship right sellprice_pg discount linetotal);
$form->{marge_total} = 0;
$form->{sellprice_total} = 0;
$form->{lastcost_total} = 0;
my %projectnumber_labels = ();
my @projectnumber_values = ("");
foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
push(@projectnumber_values, $item->{"id"});
$projectnumber_labels{$item->{"id"}} = $item->{"projectnumber"};
}
# rows
for $i (1 .. $numrows) {
# undo formatting
map { $form->{"${_}_$i"} = $form->parse_amount(\%myconfig, $form->{"${_}_$i"}) } qw(qty ship discount sellprice price_new price_old) unless ($form->{simple_save});
# unit begin
$form->{"unit_old_$i"} ||= $form->{"unit_$i"};
$form->{"selected_unit_$i"} ||= $form->{"unit_$i"};
my $local_units = $form->{"inventory_accno_$i"} || $form->{"assembly_$i"} ? $dimension_units
: $form->{"id_$i"} ? $service_units
: $all_units;
if ( !$local_units->{$form->{"selected_unit_$i"}} # Die ausgewaehlte Einheit ist fuer diesen Artikel nicht gueltig
|| !AM->convert_unit($form->{"selected_unit_$i"}, $form->{"unit_old_$i"}, $all_units)) { # (z.B. Dimensionseinheit war ausgewaehlt, es handelt sich aber
$form->{"unit_old_$i"} = $form->{"selected_unit_$i"} = $form->{"unit_$i"}; # um eine Dienstleistung). Dann keinerlei Umrechnung vornehmen.
}
# adjust prices by unit, ignore if pricegroup changed
if ((!$form->{"prices_$i"}) || ($form->{"new_pricegroup_$i"} == $form->{"old_pricegroup_$i"})) {
$form->{"sellprice_$i"} *= AM->convert_unit($form->{"selected_unit_$i"}, $form->{"unit_old_$i"}, $all_units) || 1;
$form->{"unit_old_$i"} = $form->{"selected_unit_$i"};
}
my $this_unit = $form->{"unit_$i"};
$this_unit = $form->{"selected_unit_$i"} if AM->convert_unit($this_unit, $form->{"selected_unit_$i"}, $all_units);
$this_unit ||= "kg";
$column_data{"unit"} = AM->unit_select_html($local_units, "unit_$i", $this_unit, $form->{"id_$i"} ? $form->{"unit_$i"} : undef);
# / unit ending
$form->{"sellprice_$i"} =~ /\.(\d+)/;
$decimalplaces = max 2, length $1;
$discount = $form->round_amount($form->{"sellprice_$i"} * $form->{"discount_$i"} / 100, $decimalplaces);
$linetotal = $form->round_amount($form->{"sellprice_$i"} - $discount, $decimalplaces);
$linetotal = $form->round_amount($linetotal * $form->{"qty_$i"}, 2);
# convert " to &quot;
map { $form->{"${_}_$i"} =~ s/\"/&quot;/g } qw(partnumber description unit unit_old);
$column_data{runningnumber} = $cgi->textfield(-name => "runningnumber_$i", -size => 5, -value => $i); # HuT
$column_data{partnumber} = $cgi->textfield(-name => "partnumber_$i", -size => 12, -value => $form->{"partnumber_$i"});
$column_data{description} = ((($rows = $form->numtextrows($form->{"description_$i"}, 30, 6)) > 1) # if description is too large, use a textbox instead
? $cgi->textarea( -name => "description_$i", -default => H($form->{"description_$i"}), -rows => $rows, -columns => 30)
: $cgi->textfield(-name => "description_$i", -size => 30, -value => $form->quote($form->{"description_$i"})))
. $cgi->button(-value => $locale->text('L'), -onClick => "set_longdescription_window('longdescription_$i')");
$form->{"qty_$i"} =~ /\.(\d+)/;
my $qty_dec = length $1;
$column_data{qty} = $cgi->textfield(-name => "qty_$i", -size => 5, -value => $form->format_amount(\%myconfig, $form->{"qty_$i"}, $qty_dec));
$column_data{qty} .= $cgi->button(-onclick => "calculate_qty_selection_window('qty_$i','alu_$i', 'formel_$i', $i)", -value => $locale->text('*/'))
. $cgi->hidden(-name => "formel_$i", -value => $form->{"formel_$i"}) . $cgi->hidden("-name" => "alu_$i", "-value" => $form->{"alu_$i"})
if $form->{"formel_$i"};
$column_data{ship} = $cgi->textfield(-name => "ship_$i", -size => 5, -value => $form->format_amount(\%myconfig, $form->{"ship_$i"}));
# build in drop down list for pricesgroups
if ($form->{"prices_$i"}) {
$column_data{sellprice_pg} = qq|<select name="sellprice_pg_$i">$form->{"prices_$i"}</select>|;
$column_data{sellprice} = $cgi->textfield(-name => "sellprice_$i", -size => 10, -onBlur => 'check_right_number_format(this)', -value =>
(($form->{"new_pricegroup_$i"} != $form->{"old_pricegroup_$i"})
? $form->format_amount(\%myconfig, $form->{"price_new_$i"}, $decimalplaces)
: $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces)));
} else {
# for last row and report
# set pricegroup drop down list from report menu
if ($form->{"sellprice_$i"} != 0) {
$form->{"pricegroup_old_$i"} = $form->{"pricegroup_id_$i"};
my $default_option = $form->{"sellprice_$i"}.'--'.$form->{"pricegroup_id_$i"};
$column_data{sellprice_pg} = NTI($cgi->popup_menu("sellpricepg_$i", [ $default_option ], $default_option, { $default_option => $form->{"pricegroup_$i"} || '' }));
} else {
$column_data{sellprice_pg} = qq|&nbsp;|;
}
$column_data{sellprice} = $cgi->textfield(-name => "sellprice_$i", -size => 10, -onBlur => "check_right_number_format(this)", -value =>
$form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces));
}
$column_data{discount} = $cgi->textfield(-name => "discount_$i", -size => 3, -value => $form->format_amount(\%myconfig, $form->{"discount_$i"}));
$column_data{linetotal} = $form->format_amount(\%myconfig, $linetotal, 2);
$column_data{bin} = $form->{"bin_$i"};
my @ROW1 = map { value => $column_data{$_}, align => $align{$_} }, @column_index;
# second row
my @ROW2 = ();
push @ROW2, { value => qq|<b>$serialnumber</b> <input name="serialnumber_$i" size="15" value="$form->{"serialnumber_$i"}">| }
if $form->{type} !~ /_quotation/;
push @ROW2, { value => qq|<b>$projectnumber</b> | . NTI($cgi->popup_menu('-name' => "project_id_$i", '-values' => \@projectnumber_values,
'-labels' => \%projectnumber_labels, '-default' => $form->{"project_id_$i"})) };
push @ROW2, { value => qq|<b>$reqdate</b> <input name="reqdate_$i" size="11" onBlur="check_right_date_format(this)" value="$form->{"reqdate_$i"}">| }
if $form->{type} =~ /order/;
push @ROW2, { value => sprintf qq|<b>%s</b>&nbsp;<input type="checkbox" name="subtotal_$i" value="1" %s>|,
$locale->text('Subtotal'), $form->{"subtotal_$i"} ? 'checked' : '' };
# begin marge calculations
my $marge_color;
my $real_sellprice = $form->{"sellprice_$i"} - $discount;
$form->{"lastcost_$i"} *= 1;
$form->{"marge_percent_$i"} = 0;
if ($real_sellprice && ($form->{"qty_$i"} * 1)) {
$form->{"marge_percent_$i"} = ($real_sellprice - $form->{"lastcost_$i"}) * 100 / $real_sellprice;
$myconfig{marge_percent_warn} ||= 15;
$marge_color = 'color="#ff0000"' if $form->{"id_$i"} && ($form->{"marge_percent_$i"} < (1 * $myconfig{marge_percent_warn}));
}
my $marge_adjust_credit_note = $form->{type} eq 'credit_note' ? -1 : 1;
$form->{"marge_absolut_$i"} = ($real_sellprice - $form->{"lastcost_$i"}) * $form->{"qty_$i"} * $marge_adjust_credit_note;
... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.

Auch abrufbar als: Unified diff