Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 3a8be1b7

Von Tamino Steinert vor 7 Monaten hinzugefügt

  • ID 3a8be1b7fa19297314bfdf99f9b898986d1df9f1
  • Vorgänger 9734325f
  • Nachfolger 39aa38b2

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

Unterschiede anzeigen:

SL/Controller/EmailJournal.pm
8 8
use SL::DB::Employee;
9 9
use SL::DB::EmailJournal;
10 10
use SL::DB::EmailJournalAttachment;
11
use SL::DB::Order;
12 11
use SL::Helper::Flash;
13
use SL::Locale::String;
12
use SL::Locale::String qw(t8);
14 13
use SL::System::TaskServer;
15 14
use SL::Presenter::EmailJournal;
16 15

  
16
use SL::DB::Order;
17
use SL::DB::Order::TypeData;
18
use SL::DB::DeliveryOrder;
19
use SL::DB::DeliveryOrder::TypeData;
20
use SL::DB::Reclamation;
21
use SL::DB::Reclamation::TypeData;
22
use SL::DB::Invoice;
23
use SL::DB::PurchaseInvoice;
24

  
25
use SL::DB::Manager::Customer;
26
use SL::DB::Manager::Vendor;
27

  
17 28
use Rose::Object::MakeMethods::Generic
18 29
(
19 30
  scalar                  => [ qw(entry) ],
......
24 35
__PACKAGE__->run_before('add_js');
25 36

  
26 37
my %RECORD_TYPES_INFO = (
27
  # Order
28 38
  Order => {
29 39
    controller => 'Order',
30 40
    model      => 'SL::DB::Order',
41
    types => SL::DB::Order::TypeData->valid_types(),
42
  },
43
  DeliveryOrder => {
44
    controller => 'DeliveryOrder',
45
    model      => 'SL::DB::DeliveryOrder',
46
    types => SL::DB::DeliveryOrder::TypeData->valid_types(),
47
  },
48
  Reclamation => {
49
    controller => 'Reclamation',
50
    model      => 'SL::DB::Reclamation',
51
    types => SL::DB::Reclamation::TypeData->valid_types(),
52
  },
53
  Invoice => {
54
    controller => 'ar.pl',
55
    model      => 'SL::DB::Invoice',
56
    types => [
57
      'ar_transaction',
58
      'invoice',
59
      'invoice_for_advance_payment',
60
      'invoice_for_advance_payment_storno',
61
      'final_invoice',
62
      'invoice_storno',
63
      'credit_note',
64
      'credit_note_storno',
65
    ],
66
  },
67
  PurchaseInvoice => {
68
    controller => 'ap.pl',
69
    model      => 'SL::DB::PurchaseInvoice',
31 70
    types => [
32
      'purchase_order',
33
      'purchase_quotation_intake',
34
      'request_quotation',
35
      'sales_order',
36
      'sales_order_intake',
37
      'sales_quotation',
71
      'ap_transaction',
72
      'purchase_invoice',
73
      'purchase_credit_note',
38 74
    ],
39 75
  },
40 76
);
......
81 117
    $::form->error(t8('You do not have permission to access this entry.'));
82 118
  }
83 119

  
120
  my @record_types_with_info = ();
121
  for my $record_class ('SL::DB::Order', 'SL::DB::DeliveryOrder', 'SL::DB::Reclamation') {
122
    my $valid_types = "${record_class}::TypeData"->valid_types();
123
    for my $type (@$valid_types) {
124

  
125
      my $type_data = SL::DB::Helper::TypeDataProxy->new($record_class, $type);
126
      push @record_types_with_info, {
127
        record_type    => $type,
128
        customervendor => $type_data->properties('customervendor'),
129
        text           => $type_data->text('type'),
130
      };
131
    }
132
  }
133
  push @record_types_with_info, (
134
    # invoice
135
    { record_type => 'ar_transaction'                    ,  customervendor => 'customer',  text => t8('AR Transaction')},
136
    { record_type => 'invoice'                           ,  customervendor => 'customer',  text => t8('Invoice') },
137
    { record_type => 'invoice_for_advance_payment'       ,  customervendor => 'customer',  text => t8('Invoice for Advance Payment')},
138
    { record_type => 'invoice_for_advance_payment_storno',  customervendor => 'customer',  text => t8('Storno Invoice for Advance Payment')},
139
    { record_type => 'final_invoice'                     ,  customervendor => 'customer',  text => t8('Final Invoice')},
140
    { record_type => 'invoice_storno'                    ,  customervendor => 'customer',  text => t8('Storno Invoice')},
141
    { record_type => 'credit_note'                       ,  customervendor => 'customer',  text => t8('Credit Note')},
142
    { record_type => 'credit_note_storno'                ,  customervendor => 'customer',  text => t8('Storno Credit Note')},
143
    # purchase invoice
144
    { record_type => 'ap_transaction'      ,  customervendor => 'vendor',  text => t8('AP Transaction')},
145
    { record_type => 'purchase_invoice'    ,  customervendor => 'vendor',  text => t8('Purchase Invoice')},
146
    { record_type => 'purchase_credit_note',  customervendor => 'vendor',  text => t8('Purchase Credit Note')},
147
  );
148

  
149
  my $customer_vendor = $self->find_customer_vendor_from_email($self->entry);
150

  
84 151
  $self->setup_show_action_bar;
85
  $self->render('email_journal/show',
86
                title   => $::locale->text('View email'),
87
                back_to => $back_to);
