Revision a3efa54b
Von Tamino Steinert vor mehr als 1 Jahr hinzugefügt
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
EmailJournal: Templates überarbeitet und Verknüpfte Belege hinzugefügt