X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fio.pl;h=bbbf5f318eb601985e8f200a924c64aa674b7a9b;hb=b535245ea43c412ea0912fbe3c25d90d5f285233;hp=a716f16d05da1aafc2186e4c848f5ad0f5dee835;hpb=5fdf1ffda5ef2d463208c38f96a2f97b07711c91;p=kivitendo-erp.git diff --git a/bin/mozilla/io.pl b/bin/mozilla/io.pl index a716f16d0..bbbf5f318 100644 --- a/bin/mozilla/io.pl +++ b/bin/mozilla/io.pl @@ -41,6 +41,7 @@ use Carp; use CGI; use List::MoreUtils qw(any uniq apply); use List::Util qw(min max first); +use List::UtilsBy qw(sort_by uniq_by); use SL::ClientJS; use SL::CVar; @@ -53,6 +54,7 @@ use SL::IO; use SL::File; use SL::PriceSource; +use SL::DB::Contact; use SL::DB::Customer; use SL::DB::Default; use SL::DB::Language; @@ -60,6 +62,7 @@ use SL::DB::Printer; use SL::DB::Vendor; use SL::Helper::CreatePDF; use SL::Helper::Flash; +use SL::Helper::PrintOptions; require "bin/mozilla/common.pl"; @@ -215,7 +218,7 @@ sub display_row { # special alignings my %align = map { $_ => 'right' } qw(qty ship right discount linetotal stock_in_out weight ship_missing); - my %nowrap = map { $_ => 1 } qw(description unit); + my %nowrap = map { $_ => 1 } qw(description unit price_source); $form->{marge_total} = 0; $form->{sellprice_total} = 0; @@ -333,24 +336,18 @@ sub display_row { $column_data{ship_missing} = $form->format_amount(\%myconfig, $ship_missing_qty) . ' ' . $form->{"unit_$i"} . '; ' . $form->format_amount(\%myconfig, $ship_missing_amount, $decimalplaces); } - my $sellprice_value = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces); - my $discount_value = $form->format_amount(\%myconfig, $form->{"discount_$i"}); - my $edit_prices = $main::auth->assert('edit_prices', 1) && !$::form->{"active_price_source_$i"}; - my $edit_discounts = $main::auth->assert('edit_prices', 1) && !$::form->{"active_discount_source_$i"}; - $column_data{sellprice} = (!$edit_prices) - ? $cgi->hidden( -name => "sellprice_$i", -id => "sellprice_$i", -value => $sellprice_value) . $sellprice_value - : $cgi->textfield(-name => "sellprice_$i", -id => "sellprice_$i", -size => 10, -onBlur => "check_right_number_format(this)", -value => $sellprice_value); - $column_data{discount} = (!$edit_discounts) - ? $cgi->hidden( -name => "discount_$i", -id => "discount_$i", -value => $discount_value) . $discount_value . ' %' - : $cgi->textfield(-name => "discount_$i", -id => "discount_$i", -size => 3, -value => $discount_value); $column_data{linetotal} = $form->format_amount(\%myconfig, $linetotal, 2); $column_data{bin} = $form->{"bin_$i"}; $column_data{weight} = $form->format_amount(\%myconfig, $form->{"qty_$i"} * $form->{"weight_$i"}, 3) . ' ' . $defaults->{weightunit} if $defaults->{show_weight}; + my $sellprice_value = $form->format_amount(\%myconfig, $form->{"sellprice_$i"}, $decimalplaces); + my $discount_value = $form->format_amount(\%myconfig, $form->{"discount_$i"}); + + my $price; if ($form->{"id_${i}"} && !$is_delivery_order) { my $price_source = SL::PriceSource->new(record_item => $record_item, record => $record); - my $price = $price_source->price_from_source($::form->{"active_price_source_$i"}); + $price = $price_source->price_from_source($::form->{"active_price_source_$i"}); my $discount = $price_source->discount_from_source($::form->{"active_discount_source_$i"}); my $best_price = $price_source->best_price; my $best_discount = $price_source->best_discount; @@ -375,6 +372,15 @@ sub display_row { } } + my $edit_prices = $main::auth->assert('edit_prices', 1) && (!$::form->{"active_price_source_$i"} || !$price || $price->editable); + my $edit_discounts = $main::auth->assert('edit_prices', 1) && !$::form->{"active_discount_source_$i"}; + $column_data{sellprice} = (!$edit_prices) + ? $cgi->hidden( -name => "sellprice_$i", -id => "sellprice_$i", -value => $sellprice_value) . $sellprice_value + : $cgi->textfield(-name => "sellprice_$i", -id => "sellprice_$i", -size => 10, -onBlur => "check_right_number_format(this)", -value => $sellprice_value); + $column_data{discount} = (!$edit_discounts) + ? $cgi->hidden( -name => "discount_$i", -id => "discount_$i", -value => $discount_value) . $discount_value . ' %' + : $cgi->textfield(-name => "discount_$i", -id => "discount_$i", -size => 3, -value => $discount_value); + if ($is_delivery_order) { $column_data{stock_in_out} = calculate_stock_in_out($i); } @@ -892,7 +898,7 @@ sub order { $form->{old_employee_id} = $form->{employee_id}; $form->{old_salesman_id} = $form->{salesman_id}; - delete $form->{$_} foreach (qw(printed emailed queued)); + delete $form->{$_} foreach (qw(id printed emailed queued)); # When creating a new sales order from a saved sales invoice, reset id, # ordnumber, transdate and deliverydate as we are creating a new order. This @@ -973,7 +979,7 @@ sub quotation { if ($form->{second_run}) { $form->{print_and_post} = 0; } - delete $form->{$_} foreach (qw(printed emailed queued)); + delete $form->{$_} foreach (qw(id printed emailed queued)); my $buysell; if ($form->{script} eq 'ir.pl' || $form->{type} eq 'purchase_order') { @@ -1024,126 +1030,6 @@ sub request_for_quotation { quotation(); } -sub edit_e_mail { - $main::lxdebug->enter_sub(); - - my $form = $main::form; - my %myconfig = %main::myconfig; - my $locale = $main::locale; - - _check_io_auth(); - - if ($form->{second_run}) { - $form->{print_and_post} = 0; - $form->{resubmit} = 0; - } - - $form->{email} = $form->{shiptoemail} if $form->{shiptoemail} && $form->{formname} =~ /(pick|packing|bin)_list/; - - if ($form->{"cp_id"}) { - CT->get_contact(\%myconfig, $form); - $form->{"email"} = $form->{"cp_email"} if $form->{"cp_email"}; - } - - $form->{language} = $form->get_template_language(\%myconfig); - $form->{language} = "_" . $form->{language} if $form->{language}; - - my $title = $locale->text('E-mail') . " " . $form->get_formname_translation(); - - $form->{oldmedia} = $form->{media}; - $form->{media} = "email"; - - my $global_bcc = AM->get_defaults()->{global_bcc}; - - $form->{bcc} = join ', ', grep $_, $form->{bcc}, $global_bcc; - - my $attachment_filename = $form->generate_attachment_filename(); - my $subject = $form->{subject} || $form->generate_email_subject(); - - $form->header; - - my (@dont_hide_key_list, %dont_hide_key, @hidden_keys); - @dont_hide_key_list = qw(action email cc bcc subject message sendmode format header override login password); - @dont_hide_key{@dont_hide_key_list} = (1) x @dont_hide_key_list; - @hidden_keys = sort grep { !$dont_hide_key{$_} } grep { !ref $form->{$_} } keys %$form; - - my (@files, @vc_files, @part_files, $has_document); - - if ($::instance_conf->get_doc_storage) { - @files = SL::File->get_all_versions(object_id => $form->{id}, object_type => $form->{type}, file_type => 'document'); - $has_document = 1 if scalar(@files) > 0; - @files = SL::File->get_all(object_id => $form->{id}, object_type => $form->{type}, file_type => 'attachment'); - @vc_files = SL::File->get_all(object_id => $form->{"$form->{vc}_id"}, object_type => $form->{vc}) - if $form->{vc} && $form->{"$form->{vc}_id"}; - - my %part_id_map = map { $_->{id} => $_ } grep { $_->{id} } map { - { - 'id' => $form->{"id_$_"}, - 'partname' => $form->{"partnumber_$_"} - } - } (1 .. $form->{rowcount}); - - foreach my $partid (keys %part_id_map) { - my @pfiles = SL::File->get_all(object_id => $partid, object_type => 'part'); - push @part_files, map { $_->{partname} = $part_id_map{$partid}->{partname}; $_ } @pfiles; - } - } - - print $form->parse_html_template('generic/edit_email', - { title => $title, - a_filename => $attachment_filename, - subject => $subject, - has_document => $has_document, - print_options => print_options('inline' => 1), - action => 'send_email', - FILES => \@files, - VC_FILES => \@vc_files, - PART_FILES => \@part_files, - HIDDEN => [ map +{ name => $_, value => $form->{$_} }, @hidden_keys ], - SHOW_BCC => $::auth->assert('email_bcc', 'may fail') }); - - $main::lxdebug->leave_sub(); -} - -sub send_email { - $main::lxdebug->enter_sub(); - - my $form = $main::form; - my %myconfig = %main::myconfig; - - _check_io_auth(); - - my $callback = $form->{script} . "?action=edit"; - map({ $callback .= "\&${_}=" . E($form->{$_}); } qw(type id)); - if ( $form->{action_oldfile} || $form->{action_nofile} ) { - if (!$form->{email} || $form->{email} =~ /^\s*$/) { - flash('error', $::locale->text('E-mail address missing!')); - } - else { - $form->send_email(\%myconfig,'pdf'); - } - } - else { - print_form("return"); - $form->{addition} = "SCREENED"; - $form->save_history; - $form->{addition} = "MAILED"; - } - - flash_later('info' , $::locale->text('E-Mail is sent to #1', $form->{email})) if !$form->{emailerr}; - flash_later('error', $::locale->text($form->{emailerr})) if $form->{emailerr}; - - delete $form->{emailerr}; - - Common->save_email_status(\%myconfig, $form); - ##TODO andere SAVE HISTORY - - $form->{callback} = $callback; - $form->redirect(); - - $main::lxdebug->leave_sub(); -} - sub print_options { $::lxdebug->enter_sub(); @@ -1945,25 +1831,44 @@ sub _make_record_item { $class = 'SL::DB::' . $class; + my %translated_methods = ( + 'SL::DB::OrderItem' => { + id => 'parts_id', + orderitems_id => 'id', + }, + 'SL::DB::DeliveryOrderItem' => { + id => 'parts_id', + delivery_order_items_id => 'id', + }, + 'SL::DB::InvoiceItem' => { + id => 'parts_id', + invoice_id => 'id', + }, + ); + eval "require $class"; my $obj = $::form->{"orderitems_id_$row"} ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{"orderitems_id_$row"}) : $class->new; - for my $method (apply { s/_$row$// } grep { /_$row$/ } keys %$::form) { + for my $key (grep { /_$row$/ } keys %$::form) { + my $method = $key; + $method =~ s/_$row$//; + $method = $translated_methods{$class}{$method} // $method; + my $value = $::form->{$key}; if ($obj->meta->column($method)) { if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) { - $obj->${\"$method\_as_date"}($::form->{"$method\_$row"}); + $obj->${\"$method\_as_date"}($value); } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) { - $obj->${\"$method\_as_number"}($::form->{"$method\_$row"}); + $obj->${\"$method\_as_number"}($value); } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) { - $obj->$method(!!$::form->{$method}); + $obj->$method(!!$value); } else { - $obj->$method($::form->{"$method\_$row"}); + $obj->$method($value); } } else { - $obj->{__additional_form_attributes}{$method} = $::form->{"$method\_$row"}; + $obj->{__additional_form_attributes}{$method} = $value; } } @@ -2026,3 +1931,95 @@ sub _make_record { return $obj; } + +sub setup_sales_purchase_print_options { + my $print_form = Form->new(''); + $print_form->{printers} = SL::DB::Manager::Printer->get_all_sorted; + $print_form->{languages} = SL::DB::Manager::Language->get_all_sorted; + + $print_form->{$_} = $::form->{$_} for qw(type media language_id printer_id); + + return SL::Helper::PrintOptions->get_print_options( + form => $print_form, + options => { + show_headers => 1, + }, + ); +} + +sub _get_files_for_email_dialog { + my %files = map { ($_ => []) } qw(versions files vc_files part_files); + + return %files if !$::instance_conf->get_doc_storage; + + $files{versions} = [ SL::File->get_all_versions(object_id => $::form->{id}, object_type => $::form->{type}, file_type => 'document') ]; + $files{files} = [ SL::File->get_all( object_id => $::form->{id}, object_type => $::form->{type}, file_type => 'attachment') ]; + $files{vc_files} = [ SL::File->get_all( object_id => $::form->{vc_id}, object_type => $::form->{vc}, file_type => 'attachment') ] + if $::form->{vc} && $::form->{"vc_id"}; + + my @parts = + uniq_by { $_->{id} } + grep { $_->{id} } + map { + +{ id => $::form->{"id_$_"}, + partnumber => $::form->{"partnumber_$_"}, + } + } (1 .. $::form->{rowcount}); + + foreach my $part (@parts) { + my @pfiles = SL::File->get_all(object_id => $part->{id}, object_type => 'part'); + push @{ $files{part_files} }, map { +{ %{ $_ }, partnumber => $part->{partnumber} } } @pfiles; + } + + foreach my $key (keys %files) { + $files{$key} = [ sort_by { lc $_->{db_file}->{file_name} } @{ $files{$key} } ]; + } + + return %files; +} + +sub show_sales_purchase_email_dialog { + my $contact = $::form->{cp_id} ? SL::DB::Contact->load_cached($::form->{cp_id}) : undef; + my $email_form = { + to => $contact ? $contact->cp_email : '', + subject => $::form->generate_email_subject, + attachment_filename => $::form->generate_attachment_filename, + }; + + my %files = _get_files_for_email_dialog(); + my $html = $::form->parse_html_template("common/_send_email_dialog", { + email_form => $email_form, + show_bcc => $::auth->assert('email_bcc', 'may fail'), + FILES => \%files, + is_customer => $::form->{vc} eq 'customer', + }); + + print $::form->ajax_response_header, $html; +} + +sub send_sales_purchase_email { + my $type = $::form->{type}; + my $id = $::form->{id}; + my $script = $type =~ m{sales_order|purchase_order|quotation} ? 'oe.pl' + : $type =~ m{delivery_} ? 'do.pl' + : 'is.pl'; + + my $email_form = delete $::form->{email_form}; + my %field_names = (to => 'email'); + + $::form->{ $field_names{$_} // $_ } = $email_form->{$_} for keys %{ $email_form }; + + $::form->{media} = 'email'; + + if (($::form->{attachment_policy} // '') =~ m{^(?:old_file|no_file)$}) { + $::form->send_email(\%::myconfig, 'pdf'); + + } else { + print_form("return"); + Common->save_email_status(\%::myconfig, $::form); + } + + flash_later('info', $::locale->text('The email has been sent.')); + + print $::form->redirect_header($script . '?action=edit&id=' . $::form->escape($id) . '&type=' . $::form->escape($type)); +}