Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 17710932

Von Sven Schöling vor mehr als 1 Jahr hinzugefügt

  • ID 177109320975e3d426d4d5cb4fb6db5b3e1ae07c
  • Vorgänger 4f5d1792
  • Nachfolger 25233b5b

RecordLinks: Reclamation after save hook in ein SL::DB::Helper modul verschoben

RecordLinks werden in reclamations in einem after save hook behandelt,
und sind damit deutlich robuster als die manuelle Behandlung. Die
ausgelagerte Variante hat jetzt auch Konstanten für die magischen
Strings in den Objekten.

Unterschiede anzeigen:

SL/DB/Helper/RecordLink.pm
package SL::DB::Helper::RecordLink;
use strict;
use parent qw(Exporter);
use constant RECORD_ID => 'converted_from_record_id';
use constant RECORD_TYPE_REF => 'converted_from_record_type_ref';
use constant RECORD_ITEM_ID => 'converted_from_record_item_id';
use constant RECORD_ITEM_TYPE_REF => 'converted_from_record_item_type_ref';
our @EXPORT_OK = qw(RECORD_ID RECORD_TYPE_REF RECORD_ITEM_ID RECORD_ITEM_TYPE_REF);
sub link_records {
my ($self, $allowed_linked_records, $allowed_linked_record_items) = @_;
my %allowed_linked_records = map {$_ => 1} @$allowed_linked_records;
my %allowed_linked_record_items = map {$_ => 1} @$allowed_linked_record_items;
return 1 unless my $from_record_id = $self->{RECORD_ID()};
my $from_record_type = $self->{RECORD_TYPE_REF()};
unless ($allowed_linked_records{$from_record_type}) {
croak("Not allowed @{[ RECORD_TYPE_REF ]}: $from_record_type");
}
$from_record_type->new(id => $from_record_id)->load
->link_to_record($self);
#clear converted_from;
delete $self->{$_} for RECORD_ID, RECORD_TYPE_REF;
for my $item (@{ $self->items_sorted }) {
link_record_item($self, $item, \%allowed_linked_record_items);
}
1;
}
sub link_record_item {
my ($self, $record_item, $allowed_linked_record_items) = @_;
return 1 unless my $from_item_id = $record_item->{RECORD_ITEM_ID()};
my $from_item_type = $record_item->{RECORD_ITEM_TYPE_REF()};
unless ($allowed_linked_record_items->{$from_item_type}) {
croak("Not allowed @{[ RECORD_ITEM_TYPE_REF() ]}: $from_item_type");
}
$from_item_type->new(id => $from_item_id)->load
->link_to_record($record_item);
#clear converted_from;
delete $record_item->{$_} for RECORD_ITEM_ID, RECORD_ITEM_TYPE_REF;
}
1;
__END__
=encoding utf-8
=head1 NAME
SL::DB::Helper::RecordLink - creates record links that are stored in the gived objects
=head1 SYNOPSIS
# in the consuming class
__PCAKAGE__->after_save_hook("link_records_hook");
sub link_records_hook {
my ($self) = @_;
SL::DB::Helper::RecordLink::link_records(
$self,
qw(SL::DB::Order), # list of allowed record sources
qw(SL::DB::OrderItem), # list of allowed record item sources
)
}
=head1 DESCRIPTION
...
=head1 METHODS
...
=head1 BUGS
None yet. :)
=head1 AUTHOR
Sven Schöling $<lt>s.schoeling@googlemail.comE<gt>
=cut
SL/DB/Reclamation.pm
use SL::DB::Helper::PriceTaxCalculator;
use SL::DB::Helper::PriceUpdater;
use SL::DB::Helper::TransNumberGenerator;
use SL::DB::Helper::RecordLink qw(RECORD_ID RECORD_TYPE_REF);
use SL::Locale::String qw(t8);
use SL::RecordLinks;
use Rose::DB::Object::Helpers qw(as_tree strip);
......
sub _after_save_link_records {
my ($self) = @_;
my %allowed_linked_records = map {$_ => 1} qw(
SL::DB::Reclamation
SL::DB::Order
SL::DB::DeliveryOrder
SL::DB::Invoice
SL::DB::PurchaseInvoice
);
my %allowed_linked_record_items = map {$_ => 1} qw(
SL::DB::ReclamationItem
SL::DB::OrderItem
SL::DB::DeliveryOrderItem
SL::DB::InvoiceItem
);
my $from_record_id = $self->{converted_from_record_id};
if ($from_record_id) {
my $from_record_type = $self->{converted_from_record_type_ref};
unless ($allowed_linked_records{$from_record_type}) {
croak("Not allowed converted_from_record_type_ref: '" . $from_record_type);
}
my $src = ${from_record_type}->new(id => $from_record_id)->load;
$src->link_to_record($self);
#clear converted_from;
delete $self->{$_} for qw(converted_from_record_id converted_from_record_type_ref);
if (scalar @{ $self->items_sorted || [] }) {
for my $idx (0 .. $#{ $self->items_sorted }) {
my $reclamation_item = $self->items_sorted->[$idx];
my $from_item_id = $reclamation_item->{converted_from_record_item_id};
next if !$from_item_id;
my $from_item_type = $reclamation_item->{converted_from_record_item_type_ref};
unless ($allowed_linked_record_items{$from_item_type}) {
croak("Not allowed converted_from_record_item_type_ref: '" . $from_item_type);
}
my $src_item = ${from_item_type}->new(id => $from_item_id)->load;
$src_item->link_to_record($reclamation_item);
#clear converted_from;
delete $reclamation_item->{$_} for qw(converted_from_record_item_id converted_from_record_item_type_ref);
}
}
}
my @allowed_record_sources = qw(SL::DB::Reclamation SL::DB::Order SL::DB::DeliveryOrder SL::DB::Invoice SL::DB::PurchaseInvoice);
my @allowed_item_sources = qw(SL::DB::ReclamationItem SL::DB::OrderItem SL::DB::DeliveryOrderItem SL::DB::InvoiceItem);
return 1;
SL::DB::Helper::RecordLink::link_records(
$self,
\@allowed_record_sources,
\@allowed_item_sources,
);
}
# methods
......
$reclamation->assign_attributes(%{ $params{attributes} }) if $params{attributes};
unless ($params{no_linked_records}) {
$reclamation->{"converted_from_record_type_ref"} = ref($source);
$reclamation->{"converted_from_record_id"} = $source->id;
$reclamation->{RECORD_TYPE_REF()} = ref($source);
$reclamation->{RECORD_ID()} = $source->id;
};
my $items = delete($params{items}) || $source->items;
SL/DB/ReclamationItem.pm
use SL::DB::Helper::ActsAsList;
use SL::DB::Helper::LinkedRecords;
use SL::DB::Helper::RecordItem;
use SL::DB::Helper::RecordLink qw(RECORD_ITEM_ID RECORD_ITEM_TYPE_REF);
use SL::DB::Helper::CustomVariables (
sub_module => 'reclamation_items',
cvars_alias => 1,
......
sub is_linked_to_record {
my ($self) = @_;
if(scalar(@{$self->linked_records}) || $self->{converted_from_record_item_type_ref}) {
if(scalar(@{$self->linked_records}) || $self->{RECORD_ITEM_TYPE_REF()}) {
return 1;
}
......
$item->assign_attributes(%{ $params{attributes} }) if $params{attributes};
unless ($params{no_linked_records}) {
$item->{"converted_from_record_item_type_ref"} = ref($source);
$item->{"converted_from_record_item_id"} = $source->id;
$item->{RECORD_ITEM_TYPE_REF()} = ref($source);
$item->{RECORD_ITEM_ID()} = $source->id;
}
return $item;

Auch abrufbar als: Unified diff