use CGI;
use CGI::Ajax;
-use List::Util qw(max first);
+use List::Util qw(min max first);
use SL::CVar;
use SL::Common;
my $is_purchase = (first { $_ eq $form->{type} } qw(request_quotation purchase_order purchase_delivery_order)) || ($form->{script} eq 'ir.pl');
my $show_min_order_qty = first { $_ eq $form->{type} } qw(request_quotation purchase_order);
my $is_delivery_order = $form->{type} =~ /_delivery_order$/;
+ my $is_s_p_order = (first { $_ eq $form->{type} } qw(sales_order purchase_order));
if ($is_delivery_order) {
$readonly = ' readonly' if ($form->{closed});
$stock_in_out_title = $locale->text('Transfer To Stock');
$stock_in_out = 'in';
}
+
+ retrieve_partunits();
}
# 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 => 'partnumber', width => 8, 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 => 'ship', width => 5, value => $locale->text('Delivered'), display => $is_s_p_order, },
{ id => 'qty', width => 5, value => $locale->text('Qty'), display => 1, },
{ id => 'price_factor', width => 5, value => $locale->text('Price Factor'), display => !$is_delivery_order, },
{ id => 'unit', width => 5, value => $locale->text('Unit'), display => 1, },
{ 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 => !$is_delivery_order, },
- { id => 'sellprice_pg', width => 15, value => $locale->text('Pricegroup'), display => ($form->{type} =~ /^sales_/) && !$is_delivery_order, },
+ { id => 'sellprice_pg', width => 8, value => $locale->text('Pricegroup'), display => ($form->{type} =~ /^sales_/) && !$is_delivery_order, },
{ id => 'discount', width => 5, value => $locale->text('Discount'), display => ($form->{vc} eq 'customer') && !$is_delivery_order, },
{ id => 'linetotal', width => 10, value => $locale->text('Extended'), display => !$is_delivery_order, },
{ 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 %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} };
$projectnumber_labels{$item->{"id"}} = $item->{"projectnumber"};
}
+ _update_part_information();
+ _update_ship() if ($is_s_p_order);
+
# 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});
+ map { $form->{"${_}_$i"} = $form->parse_amount(\%myconfig, $form->{"${_}_$i"}) } qw(qty 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
+ if ( !$all_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.
}
$column_data{price_factor} = ' ';
}
- $column_data{"unit"} = AM->unit_select_html($local_units, "unit_$i", $this_unit, $form->{"id_$i"} ? $form->{"unit_$i"} : undef);
+ $column_data{"unit"} = AM->unit_select_html($all_units, "unit_$i", $this_unit, $form->{"id_$i"} ? $form->{"unit_$i"} : undef);
# / unit ending
$form->{"sellprice_$i"} =~ /\.(\d+)/;
$decimalplaces = max 2, length $1;
$price_factor = $price_factors{$form->{"price_factor_id_$i"}} || 1;
- $discount = $form->round_amount($form->{"sellprice_$i"} * $form->{"discount_$i"} / 100, $decimalplaces);
- $linetotal = $form->round_amount(($form->{"sellprice_$i"} - $discount) / $price_factor, $decimalplaces);
- $linetotal = $form->round_amount($linetotal * $form->{"qty_$i"}, 2);
+ $discount = $form->round_amount($form->{"qty_$i"} * $form->{"sellprice_$i"} * $form->{"discount_$i"} / 100 / $price_factor, 2);
+ $linetotal = $form->round_amount($form->{"qty_$i"} * $form->{"sellprice_$i"} * (100 - $form->{"discount_$i"}) / 100 / $price_factor, 2);
$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 => $form->{"description_$i"}, -rows => $rows, -columns => 30)
- : $cgi->textfield(-name => "description_$i", -size => 30, -value => $form->quote($form->{"description_$i"})))
+ : $cgi->textfield(-name => "description_$i", -size => 30, -value => $form->{"description_$i"}))
. $cgi->button(-value => $locale->text('L'), -onClick => "set_longdescription_window('longdescription_$i')");
$form->{"qty_$i"} =~ /\.(\d+)/;
$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"}));
+
+ $column_data{ship} = '';
+ if ($form->{"id_$i"}) {
+ my $ship_qty = $form->{"ship_$i"} * 1;
+ $ship_qty *= $all_units->{$form->{"partunit_$i"}}->{factor};
+ $ship_qty /= $all_units->{$form->{"unit_$i"}}->{factor};
+
+ $column_data{ship} = $form->format_amount(\%myconfig, $form->round_amount($ship_qty, 2) * 1) . ' ' . $form->{"unit_$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_pg} = qq|<select name="sellprice_pg_$i" style="width: 8em">$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)
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/;
+ if ($form->{type} =~ /order/ || $form->{type} =~ /invoice/);
push @ROW2, { value => sprintf qq|<b>%s</b> <input type="checkbox" name="subtotal_$i" value="1" %s>|,
$locale->text('Subtotal'), $form->{"subtotal_$i"} ? 'checked' : '' };
$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_/ && !$is_delivery_order;
+ if $form->{"id_$i"} && ($form->{type} =~ /^sales_/ || $form->{type} =~ /invoice/) && !$is_delivery_order;
# / marge calculations ending
my @hidden_vars;
push @hidden_vars, "stock_${stock_in_out}_sum_qty", "stock_${stock_in_out}";
}
- push @hidden_vars, qw(partunit) if ($is_purchase);
-
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"})),
_check_io_auth();
+ my $price_key = ($form->{type} =~ m/request_quotation|purchase_order/) || ($form->{script} eq 'ir.pl') ? 'lastcost' : 'sellprice';
+
# change callback
$form->{old_callback} = $form->escape($form->{callback}, 1);
$form->{callback} = $form->escape("$form->{script}?action=display_form", 1);
push @HIDDENS, { 'name' => 'previousform', 'value' => $form->escape($previousform, 1) };
push @HIDDENS, map +{ 'name' => $_, 'value' => $form->{$_} }, qw(rowcount vc);
- push @HIDDENS, map +{ 'name' => $_, 'value' => $form->{"${_}_$form->{rowcount}"} }, qw(partnumber description unit sellprice);
+ push @HIDDENS, map +{ 'name' => $_, 'value' => $form->{"${_}_$form->{rowcount}"} }, qw(partnumber description unit);
push @HIDDENS, { 'name' => 'taxaccount2', 'value' => $form->{taxaccounts} };
+ push @HIDDENS, { 'name' => $price_key, 'value' => $form->parse_amount(\%myconfig, $form->{"sellprice_$form->{rowcount}"}) };
+ push @HIDDENS, { 'name' => 'notes', 'value' => $form->{"longdescription_$form->{rowcount}"} };
$form->header();
print $form->parse_html_template("generic/new_item", { HIDDENS => [ sort { $a->{name} cmp $b->{name} } @HIDDENS ] } );
@hidden_keys = sort grep { !$dont_hide_key{$_} } grep { !ref $form->{$_} } keys %$form;
print $form->parse_html_template('generic/edit_email',
- { title => $title,
- a_filename => $attachment_filename,
- subject => $subject,
- _print_options_ => print_options('inline' => 1),
- HIDDEN => [ map +{ name => $_, value => $form->{$_} }, @hidden_keys ],
- SHOW_BCC => $myconfig{role} eq 'admin' });
+ { title => $title,
+ a_filename => $attachment_filename,
+ subject => $subject,
+ print_options => print_options('inline' => 1),
+ HIDDEN => [ map +{ name => $_, value => $form->{$_} }, @hidden_keys ],
+ SHOW_BCC => $myconfig{role} eq 'admin' });
$lxdebug->leave_sub();
}
($form->{type} =~ /_delivery_order$/) ? (
opthash($form->{type}, $form->{PD}{$form->{type}}, $locale->text('Delivery Order')),
opthash('pick_list', $form->{PD}{pick_list}, $locale->text('Pick List')),
- ) : undef;
+ ) : undef,
($form->{type} eq 'credit_note') ?
opthash("credit_note", $form->{PD}{credit_note}, $locale->text('Credit Note')) : undef;
IS->invoice_details(\%myconfig, \%$form, $locale);
}
- $form->get_salesman(\%myconfig, $salesman_id_saved);
+ $form->get_employee_data('prefix' => 'employee', 'id' => $form->{employee_id});
+ $form->get_employee_data('prefix' => 'salesman', 'id' => $salesman_id_saved);
if ($form->{shipto_id}) {
$form->get_shipto(\%myconfig);
reformat_numbers($output_numberformat, $precision, @{ $field_list });
}
- $form->{IN} = "$form->{formname}$form->{language}${printer_code}.html";
+ my $extension = '';
if ($form->{format} eq 'postscript') {
- $form->{postscript} = 1;
- $form->{IN} =~ s/html$/tex/;
+ $form->{postscript} = 1;
+ $extension = 'tex';
+
} elsif ($form->{"format"} =~ /pdf/) {
- $form->{pdf} = 1;
- if ($form->{"format"} =~ /opendocument/) {
- $form->{IN} =~ s/html$/odt/;
- } else {
- $form->{IN} =~ s/html$/tex/;
- }
+ $form->{pdf} = 1;
+ $extension = $form->{'format'} =~ m/opendocument/i ? 'odt' : 'tex';
+
} elsif ($form->{"format"} =~ /opendocument/) {
- $form->{"opendocument"} = 1;
- $form->{"IN"} =~ s/html$/odt/;
+ $form->{opendocument} = 1;
+ $extension = 'odt';
}
+ my $email_extension = '_email' if (($form->{media} eq 'email') && (-f "$myconfig{templates}/$form->{formname}_email$form->{language}${printer_code}.${extension}"));
+
+ $form->{IN} = "$form->{formname}${email_extension}$form->{language}${printer_code}.${extension}";
+
delete $form->{OUT};
if ($form->{media} eq 'printer') {
+ print (STDERR "io--------------------------------------");
+ print (STDERR $form->{printer_command});
+ #$form->{OUT} = "| $form->{printer_command} ";
$form->{OUT} = "| $form->{printer_command} &>/dev/null";
$form->{printed} .= " $form->{formname}";
$form->{printed} =~ s/^ //;
$form->get_duedate(\%myconfig);
- print $cgi->header() . $form->{duedate};
+ print $form->ajax_response_header() . $form->{duedate};
$lxdebug->leave_sub();
}
+sub _update_part_information {
+ $lxdebug->enter_sub();
+
+ my %part_information = IC->get_basic_part_info('id' => [ grep { $_ } map { $form->{"id_${_}"} } (1..$form->{rowcount}) ],
+ 'vendor_id' => $form->{vendor_id});
+
+ $form->{PART_INFORMATION} = \%part_information;
+
+ foreach my $i (1..$form->{rowcount}) {
+ next unless ($form->{"id_${i}"});
+
+ my $info = $form->{PART_INFORMATION}->{$form->{"id_${i}"}} || { };
+ $form->{"partunit_${i}"} = $info->{unit};
+ }
+
+ $lxdebug->leave_sub();
+}
+
+sub _update_ship {
+ $lxdebug->enter_sub();
+
+ if (!$form->{ordnumber} || !$form->{id}) {
+ map { $form->{"ship_$_"} = 0 } (1..$form->{rowcount});
+ $lxdebug->leave_sub();
+ return;
+ }
+
+ AM->retrieve_all_units();
+
+ my %ship = DO->get_shipped_qty('type' => ($form->{type} eq 'purchase_order') ? 'purchase' : 'sales',
+ 'oe_id' => $form->{id},);
+
+ foreach my $i (1..$form->{rowcount}) {
+ next unless ($form->{"id_${i}"});
+
+ $form->{"ship_$i"} = 0;
+
+ my $ship_entry = $ship{$form->{"id_$i"}};
+
+ next if (!$ship_entry || ($ship_entry->{qty} <= 0));
+
+ my $rowqty =
+ ($form->{simple_save} ? $form->{"qty_$i"} : $form->parse_amount(\%myconfig, $form->{"qty_$i"}))
+ * $all_units->{$form->{"unit_$i"}}->{factor}
+ / $all_units->{$form->{"partunit_$i"}}->{factor};
+
+ $form->{"ship_$i"} = min($rowqty, $ship_entry->{qty});
+ $ship_entry->{qty} -= $form->{"ship_$i"};
+ }
+
+ foreach my $i (1..$form->{rowcount}) {
+ next unless ($form->{"id_${i}"});
+
+ my $ship_entry = $ship{$form->{"id_$i"}};
+
+ next if (!$ship_entry || ($ship_entry->{qty} <= 0.01));
+
+ $form->{"ship_$i"} += $ship_entry->{qty};
+ $ship_entry->{qty} = 0;
+ }
+
+ $lxdebug->leave_sub();
+}