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
159 failure. The whole process is run inside a transaction. On failure
160 nothing is created or changed in the database.
162 At the moment only sales quotations and sales orders can be converted.
164 =item C<create_sales_process>
166 Creates and saves a new sales process. Can only be called for sales
169 The newly created process will be linked bidirectionally to both
170 C<$self> and to all sales quotations that are linked to C<$self>.
172 Returns the newly created process instance.
182 Sven Schöling <s.schoeling@linet-services.de>