},
);
-SL::DB::Helper::Attr::make(__PACKAGE__, exchangerate => 'numeric');
+SL::DB::Helper::Attr::make(__PACKAGE__, daily_exchangerate => 'numeric');
__PACKAGE__->meta->initialize;
__PACKAGE__->attr_sorted('items');
__PACKAGE__->before_save('_before_save_set_ord_quo_number');
+__PACKAGE__->before_save('_before_save_create_new_project');
+__PACKAGE__->before_save('_before_save_remove_empty_custom_shipto');
+__PACKAGE__->before_save('_before_save_set_custom_shipto_module');
# hooks
return 1;
}
+sub _before_save_create_new_project {
+ my ($self) = @_;
+
+ # force new project, if not set yet
+ if ($::instance_conf->get_order_always_project && !$self->globalproject_id && ($self->type eq 'sales_order')) {
+
+ die t8("Error while creating project with project number of new order number, project number #1 already exists!", $self->ordnumber)
+ if SL::DB::Manager::Project->find_by(projectnumber => $self->ordnumber);
+
+ eval {
+ my $new_project = SL::DB::Project->new(
+ projectnumber => $self->ordnumber,
+ description => $self->customer->name,
+ customer_id => $self->customer->id,
+ active => 1,
+ project_type_id => $::instance_conf->get_project_type_id,
+ project_status_id => $::instance_conf->get_project_status_id,
+ );
+ $new_project->save;
+ $self->globalproject_id($new_project->id);
+ } or die t8('Could not create new project #1', $@);
+ }
+ return 1;
+}
+
+
+sub _before_save_remove_empty_custom_shipto {
+ my ($self) = @_;
+
+ $self->custom_shipto(undef) if $self->custom_shipto && $self->custom_shipto->is_empty;
+
+ return 1;
+}
+
+sub _before_save_set_custom_shipto_module {
+ my ($self) = @_;
+
+ $self->custom_shipto->module('OE') if $self->custom_shipto;
+
+ return 1;
+}
# methods
return !!shift->customer_id;
}
-sub exchangerate {
+sub daily_exchangerate {
my ($self, $val) = @_;
return 1 if $self->currency_id == $::instance_conf->get_currency_id;
- # unable to determine if sales or purchase
- return undef if !$self->has_customervendor;
-
- my $rate = $self->is_sales ? 'buy' : 'sell';
+ my $rate = (any { $self->is_type($_) } qw(sales_quotation sales_order)) ? 'buy'
+ : (any { $self->is_type($_) } qw(request_quotation purchase_order)) ? 'sell'
+ : undef;
+ return if !$rate;
if (defined $val) {
croak t8('exchange rate has to be positive') if $val <= 0;
}
my %args = ( map({ ( $_ => $source->$_ ) } qw(amount cp_id currency_id cusordnumber customer_id delivery_customer_id delivery_term_id delivery_vendor_id
- department_id employee_id globalproject_id intnotes marge_percent marge_total language_id netamount notes
+ department_id employee_id exchangerate globalproject_id intnotes marge_percent marge_total language_id netamount notes
ordnumber payment_id quonumber reqdate salesman_id shippingpoint shipvia taxincluded taxzone_id
transaction_description vendor_id
)),
if ( $is_abbr_any->(qw(sopo poso)) ) {
$args{ordnumber} = undef;
+ $args{quonumber} = undef;
$args{reqdate} = DateTime->today_local->next_workday();
$args{employee} = SL::DB::Manager::Employee->current;
}
}
foreach my $attr (qw(cp_id currency_id employee_id salesman_id department_id
delivery_customer_id delivery_vendor_id shipto_id
- globalproject_id)) {
+ globalproject_id exchangerate)) {
$attributes{$attr} = undef if any { ($sources->[0]->$attr||0) != ($_->$attr||0) } @$sources;
}
Returns true if the order is of the given type.
+=head2 C<daily_exchangerate $val>
+
+Gets or sets the exchangerate object's value. This is the value from the
+table C<exchangerate> depending on the order's currency, the transdate and
+if it is a sales or purchase order.
+
+The order object (respectively the table C<oe>) has an own column
+C<exchangerate> which can be get or set with the accessor C<exchangerate>.
+
+The idea is to drop the legacy table C<exchangerate> in the future and to
+give all relevant tables it's own C<exchangerate> column.
+
+So, this method is here if you need to access the "legacy" exchangerate via
+an order object.
+
+=over 4
+
+=item C<$val>
+
+(optional) If given, the exchangerate in the "legacy" table is set to this
+value, depending on currency, transdate and sales or purchase.
+
+=back
+
=head2 C<convert_to_delivery_order %params>
Creates a new delivery order with C<$self> as the basis by calling