Revision 14b40469
Von Tamino Steinert vor mehr als 2 Jahren hinzugefügt
| SL/Controller/File.pm | ||
|---|---|---|
|   'sales_quotation'             => { gen => 1, gltype => '',   dir =>'SalesQuotation',       model => 'Order',          right => 'import_ar'  },
 | ||
|   'sales_order'                 => { gen => 5, gltype => '',   dir =>'SalesOrder',           model => 'Order',          right => 'import_ar'  },
 | ||
|   'sales_delivery_order'        => { gen => 1, gltype => '',   dir =>'SalesDeliveryOrder',   model => 'DeliveryOrder',  right => 'import_ar'  },
 | ||
|   'sales_reclamation'           => { gen => 5, gltype => '',   dir =>'SalesReclamation',     model => 'Reclamation',    right => 'import_ar'  },
 | ||
|   'invoice'                     => { gen => 1, gltype => 'ar', dir =>'SalesInvoice',         model => 'Invoice',        right => 'import_ar'  },
 | ||
|   'invoice_for_advance_payment' => { gen => 1, gltype => 'ar', dir =>'SalesInvoice',         model => 'Invoice',        right => 'import_ar'  },
 | ||
|   'final_invoice'               => { gen => 1, gltype => 'ar', dir =>'SalesInvoice',         model => 'Invoice',        right => 'import_ar'  },
 | ||
| ... | ... | |
|   'request_quotation'           => { gen => 7, gltype => '',   dir =>'RequestForQuotation',  model => 'Order',          right => 'import_ap'  },
 | ||
|   'purchase_order'              => { gen => 7, gltype => '',   dir =>'PurchaseOrder',        model => 'Order',          right => 'import_ap'  },
 | ||
|   'purchase_delivery_order'     => { gen => 7, gltype => '',   dir =>'PurchaseDeliveryOrder',model => 'DeliveryOrder',  right => 'import_ap'  },
 | ||
|   'purchase_reclamation'        => { gen => 7, gltype => '',   dir =>'PurchaseReclamation',  model => 'Reclamation',    right => 'import_ap'  },
 | ||
|   'purchase_invoice'            => { gen => 6, gltype => 'ap', dir =>'PurchaseInvoice',      model => 'PurchaseInvoice',right => 'import_ap'  },
 | ||
|   'supplier_delivery_order'     => { gen => 7, gltype => '',   dir =>'SupplierDeliveryOrder',model => 'DeliveryOrder',  right => 'import_ap'  },
 | ||
|   'vendor'                      => { gen => 0, gltype => '',   dir =>'Vendor',               model => 'Vendor',         right => 'xx'         },
 | ||
| SL/Controller/Reclamation.pm | ||
|---|---|---|
| package SL::Controller::Reclamation;
 | ||
|  | ||
| use strict;
 | ||
| use parent qw(SL::Controller::Base);
 | ||
|  | ||
| use SL::Helper::Flash qw(flash_later);
 | ||
| use SL::Presenter::Tag qw(select_tag hidden_tag div_tag);
 | ||
| use SL::Locale::String qw(t8);
 | ||
| use SL::SessionFile::Random;
 | ||
| use SL::PriceSource;
 | ||
| use SL::ReportGenerator;
 | ||
| use SL::Controller::Helper::ReportGenerator;
 | ||
| use SL::Webdav;
 | ||
| use SL::File;
 | ||
| use SL::MIME;
 | ||
| use SL::Util qw(trim);
 | ||
| use SL::YAML;
 | ||
| use SL::DB::History;
 | ||
| use SL::DB::Reclamation;
 | ||
| use SL::DB::ReclamationItem;
 | ||
| use SL::DB::Default;
 | ||
| use SL::DB::Printer;
 | ||
| use SL::DB::Language;
 | ||
| use SL::DB::RecordLink;
 | ||
| use SL::DB::Shipto;
 | ||
| use SL::DB::Translation;
 | ||
|  | ||
| use SL::Helper::CreatePDF qw(:all);
 | ||
| use SL::Helper::PrintOptions;
 | ||
| use SL::Helper::ShippedQty;
 | ||
| use SL::Helper::UserPreferences::PositionsScrollbar;
 | ||
| use SL::Helper::UserPreferences::UpdatePositions;
 | ||
