+
+sub setup_sales_purchase_print_options {
+ my $print_form = Form->new('');
+ $print_form->{printers} = SL::DB::Manager::Printer->get_all_sorted;
+
+ $print_form->{$_} = $::form->{$_} for qw(type media printer_id storno formname groupitems);
+
+ 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;
+
+ if ($::form->{id}) {
+ $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 $email = '';
+ my $email_cc = '';
+ my $record_email;
+ if ($::form->{cp_id}) {
+ $email = SL::DB::Contact->load_cached($::form->{cp_id})->cp_email;
+ }
+ # write a dispatch table if a third type enters
+ # check record mail for sales_invoice
+ if ($::form->{type} eq 'invoice' && (!$email || $::instance_conf->get_invoice_mail_settings ne 'cp')) {
+ # check for invoice_mail if defined (vc.invoice_email)
+ $record_email = SL::DB::Customer->load_cached($::form->{vc_id})->invoice_mail;
+ if ($record_email) {
+ # check if cc for contact is also wanted
+ $email_cc = $email if ($::instance_conf->get_invoice_mail_settings eq 'invoice_mail_cc_cp');
+ $email = $record_email;
+ }
+ }
+ # check record mail for sales_delivery_order
+ if ($::form->{type} eq 'sales_delivery_order') {
+ # check for deliver_order_mail if defined (vc.delivery_order_mail)
+ $record_email = SL::DB::Customer->load_cached($::form->{vc_id})->delivery_order_mail;
+ if ($record_email) {
+ # check if cc for contact is also wanted
+ $email_cc = $email; # always cc to cp
+ $email = $record_email;
+ }
+ }
+ # still no email? use general mail (vc.email)
+ if (!$email && $::form->{vc} && $::form->{vc_id}) {
+ $email = SL::DB::Customer->load_cached($::form->{vc_id})->email if 'customer' eq $::form->{vc};
+ $email = SL::DB::Vendor ->load_cached($::form->{vc_id})->email if 'vendor' eq $::form->{vc};
+ }
+
+ $email = '' if $::form->{type} eq 'purchase_delivery_order';
+
+ $::form->{language} = $::form->get_template_language(\%::myconfig);
+ $::form->{language} = "_" . $::form->{language};
+
+ my %body_params = (record_email => $record_email);
+ if (($::form->{type} eq 'invoice') && $::form->{direct_debit}) {
+ $body_params{translation_type} = "preset_text_invoice_direct_debit";
+ $body_params{fallback_translation_type} = "preset_text_invoice";
+ }
+
+ my $email_form = {
+ to => $email,
+ cc => $email_cc,
+ subject => $::form->generate_email_subject,
+ message => $::form->generate_email_body(%body_params),
+ attachment_filename => $::form->generate_attachment_filename,
+ js_send_function => 'kivi.SalesPurchase.send_email()',
+ };
+
+ 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',
+ is_invoice_mail => ($record_email && $::form->{type} eq 'invoice'),
+ });
+
+ 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));
+}
+
+sub _maybe_attach_zugferd_data {
+ my ($form) = @_;
+
+ my $record = _make_record();
+
+ return if !$record
+ || !$record->can('customer')
+ || !$record->customer
+ || !$record->can('create_pdf_a_print_options')
+ || !$record->can('create_zugferd_data')
+ || !$record->customer->create_zugferd_invoices_for_this_customer;
+
+ eval {
+ my $xmlfile = File::Temp->new;
+ $xmlfile->print($record->create_zugferd_data);
+ $xmlfile->close;
+
+ $form->{TEMPLATE_DRIVER_OPTIONS}->{pdf_a} = $record->create_pdf_a_print_options(zugferd_xmp_data => $record->create_zugferd_xmp_data);
+ $form->{TEMPLATE_DRIVER_OPTIONS}->{pdf_attachments} = [
+ { source => $xmlfile,
+ name => 'factur-x.xml',
+ description => $::locale->text('Factur-X/ZUGFeRD invoice'),
+ relationship => '/Alternative',
+ mime_type => 'text/xml',
+ }
+ ];
+ };
+
+ if (my $e = SL::X::ZUGFeRDValidation->caught) {
+ $::form->error($e->message);
+ }
+}