neue Methode items_sorted für Order, DeliveryOrder, Invoice, PurchaseInvoice
[kivitendo-erp.git] / SL / DB / Order.pm
index 25c3788..f4ca003 100644 (file)
@@ -10,8 +10,10 @@ use List::Util qw(max);
 use SL::DB::MetaSetup::Order;
 use SL::DB::Manager::Order;
 use SL::DB::Invoice;
 use SL::DB::MetaSetup::Order;
 use SL::DB::Manager::Order;
 use SL::DB::Invoice;
+use SL::DB::Helper::FlattenToForm;
 use SL::DB::Helper::LinkedRecords;
 use SL::DB::Helper::PriceTaxCalculator;
 use SL::DB::Helper::LinkedRecords;
 use SL::DB::Helper::PriceTaxCalculator;
+use SL::DB::Helper::PriceUpdater;
 use SL::DB::Helper::TransNumberGenerator;
 use SL::RecordLinks;
 
 use SL::DB::Helper::TransNumberGenerator;
 use SL::RecordLinks;
 
@@ -29,16 +31,6 @@ __PACKAGE__->meta->add_relationship(
     class                  => 'SL::DB::PeriodicInvoicesConfig',
     column_map             => { id => 'oe_id' },
   },
     class                  => 'SL::DB::PeriodicInvoicesConfig',
     column_map             => { id => 'oe_id' },
   },
-  periodic_invoices        => {
-    type                   => 'one to many',
-    class                  => 'SL::DB::PeriodicInvoice',
-    column_map             => { id => 'oe_id' },
-  },
-  payment_term => {
-    type       => 'one to one',
-    class      => 'SL::DB::PaymentTerm',
-    column_map => { payment_id => 'id' },
-  },
 );
 
 __PACKAGE__->meta->initialize;
 );
 
 __PACKAGE__->meta->initialize;
@@ -47,6 +39,13 @@ __PACKAGE__->meta->initialize;
 
 sub items { goto &orderitems; }
 
 
 sub items { goto &orderitems; }
 
+sub items_sorted {
+  my ($self) = @_;
+
+  my @sorted =  sort {$a->id <=> $b->id } @{ $self->items };
+  return wantarray ? @sorted : \@sorted;
+}
+
 sub type {
   my $self = shift;
 
 sub type {
   my $self = shift;
 
@@ -62,6 +61,23 @@ sub is_type {
   return shift->type eq shift;
 }
 
   return shift->type eq shift;
 }
 
+sub displayable_type {
+  my $type = shift->type;
+
+  return $::locale->text('Sales quotation')   if $type eq 'sales_quotation';
+  return $::locale->text('Request quotation') if $type eq 'request_quotation';
+  return $::locale->text('Sales Order')       if $type eq 'sales_order';
+  return $::locale->text('Purchase Order')    if $type eq 'purchase_order';
+
+  die 'invalid type';
+}
+
+
+sub is_sales {
+  croak 'not an accessor' if @_ > 1;
+  return !!shift->customer_id;
+}
+
 sub invoices {
   my $self   = shift;
   my %params = @_;
 sub invoices {
   my $self   = shift;
   my %params = @_;
@@ -78,6 +94,12 @@ sub invoices {
   }
 }
 
   }
 }
 
+sub displayable_state {
+  my ($self) = @_;
+
+  return $self->closed ? $::locale->text('closed') : $::locale->text('open');
+}
+
 sub abschlag_invoices {
   return shift()->invoices(query => [ abschlag => 1 ]);
 }
 sub abschlag_invoices {
   return shift()->invoices(query => [ abschlag => 1 ]);
 }
@@ -91,14 +113,6 @@ sub convert_to_invoice {
 
   croak("Conversion to invoices is only supported for sales records") unless $self->customer_id;
 
 
   croak("Conversion to invoices is only supported for sales records") unless $self->customer_id;
 
-  if (!$params{ar_id}) {
-    my $chart = SL::DB::Manager::Chart->get_all(query   => [ SL::DB::Manager::Chart->link_filter('AR') ],
-                                                sort_by => 'id ASC',
-                                                limit   => 1)->[0];
-    croak("No AR chart found and no parameter `ar_id' given") unless $chart;
-    $params{ar_id} = $chart->id;
-  }
-
   my $invoice;
   if (!$self->db->do_transaction(sub {
     $invoice = SL::DB::Invoice->new_from($self)->post(%params) || die;
   my $invoice;
   if (!$self->db->do_transaction(sub {
     $invoice = SL::DB::Invoice->new_from($self)->post(%params) || die;
@@ -112,6 +126,23 @@ sub convert_to_invoice {
   return $invoice;
 }
 
   return $invoice;
 }
 
+sub number {
+  my $self = shift;
+
+  my %number_method = (
+    sales_order       => 'ordnumber',
+    sales_quotation   => 'quonumber',
+    purchase_order    => 'ordnumber',
+    request_quotation => 'quonumber',
+  );
+
+  return $self->${ \ $number_method{$self->type} }(@_);
+}
+
+sub date {
+  goto &transdate;
+}
+
 1;
 
 __END__
 1;
 
 __END__
@@ -122,13 +153,13 @@ SL::DB::Order - Order Datenbank Objekt.
 
 =head1 FUNCTIONS
 
 
 =head1 FUNCTIONS
 
-=head2 type
+=head2 C<type>
 
 Returns one of the following string types:
 
 =over 4
 
 
 Returns one of the following string types:
 
 =over 4
 
-=item saes_order
+=item sales_order
 
 =item purchase_order
 
 
 =item purchase_order
 
@@ -138,28 +169,34 @@ Returns one of the following string types:
 
 =back
 
 
 =back
 
-=head2 is_type TYPE
+=head2 C<is_type TYPE>
 
 
-Rreturns true if the order is of the given type.
+Returns true if the order is of the given type.
 
 
-=item C<convert_to_invoice %params>
+=head2 C<convert_to_invoice %params>
 
 Creates a new invoice with C<$self> as the basis by calling
 L<SL::DB::Invoice::new_from>. That invoice is posted, and C<$self> is
 linked to the new invoice via L<SL::DB::RecordLink>. C<$self>'s
 C<closed> attribute is set to C<true>, and C<$self> is saved.
 
 
 Creates a new invoice with C<$self> as the basis by calling
 L<SL::DB::Invoice::new_from>. That invoice is posted, and C<$self> is
 linked to the new invoice via L<SL::DB::RecordLink>. C<$self>'s
 C<closed> attribute is set to C<true>, and C<$self> is saved.
 
-The arguments in C<%params> are passed to
-L<SL::DB::Invoice::post>. One parameter of note is
-C<$paras{ar_id}>. If set it must be the ID of the accounts receivables
-chart to post to. If it is not set then the first chart configured for
-accounts receivables is used.
+The arguments in C<%params> are passed to L<SL::DB::Invoice::post>.
 
 
-Returns the new invoice instance on success and C<undef> on failure.
+Returns the new invoice instance on success and C<undef> on
+failure. The whole process is run inside a transaction. On failure
+nothing is created or changed in the database.
 
 At the moment only sales quotations and sales orders can be converted.
 
 
 At the moment only sales quotations and sales orders can be converted.
 
-=back
+=head2 C<create_sales_process>
+
+Creates and saves a new sales process. Can only be called for sales
+orders.
+
+The newly created process will be linked bidirectionally to both
+C<$self> and to all sales quotations that are linked to C<$self>.
+
+Returns the newly created process instance.
 
 =head1 BUGS
 
 
 =head1 BUGS