|  | ||
| use SL::Controller::Helper::GetModels;
 | ||
|  | ||
| use List::Util qw(first sum0);
 | ||
| use List::UtilsBy qw(sort_by uniq_by);
 | ||
| use List::MoreUtils qw(any none pairwise first_index);
 | ||
| use English qw(-no_match_vars);
 | ||
| use File::Spec;
 | ||
| use Cwd;
 | ||
| use Sort::Naturally;
 | ||
|  | ||
| # for _link_to_records
 | ||
| use SL::DB::Order;
 | ||
| use SL::DB::OrderItem;
 | ||
| use SL::DB::DeliveryOrder;
 | ||
| use SL::DB::DeliveryOrderItem;
 | ||
| use SL::DB::Invoice;
 | ||
| use SL::DB::PurchaseInvoice;
 | ||
| use SL::DB::InvoiceItem;
 | ||
|  | ||
| use Rose::Object::MakeMethods::Generic
 | ||
| (
 | ||
|  scalar => [ qw(item_ids_to_delete is_custom_shipto_to_delete) ],
 | ||
|  'scalar --get_set_init' => [qw(
 | ||
|     all_price_factors cv models p part_picker_classification_ids reclamation
 | ||
|     search_cvpartnumber show_update_button type valid_types
 | ||
|  )],
 | ||
| );
 | ||
|  | ||
|  | ||
| # safety
 | ||
| __PACKAGE__->run_before('check_auth');
 | ||
|  | ||
| __PACKAGE__->run_before('recalc',
 | ||
|                         only => [qw(
 | ||
|                           save save_as_new print preview_pdf send_email
 | ||
|                           save_and_show_email_dialog
 | ||
|                           workflow_save_and_sales_or_purchase_reclamation
 | ||
|                        )]);
 | ||
|  | ||
| __PACKAGE__->run_before('get_unalterable_data',
 | ||
|                         only => [qw(
 | ||
|                           save save_as_new print preview_pdf send_email
 | ||
|                           save_and_show_email_dialog
 | ||
|                           workflow_save_and_sales_or_purchase_reclamation
 | ||
|                         )]);
 | ||
|  | ||
| #
 | ||
| # actions
 | ||
| #
 | ||
|  | ||
| # add a new reclamation
 | ||
| sub action_add {
 | ||
|   my ($self) = @_;
 | ||
|  | ||
|   $self->reclamation->transdate(DateTime->now_local());
 | ||
|  | ||
|   $self->pre_render();
 | ||
|  | ||
|   $self->render(
 | ||
|     'reclamation/form',
 | ||
|     title => $self->get_title_for('add'),
 | ||
|     %{$self->{template_args}},
 | ||
|   );
 | ||
| }
 | ||
|  | ||
| # edit an existing reclamation
 | ||
| sub action_edit {
 | ||
|   my ($self) = @_;
 | ||
|  | ||
|   unless ($::form->{id}) {
 | ||
|     $self->js->flash('error', t8("Can't edit unsaved reclamation. No 'id' was given."));
 | ||
|     return $self->js->render();
 | ||
|   }
 | ||
|  | ||
|   $self->load_reclamation;
 | ||
|  | ||
|   $self->recalc();
 | ||
|   $self->pre_render();
 | ||
|  | ||
|   $self->render(
 | ||
|     'reclamation/form',
 | ||
|     title => $self->get_title_for('edit'),
 | ||
|     %{$self->{template_args}},
 | ||
|   );
 | ||
| }
 | ||
|  | ||
| # delete the reclamation
 | ||
| sub action_delete {
 | ||
|   my ($self) = @_;
 | ||
|  | ||
|   my $errors = $self->delete();
 | ||
|  | ||
|   if (scalar @{ $errors }) {
 | ||
|     $self->js->flash('error', $_) foreach @{ $errors };
 | ||
|     return $self->js->render();
 | ||
|   }
 | ||
|  | ||
|   flash_later('info', t8('The reclamation has been deleted'));
 | ||
|  | ||
|   my @redirect_params = (
 | ||
|     action => 'add',
 | ||
|     type   => $self->type,
 | ||
|   );
 | ||
|  | ||
|   $self->redirect_to(@redirect_params);
 | ||
| }
 | ||