152
  $self->render(
153
    'email_journal/show',
154
    title    => $::locale->text('View email'),
155
    CUSTOMER_VENDOR => , $customer_vendor,
156
    CV_TYPE_FOUND => $customer_vendor && $customer_vendor->is_vendor ? 'vendor' : 'customer',
157
    RECORD_TYPES_WITH_INFO => \@record_types_with_info,
158
    back_to  => $back_to
159
  );
88 160
}
89 161

  
90 162
sub action_show_attachment {
......
123 195

  
124 196
sub action_apply_record_action {
125 197
  my ($self) = @_;
126
  my $email_journal_id = $::form->{email_journal_id};
127
  my $attachment_id = $::form->{attachment_id};
128
  my $record_action = $::form->{record_action};
129
  my $vendor_id = $::form->{vendor_id};
130
  my $customer_id = $::form->{customer_id};
131

  
132
  if ( $record_action =~ s/^link_// ) { # remove prefix
133

  
134
    # Load record
135
    my $record_type = $record_action;
136
    my $record_id = $::form->{$record_type . "_id"};
137
    my $record_type_model = $RECORD_TYPE_TO_MODEL{$record_type};
138
    my $record = $record_type_model->new(id => $record_id)->load;
139
    my $email_journal = SL::DB::EmailJournal->new(id => $email_journal_id)->load;
140

  
141
    if ($attachment_id) {
142
      my $attachment = SL::DB::EmailJournalAttachment->new(id => $attachment_id)->load;
143
      $attachment->add_file_to_record($record);
144
    }
145

  
146
    $email_journal->link_to_record($record);
147

  
148
    return $self->js->flash('info',  $::locale->text('Linked to e-mail ') . $record->displayable_name)->render();
198
  my $email_journal_id   = $::form->{email_journal_id};
199
  my $attachment_id      = $::form->{attachment_id};
200
  my $customer_vendor    = $::form->{customer_vendor_selection};
201
  my $customer_vendor_id = $::form->{"${customer_vendor}_id"};
202
  my $action             = $::form->{action_selection};
203
  my $record_type        = $::form->{"${customer_vendor}_record_type_selection"};
204
  my $record_id          = $::form->{"${record_type}_id"};
205

  
206
  if ($action eq 'linking') {
207
    return $self->link_and_add_attachment_to_record({
208
        email_journal_id    => $email_journal_id,
209
        attachment_id       => $attachment_id,
210
        record_type         => $record_type,
211
        record_id           => $record_id,
212
      });
149 213
  }
150 214

  
151 215
  my %additional_params = ();
152
  if ( $record_action =~ s/^customer_// ) {  # remove prefix
153
    $additional_params{customer_id} = $customer_id;
154
  } elsif ( $record_action =~ s/^vendor_// ) { # remove prefix
155
    $additional_params{vendor_id} = $vendor_id;
216
  if ($action eq 'create_new') {
217
    $additional_params{action} = 'add_from_email_journal';
218
    $additional_params{"${customer_vendor}_id"} = $customer_vendor_id;
219
  } else {
220
    $additional_params{action} = 'edit_from_email_journal';
221
    $additional_params{id} = $record_id;
156 222
  }
157
  $additional_params{type} = $record_action;
158
  $additional_params{controller} = $RECORD_TYPE_TO_CONTROLLER{$record_action};
159 223

  
160 224
  $self->redirect_to(
161
    action              => 'add_from_email_journal',
225
    controller          => $RECORD_TYPE_TO_CONTROLLER{$record_type},
226
    type                => $record_type,
162 227
    from_id             => $email_journal_id,
163 228
    from_type           => 'email_journal',
164 229
    email_attachment_id => $attachment_id,
......
198 263
# helpers
199 264
#
200 265

  
201
sub find_cv_from_email {
202
  my ($self, $cv_type, $email_journal) = @_;
266
sub link_and_add_attachment_to_record {
267
 my ($self, $params) = @_;
268

  
269
  my $email_journal_id   = $params->{email_journal_id};
270
  my $attachment_id      = $params->{attachment_id};
271
  my $record_type        = $params->{record_type};
272
  my $record_id          = $params->{record_id};
273

  
274
  my $record_type_model = $RECORD_TYPE_TO_MODEL{$record_type};
275
  my $record = $record_type_model->new(id => $record_id)->load;
276
  my $email_journal = SL::DB::EmailJournal->new(id => $email_journal_id)->load;
277

  
278
  if ($attachment_id) {
279
    my $attachment = SL::DB::EmailJournalAttachment->new(id => $attachment_id)->load;
280
    $attachment->add_file_to_record($record);
281
  }
282

  
283
  $email_journal->link_to_record($record);
284

  
285
  return $self->js->flash('info',  $::locale->text('Linked e-mail and attachment to ') . $record->displayable_name)->render();
286
}
287

  
288
sub find_customer_vendor_from_email {
289
  my ($self, $email_journal, $cv_type) = @_;
203 290
  my $email_address = $email_journal->from;
291
  $email_address =~ s/.*<(.*)>/$1/; # address can look like "name surname <email_address>"
204 292

  
205
  # search for customer or vendor or both
206
  my $customer;
207
  my $vendor;
208
  if ($cv_type ne 'vendor') {
209
    $customer = SL::DB::Manager::Customer->get_first(
293
  # Separate query otherwise cv without contacts and shipto is not found
294
  my $customer_vendor;
295
  foreach my $manager (qw(SL::DB::Manager::Customer SL::DB::Manager::Vendor)) {
296
    $customer_vendor ||= $manager->get_first(
210 297
      where => [
211 298
        or => [
212 299
          email => $email_address,
213 300
          cc    => $email_address,
214 301
          bcc   => $email_address,
215
          'contacts.cp_email' => $email_address,
216
          'contacts.cp_privatemail' => $email_address,
217
          'shipto.shiptoemail' => $email_address,
218 302
        ],
219 303
      ],
220
      with_objects => [ 'contacts', 'shipto' ],
221 304
    );
222
  } elsif ($cv_type ne 'customer') {
223
    $vendor = SL::DB::Manager::Vendor->get_first(
305
    $customer_vendor ||= $manager->get_first(
224 306
      where => [
225 307
        or => [
226
          email => $email_address,
227
          cc    => $email_address,
228
          bcc   => $email_address,
229 308
          'contacts.cp_email' => $email_address,
230 309
          'contacts.cp_privatemail' => $email_address,
310
        ],
311
      ],
312
      with_objects => [ 'contacts'],
313
    );
314
    $customer_vendor ||= $manager->get_first(
315
      where => [
316
        or => [
231 317
          'shipto.shiptoemail' => $email_address,
232 318
        ],
233 319
      ],
234
      with_objects => [ 'contacts', 'shipto' ],
320
      with_objects => [ 'shipto' ],
235 321
    );
236 322
  }
237 323

  
238
  return $customer || $vendor;
324
  return $customer_vendor;
239 325
}
240 326

  
241 327
sub find_customer_from_email {
js/kivi.EmailJournal.js
11 11
    $.post("controller.pl", data, kivi.eval_json_result);
12 12
  }
13 13

  
14
  ns.update_extra_div_selection = function() {
15
    let record_action = $('#record_action').val();
16
    if (record_action == undefined) { return; }
14
  ns.update_customer_vendor_selection = function() {
15
    let customer_vendor = $('#customer_vendor_selection').val();
17 16

  
18 17
    $('#customer_div').hide();
18
    $('#customer_record_types_div').hide();
19 19
    $('#vendor_div').hide();
20
    $('#vendor_record_types_div').hide();
20 21

  
21
    $('#link_sales_quotation_div').hide();
22
    $('#link_sales_order_intake_div').hide();
23
    $('#link_sales_order_div').hide();
24
    $('#link_request_quotation_div').hide();
25
    $('#link_purchase_quotation_intake_div').hide();
26
    $('#link_purchase_order_div').hide();
27

  
28
    $('#placeholder_div').hide();
29

  
30
    // customer vendor
31
    if (record_action.match(/^customer/)) {
22
    if (customer_vendor == 'customer') {
32 23
      $('#customer_div').show();
33
    } else if (record_action.match(/^vendor/)) {
24
      $('#customer_record_types_div').show();
25
    } else { // if (customer_vendor == 'vendor')
34 26
      $('#vendor_div').show();
35
    // link
36
    } else if (record_action.match(/^link_/)) {
37
      $('#'+record_action+'_div').show();
38
    // placeholder
27
      $('#vendor_record_types_div').show();
28
    }
29
    kivi.EmailJournal.update_record_type_selection(customer_vendor);
30
  }
31

  
32
  ns.update_action_selection = function() {
33
    let record_action = $('#action_selection').val();
34

  
35
    $('#record_type_div').hide();
36
    $('#no_record_type_div').hide();
37

  
38
    if (record_action == 'create_new') {
39
      $('#no_record_type_div').show();
39 40
    } else {
40
      $('#placeholder_div').show();
41
      $('#record_type_div').show();
41 42
    }
42 43
  }
43 44

  
44
  ns.apply_record_action = function() {
45
    let record_action = $('#record_action').val();
46
    if (record_action == '') {
47
      alert(kivi.t8('Please select an action.'));
48
      return;
45
  ns.update_record_type_selection = function(customer_vendor) {
46
    let record_type = $('#' + customer_vendor + '_record_type_selection').val();
47

  
48
    $('.record_type').hide();
49
    if (record_type != '') {
50
      $('#' + record_type + '_div').show();
51
    } else {
52
      $('#record_type_placeholder_div').show();
49 53
    }
54
  }
50 55

  
56
  ns.apply_action_with_attachment = function() {
51 57
    let data = $('#record_action_form').serializeArray();
52 58
    data.push({ name: 'action', value: 'EmailJournal/apply_record_action' });
53 59

  
......
57 63

  
58 64
$(function() {
59 65
  kivi.EmailJournal.update_attachment_preview();
60
  kivi.EmailJournal.update_extra_div_selection();
61 66
});
templates/design40_webpages/email_journal/show.html
4 4
[% USE P %]
5 5
[% USE T8 %]
6 6

  
7
[% BLOCK filter_toggle_panel # can't change name %]
8
<table id="email_journal_details" class="tbl-horizontal">
9
  <tbody>
10
    <tr>
11
      <th>[% 'From' | $T8 %]</th>
12
      <td>[% L.input_tag('from',  SELF.entry.from, style="color:black", class="wi-verywide", disabled=1) %]</td>
13
    </tr>
14
    <tr>
15
      <th>[% 'Recipients' | $T8 %]</th>
16
      <td>[% L.input_tag('recipients', SELF.entry.recipients, style="color:black", class="wi-verywide", disabled=1) %]</td>
17
    </tr>
18
    <tr>
19
      <th>[% 'Subject' | $T8 %]</th>
20
      <td>[% L.input_tag('subject', SELF.entry.subject, style="color:black", class="wi-verywide", disabled=1) %]</td>
21
    </tr>
22
    <tr>
23
      <th>[% 'Sent on' | $T8 %]</th>
24
      <td>[% L.input_tag('sent_on', SELF.entry.sent_on.to_lxoffice("precision" => "second"), style="color:black", class="wi-verywide", disabled=1) %]</td>
25
    </tr>
26
    <tr>
27
      <th>[% 'Status' | $T8 %]</th>
28
      <td>[% L.input_tag('status', P.email_journal.entry_status(SELF.entry), style="color:black", class="wi-verywide", disabled=1) %]</td>
29
    </tr>
30
    <tr>
31
      <th>[% 'Extended status' | $T8 %]</th>
32
      <td>
33
        [% L.textarea_tag('extended_status', SELF.entry.extended_status, wrap="soft", style="color:black; height:25px", class="wi-verywide", disabled=1) %]
34
      </td>
35
    </tr>
36
    <tr>
37
      <th>[% 'Headers' | $T8 %]</th>
38
      <td>
39
        [% L.textarea_tag('headers', HTML.escape(SELF.entry.headers), wrap="soft", style="color:black; height:25px", class="wi-verywide", disabled=1) %]
40
      </td>
41
    </tr>
42
    <tr>
43
      <th>[% 'Body' | $T8 %]</th>
44
      <td>
45
        [% IF SELF.entry.headers.match('(?i)content-type:.*text/html') %]
46
          <div style="border:1px solid black;">
47
          [% P.restricted_html(SELF.entry.body) %]
48
          </div>
49
        [% ELSE %]
50
          [% L.textarea_tag('body', SELF.entry.body, wrap="soft", style="color:black; height:200px", class="wi-verywide", disabled=1) %]
51
        [% END %]
52
      </td>
53
    </tr>
54
  </tbody>
55
</table>
56
[% END %]
57

  
58

  
59

  
60 7
<h1>[% FORM.title %]</h1>
61 8

  
62 9
[% INCLUDE 'common/flash.html' %]
63 10

  
64
<div class="wrapper" id="wrapper-0">
11
<form>
12
<div class="tabwidget" id="email_tabs">
13
  <ul>
14
    <li><a href="#ui-tabs-basic-data">[% 'Basic Data' | $T8 %]</a></li>
15
    <li><a href="controller.pl?action=RecordLinks/ajax_list&object_model=EmailJournal&object_id=[% HTML.url(SELF.entry.id) %]">[% 'Linked Records' | $T8 %]</a></li>
16
  </ul>
65 17

  
66
<div class="wrapper">
67
  [%
68
    display_status = 'open';
69
    button_closed  = LxERP.t8('Show Email');
70
    button_open    = LxERP.t8('Hide Email');
71
    INCLUDE 'common/toggle_panel.html';
72
  %]
73
</div><!-- /.wrapper -->
18
[% PROCESS "email_journal/tabs/basic_data.html" %]
19
</div> <!-- /.tabwidget -->
20
</form>
74 21

  
22
<div class="wrapper" id="wrapper-0">
75 23

  
76 24
[% SET attachments = SELF.entry.attachments_sorted %]
77 25

  
......
116 64
      %]
117 65
    </div>
118 66

  
119
    <div class="col">
120
    [% L.select_tag('record_action',
121
       # id has to start with customer_ or vendor_ for picker selection
67
    <div id="customer_vendor_div" class="col">
68
    [% L.select_tag('customer_vendor_selection',
122 69
       [
123
         [ LxERP.t8("Linking"), [
124
           {id => "link_sales_quotation",           name => LxERP.t8("Link to sales quotation")},
125
           {id => "link_sales_order_intake",        name => LxERP.t8("Link to sales order intake")},
126
           {id => "link_sales_order",               name => LxERP.t8("Link to sales order")},
127
           {id => "link_request_quotation",         name => LxERP.t8("Link to request quotation")},
128
           {id => "link_purchase_quotation_intake", name => LxERP.t8("Link to purchase quotation intake")},
129
           {id => "link_purchase_order",            name => LxERP.t8("Link to purchase order")},
130

  
131
         ] ],
132
         [ LxERP.t8("Sales"), [
133
             {id => "customer_sales_order",  name => LxERP.t8("Create sales order")},
134
             {id => "customer_sales_order_intake",  name => LxERP.t8("Create sales order intake")},
135
             {id => "customer_sales_quotation",  name => LxERP.t8("Create sales quotation")},
136
         ] ],
137
         [ LxERP.t8("Purchase"), [
138
             {id => "vendor_purchase_order", name => LxERP.t8("Create purchase order")},
139
             {id => "vendor_purchase_quotation_intake", name => LxERP.t8("Create purchase quotation intake")},
140
             {id => "vendor_request_quotation", name => LxERP.t8("Create request quotation")},
141

  
142
         ] ],
70
         {value => "customer", name => LxERP.t8("Sales")},
71
         {value => "vendor",   name => LxERP.t8("Purchase")},
143 72
       ],
144
       value_key='id', title_key='name',
145
       with_empty=1, empty_value='', empty_title=LxERP.t8("No action"),
146
       with_optgroups=1,
147
       class="wi-normal",
148
       onchange='kivi.EmailJournal.update_extra_div_selection();'
73
       default = CV_TYPE_FOUND,
74
       value_key='value', title_key='name',
75
       class="wi-verysmall",
76
       onchange='kivi.EmailJournal.update_customer_vendor_selection();'
149 77
       ) %]
150 78
    </div>
151

  
152
    [% FOREACH cv_type_name = [['customer', 'Customer'], ['vendor', 'Vendor']] %]
153
    [% SET cv_type = cv_type_name.0 %]
154
    [% SET cv_name = cv_type_name.1 %]
155
    <div id="[% cv_type _ "_div" %]" class="col" style="display:none">
79
    [% FOREACH cv_option = [
80
         ['customer', 'Customer', 1],
81
         ['vendor',   'Vendor',   0],
82
         ] %]
83
    [% SET cv_type        = cv_option.0 %]
84
    [% SET cv_name        = cv_option.1 %]
85
    [% SET cv_is_cusotmer = cv_option.2 %]
86
    <div
87
      id="[% cv_type _ "_div" %]" class="col"
88
      style=[% IF cv_type == CV_TYPE_FOUND %] "display:block" [% ELSE %] "display:none" [% END %]
89
      >
156 90
      [% P.customer_vendor.picker(
157
           cv_type _ "_id", SELF.find_cv_from_email(cv_type, SELF.entry),
91
           cv_type _ "_id",
92
           CUSTOMER_VENDOR.is_customer == cv_is_cusotmer ? CUSTOMER_VENDOR : undef,
158 93
           type=cv_type, class="wi-normal", placeholder=LxERP.t8(cv_name)
159 94
           ) %]
160 95
    </div>
161 96
    [% END %]
162
    [% FOREACH record_type  = [
163
         'sales_quotation', 'sales_order_intake', 'sales_order',
164
         'request_quotation', 'purchase_quotation_intake', 'purchase_order'
165
         ] %]
166
    <div id="[% "link_" _ record_type _ "_div" %]" class="col" style="display:none">
167
      [% L.input_tag(record_type _ "_id", '',
168
           style="color:black", class="wi-normal",
169
           placeholder=record_type _ " id") %]
97

  
98
    <div id="action_div" class="col">
99
    [% L.select_tag('action_selection',
100
       [
101
         {value => "workflow",   name => LxERP.t8("Create from Workflow")},
102
         {value => "linking",    name => LxERP.t8("Linking to Record")},
103
         {value => "create_new", name => LxERP.t8("Create new")},
104
       ],
105
       value_key='value', title_key='name',
106
       class="wi-normal",
107
       onchange='kivi.EmailJournal.update_action_selection();'
108
       ) %]
109
    </div>
110

  
111
    [% FOREACH customer_vendor = ['customer', 'vendor'] %]
112
    <div id="[% customer_vendor _ "_record_types_div" %]" class="col"
113
      style=[% IF customer_vendor == CV_TYPE_FOUND %] "display:block" [% ELSE %] "display:none" [% END %]
114
      >
115

  
116
      [%
117
        SET options = [];
118
        FOREACH record_info = RECORD_TYPES_WITH_INFO;
119
          IF (record_info.customervendor == customer_vendor);
120
            options.push({value => record_info.record_type, name => record_info.text});
121
          END;
122
        END;
123
      %]
124
    [% L.select_tag(customer_vendor _ '_record_type_selection',
125
       options,
126
       value_key='value', title_key='name',
127
       with_empty=1, empty_value='', empty_title=LxERP.t8("Select record type"),
128
       class="wi-normal",
129
       onchange='kivi.EmailJournal.update_record_type_selection("' _ customer_vendor _ '");'
130
       ) %]
170 131
    </div>
171 132
    [% END %]
172
    <div id="placeholder_div" class="col" style="display:block">
133

  
134
    <div id="record_type_div" class="col" style="display:block">
135
      [% FOREACH record_info = RECORD_TYPES_WITH_INFO %]
136
      <div id="[% record_info.record_type _ "_div" %]" class="col record_type" style="display:none">
137
        [% L.input_tag(record_info.record_type _ "_id", '',
138
             style="color:black", class="wi-normal",
139
             placeholder=record_info.record_type _ " id") %]
140
      </div>
141
      [% END %]
142
      <div id="record_type_placeholder_div" class="col record_type" style="display:block">
143
        [% L.input_tag('cv_placeholder', '',
144
             style="color:black", class="wi-normal", disabled=1,
145
             placeholder=LxERP.t8("Select record type first"),
146
             ) %]
147
      </div>
148
    </div>
149
    <div id="no_record_type_div" class="col" style="display:none">
173 150
      [% L.input_tag('cv_placeholder', '',
174 151
           style="color:black", class="wi-normal", disabled=1,
175
           placeholder=LxERP.t8("Select action first"),
152
           placeholder=LxERP.t8("No record needed"),
176 153
           ) %]
177 154
    </div>
178 155

  
179 156
    <div class="col">
180
      [% L.button_tag('kivi.EmailJournal.apply_record_action();', LxERP.t8('Apply with Attachment')) %]
157
      [% L.button_tag('kivi.EmailJournal.apply_action_with_attachment();', LxERP.t8('Apply with Attachment')) %]
181 158
    </div>
182 159
  </div> <!-- action_div -->
183 160
</form>
......
185 162
<!-- kivi.EmailJournal.update_attachment_preview -->
186 163
<div id="attachment_preview"></div>
187 164
[% END %]
188

  
189 165
</div> <!-- wrapper-2 -->
190 166

  
191 167
</div> <!-- wrapper-0 -->
templates/design40_webpages/email_journal/tabs/basic_data.html
1
[% USE T8 %]
2
[% USE HTML %]
3
[% USE LxERP %]
4
[% USE L %]
5
[% USE P %]
6

  
7
<div id="ui-tabs-basic-data">
8

  
9
<div class="wrapper">
10
[% INCLUDE 'generic/toggle_wrapper.html' %]
11

  
12
<table id="email_journal_details" class="tbl-horizontal">
13
  <caption>[% 'E-Mail Details' | $T8 %]</caption>
14
  <tbody>
15
    <tr>
16
      <th>[% 'From' | $T8 %]</th>
17
      <td>[% L.input_tag('from',  SELF.entry.from, style="color:black", class="wi-verywide", disabled=1) %]</td>
18
    </tr>
19
    <tr>
20
      <th>[% 'Recipients' | $T8 %]</th>
21
      <td>[% L.input_tag('recipients', SELF.entry.recipients, style="color:black", class="wi-verywide", disabled=1) %]</td>
22
    </tr>
23
    <tr>
24
      <th>[% 'Subject' | $T8 %]</th>
25
      <td>[% L.input_tag('subject', SELF.entry.subject, style="color:black", class="wi-verywide", disabled=1) %]</td>
26
    </tr>
27
    <tr>
28
      <th>[% 'Sent on' | $T8 %]</th>
29
      <td>[% L.input_tag('sent_on', SELF.entry.sent_on.to_lxoffice("precision" => "second"), style="color:black", class="wi-verywide", disabled=1) %]</td>
30
    </tr>
31
    <tr>
32
      <th>[% 'Status' | $T8 %]</th>
33
      <td>[% L.input_tag('status', P.email_journal.entry_status(SELF.entry), style="color:black", class="wi-verywide", disabled=1) %]</td>
34
    </tr>
35
    <tr>
36
      <th>[% 'Extended status' | $T8 %]</th>
37
      <td>
38
        [% L.textarea_tag('extended_status', SELF.entry.extended_status, wrap="soft", style="color:black; height:25px", class="wi-verywide", disabled=1) %]
39
      </td>
40
    </tr>
41
    <tr>
42
      <th>[% 'Headers' | $T8 %]</th>
43
      <td>
44
        [% L.textarea_tag('headers', HTML.escape(SELF.entry.headers), wrap="soft", style="color:black; height:25px", class="wi-verywide", disabled=1) %]
45
      </td>
46
    </tr>
47
    <tr>
48
      <th>[% 'Body' | $T8 %]</th>
49
      <td>
50
        [% IF SELF.entry.headers.match('(?i)content-type:.*text/html') %]
51
          <div style="border:1px solid black;">
52
          [% P.restricted_html(SELF.entry.body) %]
53
          </div>
54
        [% ELSE %]
55
          [% L.textarea_tag('body', SELF.entry.body, wrap="soft", style="color:black; height:200px", class="wi-verywide", disabled=1) %]
56
        [% END %]
57
      </td>
58
    </tr>
59
  </tbody>
60
</table>
61
</div><!-- /.wrapper -->
62

  
63
</div><!-- /#ui-tabs-basic-data -->
templates/webpages/email_journal/show.html
1
[% USE HTML %][% USE L %][% USE LxERP %][%- USE P -%]
1
[% USE HTML %][% USE L %][% USE LxERP %][%- USE P -%] [% USE T8 %]
2 2

  
3 3
 <h1>[% FORM.title %]</h1>
4 4

  
5 5
[%- INCLUDE 'common/flash.html' %]
6 6

  
7
 <table id="email_journal_details" class="email_journal_details">
8
  <tbody>
9
   <tr class="listrow">
10
    <th>[%- LxERP.t8("From") %]</th>
11
    <td>[%- HTML.escape(SELF.entry.from) %]</td>
12
   </tr>
13

  
14
   <tr class="listrow">
15
    <th>[%- LxERP.t8("Recipients") %]</th>
16
    <td>[%- HTML.escape(SELF.entry.recipients) %]</td>
17
   </tr>
18

  
19
   <tr class="listrow">
20
    <th>[%- LxERP.t8("Subject") %]</th>
21
    <td>[%- HTML.escape(SELF.entry.subject) %]</td>
22
   </tr>
23

  
24
   <tr class="listrow">
25
    <th>[%- LxERP.t8("Sent on") %]</th>
26
    <td>[%- HTML.escape(SELF.entry.sent_on.to_lxoffice("precision" => "second")) %]</td>
27
   </tr>
28

  
29
   <tr class="listrow">
30
    <th>[%- LxERP.t8("Status") %]</th>
31
    <td>
32
        [% P.email_journal.entry_status(SELF.entry) %]
33
    </td>
34
   </tr>
7
<div class="tabwidget" id="email_tabs">
8
  <ul>
9
    <li><a href="#ui-tabs-basic-data">[% 'Basic Data' | $T8 %]</a></li>
10
    <li><a href="controller.pl?action=RecordLinks/ajax_list&object_model=EmailJournal&object_id=[% HTML.url(SELF.entry.id) %]">[% 'Linked Records' | $T8 %]</a></li>
11
  </ul>
35 12

  
36
   <tr class="listrow">
37
    <th>[%- LxERP.t8("Extended status") %]</th>
38
    <td><pre>[%- HTML.escape(SELF.entry.extended_status) %]</pre></td>
39
   </tr>
40

  
41
   <tr class="listrow">
42
    <th>[%- LxERP.t8("Headers") %]</th>
43
    <td><pre>[% HTML.escape(SELF.entry.headers) %]</pre></td>
44
   </tr>
45

  
46
   <tr class="listrow">
47
    <th>[%- LxERP.t8("Body") %]</th>
48
    <td>
49
     [%- IF SELF.entry.headers.match('(?i)content-type:.*text/html') %]
50
      [% P.restricted_html(SELF.entry.body) %]
51
     [%- ELSE %]
52
      <pre>[% HTML.escape(SELF.entry.body) %]</pre>
53
     [%- END %]
54
    </td>
55
   </tr>
56
 </table>
13
[% PROCESS "email_journal/tabs/basic_data.html" %]
14
</div> <!-- /.tabwidget -->
57 15

  
58 16
 [% SET attachments = SELF.entry.attachments_sorted %]
59 17
  <h2>[% LxERP.t8("Attachments") %]</h2>
......
97 55
    </td>
98 56

  
99 57
    <td>
100
      [% L.select_tag('record_action',
101
         # id has to start with customer_ or vendor_ for picker selection
58
      [% L.select_tag('customer_vendor_selection',
102 59
         [
103
           [ LxERP.t8("Linking"), [
104
             {id => "link_sales_quotation",           name => LxERP.t8("Link to sales quotation")},
105
             {id => "link_sales_order_intake",        name => LxERP.t8("Link to sales order intake")},
106
             {id => "link_sales_order",               name => LxERP.t8("Link to sales order")},
107
             {id => "link_request_quotation",         name => LxERP.t8("Link to request quotation")},
108
             {id => "link_purchase_quotation_intake", name => LxERP.t8("Link to purchase quotation intake")},
109
             {id => "link_purchase_order",            name => LxERP.t8("Link to purchase order")},
110

  
111
           ] ],
112
           [ LxERP.t8("Sales"), [
113
               {id => "customer_sales_order",  name => LxERP.t8("Create sales order")},
114
               {id => "customer_sales_order_intake",  name => LxERP.t8("Create sales order intake")},
115
               {id => "customer_sales_quotation",  name => LxERP.t8("Create sales quotation")},
116
           ] ],
117
           [ LxERP.t8("Purchase"), [
118
               {id => "vendor_purchase_order", name => LxERP.t8("Create purchase order")},
119
               {id => "vendor_purchase_quotation_intake", name => LxERP.t8("Create purchase quotation intake")},
120
               {id => "vendor_request_quotation", name => LxERP.t8("Create request quotation")},
121

  
122
           ] ],
60
           {value => "customer", name => LxERP.t8("Sales")},
61
           {value => "vendor",   name => LxERP.t8("Purchase")},
123 62
         ],
124
         value_key='id', title_key='name',
125
         with_empty=1, empty_value='', empty_title=LxERP.t8("No action"),
126
         with_optgroups=1,
127
         class="wi-normal",
128
         onchange='kivi.EmailJournal.update_extra_div_selection();'
63
         default = CV_TYPE_FOUND,
64
         value_key='value', title_key='name',
65
         class="wi-verysmall",
66
         onchange='kivi.EmailJournal.update_customer_vendor_selection();'
129 67
         ) %]
130 68
    </td>
131 69

  
132 70
    <td>
133
      [% FOREACH cv_type_name = [['customer', 'Customer'], ['vendor', 'Vendor']] %]
134
      [% SET cv_type = cv_type_name.0 %]
135
      [% SET cv_name = cv_type_name.1 %]
136
      <div id="[% cv_type _ "_div" %]" style="display:none">
71
      [% FOREACH cv_option = [
72
           ['customer', 'Customer', 1],
73
           ['vendor',   'Vendor',   0],
74
           ] %]
75
      [% SET cv_type        = cv_option.0 %]
76
      [% SET cv_name        = cv_option.1 %]
77
      [% SET cv_is_cusotmer = cv_option.2 %]
78
      <div
79
        id="[% cv_type _ "_div" %]" class="col"
80
        style=[% IF cv_type == CV_TYPE_FOUND %] "display:block" [% ELSE %] "display:none" [% END %]
81
        >
137 82
        [% P.customer_vendor.picker(
138
             cv_type _ "_id", SELF.find_cv_from_email(cv_type, SELF.entry),
83
             cv_type _ "_id",
84
             CUSTOMER_VENDOR.is_customer == cv_is_cusotmer ? CUSTOMER_VENDOR : undef,
139 85
             type=cv_type, class="wi-normal", placeholder=LxERP.t8(cv_name)
140 86
             ) %]
141 87
      </div>
142
      [% END %]
143
      [% FOREACH record_type  = [
144
           'sales_quotation', 'sales_order_intake', 'sales_order',
145
           'request_quotation', 'purchase_quotation_intake', 'purchase_order'
146
           ] %]
147
      <div id="[% "link_" _ record_type _ "_div" %]" style="display:none">
148
        [% L.input_tag(record_type _ "_id", '',
149
             style="color:black", class="wi-normal",
150
             placeholder=record_type _ " id") %]
88
    [% END %]
89
    </td>
90

  
91
    <td>
92
      [% L.select_tag('action_selection',
93
         [
94
           {value => "workflow",   name => LxERP.t8("Create from Workflow")},
95
           {value => "linking",    name => LxERP.t8("Linking to Record")},
96
           {value => "create_new", name => LxERP.t8("Create new")},
97
         ],
98
         value_key='value', title_key='name',
99
         class="wi-normal",
100
         onchange='kivi.EmailJournal.update_action_selection();'
101
         ) %]
102
    </td>
103

  
104
    <td>
105
      [% FOREACH customer_vendor = ['customer', 'vendor'] %]
106
      <div id="[% customer_vendor _ "_record_types_div" %]" class="col"
107
        style=[% IF customer_vendor == CV_TYPE_FOUND %] "display:block" [% ELSE %] "display:none" [% END %]
108
        >
109

  
110
        [%
111
          SET options = [];
112
          FOREACH record_info = RECORD_TYPES_WITH_INFO;
113
            IF (record_info.customervendor == customer_vendor);
114
              options.push({value => record_info.record_type, name => record_info.text});
115
            END;
116
          END;
117
        %]
118
      [% L.select_tag(customer_vendor _ '_record_type_selection',
119
         options,
120
         value_key='value', title_key='name',
121
         with_empty=1, empty_value='', empty_title=LxERP.t8("Select record type"),
122
         class="wi-normal",
123
         onchange='kivi.EmailJournal.update_record_type_selection("' _ customer_vendor _ '");'
124
         ) %]
151 125
      </div>
152 126
      [% END %]
153
      <div id="placeholder_div" style="display:block">
127
    </td>
128

  
129
    <td>
130
      <div id="record_type_div" class="col" style="display:block">
131
        [% FOREACH record_info = RECORD_TYPES_WITH_INFO %]
132
        <div id="[% record_info.record_type _ "_div" %]" class="col record_type" style="display:none">
133
          [% L.input_tag(record_info.record_type _ "_id", '',
134
               style="color:black", class="wi-normal",
135
               placeholder=record_info.record_type _ " id") %]
136
        </div>
137
        [% END %]
138
        <div id="record_type_placeholder_div" class="col record_type" style="display:block">
139
          [% L.input_tag('cv_placeholder', '',
140
               style="color:black", class="wi-normal", disabled=1,
141
               placeholder=LxERP.t8("Select record type first"),
142
               ) %]
143
        </div>
144
      </div>
145
      <div id="no_record_type_div" class="col" style="display:none">
154 146
        [% L.input_tag('cv_placeholder', '',
155 147
             style="color:black", class="wi-normal", disabled=1,
156
             placeholder=LxERP.t8("Select action first"),
148
             placeholder=LxERP.t8("No record needed"),
157 149
             ) %]
158 150
      </div>
159 151
    </td>
160 152

  
161 153
    <td>
162
      [% L.button_tag('kivi.EmailJournal.apply_record_action();', LxERP.t8('Apply with Attachment')) %]
154
      [% L.button_tag('kivi.EmailJournal.apply_action_with_attachment();', LxERP.t8('Apply with Attachment')) %]
163 155
    </td>
164 156
  </tr> </table>
165 157
</form>
templates/webpages/email_journal/tabs/basic_data.html
1
[% USE HTML %][% USE L %][% USE LxERP %][%- USE P -%]
2

  
3
<div id="ui-tabs-basic-data">
4

  
5
<table id="email_journal_details" class="email_journal_details">
6
 <tbody>
7
  <tr class="listrow">
8
   <th>[%- LxERP.t8("From") %]</th>
9
   <td>[%- HTML.escape(SELF.entry.from) %]</td>
10
  </tr>
11

  
12
  <tr class="listrow">
13
   <th>[%- LxERP.t8("Recipients") %]</th>
14
   <td>[%- HTML.escape(SELF.entry.recipients) %]</td>
15
  </tr>
16

  
17
  <tr class="listrow">
18
   <th>[%- LxERP.t8("Subject") %]</th>
19
   <td>[%- HTML.escape(SELF.entry.subject) %]</td>
20
  </tr>
21

  
22
  <tr class="listrow">
23
   <th>[%- LxERP.t8("Sent on") %]</th>
24
   <td>[%- HTML.escape(SELF.entry.sent_on.to_lxoffice("precision" => "second")) %]</td>
25
  </tr>
26

  
27
  <tr class="listrow">
28
   <th>[%- LxERP.t8("Status") %]</th>
29
   <td>
30
       [% P.email_journal.entry_status(SELF.entry) %]
31
   </td>
32
  </tr>
33

  
34
  <tr class="listrow">
35
   <th>[%- LxERP.t8("Extended status") %]</th>
36
   <td><pre>[%- HTML.escape(SELF.entry.extended_status) %]</pre></td>
37
  </tr>
38

  
39
  <tr class="listrow">
40
   <th>[%- LxERP.t8("Headers") %]</th>
41
   <td><pre>[% HTML.escape(SELF.entry.headers) %]</pre></td>
42
  </tr>
43

  
44
  <tr class="listrow">
45
   <th>[%- LxERP.t8("Body") %]</th>
46
   <td>
47
    [%- IF SELF.entry.headers.match('(?i)content-type:.*text/html') %]
48
     [% P.restricted_html(SELF.entry.body) %]
49
    [%- ELSE %]
50
     <pre>[% HTML.escape(SELF.entry.body) %]</pre>
51
    [%- END %]
52
   </td>
53
  </tr>
54
</table>
55

  
56
</div><!-- /#ui-tabs-basic-data -->

Auch abrufbar als: Unified diff