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;
foreach my $item (@{$self->order->items_sorted}) {
$item->{new_fake_id} = join('_', 'new', Time::HiRes::gettimeofday(), int rand 1000000000000);
}
- # trigger rendering values for second row/longdescription as hidden,
- # because they are loaded only on demand. So we need to keep the values
- # from the source.
- $_->{render_second_row} = 1 for @{ $self->order->items_sorted };
- $_->{render_longdescription} = 1 for @{ $self->order->items_sorted };
+ # trigger rendering values for second row as hidden, because they
+ # are loaded only on demand. So we need to keep the values from
+ # the source.
+ $_->{render_second_row} = 1 for @{ $self->order->items_sorted };
}
$self->recalc();
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)) {
my @errors = generate_pdf($self->order, \$pdf, { format => $format,
formname => $formname,
language => $self->order->language,
+ printer_id => $printer_id,
groupitems => $groupitems });
if (scalar @errors) {
return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render;
format => $::form->{print_options}->{format},
formname => $::form->{print_options}->{formname},
language => $self->order->language,
+ printer_id => $::form->{print_options}->{printer_id},
groupitems => $::form->{print_options}->{groupitems}});
if (scalar @errors) {
return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render($self);
sub action_save_and_delivery_order {
my ($self) = @_;
- my $errors = $self->save();
-
- if (scalar @{ $errors }) {
- $self->js->flash('error', $_) foreach @{ $errors };
- return $self->js->render();
- }
-
- my $text = $self->type eq sales_order_type() ? $::locale->text('The order has been saved')
- : $self->type eq purchase_order_type() ? $::locale->text('The order has been saved')
- : $self->type eq sales_quotation_type() ? $::locale->text('The quotation has been saved')
- : $self->type eq request_quotation_type() ? $::locale->text('The rfq has been saved')
- : '';
- flash_later('info', $text);
-
- my @redirect_params = (
+ $self->save_and_redirect_to(
controller => 'oe.pl',
action => 'oe_delivery_order_from_order',
- id => $self->order->id,
);
-
- $self->redirect_to(@redirect_params);
}
# save the order and redirect to the frontend subroutine for a new
sub action_save_and_invoice {
my ($self) = @_;
- my $errors = $self->save();
-
- if (scalar @{ $errors }) {
- $self->js->flash('error', $_) foreach @{ $errors };
- return $self->js->render();
- }
-
- my $text = $self->type eq sales_order_type() ? $::locale->text('The order has been saved')
- : $self->type eq purchase_order_type() ? $::locale->text('The order has been saved')
- : $self->type eq sales_quotation_type() ? $::locale->text('The quotation has been saved')
- : $self->type eq request_quotation_type() ? $::locale->text('The rfq has been saved')
- : '';
- flash_later('info', $text);
-
- my @redirect_params = (
+ $self->save_and_redirect_to(
controller => 'oe.pl',
action => 'oe_invoice_from_order',
- id => $self->order->id,
);
-
- $self->redirect_to(@redirect_params);
}
# workflow from sales quotation to sales order
sub action_save_and_ap_transaction {
my ($self) = @_;
- my $errors = $self->save();
-
- if (scalar @{ $errors }) {
- $self->js->flash('error', $_) foreach @{ $errors };
- return $self->js->render();
- }
-
- my $text = $self->type eq sales_order_type() ? $::locale->text('The order has been saved')
- : $self->type eq purchase_order_type() ? $::locale->text('The order has been saved')
- : $self->type eq sales_quotation_type() ? $::locale->text('The quotation has been saved')
- : $self->type eq request_quotation_type() ? $::locale->text('The rfq has been saved')
- : '';
- flash_later('info', $text);
-
- my @redirect_params = (
+ $self->save_and_redirect_to(
controller => 'ap.pl',
action => 'add_from_purchase_order',
- id => $self->order->id,
);
-
- $self->redirect_to(@redirect_params);
}
# set form elements in respect to a changed customer or vendor
$self->render_price_dialog($item);
}
-# get the longdescription for an item if the dialog to enter/change the
-# longdescription was opened and the longdescription is empty
-#
-# If this item is new, get the longdescription from Part.
-# Otherwise get it from OrderItem.
-sub action_get_item_longdescription {
- my $longdescription;
-
- if ($::form->{item_id}) {
- $longdescription = SL::DB::OrderItem->new(id => $::form->{item_id})->load->longdescription;
- } elsif ($::form->{parts_id}) {
- $longdescription = SL::DB::Part->new(id => $::form->{parts_id})->load->notes;
- }
- $_[0]->render(\ $longdescription, { type => 'text' });
-}
-
# load the second row for one or more items
#
# This action gets the html code for all items second rows by rendering a template for
my ($self) = @_;
foreach my $item_id (@{ $::form->{item_ids} }) {
- my $idx = first_index { $_ eq $item_id } @{ $::form->{orderitem_ids} };
- my $item = $self->order->items_sorted->[$idx];
+ my $idx = first_index { $_ eq $item_id } @{ $::form->{orderitem_ids} };
+ my $item = $self->order->items_sorted->[$idx];
+ my $texts = get_part_texts($item->part, $self->order->language_id);
- $item->description($item->part->description);
- $item->longdescription($item->part->notes);
+ $item->description($texts->{description});
+ $item->longdescription($texts->{longdescription});
my $price_source = SL::PriceSource->new(record_item => $item, record => $self->order);
$item ||= SL::DB::OrderItem->new(custom_variables => []);
$item->assign_attributes(%$attr);
- $item->longdescription($item->part->notes) if $is_new && !defined $attr->{longdescription};
- $item->project_id($record->globalproject_id) if $is_new && !defined $attr->{project_id};
- $item->lastcost($record->is_sales ? $item->part->lastcost : 0) if $is_new && !defined $attr->{lastcost_as_number};
+
+ if ($is_new) {
+ my $texts = get_part_texts($item->part, $record->language_id);
+ $item->longdescription($texts->{longdescription}) if !defined $attr->{longdescription};
+ $item->project_id($record->globalproject_id) if !defined $attr->{project_id};
+ $item->lastcost($record->is_sales ? $item->part->lastcost : 0) if !defined $attr->{lastcost_as_number};
+ }
return $item;
}
# saved. Adding empty custom_variables to new orderitem here solves this problem.
$new_attr{custom_variables} = [];
- $item->assign_attributes(%new_attr);
+ my $texts = get_part_texts($part, $record->language_id, description => $new_attr{description}, longdescription => $new_attr{longdescription});
+
+ $item->assign_attributes(%new_attr, %{ $texts });
return $item;
}
$self->get_unalterable_data();
$self->pre_render();
- # trigger rendering values for second row/longdescription as hidden,
- # because they are loaded only on demand. So we need to keep the values
- # from the source.
- $_->{render_second_row} = 1 for @{ $self->order->items_sorted };
- $_->{render_longdescription} = 1 for @{ $self->order->items_sorted };
+ # trigger rendering values for second row as hidden, because they
+ # are loaded only on demand. So we need to keep the values from the
+ # source.
+ $_->{render_second_row} = 1 for @{ $self->order->items_sorted };
$self->render(
'order/form',
$print_form->{format} = $params->{format} || 'pdf';
$print_form->{media} = $params->{media} || 'file';
$print_form->{groupitems} = $params->{groupitems};
+ $print_form->{printer_id} = $params->{printer_id};
$print_form->{media} = 'file' if $print_form->{media} eq 'screen';
$order->language($params->{language});
extension => $template_ext,
email => $print_form->{media} eq 'email',
language => $params->{language},
- printer_id => $print_form->{printer_id}, # todo
+ printer_id => $print_form->{printer_id},
);
if (!defined $template_file) {
}
}
+sub get_part_texts {
+ my ($part_or_id, $language_or_id, %defaults) = @_;
+
+ my $part = ref($part_or_id) ? $part_or_id : SL::DB::Part->load_cached($part_or_id);
+ my $language_id = ref($language_or_id) ? $language_or_id->id : $language_or_id;
+ my $texts = {
+ description => $defaults{description} // $part->description,
+ longdescription => $defaults{longdescription} // $part->notes,
+ };
+
+ return $texts unless $language_id;
+
+ my $translation = SL::DB::Manager::Translation->get_first(
+ where => [
+ parts_id => $part->id,
+ language_id => $language_id,
+ ]);
+
+ $texts->{description} = $translation->translation if $translation && $translation->translation;
+ $texts->{longdescription} = $translation->longdescription if $translation && $translation->longdescription;
+
+ return $texts;
+}
+
sub sales_order_type {
'sales_order';
}
: '';
}
+sub save_and_redirect_to {
+ my ($self, %params) = @_;
+
+ my $errors = $self->save();
+
+ if (scalar @{ $errors }) {
+ $self->js->flash('error', $_) foreach @{ $errors };
+ return $self->js->render();
+ }
+
+ my $text = $self->type eq sales_order_type() ? $::locale->text('The order has been saved')
+ : $self->type eq purchase_order_type() ? $::locale->text('The order has been saved')
+ : $self->type eq sales_quotation_type() ? $::locale->text('The quotation has been saved')
+ : $self->type eq request_quotation_type() ? $::locale->text('The rfq has been saved')
+ : '';
+ flash_later('info', $text);
+
+ $self->redirect_to(%params, id => $self->order->id);
+}
+
1;
__END__
=item * check for direct delivery (workflow sales order -> purchase order)
-=item * language / part translations
-
=item * access rights
=item * display weights
=item *
-Possibility to change longdescription in input row?
-
-=item *
-
Possibility to select PriceSources in input row?
=item *