|  | ||
| # save the reclamation
 | ||
| sub action_save {
 | ||
|   my ($self) = @_;
 | ||
|  | ||
|   my $errors = $self->save();
 | ||
|   if (scalar @{ $errors }) {
 | ||
|     $self->js->flash('error', $_) foreach @{ $errors };
 | ||
|     return $self->js->render();
 | ||
|   }
 | ||
|   flash_later('info', t8('The reclamation has been saved'));
 | ||
|  | ||
|   my @redirect_params = (
 | ||
|     action => 'edit',
 | ||
|     type   => $self->type,
 | ||
|     id     => $self->reclamation->id,
 | ||
|   );
 | ||
|   $self->redirect_to(@redirect_params);
 | ||
| }
 | ||
|  | ||
| sub action_list {
 | ||
|   my ($self) = @_;
 | ||
|  | ||
|   $self->_setup_search_action_bar;
 | ||
|   $self->prepare_report;
 | ||
|   $self->report_generator_list_objects(report => $self->{report}, objects => $self->models->get);
 | ||
| }
 | ||
|  | ||
| # save the reclamation as new document an open it for edit
 | ||
| sub action_save_as_new {
 | ||
|   my ($self) = @_;
 | ||
|  | ||
|   my $reclamation = $self->reclamation;
 | ||
|  | ||
|   if (!$reclamation->id) {
 | ||
|     $self->js->flash('error', t8('This object has not been saved yet.'));
 | ||
|     return $self->js->render();
 | ||
|   }
 | ||
|  | ||
|   # load reclamation from db to check if values changed
 | ||
|   my $saved_reclamation = SL::DB::Reclamation->new(id => $reclamation->id)->load;
 | ||
|  | ||
|   my %new_attrs;
 | ||
|   # If it has been changed manually then use it as-is, otherwise change.
 | ||
|   $new_attrs{record_number} = (trim($reclamation->record_number) eq $saved_reclamation->record_number)
 | ||
|                             ? ''
 | ||
|                             : trim($reclamation->record_number);
 | ||
|   $new_attrs{transdate} = ($reclamation->transdate == $saved_reclamation->transdate)
 | ||
|                         ? DateTime->today_local
 | ||
|                         : $reclamation->transdate;
 | ||
|   if ($reclamation->reqdate == $saved_reclamation->reqdate) {
 | ||
|     $new_attrs{reqdate} = '';
 | ||
|   } else {
 | ||
|     $new_attrs{reqdate} = $reclamation->reqdate;
 | ||
|   }
 | ||
|  | ||
|   # Update employee
 | ||
|   $new_attrs{employee}  = SL::DB::Manager::Employee->current;
 | ||
|  | ||
|   # Create new record from current one
 | ||
|   $self->reclamation(
 | ||
|            SL::DB::Reclamation->new_from(
 | ||
|              $reclamation,
 | ||
|              destination_type   => $reclamation->type,
 | ||
|              attributes         => \%new_attrs,
 | ||
|              no_linked_records => 1,
 | ||
|            )
 | ||
|          );
 | ||
|  | ||
|   # save
 | ||
|   $self->action_save();
 | ||
| }
 | ||
|  | ||
| # print the reclamation
 | ||
| #
 | ||
| # This is called if "print" is pressed in the print dialog.
 | ||
| # If PDF creation was requested and succeeded, the pdf is offered for download
 | ||
| # via send_file (which uses ajax in this case).
 | ||
