8 use List::Util qw(max);
10 use SL::DB::MetaSetup::Order;
11 use SL::DB::Manager::Order;
13 use SL::DB::Helper::LinkedRecords;
14 use SL::DB::Helper::PriceTaxCalculator;
15 use SL::DB::Helper::TransNumberGenerator;
18 __PACKAGE__->meta->add_relationship(
20 type => 'one to many',
21 class => 'SL::DB::OrderItem',
22 column_map => { id => 'trans_id' },
24 with_objects => [ 'part' ]
27 periodic_invoices_config => {
29 class => 'SL::DB::PeriodicInvoicesConfig',
30 column_map => { id => 'oe_id' },
32 periodic_invoices => {
33 type => 'one to many',
34 class => 'SL::DB::PeriodicInvoice',
35 column_map => { id => 'oe_id' },
39 class => 'SL::DB::PaymentTerm',
40 column_map => { payment_id => 'id' },
44 __PACKAGE__->meta->initialize;
48 sub items { goto &orderitems; }
53 return 'sales_order' if $self->customer_id && ! $self->quotation;
54 return 'purchase_order' if $self->vendor_id && ! $self->quotation;
55 return 'sales_quotation' if $self->customer_id && $self->quotation;
56 return 'request_quotation' if $self->vendor_id && $self->quotation;
62 return shift->type eq shift;
69 if ($self->quotation) {
72 return SL::DB::Manager::Invoice->get_all(
74 ordnumber => $self->ordnumber,
75 @{ $params{query} || [] },
81 sub abschlag_invoices {
82 return shift()->invoices(query => [ abschlag => 1 ]);
86 return shift()->invoices(query => [ abschlag => 0 ]);
89 sub convert_to_invoice {
90 my ($self, %params) = @_;
92 croak("Conversion to invoices is only supported for sales records") unless $self->customer_id;
94 if (!$params{ar_id}) {
95 my $chart = SL::DB::Manager::Chart->get_all(query => [ SL::DB::Manager::Chart->link_filter('AR') ],
98 croak("No AR chart found and no parameter `ar_id' given") unless $chart;
99 $params{ar_id} = $chart->id;
103 if (!$self->db->do_transaction(sub {
104 $invoice = SL::DB::Invoice->new_from($self)->post(%params) || die;
105 $self->link_to_record($invoice);
106 $self->update_attributes(closed => 1);
121 SL::DB::Order - Order Datenbank Objekt.
127 Returns one of the following string types:
135 =item sales_quotation
137 =item request_quotation
143 Rreturns true if the order is of the given type.
145 =item C<convert_to_invoice %params>
147 Creates a new invoice with C<$self> as the basis by calling
148 L<SL::DB::Invoice::new_from>. That invoice is posted, and C<$self> is
149 linked to the new invoice via L<SL::DB::RecordLink>. C<$self>'s
150 C<closed> attribute is set to C<true>, and C<$self> is saved.
152 The arguments in C<%params> are passed to
153 L<SL::DB::Invoice::post>. One parameter of note is
154 C<$paras{ar_id}>. If set it must be the ID of the accounts receivables
155 chart to post to. If it is not set then the first chart configured for
156 accounts receivables is used.
158 Returns the new invoice instance on success and C<undef> on failure.
160 At the moment only sales quotations and sales orders can be converted.
170 Sven Schöling <s.schoeling@linet-services.de>