From 9c5f94c0359a8f2c0dba93b5e9bdef99f332fcc8 Mon Sep 17 00:00:00 2001
From: Moritz Bunkus
Date: Tue, 19 Apr 2016 10:43:43 +0200
Subject: [PATCH] =?utf8?q?Wiederkerende=20Rechnungen:=20Konfiguration=20f?=
=?utf8?q?=C3=BCr=20automatischen=20Versand=20via=20E-Mail?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit
---
SL/DB/MetaSetup/PeriodicInvoicesConfig.pm | 41 +++++++++++-------
SL/OE.pm | 2 +-
bin/mozilla/oe.pl | 11 ++++-
css/kivitendo/main.css | 5 +++
js/edit_periodic_invoices_config.js | 6 ++-
locale/de/all | 4 ++
scripts/rose_auto_create_model.pl | 2 +-
.../periodic_invoices_send_email.sql | 18 ++++++++
.../oe/edit_periodic_invoices_config.html | 42 ++++++++++++++++++-
9 files changed, 110 insertions(+), 21 deletions(-)
create mode 100644 sql/Pg-upgrade2/periodic_invoices_send_email.sql
diff --git a/SL/DB/MetaSetup/PeriodicInvoicesConfig.pm b/SL/DB/MetaSetup/PeriodicInvoicesConfig.pm
index 0c0545384..9cb9998af 100644
--- a/SL/DB/MetaSetup/PeriodicInvoicesConfig.pm
+++ b/SL/DB/MetaSetup/PeriodicInvoicesConfig.pm
@@ -9,21 +9,27 @@ use parent qw(SL::DB::Object);
__PACKAGE__->meta->table('periodic_invoices_configs');
__PACKAGE__->meta->columns(
- active => { type => 'boolean', default => 'true' },
- ar_chart_id => { type => 'integer', not_null => 1 },
- copies => { type => 'integer' },
- direct_debit => { type => 'boolean', default => 'false', not_null => 1 },
- end_date => { type => 'date' },
- extend_automatically_by => { type => 'integer' },
- first_billing_date => { type => 'date' },
- id => { type => 'integer', not_null => 1, sequence => 'id' },
- oe_id => { type => 'integer', not_null => 1 },
- order_value_periodicity => { type => 'varchar', length => 1, not_null => 1 },
- periodicity => { type => 'varchar', length => 1, not_null => 1 },
- print => { type => 'boolean', default => 'false' },
- printer_id => { type => 'integer' },
- start_date => { type => 'date' },
- terminated => { type => 'boolean', default => 'false' },
+ active => { type => 'boolean', default => 'true' },
+ ar_chart_id => { type => 'integer', not_null => 1 },
+ copies => { type => 'integer' },
+ direct_debit => { type => 'boolean', default => 'false', not_null => 1 },
+ email_body => { type => 'text' },
+ email_recipient_address => { type => 'text' },
+ email_recipient_contact_id => { type => 'integer' },
+ email_sender => { type => 'text' },
+ email_subject => { type => 'text' },
+ end_date => { type => 'date' },
+ extend_automatically_by => { type => 'integer' },
+ first_billing_date => { type => 'date' },
+ id => { type => 'integer', not_null => 1, sequence => 'id' },
+ oe_id => { type => 'integer', not_null => 1 },
+ order_value_periodicity => { type => 'varchar', length => 1, not_null => 1 },
+ periodicity => { type => 'varchar', length => 1, not_null => 1 },
+ print => { type => 'boolean', default => 'false' },
+ printer_id => { type => 'integer' },
+ send_email => { type => 'boolean', default => 'false', not_null => 1 },
+ start_date => { type => 'date' },
+ terminated => { type => 'boolean', default => 'false' },
);
__PACKAGE__->meta->primary_key_columns([ 'id' ]);
@@ -34,6 +40,11 @@ __PACKAGE__->meta->foreign_keys(
key_columns => { ar_chart_id => 'id' },
},
+ email_recipient_contact => {
+ class => 'SL::DB::Contact',
+ key_columns => { email_recipient_contact_id => 'cp_id' },
+ },
+
order => {
class => 'SL::DB::Order',
key_columns => { oe_id => 'id' },
diff --git a/SL/OE.pm b/SL/OE.pm
index 0282f569e..7a045bfcb 100644
--- a/SL/OE.pm
+++ b/SL/OE.pm
@@ -805,7 +805,7 @@ sub load_periodic_invoice_config {
if ($config_obj) {
my $config = { map { $_ => $config_obj->$_ } qw(active terminated periodicity order_value_periodicity start_date_as_date end_date_as_date first_billing_date_as_date extend_automatically_by ar_chart_id
- print printer_id copies direct_debit) };
+ print printer_id copies direct_debit send_email email_recipient_contact_id email_recipient_address email_sender email_subject email_body) };
$form->{periodic_invoices_config} = YAML::Dump($config);
}
}
diff --git a/bin/mozilla/oe.pl b/bin/mozilla/oe.pl
index 131f3f817..5755e1a47 100644
--- a/bin/mozilla/oe.pl
+++ b/bin/mozilla/oe.pl
@@ -2077,6 +2077,10 @@ sub edit_periodic_invoices_config {
$::form->{AR} = [ grep { $_->{link} =~ m/(?:^|:)AR(?::|$)/ } @{ $::form->{ALL_CHARTS} } ];
$::form->{title} = $::locale->text('Edit the configuration for periodic invoices');
+ if ($::form->{customer_id}) {
+ $::form->{ALL_CONTACTS} = SL::DB::Manager::Contact->get_all_sorted(where => [ cp_cv_id => $::form->{customer_id} ]);
+ }
+
$::form->header(no_layout => 1);
print $::form->parse_html_template('oe/edit_periodic_invoices_config', $config);
@@ -2105,6 +2109,12 @@ sub save_periodic_invoices_config {
copies => $::form->{copies} * 1 ? $::form->{copies} : 1,
extend_automatically_by => $::form->{extend_automatically_by} * 1 || undef,
ar_chart_id => $::form->{ar_chart_id} * 1,
+ send_email => $::form->{send_email} ? 1 : 0,
+ email_recipient_contact_id => $::form->{email_recipient_contact_id} * 1 || undef,
+ email_recipient_address => $::form->{email_recipient_address},
+ email_sender => $::form->{email_sender},
+ email_subject => $::form->{email_subject},
+ email_body => $::form->{email_body},
};
$::form->{periodic_invoices_config} = YAML::Dump($config);
@@ -2214,4 +2224,3 @@ sub dispatcher {
$::form->error($::locale->text('No action defined.'));
}
-
diff --git a/css/kivitendo/main.css b/css/kivitendo/main.css
index 9c5ea64c5..fc6b38fd9 100644
--- a/css/kivitendo/main.css
+++ b/css/kivitendo/main.css
@@ -73,6 +73,11 @@ hr {
height: 2px;
}
+tr.rule-before th, tr.rule-before td {
+ padding-top: 2px;
+ border-top: 2px solid #EBEBEB;
+}
+
/* I.E. & Chrome können das nicht! */
/* input[type="radio"], input[type="checkbox"]{
width:1.15em;
diff --git a/js/edit_periodic_invoices_config.js b/js/edit_periodic_invoices_config.js
index b969e1dde..775f58418 100644
--- a/js/edit_periodic_invoices_config.js
+++ b/js/edit_periodic_invoices_config.js
@@ -1,13 +1,15 @@
function edit_periodic_invoices_config() {
- var width = 750;
- var height = 550;
+ var width = 800;
+ var height = 650;
var parm = centerParms(width, height) + ",width=" + width + ",height=" + height + ",status=yes,scrollbars=yes";
var config = $('#periodic_invoices_config').val();
+ var cus_id = $('[name=customer_id]').val();
var transdate = $('#transdate').val();
var url = "oe.pl?" +
"action=edit_periodic_invoices_config&" +
+ "customer_id=" + encodeURIComponent(cus_id) + "&" +
"periodic_invoices_config=" + encodeURIComponent(config) + "&" +
"transdate=" + encodeURIComponent(transdate || '');
diff --git a/locale/de/all b/locale/de/all
index abcbacfbe..1fe9ed759 100755
--- a/locale/de/all
+++ b/locale/de/all
@@ -595,6 +595,7 @@ $self->{texts} = {
'Contact is in use and was flagged invalid.' => 'Die Ansprechperson ist noch in Verwendung und wurde deshalb nur als ungültig markiert.',
'Contact person (surname)' => 'Ansprechperson (Nachname)',
'Contact persons' => 'Ansprechpersonen',
+ 'Contact to send to' => 'An Ansprechperson schicken',
'Contacts' => 'Ansprechpersonen',
'Content' => 'Inhalt',
'Continue' => 'Weiter',
@@ -1704,6 +1705,7 @@ $self->{texts} = {
'More than one #1 found matching, please be more specific.' => 'Mehr als ein #1 wurde gefunden, bitte geben Sie den Namen genauer an.',
'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
'Multi mode not supported.' => 'Multimodus wird nicht unterstützt.',
+ 'Multiple addresses can be entered separated by commas.' => 'Mehrere Adressen können durch Kommata getrennt angegeben werden.',
'MwSt. inkl.' => 'MwSt. inkl.',
'Name' => 'Name',
'Name and Street' => 'Name und StraÃe',
@@ -1912,6 +1914,7 @@ $self->{texts} = {
'Orphaned' => 'Nie benutzt',
'Orphaned currencies' => 'Verwaiste Währungen',
'Other Matches' => 'Andere Treffer',
+ 'Other recipients' => 'Weitere EmpfängerInnen',
'Other users\' follow-ups' => 'Wiedervorlagen anderer Benutzer',
'Other values are ignored.' => 'Andere Eingaben werden ignoriert.',
'Others' => 'Andere',
@@ -2448,6 +2451,7 @@ $self->{texts} = {
'Sellprice for price group \'#1\'' => 'Verkaufspreis für Preisgruppe \'#1\'',
'Sellprice significant places' => 'Verkaufspreis: Nachkommastellen',
'Semicolon' => 'Semikolon',
+ 'Send invoice via email' => 'Rechnung via E-Mail verschicken',
'Send letter via e-mail' => 'Brief via E-Mail verschicken',
'Sender' => 'AbsenderIn',
'Sending E-mail: ' => 'E-Mail versenden: ',
diff --git a/scripts/rose_auto_create_model.pl b/scripts/rose_auto_create_model.pl
index 9334934ae..fd43a0506 100755
--- a/scripts/rose_auto_create_model.pl
+++ b/scripts/rose_auto_create_model.pl
@@ -73,7 +73,7 @@ our %foreign_key_name_map = (
follow_ups => { created_for_user => 'created_for_employee', created_by => 'created_by_employee', },
follow_up_access => { who => 'with_access', what => 'to_follow_ups_by', },
- periodic_invoices_configs => { oe_id => 'order' },
+ periodic_invoices_configs => { oe_id => 'order', email_recipient_contact_id => 'email_recipient_contact' },
reconciliation_links => { acc_trans_id => 'acc_trans' },
},
);
diff --git a/sql/Pg-upgrade2/periodic_invoices_send_email.sql b/sql/Pg-upgrade2/periodic_invoices_send_email.sql
new file mode 100644
index 000000000..91eab25ec
--- /dev/null
+++ b/sql/Pg-upgrade2/periodic_invoices_send_email.sql
@@ -0,0 +1,18 @@
+-- @tag: periodic_invoices_send_email
+-- @description: Wiederkehrende Rechnungen automatisch per E-Mail verschicken
+-- @depends: release_3_4_0
+ALTER TABLE periodic_invoices_configs ADD COLUMN send_email BOOLEAN;
+ALTER TABLE periodic_invoices_configs ADD COLUMN email_recipient_contact_id INTEGER;
+ALTER TABLE periodic_invoices_configs ADD COLUMN email_recipient_address TEXT;
+ALTER TABLE periodic_invoices_configs ADD COLUMN email_sender TEXT;
+ALTER TABLE periodic_invoices_configs ADD COLUMN email_subject TEXT;
+ALTER TABLE periodic_invoices_configs ADD COLUMN email_body TEXT;
+
+UPDATE periodic_invoices_configs SET send_email = FALSE;
+
+ALTER TABLE periodic_invoices_configs ALTER COLUMN send_email SET DEFAULT FALSE;
+ALTER TABLE periodic_invoices_configs ALTER COLUMN send_email SET NOT NULL;
+
+ALTER TABLE periodic_invoices_configs
+ADD FOREIGN KEY (email_recipient_contact_id) REFERENCES contacts (cp_id)
+ON DELETE SET NULL;
diff --git a/templates/webpages/oe/edit_periodic_invoices_config.html b/templates/webpages/oe/edit_periodic_invoices_config.html
index 8ee4952af..63cc7fa1c 100644
--- a/templates/webpages/oe/edit_periodic_invoices_config.html
+++ b/templates/webpages/oe/edit_periodic_invoices_config.html
@@ -77,7 +77,7 @@
[% L.checkbox_tag("direct_debit", checked=direct_debit) %] |
-
+
[%- LxERP.t8('Print automatically') %] |
[% L.checkbox_tag("print", onclick => "toggle_printer_id_ctrl()", checked => print) %]
@@ -95,6 +95,36 @@
| [%- LxERP.t8('Copies') %] |
[% L.input_tag("copies", copies, size => 6, disabled => !print) %] |
+
+
+ [%- LxERP.t8("Send invoice via email") %] |
+ [% L.checkbox_tag("send_email", onclick => "toggle_send_email_ctrl()", checked=send_email) %] |
+
+
+
+ [%- LxERP.t8("Contact to send to") %] |
+ [% L.select_tag("email_recipient_contact_id", ALL_CONTACTS, title_key="full_name_dep", value_key="cp_id", default=email_recipient_contact_id, with_empty=1, disabled=!send_email, style=style) %] |
+
+
+
+ [%- LxERP.t8("Other recipients") %]3 |
+ [% L.input_tag("email_recipient_address", email_recipient_address, disabled=!send_email, style=style) %] |
+
+
+
+ [%- LxERP.t8("Sender") %] |
+ [% L.input_tag("email_sender", email_sender, disabled=!send_email, style=style) %] |
+
+
+
+ [%- LxERP.t8("Subject") %] |
+ [% L.input_tag("email_subject", email_subject, disabled=!send_email, style=style) %] |
+
+
+
+ [%- LxERP.t8("Message") %] |
+ [% L.textarea_tag("email_body", email_body, disabled=!send_email, rows=8, style=style) %] |
+
@@ -102,6 +132,7 @@
(1): [%- LxERP.t8('The end date is the last day for which invoices will possibly be created.') %]
(2): [% LxERP.t8("If missing then the start date will be used.") %]
+ (3): [% LxERP.t8("Multiple addresses can be entered separated by commas.") %]
[% L.hidden_tag('action', 'save_periodic_invoices_config') %]
@@ -118,5 +149,14 @@
$('#printer_id').prop('disabled', disabled);
$('#copies').prop('disabled', disabled);
}
+
+ function toggle_send_email_ctrl() {
+ var disabled = !$('#send_email').prop('checked');
+ $('#email_recipient_contact_id').prop('disabled', disabled);
+ $('#email_recipient_address').prop('disabled', disabled);
+ $('#email_from').prop('disabled', disabled);
+ $('#email_subject').prop('disabled', disabled);
+ $('#email_body').prop('disabled', disabled);
+ }
-->
--
2.20.1