$main::lxdebug->leave_sub();
}
+# if $a is translatable to $b, return the factor between them.
+# else return 1
+sub convert_unit {
+ $main::lxdebug->enter_sub(2);
+ ($this, $a, $b, $all_units) = @_;
+
+ $main::lxdebug->leave_sub(2) and return 0 unless $all_units->{$a} && $all_units->{$b};
+ $main::lxdebug->leave_sub(2) and return 0 unless $all_units->{$a}{base_unit} eq $all_units->{$b}{base_unit};
+ $main::lxdebug->leave_sub(2) and return $all_units->{$a}{factor} / $all_units->{$b}{factor};
+}
+
sub unit_select_data {
$main::lxdebug->enter_sub();
'EVAL_PERL' => 0,
'ABSOLUTE' => 1,
'CACHE_SIZE' => 0,
+ 'PLUGIN_BASE' => 'SL::Template::Plugin',
}) || die;
map { $additional_params->{$_} ||= $self->{$_} } keys %{ $self };
sub _get_customers {
$main::lxdebug->enter_sub();
- my ($self, $dbh, $key) = @_;
+ my ($self, $dbh, $key, $limit) = @_;
$key = "all_customers" unless ($key);
+ $limit_clause = "LIMIT $limit" if $limit;
- my $query = qq|SELECT * FROM customer WHERE NOT obsolete ORDER BY name|;
+ my $query = qq|SELECT * FROM customer WHERE NOT obsolete ORDER BY name $limit_clause|;
$self->{$key} = selectall_hashref_query($self, $dbh, $query);
}
if($params{"customers"}) {
- $self->_get_customers($dbh, $params{"customers"});
+ if (ref $params{"customers"} eq 'HASH') {
+ $self->_get_customers($dbh, $params{"customers"}{key}, $params{"customers"}{limit});
+ } else {
+ $self->_get_customers($dbh, $params{"customers"});
+ }
}
if($params{"vendors"}) {
- $self->_get_vendors($dbh, $params{"vendors"});
+ if (ref $params{"vendors"} eq 'HASH') {
+ $self->_get_vendors($dbh, $params{"vendors"}{key}, $params{"vendors"}{limit});
+ } else {
+ $self->_get_vendors($dbh, $params{"vendors"});
+ }
}
if($params{"payments"}) {
my @sort_cols = (@simple_filters, qw(id bin priceupdate onhand invnumber ordnumber quonumber name serialnumber soldtotal deliverydate));
$form->{sort} = 'id' unless grep { $form->{"l_$_"} } grep { $form->{sort} eq $_ } @sort_cols;
- my $order_clause = " ORDER BY $form->{sort} " . ($form->{revers} ? 'DESC' : 'ASC');
+
+ my $sort_order = ($form->{revers} ? ' DESC' : ' ASC');
+
+ # special case: sorting by partnumber
+ # since partnumbers are expected to be prefixed integers, a special sorting is implemented sorting first lexically by prefix and then by suffix.
+ # and yes, that expression is designed to hold that array of regexes only once, so the map is kinda messy, sorry about that.
+ # ToDO: implement proper functional sorting
+ $form->{sort} = join ', ', map { push @select_tokens, $_; ($table_prefix{$_} = "substring(partnumber,'[") . $_ } qw|^[:digit:]]+') [:digit:]]+')::INTEGER|
+ if $form->{sort} eq 'partnumber';
+
+ my $order_clause = " ORDER BY $form->{sort} $sort_order";
my $limit_clause = " LIMIT 100" if $form->{top100};
#============= build query ================#
- my %table_prefix = (
+ %table_prefix = (
+ %table_prefix,
deliverydate => 'apoe.', serialnumber => 'ioi.',
transdate => 'apoe.', trans_id => 'ioi.',
module => 'apoe.', name => 'cv.',
sub get_vendor {
$main::lxdebug->enter_sub();
- my ($self, $myconfig, $form) = @_;
+ my ($self, $myconfig, $form, $params) = @_;
+
+ $params = $form unless defined $params && ref $params eq "HASH";
+ $main::lxdebug->message(0, Dumper($params));
# connect to database
my $dbh = $form->dbconnect($myconfig);
my $dateformat = $myconfig->{dateformat};
$dateformat .= "yy" if $myconfig->{dateformat} !~ /^y/;
- my $vid = conv_i($form->{vendor_id});
+ my $vid = conv_i($params->{vendor_id});
+ my $vnr = conv_i($params->{vendornumber});
my $duedate =
- ($form->{invdate})
- ? "to_date(" . $dbh->quote($form->{invdate}) . ", '$dateformat')"
+ ($params->{invdate})
+ ? "to_date(" . $dbh->quote($params->{invdate}) . ", '$dateformat')"
: "current_date";
# get vendor
+ @values = ();
+ if ($vid) {
+ $where .= 'AND v.id = ?';
+ push @values, $vid;
+ }
+ if ($vnr) {
+ $where .= 'AND v.vendornumber = ?';
+ push @values, $vnr;
+ }
my $query =
qq|SELECT
- v.name AS vendor, v.creditlimit, v.terms, v.notes AS intnotes,
+ v.id, v.name AS vendor, v.creditlimit, v.terms, v.notes AS intnotes,
v.email, v.cc, v.bcc, v.language_id, v.payment_id,
v.street, v.zipcode, v.city, v.country, v.taxzone_id,
$duedate + COALESCE(pt.terms_netto, 0) AS duedate,
FROM vendor v
LEFT JOIN business b ON (b.id = v.business_id)
LEFT JOIN payment_terms pt ON (v.payment_id = pt.id)
- WHERE v.id = ?|;
- $ref = selectfirst_hashref_query($form, $dbh, $query, $vid);
- map { $form->{$_} = $ref->{$_} } keys %$ref;
+ WHERE 1=1 $where|;
+ $ref = selectfirst_hashref_query($form, $dbh, $query, @values);
+ map { $params->{$_} = $ref->{$_} } keys %$ref;
- $form->{creditremaining} = $form->{creditlimit};
+ $params->{creditremaining} = $params->{creditlimit};
$query = qq|SELECT SUM(amount - paid) FROM ap WHERE vendor_id = ?|;
my ($unpaid_invoices) = selectfirst_array_query($form, $dbh, $query, $vid);
- $form->{creditremaining} -= $unpaid_invoices;
+ $params->{creditremaining} -= $unpaid_invoices;
$query = qq|SELECT o.amount,
(SELECT e.sell
my $sth = prepare_execute_query($form, $dbh, $query, $vid);
while (my ($amount, $exch) = $sth->fetchrow_array()) {
$exch = 1 unless $exch;
- $form->{creditremaining} -= $amount * $exch;
+ $params->{creditremaining} -= $amount * $exch;
}
$sth->finish();
# get shipto if we do not convert an order or invoice
- if (!$form->{shipto}) {
- delete @{$form}{qw(shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax shiptoemail)};
+ if (!$params->{shipto}) {
+ delete @{$params}{qw(shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax shiptoemail)};
$query = qq|SELECT * FROM shipto WHERE (trans_id = ?) AND (module= 'CT')|;
$ref = selectfirst_hashref_query($form, $dbh, $query, $vid);
- @{$form}{keys %$ref} = @{$ref}{keys %$ref};
- map { $form->{$_} = $ref->{$_} } keys %$ref;
+ @{$params}{keys %$ref} = @{$ref}{keys %$ref};
+ map { $params->{$_} = $ref->{$_} } keys %$ref;
}
- if (!$form->{id} && $form->{type} !~ /_(order|quotation)/) {
+ if (!$params->{id} && $params->{type} !~ /_(order|quotation)/) {
# setup last accounts used
$query =
qq|SELECT c.id, c.accno, c.description, c.link, c.category
if ($ref->{category} eq 'E') {
$i++;
- if ($form->{initial_transdate}) {
+ if ($params->{initial_transdate}) {
my $tax_query = qq|SELECT tk.tax_id, t.rate FROM taxkeys tk
LEFT JOIN tax t ON (tk.tax_id = t.id)
WHERE (tk.chart_id = ?) AND (startdate <= ?)
ORDER BY tk.startdate DESC
LIMIT 1|;
- my ($tax_id, $rate) = selectrow_query($form, $dbh, $tax_query, $ref->{id}, $form->{initial_transdate});
- $form->{"taxchart_$i"} = "${tax_id}--${rate}";
+ my ($tax_id, $rate) = selectrow_query($form, $dbh, $tax_query, $ref->{id}, $params->{initial_transdate});
+ $params->{"taxchart_$i"} = "${tax_id}--${rate}";
}
- $form->{"AP_amount_$i"} = "$ref->{accno}--$tax_id";
+ $params->{"AP_amount_$i"} = "$ref->{accno}--$tax_id";
}
if ($ref->{category} eq 'L') {
- $form->{APselected} = $form->{AP_1} = $ref->{accno};
+ $params->{APselected} = $params->{AP_1} = $ref->{accno};
}
}
- $form->{rowcount} = $i if ($i && !$form->{type});
+ $params->{rowcount} = $i if ($i && !$params->{type});
}
$dbh->disconnect();
for my $i (1 .. $form->{rowcount}) {
- map({ $form->{"${_}_$i"} =
- $form->parse_amount($myconfig, $form->{"${_}_$i"}) } qw(qty ship));
+ map({ $form->{"${_}_$i"} = $form->parse_amount($myconfig, $form->{"${_}_$i"}) } qw(qty ship));
if ($form->{"id_$i"}) {
my $basefactor = 1;
if (defined($all_units->{$item_unit}->{factor}) &&
(($all_units->{$item_unit}->{factor} * 1) != 0)) {
- $basefactor = $all_units->{$form->{"unit_$i"}}->{factor} /
- $all_units->{$item_unit}->{factor};
+ $basefactor = $all_units->{$form->{"unit_$i"}}->{factor} / $all_units->{$item_unit}->{factor};
}
my $baseqty = $form->{"qty_$i"} * $basefactor;
$form->{"lastcost_$i"} = $form->{"lastcost_$i"} * 1;
# set values to 0 if nothing entered
- $form->{"discount_$i"} =
- $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100;
+ $form->{"discount_$i"} = $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100;
- $form->{"sellprice_$i"} =
- $form->parse_amount($myconfig, $form->{"sellprice_$i"});
+ $form->{"sellprice_$i"} = $form->parse_amount($myconfig, $form->{"sellprice_$i"});
$fxsellprice = $form->{"sellprice_$i"};
my ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
$dec = length($dec);
my $decimalplaces = ($dec > 2) ? $dec : 2;
- $discount =
- $form->round_amount($form->{"sellprice_$i"} * $form->{"discount_$i"},
- $decimalplaces);
- $form->{"sellprice_$i"} =
- $form->round_amount($form->{"sellprice_$i"} - $discount,
- $decimalplaces);
+ $discount = $form->round_amount($form->{"sellprice_$i"} * $form->{"discount_$i"}, $decimalplaces);
+ $form->{"sellprice_$i"} = $form->round_amount($form->{"sellprice_$i"} - $discount, $decimalplaces);
$form->{"inventory_accno_$i"} *= 1;
$form->{"expense_accno_$i"} *= 1;
if ($form->round_amount($taxrate, 7) == 0) {
if ($form->{taxincluded}) {
foreach $item (@taxaccounts) {
- $taxamount =
- $form->round_amount($linetotal * $form->{"${item}_rate"} /
- (1 + abs($form->{"${item}_rate"})),
- 2);
-
+ $taxamount = $form->round_amount($linetotal * $form->{"${item}_rate"} / (1 + abs($form->{"${item}_rate"})), 2);
$taxaccounts{$item} += $taxamount;
$taxdiff += $taxamount;
-
- $taxbase{$item} += $taxbase;
+ $taxbase{$item} += $taxbase;
}
$taxaccounts{ $taxaccounts[0] } += $taxdiff;
} else {
}
} else {
foreach $item (@taxaccounts) {
- $taxaccounts{$item} +=
- $taxamount * $form->{"${item}_rate"} / $taxrate;
+ $taxaccounts{$item} += $taxamount * $form->{"${item}_rate"} / $taxrate;
$taxbase{$item} += $taxbase;
}
}
$netamount += $form->{"sellprice_$i"} * $form->{"qty_$i"} / $price_factor;
- $reqdate =
- ($form->{"reqdate_$i"}) ? $form->{"reqdate_$i"} : undef;
+ $reqdate = ($form->{"reqdate_$i"}) ? $form->{"reqdate_$i"} : undef;
# get pricegroup_id and save ist
($null, my $pricegroup_id) = split(/--/, $form->{"sellprice_pg_$i"});
}
$query .= qq|?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
(SELECT factor FROM price_factors WHERE id = ?), ?)|;
- push(@values,
+ push(@values,
conv_i($form->{id}), conv_i($form->{"id_$i"}),
$form->{"description_$i"}, $form->{"longdescription_$i"},
$form->{"qty_$i"}, $baseqty,
if ($form->{currency} eq $form->{defaultcurrency}) {
$form->{exchangerate} = 1;
} else {
- $exchangerate =
- $form->check_exchangerate($myconfig,
- $form->{currency},
- $form->{transdate},
- ($form->{vc} eq 'customer') ? 'buy' : 'sell');
+ $exchangerate = $form->check_exchangerate($myconfig, $form->{currency}, $form->{transdate}, ($form->{vc} eq 'customer') ? 'buy' : 'sell');
}
- $form->{exchangerate} =
- ($exchangerate)
- ? $exchangerate
- : $form->parse_amount($myconfig, $form->{exchangerate});
+ $form->{exchangerate} = ($exchangerate) ? $exchangerate : $form->parse_amount($myconfig, $form->{exchangerate});
my $quotation = $form->{type} =~ /_order$/ ? 'f' : 't';
if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) {
if ($form->{vc} eq 'customer') {
- $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate},
- $form->{exchangerate}, 0);
+ $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, $form->{exchangerate}, 0);
}
if ($form->{vc} eq 'vendor') {
- $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate},
- 0, $form->{exchangerate});
+ $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, 0, $form->{exchangerate});
}
}
&adj_onhand($dbh, $form, $ml * -1);
}
- my $rc = $dbh->commit;
- $dbh->disconnect;
-
$form->{saved_xyznumber} = $form->{$form->{type} =~ /_quotation$/ ?
"quonumber" : "ordnumber"};
Common::webdav_folder($form) if ($main::webdav);
+ my $rc = $dbh->commit;
+ $dbh->disconnect;
+
$main::lxdebug->leave_sub();
return $rc;
$sth->finish();
}
- $form->{"globalprojectnumber"} =
- $projectnumbers{$form->{"globalproject_id"}};
+ $form->{"globalprojectnumber"} = $projectnumbers{$form->{"globalproject_id"}};
my @arrays =
qw(runningnumber number description longdescription qty ship unit bin
if ($taxamount != 0) {
foreach my $item (split / /, $form->{"taxaccounts_$i"}) {
- $taxaccounts{$item} +=
- $taxamount * $form->{"${item}_rate"} / $taxrate;
- $taxbase{$item} += $taxbase;
+ $taxaccounts{$item} += $taxamount * $form->{"${item}_rate"} / $taxrate;
+ $taxbase{$item} += $taxbase;
}
}
# get parts and push them onto the stack
my $sortorder = "";
if ($form->{groupitems}) {
- $sortorder =
- qq|ORDER BY pg.partsgroup, a.$oid{$myconfig->{dbdriver}}|;
+ $sortorder = qq|ORDER BY pg.partsgroup, a.$oid{$myconfig->{dbdriver}}|;
} else {
$sortorder = qq|ORDER BY a.$oid{$myconfig->{dbdriver}}|;
}
while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) {
- map({ push(@{ $form->{$_} }, "") }
- grep({ $_ ne "description" } @arrays));
+ map({ push(@{ $form->{$_} }, "") } grep({ $_ ne "description" } @arrays));
$sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--";
push(@{ $form->{description} }, $sameitem);
}
- push(@{ $form->{description} },
- $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"}
- )
- . qq|, $ref->{partnumber}, $ref->{description}|);
-
- map({ push(@{ $form->{$_} }, "") }
- grep({ $_ ne "description" } @arrays));
+ push(@{ $form->{description} }, $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"}) . qq|, $ref->{partnumber}, $ref->{description}|);
+ map({ push(@{ $form->{$_} }, "") } grep({ $_ ne "description" } @arrays));
}
$sth->finish;
}
my ($item_unit) = selectrow_query($form, $dbh, $query, $ref->{parts_id});
my $basefactor = 1;
- if (defined($all_units->{$item_unit}->{factor}) &&
- (($all_units->{$item_unit}->{factor} * 1) != 0)) {
- $basefactor = $all_units->{$ref->{unit}}->{factor} /
- $all_units->{$item_unit}->{factor};
+ if (defined($all_units->{$item_unit}->{factor}) && (($all_units->{$item_unit}->{factor} * 1) != 0)) {
+ $basefactor = $all_units->{$ref->{unit}}->{factor} / $all_units->{$item_unit}->{factor};
}
my $baseqty = $ref->{ship} * $basefactor;
# adjust onhand in parts table
- $form->update_balance($dbh, "parts", "onhand",
- qq|id = $ref->{parts_id}|,
- $baseqty * $ml);
+ $form->update_balance($dbh, "parts", "onhand", qq|id = $ref->{parts_id}|, $baseqty * $ml);
}
}
use SL::LXDebug;
$lxdebug = LXDebug->new();
-use CGI;
+use CGI qw( -no_xhtml);
use SL::Form;
use SL::Locale;
$form = new Form;
$cgi = new CGI('');
+# this prevents most of the tabindexes being created by CGI.
+# note: most. popup menus and selecttables will still have tabindexes
+# use common.pl's NTI function to get rid of those
+local $CGI::TABINDEX = 0;
+
# name of this script
$0 =~ tr/\\/\//;
$pos = rindex $0, '/';
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";
|;
#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> |
- . $locale->text('On Hand') . qq|
- <input name=itemstatus class=radio type=radio value=short> |
- . $locale->text('Short') . qq|
+ $onhand = qq| <input name=itemstatus class=radio type=radio value=onhand> | . $locale->text('On Hand') . qq|
+ <input name=itemstatus class=radio type=radio value=short> | . $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> |
- . $locale->text('Serial Number') . qq|</td>
+ <td><input name=l_serialnumber class=checkbox type=checkbox value=Y> | . $locale->text('Serial Number') . qq|</td>
|;
}
# 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="5" 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" 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 "
- map { $form->{"${_}_$i"} =~ s/\"/"/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"> </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/\"/"/g;
- print qq|
- <b>Lizenz\#</b> <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> <input name="serialnumber_$i" size="15" value="$form->{"serialnumber_$i"}">|;
- }
-
- print qq|<b>$projectnumber</b> | .
- 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> <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> <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> $form->{"marge_total_$i"} $form->{"marge_percent_$i"} % ${marge_font_end}|;
- }
- print qq|
- <b>| . $locale->text('LP') . qq|</b> | . $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2) . qq|
- <b>| . $locale->text('EK') . qq|</b> | . $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();
-}
##################################################
# build html-code for pricegroups in variable $form->{prices_$j}
$lxdebug->enter_sub();
my $rowcount = shift;
for $j (1 .. $rowcount) {
- my $pricegroup_old = $form->{"pricegroup_old_$i"};
- if ($form->{PRICES}{$j}) {
- $len = 0;
- $prices = '<option value="--">' . $locale->text("none (pricegroup)") . '</option>';
- $price = 0;
- foreach $item (@{ $form->{PRICES}{$j} }) {
-
- #$price = $form->round_amount($myconfig, $item->{price}, 5);
- #$price = $form->format_amount($myconfig, $item->{price}, 2);
- $price = $item->{price};
- $pricegroup_id = $item->{pricegroup_id};
- $pricegroup = $item->{pricegroup};
-
- # build drop down list for pricegroups
- $prices .=
- qq|<option value="$price--$pricegroup_id"$item->{selected}>$pricegroup</option>\n|;
-
- $len += 1;
-
- # map {
- # $form->{"${_}_$j"} =
- # $form->format_amount(\%myconfig, $form->{"${_}_$j"})
- # } qw(sellprice price_new price_old);
-
- # set new selectedpricegroup_id and prices for "Preis"
- if ($item->{selected} && ($pricegroup_id != 0)) {
- $form->{"pricegroup_old_$j"} = $pricegroup_id;
- $form->{"price_new_$j"} = $price;
- $form->{"sellprice_$j"} = $price;
- }
- if ($pricegroup_id == 0) {
- $form->{"price_new_$j"} = $form->{"sellprice_$j"};
- }
- }
- $form->{"prices_$j"} = $prices;
+ next unless $form->{PRICES}{$j};
+ # build drop down list for pricegroups
+ my $option_tmpl = qq|<option value="%s--%s" %s>%s</option>|;
+ $form->{"prices_$j"} = join '', map { sprintf $option_tmpl, @$_{qw(price pricegroup_id selected pricegroup)} }
+ (+{ pricegroup => $locale->text("none (pricegroup)") }, @{ $form->{PRICES}{$j} });
+
+ foreach $item (@{ $form->{PRICES}{$j} }) {
+ # set new selectedpricegroup_id and prices for "Preis"
+ $form->{"pricegroup_old_$j"} = $item->{pricegroup_id} if $item->{selected} && $item->{pricegroup_id};
+ $form->{"sellprice_$j"} = $item->{price} if $item->{selected} && $item->{pricegroup_id};
+ $form->{"price_new_$j"} = $form->{"sellprice_$j"} if $item->{selected} || !$item->{pricegroup_id};
}
}
$lxdebug->leave_sub();
# change callback
$form->{old_callback} = $form->escape($form->{callback}, 1);
- $form->{callback} = $form->escape("$form->{script}?action=display_form", 1);
-
- # delete action
- delete $form->{action};
-
- # save all other form variables in a previousform variable
- foreach $key (keys %$form) {
+ $form->{callback} = $form->escape("$form->{script}?action=display_form", 1);
- # escape ampersands
- $form->{$key} =~ s/&/%26/g;
- $previousform .= qq|$key=$form->{$key}&|;
- }
- chop $previousform;
- $previousform = $form->escape($previousform, 1);
+ # save all form variables except action in a previousform variable
+ my $previousform = join '&', map { $form->{$_} =~ s/&/%26/; "$_=$form->{$_}" } grep { !/action/ } keys %$form;
- $i = $form->{rowcount};
- map { $form->{"${_}_$i"} =~ s/\"/"/g } qw(partnumber description);
+ map { $form->{"${_}_$form->{rowcount}"} =~ s/\"/"/g } qw(partnumber description);
$form->header;
- print qq|
-<body>
-
-<h4 class="error">| . $locale->text('Item not on file!') . qq|
-
-<p>
-| . $locale->text('What type of item is this?') . qq|</h4>
-
-<form method="post" action="ic.pl">
-
-<p>
-
- <input class="radio" type="radio" name="item" value="part" checked> |
- . $locale->text('Part') . qq|<br>
- <input class="radio" type="radio" name="item" value="service"> |
- . $locale->text('Service');
-
- print $cgi->hidden("-name" => "previousform", "-value" => $previousform);
- map { print $cgi->hidden("-name" => $_, "-value" => $form->{$_}); } qw(rowcount vc login password);
- map { print $cgi->hidden("-name" => $_, "-value" => $form->{"${_}_$i"}); } qw(partnumber description unit sellprice price_factor_id);
- print $cgi->hidden("-name" => "taxaccount2", "-value" => $form->{taxaccounts});
-
-print qq|
-<input type="hidden" name="nextsub" value="add">
-
-<p>
-<input class="submit" type="submit" name="action" value="|
- . $locale->text('Continue') . qq|">
-</form>
-
-</body>
-</html>
-|;
-
- $lxdebug->leave_sub();
-}
-
-sub display_form {
- $lxdebug->enter_sub();
-
- relink_accounts();
-
- my $new_rowcount = $form->{"rowcount"} * 1 + 1;
- $form->{"project_id_${new_rowcount}"} = $form->{"globalproject_id"};
-
- $form->language_payment(\%myconfig);
-
- # if we have a display_form
- if ($form->{display_form}) {
- call_sub($form->{"display_form"});
- exit;
- }
-
- Common::webdav_folder($form) if ($webdav);
-
- # if ( $form->{print_and_post}
- # && $form->{second_run}
- # && ($form->{action} eq "display_form")) {
- # for (keys %$form) { $old_form->{$_} = $form->{$_} }
- # $old_form->{rowcount}++;
- #
- # #$form->{rowcount}--;
- # #$form->{rowcount}--;
- #
- # $form->{print_and_post} = 0;
- #
- # &print_form($old_form);
- # exit;
- # }
- #
- # $form->{action} = "";
- # $form->{resubmit} = 0;
- #
- # if ($form->{print_and_post} && !$form->{second_run}) {
- # $form->{second_run} = 1;
- # $form->{action} = "display_form";
- # $form->{rowcount}--;
- # my $rowcount = $form->{rowcount};
- #
- # # get pricegroups for parts
- # IS->get_pricegroups_for_parts(\%myconfig, \%$form);
- #
- # # build up html code for prices_$i
- # set_pricegroup($rowcount);
- #
- # $form->{resubmit} = 1;
- #
- # }
- &form_header;
-
- $numrows = ++$form->{rowcount};
- $subroutine = "display_row";
-
- if ($form->{item} eq 'part') {
-
- #set preisgruppenanzahl
- $numrows = $form->{price_rows};
- $subroutine = "price_row";
-
- &{$subroutine}($numrows);
-
- $numrows = ++$form->{makemodel_rows};
- $subroutine = "makemodel_row";
- }
- if ($form->{item} eq 'assembly') {
- $numrows = $form->{price_rows};
- $subroutine = "price_row";
-
- &{$subroutine}($numrows);
-
- $numrows = ++$form->{makemodel_rows};
- $subroutine = "makemodel_row";
-
- # create makemodel rows
- &{$subroutine}($numrows);
-
- $numrows = ++$form->{assembly_rows};
- $subroutine = "assembly_row";
- }
- if ($form->{item} eq 'service') {
- $numrows = $form->{price_rows};
- $subroutine = "price_row";
-
- &{$subroutine}($numrows);
-
- $numrows = 0;
- }
-
- # create rows
- &{$subroutine}($numrows) if $numrows;
+ push @HIDDENS, { value => $cgi->hidden("-name" => "previousform", "-value" => $form->escape($previousform, 1)) };
+ push @HIDDENS, map +{ value => $cgi->hidden("-name" => $_, "-value" => $form->{$_}) }, qw(rowcount vc login password);
+ push @HIDDENS, map +{ value => $cgi->hidden("-name" => $_, "-value" => $form->{"${_}_$form->{rowcount}"}) }, qw(partnumber description unit sellprice);
+ push @HIDDENS, { value => $cgi->hidden("-name" => "taxaccount2", "-value" => $form->{taxaccounts}) };
- &form_footer;
+ print $form->parse_html_template("generic/new_item", { HIDDENS => \@HIDDENS} );
$lxdebug->leave_sub();
}
# note: "||"-selection is only correct for values where "0" is _not_ a correct entry
$form->{sendmode} = "attachment";
$form->{format} = $form->{format} || $myconfig{template_format} || "pdf";
- $form->{copies} = $form->{copies} || $myconfig{copies} || 3;
- $form->{media} = $form->{media} || $myconfig{default_media} || "screen";
+ $form->{copies} = $form->{copies} || $myconfig{copies} || 3;
+ $form->{media} = $form->{media} || $myconfig{default_media} || "screen";
$form->{printer_id} = defined $form->{printer_id} ? $form->{printer_id} :
defined $myconfig{default_printer_id} ? $myconfig{default_printer_id} : "";
push @FORMNAME, grep $_,
($form->{type} eq 'purchase_order') ? (
- opthash("purchase_order", $form->{PD}{purchase_order}, $locale->text('Purchase Order')),
- opthash("bin_list", $form->{PD}{bin_list}, $locale->text('Bin List'))
+ opthash("purchase_order", $form->{PD}{purchase_order}, $locale->text('Purchase Order')),
+ opthash("bin_list", $form->{PD}{bin_list}, $locale->text('Bin List'))
) : undef,
($form->{type} eq 'credit_note') ?
- opthash("credit_note", $form->{PD}{credit_note}, $locale->text('Credit Note')) : undef,
+ opthash("credit_note", $form->{PD}{credit_note}, $locale->text('Credit Note')) : undef,
($form->{type} eq 'sales_order') ? (
- opthash("sales_order", $form->{PD}{sales_order}, $locale->text('Confirmation')),
- opthash("proforma", $form->{PD}{proforma}, $locale->text('Proforma Invoice')),
- opthash("pick_list", $form->{PD}{pick_list}, $locale->text('Pick List')),
- opthash("packing_list", $form->{PD}{packing_list}, $locale->text('Packing List'))
+ opthash("sales_order", $form->{PD}{sales_order}, $locale->text('Confirmation')),
+ opthash("proforma", $form->{PD}{proforma}, $locale->text('Proforma Invoice')),
+ opthash("pick_list", $form->{PD}{pick_list}, $locale->text('Pick List')),
+ opthash("packing_list", $form->{PD}{packing_list}, $locale->text('Packing List'))
) : undef,
($form->{type} =~ /_quotation$/) ?
- opthash("$`_quotation", $form->{PD}{"$`_quotation"}, $locale->text('Quotation')) : undef,
+ opthash("$`_quotation", $form->{PD}{"$`_quotation"}, $locale->text('Quotation')) : undef,
($form->{type} eq 'invoice') ? (
- opthash("invoice", $form->{PD}{invoice}, $locale->text('Invoice')),
- opthash("proforma", $form->{PD}{proforma}, $locale->text('Proforma Invoice')),
- opthash("packing_list", $form->{PD}{packing_list}, $locale->text('Packing List'))
+ opthash("invoice", $form->{PD}{invoice}, $locale->text('Invoice')),
+ opthash("proforma", $form->{PD}{proforma}, $locale->text('Proforma Invoice')),
+ opthash("packing_list", $form->{PD}{packing_list}, $locale->text('Packing List'))
) : undef,
($form->{type} eq 'invoice' && $form->{storno}) ? (
- opthash("storno_invoice", $form->{PD}{storno_invoice}, $locale->text('Storno Invoice')),
+ opthash("storno_invoice", $form->{PD}{storno_invoice}, $locale->text('Storno Invoice')),
opthash("storno_packing_list", $form->{PD}{storno_packing_list}, $locale->text('Storno Packing List'))
) : undef,
($form->{type} eq 'credit_note') ?
- opthash("credit_note", $form->{PD}{credit_note}, $locale->text('Credit Note')) : undef;
+ opthash("credit_note", $form->{PD}{credit_note}, $locale->text('Credit Note')) : undef;
push @SENDMODE,
- opthash("attachment", $form->{SM}{attachment}, $locale->text('Attachment')),
- opthash("inline", $form->{SM}{inline}, $locale->text('In-line'))
+ opthash("attachment", $form->{SM}{attachment}, $locale->text('Attachment')),
+ opthash("inline", $form->{SM}{inline}, $locale->text('In-line'))
if ($form->{media} eq 'email');
push @MEDIA, grep $_,
- opthash("screen", $form->{OP}{screen}, $locale->text('Screen')),
+ opthash("screen", $form->{OP}{screen}, $locale->text('Screen')),
(scalar @{ $form->{printers} } && $latex_templates) ?
- opthash("printer", $form->{OP}{printer}, $locale->text('Printer')) : undef,
- ($latex_templates && !$options{no_queue}) ?
- opthash("queue", $form->{OP}{queue}, $locale->text('Queue')) : undef
+ opthash("printer", $form->{OP}{printer}, $locale->text('Printer')) : undef,
+ ($latex_templates && !$options->{no_queue}) ?
+ opthash("queue", $form->{OP}{queue}, $locale->text('Queue')) : undef
if ($form->{media} ne 'email');
push @FORMAT, grep $_,
($opendocument_templates && $openofficeorg_writer_bin && $xvfb_bin && (-x $openofficeorg_writer_bin) && (-x $xvfb_bin)
- && !$options{no_opendocument_pdf}) ?
- opthash("opendocument_pdf", $form->{DF}{"opendocument_pdf"}, $locale->text("PDF (OpenDocument/OASIS)")) : undef,
+ && !$options->{no_opendocument_pdf}) ?
+ opthash("opendocument_pdf", $form->{DF}{"opendocument_pdf"}, $locale->text("PDF (OpenDocument/OASIS)")) : undef,
($latex_templates) ?
- opthash("pdf", $form->{DF}{pdf}, $locale->text('PDF')) : undef,
- ($latex_templates && !$options{no_postscript}) ?
- opthash("postscript", $form->{DF}{postscript}, $locale->text('Postscript')) : undef,
- (!$options{no_html}) ?
+ opthash("pdf", $form->{DF}{pdf}, $locale->text('PDF')) : undef,
+ ($latex_templates && !$options->{no_postscript}) ?
+ opthash("postscript", $form->{DF}{postscript}, $locale->text('Postscript')) : undef,
+ (!$options->{no_html}) ?
opthash("html", $form->{DF}{html}, "HTML") : undef,
- ($opendocument_templates && !$options{no_opendocument}) ?
- opthash("opendocument", $form->{DF}{opendocument}, $locale->text("OpenDocument/OASIS")) : undef;
+ ($opendocument_templates && !$options->{no_opendocument}) ?
+ opthash("opendocument", $form->{DF}{opendocument}, $locale->text("OpenDocument/OASIS")) : undef;
push @LANGUAGE_ID,
map { opthash($_->{id}, ($_->{id} eq $form->{language_id} ? 'selected' : ''), $_->{description}) } +{}, @{ $form->{languages} }
use List::Util qw(max);
require "bin/mozilla/io.pl";
+require "bin/mozilla/invoice_io.pl";
require "bin/mozilla/arap.pl";
require "bin/mozilla/common.pl";
require "bin/mozilla/drafts.pl";
use List::Util qw(max);
require "bin/mozilla/io.pl";
+require "bin/mozilla/invoice_io.pl";
require "bin/mozilla/arap.pl";
require "bin/mozilla/drafts.pl";
-# #=====================================================================
+#=====================================================================
# LX-Office ERP
# Copyright (C) 2004
# Based on SQL-Ledger Version 2.1.9
use SL::IS;
use SL::PE;
use SL::ReportGenerator;
-use List::Util qw(max);
+use List::Util qw(max reduce);
require "bin/mozilla/io.pl";
require "bin/mozilla/arap.pl";
sub order_links {
$lxdebug->enter_sub();
# get customer/vendor
- $form->all_vc(\%myconfig, $form->{vc},
- ($form->{vc} eq 'customer') ? "AR" : "AP");
+ $form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
# retrieve order/quotation
$form->{webdav} = $webdav;
}
$form->{intnotes} = $intnotes if $intnotes;
($form->{ $form->{vc} }) = split /--/, $form->{ $form->{vc} };
- $form->{"old$form->{vc}"} =
- qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
+ $form->{"old$form->{vc}"} = qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
# build the popup menus
if (@{ $form->{"all_$form->{vc}"} }) {
$form->{department} = "$form->{department}--$form->{department_id}";
map {
- $form->{selectdepartment} .=
- "<option>$_->{description}--$_->{id}</option>\n"
- } (@{ $form->{all_departments} });
+ $form->{selectdepartment} .= "<option>$_->{description}--$_->{id}</option>\n"
+ } @{ $form->{all_departments} };
}
$form->{employee} = "$form->{employee}--$form->{employee_id}";
my $i = 0;
foreach $ref (@{ $form->{form_details} }) {
$form->{rowcount} = ++$i;
-
map { $form->{"${_}_$i"} = $ref->{$_} } keys %{$ref};
}
for my $i (1 .. $form->{rowcount}) {
- if ($form->{id}) {
- $form->{"discount_$i"} =
- $form->format_amount(\%myconfig, $form->{"discount_$i"} * 100);
- } else {
- $form->{"discount_$i"} =
- $form->format_amount(\%myconfig, $form->{"discount_$i"});
- }
- ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
- $dec = length $dec;
- $decimalplaces = ($dec > 2) ? $dec : 2;
-
- # copy reqdate from deliverydate for invoice -> order conversion
- $form->{"reqdate_$i"} = $form->{"deliverydate_$i"}
- unless $form->{"reqdate_$i"};
-
- $form->{"sellprice_$i"} =
- $form->format_amount(\%myconfig, $form->{"sellprice_$i"},
- $decimalplaces);
-
- (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/);
- $dec_qty = length $dec_qty;
- $form->{"qty_$i"} =
- $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty);
-
- map { $form->{"${_}_$i"} =~ s/\"/"/g }
- qw(partnumber description unit);
+ $form->{"reqdate_$i"} = $form->{"deliverydate_$i"} unless $form->{"reqdate_$i"};
+ $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{"discount_$i"} * ($form->{id} ? 100 : 1));
+ $form->{"sellprice_$i"} = $form->format_amount(\%myconfig, $form->{"sellprice_$i"});
+ $form->{"qty_$i"} = $form->format_amount(\%myconfig, $form->{"qty_$i"});
+ map { $form->{"${_}_$i"} =~ s/\"/"/g } qw(partnumber description unit);
}
$lxdebug->leave_sub();
sub form_header {
$lxdebug->enter_sub();
-
- my $checkedclosed = $form->{"closed"} ? "checked" : "";
- my $checkeddelivered = $form->{"delivered"} ? "checked" : "";
+ my @custom_hiddens;
+ %TMPL_VAR = ();
$form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id};
$form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id};
qw(ordnumber quonumber shippingpoint shipvia notes intnotes shiptoname
shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact
shiptophone shiptofax shiptodepartment_1 shiptodepartment_2);
-
+
# use JavaScript Calendar or not
$form->{jsscript} = 1;
- $jsscript = "";
-
- $button1 = qq|
+ $TMPL_VAR{button1} = qq|
<td><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value="$form->{transdate}" onBlur=\"check_right_date_format(this)\">
- <input type=button name=transdate id="trigger1" value=|
- . $locale->text('button') . qq|></td>
+ <input type=button name=transdate id="trigger1" value=| . $locale->text('button') . qq|></td>
|;
- $button2 = qq|
+ $TMPL_VAR{button2} = qq|
<td width="13"><input name=reqdate id=reqdate size=11 title="$myconfig{dateformat}" value="$form->{reqdate}" onBlur=\"check_right_date_format(this)\">
- <input type=button name=reqdate name=reqdate id="trigger2" value=|
- . $locale->text('button') . qq|></td>
+ <input type=button name=reqdate name=reqdate id="trigger2" value=| . $locale->text('button') . qq|></td>
|;
-
#write Trigger
- $jsscript = Form->write_trigger(\%myconfig, "2", "transdate", "BL", "trigger1", "reqdate", "BL", "trigger2");
+ $TMPL_VAR{jsscript} = Form->write_trigger(\%myconfig, "2", "transdate", "BL", "trigger1", "reqdate", "BL", "trigger2");
+ # openclosed checkboxes
my @tmp;
-
- if (($form->{"type"} eq "sales_order") ||
- ($form->{"type"} eq "purchase_order")) {
- push(@tmp, qq|<input name="delivered" id="delivered" type="checkbox" class="checkbox" value="1" $checkeddelivered>
- <label for="delivered">| . $locale->text('Delivered') . qq|</label>|);
- }
-
- if ($form->{id}) {
- push(@tmp, qq|<input name="closed" id="closed" type="checkbox" class="checkbox" value="1" $checkedclosed>
- <label for="closed">| . $locale->text('Closed') . qq|</label>|);
- }
-
- if (@tmp) {
- $openclosed .= qq|<tr>
- <td colspan=| . (2 * scalar(@tmp)) . qq| align=center>| . join("\n", @tmp) . qq|
- </td>
- </tr>\n|;
- }
+ push @tmp, sprintf qq|<input name="delivered" id="delivered" type="checkbox" class="checkbox" value="1" %s><label for="delivered">%s</label>|,
+ $form->{"delivered"} ? "checked" : "", $locale->text('Delivered') if $form->{"type"} =~ /_order$/;
+ push @tmp, sprintf qq|<input name="closed" id="closed" type="checkbox" class="checkbox" value="1" %s><label for="closed">%s</label>|,
+ $form->{"closed"} ? "checked" : "", $locale->text('Closed') if $form->{id};
+ $TMPL_VAR{openclosed} = sprintf qq|<tr><td colspan=%d align=center>%s</td></tr>\n|, 2 * scalar @tmp, join "\n", @tmp if @tmp;
# set option selected
- foreach $item ($form->{vc}, currency, department, ($form->{vc} eq "customer" ? customer : vendor)) {
+ foreach $item ($form->{vc}, 'currency', 'department', ($form->{vc} eq "customer" ? 'customer' : 'vendor')) {
$form->{"select$item"} =~ s/ selected//;
$form->{"select$item"} =~ s/option>\Q$form->{$item}\E/option selected>$form->{$item}/;
}
#substitute \n and \r to \s (bug 543)
$form->{"select$form->{vc}"} =~ s/[\n\r]/ /g;
- my @old_project_ids = ($form->{"globalproject_id"});
- map({ push(@old_project_ids, $form->{"project_id_$_"})
- if ($form->{"project_id_$_"}); } (1..$form->{"rowcount"}));
+ my @old_project_ids = ($form->{"globalproject_id"}, grep { $_ } map { $form->{"project_id_$_"} } 1..$form->{"rowcount"});
my $vc = $form->{vc} eq "customer" ? "customers" : "vendors";
- $form->get_lists("contacts" => "ALL_CONTACTS",
- "shipto" => "ALL_SHIPTO",
- "projects" => {
- "key" => "ALL_PROJECTS",
- "all" => 0,
- "old_id" => \@old_project_ids
- },
+ $form->get_lists("contacts" => "ALL_CONTACTS",
+ "shipto" => "ALL_SHIPTO",
+ "projects" => { "key" => "ALL_PROJECTS",
+ "all" => 0,
+ "old_id" => \@old_project_ids },
"employees" => "ALL_EMPLOYEES",
"salesmen" => "ALL_SALESMEN",
"taxzones" => "ALL_TAXZONES",
"payments" => "ALL_PAYMENTS",
"currencies" => "ALL_CURRENCIES",
- $vc => "ALL_" . uc($vc),
+ $vc => { key => "ALL_" . uc($vc),
+ limit => $myconfig{vclimit} + 1 },
"price_factors" => "ALL_PRICE_FACTORS");
- my %labels;
- my @values = (undef);
- foreach my $item (@{ $form->{"ALL_CONTACTS"} }) {
- push(@values, $item->{"cp_id"});
- $labels{$item->{"cp_id"}} = $item->{"cp_name"} . ($item->{"cp_abteilung"} ? " ($item->{cp_abteilung})" : "");
- }
-
- my $contact;
- if (scalar @values > 1) {
- $contact = qq|
- <tr>
- <th align="right">| . $locale->text('Contact Person') . qq|</th>
- <td>| .
- NTI($cgi->popup_menu('-name' => 'cp_id', '-values' => \@values, '-style' => 'width: 250px',
- '-labels' => \%labels, '-default' => $form->{"cp_id"}))
- . qq|
- </td>
- </tr>|;
- }
-
- %labels = ();
- @values = ();
-
- foreach my $item (@{ $form->{($form->{vc} eq "customer" ? "ALL_CUSTOMERS" : "ALL_VENDORS")}}) {
- push(@values, $item->{"name"}.qq|--|.$item->{"id"});
- $labels{$item->{"name"}.qq|--|.$item->{"id"}} = $item->{name};
- }
-
- $vc = qq|
- <input type="hidden" name="$form->{vc}_id" value="| . H($form->{"$form->{vc}_id"}) . qq|">
- <input type="hidden" name="old$form->{vc}" value="| . H($form->{"old$form->{vc}"}) . qq|">
- <th align="right">| . $locale->text(ucfirst($form->{vc})) . qq|</th>
- <td>| .
- (($myconfig{vclimit} <= scalar(@values))
- ? qq|<input type="text" value="| . H(($form->{"old$form->{vc}"} =~ /^(.*)\-\-.*$/)) . qq|" name="$form->{vc}">|
- : (NTI($cgi->popup_menu('-name' => "$form->{vc}", '-default' => $form->{"old$form->{vc}"},
- '-onChange' => 'document.getElementById(\'update_button\').click();',
- '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px')))) . qq|
- <input type="button" value="?" onclick="show_vc_details('$form->{vc}')">
- </td><input type=hidden name="select$form->{vc}" value="| .
- Q($form->{"select$form->{vc}"}) . qq|">|;
-
- if ($form->{vc} eq 'customer') {
- $vc .= qq|<input type="hidden" name="customer_klass" value="$form->{customer_klass}">|;
- }
-
- %labels = ();
- @values = ("");
- foreach my $item (@{ $form->{"ALL_PAYMENTS"} }) {
- push(@values, $item->{"id"});
- $labels{$item->{"id"}} = $item->{"description"};
- }
-
- $payments = qq|
- <th align="right">| . $locale->text('Payment Terms') . qq|</th>
- <td>| .
- NTI($cgi->popup_menu('-name' => 'payment_id', '-values' => \@values, '-style' => 'width: 250px',
- '-labels' => \%labels, '-default' => $form->{payment_id}))
- . qq|</td>|;
-
- %labels = ();
- @values = ("");
- foreach my $item (@{ $form->{"ALL_SHIPTO"} }) {
- push(@values, $item->{"shipto_id"});
- $labels{$item->{"shipto_id"}} = join "; ", grep { $_ } map { $item->{"shipto${_}" } } qw(name department_1 street city);
- }
-
- my $shipto;
- if (scalar @values > 1) {
- $shipto = qq|
- <tr>
- <th align="right">| . $locale->text('Shipping Address') . qq|</th>
- <td>| .
- NTI($cgi->popup_menu('-name' => 'shipto_id', '-values' => \@values, '-style' => 'width: 250px',
- '-labels' => \%labels, '-default' => $form->{"shipto_id"}))
- . qq|</td>|;
- }
-
- %labels = ();
- @values = ("");
- foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
- push(@values, $item->{"id"});
- $labels{$item->{"id"}} = $item->{"projectnumber"};
- }
- my $globalprojectnumber = NTI($cgi->popup_menu('-name' => 'globalproject_id', '-values' => \@values,
- '-labels' => \%labels,
- '-default' => $form->{"globalproject_id"}));
+ # contacts
+ @values = ("", map { $_->{cp_id} } @{ $form->{ALL_CONTACTS} });
+ %labels = map { $_->{cp_id} => $_->{"cp_name"} . ($_->{cp_abteilung} ? " ($_->{cp_abteilung})" : "") } @{ $form->{ALL_CONTACTS} };
+ $TMPL_VAR{contact} = NTI($cgi->popup_menu('-name' => 'cp_id', '-values' => \@values, '-style' => 'width: 250px',
+ '-labels' => \%labels, '-default' => $form->{"cp_id"})) if scalar @values > 1;
+
+ # vendor/customer
+ @values = map { "$_->{name}--$_->{id}" } @{ $form->{uc "all_$form->{vc}s" } };
+ %labels = map { +"$_->{name}--$_->{id}" => $_->{name} } @{ $form->{uc "all_$form->{vc}s" } };
+ push @custom_hiddens, "$form->{vc}_id";
+ push @custom_hiddens, "old$form->{vc}";
+ push @custom_hiddens, "select$form->{vc}";
+ $TMPL_VAR{vc} = sprintf qq|<th align="right">%s</th><td>%s<input type="button" value="?" onclick="show_vc_details('$form->{vc}')"></td>|,
+ $locale->text(ucfirst $form->{vc}),
+ ($myconfig{vclimit} <= scalar(@values))
+ ? $cgi->textfield(-value => H($form->{"old$form->{vc}"} =~ /^(.*)\-\-.*$/), -name => $form->{vc})
+ : NTI($cgi->popup_menu('-name' => "$form->{vc}", '-default' => $form->{"old$form->{vc}"},
+ '-onChange' => 'document.getElementById(\'update_button\').click();',
+ '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px'));
+
+ # payments (for footer)
+ @values = ("", map { $_->{id} } @{ $form->{ALL_PAYMENTS} });
+ %labels = map { $_->{id} => $_->{description} } @{ $form->{ALL_PAYMENTS} };
+ $TMPL_VAR{payments} = NTI($cgi->popup_menu('-name' => 'payment_id', '-values' => \@values, '-style' => 'width: 250px',
+ '-labels' => \%labels, '-default' => $form->{payment_id}));
+
+ # shipto
+ @values = ("", map { $_->{shipto_id} } @{ $form->{ALL_SHIPTO} });
+ %labels = map { my $item=$_; $_->{shipto_id} => join "; ", grep { $_ } map { $item->{"shipto${_}" } } qw(name department_1 street city) } @{ $form->{ALL_SHIPTO} };
+ $TMPL_VAR{shipto} = NTI($cgi->popup_menu('-name' => 'shipto_id', '-values' => \@values, '-style' => 'width: 250px',
+ '-labels' => \%labels, '-default' => $form->{"shipto_id"})) if scalar @values > 1;
+
+ # projects
+ @values = ("", map { $_->{id} } @{ $form->{ALL_PROJECTS} });
+ %labels = map { $_->{id} => $_->{projectnumber} } @{ $form->{ALL_PROJECTS} };
+ $TMPL_VAR{globalprojectnumber} = NTI($cgi->popup_menu('-name' => 'globalproject_id', '-values' => \@values,
+ '-labels' => \%labels, '-default' => $form->{"globalproject_id"}));
- my $salesmen = "";
- %labels = ();
- @values = ();
- if ($form->{type} =~ /^sales_/) {
- foreach my $item (@{ $form->{"ALL_SALESMEN"} }) {
- push(@values, $item->{"id"});
- $labels{$item->{"id"}} = ($item->{"name"} ne "" ? $item->{"name"} : $item->{"login"});
- }
- $salesmen =
- qq|<tr>
- <th align="right">| . $locale->text('Salesman') . qq|</th>
- <td>| .
- NTI($cgi->popup_menu('-name' => 'salesman_id', '-default' => $form->{"salesman_id"} ? $form->{"salesman_id"} : $form->{"employee_id"},
- '-values' => \@values, '-labels' => \%labels))
- . qq|</td>
- </tr>|;
- }
-
- %labels = ();
- @values = ();
- foreach my $item (@{ $form->{"ALL_EMPLOYEES"} }) {
- push(@values, $item->{"id"});
- $labels{$item->{"id"}} = $item->{"name"} ne "" ? $item->{"name"} : $item->{"login"};
- }
-
- my $employee = qq|
- <tr>
- <th align="right">| . $locale->text('Employee') . qq|</th>
- <td>| .
- NTI($cgi->popup_menu('-name' => 'employee_id', '-default' => $form->{"employee_id"},
- '-values' => \@values, '-labels' => \%labels)) . qq|
- </td>
- </tr>|;
-
- %labels = ();
- @values = ();
- foreach my $item (@{ $form->{"ALL_TAXZONES"} }) {
- push(@values, $item->{"id"});
- $labels{$item->{"id"}} = $item->{"description"};
- }
-
- $taxzone = qq|
- <tr>
- <th align="right">| . $locale->text('Steuersatz') . qq|</th>
- <td>| .
- NTI($cgi->popup_menu('-name' => 'taxzone_id', '-default' => $form->{"taxzone_id"},
- '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px')) . qq|
- </td>
- </tr>|;
-
- %labels = ();
- @values = ();
- my $i = 0;
- foreach my $item (@{ $form->{"ALL_CURRENCIES"} }) {
- push(@values, $item);
- $labels{$item} = $item;
- }
-
- $form->{currency} = $form->{defaultcurrency} unless $form->{currency};
- my $currencies;
- if (scalar @values) {
- $currencies = qq|
- <tr>
- <th align="right">| . $locale->text('Currency') . qq|</th>
- <td>| .
- NTI($cgi->popup_menu('-name' => 'currency', '-default' => $form->{"currency"},
- '-values' => \@values, '-labels' => \%labels)) . qq|
- </td>
- </tr>|;
- }
-
- $form->{exchangerate} = $form->format_amount(\%myconfig, $form->{exchangerate});
- $form->{exchangerate} = "" unless $form->{exchangerate};
-
+ # salesmen
+ @values = map { $_->{id} } @{ $form->{ALL_SALESMEN} };
+ %labels = map { $_->{id} => ($_->{name} || $_->{login}) } @{ $form->{ALL_SALESMEN} };
+ $TMPL_VAR{salesmen} = NTI($cgi->popup_menu('-name' => 'salesman_id', '-default' => $form->{"salesman_id"} ? $form->{"salesman_id"} : $form->{"employee_id"},
+ '-values' => \@values, '-labels' => \%labels)) if $form->{type} =~ /^sales_/ && scalar @values;
+
+ # employees
+ @values = map { $_->{id} } @{ $form->{ALL_EMPLOYEES} };
+ %labels = map { $_->{id} => $_->{name} || $_->{login} } @{ $form->{ALL_EMPLOYEES} };
+ $TMPL_VAR{employee} = NTI($cgi->popup_menu('-name' => 'employee_id', '-default' => $form->{"employee_id"},
+ '-values' => \@values, '-labels' => \%labels));
+
+ # taxzone
+ @values = map { $_->{id} } @{ $form->{ALL_TAXZONES} };
+ %labels = map { $_->{id} => $_->{description} } @{ $form->{ALL_TAXZONES} };
+ $TMPL_VAR{taxzone} = NTI($cgi->popup_menu('-name' => 'taxzone_id', '-default' => $form->{"taxzone_id"},
+ '-values' => \@values, '-labels' => \%labels, '-style' => 'width: 250px'));
+
+ # currencies and exchangerate
+ @values = map { $_ } @{ $form->{ALL_CURRENCIES} };
+ %labels = map { $_ => $_ } @{ $form->{ALL_CURRENCIES} };
+ $form->{currency} = $form->{defaultcurrency} unless $form->{currency};
+ $TMPL_VAR{show_exchangerate} = $form->{currency} ne $form->{defaultcurrency} && $form->{exchangerate};
+ $TMPL_VAR{currencies} = NTI($cgi->popup_menu('-name' => 'currency', '-default' => $form->{"currency"},
+ '-values' => \@values, '-labels' => \%labels)) if scalar @values;
+ push @custom_hiddens, "forex";
+ push @custom_hiddens, "exchangerate" if $form->{forex};
+
+ # credit remaining
$creditwarning = (($form->{creditlimit} != 0) && ($form->{creditremaining} < 0) && !$form->{update}) ? 1 : 0;
+ $TMPL_VAR{is_credit_remaining_negativ} = ($form->{creditremaining} =~ /-/) ? "0" : "1";
+
+ # business
+ $TMPL_VAR{business_label} = ($form->{vc} eq "customer" ? $locale->text('Customer type') : $locale->text('Vendor type'));
- $form->{creditlimit} = $form->format_amount(\%myconfig, $form->{creditlimit}, 0, "0");
- $form->{creditremaining} = $form->format_amount(\%myconfig, $form->{creditremaining}, 0, "0");
-
- $exchangerate = qq|\n<input type=hidden name=forex value=$form->{forex}>\n|;
-
- if ($form->{currency} ne $form->{defaultcurrency}) {
- if ($form->{forex}) {
- $exchangerate .=
- qq|<th align=right>| . $locale->text('Exchangerate')
- . qq|</th><td>$form->{exchangerate}</td>
- <input type=hidden name=exchangerate value=$form->{exchangerate}>
-|;
- } else {
- $exchangerate .=
- qq|<th align=right>| . $locale->text('Exchangerate')
- . qq|</th><td><input name=exchangerate size=10 value=$form->{exchangerate}></td>|;
- }
- }
-
- if ($form->{business}) {
- $business = qq|
- <tr>
- <th align="right">| . ($form->{vc} eq "customer" ? $locale->text('Customer type') : $locale->text('Vendor type')) . qq|</th>
- <td>$form->{business}; | . $locale->text('Trade Discount') . qq| |
- . $form->format_amount(\%myconfig, $form->{tradediscount} * 100)
- . qq| %</td>
- </tr>
-|;
- }
-
- if ($form->{max_dunning_level}) {
- $dunning = qq|
- <tr>
- <th align="right">| . $locale->text('Max. Dunning Level') . qq|:</th>
- <td>
- <b>$form->{max_dunning_level}</b>;
- | . $locale->text('Dunning Amount') . qq|: <b>|
- . $form->format_amount(\%myconfig, $form->{dunning_amount},2)
- . qq|</b>
- </td>
- </tr>
-|;
- }
-
- if ($form->{type} !~ /_quotation$/) {
- $ordnumber = qq|
- <tr>
- <th width=70% align=right nowrap>| . $locale->text('Order Number') . qq|</th>
- <td><input name=ordnumber size=11 value="$form->{ordnumber}"></td>
- </tr>
- <tr>
- <th width=70% align=right nowrap>|
- . $locale->text('Quotation Number') . qq|</th>
- <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
- </tr>
- <tr>
- <th width=70% align=right nowrap>|
- . $locale->text('Customer Order Number') . qq|</th>
- <td><input name=cusordnumber size=11 value="$form->{cusordnumber}"></td>
- </tr>
- <tr>
- <th align=right nowrap>| . $locale->text('Order Date') . qq|</th>
- $button1
-
- </tr>
- <tr>
- <th align=right nowrap=true>| . $locale->text('Required by') . qq|</th>
- $button2
- </tr>
-|;
-
- $n = ($form->{creditremaining} =~ /-/) ? "0" : "1";
-
- $creditremaining = qq|
- $shipto
- <tr>
- <td align="right">| . $locale->text('Credit Limit') . qq|</td>
- <td>$form->{creditlimit}; | . $locale->text('Remaining') . qq| <span class="plus$n">$form->{creditremaining}</span></td>
- </tr>
- </tr>
-|;
- } else {
- $reqlabel = ($form->{type} eq 'sales_quotation') ? $locale->text('Valid until') : $locale->text('Required by');
- if ($form->{type} eq 'sales_quotation') {
- $ordnumber = qq|
- <tr>
- <th width=70% align=right nowrap>|
- . $locale->text('Quotation Number') . qq|</th>
- <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
- <input type=hidden name=ordnumber value="$form->{ordnumber}">
- </tr>
-|;
- } else {
- $ordnumber = qq|
- <tr>
- <th width=70% align=right nowrap>| . $locale->text('RFQ Number') . qq|</th>
- <td><input name=quonumber size=11 value="$form->{quonumber}"></td>
- <input type=hidden name=ordnumber value="$form->{ordnumber}">
- </tr>
-|;
-
- }
-
- $ordnumber .= qq| <tr> <th align=right nowrap>| . $locale->text('Quotation Date') . qq|</th> $button1 </tr>
- <tr> <th align=right nowrap=true>$reqlabel</th> $button2 </tr>\n|;
- $creditremaining = qq| <tr> <td colspan=4></td> $shipto </tr>|;
- }
-
- $department = qq|
- <tr>
- <th align="right" nowrap>| . $locale->text('Department') . qq|</th>
- <td colspan=3><select name=department style="width: 250px">$form->{selectdepartment}</select>
- <input type=hidden name=selectdepartment value="$form->{selectdepartment}">
- </td>
- </tr> | if $form->{selectdepartment};
+ push @custom_hiddens, "ordnumber" if $form->{type} =~ /_quotation$/;
+ push @custom_hiddens, "customer_klass" if $form->{vc} eq 'customer';
$credittext = $locale->text('Credit Limit exceeded!!!');
$onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
$onload .= qq|;setupPoints('|. $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
+ $TMPL_VAR{onload} = $onload;
$form->{javascript} .= qq|<script type="text/javascript" src="js/show_form_details.js"></script>|;
$form->{javascript} .= qq|<script type="text/javascript" src="js/show_history.js"></script>|;
$form->header;
- print qq|
-<body onLoad="$onload">
-
-<form method=post name=oe action=$form->{script}>
-
- <script type="text/javascript" src="js/common.js"></script>
- <script type="text/javascript" src="js/delivery_customer_selection.js"></script>
- <script type="text/javascript" src="js/vendor_selection.js"></script>
- <script type="text/javascript" src="js/calculate_qty.js"></script>
-|;
-
- $form->hide_form(qw(id action type vc formname media format proforma queued printed emailed
- title discount creditlimit creditremaining tradediscount business
- max_dunning_level dunning_amount shiptoname shiptostreet shiptozipcode
- shiptocity shiptocountry shiptocontact shiptophone shiptofax
- shiptodepartment_1 shiptodepartment_2 shiptoemail
- message email subject cc bcc taxpart taxservice taxaccounts),
- map { $_.'_rate', $_.'_description' } split / /, $form->{taxaccounts} );
- print qq|
-
-<table width=100%>
- <tr class=listtop>
- <th class=listtop>$form->{title}</th>
- </tr>
- <tr height="5"></tr>
- <tr>
- <td>
- <table width="100%">
- <tr valign=top>
- <td>
- <table width=100%>
- <tr>
- $vc
- $contact
- $creditremaining
- $business
- $dunning
- $taxzone
- $department
- <tr>
- $currencies
- $exchangerate
- </tr>
- <tr>
- <th align=right>| . $locale->text('Shipping Point') . qq|</th>
- <td colspan=3><input name=shippingpoint size=35 value="$form->{shippingpoint}"></td>
- </tr>
- <tr>
- <th align=right>| . $locale->text('Ship via') . qq|</th>
- <td colspan=3><input name=shipvia size=35 value="$form->{shipvia}"></td>
- </tr>
- <tr>
- <th align="right">| . $locale->text('Transaction description') . qq|</th>
- <td colspan="3"><input name="transaction_description" size="35" value="| . H($form->{transaction_description}) . qq|"></td>
- </tr>|;
-# <tr>
-# <td colspan=4>
-# <table>
-# <tr>
-# <td colspan=2>
-# <button type="button" onclick="delivery_customer_selection_window('delivery_customer_string','delivery_customer_id')">| . $locale->text('Choose Customer') . qq|</button>
-# </td>
-# <td colspan=2><input type=hidden name=delivery_customer_id value="$form->{delivery_customer_id}">
-# <input size=45 id=delivery_customer_string name=delivery_customer_string value="$form->{delivery_customer_string}"></td>
-# </tr>
-# <tr>
-# <td colspan=2>
-# <button type="button" onclick="vendor_selection_window('delivery_vendor_string','delivery_vendor_id')">| . $locale->text('Choose Vendor') . qq|</button>
-# </td>
-# <td colspan=2><input type=hidden name=delivery_vendor_id value="$form->{delivery_vendor_id}">
-# <input size=45 id=vendor_string name=delivery_vendor_string value="$form->{delivery_vendor_string}"></td>
-# </tr>
-# </table>
-# </td>
-# </tr>
-print qq| </table>
- </td>
- <td align=right>
- <table>
- $openclosed
- $employee
- $salesmen
- $ordnumber
- <tr>
- <th width="70%" align="right" nowrap>| . $locale->text('Project Number') . qq|</th>
- <td>$globalprojectnumber</td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-
-$jsscript
+ $TMPL_VAR{HIDDENS} = [ map { name => $_, value => $form->{$_} },
+ qw(id action type vc formname media format proforma queued printed emailed
+ title creditlimit creditremaining tradediscount business
+ max_dunning_level dunning_amount shiptoname shiptostreet shiptozipcode
+ shiptocity shiptocountry shiptocontact shiptophone shiptofax
+ shiptodepartment_1 shiptodepartment_2 shiptoemail
+ message email subject cc bcc taxpart taxservice taxaccounts),
+ @custom_hiddens,
+ map { $_.'_rate', $_.'_description' } split / /, $form->{taxaccounts} ]; # deleted: discount
+
+ %TMPL_VAR = (
+ %TMPL_VAR,
+ is_sales => scalar ($form->{type} =~ /^sales_/), # these vars are exported, so that the template
+ is_order => scalar ($form->{type} =~ /_order$/), # may determine what to show
+ is_sales_quo => scalar ($form->{type} =~ /sales_quotation$/),
+ is_req_quo => scalar ($form->{type} =~ /request_quotation$/),
+ is_sales_ord => scalar ($form->{type} =~ /sales_order$/),
+ is_pur_ord => scalar ($form->{type} =~ /purchase_order$/),
+ );
-|;
+ print $form->parse_html_template2("oe/orders_header", { %TMPL_VAR });
$lxdebug->leave_sub();
}
$form->{invtotal} = $form->{invsubtotal};
- if (($rows = $form->numtextrows($form->{notes}, 25, 8)) < 2) {
- $rows = 2;
- }
- if (($introws = $form->numtextrows($form->{intnotes}, 35, 8)) < 2) {
- $introws = 2;
- }
- $rows = ($rows > $introws) ? $rows : $introws;
- $notes =
- qq|<textarea name=notes rows=$rows cols=25 wrap=soft>$form->{notes}</textarea>|;
- $intnotes =
- qq|<textarea name=intnotes rows=$rows cols=35 wrap=soft>$form->{intnotes}</textarea>|;
-
- $form->{taxincluded} = ($form->{taxincluded}) ? "checked" : "";
+ $rows = max 2, $form->numtextrows($form->{notes}, 25, 8);
+ $introws = max 2, $form->numtextrows($form->{intnotes}, 35, 8);
+ $rows = max $rows, $introws;
- $taxincluded = "";
- if ($form->{taxaccounts}) {
- $taxincluded = qq|
- <input name=taxincluded class=checkbox type=checkbox value=1 $form->{taxincluded}> <b>|
- . $locale->text('Tax Included') . qq|</b><br><br>
-|;
- }
+ $TMPL_VAR{notes} = qq|<textarea name=notes rows=$rows cols=25 wrap=soft>$form->{notes}</textarea>|;
+ $TMPL_VAR{intnotes} = qq|<textarea name=intnotes rows=$rows cols=35 wrap=soft>$form->{intnotes}</textarea>|;
if (!$form->{taxincluded}) {
foreach $item (split / /, $form->{taxaccounts}) {
if ($form->{"${item}_base"}) {
- $form->{invtotal} += $form->{"${item}_total"} =
- $form->round_amount(
- $form->{"${item}_base"} * $form->{"${item}_rate"},
- 2);
- $form->{"${item}_total"} =
- $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
-
- $tax .= qq|
+ $form->{invtotal} += $form->{"${item}_total"} = $form->round_amount( $form->{"${item}_base"} * $form->{"${item}_rate"}, 2);
+ $form->{"${item}_total"} = $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
+
+ $TMPL_VAR{tax} .= qq|
<tr>
- <th align=right>$form->{"${item}_description"} |
- . $form->{"${item}_rate"} * 100 .qq|%</th>
+ <th align=right>$form->{"${item}_description"} | . $form->{"${item}_rate"} * 100 .qq|%</th>
<td align=right>$form->{"${item}_total"}</td>
- </tr>
-|;
+ </tr> |;
}
}
- $form->{invsubtotal} =
- $form->format_amount(\%myconfig, $form->{invsubtotal}, 2, 0);
-
- $subtotal = qq|
- <tr>
- <th align=right>| . $locale->text('Subtotal') . qq|</th>
- <td align=right>$form->{invsubtotal}</td>
- </tr>
-|;
-
- }
+ $form->{invsubtotal} = $form->format_amount(\%myconfig, $form->{invsubtotal}, 2, 0);
- if ($form->{taxincluded}) {
+ } else {
foreach $item (split / /, $form->{taxaccounts}) {
if ($form->{"${item}_base"}) {
- $form->{"${item}_total"} =
- $form->round_amount(
- ($form->{"${item}_base"} * $form->{"${item}_rate"} /
- (1 + $form->{"${item}_rate"})
- ),
- 2);
- $form->{"${item}_netto"} =
- $form->round_amount(
- ($form->{"${item}_base"} - $form->{"${item}_total"}),
- 2);
- $form->{"${item}_total"} =
- $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
- $form->{"${item}_netto"} =
- $form->format_amount(\%myconfig, $form->{"${item}_netto"}, 2);
-
- $tax .= qq|
+ $form->{"${item}_total"} = $form->round_amount( ($form->{"${item}_base"} * $form->{"${item}_rate"} / (1 + $form->{"${item}_rate"})), 2);
+ $form->{"${item}_netto"} = $form->round_amount( ($form->{"${item}_base"} - $form->{"${item}_total"}), 2);
+ $form->{"${item}_total"} = $form->format_amount(\%myconfig, $form->{"${item}_total"}, 2);
+ $form->{"${item}_netto"} = $form->format_amount(\%myconfig, $form->{"${item}_netto"}, 2);
+
+ $TMPL_VAR{tax} .= qq|
<tr>
- <th align=right>Enthaltene $form->{"${item}_description"} |
- . $form->{"${item}_rate"} * 100 .qq|%</th>
+ <th align=right>Enthaltene $form->{"${item}_description"} | . $form->{"${item}_rate"} * 100 .qq|%</th>
<td align=right>$form->{"${item}_total"}</td>
</tr>
<tr>
<th align=right>Nettobetrag</th>
<td align=right>$form->{"${item}_netto"}</td>
- </tr>
-|;
+ </tr> |;
}
}
-
}
$form->{oldinvtotal} = $form->{invtotal};
- $form->{invtotal} =
- $form->format_amount(\%myconfig, $form->{invtotal}, 2, 0);
-
- print qq|
- <tr>
- <td>
- <table width=100%>
- <tr valign=bottom>
- <td>
- <table>
- <tr>
- <th align=left>| . $locale->text('Notes') . qq|</th>
- <th align=left>| . $locale->text('Internal Notes') . qq|</th>
- </tr>
- <tr valign=top>
- <td>$notes</td>
- <td>$intnotes</td>
- </tr>
- <tr>
- $payments
- </tr>
- </table>
- </td>
- <td>
- <table>
-|;
-
- if ($form->{type} =~ /^sales_/) {
- print qq|
- <tr>
- <th align=left>| . $locale->text('Ertrag') . qq|</th>
- <td>| . $form->format_amount(\%myconfig, $form->{marge_total}, 2, 0) . qq|</td>
- </tr>
- <tr>
- <th align=left>| . $locale->text('Ertrag prozentual') . qq|</th>
- <td>| . $form->format_amount(\%myconfig, $form->{marge_percent}, 2, 0) . qq| %</td>
- </tr>
-|;
- }
-
- print qq|
- <input type=hidden name="marge_total" value="$form->{"marge_total"}">
- <input type=hidden name="marge_percent" value="$form->{"marge_percent"}">
- </table>
- </td>
- <td align=right>
- $taxincluded
- <table>
- $subtotal
- $tax
- <tr>
- <th align=right>| . $locale->text('Total') . qq|</th>
- <td align=right>$form->{invtotal}</td>
- </tr>
- </table>
- </td>
- </tr>
- </table>
- </td>
- </tr>
-<input type=hidden name=oldinvtotal value=$form->{oldinvtotal}>
-<input type=hidden name=oldtotalpaid value=$totalpaid>
- <tr>
- <td><hr size=3 noshade></td>
- </tr>
-|;
-
- if ($webdav) {
- $webdav_list = qq|
-
- <tr>
- <th class=listtop align=left>Dokumente im Webdav-Repository</th>
- </tr>
- <table width=100%>
- <td align=left width=30%><b>Dateiname</b></td>
- <td align=left width=70%><b>Webdavlink</b></td>
-|;
- foreach $file (@{ $form->{WEBDAV} }) {
- $webdav_list .= qq|
- <tr>
- <td align="left">$file->{name}</td>
- <td align="left"><a href="$file->{link}">$file->{type}</a></td>
- </tr>
-|;
- }
- $webdav_list .= qq|
- </table>
- </tr>
- <tr>
- <td><hr size=3 noshade></td>
- </tr>
-|;
-
- print $webdav_list;
- }
-
- print qq|
- <tr>
- <td>
-|;
- print_options();
- print qq|
- </td>
- </tr>
-</table>
+ print $form->parse_html_template2("oe/orders_footer", {
+ %TMPL_VAR,
+ webdav => $webdav,
+ print_options => print_options(inline => 1),
+ label_edit => $locale->text("Edit the $form->{type}"),
+ label_workflow => $locale->text("Workflow $form->{type}"),
+ });
-| . $locale->text("Edit the $form->{type}") . qq|<br>
-<input class=submit type=submit name=action id=update_button value="|
- . $locale->text('Update') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('Ship to') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('Print') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('E-mail') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('Save') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('Save and Close') . qq|">
-|;
-
- if (($form->{id})) {
- print qq|
- <input type="button" class="submit" onclick="set_history_window(|
- . Q($form->{id})
- . qq|);" name="history" id="history" value="|
- . $locale->text('history')
- . qq|">
-
-<br>| . $locale->text("Workflow $form->{type}") . qq|<br>
-<input class=submit type=submit name=action value="|
- . $locale->text('Save as new') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('Delete') . qq|">|;
- if (($form->{type} =~ /sales_quotation$/)) {
- print qq|
-<input class=submit type=submit name=action value="|
- . $locale->text('Sales Order') . qq|">|;
- }
- if ($form->{type} =~ /request_quotation$/) {
- print qq|
-<input class=submit type=submit name=action value="|
- . $locale->text('Purchase Order') . qq|">|;
- }
- print qq|
-<input class=submit type=submit name=action value="|
- . $locale->text('Invoice') . qq|">
-|;
-
- if ($form->{type} =~ /sales_order$/) {
- print qq|
-<br>$form->{heading} als neue Vorlage verwenden für<br>
-<input class=submit type=submit name=action value="|
- . $locale->text('Purchase Order') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('Quotation') . qq|">
-|;
-
- } elsif ($form->{type} =~ /purchase_order$/) {
- print qq|
-<br>$form->{heading} als neue Vorlage verwenden für<br>
-<input class=submit type=submit name=action value="|
- . $locale->text('Sales Order') . qq|">
-<input class=submit type=submit name=action value="|
- . $locale->text('Request for Quotation') . qq|">
-|;
-
- } else {
- print qq|
-<br>$form->{heading} als neue Vorlage verwenden für<br>
-<input class=submit type=submit name=action value="|
- . $locale->text('Order') . qq|">
-|;
- }
- }
-
- $form->hide_form("saved_xyznumber");
-
- print qq|
-
-<input type=hidden name=rowcount value=$form->{rowcount}>
-
-<input name=callback type=hidden value="$form->{callback}">
-
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
-</form>
-
-</body>
-</html>
-|;
$lxdebug->leave_sub();
}
$form->{exchangerate} = $exchangerate if
$form->{forex} = $exchangerate = $form->check_exchangerate(\%myconfig, $form->{currency}, $form->{transdate}, $buysell);
- # for pricegroups
- $i = $form->{rowcount};
-
$exchangerate = $form->{exchangerate} || 1;
+##################### process items ######################################
+ # for pricegroups
+ $i = $form->{rowcount};
if ( ($form->{"partnumber_$i"} eq "")
&& ($form->{"description_$i"} eq "")
&& ($form->{"partsgroup_$i"} eq "")) {
} else {
- if ( $form->{type} eq 'purchase_order'
- || $form->{type} eq 'request_quotation') {
- IR->retrieve_item(\%myconfig, \%$form);
- }
- if ( $form->{type} eq 'sales_order'
- || $form->{type} eq 'sales_quotation') {
+ if ($form->{type} =~ /^sales/) {
IS->retrieve_item(\%myconfig, \%$form);
+ } else {
+ IR->retrieve_item(\%myconfig, \%$form);
}
my $rows = scalar @{ $form->{item_list} };
&set_pricegroup($i);
}
- &display_form;
-
+ display_form();
} else {
# ok, so this is a new part
&& ($form->{"description_$i"} eq "")) {
$form->{rowcount}--;
$form->{"discount_$i"} = "";
- display_form();
+ display_form();
} else {
$form->{"id_$i"} = 0;
new_item();
}
}
}
+##################### process items ######################################
+
$lxdebug->leave_sub();
}
my $employee_block = qq|
<tr>
<th align="right">| . $locale->text('Employee') . qq|</th>
- <td>| .
- NTI($cgi->popup_menu('-name' => 'employee_id',
- '-values' => \@values,
- '-labels' => \%labels)) . qq|
- </td>
+ <td>| . NTI($cgi->popup_menu('-name' => 'employee_id', '-values' => \@values, '-labels' => \%labels)) . qq|</td>
</tr>
<tr>
<th align="right">| . $locale->text('Salesman') . qq|</th>
<th align=right>$vc_label</th>
<td colspan=3>$vc</td>
</tr>
- $department
+$department
<tr>
<th align=right>$ordlabel</th>
<td colspan=3><input name="$ordnumber" size=20></td>
</tr>
- $employee_block
+$employee_block
<tr>
<th align="right">| . $locale->text('Transaction description') . qq|</th>
<td colspan="3"><input name="transaction_description" size=20></td>
<td colspan="3">$projectnumber</td>
</tr>
<tr>
- <th align=right>| . $locale->text('From') . qq|</th>
- $button1
- <th align=right>| . $locale->text('Bis') . qq|</th>
- $button2
+ <th align=right>| . $locale->text('From') . qq|</th> $button1
+ <th align=right>| . $locale->text('Bis') . qq|</th> $button2
</tr>
<input type=hidden name=sort value=transdate>
<tr>
<td colspan=5>
<table>
<tr>
- <td><input type="checkbox" name="open" value="1" id="open" checked>
- <label for="open">| . $locale->text("Open") . qq|</td>
- <td><input type="checkbox" name="closed" value="1" id="closed">
- <label for="closed">| . $locale->text("Closed") . qq|</td>
+ <td><input type="checkbox" name="open" value="1" id="open" checked> <label for="open">| . $locale->text("Open") . qq|</td>
+ <td><input type="checkbox" name="closed" value="1" id="closed"> <label for="closed">| . $locale->text("Closed") . qq|</td>
</tr>
$delivered
<tr>
- <td><input name="l_id" class=checkbox type=checkbox value=Y>
- | . $locale->text('ID') . qq|</td>
+ <td><input name="l_id" class=checkbox type=checkbox value=Y> | . $locale->text('ID') . qq|</td>
<td><input name="l_$ordnumber" class=checkbox type=checkbox value=Y checked> $ordlabel</td>
- <td><input name="l_transdate" class=checkbox type=checkbox value=Y checked> |
- . $locale->text('Date') . qq|</td>
- <td><input name="l_reqdate" class=checkbox type=checkbox value=Y checked> |
- . $locale->text('Required by') . qq|</td>
+ <td><input name="l_transdate" class=checkbox type=checkbox value=Y checked> | . $locale->text('Date') . qq|</td>
+ <td><input name="l_reqdate" class=checkbox type=checkbox value=Y checked> | . $locale->text('Required by') . qq|</td>
</tr>
<tr>
<td><input name="l_name" class=checkbox type=checkbox value=Y checked> $vc_label</td>
<td><input name="l_employee" class=checkbox type=checkbox value=Y checked> $employee</td>
- <td><input name="l_shipvia" class=checkbox type=checkbox value=Y> |
- . $locale->text('Ship via') . qq|</td>
+ <td><input name="l_shipvia" class=checkbox type=checkbox value=Y> | . $locale->text('Ship via') . qq|</td>
</tr>
<tr>
- <td><input name="l_netamount" class=checkbox type=checkbox value=Y> |
- . $locale->text('Amount') . qq|</td>
- <td><input name="l_tax" class=checkbox type=checkbox value=Y> |
- . $locale->text('Tax') . qq|</td>
- <td><input name="l_amount" class=checkbox type=checkbox value=Y checked> |
- . $locale->text('Total') . qq|</td>
+ <td><input name="l_netamount" class=checkbox type=checkbox value=Y> | . $locale->text('Amount') . qq|</td>
+ <td><input name="l_tax" class=checkbox type=checkbox value=Y> | . $locale->text('Tax') . qq|</td>
+ <td><input name="l_amount" class=checkbox type=checkbox value=Y checked> | . $locale->text('Total') . qq|</td>
</tr>
<tr>
- <td><input name="l_marge_total" class=checkbox type=checkbox value=Y> |
- . $locale->text('Ertrag') . qq|</td>
- <td><input name="l_marge_percent" class=checkbox type=checkbox value=Y> |
- . $locale->text('Ertrag prozentual') . qq|</td>
+ <td><input name="l_marge_total" class=checkbox type=checkbox value=Y> | . $locale->text('Ertrag') . qq|</td>
+ <td><input name="l_marge_percent" class=checkbox type=checkbox value=Y> | . $locale->text('Ertrag prozentual') . qq|</td>
</tr>
<tr>
- <td><input name="l_globalprojectnumber" class=checkbox type=checkbox value=Y> |
- . $locale->text('Project Number') . qq|</td>
- <td><input name="l_transaction_description" class=checkbox type=checkbox value=Y> |
- . $locale->text('Transaction description') . qq|</td>
+ <td><input name="l_globalprojectnumber" class=checkbox type=checkbox value=Y> | . $locale->text('Project Number') . qq|</td>
+ <td><input name="l_transaction_description" class=checkbox type=checkbox value=Y> | . $locale->text('Transaction description') . qq|</td>
</tr>
<tr>
- <td><input name="l_subtotal" class=checkbox type=checkbox value=Y> |
- . $locale->text('Subtotal') . qq|</td>
- <td><input name="l_salesman" class="checkbox" type="checkbox" value="Y"> |
- . $locale->text('Salesman') . qq|</td>
+ <td><input name="l_subtotal" class=checkbox type=checkbox value=Y> | . $locale->text('Subtotal') . qq|</td>
+ <td><input name="l_salesman" class="checkbox" type="checkbox" value="Y"> | . $locale->text('Salesman') . qq|</td>
</tr>
</table>
</td>
sub no {
call_sub($form->{no_nextsub});
}
+
+######################################################################################################
+# IO ENTKOPPLUNG
+# ###############################################################################################
+sub display_form {
+ $lxdebug->enter_sub();
+
+ $form->{"taxaccounts"} =~ s/\s*$//;
+ $form->{"taxaccounts"} =~ s/^\s*//;
+ foreach my $accno (split(/\s*/, $form->{"taxaccounts"})) {
+ map({ delete($form->{"${accno}_${_}"}); } qw(rate description taxnumber));
+ }
+ $form->{"taxaccounts"} = "";
+
+ for my $i (1 .. $form->{"rowcount"}) {
+ IC->retrieve_accounts(\%myconfig, $form, $form->{"id_$i"}, $i, 1) if $form->{"id_$i"};
+ }
+
+ $form->{rowcount}++;
+ $form->{"project_id_$form->{rowcount}"} = $form->{globalproject_id};
+
+ $form->language_payment(\%myconfig);
+
+ Common::webdav_folder($form) if ($webdav);
+
+ &form_header;
+
+ # create rows
+ display_row($form->{rowcount}) if $form->{rowcount};
+
+ &form_footer;
+
+ $lxdebug->leave_sub();
+}
+
+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 => undef, 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 "
+ map { $form->{"${_}_$i"} =~ s/\"/"/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| |;
+ }
+ $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> <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;
+ $form->{"marge_total"} += $form->{"marge_absolut_$i"};
+ $form->{"lastcost_total"} += $form->{"lastcost_$i"} * $form->{"qty_$i"};
+ $form->{"sellprice_total"} += $real_sellprice * $form->{"qty_$i"};
+
+ map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) } qw(marge_absolut marge_percent);
+
+ push @ROW2, { value => sprintf qq|<font %s><b>%s</b> %s %s%% </font> <b>%s</b> %s <b>%s</b> %s|,
+ $marge_color, $locale->text('Ertrag'),$form->{"marge_absolut_$i"}, $form->{"marge_percent_$i"},
+ $locale->text('LP'), $form->format_amount(\%myconfig, $form->{"listprice_$i"}, 2),
+ $locale->text('EK'), $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, 2) }
+ if $form->{"id_$i"} && $form->{type} =~ /^sales_/;
+# / marge calculations ending
+
+ my @HIDDENS = map { value => $_}, (
+ $cgi->hidden("-name" => "unit_old_$i", "-value" => $form->{"selected_unit_$i"}),
+ $cgi->hidden("-name" => "price_new_$i", "-value" => $form->format_amount(\%myconfig, $form->{"price_new_$i"})),
+ map { ($cgi->hidden("-name" => $_, "-value" => $form->{$_})); } map { $_."_$i" }
+ qw(orderitems_id bo pricegroup_old price_old id inventory_accno bin partsgroup partnotes
+ income_accno expense_accno listprice assembly taxaccounts ordnumber transdate cusordnumber
+ longdescription basefactor marge_absolut marge_percent lastcost)
+ );
+
+ map { $form->{"${_}_base"} += $linetotal } (split(/ /, $form->{"taxaccounts_$i"}));
+
+ $form->{invsubtotal} += $linetotal;
+
+ push @ROWS, { ROW1 => \@ROW1, ROW2 => \@ROW2, HIDDENS => \@HIDDENS, colspan => $colspan, };
+ }
+
+ print $form->parse_html_template('oe/sales_order', { ROWS => \@ROWS,
+ HEADER => \@HEADER,
+ show_details_checked => ($form->{show_details} ? "checked" : ""),
+ show_details_new => !$form->{show_details},
+ });
+
+ if (0 != ($form->{sellprice_total} * 1)) {
+ $form->{marge_percent} = ($form->{sellprice_total} - $form->{lastcost_total}) / $form->{sellprice_total} * 100;
+ }
+
+ $lxdebug->leave_sub();
+}
if ($form->{arap} eq 'ar') {
$raw_top_info_text = $form->parse_html_template('rp/aging_ar_top');
$raw_bottom_info_text = $form->parse_html_template('rp/aging_ar_bottom', { 'row_idx' => $row_idx,
- 'PRINT_OPTIONS' => print_options(1), });
+ 'PRINT_OPTIONS' => print_options(inline => 1), });
$report->set_options('raw_top_info_text' => $raw_top_info_text,
'raw_bottom_info_text' => $raw_bottom_info_text);
}
'Monat' => 'Monat',
'Monthly' => 'monatlich',
'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+ 'Motiv' => 'Motiv',
'Multibyte Encoding' => 'Schriftsatz',
'MwSt. inkl.' => 'MwSt. inkl.',
'Name' => 'Name',
$self->{texts} = {
' Date missing!' => ' Datum fehlt!',
- '*/' => '*/',
'ADDED' => 'Hinzugefügt',
'Add Purchase Order' => 'Lieferantenauftrag erfassen',
'Add Quotation' => 'Angebot erfassen',
'Automatically created invoice for fee and interest for dunning %s' => 'Automatisch erzeugte Rechnung für Gebühren und Zinsen zu Mahnung %s',
'Bcc' => 'Bcc',
'Billing Address' => 'Rechnungsadresse',
- 'Bin' => 'Lagerplatz',
'Bin List' => 'Lagerliste',
'CANCELED' => 'Storniert',
'CSV export -- options' => 'CSV-Export -- Optionen',
'Date' => 'Datum',
'Dec' => 'Dez',
'December' => 'Dezember',
- 'Delivery Date' => 'Lieferdatum',
'Department' => 'Abteilung',
'Dependency loop detected:' => 'Schleife in den Abhängigkeiten entdeckt:',
'Description' => 'Beschreibung',
'Directory' => 'Verzeichnis',
- 'Discount' => 'Rabatt',
'Dunning Date' => 'Mahndatum',
'Dunning Description missing in row ' => 'Mahnstufenbeschreibung fehlt in Zeile ',
'Dunning Duedate' => 'Zahlbar bis',
'Dunning overview' => 'Mahnungsübersicht',
'E-mail' => 'eMail',
'E-mail address missing!' => 'E-Mail-Adresse fehlt!',
- 'EK' => 'EK',
'ELSE' => 'Zusatz',
'Edit Dunning Process Config' => 'Mahnwesenkonfiguration bearbeiten',
'Enter longdescription' => 'Langtext eingeben',
'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
- 'Ertrag' => 'Ertrag',
- 'Extended' => 'Gesamt',
'Falsches Datumsformat!' => 'Falsches Datumsformat!',
'Fax' => 'Fax',
'Feb' => 'Feb',
'February' => 'Februar',
'File' => 'Datei',
- 'Group' => 'Warengruppe',
'History' => 'Historie',
'In-line' => 'im Text',
'Interest' => 'Zinsen',
'Invoice Date missing!' => 'Rechnungsdatum fehlt!',
'Invoice Duedate' => 'Fälligkeitsdatum',
'Invoice Number missing!' => 'Rechnungsnummer fehlt!',
- 'Item not on file!' => 'Dieser Artikel ist nicht in der Datenbank!',
'Jan' => 'Jan',
'January' => 'Januar',
'Jul' => 'Jul',
'July' => 'Juli',
'Jun' => 'Jun',
'June' => 'Juni',
- 'L' => 'L',
- 'LP' => 'LP',
- 'License' => 'Lizenz',
'MAILED' => 'Gesendet',
'Mar' => 'März',
'March' => 'März',
'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
'No project was found matching the search parameters.' => 'Es wurde kein Projekt gefunden, auf das die Suchparameter zutreffen.',
'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
- 'No.' => 'Position',
'Nov' => 'Nov',
'November' => 'November',
'Number' => 'Nummer',
'Packing List' => 'Lieferschein',
'Packing List Date missing!' => 'Datum für Verpackungsliste fehlt!',
'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
- 'Part' => 'Ware',
'Part Description' => 'Artikelbeschreibung',
'Part Number' => 'Artikelnummer',
'Part description' => 'Artikelbeschreibung',
'Please enter values' => 'Bitte Werte eingeben',
'Postscript' => 'Postscript',
'Price' => 'Preis',
- 'Pricegroup' => 'Preisgruppe',
'Print dunnings' => 'Mahnungen drucken',
'Printer' => 'Drucker',
'Proforma Invoice' => 'Proformarechnung',
- 'Project' => 'Projekt',
'Project Number' => 'Projektnummer',
'Project description' => 'Projektbeschreibung',
'Project not on file!' => 'Dieses Projekt ist nicht in der Datenbank!',
'Quotation Date missing!' => 'Angebotsdatum fehlt!',
'Quotation Number missing!' => 'Angebotsnummer fehlt!',
'RFQ' => 'Anfrage',
- 'Reqdate' => 'Lieferdatum',
- 'Required by' => 'Lieferdatum',
'SAVED' => 'Gespeichert',
'SAVED FOR DUNNING' => 'Gespeichert',
'SCREENED' => 'Angezeigt',
'Select postscript or PDF!' => 'Postscript oder PDF auswählen!',
'Sep' => 'Sep',
'September' => 'September',
- 'Serial No.' => 'Seriennummer',
- 'Service' => 'Dienstleistung',
'Set eMail text' => 'eMail Text eingeben',
- 'Ship' => 'Lagerausgang',
- 'Ship rcvd' => 'Lagereingang',
'Ship to' => 'Lieferadresse',
'Shipping Address' => 'Lieferadresse',
- 'Show details' => 'Details anzeigen',
'Start Dunning Process' => 'Mahnprozess starten',
'Storno Invoice' => 'Stornorechnung',
'Storno Packing List' => 'Stornolieferschein',
'Street' => 'Straße',
'Subject' => 'Betreff',
- 'Subtotal' => 'Zwischensumme',
'Terms missing in row ' => '+Tage fehlen in Zeile ',
'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
'Vendor details' => 'Lieferantendetails',
'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
'Vendor not on file!' => 'Lieferant ist nicht in der Datenbank!',
- 'What type of item is this?' => 'Was ist dieser Artikel?',
'Zipcode' => 'PLZ',
'[email]' => '[email]',
'bin_list' => 'Lagerliste',
'continue' => 'continue',
'customer_details' => 'customer_details',
'delivery_customer_selection' => 'delivery_customer_selection',
- 'display_form' => 'display_form',
- 'display_row' => 'display_row',
'edit_config' => 'edit_config',
'edit_e_mail' => 'edit_e_mail',
'employee_selection_internal' => 'employee_selection_internal',
'Invoice Number' => 'Rechnungsnummer',
'Invoice Number missing!' => 'Rechnungsnummer fehlt!',
'Item deleted!' => 'Artikel gelöscht!',
- 'Item not on file!' => 'Dieser Artikel ist nicht in der Datenbank!',
'Jan' => 'Jan',
'January' => 'Januar',
'Jul' => 'Jul',
'Packing List' => 'Lieferschein',
'Packing List Date missing!' => 'Datum für Verpackungsliste fehlt!',
'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
- 'Part' => 'Ware',
'Part Description' => 'Artikelbeschreibung',
'Part Description missing!' => 'Artikelbezeichnung fehlt!',
'Part Number' => 'Artikelnummer',
'September' => 'September',
'Serial No.' => 'Seriennummer',
'Serial Number' => 'Seriennummer',
- 'Service' => 'Dienstleistung',
'Service Number missing!' => 'Dienstleistungsnummer fehlt!',
'Services' => 'Dienstleistungen',
'Set Language Values' => 'Spracheinstellungen',
'Vendor details' => 'Lieferantendetails',
'Verrechnungseinheit' => 'Verrechnungseinheit',
'Weight' => 'Gewicht',
- 'What type of item is this?' => 'Was ist dieser Artikel?',
'Zipcode' => 'PLZ',
'[email]' => '[email]',
'assembly_list' => 'erzeugnisliste',
'Invoice' => 'Rechnung',
'Invoice Date missing!' => 'Rechnungsdatum fehlt!',
'Invoice Number missing!' => 'Rechnungsnummer fehlt!',
- 'Item not on file!' => 'Dieser Artikel ist nicht in der Datenbank!',
'Jan' => 'Jan',
'January' => 'Januar',
'Jul' => 'Jul',
'Packing List' => 'Lieferschein',
'Packing List Date missing!' => 'Datum für Verpackungsliste fehlt!',
'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
- 'Part' => 'Ware',
'Part Description' => 'Artikelbeschreibung',
'Part Number' => 'Artikelnummer',
'Part description' => 'Artikelbeschreibung',
'Sep' => 'Sep',
'September' => 'September',
'Serial No.' => 'Seriennummer',
- 'Service' => 'Dienstleistung',
'Ship' => 'Lagerausgang',
'Ship rcvd' => 'Lagereingang',
'Ship to' => 'Lieferadresse',
'Variable' => 'Variable',
'Vendor Number' => 'Lieferantennummer',
'Vendor details' => 'Lieferantendetails',
- 'What type of item is this?' => 'Was ist dieser Artikel?',
'Zipcode' => 'PLZ',
'[email]' => '[email]',
'bin_list' => 'Lagerliste',
'Invoice Number missing!' => 'Rechnungsnummer fehlt!',
'Invoice deleted!' => 'Rechnung gelöscht!',
'Invoice has already been storno\'d!' => 'Diese Rechnung wurde bereits storniert.',
- 'Item not on file!' => 'Dieser Artikel ist nicht in der Datenbank!',
'Jan' => 'Jan',
'January' => 'Januar',
'Jul' => 'Jul',
'Packing List' => 'Lieferschein',
'Packing List Date missing!' => 'Datum für Verpackungsliste fehlt!',
'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
- 'Part' => 'Ware',
'Part Description' => 'Artikelbeschreibung',
'Part Number' => 'Artikelnummer',
'Part description' => 'Artikelbeschreibung',
'Sep' => 'Sep',
'September' => 'September',
'Serial No.' => 'Seriennummer',
- 'Service' => 'Dienstleistung',
'Ship' => 'Lagerausgang',
'Ship rcvd' => 'Lagereingang',
'Ship to' => 'Lieferadresse',
'Vendor missing!' => 'Lieferant fehlt!',
'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
'Vendor not on file!' => 'Lieferant ist nicht in der Datenbank!',
- 'What type of item is this?' => 'Was ist dieser Artikel?',
'Yes' => 'Ja',
'Zipcode' => 'PLZ',
'[email]' => '[email]',
'Invoice Number missing!' => 'Rechnungsnummer fehlt!',
'Invoice deleted!' => 'Rechnung gelöscht!',
'Invoice has already been storno\'d!' => 'Diese Rechnung wurde bereits storniert.',
- 'Item not on file!' => 'Dieser Artikel ist nicht in der Datenbank!',
'Jan' => 'Jan',
'January' => 'Januar',
'Jul' => 'Jul',
'Packing List' => 'Lieferschein',
'Packing List Date missing!' => 'Datum für Verpackungsliste fehlt!',
'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
- 'Part' => 'Ware',
'Part Description' => 'Artikelbeschreibung',
'Part Number' => 'Artikelnummer',
'Part description' => 'Artikelbeschreibung',
'Sep' => 'Sep',
'September' => 'September',
'Serial No.' => 'Seriennummer',
- 'Service' => 'Dienstleistung',
'Ship' => 'Lagerausgang',
'Ship rcvd' => 'Lagereingang',
'Ship to' => 'Lieferadresse',
'Vendor details' => 'Lieferantendetails',
'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
'Vendor not on file!' => 'Lieferant ist nicht in der Datenbank!',
- 'What type of item is this?' => 'Was ist dieser Artikel?',
'Yes' => 'Ja',
'Zipcode' => 'PLZ',
'[email]' => '[email]',
'Cannot save order!' => 'Auftrag kann nicht gespeichert werden!',
'Cannot save quotation!' => 'Angebot kann nicht gespeichert werden!',
'Cc' => 'Cc',
- 'Choose Customer' => 'Endkunde wählen:',
- 'Choose Vendor' => 'Händler wählen',
'City' => 'Stadt',
'Closed' => 'Geschlossen',
'Collective Orders only work for orders from one customer!' => 'Sammelaufträge funktionieren nur für Aufträge von einem Kunden!',
'Confirm!' => 'Bestätigen Sie!',
'Confirmation' => 'Auftragsbestätigung',
'Contact' => 'Kontakt',
- 'Contact Person' => 'Ansprechpartner',
'Continue' => 'Weiter',
'Could not spawn html2ps or GhostScript.' => 'html2ps oder GhostScript konnte nicht gestartet werden.',
'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
'Could not write the html2ps config file.' => 'Die temporäre html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
'Could not write the temporary HTML file.' => 'Eine temporäre HTML-Datei konnte nicht geschrieben werden.',
'Country' => 'Land',
- 'Credit Limit' => 'Kreditlimit',
'Credit Limit exceeded!!!' => 'Kreditlimit überschritten!',
'Credit Note' => 'Gutschrift',
'Curr' => 'Währung',
'Currency' => 'Währung',
'Customer' => 'Kunde',
'Customer Number' => 'Kundennummer',
- 'Customer Order Number' => 'Bestellnummer des Kunden',
'Customer details' => 'Kundendetails',
'Customer missing!' => 'Kundenname fehlt!',
'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
'Date' => 'Datum',
'Dec' => 'Dez',
'December' => 'Dezember',
- 'Delete' => 'Löschen',
'Delivered' => 'Geliefert',
'Delivery Date' => 'Lieferdatum',
'Department' => 'Abteilung',
'Description' => 'Beschreibung',
'Directory' => 'Verzeichnis',
'Discount' => 'Rabatt',
- 'Dunning Amount' => 'gemahnter Betrag',
'E-mail' => 'eMail',
'E-mail address missing!' => 'E-Mail-Adresse fehlt!',
'EK' => 'EK',
'ID' => 'Buchungsnummer',
'In-line' => 'im Text',
'Include in Report' => 'In Bericht aufnehmen',
- 'Internal Notes' => 'interne Bemerkungen',
'Invoice' => 'Rechnung',
'Invoice Date missing!' => 'Rechnungsdatum fehlt!',
'Invoice Number missing!' => 'Rechnungsnummer fehlt!',
- 'Item not on file!' => 'Dieser Artikel ist nicht in der Datenbank!',
'Jan' => 'Jan',
'January' => 'Januar',
'Jul' => 'Jul',
'March' => 'März',
'Mark as paid?' => 'Als bezahlt markieren?',
'Marked as paid' => 'Als bezahlt markiert',
- 'Max. Dunning Level' => 'höchste Mahnstufe',
'May' => 'Mai',
'May ' => 'Mai',
'Message' => 'Nachricht',
'Open' => 'Offen',
'OpenDocument/OASIS' => 'OpenDocument/OASIS',
'Order' => 'Auftrag',
- 'Order Date' => 'Auftragsdatum',
'Order Date missing!' => 'Auftragsdatum fehlt!',
'Order Number' => 'Auftragsnummer',
'Order Number missing!' => 'Auftragsnummer fehlt!',
'Packing List' => 'Lieferschein',
'Packing List Date missing!' => 'Datum für Verpackungsliste fehlt!',
'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
- 'Part' => 'Ware',
'Part Description' => 'Artikelbeschreibung',
'Part Number' => 'Artikelnummer',
'Part description' => 'Artikelbeschreibung',
- 'Payment Terms' => 'Zahlungskonditionen',
'Phone' => 'Telefon',
'Pick List' => 'Sammelliste',
'Please enter values' => 'Bitte Werte eingeben',
'Postscript' => 'Postscript',
'Price' => 'Preis',
'Pricegroup' => 'Preisgruppe',
- 'Print' => 'Drucken',
'Printer' => 'Drucker',
'Proforma Invoice' => 'Proformarechnung',
'Project' => 'Projekt',
'Qty' => 'Menge',
'Queue' => 'Warteschlange',
'Quotation' => 'Angebot',
- 'Quotation Date' => 'Angebotsdatum',
'Quotation Date missing!' => 'Angebotsdatum fehlt!',
'Quotation Number' => 'Angebotsnummer',
'Quotation Number missing!' => 'Angebotsnummer fehlt!',
'Quotations' => 'Angebote',
'RFQ' => 'Anfrage',
'RFQ Number' => 'Anfragenummer',
- 'Remaining' => 'Rest',
'Reqdate' => 'Lieferdatum',
'Request for Quotation' => 'Anfrage',
'Request for Quotations' => 'Anfragen',
'Sales Order' => 'Kundenauftrag',
'Sales Orders' => 'Aufträge',
'Salesman' => 'Verkäufer/in',
- 'Salesperson' => 'Verkäufer',
- 'Save' => 'Speichern',
- 'Save and Close' => 'Speichern und schließen',
- 'Save as new' => 'als neu speichern',
'Screen' => 'Bildschirm',
'Select a Customer' => 'Endkunde auswählen',
'Select a part' => 'Artikel auswählen',
'Sep' => 'Sep',
'September' => 'September',
'Serial No.' => 'Seriennummer',
- 'Service' => 'Dienstleistung',
'Ship' => 'Lagerausgang',
'Ship rcvd' => 'Lagereingang',
'Ship to' => 'Lieferadresse',
'Ship via' => 'Transportmittel',
'Shipping Address' => 'Lieferadresse',
- 'Shipping Point' => 'Versandort',
- 'Show details' => 'Details anzeigen',
- 'Steuersatz' => 'Steuersatz',
'Storno Invoice' => 'Stornorechnung',
'Storno Packing List' => 'Stornolieferschein',
'Street' => 'Straße',
'Subject' => 'Betreff',
'Subtotal' => 'Zwischensumme',
'Tax' => 'Steuer',
- 'Tax Included' => 'Steuer im Preis inbegriffen',
'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
'The list has been printed.' => 'Die Liste wurde ausgedruckt.',
'To (email)' => 'An',
'Total' => 'Summe',
- 'Trade Discount' => 'Rabatt',
'Transaction description' => 'Vorgangsbezeichnung',
'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
'Unit' => 'Einheit',
'Unknown dependency \'%s\'.' => 'Unbekannte Abhängigkeit \'%s\'.',
- 'Update' => 'Erneuern',
- 'Valid until' => 'gültig bis',
'Value' => 'Wert',
'Variable' => 'Variable',
'Vendor' => 'Lieferant',
'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
'Vendor not on file!' => 'Lieferant ist nicht in der Datenbank!',
'Vendor type' => 'Lieferantentyp',
- 'What type of item is this?' => 'Was ist dieser Artikel?',
'Workflow purchase_order' => 'Workflow Lieferantenauftrag',
'Workflow request_quotation' => 'Workflow Preisanfrage',
'Workflow sales_order' => 'Workflow Auftrag',
'bin_list' => 'Lagerliste',
'button' => '?',
'emailed to' => 'gemailt an',
- 'history' => 'Historie',
'invoice' => 'Rechnung',
'no' => 'nein',
'none (pricegroup)' => 'keine',