| sub action_print {
 | ||
|   my ($self) = @_;
 | ||
|  | ||
|   $self->save_with_render_error();
 | ||
|  | ||
|   $self->js_reset_reclamation_and_item_ids_after_save;
 | ||
|  | ||
|   my $format      = $::form->{print_options}->{format};
 | ||
|   my $media       = $::form->{print_options}->{media};
 | ||
|   my $formname    = $::form->{print_options}->{formname};
 | ||
|   my $copies      = $::form->{print_options}->{copies};
 | ||
|   my $groupitems  = $::form->{print_options}->{groupitems};
 | ||
|   my $printer_id  = $::form->{print_options}->{printer_id};
 | ||
|  | ||
|   # only pdf and opendocument by now
 | ||
|   if (none { $format eq $_ } qw(pdf opendocument opendocument_pdf)) {
 | ||
|     return $self->js->flash('error', t8('Format \'#1\' is not supported yet/anymore.', $format))->render;
 | ||
|   }
 | ||
|  | ||
|   # only screen or printer by now
 | ||
|   if (none { $media eq $_ } qw(screen printer)) {
 | ||
|     return $self->js->flash('error', t8('Media \'#1\' is not supported yet/anymore.', $media))->render;
 | ||
|   }
 | ||
|  | ||
|   # create a form for generate_attachment_filename
 | ||
|   my $form   = Form->new;
 | ||
|   $form->{record_number} = $self->reclamation->record_number;
 | ||
|   $form->{type}          = $self->type;
 | ||
|   $form->{format}        = $format;
 | ||
|   $form->{formname}      = $formname;
 | ||
|   $form->{language}      = '_' . $self->reclamation->language->template_code if $self->reclamation->language;
 | ||
|   my $pdf_filename       = $form->generate_attachment_filename();
 | ||
|  | ||
|   my $pdf;
 | ||
|   my @errors = generate_pdf($self->reclamation, \$pdf, {
 | ||
|                               format     => $format,
 | ||
|                               formname   => $formname,
 | ||
|                               language   => $self->reclamation->language,
 | ||
|                               printer_id => $printer_id,
 | ||
|                               groupitems => $groupitems,
 | ||
|                             });
 | ||
|   if (scalar @errors) {
 | ||
|     return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render;
 | ||
|   }
 | ||
|  | ||
|   if ($media eq 'screen') { # screen/download
 | ||
|     $self->js->flash('info', t8('The PDF has been created'));
 | ||
|     $self->send_file(
 | ||
|       \$pdf,
 | ||
|       type         => SL::MIME->mime_type_from_ext($pdf_filename),
 | ||
|       name         => $pdf_filename,
 | ||
|       js_no_render => 1,
 | ||
|     );
 | ||
|   } elsif ($media eq 'printer') { # printer
 | ||
|     my $printer_id = $::form->{print_options}->{printer_id};
 | ||
|     SL::DB::Printer->new(id => $printer_id)->load->print_document(
 | ||
|       copies  => $copies,
 | ||
|       content => $pdf,
 | ||
|     );
 | ||
|     $self->js->flash('info', t8('The PDF has been printed'));
 | ||
|   }
 | ||
|  | ||
|   my @warnings = store_pdf_to_webdav_and_filemanagement($self->reclamation, $pdf, $pdf_filename);
 | ||
|   if (scalar @warnings) {
 | ||
|     $self->js->flash('warning', $_) for @warnings;
 | ||
|   }
 | ||
|  | ||
|   $self->save_history('PRINTED');
 | ||
|  | ||
|   $self->js
 | ||
|     ->run('kivi.ActionBar.setEnabled', '#save_and_email_action')
 | ||
|     ->render;
 | ||
| }
 | ||
|  | ||
| sub action_preview_pdf {
 | ||
|   my ($self) = @_;
 | ||
|  | ||
|   $self->save_with_render_error();
 | ||
|  | ||
|   $self->js_reset_reclamation_and_item_ids_after_save;
 | ||
|  | ||
|   my $format      = 'pdf';
 | ||
|   my $media       = 'screen';
 | ||
|   my $formname    = $self->type;
 | ||
|  | ||
|   # only pdf
 | ||
|   # create a form for generate_attachment_filename
 | ||
|   my $form   = Form->new;
 | ||
|   $form->{record_number} = $self->reclamation->record_number;
 | ||
|   $form->{type}          = $self->type;
 | ||
|   $form->{format}        = $format;
 | ||
|   $form->{formname}      = $formname;
 | ||
|   $form->{language}      = '_' . $self->reclamation->language->template_code if $self->reclamation->language;
 | ||
|   my $pdf_filename       = $form->generate_attachment_filename();
 | ||
|  | ||
|   my $pdf;
 | ||
|   my @errors = generate_pdf($self->reclamation, \$pdf, {
 | ||
|                              format     => $format,
 | ||
|                              formname   => $formname,
 | ||
|                              language   => $self->reclamation->language,
 | ||
|                            });
 | ||
|   if (scalar @errors) {
 | ||
|     return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render;
 | ||
Reclamation: Controller and Templates created