Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision b74a00e5

Von Jan Büren vor mehr als 9 Jahren hinzugefügt

  • ID b74a00e5100336d13d1536870721796474599a08
  • Vorgänger 38666007
  • Nachfolger 54086731

Massendruck weitere Optionen (zweiter Druckbefehl) implementiert

transdate, copy_printer_id (id des zweiten Druckbefehls) als optionale
Parameter beim Aufruf der Konvertierung inkl. Ausdruck in der API
bereitgestellt.

Details: perldoc SL/Controller/MassInvoiceCreatePrint.pm

Unterschiede anzeigen:

SL/BackgroundJob/MassRecordCreationAndPrinting.pm
# my $data = {
# record_ids => [ 123, 124, 127, ],
# printer_id => 4711,
# copy_printer_id => 4711,
# transdate => $today || $custom_transdate,
# num_created => 0,
# num_printed => 0,
# invoice_ids => [ 234, 235, ],
......
$number = $sales_delivery_order->donumber;
if (!$db->do_transaction(sub {
$invoice = $sales_delivery_order->convert_to_invoice(item_filter => \&delivery_order_item_filter, queue_sort => 1) || die $db->error;
# $delivery_order->post_save_sanity_check; # just a hint at e8521eee (#90 od)
$invoice = $sales_delivery_order->convert_to_invoice(sub { $data->{transdate} ? ('attributes' => { transdate => $data->{transdate} }) :
undef }->() ) || die $db->error;
1;
})) {
die $db->error;
......
sub print_pdfs {
my ($self) = @_;
my $job_obj = $self->{job_obj};
my $data = $job_obj->data_as_hash;
my $printer_id = $data->{printer_id};
my $job_obj = $self->{job_obj};
my $data = $job_obj->data_as_hash;
my $printer_id = $data->{printer_id};
my $copy_printer_id = $data->{copy_printer_id};
return if !$printer_id;
my $printer = SL::DB::Printer->new(id => $printer_id)->load;
my $command = SL::Template::create(type => 'ShellCommand', form => Form->new(''))->parse($printer->printer_command);
my $out;
if (!open $out, '|-', $command) {
push @{ $data->{print_errors} }, { message => $::locale->text('Could not execute printer command: #1', $!) };
$job_obj->update_attributes(data_as_hash => $data);
return;
foreach my $local_printer_id ($printer_id, $copy_printer_id) {
next unless $local_printer_id;
my $printer = SL::DB::Printer->new(id => $local_printer_id)->load;
my $command = SL::Template::create(type => 'ShellCommand', form => Form->new(''))->parse($printer->printer_command);
if (!open $out, '|-', $command) {
push @{ $data->{print_errors} }, { message => $::locale->text('Could not execute printer command: #1', $!) };
$job_obj->update_attributes(data_as_hash => $data);
return;
}
binmode $out;
print $out $self->{merged_pdf};
close $out;
}
binmode $out;
print $out $self->{merged_pdf};
close $out;
}
sub run {
......
)->set_data(
record_ids => [ map { $_->id } @records[0..$num - 1] ],
printer_id => $::form->{printer_id},
copy_printer_id => $::form->{copy_printer_id},
transdate => $::form->{transdate} || undef,
status => SL::BackgroundJob::MassRecordCreationAndPrinting->WAITING_FOR_EXECUTION(),
num_created => 0,
num_printed => 0,
......
Converts the source objects (DeliveryOrder) to destination objects (Invoice).
On success objects will be saved.
If param C<data->{transdate}> is set, this will be the transdate. No safety checks are done.
The original conversion from order to delivery order had a post_save_sanity_check
C<$delivery_order-E<gt>post_save_sanity_check; # just a hint at e8521eee (#90 od)>
The params of convert_to_invoice are created on the fly with a anonym sub, as a alternative check
perlsecret Enterprise ()x!!
=item C<convert_invoices_to_pdf>
......
=item C<print_pdfs>
Sent the pdf to the printer command (if checked).
Sent the pdf to the printer command.
If param C<data->{copy_printer_id}> is set, the pdf will be sent to a second printer command.
=back
......
Currently the calculation from the gui (form) differs from the calculation via convert (PTC).
Furthermore mass conversion with foreign currencies could lead to problems (daily rate check).
=head1 TODO
It would be great to extend this Job for general background printing. The original project
code converted sales order to delivery orders (84e7c540) this could be merged in unstable.
The states should be CONVERTING_SOURCE_RECORDS, PRINTING_DESTINATION_RECORDS etc
=head1 AUTHOR
Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
SL/Controller/MassInvoiceCreatePrint.pm
use Rose::Object::MakeMethods::Generic
(
'scalar --get_set_init' => [ qw(invoice_models invoice_ids sales_delivery_order_models printers default_printer_id) ],
'scalar --get_set_init' => [ qw(invoice_models invoice_ids sales_delivery_order_models printers default_printer_id today) ],
);
__PACKAGE__->run_before('setup');
......
$self->sales_delivery_order_models->disable_plugin('paginated');
my @records = @{ $self->sales_delivery_order_models->get };
my @records = @{ $self->sales_delivery_order_models->get };
my $num = min(scalar(@records), $::form->{number_of_invoices} // scalar(@records));
my $job = SL::DB::BackgroundJob->new(
......
)->set_data(
record_ids => [ map { $_->id } @records[0..$num - 1] ],
printer_id => $::form->{printer_id},
copy_printer_id => $::form->{copy_printer_id},
transdate => $::form->{transdate},
status => SL::BackgroundJob::MassRecordCreationAndPrinting->WAITING_FOR_EXECUTION(),
num_created => 0,
num_printed => 0,
......
sub init_printers { SL::DB::Manager::Printer->get_all_sorted }
sub init_invoice_ids { [] }
sub init_today { DateTime->today_local }
sub init_sales_delivery_order_models {
my ($self) = @_;
......
Gets a list of (empty) invoice ids
=item C<init_today>
Gets the current day. Currently used in custom code.
Has to be initialised (get_set_init) and can be used as default for
a date tag like C<[% L.date_tag("transdate", SELF.today, id=transdate) %]>.
=item C<init_sales_delivery_order_models>
Calls _init_sales_delivery_order_models with a param
......
=item C<init_default_printer_id>
Gets the default printer for sales_invoices. Maybe this function is not used, but
might be useful in the next version (working in client project).
Gets the default printer for sales_invoices. Currently this function is not called, but
might be useful in the next version.Calling template code and Controller already expect a default:
C<L.select_tag("", printers, title_key="description", default=SELF.default_printer_id, id="cpa_printer_id") %]>
=item C<setup>
......
was taken from one client project (mosu) with some extra (maybe not standard compliant) customized
stuff (using cvars for extra filters and a very compressed Controller for linking (ODSalesOrder.pm)).
Filtering needs to be extended for Delivery Order Number (Natural Sort).
A second printer (copy) needs to be implemented.
Both todos are marked in the template code.
=head1 AUTHOR
js/kivi.MassInvoiceCreatePrint.js
var data = {
number_of_invoices: $('#cpa_number_of_invoices').val(),
printer_id: $('#cpa_printer_id').val()
printer_id: $('#cpa_printer_id').val(),
copy_printer_id: $('#cpa_copy_printer_id').val(),
transdate: $('#transdate').val()
};
kivi.submit_ajax_form('controller.pl?action=MassInvoiceCreatePrint/create_print_all_start', '[name^=filter\\.]', data);
};

Auch abrufbar als: Unified diff