Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision a3efa54b

Von Tamino Steinert vor mehr als 1 Jahr hinzugefügt

  • ID a3efa54bb0048d2005d3b71d690ae2ad0f3fba23
  • Vorgänger 26c1edec
  • Nachfolger 23dd3187

EmailJournal: Templates überarbeitet und Verknüpfte Belege hinzugefügt

Unterschiede anzeigen:

SL/Controller/EmailJournal.pm
use SL::DB::Employee;
use SL::DB::EmailJournal;
use SL::DB::EmailJournalAttachment;
use SL::DB::Order;
use SL::Helper::Flash;
use SL::Locale::String;
use SL::Locale::String qw(t8);
use SL::System::TaskServer;
use SL::Presenter::EmailJournal;
use SL::DB::Order;
use SL::DB::Order::TypeData;
use SL::DB::DeliveryOrder;
use SL::DB::DeliveryOrder::TypeData;
use SL::DB::Reclamation;
use SL::DB::Reclamation::TypeData;
use SL::DB::Invoice;
use SL::DB::PurchaseInvoice;
use SL::DB::Manager::Customer;
use SL::DB::Manager::Vendor;
use Rose::Object::MakeMethods::Generic
(
scalar => [ qw(entry) ],
......
__PACKAGE__->run_before('add_js');
my %RECORD_TYPES_INFO = (
# Order
Order => {
controller => 'Order',
model => 'SL::DB::Order',
types => SL::DB::Order::TypeData->valid_types(),
},
DeliveryOrder => {
controller => 'DeliveryOrder',
model => 'SL::DB::DeliveryOrder',
types => SL::DB::DeliveryOrder::TypeData->valid_types(),
},
Reclamation => {
controller => 'Reclamation',
model => 'SL::DB::Reclamation',
types => SL::DB::Reclamation::TypeData->valid_types(),
},
Invoice => {
controller => 'ar.pl',
model => 'SL::DB::Invoice',
types => [
'ar_transaction',
'invoice',
'invoice_for_advance_payment',
'invoice_for_advance_payment_storno',
'final_invoice',
'invoice_storno',
'credit_note',
'credit_note_storno',
],
},
PurchaseInvoice => {
controller => 'ap.pl',
model => 'SL::DB::PurchaseInvoice',
types => [
'purchase_order',
'purchase_quotation_intake',
'request_quotation',
'sales_order',
'sales_order_intake',
'sales_quotation',
'ap_transaction',
'purchase_invoice',
'purchase_credit_note',
],
},
);
......
$::form->error(t8('You do not have permission to access this entry.'));
}
my @record_types_with_info = ();
for my $record_class ('SL::DB::Order', 'SL::DB::DeliveryOrder', 'SL::DB::Reclamation') {
my $valid_types = "${record_class}::TypeData"->valid_types();
for my $type (@$valid_types) {
my $type_data = SL::DB::Helper::TypeDataProxy->new($record_class, $type);
push @record_types_with_info, {
record_type => $type,
customervendor => $type_data->properties('customervendor'),
text => $type_data->text('type'),
};
}
}
push @record_types_with_info, (
# invoice
{ record_type => 'ar_transaction' , customervendor => 'customer', text => t8('AR Transaction')},
{ record_type => 'invoice' , customervendor => 'customer', text => t8('Invoice') },
{ record_type => 'invoice_for_advance_payment' , customervendor => 'customer', text => t8('Invoice for Advance Payment')},
{ record_type => 'invoice_for_advance_payment_storno', customervendor => 'customer', text => t8('Storno Invoice for Advance Payment')},
{ record_type => 'final_invoice' , customervendor => 'customer', text => t8('Final Invoice')},
{ record_type => 'invoice_storno' , customervendor => 'customer', text => t8('Storno Invoice')},
{ record_type => 'credit_note' , customervendor => 'customer', text => t8('Credit Note')},
{ record_type => 'credit_note_storno' , customervendor => 'customer', text => t8('Storno Credit Note')},
# purchase invoice
{ record_type => 'ap_transaction' , customervendor => 'vendor', text => t8('AP Transaction')},
{ record_type => 'purchase_invoice' , customervendor => 'vendor', text => t8('Purchase Invoice')},
{ record_type => 'purchase_credit_note', customervendor => 'vendor', text => t8('Purchase Credit Note')},
);
my $customer_vendor = $self->find_customer_vendor_from_email($self->entry);
$self->setup_show_action_bar;
$self->render('email_journal/show',
title => $::locale->text('View email'),
back_to => $back_to);
$self->render(
'email_journal/show',
title => $::locale->text('View email'),
CUSTOMER_VENDOR => , $customer_vendor,
CV_TYPE_FOUND => $customer_vendor && $customer_vendor->is_vendor ? 'vendor' : 'customer',
RECORD_TYPES_WITH_INFO => \@record_types_with_info,
back_to => $back_to
);
}
sub action_show_attachment {
......
sub action_apply_record_action {
my ($self) = @_;
my $email_journal_id = $::form->{email_journal_id};
my $attachment_id = $::form->{attachment_id};
my $record_action = $::form->{record_action};
my $vendor_id = $::form->{vendor_id};
my $customer_id = $::form->{customer_id};
if ( $record_action =~ s/^link_// ) { # remove prefix
# Load record
my $record_type = $record_action;
my $record_id = $::form->{$record_type . "_id"};
my $record_type_model = $RECORD_TYPE_TO_MODEL{$record_type};
my $record = $record_type_model->new(id => $record_id)->load;
my $email_journal = SL::DB::EmailJournal->new(id => $email_journal_id)->load;
if ($attachment_id) {
my $attachment = SL::DB::EmailJournalAttachment->new(id => $attachment_id)->load;
$attachment->add_file_to_record($record);
}
$email_journal->link_to_record($record);
return $self->js->flash('info', $::locale->text('Linked to e-mail ') . $record->displayable_name)->render();
my $email_journal_id = $::form->{email_journal_id};
my $attachment_id = $::form->{attachment_id};
my $customer_vendor = $::form->{customer_vendor_selection};
my $customer_vendor_id = $::form->{"${customer_vendor}_id"};
my $action = $::form->{action_selection};
my $record_type = $::form->{"${customer_vendor}_record_type_selection"};
my $record_id = $::form->{"${record_type}_id"};
if ($action eq 'linking') {
return $self->link_and_add_attachment_to_record({
email_journal_id => $email_journal_id,
attachment_id => $attachment_id,
record_type => $record_type,
record_id => $record_id,
});
}
my %additional_params = ();
if ( $record_action =~ s/^customer_// ) { # remove prefix
$additional_params{customer_id} = $customer_id;
} elsif ( $record_action =~ s/^vendor_// ) { # remove prefix
$additional_params{vendor_id} = $vendor_id;
if ($action eq 'create_new') {
$additional_params{action} = 'add_from_email_journal';
$additional_params{"${customer_vendor}_id"} = $customer_vendor_id;
} else {
$additional_params{action} = 'edit_from_email_journal';
$additional_params{id} = $record_id;
}
$additional_params{type} = $record_action;
$additional_params{controller} = $RECORD_TYPE_TO_CONTROLLER{$record_action};
$self->redirect_to(
action => 'add_from_email_journal',
controller => $RECORD_TYPE_TO_CONTROLLER{$record_type},
type => $record_type,
from_id => $email_journal_id,
from_type => 'email_journal',
email_attachment_id => $attachment_id,
......
# helpers
#
sub find_cv_from_email {
my ($self, $cv_type, $email_journal) = @_;
sub link_and_add_attachment_to_record {
my ($self, $params) = @_;
my $email_journal_id = $params->{email_journal_id};
my $attachment_id = $params->{attachment_id};
my $record_type = $params->{record_type};
my $record_id = $params->{record_id};
my $record_type_model = $RECORD_TYPE_TO_MODEL{$record_type};
my $record = $record_type_model->new(id => $record_id)->load;
my $email_journal = SL::DB::EmailJournal->new(id => $email_journal_id)->load;
if ($attachment_id) {
my $attachment = SL::DB::EmailJournalAttachment->new(id => $attachment_id)->load;
$attachment->add_file_to_record($record);
}
$email_journal->link_to_record($record);
return $self->js->flash('info', $::locale->text('Linked e-mail and attachment to ') . $record->displayable_name)->render();
}
sub find_customer_vendor_from_email {
my ($self, $email_journal, $cv_type) = @_;
my $email_address = $email_journal->from;
$email_address =~ s/.*<(.*)>/$1/; # address can look like "name surname <email_address>"
# search for customer or vendor or both
my $customer;
my $vendor;
if ($cv_type ne 'vendor') {
$customer = SL::DB::Manager::Customer->get_first(
# Separate query otherwise cv without contacts and shipto is not found
my $customer_vendor;
foreach my $manager (qw(SL::DB::Manager::Customer SL::DB::Manager::Vendor)) {
$customer_vendor ||= $manager->get_first(
where => [
or => [
email => $email_address,
cc => $email_address,
bcc => $email_address,
'contacts.cp_email' => $email_address,
'contacts.cp_privatemail' => $email_address,
'shipto.shiptoemail' => $email_address,
],
],
with_objects => [ 'contacts', 'shipto' ],
);
} elsif ($cv_type ne 'customer') {
$vendor = SL::DB::Manager::Vendor->get_first(
$customer_vendor ||= $manager->get_first(
where => [
or => [
email => $email_address,
cc => $email_address,
bcc => $email_address,
'contacts.cp_email' => $email_address,
'contacts.cp_privatemail' => $email_address,
],
],
with_objects => [ 'contacts'],
);
$customer_vendor ||= $manager->get_first(
where => [
or => [
'shipto.shiptoemail' => $email_address,
],
],
with_objects => [ 'contacts', 'shipto' ],
with_objects => [ 'shipto' ],
);
}
return $customer || $vendor;
return $customer_vendor;
}
sub find_customer_from_email {

Auch abrufbar als: Unified diff