Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 7664f50f

Von Moritz Bunkus vor mehr als 10 Jahren hinzugefügt

  • ID 7664f50fac4a789932317d0e0d35e15bc2d7d1c4
  • Vorgänger 284470c1
  • Nachfolger c50f0950

SL::DB::Order, DeliveryOrder: Funktionen zum Umwandeln von Order in DeliveryOrder

Unterschiede anzeigen:

SL/DB/DeliveryOrder.pm
74 74
  goto &transdate;
75 75
}
76 76

  
77
sub new_from {
78
  my ($class, $source, %params) = @_;
79

  
80
  croak("Unsupported source object type '" . ref($source) . "'") unless ref($source) eq 'SL::DB::Order';
81

  
82
  my $terms = $source->can('payment_id') && $source->payment_id ? $source->payment_terms->terms_netto : 0;
83

  
84
  my %args = ( map({ ( $_ => $source->$_ ) } qw(cp_id currency_id customer_id cusordnumber department_id employee_id globalproject_id intnotes language_id notes
85
                                                ordnumber reqdate salesman_id shippingpoint shipvia taxincluded taxzone_id transaction_description vendor_id
86
                                             )),
87
               closed    => 0,
88
               is_sales  => !!$source->customer_id,
89
               delivered => 0,
90
               terms     => $terms,
91
               transdate => DateTime->today_local,
92
            );
93

  
94
  # Custom shipto addresses (the ones specific to the sales/purchase
95
  # record and not to the customer/vendor) are only linked from
96
  # shipto -> delivery_orders. Meaning delivery_orders.shipto_id
97
  # will not be filled in that case. Therefore we have to return the
98
  # new shipto object as a separate object so that the caller can
99
  # save it, too.
100
  my $custom_shipto;
101
  if (!$source->shipto_id && $source->id) {
102
    require SL::DB::Shipto;
103

  
104
    my $old = SL::DB::Manager::Shipto->find_by(trans_id => $source->id);
105
    if ($old) {
106
      $custom_shipto = SL::DB::Shipto->new(
107
        map  { +($_ => $old->$_) }
108
        grep { !m{^ (?: itime | mtime | shipto_id | trans_id ) $}x }
109
        map  { $_->name }
110
        @{ $old->meta->columns }
111
      );
112
    }
113

  
114
  } else {
115
    $args{shipto_id} = $source->shipto_id;
116
  }
117

  
118
  my $delivery_order = $class->new(%args, %params);
119

  
120
  my @items = map {
121
    my $source_item = $_;
122
    SL::DB::DeliveryOrderItem->new(map({ ( $_ => $source_item->$_ ) }
123
                                   qw(base_qty cusordnumber description discount lastcost longdescription marge_price_factor ordnumber parts_id price_factor price_factor_id
124
                                      project_id qty reqdate sellprice serialnumber transdate unit
125
                                   )));
126
  } @{ $source->items_sorted };
127

  
128
  $delivery_order->items(\@items);
129

  
130
  return ($delivery_order, $custom_shipto);
131
}
132

  
77 133
1;
134
__END__
135

  
136
=pod
137

  
138
=encoding utf8
139

  
140
=head1 NAME
141

  
142
SL::DB::DeliveryOrder - Rose model for delivery orders (table
143
"delivery_orders")
144

  
145
=head1 FUNCTIONS
146

  
147
=over 4
148

  
149
=item C<date>
150

  
151
An alias for L</transdate> for compatibility with other sales/purchase models.
152

  
153
=item C<displayable_state>
154

  
155
Returns a human-readable description of the state regarding being
156
closed and delivered.
157

  
158
=item C<items>
159

  
160
An alias for L</deliver_orer_items> for compatibility with other
161
sales/purchase models.
162

  
163
=item C<items_sorted>
164

  
165
Returns the delivery order items sorted by their ID (same order they
166
appear in the frontend delivery order masks).
167

  
168
=item C<new_from $source>
169

  
170
Creates a new C<SL::DB::DeliveryOrder> instance and copies as much
171
information from C<$source> as possible. At the moment only instances
172
of C<SL::DB::Order> (sales quotations, sales orders, requests for
173
quotations and purchase orders) are supported as sources.
174

  
175
The conversion copies order items into delivery order items. Dates are copied
176
as appropriate, e.g. the C<transdate> field will be set to the current date.
177

  
178
Returns one or two objects depending on the context. In list context
179
the new delivery order instance and a shipto instance will be
180
returned. In scalar instance only the delivery order instance is
181
returned.
182

  
183
Custom shipto addresses (the ones specific to the sales/purchase
184
record and not to the customer/vendor) are only linked from C<shipto>
185
to C<delivery_orders>. Meaning C<delivery_orders.shipto_id> will not
186
be filled in that case. That's why a separate shipto object is created
187
and returned.
188

  
189
The objects returned are not saved.
190

  
191
=item C<sales_order>
192

  
193
TODO: Describe sales_order
194

  
195
=item C<type>
196

  
197
Returns a stringdescribing this record's type: either
198
C<sales_delivery_order> or C<purchase_delivery_order>.
199

  
200
=back
201

  
202
=head1 BUGS
203

  
204
Nothing here yet.
205

  
206
=head1 AUTHOR
207

  
208
Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
209

  
210
=cut
SL/DB/Order.pm
142 142
  return $invoice;
143 143
}
144 144

  
145
sub convert_to_delivery_order {
146
  my ($self, %params) = @_;
147

  
148
  my ($delivery_order, $custom_shipto);
149
  if (!$self->db->do_transaction(sub {
150
    require SL::DB::DeliveryOrder;
151
    ($delivery_order, $custom_shipto) = SL::DB::DeliveryOrder->new_from($self);
152
    $delivery_order->save;
153
    $custom_shipto->save if $custom_shipto;
154
    $self->link_to_record($delivery_order);
155
    # die;
156
  })) {
157
    return undef;
158
  }
159

  
160
  return wantarray ? ($delivery_order, $custom_shipto) : $delivery_order;
161
}
162

  
145 163
sub number {
146 164
  my $self = shift;
147 165

  
......
189 207

  
190 208
Returns true if the order is of the given type.
191 209

  
210
=head2 C<convert_to_delivery_order %params>
211

  
212
Creates a new delivery order with C<$self> as the basis by calling
213
L<SL::DB::DeliveryOrder::new_from>. That delivery order is saved, and
214
C<$self> is linked to the new invoice via L<SL::DB::RecordLink>.
215

  
216
The arguments in C<%params> are passed to
217
L<SL::DB::DeliveryOrder::new_from>.
218

  
219
Returns C<undef> on failure. Otherwise the return value depends on the
220
context. In list context the new delivery order and a shipto instance
221
will be returned. In scalar instance only the delivery order instance
222
is returned.
223

  
224
Custom shipto addresses (the ones specific to the sales/purchase
225
record and not to the customer/vendor) are only linked from C<shipto>
226
to C<delivery_orders>. Meaning C<delivery_orders.shipto_id> will not
227
be filled in that case. That's why a separate shipto object is created
228
and returned.
229

  
192 230
=head2 C<convert_to_invoice %params>
193 231

  
194 232
Creates a new invoice with C<$self> as the basis by calling

Auch abrufbar als: Unified diff