Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision a3e18a2a

Von Tamino Steinert vor fast 2 Jahren hinzugefügt

  • ID a3e18a2af56576508d36eaf9fd53130c13a18706
  • Vorgänger 89ea5dd6
  • Nachfolger 8761a99f

Model::Record: update_for_save_as_new implementiert

Unterschiede anzeigen:

SL/Controller/DeliveryOrder.pm
13 13
use SL::Webdav;
14 14
use SL::File;
15 15
use SL::MIME;
16
use SL::Util qw(trim);
17 16
use SL::YAML;
18 17
use SL::DB::History;
19 18
use SL::DB::Order;
......
240 239
    return $self->js->render();
241 240
  }
242 241

  
243
  # load order from db to check if values changed
244 242
  my $saved_order = SL::DB::DeliveryOrder->new(id => $order->id)->load;
245 243

  
246
  my %new_attrs;
247
  # Lets assign a new number if the user hasn't changed the previous one.
248
  # If it has been changed manually then use it as-is.
249
  $new_attrs{number}    = (trim($order->number) eq $saved_order->number)
250
                        ? ''
251
                        : trim($order->number);
252

  
253
  # Clear transdate unless changed
254
  $new_attrs{transdate} = ($order->transdate == $saved_order->transdate)
255
                        ? DateTime->today_local
256
                        : $order->transdate;
257

  
258
  # Set new reqdate unless changed if it is enabled in client config
259
  $new_attrs{reqdate} = $self->type_data->get_reqdate_by_type($order->reqdate, $saved_order->reqdate);
260

  
261
  # Update employee
262
  $new_attrs{employee}  = SL::DB::Manager::Employee->current;
263

  
264 244
  # Create new record from current one
265
  $self->order(SL::DB::DeliveryOrder->new_from($order, destination_type => $order->type, attributes => \%new_attrs));
245
  my $updated_order = SL::Model::Record->update_for_save_as_new($saved_order, $order);
246

  
247
  $self->order($updated_order);
266 248

  
267 249
  # no linked records on save as new
268 250
  delete $::form->{$_} for qw(converted_from_oe_id converted_from_orderitems_ids);
SL/Controller/Order.pm
273 273
    return $self->js->render();
274 274
  }
275 275

  
276
  # load order from db to check if values changed
277 276
  my $saved_order = SL::DB::Order->new(id => $order->id)->load;
278 277

  
279
  my %new_attrs;
280
  # Lets assign a new number if the user hasn't changed the previous one.
281
  # If it has been changed manually then use it as-is.
282
  $new_attrs{number}    = (trim($order->number) eq $saved_order->number)
283
                        ? ''
284
                        : trim($order->number);
285

  
286
  # Clear transdate unless changed
287
  $new_attrs{transdate} = ($order->transdate == $saved_order->transdate)
288
                        ? DateTime->today_local
289
                        : $order->transdate;
290

  
291
  # Set new reqdate unless changed if it is enabled in client config
292
  if ($order->reqdate == $saved_order->reqdate) {
293
    my $extra_days = $self->type eq sales_quotation_type() ? $::instance_conf->get_reqdate_interval       :
294
                     $self->type eq sales_order_type()     ? $::instance_conf->get_delivery_date_interval : 1;
295

  
296
    if (   ($self->type eq sales_order_type()     &&  !$::instance_conf->get_deliverydate_on)
297
        || ($self->type eq sales_quotation_type() &&  !$::instance_conf->get_reqdate_on)) {
298
      $new_attrs{reqdate} = '';
299
    } else {
300
      $new_attrs{reqdate} = DateTime->today_local->next_workday(extra_days => $extra_days);
301
    }
302
  } else {
303
    $new_attrs{reqdate} = $order->reqdate;
304
  }
305

  
306
  # Update employee
307
  $new_attrs{employee}  = SL::DB::Manager::Employee->current;
308

  
309
  # Warn on obsolete items
310
  my @obsolete_positions = map { $_->position } grep { $_->part->obsolete } @{ $order->items_sorted };
