Projekt

Allgemein

Profil

Herunterladen (1,78 KB) Statistiken
| Zweig: | Markierung: | Revision:
package SL::DB::Helper::ValidateAssembly;

use strict;
use parent qw(Exporter);
our @EXPORT = qw(validate_assembly);

use SL::Locale::String;
use SL::DB::Part;
use SL::DB::Assembly;

sub validate_assembly {
my ($new_part, $part) = @_;

return t8("The assembly '#1' cannot be a part from itself.", $part->partnumber) if $new_part->id == $part->id;

my @seen = ($part->id);

return assembly_loop_exists(0, $new_part, @seen);
}

sub assembly_loop_exists {
my ($depth, $new_part, @seen) = @_;

return t8("Too much recursions in assembly tree (>100)") if $depth > 100;

# 1. check part is an assembly
return unless $new_part->is_assembly;

# 2. check assembly is still in list
return t8("The assembly '#1' would make a loop in assembly tree.", $new_part->partnumber) if grep { $_ == $new_part->id } @seen;

# 3. add to new list

push @seen, $new_part->id;

# 4. go into depth for each child

foreach my $assembly ($new_part->assemblies) {
my $retval = assembly_loop_exists($depth + 1, $assembly->part, @seen);
return $retval if $retval;
}
return undef;
}

1;

__END__

=encoding utf-8

=head1 NAME

SL::DB::Helper::ValidateAssembly - Mixin to check loops in assemblies

=head1 SYNOPSIS

SL::DB::Helper::ValidateAssembly->validate_assembly($newpart,$assembly_part);


=head1 HELPER FUNCTION

=over 4

=item C<validate_assembly new_part_object part_object>

A new part is added to an assembly. C<new_part_object> is the part which is want to added.

First it was checked if the new part is equal the actual part.
Then recursively all assemblies in the assemby are checked for a loop.

The function returns an error string if a loop exists or the maximum of 100 iterations is reached
else on success ''.

=back

=head1 AUTHOR

Martin Helmling E<lt>martin.helmling@opendynamic.de>E<gt>

=cut
(37-37/38)