+sub disassemble_assembly {
+ $main::lxdebug->enter_sub();
+
+ $main::auth->assert('warehouse_management');
+
+ my $form = $main::form;
+
+ croak("No assembly ids") unless scalar @{ $form->{ids}} > 0;
+
+ # fail safe, only allow disassemble in certain intervals
+ my $undo_date = DateTime->today->subtract(days => $::instance_conf->get_undo_transfer_interval);
+
+ foreach my $assembly_id (@{ $::form->{ids}} ) {
+ my $assembly_parts;
+ $assembly_parts = SL::DB::Manager::AssemblyInventoryPart->get_all(where => [ inventory_assembly_id => $assembly_id ]);
+ $form->show_generic_error(t8('No relations found for #1', $assembly_id)) unless $assembly_parts;
+ # check first entry for insertdate
+ # everything in one transaction
+ my $db = SL::DB::Inventory->new->db;
+ $db->with_transaction(sub {
+ my ($assembly_entry, $part_entry);
+ foreach my $assembly_part (@{ $assembly_parts }) {
+ die("No valid entry found") unless (ref($assembly_part) eq 'SL::DB::AssemblyInventoryPart');
+ # fail safe undo date
+ die("Invalid time interval") unless DateTime->compare($assembly_part->itime, $undo_date);
+
+ $assembly_entry //= $assembly_part->assembly;
+ $part_entry = $assembly_part->part;
+ $assembly_part->delete;
+ $part_entry->delete;
+ }
+ flash_later('info', t8("Disassembly successful for #1", $assembly_entry->part->partnumber));
+
+ $assembly_entry->delete;
+
+ 1;
+
+ }) || die t8('error while disassembling assembly #1 : #2', $assembly_id) . $db->error . "\n";
+
+ }
+ $main::lxdebug->leave_sub();
+ $form->redirect;
+}
+