311
  flash_later('warning', t8('This record containts obsolete items at position #1', join ', ', @obsolete_positions)) if @obsolete_positions;
312

  
313 278
  # Create new record from current one
314
  $self->order(SL::DB::Order->new_from($order, destination_type => $order->type, attributes => \%new_attrs));
279
  my $updated_order = SL::Model::Record->update_for_save_as_new($saved_order, $order);
280

  
281
  $self->order($updated_order);
315 282

  
316 283
  # no linked records on save as new
317 284
  delete $::form->{$_} for qw(converted_from_oe_id converted_from_orderitems_ids);
318 285

  
286
  # Warn on obsolete items
287
  my @obsolete_positions = map { $_->position } grep { $_->part->obsolete } @{ $self->order->items_sorted };
288
  flash_later('warning', t8('This record containts obsolete items at position #1', join ', ', @obsolete_positions)) if @obsolete_positions;
289

  
319 290
  if (!$::form->{form_validity_token}) {
320 291
    $::form->{form_validity_token} = SL::DB::ValidityToken->create(scope => SL::DB::ValidityToken::SCOPE_ORDER_SAVE())->token;
321 292
  }
SL/Controller/Reclamation.pm
14 14
use SL::Webdav;
15 15
use SL::File;
16 16
use SL::MIME;
17
use SL::Util qw(trim);
18 17
use SL::YAML;
19 18
use SL::DB::History;
20 19
use SL::DB::Reclamation;
......
311 310
    return $self->js->render();
312 311
  }
313 312

  
314
  # load reclamation from db to check if values changed
315 313
  my $saved_reclamation = SL::DB::Reclamation->new(id => $reclamation->id)->load;
316 314

  
317
  my %new_attrs;
318
  # If it has been changed manually then use it as-is, otherwise change.
319
  $new_attrs{record_number} = (trim($reclamation->record_number) eq $saved_reclamation->record_number)
320
                            ? ''
321
                            : trim($reclamation->record_number);
322
  $new_attrs{transdate} = ($reclamation->transdate == $saved_reclamation->transdate)
323
                        ? DateTime->today_local
324
                        : $reclamation->transdate;
325
  if ($reclamation->reqdate == $saved_reclamation->reqdate) {
326
    $new_attrs{reqdate} = '';
327
  } else {
328
    $new_attrs{reqdate} = $reclamation->reqdate;
329
  }
330

  
331
  # Update employee
332
  $new_attrs{employee}  = SL::DB::Manager::Employee->current;
333

  
334 315
  # Create new record from current one
335
  $self->reclamation(
336
           SL::DB::Reclamation->new_from(
337
             $reclamation,
338
             destination_type   => $reclamation->type,
339
             attributes         => \%new_attrs,
340
             no_linked_records => 1,
341
           )
342
         );
316
  my $new_reclamation = SL::Model::Record->update_for_save_as_new($saved_reclamation, $reclamation);
317
  $self->reclamation($new_reclamation);
343 318

  
344 319
  if (!$::form->{form_validity_token}) {
345 320
    $::form->{form_validity_token} = SL::DB::ValidityToken->create(scope => SL::DB::ValidityToken::SCOPE_RECLAMATION_SAVE())->token;
SL/DB/Reclamation.pm
281 281
    closed    => 0,
282 282
    delivered => 0,
283 283
    transdate => DateTime->today_local,
284
    reqdate => DateTime->today_local->next_workday(),
285 284
  );
