X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/842d6c44252d2294a4b65f2212f141d9290f7100..598383b3b6b63428fcabc5fb6e5595ec59de28e3:/SL/DB/Order.pm diff --git a/SL/DB/Order.pm b/SL/DB/Order.pm index bba7fc8ef..8d7088f49 100644 --- a/SL/DB/Order.pm +++ b/SL/DB/Order.pm @@ -10,6 +10,7 @@ use List::MoreUtils qw(any); use SL::DB::MetaSetup::Order; use SL::DB::Manager::Order; +use SL::DB::Helper::Attr; use SL::DB::Helper::AttrHTML; use SL::DB::Helper::AttrSorted; use SL::DB::Helper::FlattenToForm; @@ -17,6 +18,7 @@ use SL::DB::Helper::LinkedRecords; use SL::DB::Helper::PriceTaxCalculator; use SL::DB::Helper::PriceUpdater; use SL::DB::Helper::TransNumberGenerator; +use SL::Locale::String qw(t8); use SL::RecordLinks; use Rose::DB::Object::Helpers qw(as_tree); @@ -40,8 +42,15 @@ __PACKAGE__->meta->add_relationship( column_map => { id => 'trans_id' }, query_args => [ module => 'OE' ], }, + exchangerate_obj => { + type => 'one to one', + class => 'SL::DB::Exchangerate', + column_map => { currency_id => 'currency_id', transdate => 'transdate' }, + }, ); +SL::DB::Helper::Attr::make(__PACKAGE__, daily_exchangerate => 'numeric'); + __PACKAGE__->meta->initialize; __PACKAGE__->attr_html('notes'); @@ -85,6 +94,12 @@ sub is_type { return shift->type eq shift; } +sub deliverydate { + # oe doesn't have deliverydate, but PTC checks for deliverydate or transdate to determine tax + # oe can't deal with deviating tax rates, but at least make sure PTC doesn't barf + return shift->transdate; +} + sub displayable_type { my $type = shift->type; @@ -105,6 +120,33 @@ sub is_sales { return !!shift->customer_id; } +sub daily_exchangerate { + my ($self, $val) = @_; + + return 1 if $self->currency_id == $::instance_conf->get_currency_id; + + 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; + if (!$self->exchangerate_obj) { + $self->exchangerate_obj(SL::DB::Exchangerate->new( + currency_id => $self->currency_id, + transdate => $self->transdate, + $rate => $val, + )); + } elsif (!defined $self->exchangerate_obj->$rate) { + $self->exchangerate_obj->$rate($val); + } else { + croak t8('exchange rate already exists, no update allowed'); + } + } + return $self->exchangerate_obj->$rate if $self->exchangerate_obj; +} + sub invoices { my $self = shift; my %params = @_; @@ -235,7 +277,7 @@ sub new_from { } 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 )), @@ -350,7 +392,7 @@ sub new_from_multi { } 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; } @@ -453,6 +495,30 @@ Returns one of the following string types: Returns true if the order is of the given type. +=head2 C + +Gets or sets the exchangerate object's value. This is the value from the +table C depending on the order's currency, the transdate and +if it is a sales or purchase order. + +The order object (respectively the table C) has an own column +C which can be get or set with the accessor C. + +The idea is to drop the legacy table C in the future and to +give all relevant tables it's own C 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 Creates a new delivery order with C<$self> as the basis by calling