use SL::DB::Project;
use SL::DB::Default;
use SL::DB::Unit;
+use SL::DB::Price;
use SL::Helper::DateTime;
use SL::Helper::CreatePDF qw(:all);
use List::Util qw(max first);
-use List::MoreUtils qw(none pairwise);
+use List::MoreUtils qw(none pairwise first_index);
use English qw(-no_match_vars);
use File::Spec;
$sfile->fh->print($pdf);
$sfile->fh->close;
- # get temporary session filename with stripped path
- my (undef, undef, $tmp_filename) = File::Spec->splitpath($sfile->file_name);
- my $pdf_filename = t8('Sales Order') . '_' . $self->order->ordnumber . '.pdf';
+ my $key = join('_', Time::HiRes::gettimeofday(), int rand 1000000000000);
+ $::auth->set_session_value("Order::create_pdf-${key}" => $sfile->file_name);
+
+ $::form->{formname} = $self->type;
+ $::form->{language} = 'de';
+ my $pdf_filename = $::form->get_formname_translation . '_' . $self->order->ordnumber . '.pdf';
$self->js
- ->run('download_pdf', $tmp_filename, $pdf_filename)
+ ->run('download_pdf', $pdf_filename, $key)
->flash('info', t8('The PDF has been created'))->render($self);
}
sub action_download_pdf {
my ($self) = @_;
- # given tmp_filename should contain no path, so strip if any
- my (undef, undef, $tmp_filename) = File::Spec->splitpath($::form->{tmp_filename});
- my $tmp_filename = File::Spec->catfile(SL::SessionFile->new->get_path, $tmp_filename);
+ my $key = $::form->{key};
+ my $tmp_filename = $::auth->get_session_value("Order::create_pdf-${key}");
return $self->send_file(
$tmp_filename,
type => 'application/pdf',
sub action_customer_vendor_changed {
my ($self) = @_;
- if ($self->cv eq 'customer') {
- $self->order->customer(SL::DB::Manager::Customer->find_by_or_create(id => $::form->{cv_id}));
-
- } elsif ($self->cv eq 'vendor') {
- $self->order->vendor(SL::DB::Manager::Vendor->find_by_or_create(id => $::form->{cv_id}));
- }
+ my $cv_method = $self->cv;
- if ($self->order->{$self->cv}->contacts && scalar @{ $self->order->{$self->cv}->contacts } > 0) {
+ if ($self->order->$cv_method->contacts && scalar @{ $self->order->$cv_method->contacts } > 0) {
$self->js->show('#cp_row');
} else {
$self->js->hide('#cp_row');
}
- if ($self->order->{$self->cv}->shipto && scalar @{ $self->order->{$self->cv}->shipto } > 0) {
+ if ($self->order->$cv_method->shipto && scalar @{ $self->order->$cv_method->shipto } > 0) {
$self->js->show('#shipto_row');
} else {
$self->js->hide('#shipto_row');
}
+ $self->order->taxzone_id($self->order->$cv_method->taxzone_id);
+
+ if ($self->order->is_sales) {
+ $self->order->taxincluded(defined($self->order->$cv_method->taxincluded_checked)
+ ? $self->order->$cv_method->taxincluded_checked
+ : $::myconfig{taxincluded_checked});
+ }
+
+ $self->_recalc();
+
$self->js
- ->replaceWith('#order_cp_id', $self->build_contact_select)
- ->replaceWith('#order_shipto_id', $self->build_shipto_select)
- ->val('#order_taxzone_id', $self->order->{$self->cv}->taxzone_id)
- ->focus('#order_' . $self->cv . '_id')
- ->render($self);
+ ->replaceWith('#order_cp_id', $self->build_contact_select)
+ ->replaceWith('#order_shipto_id', $self->build_shipto_select)
+ ->val( '#order_taxzone_id', $self->order->taxzone_id)
+ ->val( '#order_taxincluded', $self->order->taxincluded)
+ ->focus( '#order_' . $self->cv . '_id');
+
+ $self->_js_redisplay_amounts_and_taxes;
+ $self->js->render();
}
sub action_add_item {
my $item = SL::DB::OrderItem->new;
$item->assign_attributes(%$form_attr);
- my $part = SL::DB::Part->new(id => $form_attr->{parts_id})->load;
- my $cv_method = $self->cv;
- my $cv_discount = $self->order->$cv_method? $self->order->$cv_method->discount : 0.0;
+ my $part = SL::DB::Part->new(id => $form_attr->{parts_id})->load;
+
+ my $price_source = SL::PriceSource->new(record_item => $item, record => $self->order);
+
+ my $price_src;
+ if ($item->sellprice) {
+ $price_src = $price_source->price_from_source("");
+ $price_src->price($item->sellprice);
+ } else {
+ $price_src = $price_source->best_price
+ ? $price_source->best_price
+ : $price_source->price_from_source("");
+ $price_src->price(0) if !$price_source->best_price;
+ }
+
+ # bb: not sure but: maybe there should be a $price_source->discount_from_source
+ # which can alse return an empty_discout if source is "".
+ my $discount;
+ my $discount_src;
+ if ($item->discount) {
+ $discount = $item->discount;
+ } else {
+ $discount = $price_source->best_discount
+ ? $price_source->best_discount->discount
+ : 0;
+ $discount_src = $price_source->best_discount->source if $price_source->best_discount;
+ }
my %new_attr;
- $new_attr{part} = $part;
- $new_attr{description} = $part->description if ! $item->description;
- $new_attr{qty} = 1.0 if ! $item->qty;
- $new_attr{unit} = $part->unit;
- $new_attr{sellprice} = $part->sellprice if ! $item->sellprice;
- $new_attr{discount} = $cv_discount if ! $item->discount;
+ $new_attr{part} = $part;
+ $new_attr{description} = $part->description if ! $item->description;
+ $new_attr{qty} = 1.0 if ! $item->qty;
+ $new_attr{sellprice} = $price_src->price;
+ $new_attr{discount} = $discount;
+ $new_attr{active_price_source} = $price_src;
+ $new_attr{active_discount_source} = $discount_src;
# add_custom_variables adds cvars to an orderitem with no cvars for saving, but
# they cannot be retrieved via custom_variables until the order/orderitem is
$self->js->render();
}
+sub action_price_popup {
+ my ($self) = @_;
+
+ my $idx = first_index { $_ eq $::form->{item_id} } @{ $::form->{orderitem_ids} };
+ my $item = $self->order->items->[$idx];
+
+ $self->render_price_dialog($item);
+}
+
sub _js_redisplay_linetotals {
my ($self) = @_;
my ($self) = @_;
my $rows_as_html;
- foreach my $tax (@{ $self->{taxes} }) {
+ foreach my $tax (sort { $a->{tax}->rate cmp $b->{tax}->rate } @{ $self->{taxes} }) {
$rows_as_html .= $self->p->render('order/tabs/_tax_row', TAX => $tax, TAXINCLUDED => $self->order->taxincluded);
}
return $rows_as_html;
}
+sub render_price_dialog {
+ my ($self, $record_item) = @_;
+
+ my $price_source = SL::PriceSource->new(record_item => $record_item, record => $self->order);
+
+ $self->js
+ ->run(
+ 'kivi.io.price_chooser_dialog',
+ t8('Available Prices'),
+ $self->render('order/tabs/_price_sources_dialog', { output => 0 }, price_source => $price_source)
+ )
+ ->reinit_widgets;
+
+# if (@errors) {
+# $self->js->text('#dialog_flash_error_content', join ' ', @errors);
+# $self->js->show('#dialog_flash_error');
+# }
+
+ $self->js->render;
+}
+
sub _make_order {
my ($self) = @_;
return $order;
}
-
sub _recalc {
my ($self) = @_;
if ($item->id) {
# load data from orderitems (db)
my $db_item = SL::DB::OrderItem->new(id => $item->id)->load;
- $item->$_($db_item->$_) for qw(active_discount_source active_price_source longdescription);
+ $item->$_($db_item->$_) for qw(longdescription);
} else {
# set data from part (or other sources)
$item->longdescription($item->part->notes);
- #$item->active_price_source('');
- #$item->active_discount_source('');
}
# autovivify all cvars that are not in the form (cvars_by_config can do it).
$self->{current_employee_id} = SL::DB::Manager::Employee->current->id;
+ foreach my $item (@{$self->order->items}) {
+ my $price_source = SL::PriceSource->new(record_item => $item, record => $self->order);
+
+ my $price_src = $price_source->price_from_source($item->active_price_source);
+ $item->active_price_source($price_src);
+
+ my $discount_src;
+ $discount_src = $price_source->price_from_source($item->active_discount_source)->source if $item->active_discount_source;
+ $item->active_discount_source($discount_src);
+ }
+
$::request->{layout}->use_javascript("${_}.js") for qw(ckeditor/ckeditor ckeditor/adapters/jquery);
}
my ($order, $pdf_ref, $params) = @_;
my $print_form = Form->new('');
- $print_form->{type} = 'sales_order';
- $print_form->{formname} = 'sales_order',
+ $print_form->{type} = $order->type;
+ $print_form->{formname} = $order->type;
$print_form->{format} = $params->{format} || 'pdf',
$print_form->{media} = $params->{media} || 'file';