286 285
  if ( $is_abbr_any->(qw(srsr prpr srpr prsr)) ) { #Reclamation
287 286
    map { $record_args{$_} = $source->$_ } # {{{ for vim folds
......
301 300
      netamount
302 301
      notes
303 302
      payment_id
303
      reqdate
304 304
      salesman_id
305 305
      shippingpoint
306 306
      shipvia
SL/Model/Record.pm
12 12
use SL::DB::Status;
13 13
use SL::DB::ValidityToken;
14 14

  
15
use SL::Util qw(trim);
15 16
use SL::Locale::String qw(t8);
16 17

  
17 18
sub new {
......
240 241
}
241 242

  
242 243
sub update_for_save_as_new {
243
  my ($class, $record, %params) = @_;
244
  my ($class, $saved_record, $changed_record, %params) = @_;
244 245

  
245 246
  # der übergebene beleg wurde mit new_from erstellt und muss nachbearbeitet werden:
246 247
  # - transadte, reqdate müssen überschrieben werden
247 248
  # - number muss überschrieben werden
248 249
  # - employee auf aktuellen setzen
249 250

  
251
  my $type_info = {
252
    # order
253
    sales_quotation => {
254
      get_new_reqdate => sub {
255
        if ($::instance_conf->get_reqdate_on) {
256
          return '';
257
        } else {
258
          return DateTime->today_local->next_workday(
259
            extra_days => $::instance_conf->get_reqdate_interval());
260
        }
261
      },
262
    },
263
    sales_order => {
264
      get_new_reqdate => sub {
265
        if ($::instance_conf->get_deliverydate_on) {
266
          return '';
267
        } else {
268
          return DateTime->today_local->next_workday(
269
            extra_days => $::instance_conf->get_delivery_date_interval());
270
        }
271
      },
272
    },
273
    request_quotation => {
274
      get_new_reqdate => sub { DateTime->today_local->next_workday(extra_days => 1); },
275
    },
276
    purchase_order => {
277
      get_new_reqdate => sub { DateTime->today_local->next_workday(extra_days => 1); },
278
    },
279
    # delivery_order
280
    rma_delivery_order => {
281
      get_new_reqdate => sub {
282
        DateTime->today_local->next_workday(extra_days => 1);
283
      },
284
    },
285
    sales_delivery_order => {
286
      get_new_reqdate => sub {
287
        DateTime->today_local->next_workday(extra_days => 1);
288
      },
289
    },
290
    supplier_delivery_order => {
291
      get_new_reqdate => sub {
292
        DateTime->today_local->next_workday(extra_days => 1);
293
      },
294
    },
295
    purchase_delivery_order => {
296
      get_new_reqdate => sub {
297
        DateTime->today_local->next_workday(extra_days => 1);
298
      },
299
    },
300
    # reclamation
301
    sales_reclamation => {
302
      get_new_reqdate => sub {
303
        '';
304
      },
305
    },
306
    purchase_reclamation => {
307
      get_new_reqdate => sub {
308
        '';
309
      },
310
    },
311
  };
312

  
313
  # changed_record
314
  my %new_attrs;
315
  # Lets assign a new number if the user hasn't changed the previous one.
316
  # If it has been changed manually then use it as-is.
317
  $new_attrs{number}    = (trim($changed_record->number) eq $saved_record->number)
318
                        ? ''
319
                        : trim($changed_record->number);
320

  
321
  # Clear transdate unless changed
322
  $new_attrs{transdate} = ($changed_record->transdate == $saved_record->transdate)
323
                        ? DateTime->today_local
324
                        : $changed_record->transdate;
325

  
326
  # Set new reqdate unless changed if it is enabled in client config
327
  if ($changed_record->reqdate == $saved_record->reqdate) {
328
      $new_attrs{reqdate} = $type_info->{$saved_record->type}->{get_new_reqdate}->();
329
  }
330

  
331
  # Update employee
332
  $new_attrs{employee}  = SL::DB::Manager::Employee->current;
333

  
334

  
335
  my $new_record = SL::Model::Record->new_from_workflow($changed_record, $saved_record->type, no_linked_records => 1, attributes => \%new_attrs);
336

  
250 337
  # return: nichts
251 338
  # fehler: exception
339
  return $new_record;
252 340
}
253 341

  
254 342

  
......
292 380
=head1 AUTHORS
293 381

  
294 382
Bernd Bleßmann E<lt>bernd@kivitendo-premium.deE<gt>
383
Tamino Steinert E<lt>tamino.steinert@tamino.stE<gt>
295 384
...
296 385

  
297 386
=cut

Auch abrufbar als: Unified diff