From: Jan Büren
Date: Wed, 7 Nov 2012 10:58:16 +0000 (+0100)
Subject: Merge branch 'master' of vc.linet-services.de:public/lx-office-erp
X-Git-Tag: release-3.0.0beta1~48^2^2~2
X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/commitdiff_plain/9d218dc8b07ff4f9be9589cb3246e50653e2b6e2?hp=075bd42af8885aee3c18fe055a2c82b8b43f4cea
Merge branch 'master' of vc.linet-services.de:public/lx-office-erp
---
diff --git a/SL/AM.pm b/SL/AM.pm
index 1a085b8bd..6862eb773 100644
--- a/SL/AM.pm
+++ b/SL/AM.pm
@@ -243,6 +243,18 @@ sub save_account {
$form->{id} = "";
}
+ $query = '
+ SELECT
+ accno
+ FROM chart
+ WHERE accno = ?';
+ my ($accno) = selectrow_query($form, $dbh, $query, $form->{accno});
+
+ if ($accno) {
+ $form->error($::locale->text('Account number not unique!'));
+ }
+
+
if (!$form->{id} || $form->{id} eq "") {
$query = qq|SELECT nextval('id')|;
($form->{"id"}) = selectrow_query($form, $dbh, $query);
@@ -269,17 +281,6 @@ sub save_account {
$form->{valid_from} = '';
};
- $query = '
- SELECT
- accno
- FROM chart
- WHERE accno = ?';
- my ($accno) = selectrow_query($form, $dbh, $query, $form->{accno});
-
- if ($accno) {
- $form->error($::locale->text('Account number not unique!'));
- }
-
$query = qq|UPDATE chart SET
accno = ?,
description = ?,
diff --git a/SL/AP.pm b/SL/AP.pm
index eda1e71f4..95bde38e5 100644
--- a/SL/AP.pm
+++ b/SL/AP.pm
@@ -38,7 +38,7 @@ use SL::DATEV qw(:CONSTANTS);
use SL::DBUtils;
use SL::IO;
use SL::MoreCommon;
-
+use SL::DB::Default;
use Data::Dumper;
use strict;
@@ -251,7 +251,7 @@ sub post_transaction {
# add paid transactions
for my $i (1 .. $form->{paidaccounts}) {
- if ($form->{"acc_trans_id_$i"} && $payments_only && ($::lx_office_conf{features}->{payments_changeable} == 0)) {
+ if ($form->{"acc_trans_id_$i"} && $payments_only && (SL::DB::Default->get->payments_changeable == 0)) {
next;
}
@@ -355,7 +355,7 @@ sub post_transaction {
IO->set_datepaid(table => 'ap', id => $form->{id}, dbh => $dbh);
# safety check datev export
- if ($::lx_office_conf{datev_check}{check_on_ap_transaction}) {
+ if ($::instance_conf->get_datev_check_on_ap_transaction) {
my $transdate = $::form->{transdate} ? DateTime->from_lxoffice($::form->{transdate}) : undef;
$transdate ||= DateTime->today;
@@ -593,7 +593,7 @@ sub post_payment {
$old_form = save_form();
# Delete all entries in acc_trans from prior payments.
- if ($::lx_office_conf{features}->{payments_changeable} != 0) {
+ if (SL::DB::Default->get->payments_changeable != 0) {
$self->_delete_payments($form, $dbh);
}
diff --git a/SL/AR.pm b/SL/AR.pm
index 8c72d3cf9..1f8a0c0f5 100644
--- a/SL/AR.pm
+++ b/SL/AR.pm
@@ -39,6 +39,7 @@ use SL::DATEV qw(:CONSTANTS);
use SL::DBUtils;
use SL::IO;
use SL::MoreCommon;
+use SL::DB::Default;
use strict;
@@ -203,7 +204,7 @@ sub post_transaction {
# add paid transactions
for my $i (1 .. $form->{paidaccounts}) {
- if ($form->{"acc_trans_id_$i"} && $payments_only && ($::lx_office_conf{features}->{payments_changeable} == 0)) {
+ if ($form->{"acc_trans_id_$i"} && $payments_only && (SL::DB::Default->get->payments_changeable == 0)) {
next;
}
@@ -275,7 +276,7 @@ sub post_transaction {
IO->set_datepaid(table => 'ar', id => $form->{id}, dbh => $dbh);
# safety check datev export
- if ($::lx_office_conf{datev_check}{check_on_ar_transaction}) {
+ if ($::instance_conf->get_datev_check_on_ar_transaction) {
my $transdate = $::form->{transdate} ? DateTime->from_lxoffice($::form->{transdate}) : undef;
$transdate ||= DateTime->today;
@@ -356,7 +357,7 @@ sub post_payment {
$old_form = save_form();
# Delete all entries in acc_trans from prior payments.
- if ($::lx_office_conf{features}->{payments_changeable} != 0) {
+ if (SL::DB::Default->get->payments_changeable != 0) {
$self->_delete_payments($form, $dbh);
}
diff --git a/SL/BackgroundJob/Base.pm b/SL/BackgroundJob/Base.pm
index 27f608129..912fdc6fd 100644
--- a/SL/BackgroundJob/Base.pm
+++ b/SL/BackgroundJob/Base.pm
@@ -4,7 +4,14 @@ use strict;
use parent qw(Rose::Object);
+use IO::Dir;
use SL::DB::BackgroundJob;
+use SL::System::Process;
+
+sub get_known_job_classes {
+ tie my %dir_h, 'IO::Dir', File::Spec->catdir(File::Spec->splitdir(SL::System::Process->exe_dir), 'SL', 'BackgroundJob');
+ return sort map { s/\.pm$//; $_ } grep { m/\.pm$/ && !m/(?: ALL | Base) \.pm$/x } keys %dir_h;
+}
sub create_standard_job {
my $self_or_class = shift;
diff --git a/SL/Controller/BackgroundJob.pm b/SL/Controller/BackgroundJob.pm
index 7729dafe1..797797782 100644
--- a/SL/Controller/BackgroundJob.pm
+++ b/SL/Controller/BackgroundJob.pm
@@ -4,6 +4,7 @@ use strict;
use parent qw(SL::Controller::Base);
+use SL::BackgroundJob::Base;
use SL::Controller::Helper::GetModels;
use SL::Controller::Helper::Paginated;
use SL::Controller::Helper::Sorted;
@@ -50,13 +51,18 @@ sub action_list {
sub action_new {
my ($self) = @_;
- $self->background_job(SL::DB::BackgroundJob->new(cron_spec => '* * * * *'));
- $self->render('background_job/form', title => $::locale->text('Create a new background job'));
+ $self->background_job(SL::DB::BackgroundJob->new(cron_spec => '* * * * *', package_name => 'Test'));
+ $self->render('background_job/form',
+ title => $::locale->text('Create a new background job'),
+ JOB_CLASSES => [ SL::BackgroundJob::Base->get_known_job_classes ]);
}
sub action_edit {
my ($self) = @_;
- $self->render('background_job/form', title => $::locale->text('Edit background job'));
+
+ $self->render('background_job/form',
+ title => $::locale->text('Edit background job'),
+ JOB_CLASSES => [ SL::BackgroundJob::Base->get_known_job_classes ]);
}
sub action_create {
diff --git a/SL/Controller/ClientConfig.pm b/SL/Controller/ClientConfig.pm
new file mode 100644
index 000000000..aaed72fc5
--- /dev/null
+++ b/SL/Controller/ClientConfig.pm
@@ -0,0 +1,79 @@
+package SL::Controller::ClientConfig;
+
+use strict;
+use parent qw(SL::Controller::Base);
+
+use SL::DB::Default;
+use SL::Helper::Flash;
+
+__PACKAGE__->run_before('check_auth');
+
+
+sub action_edit {
+ my ($self, %params) = @_;
+
+ $self->{posting_options} = [ { title => $::locale->text("never"), value => 0 },
+ { title => $::locale->text("every time"), value => 1 },
+ { title => $::locale->text("on the same day"), value => 2 }, ];
+ $self->{payment_options} = [ { title => $::locale->text("never"), value => 0 },
+ { title => $::locale->text("every time"), value => 1 },
+ { title => $::locale->text("on the same day"), value => 2 }, ];
+ $self->{accounting_options} = [ { title => $::locale->text("accrual"), value => "accrual" },
+ { title => $::locale->text("cash"), value => "cash" }, ];
+ $self->{inventory_options} = [ { title => $::locale->text("perpetual"), value => "perpetual" },
+ { title => $::locale->text("periodic"), value => "periodic" }, ];
+ $self->{profit_options} = [ { title => $::locale->text("balance"), value => "balance" },
+ { title => $::locale->text("income"), value => "income" }, ];
+
+ map { $self->{$_} = SL::DB::Default->get->$_ } qw(is_changeable ir_changeable ar_changeable ap_changeable gl_changeable);
+
+ $self->{payments_changeable} = SL::DB::Default->get->payments_changeable;
+
+ map { $self->{$_} = SL::DB::Default->get->$_ } qw(is_show_mark_as_paid ir_show_mark_as_paid ar_show_mark_as_paid ap_show_mark_as_paid);
+
+ map { $self->{$_} = SL::DB::Default->get->$_ } qw(accounting_method inventory_system profit_determination);
+
+ $self->{show_bestbefore} = SL::DB::Default->get->show_bestbefore;
+
+ map { $self->{$_} = SL::DB::Default->get->$_ } qw(datev_check_on_sales_invoice datev_check_on_purchase_invoice datev_check_on_ar_transaction datev_check_on_ap_transaction datev_check_on_gl_transaction);
+ # datev check: not implemented yet:
+ #check_on_cash_and_receipt = 0
+ #check_on_dunning = 0
+ #check_on_sepa_import = 0
+
+ map { $self->{$_} = SL::DB::Default->get->$_ } qw(sales_order_show_delete purchase_order_show_delete sales_delivery_order_show_delete purchase_delivery_order_show_delete);
+
+ $self->render('client_config/form', title => $::locale->text('Client Configuration'));
+}
+
+
+sub action_save {
+ my ($self, %params) = @_;
+
+ map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(is_changeable ir_changeable ar_changeable ap_changeable gl_changeable);
+
+ SL::DB::Default->get->update_attributes('payments_changeable' => $::form->{payments_changeable});
+
+ map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(is_show_mark_as_paid ir_show_mark_as_paid ar_show_mark_as_paid ap_show_mark_as_paid);
+
+ map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(accounting_method inventory_system profit_determination);
+
+ SL::DB::Default->get->update_attributes('show_bestbefore' => $::form->{show_bestbefore});
+
+ map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(datev_check_on_sales_invoice datev_check_on_purchase_invoice datev_check_on_ar_transaction datev_check_on_ap_transaction datev_check_on_gl_transaction);
+
+ map { SL::DB::Default->get->update_attributes($_ => $::form->{$_}); } qw(sales_order_show_delete purchase_order_show_delete sales_delivery_order_show_delete purchase_delivery_order_show_delete);
+
+ flash_later('info', $::locale->text('Client Configuration saved!'));
+
+ $self->redirect_to(action => 'edit');
+}
+
+
+#################### private stuff ##########################
+
+sub check_auth {
+ $::auth->assert('admin');
+}
+
+1;
diff --git a/SL/DB/MetaSetup/Default.pm b/SL/DB/MetaSetup/Default.pm
index 53ecc68e9..9365eac9d 100644
--- a/SL/DB/MetaSetup/Default.pm
+++ b/SL/DB/MetaSetup/Default.pm
@@ -10,43 +10,63 @@ __PACKAGE__->meta->setup(
table => 'defaults',
columns => [
- inventory_accno_id => { type => 'integer' },
- income_accno_id => { type => 'integer' },
- expense_accno_id => { type => 'integer' },
- fxgain_accno_id => { type => 'integer' },
- fxloss_accno_id => { type => 'integer' },
- invnumber => { type => 'text' },
- sonumber => { type => 'text' },
- weightunit => { type => 'varchar', length => 5 },
- businessnumber => { type => 'text' },
- version => { type => 'varchar', length => 8 },
- curr => { type => 'text' },
- closedto => { type => 'date' },
- revtrans => { type => 'boolean', default => 'false' },
- ponumber => { type => 'text' },
- sqnumber => { type => 'text' },
- rfqnumber => { type => 'text' },
- customernumber => { type => 'text' },
- vendornumber => { type => 'text' },
- audittrail => { type => 'boolean', default => 'false' },
- articlenumber => { type => 'text' },
- servicenumber => { type => 'text' },
- coa => { type => 'text' },
- itime => { type => 'timestamp', default => 'now()' },
- mtime => { type => 'timestamp' },
- rmanumber => { type => 'text' },
- cnnumber => { type => 'text' },
- dunning_ar_amount_fee => { type => 'integer' },
- dunning_ar_amount_interest => { type => 'integer' },
- dunning_ar => { type => 'integer' },
- pdonumber => { type => 'text' },
- sdonumber => { type => 'text' },
- ar_paid_accno_id => { type => 'integer' },
- id => { type => 'serial', not_null => 1 },
- accounting_method => { type => 'text' },
- inventory_system => { type => 'text' },
- profit_determination => { type => 'text' },
- language_id => { type => 'integer' },
+ inventory_accno_id => { type => 'integer' },
+ income_accno_id => { type => 'integer' },
+ expense_accno_id => { type => 'integer' },
+ fxgain_accno_id => { type => 'integer' },
+ fxloss_accno_id => { type => 'integer' },
+ invnumber => { type => 'text' },
+ sonumber => { type => 'text' },
+ weightunit => { type => 'varchar', length => 5 },
+ businessnumber => { type => 'text' },
+ version => { type => 'varchar', length => 8 },
+ curr => { type => 'text' },
+ closedto => { type => 'date' },
+ revtrans => { type => 'boolean', default => 'false' },
+ ponumber => { type => 'text' },
+ sqnumber => { type => 'text' },
+ rfqnumber => { type => 'text' },
+ customernumber => { type => 'text' },
+ vendornumber => { type => 'text' },
+ audittrail => { type => 'boolean', default => 'false' },
+ articlenumber => { type => 'text' },
+ servicenumber => { type => 'text' },
+ coa => { type => 'text' },
+ itime => { type => 'timestamp', default => 'now()' },
+ mtime => { type => 'timestamp' },
+ rmanumber => { type => 'text' },
+ cnnumber => { type => 'text' },
+ accounting_method => { type => 'text' },
+ inventory_system => { type => 'text' },
+ profit_determination => { type => 'text' },
+ dunning_ar_amount_fee => { type => 'integer' },
+ dunning_ar_amount_interest => { type => 'integer' },
+ dunning_ar => { type => 'integer' },
+ pdonumber => { type => 'text' },
+ sdonumber => { type => 'text' },
+ ar_paid_accno_id => { type => 'integer' },
+ id => { type => 'serial', not_null => 1 },
+ language_id => { type => 'integer' },
+ payments_changeable => { type => 'integer', default => '0', not_null => 1 },
+ show_bestbefore => { type => 'boolean', default => 'false' },
+ datev_check_on_sales_invoice => { type => 'boolean', default => 'true' },
+ datev_check_on_purchase_invoice => { type => 'boolean', default => 'true' },
+ datev_check_on_ar_transaction => { type => 'boolean', default => 'true' },
+ datev_check_on_ap_transaction => { type => 'boolean', default => 'true' },
+ datev_check_on_gl_transaction => { type => 'boolean', default => 'true' },
+ is_changeable => { type => 'integer', default => 2, not_null => 1 },
+ ir_changeable => { type => 'integer', default => 2, not_null => 1 },
+ ar_changeable => { type => 'integer', default => 2, not_null => 1 },
+ ap_changeable => { type => 'integer', default => 2, not_null => 1 },
+ gl_changeable => { type => 'integer', default => 2, not_null => 1 },
+ is_show_mark_as_paid => { type => 'boolean', default => 'true' },
+ ir_show_mark_as_paid => { type => 'boolean', default => 'true' },
+ ar_show_mark_as_paid => { type => 'boolean', default => 'true' },
+ ap_show_mark_as_paid => { type => 'boolean', default => 'true' },
+ sales_order_show_delete => { type => 'boolean', default => 'true' },
+ purchase_order_show_delete => { type => 'boolean', default => 'true' },
+ sales_delivery_order_show_delete => { type => 'boolean', default => 'true' },
+ purchase_delivery_order_show_delete => { type => 'boolean', default => 'true' },
],
primary_key_columns => [ 'id' ],
diff --git a/SL/DN.pm b/SL/DN.pm
index 94e5b7708..46749ab37 100644
--- a/SL/DN.pm
+++ b/SL/DN.pm
@@ -368,6 +368,7 @@ sub send_email {
my $template = SL::Template::create(type => 'PlainText', form => $form, myconfig => $myconfig);
my $mail = Mailer->new();
+ $mail->{charset} = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
$mail->{from} = $myconfig->{email};
$mail->{to} = $ref->{recipient};
$mail->{subject} = $template->parse_block($ref->{email_subject});
diff --git a/SL/Form.pm b/SL/Form.pm
index c14024f95..ce887c347 100644
--- a/SL/Form.pm
+++ b/SL/Form.pm
@@ -634,11 +634,9 @@ sub _prepare_html_template {
$additional_params->{"conf_latex_templates"} = $::lx_office_conf{print_templates}->{latex};
$additional_params->{"conf_opendocument_templates"} = $::lx_office_conf{print_templates}->{opendocument};
$additional_params->{"conf_vertreter"} = $::lx_office_conf{features}->{vertreter};
- $additional_params->{"conf_show_best_before"} = $::lx_office_conf{features}->{show_best_before};
$additional_params->{"conf_parts_image_css"} = $::lx_office_conf{features}->{parts_image_css};
$additional_params->{"conf_parts_listing_images"} = $::lx_office_conf{features}->{parts_listing_images};
$additional_params->{"conf_parts_show_image"} = $::lx_office_conf{features}->{parts_show_image};
- $additional_params->{"conf_payments_changeable"} = $::lx_office_conf{features}->{payments_changeable};
$additional_params->{"INSTANCE_CONF"} = $::instance_conf;
if (my $debug_options = $::lx_office_conf{debug}{options}) {
diff --git a/SL/GL.pm b/SL/GL.pm
index cdd9d406f..c9fcd9c47 100644
--- a/SL/GL.pm
+++ b/SL/GL.pm
@@ -186,7 +186,7 @@ sub post_transaction {
}
# safety check datev export
- if ($::lx_office_conf{datev_check}{check_on_gl_transaction}) {
+ if ($::instance_conf->get_datev_check_on_gl_transaction) {
my $transdate = $::form->{transdate} ? DateTime->from_lxoffice($::form->{transdate}) : undef;
$transdate ||= DateTime->today;
diff --git a/SL/IR.pm b/SL/IR.pm
index 444dffceb..04e071e27 100644
--- a/SL/IR.pm
+++ b/SL/IR.pm
@@ -44,6 +44,7 @@ use SL::DO;
use SL::GenericTranslations;
use SL::IO;
use SL::MoreCommon;
+use SL::DB::Default;
use List::Util qw(min);
use strict;
@@ -502,7 +503,7 @@ sub post_invoice {
for my $i (1 .. $form->{paidaccounts}) {
if ($form->{"acc_trans_id_$i"}
&& $payments_only
- && ($::lx_office_conf{features}->{payments_changeable} == 0)) {
+ && (SL::DB::Default->get->payments_changeable == 0)) {
next;
}
@@ -685,7 +686,7 @@ sub post_invoice {
'table' => 'ap',);
# safety check datev export
- if ($::lx_office_conf{datev_check}{check_on_purchase_invoice}) {
+ if ($::instance_conf->get_datev_check_on_purchase_invoice) {
my $transdate = $::form->{invdate} ? DateTime->from_lxoffice($::form->{invdate}) : undef;
$transdate ||= DateTime->today;
@@ -1437,7 +1438,7 @@ sub post_payment {
$old_form = save_form();
# Delete all entries in acc_trans from prior payments.
- if ($::lx_office_conf{features}->{payments_changeable} != 0) {
+ if (SL::DB::Default->get->payments_changeable != 0) {
$self->_delete_payments($form, $dbh);
}
diff --git a/SL/IS.pm b/SL/IS.pm
index 266e05299..db18d5a43 100644
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -48,6 +48,7 @@ use SL::MoreCommon;
use SL::IC;
use SL::IO;
use SL::TransNumber;
+use SL::DB::Default;
use Data::Dumper;
use strict;
@@ -886,7 +887,7 @@ sub post_invoice {
if ($form->{"acc_trans_id_$i"}
&& $payments_only
- && ($::lx_office_conf{features}->{payments_changeable} == 0)) {
+ && (SL::DB::Default->get->payments_changeable == 0)) {
next;
}
@@ -1076,7 +1077,7 @@ sub post_invoice {
'table' => 'ar',);
# safety check datev export
- if ($::lx_office_conf{datev_check}{check_on_sales_invoice}) {
+ if ($::instance_conf->get_datev_check_on_sales_invoice) {
my $transdate = $::form->{invdate} ? DateTime->from_lxoffice($::form->{invdate}) : undef;
$transdate ||= DateTime->today;
@@ -1157,7 +1158,7 @@ sub post_payment {
$old_form = save_form();
# Delete all entries in acc_trans from prior payments.
- if ($::lx_office_conf{features}->{payments_changeable} != 0) {
+ if (SL::DB::Default->get->payments_changeable != 0) {
$self->_delete_payments($form, $dbh);
}
diff --git a/SL/InstallationCheck.pm b/SL/InstallationCheck.pm
index 451c41831..37f276c80 100644
--- a/SL/InstallationCheck.pm
+++ b/SL/InstallationCheck.pm
@@ -17,6 +17,7 @@ BEGIN {
{ name => "DBI", version => '1.50', url => "http://search.cpan.org/~timb/", debian => 'libdbi-perl' },
{ name => "DBD::Pg", version => '1.49', url => "http://search.cpan.org/~dbdpg/", debian => 'libdbd-pg-perl' },
{ name => "Email::Address", url => "http://search.cpan.org/~rjbs/", debian => 'libemail-address-perl' },
+ { name => "Email::MIME", url => "http://search.cpan.org/~rjbs/", debian => 'libemail-mime-perl' },
{ name => "FCGI", version => '0.72', url => "http://search.cpan.org/~mstrout/", debian => 'libfcgi-perl' },
{ name => "JSON", url => "http://search.cpan.org/~makamaka", debian => 'libjson-perl' },
{ name => "List::MoreUtils", version => '0.21', url => "http://search.cpan.org/~vparseval/", debian => 'liblist-moreutils-perl' },
@@ -41,7 +42,7 @@ BEGIN {
{ name => "Net::LDAP", url => "http://search.cpan.org/~gbarr/", debian => 'libnet-ldap-perl' },
# Net::SMTP is core since 5.7.3
{ name => "Net::SMTP::SSL", version => '1.01', url => "http://search.cpan.org/~cwest/", debian => 'libnet-smtp-ssl-perl' },
- { name => "Net::SMTP::TLS", version => '0.12', url => "http://search.cpan.org/~awestholm/", debian => 'libnet-smtp-tls-perl' },
+ { name => "Net::SSLGlue", version => '1.01', url => "http://search.cpan.org/~sullr/", debian => 'libnet-sslglue-perl' },
);
@developer_modules = (
diff --git a/SL/InstanceConfiguration.pm b/SL/InstanceConfiguration.pm
index 24fd3be28..ac14b0ae0 100644
--- a/SL/InstanceConfiguration.pm
+++ b/SL/InstanceConfiguration.pm
@@ -49,6 +49,101 @@ sub get_profit_determination {
return $self->{data}->{profit_determination};
}
+sub get_is_changeable {
+ my ($self) = @_;
+ return $self->{data}->{is_changeable};
+}
+
+sub get_ir_changeable {
+ my ($self) = @_;
+ return $self->{data}->{ir_changeable};
+}
+
+sub get_ar_changeable {
+ my ($self) = @_;
+ return $self->{data}->{ar_changeable};
+}
+
+sub get_ap_changeable {
+ my ($self) = @_;
+ return $self->{data}->{ap_changeable};
+}
+
+sub get_gl_changeable {
+ my ($self) = @_;
+ return $self->{data}->{gl_changeable};
+}
+
+sub get_datev_check_on_sales_invoice {
+ my ($self) = @_;
+ return $self->{data}->{datev_check_on_sales_invoice};
+}
+
+sub get_datev_check_on_purchase_invoice {
+ my ($self) = @_;
+ return $self->{data}->{datev_check_on_purchase_invoice};
+}
+
+sub get_datev_check_on_ar_transaction {
+ my ($self) = @_;
+ return $self->{data}->{datev_check_on_ar_transaction};
+}
+
+sub get_datev_check_on_ap_transaction {
+ my ($self) = @_;
+ return $self->{data}->{datev_check_on_ap_transaction};
+}
+
+sub get_datev_check_on_gl_transaction {
+ my ($self) = @_;
+ return $self->{data}->{datev_check_on_gl_transaction};
+}
+
+sub get_show_bestbefore {
+ my ($self) = @_;
+ return $self->{data}->{show_bestbefore};
+}
+
+sub get_is_show_mark_as_paid {
+ my ($self) = @_;
+ return $self->{data}->{is_show_mark_as_paid};
+}
+
+sub get_ir_show_mark_as_paid {
+ my ($self) = @_;
+ return $self->{data}->{ir_show_mark_as_paid};
+}
+
+sub get_ar_show_mark_as_paid {
+ my ($self) = @_;
+ return $self->{data}->{ar_show_mark_as_paid};
+}
+
+sub get_ap_show_mark_as_paid {
+ my ($self) = @_;
+ return $self->{data}->{ap_show_mark_as_paid};
+}
+
+sub get_sales_order_show_delete {
+ my ($self) = @_;
+ return $self->{data}->{sales_order_show_delete};
+}
+
+sub get_purchase_order_show_delete {
+ my ($self) = @_;
+ return $self->{data}->{purchase_order_show_delete};
+}
+
+sub get_sales_delivery_order_show_delete {
+ my ($self) = @_;
+ return $self->{data}->{sales_delivery_order_show_delete};
+}
+
+sub get_purchase_delivery_order_show_delete {
+ my ($self) = @_;
+ return $self->{data}->{purchase_delivery_order_show_delete};
+}
+
1;
__END__
@@ -101,6 +196,66 @@ Returns the default inventory system, perpetual or periodic
Returns the default profit determination method, balance or income
+
+=item C
+
+=item C
+
+=item C
+
+=item C
+
+=item C
+
+Returns if and when these record types are changeable or deleteable after
+posting. 0 means never, 1 means always and 2 means on the same day.
+
+=item C
+
+Returns true if datev check should be performed on sales invoices
+
+=item C
+
+Returns true if datev check should be performed on purchase invoices
+
+=item C
+
+Returns true if datev check should be performed on ar transactions
+
+=item C
+
+Returns true if datev check should be performed on ap transactions
+
+=item C
+
+Returns true if datev check should be performed on gl transactions
+
+=item C
+
+Returns the default behavior for showing best before date, true or false
+
+=item C
+
+=item C
+
+=item C
+
+=item C
+
+Returns the default behavior for showing the mark as paid button for the
+corresponding record type (true or false).
+
+=item C
+
+=item C
+
+=item C
+
+=item C
+
+Returns the default behavior for showing the delete button for the
+corresponding record type (true or false).
+
=back
=head1 BUGS
diff --git a/SL/Mailer.pm b/SL/Mailer.pm
index b04af08dd..2857e1c75 100644
--- a/SL/Mailer.pm
+++ b/SL/Mailer.pm
@@ -5,14 +5,6 @@
# Web http://www.lx-office.org
#
#=====================================================================
-# SQL-Ledger Accounting
-# Copyright (C) 2001
-#
-# Author: Dieter Simader
-# Email: dsimader@sql-ledger.org
-# Web: http://www.sql-ledger.org
-#
-# Contributors:
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -31,7 +23,8 @@
package Mailer;
use Email::Address;
-use Encode;
+use Email::MIME::Creator;
+use File::Slurp;
use SL::Common;
use SL::MIME;
@@ -42,13 +35,9 @@ use strict;
my $num_sent = 0;
sub new {
- $main::lxdebug->enter_sub();
-
my ($type, %params) = @_;
my $self = { %params };
- $main::lxdebug->leave_sub();
-
bless $self, $type;
}
@@ -61,232 +50,161 @@ sub _create_driver {
myconfig => \%::myconfig,
);
- my $cfg = $::lx_office_conf{mail_delivery};
- if (($cfg->{method} || 'smtp') ne 'smtp') {
- require SL::Mailer::Sendmail;
- return SL::Mailer::Sendmail->new(%params);
- } else {
- require SL::Mailer::SMTP;
- return SL::Mailer::SMTP->new(%params);
- }
-}
-
-sub mime_quote_text {
- $main::lxdebug->enter_sub();
-
- my ($self, $text, $chars_left) = @_;
-
- my $q_start = "=?$self->{charset}?Q?";
- my $l_start = length($q_start);
+ my $module = ($::lx_office_conf{mail_delivery}->{method} || 'smtp') ne 'smtp' ? 'SL::Mailer::Sendmail' : 'SL::Mailer::SMTP';
+ eval "require $module" or return undef;
- my $new_text = "$q_start";
- $chars_left -= $l_start if (defined $chars_left);
-
- for (my $i = 0; $i < length($text); $i++) {
- my $char = ord(substr($text, $i, 1));
-
- if (($char < 32) || ($char > 127) || ($char == ord('?')) || ($char == ord('_'))) {
- if ((defined $chars_left) && ($chars_left < 5)) {
- $new_text .= "?=\n $q_start";
- $chars_left = 75 - $l_start;
- }
-
- $new_text .= sprintf("=%02X", $char);
- $chars_left -= 3 if (defined $chars_left);
-
- } else {
- $char = ord('_') if ($char == ord(' '));
- if ((defined $chars_left) && ($chars_left < 5)) {
- $new_text .= "?=\n $q_start";
- $chars_left = 75 - $l_start;
- }
-
- $new_text .= chr($char);
- $chars_left-- if (defined $chars_left);
- }
- }
-
- $new_text .= "?=";
-
- $main::lxdebug->leave_sub();
-
- return $new_text;
+ return $module->new(%params);
}
-sub send {
- $main::lxdebug->enter_sub();
-
+sub _cleanup_addresses {
my ($self) = @_;
- local (*IN);
-
- $num_sent++;
- my $boundary = time() . "-$$-${num_sent}";
- $boundary = "LxOffice-$self->{version}-$boundary";
- my $domain = $self->recode($self->{from});
- $domain =~ s/(.*?\@|>)//g;
- my $msgid = "$boundary\@$domain";
-
- my $form = $main::form;
- my $myconfig = \%main::myconfig;
-
- my $driver = eval { $self->_create_driver };
- if (!$driver) {
- $main::lxdebug->leave_sub();
- return "send email : $@";
- }
-
- $self->{charset} ||= Common::DEFAULT_CHARSET;
- $self->{contenttype} ||= "text/plain";
-
foreach my $item (qw(to cc bcc)) {
- next unless ($self->{$item});
- $self->{$item} = $self->recode($self->{$item});
+ next unless $self->{$item};
+
$self->{$item} =~ s/\</{$item} =~ s/\$<\$/{$item} =~ s/\>/>/g;
$self->{$item} =~ s/\$>\$/>/g;
}
+}
- $self->{from} = $self->recode($self->{from});
+sub _create_message_id {
+ my ($self) = @_;
+
+ $num_sent += 1;
+ my $domain = $self->{from};
+ $domain =~ s/.*\@//;
+ $domain =~ s/>.*//;
+
+ return "kivitendo-$self->{version}-" . time() . "-${$}-${num_sent}\@$domain";
+}
+
+sub _create_address_headers {
+ my ($self) = @_;
+
+ $self->{addresses} = {};
- my %addresses;
- my $headers = '';
foreach my $item (qw(from to cc bcc)) {
- $addresses{$item} = [];
- next unless ($self->{$item});
+ $self->{addresses}->{$item} = [];
+ next if !$self->{$item} || $self->{driver}->keep_from_header($item);
- my (@addr_objects) = Email::Address->parse($self->{$item});
- next unless (scalar @addr_objects);
+ my @header_addresses;
- foreach my $addr_obj (@addr_objects) {
- push @{ $addresses{$item} }, $addr_obj->address;
+ foreach my $addr_obj (Email::Address->parse($self->{$item})) {
+ push @{ $self->{addresses}->{$item} }, $addr_obj->address;
my $phrase = $addr_obj->phrase();
if ($phrase) {
$phrase =~ s/^\"//;
$phrase =~ s/\"$//;
- $addr_obj->phrase($self->mime_quote_text($phrase));
+ $addr_obj->phrase($phrase);
}
- $headers .= sprintf("%s: %s\n", ucfirst($item), $addr_obj->format()) unless $driver->keep_from_header($item);
- }
- }
-
- $headers .= sprintf("Subject: %s\n", $self->mime_quote_text($self->recode($self->{subject}), 60));
-
- $driver->start_mail(from => $self->{from}, to => [ map { @{ $addresses{$_} } } qw(to cc bcc) ]);
-
- $driver->print(qq|${headers}Message-ID: <$msgid>
-X-Mailer: Lx-Office $self->{version}
-MIME-Version: 1.0
-|);
-
- if ($self->{attachments}) {
- $driver->print(qq|Content-Type: multipart/mixed; boundary="$boundary"\n\n|);
- if ($self->{message}) {
- $driver->print(qq|--${boundary}
-Content-Type: $self->{contenttype}; charset="$self->{charset}"
-
-| . $self->recode($self->{message}) . qq|
-
-|);
+ push @header_addresses, $addr_obj->format;
}
- foreach my $attachment (@{ $self->{attachments} }) {
-
- my $filename;
-
- if (ref($attachment) eq "HASH") {
- $filename = $attachment->{"name"};
- $attachment = $attachment->{"filename"};
- } else {
- $filename = $attachment;
- # strip path
- $filename =~ s/(.*\/|\Q$self->{fileid}\E)//g;
- }
-
- my $application = ($attachment =~ /(^\w+$)|\.(html|text|txt|sql)$/) ? "text" : "application";
- my $content_type = SL::MIME->mime_type_from_ext($filename);
- $content_type = "${application}/$self->{format}" if (!$content_type && $self->{format});
- $content_type ||= 'application/octet-stream';
-
- open(IN, $attachment);
- if ($?) {
- $main::lxdebug->leave_sub();
- return "$attachment : $!";
- }
-
- # only set charset for attachements of type text. every other type should not have this field
- # refer to bug 883 for detailed information
- my $attachment_charset;
- if (lc $application eq 'text' && $self->{charset}) {
- $attachment_charset = qq|; charset="$self->{charset}" |;
- }
+ push @{ $self->{headers} }, ( ucfirst($item) => join(', ', @header_addresses) ) if @header_addresses;
+ }
+}
- $driver->print(qq|--${boundary}
-Content-Type: ${content_type}; name="$filename"$attachment_charset
-Content-Transfer-Encoding: BASE64
-Content-Disposition: attachment; filename="$filename"\n\n|);
+sub _create_attachment_part {
+ my ($self, $attachment) = @_;
- my $msg = "";
- while () {
- ;
- $msg .= $_;
- }
- $driver->print(encode_base64($msg));
+ my $source_file_name;
- close(IN);
+ my %attributes = (
+ disposition => 'attachment',
+ encoding => 'base64',
+ );
- }
- $driver->print(qq|--${boundary}--\n|);
+ if (ref($attachment) eq "HASH") {
+ $attributes{filename} = $attachment->{name};
+ $source_file_name = $attachment->{filename};
} else {
- $driver->print(qq|Content-Type: $self->{contenttype}; charset="$self->{charset}"
-
-| . $self->recode($self->{message}) . qq|
-|);
+ # strip path
+ $attributes{filename} = $attachment;
+ $attributes{filename} =~ s:.*\Q$self->{fileid}\E:: if $self->{fileid};
+ $attributes{filename} =~ s:.*/::g;
+ $source_file_name = $attachment;
}
- $driver->send;
+ my $attachment_content = eval { read_file($source_file_name) };
+ return undef if !defined $attachment_content;
- $main::lxdebug->leave_sub();
+ my $application = ($attachment =~ /(^\w+$)|\.(html|text|txt|sql)$/) ? 'text' : 'application';
+ $attributes{content_type} = SL::MIME->mime_type_from_ext($attributes{filename});
+ $attributes{content_type} ||= "${application}/$self->{format}" if $self->{format};
+ $attributes{content_type} ||= 'application/octet-stream';
+ $attributes{charset} = $self->{charset} if lc $application eq 'text' && $self->{charset};
- return "";
+ return Email::MIME->create(
+ attributes => \%attributes,
+ body => $attachment_content,
+ );
}
-sub encode_base64 ($;$) {
- $main::lxdebug->enter_sub();
+sub _create_message {
+ my ($self) = @_;
- # this code is from the MIME-Base64-2.12 package
- # Copyright 1995-1999,2001 Gisle Aas
+ my @parts;
+
+ if ($self->{message}) {
+ push @parts, Email::MIME->create(
+ attributes => {
+ content_type => $self->{contenttype},
+ charset => $self->{charset},
+ encoding => 'quoted-printable',
+ },
+ body_str => $self->{message},
+ );
+
+ push @{ $self->{headers} }, (
+ 'Content-Type' => qq|$self->{contenttype}; charset="$self->{charset}"|,
+ );
+ }
- my $res = "";
- my $eol = $_[1];
- $eol = "\n" unless defined $eol;
- pos($_[0]) = 0; # ensure start at the beginning
+ push @parts, grep { $_ } map { $self->_create_attachment_part($_) } @{ $self->{attachments} || [] };
- $res = join '', map(pack('u', $_) =~ /^.(\S*)/, ($_[0] =~ /(.{1,45})/gs));
+ return Email::MIME->create(
+ header_str => $self->{headers},
+ parts => \@parts,
+ );
+}
- $res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs
- # fix padding at the end
- my $padding = (3 - length($_[0]) % 3) % 3;
- $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
+sub send {
+ my ($self) = @_;
- # break encoded string into lines of no more than 60 characters each
- if (length $eol) {
- $res =~ s/(.{1,60})/$1$eol/g;
+ # Create driver for delivery method (sendmail/SMTP)
+ $self->{driver} = eval { $self->_create_driver };
+ if (!$self->{driver}) {
+ $::lxdebug->leave_sub();
+ return "send email : $@";
}
- $main::lxdebug->leave_sub();
+ # Set defaults & headers
+ $self->{charset} ||= Common::DEFAULT_CHARSET;
+ $self->{contenttype} ||= "text/plain";
+ $self->{headers} = [
+ Subject => $self->{subject},
+ 'Message-ID' => $self->_create_message_id,
+ 'X-Mailer' => "kivitendo $self->{version}",
+ ];
- return $res;
-}
+ # Clean up To/Cc/Bcc address fields
+ $self->_cleanup_addresses;
+ $self->_create_address_headers;
+
+ my $email = $self->_create_message;
+
+ # $::lxdebug->message(0, "message: " . $email->as_string);
+ # return "boom";
-sub recode {
- my $self = shift;
- my $text = shift;
+ $self->{driver}->start_mail(from => $self->{from}, to => [ map { @{ $self->{addresses}->{$_} } } qw(to cc bcc) ]);
+ $self->{driver}->print($email->as_string);
+ $self->{driver}->send;
- return $::locale->is_utf8 ? Encode::encode('utf-8-strict', $text) : $text;
+ return '';
}
1;
diff --git a/SL/Mailer/SMTP.pm b/SL/Mailer/SMTP.pm
index 831bd72b4..8012a04cd 100644
--- a/SL/Mailer/SMTP.pm
+++ b/SL/Mailer/SMTP.pm
@@ -9,33 +9,31 @@ use Rose::Object::MakeMethods::Generic
scalar => [ qw(myconfig mailer form) ]
);
+my %security_config = (
+ none => { require_module => 'Net::SMTP', package => 'Net::SMTP', port => 25 },
+ tls => { require_module => 'Net::SSLGlue::SMTP', package => 'Net::SMTP', port => 25 },
+ ssl => { require_module => 'Net::SMTP::SSL', package => 'Net::SMTP::SSL', port => 465 },
+);
+
sub init {
my ($self) = @_;
Rose::Object::init(@_);
my $cfg = $::lx_office_conf{mail_delivery} || {};
- $self->{security} = lc($cfg->{security} || 'none');
-
- if ($self->{security} eq 'tls') {
- require Net::SMTP::TLS;
- my %params;
- if ($cfg->{login}) {
- $params{User} = $cfg->{user};
- $params{Password} = $cfg->{password};
- }
- $self->{smtp} = Net::SMTP::TLS->new($cfg->{host} || 'localhost', Port => $cfg->{port} || 25, %params);
-
- } else {
- my $module = $self->{security} eq 'ssl' ? 'Net::SMTP::SSL' : 'Net::SMTP';
- my $default_port = $self->{security} eq 'ssl' ? 465 : 25;
- eval "require $module" or die $@;
-
- $self->{smtp} = $module->new($cfg->{host} || 'localhost', Port => $cfg->{port} || $default_port);
- $self->{smtp}->auth($cfg->{user}, $cfg->{password}) if $cfg->{login};
- }
+ $self->{security} = exists $security_config{lc $cfg->{security}} ? lc $cfg->{security} : 'none';
+ my $sec_cfg = $security_config{ $self->{security} };
+
+ eval "require $sec_cfg->{require_module}" or die "$@";
+ $self->{smtp} = $sec_cfg->{package}->new($cfg->{host} || 'localhost', Port => $cfg->{port} || $sec_cfg->{port});
die unless $self->{smtp};
+
+ $self->{smtp}->starttls(SSL_verify_mode => 0) || die if $self->{security} eq 'tls';
+
+ return 1 unless $cfg->{login};
+
+ $self->{smtp}->auth($cfg->{user}, $cfg->{password}) or die;
}
sub start_mail {
diff --git a/SL/Mailer/Sendmail.pm b/SL/Mailer/Sendmail.pm
index 6b24ecdb5..ea1e63b8a 100644
--- a/SL/Mailer/Sendmail.pm
+++ b/SL/Mailer/Sendmail.pm
@@ -2,6 +2,7 @@ package SL::Mailer::Sendmail;
use strict;
+use Encode;
use IO::File;
use SL::Template;
@@ -17,7 +18,7 @@ sub init {
Rose::Object::init(@_);
- my $email = $self->mailer->recode($self->myconfig->{email});
+ my $email = $::locale->is_utf8 ? Encode::encode('utf-8', $self->myconfig->{email}) : $self->myconfig->{email};
$email =~ s/[^\w\.\-\+=@]//ig;
my %temp_form = ( %{ $self->form }, myconfig_email => $email );
@@ -26,6 +27,7 @@ sub init {
$sendmail = $template->parse_block($sendmail);
$self->{sendmail} = IO::File->new("|$sendmail") || die "sendmail($sendmail): $!";
+ $self->{sendmail}->binmode(':utf8') if $::locale->is_utf8;
}
sub start_mail {
diff --git a/SL/System/Process.pm b/SL/System/Process.pm
index 0bddfd6b3..482e6d33f 100644
--- a/SL/System/Process.pm
+++ b/SL/System/Process.pm
@@ -35,7 +35,7 @@ SL::System::Process - assorted system-relevant functions
=head1 SYNOPSIS
- # Get base path to Kivitendo scripts
+ # Get base path to kivitendo scripts
my $path = SL::System::Process->exe_dir;
=head1 FUNCTIONS
@@ -44,7 +44,7 @@ SL::System::Process - assorted system-relevant functions
=item C
-Returns the absolute path to the directory the Kivitendo executables
+Returns the absolute path to the directory the kivitendo executables
(C etc.) and modules (sub-directory C etc.) are located
in.
diff --git a/bin/mozilla/ap.pl b/bin/mozilla/ap.pl
index 8c55a3d9c..732eaed5e 100644
--- a/bin/mozilla/ap.pl
+++ b/bin/mozilla/ap.pl
@@ -40,6 +40,7 @@ use SL::IR;
use SL::IS;
use SL::PE;
use SL::ReportGenerator;
+use SL::DB::Default;
require "bin/mozilla/arap.pl";
require "bin/mozilla/common.pl";
@@ -238,7 +239,9 @@ sub form_header {
}
my $readonly = ($form->{id}) ? "readonly" : "";
- $form->{radier} = ($form->current_date(\%myconfig) eq $form->{gldate}) ? 1 : 0;
+ $form->{radier} = ($::instance_conf->get_ap_changeable == 2)
+ ? ($form->current_date(\%myconfig) eq $form->{gldate})
+ : ($::instance_conf->get_ap_changeable == 1);
$readonly = ($form->{radier}) ? "" : $readonly;
$form->{forex} = $form->check_exchangerate( \%myconfig, $form->{currency}, $form->{transdate}, 'sell');
@@ -693,11 +696,11 @@ $jsscript
print qq| {"acc_trans_id_$i"}>\n|;
print qq| {"gldate_$i"}>\n|;
my $changeable = 1;
- if ($::lx_office_conf{features}->{payments_changeable} == 0) {
+ if (SL::DB::Default->get->payments_changeable == 0) {
# never
$changeable = ($form->{"acc_trans_id_$i"})? 0 : 1;
}
- if ($::lx_office_conf{features}->{payments_changeable} == 2) {
+ if (SL::DB::Default->get->payments_changeable == 2) {
# on the same day
$changeable = (($form->{"gldate_$i"} eq '') || $form->current_date(\%myconfig) eq $form->{"gldate_$i"});
}
@@ -852,10 +855,10 @@ sub form_footer {
$::form->header;
print $::form->parse_html_template('ap/form_footer', {
- num_due => $num_due,
- num_follow_ups => $num_follow_ups,
- show_post_draft => ($transdate > $closedto) && !$::form->{id},
- show_storno => $storno,
+ num_due => $num_due,
+ num_follow_ups => $num_follow_ups,
+ show_post_draft => ($transdate > $closedto) && !$::form->{id},
+ show_storno => $storno,
});
$::lxdebug->leave_sub;
diff --git a/bin/mozilla/ar.pl b/bin/mozilla/ar.pl
index f164997af..be080ea6a 100644
--- a/bin/mozilla/ar.pl
+++ b/bin/mozilla/ar.pl
@@ -38,6 +38,7 @@ use SL::AR;
use SL::FU;
use SL::IS;
use SL::PE;
+use SL::DB::Default;
use SL::ReportGenerator;
require "bin/mozilla/arap.pl";
@@ -251,7 +252,9 @@ sub form_header {
#/show history button js
$readonly = ($form->{id}) ? "readonly" : "";
- $form->{radier} = ($form->current_date(\%myconfig) eq $form->{gldate}) ? 1 : 0;
+ $form->{radier} = ($::instance_conf->get_ar_changeable == 2)
+ ? ($form->current_date(\%myconfig) eq $form->{gldate})
+ : ($::instance_conf->get_ar_changeable == 1);
$readonly = ($form->{radier}) ? "" : $readonly;
# set option selected
@@ -421,8 +424,8 @@ sub form_header {
$payment->{changeable} =
- $::lx_office_conf{features}->{payments_changeable} == 0 ? !$payment->{acc_trans_id} # never
- : $::lx_office_conf{features}->{payments_changeable} == 2 ? $payment->{gldate} eq '' || $payment->{gldate} eq $now
+ SL::DB::Default->get->payments_changeable == 0 ? !$payment->{acc_trans_id} # never
+ : SL::DB::Default->get->payments_changeable == 2 ? $payment->{gldate} eq '' || $payment->{gldate} eq $now
: 1;
push @payments, $payment;
@@ -530,7 +533,7 @@ $follow_ups_block
}
# /button for saving history
# mark_as_paid button
- if($form->{id} ne "") {
+ if(($form->{id} ne "") && $::instance_conf->get_ar_show_mark_as_paid) {
print qq| |;
}
diff --git a/bin/mozilla/do.pl b/bin/mozilla/do.pl
index b58cd7190..570c7c358 100644
--- a/bin/mozilla/do.pl
+++ b/bin/mozilla/do.pl
@@ -1444,7 +1444,7 @@ sub transfer_out {
my $pinfo = $part_info_map{$request->{parts_id}};
my $binfo = $bin_info_map{$request->{bin_id}};
- if ($::lx_office_conf{features}->{show_best_before}) {
+ if ($::instance_conf->get_show_bestbefore) {
push @{ $form->{ERRORS} }, $locale->text("There is not enough available of '#1' at warehouse '#2', bin '#3', #4, #5, for the transfer of #6.",
$pinfo->{description},
$binfo->{warehouse_description},
diff --git a/bin/mozilla/gl.pl b/bin/mozilla/gl.pl
index a46cad00c..719f22209 100644
--- a/bin/mozilla/gl.pl
+++ b/bin/mozilla/gl.pl
@@ -903,7 +903,9 @@ sub form_footer {
$follow_ups_due = sum map { $_->{due} * 1 } @{ $follow_ups || [] };
}
- my $radieren = $::form->current_date(\%::myconfig) eq $::form->{gldate};
+ my $radieren = ($::instance_conf->get_gl_changeable == 2)
+ ? ($::form->current_date(\%::myconfig) eq $::form->{gldate})
+ : ($::instance_conf->get_gl_changeable == 1);
print $::form->parse_html_template('gl/form_footer', {
radieren => $radieren,
diff --git a/bin/mozilla/ir.pl b/bin/mozilla/ir.pl
index 0a468615e..554d2fd4f 100644
--- a/bin/mozilla/ir.pl
+++ b/bin/mozilla/ir.pl
@@ -35,6 +35,7 @@ use SL::FU;
use SL::IR;
use SL::IS;
use SL::PE;
+use SL::DB::Default;
use List::Util qw(max sum);
require "bin/mozilla/io.pl";
@@ -415,10 +416,10 @@ sub form_footer {
for my $i (1 .. $form->{paidaccounts}) {
$form->{"changeable_$i"} = 1;
- if ($::lx_office_conf{features}->{payments_changeable} == 0) {
+ if (SL::DB::Default->get->payments_changeable == 0) {
# never
$form->{"changeable_$i"} = ($form->{"acc_trans_id_$i"})? 0 : 1;
- } elsif ($::lx_office_conf{features}->{payments_changeable} == 2) {
+ } elsif (SL::DB::Default->get->payments_changeable == 2) {
# on the same day
$form->{"changeable_$i"} = (($form->{"gldate_$i"} eq '') ||
($form->current_date(\%myconfig) eq $form->{"gldate_$i"}));
@@ -439,7 +440,9 @@ sub form_footer {
totalpaid => $totalpaid,
paid_missing => $form->{invtotal} - $totalpaid,
show_storno => $form->{id} && !$form->{storno} && !IS->has_storno(\%myconfig, $form, "ap") && !$totalpaid,
- show_delete => ($form->current_date(\%myconfig) eq $form->{gldate}),
+ show_delete => ($::instance_conf->get_ir_changeable == 2)
+ ? ($form->current_date(\%myconfig) eq $form->{gldate})
+ : ($::instance_conf->get_ir_changeable == 1),
});
##print $form->parse_html_template('ir/_payments'); # parser
##print $form->parse_html_template('webdav/_list'); # parser
diff --git a/bin/mozilla/is.pl b/bin/mozilla/is.pl
index d5bd22946..14c242000 100644
--- a/bin/mozilla/is.pl
+++ b/bin/mozilla/is.pl
@@ -35,6 +35,7 @@ use SL::FU;
use SL::IS;
use SL::PE;
use SL::OE;
+use SL::DB::Default;
use Data::Dumper;
use List::Util qw(max sum);
@@ -444,10 +445,10 @@ sub form_footer {
for my $i (1 .. $form->{paidaccounts}) {
$form->{"changeable_$i"} = 1;
- if ($::lx_office_conf{features}->{payments_changeable} == 0) {
+ if (SL::DB::Default->get->payments_changeable == 0) {
# never
$form->{"changeable_$i"} = ($form->{"acc_trans_id_$i"})? 0 : 1;
- } elsif ($::lx_office_conf{features}->{payments_changeable} == 2) {
+ } elsif (SL::DB::Default->get->payments_changeable == 2) {
# on the same day
$form->{"changeable_$i"} = (($form->{"gldate_$i"} eq '') ||
($form->current_date(\%myconfig) eq $form->{"gldate_$i"}));
@@ -471,7 +472,9 @@ sub form_footer {
paid_missing => $form->{invtotal} - $totalpaid,
print_options => print_options(inline => 1),
show_storno => $form->{id} && !$form->{storno} && !IS->has_storno(\%myconfig, $form, "ar") && !$totalpaid,
- show_delete => ($form->current_date(\%myconfig) eq $form->{gldate}),
+ show_delete => ($::instance_conf->get_is_changeable == 2)
+ ? ($form->current_date(\%myconfig) eq $form->{gldate})
+ : ($::instance_conf->get_is_changeable == 1),
});
##print $form->parse_html_template('is/_payments'); # parser
##print $form->parse_html_template('webdav/_list'); # parser
diff --git a/bin/mozilla/wh.pl b/bin/mozilla/wh.pl
index 9d387f02e..0315bb9dc 100644
--- a/bin/mozilla/wh.pl
+++ b/bin/mozilla/wh.pl
@@ -438,7 +438,7 @@ sub create_assembly {
$form->error($locale->text('The warehouse or the bin is missing.'));
}
- if (!$::lx_office_conf{features}->{show_best_before}) {
+ if (!$::instance_conf->get_show_bestbefore) {
$form->{bestbefore} = '';
}
diff --git a/config/kivitendo.conf.default b/config/kivitendo.conf.default
index 5d6524bf8..96a7d4290 100644
--- a/config/kivitendo.conf.default
+++ b/config/kivitendo.conf.default
@@ -74,17 +74,6 @@ dbcharset = UTF-8
webdav = 0
vertreter = 0
-# Show fields used for the best before date
-# ATTENTION! If you enabled this feature you can not simply turn it off again
-# without taking care that best_before fields are emptied in the database.
-# This can be done with the following query:
-#
-# UPDATE inventory SET bestbefore = NULL;
-#
-# Any stock contents containing a best before date will be impossible to stock
-# out otherwise.
-show_best_before = 0
-
## Pictures for parts
# Show the picture in the part form
parts_show_image = 1
@@ -93,9 +82,6 @@ parts_image_css = border:0;float:left;max-width:250px;margin-top:20px:margin-rig
# Show the picture in the results when you search for parts
parts_listing_images = 0
-# Should payments be changeable after posting (0 = never; 1 = every time; 2 = on the same day)
-payments_changeable = 0
-
[paths]
# path to temporary files (must be writeable by the web server)
userspath = users
@@ -115,13 +101,15 @@ memberfile = users/members
method = smtp
# Location of sendmail for 'method = sendmail'
sendmail = /usr/sbin/sendmail -t<%if myconfig_email%> -f <%myconfig_email%><%end%>
-# Settings for 'method = smtp'.
+# Settings for 'method = smtp'. Only set 'port' if your SMTP server
+# runs on a non-standard port (25 for 'security=none' or
+# 'security=tls', 465 for 'security=ssl').
host = localhost
-port = 25
+#port = 25
# Security can be 'tls', 'ssl' or 'none'. Unset equals 'none'. This
# determines whether or not encryption is used and which kind. For
-# 'tls' the module 'Net::SMTP::TLS' is required; for 'ssl'
-# 'Net::SMTP::TLS' is required and 'none' only uses 'Net::SMTP'.
+# 'tls' the module 'Net::SSLGlue' is required; for 'ssl'
+# 'Net::SMTP::SSL' is required and 'none' only uses 'Net::SMTP'.
security = none
# Authentication is only used if 'login' is set. You should only use
# that with 'tls' or 'ssl' encryption.
@@ -210,27 +198,6 @@ email_subject = kivitendo self test report
# template. currently txt and html templates are recognized and correctly mime send.
email_template = templates/mail/self_test/status_mail.txt
-[datev_check]
-# it is possible to make a quick DATEV export everytime you post a record to ensure things
-# work nicely with their data requirements. This will result in a slight overhead though
-# you can enable this for each type of record independantly.
-
-# check when a sales invoice or a payment for a sales invoice is posted
-check_on_sales_invoice = 1
-# check when a purchase invoice or a payment for a purchase invoice is posted
-check_on_purchase_invoice = 1
-# check when an ar transaction is posted
-check_on_ar_transaction = 1
-# check when an ap transaction is posted
-check_on_ap_transaction = 1
-# check when a gl transaction is posted
-check_on_gl_transaction = 1
-
-# not implemented yet:
-#check_on_cash_and_receipt = 0
-#check_on_dunning = 0
-#check_on_sepa_import = 0
-
[console]
# autologin to use if none is given
login =
diff --git a/doc/dokumentation.xml b/doc/dokumentation.xml
index 787007405..8fe04d68a 100644
--- a/doc/dokumentation.xml
+++ b/doc/dokumentation.xml
@@ -43,7 +43,7 @@
- Ubuntu 10.04 LTS Lucid Lynx bis 12.04 Precise Pangolin
+ Ubuntu 10.04 LTS Lucid Lynx bis 12.10 Oneiric Ocelot
@@ -75,87 +75,58 @@
nicht Bestandteil einer Standard-Perl-Installation sind:
-
- parent
-
+ parent
-
- Archive::Zip
-
+ Archive::Zip
-
- Config::Std
-
+ Config::Std
-
- DateTime
-
+ DateTime
-
- DBI
-
+ DBI
-
- DBD::Pg
-
+ DBD::Pg
-
- Email::Address
-
+ Email::Address
-
- JSON
-
+ Email::MIME
-
- List::MoreUtils
-
+ JSON
-
- Params::Validate
-
+ List::MoreUtils
-
- PDF::API2
-
+ Net::SMTP::SSL (optional, bei E-Mail-Versand über SSL; siehe Abschnitt " ")
-
- Rose::Object
-
+ Net::SSLGlue (optional, bei E-Mail-Versand über TLS; siehe Abschnitt " ")
-
- Rose::DB
-
+ Params::Validate
-
- Rose::DB::Object
-
+ PDF::API2
-
- Template
-
+ Rose::Object
-
- Text::CSV_XS
-
+ Rose::DB
-
- Text::Iconv
-
+ Rose::DB::Object
-
- URI
-
+ Template
-
- XML::Writer
-
+ Text::CSV_XS
-
- YAML
-
+ Text::Iconv
+
+ URI
+
+ XML::Writer
+
+ YAML
+ Seit v2.7.0 sind die folgenden Pakete hinzugekommen: Email::MIME , Net::SMTP::SSL ,
+ Net::SSLGlue .
+
Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete
hinzugekommen, URI und
XML::Writer sind notwendig. Ohne startet kivitendo
@@ -184,31 +155,27 @@
apt-get install apache2 postgresql libparent-perl libarchive-zip-perl \
libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl \
- libemail-address-perl liblist-moreutils-perl libpdf-api2-perl \
+ libemail-address-perl libemail-mime-perl liblist-moreutils-perl libpdf-api2-perl \
librose-object-perl librose-db-perl librose-db-object-perl \
libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl \
libxml-writer-perl libyaml-perl libconfig-std-perl \
- libparams-validate-perl libjson-perl libclass-accessor-perl
+ libparams-validate-perl libjson-perl libclass-accessor-perl \
+ libnet-sslglue-perl libnet-smtp-ssl-perl
Für Fedora Core benötigen Sie diese Pakete:
yum install httpd postgresql-server perl-parent perl-DateTime \
- perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils \
+ perl-DBI perl-DBD-Pg perl-Email-Address perl-Email-MIME perl-List-MoreUtils \
perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object \
perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI \
- perl-XML-Writer perl-YAML
+ perl-XML-Writer perl-YAML perl-Net-SSLGlue perl-Net-SMTP-SSL
Für OpenSuSE benötigen Sie diese Pakete:
zypper install apache2 postgresql-server perl-Archive-Zip \
- perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils \
+ perl-DateTime perl-DBI perl-DBD-Pg perl-Email-MIME perl-MailTools perl-List-MoreUtils \
perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv \
- perl-URI perl-XML-Writer perl-YAML
-
- Bei openSuSE 11 ist parent bereits enthalten,
- und braucht nicht nachinstalliert werden. Die
- Rose::* Pakete sind derzeit nicht für SuSE gepackt,
- und müssen anderweitig nachinstalliert werden.
+ perl-URI perl-XML-Writer perl-YAML perl-Net-SSLGlue perl-Net-SMTP-SSL
kivitendo enthält ein Script, mit dem überprüft werden kann, ob
alle benötigten Perl-Module installiert sind. Der Aufruf lautet wie
@@ -303,57 +270,34 @@ tar xvzf kivitendo-erp-2.6.3.tgz
entsprechend kommentiert sind:
-
- authentication
-
+ authentication (siehe Abschnitt " " in diesem Kapitel)
-
- authentication/database
-
+ authentication/database
-
- authentication/ldap
-
+ authentication/ldap
-
- system
-
+ system
-
- features
-
+ features (siehe Kapitel " ")
-
- paths
-
+ paths
-
- applications
-
+ applications
-
- environment
-
+ environment
-
- print_templates
-
+ mail_delivery (siehe Abschnitt " )
-
- task_server
-
+ print_templates
-
- periodic_invoices
-
+ task_server
-
- console
-
+ periodic_invoices
-
- debug
-
+ console
+
+ debug
Die üblicherweise wichtigsten Parameter, die am Anfang
@@ -494,10 +438,7 @@ psql template1
anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen
können:
- Die Frage, ob der neue User Superuser sein soll, können Sie mit nein
- beantworten, genauso ist die Berechtigung neue User (Roles) zu
- generieren nicht nötig.
- su - postgres
+ su - postgres
createuser -d -P kivitendo
exit
@@ -613,10 +554,9 @@ Alias /kivitendo-erp/ /var/www/kiviteno-erp/
verwendet.
- FCGI 0.69 und höher ist extrem strict in der Behandlung von
- Unicode, und verweigert bestimmte Eingaben von kivitendo. Falls es
- Probleme mit Umlauten in Ihrere Installation gibt, muss auf die
- Vorgängerversion FCGI 0.68 ausgewichen werden.
+ FCGI-Versionen ab 0.69 und bis zu 0.71 inklusive sind extrem strict in der Behandlung von Unicode, und verweigern
+ bestimmte Eingaben von kivitendo. Falls es Probleme mit Umlauten in Ihrere Installation gibt, muss zwingend Version 0.68 oder
+ aber Version 0.72 und neuer eingesetzt werden.
Mit CPAN lässt sie sich die Vorgängerversion wie folgt
installieren:
@@ -1277,6 +1217,91 @@ insserv kivitendo-task-server
+
+ E-Mail-Versand aus kivitendo heraus
+
+ kivitendo kann direkt aus dem Programm heraus E-Mails versenden, z.B. um ein Angebot direkt an einen Kunden zu
+ verschicken. Damit dies funktioniert, muss eingestellt werden, über welchen Server die E-Mails verschickt werden sollen. kivitendo
+ unterstützt dabei zwei Mechanismen: Versand über einen lokalen E-Mail-Server (z.B. mit Postfix oder
+ Exim , was auch die standardmäÃig aktive Methode ist) sowie Versand über einen SMTP-Server (z.B. der des
+ eigenen Internet-Providers).
+
+ Welche Methode und welcher Server verwendet werden, wird über die Konfigurationsdatei config/kivitendo.conf
+ festgelegt. Dort befinden sich alle Einstellungen zu diesem Thema im Abschnitt '[mail_delivery] '.
+
+
+ Versand über lokalen E-Mail-Server
+
+ Diese Methode bietet sich an, wenn auf dem Server, auf dem kivitendo läuft, bereits ein funktionsfähiger E-Mail-Server wie
+ z.B. Postfix , Exim oder Sendmail läuft.
+
+ Um diese Methode auszuwählen, muss der Konfigurationsparameter 'method = sendmail ' gesetzt sein. Dies ist
+ gleichzeitig der Standardwert, falls er nicht verändert wird.
+
+ Um zu kontrollieren, wie das Programm zum Einliefern gestartet wird, dient der Parameter 'sendmail =
+ ... '. Der Standardwert verweist auf das Programm /usr/bin/sendmail , das bei allen oben genannten
+ E-Mail-Serverprodukten für diesen Zweck funktionieren sollte.
+
+ Die Konfiguration des E-Mail-Servers selber würde den Rahmen dieses sprengen. Hierfür sei auf die Dokumentation des
+ E-Mail-Servers verwiesen.
+
+
+
+ Versand über einen SMTP-Server
+
+ Diese Methode bietet sich an, wenn kein lokaler E-Mail-Server vorhanden oder zwar einer vorhanden, dieser aber nicht
+ konfiguriert ist.
+
+ Um diese Methode auszuwählen, muss der Konfigurationsparameter 'method = smtp ' gesetzt sein. Die folgenden
+ Parameter dienen dabei der weiteren Konfiguration:
+
+
+
+ hostname
+
+ Name oder IP-Adresse des SMTP-Servers. Standardwert: 'localhost '
+
+
+
+ port
+
+ Portnummer. Der Standardwert hängt von der verwendeten Verschlüsselungsmethode ab. Gilt 'security =
+ none ' oder 'security = tls ', so ist 25 die Standardportnummer. Für 'security =
+ ssl ' ist 465 die Portnummer. Muss normalerweise nicht geändert werden.
+
+
+
+ security
+
+ Wahl der zu verwendenden Verschlüsselung der Verbindung mit dem Server. Standardwert ist
+ 'none ', wodurch keine Verschlüsselung verwendet wird. Mit 'tls ' wird TLS-Verschlüsselung
+ eingeschaltet, und mit 'ssl ' wird Verschlüsselung via SSL eingeschaltet. Achtung: Für
+ 'tls ' und 'ssl ' werden zusätzliche Perl-Module benötigt (siehe unten).
+
+
+
+ login und password
+
+ Falls der E-Mail-Server eine Authentifizierung verlangt, so können mit diesen zwei Parametern der Benutzername
+ und das Passwort angegeben werden. Wird Authentifizierung verwendet, so sollte aus Sicherheitsgründen auch eine Form von
+ Verschlüsselung aktiviert werden.
+
+
+
+ Wird Verschlüsselung über TLS oder SSL aktiviert, so werden zusätzliche Perl-Module benötigt. Diese sind:
+
+
+ TLS-Verschlüsselung: Modul Net::SSLGlue (Debian-Paketname
+ libnet-sslglue-perl , Fedora Core: perl-Net-SSLGlue , openSuSE:
+ perl-Net-SSLGlue
+
+ SSL-Verschlüsselung: Modul Net::SMTP::SSL (Debian-Paketname
+ libnet-smtp-ssl-perl , Fedora Core: perl-Net-SMTP-SSL , openSuSE:
+ perl-Net-SMTP-SSL
+
+
+
+
Drucken mit kivitendo
@@ -5432,6 +5457,148 @@ filenames
+
+ Die kivitendo-Test-Suite
+
+
+ Einführung
+
+ kivitendo enthält eine Suite für automatisierte Tests. Sie basiert auf dem Standard-Perl-Modul Test::More .
+
+ Die grundlegenden Fakten sind:
+
+
+ Alle Tests liegen im Unterverzeichnis t/ .
+
+ Ein Script (bzw. ein Test) in f/ enthält einen oder mehrere Testfälle.
+
+ Alle Dateinamen von Tests enden auf .t . Es sind selbstständig ausführbare Perl-Scripte.
+
+ Die Test-Suite besteht aus der Gesamtheit aller Tests, sprich aller Scripte in f/ , deren
+ Dateiname auf .t endet.
+
+
+
+
+ Voraussetzungen
+
+ Für die Ausführung werden neben den für kivitendo eh schon benötigten Module noch weitere Perl-Module benötigt. Diese sind:
+
+
+ Test::Deep (Debian-Paketname: libtest-deep-perl ; Fedora Core:
+ perl-Test-Deep ; openSuSE: perl-Test-Deep )
+
+
+
+
+
+ Existierende Tests ausführen
+
+
+ Es gibt mehrere Möglichkeiten zum Ausführen der Tests: entweder, man lässt alle Tests auf einmal ausführen, oder man führt
+ gezielt einzelne Scripte aus. Für beide Fälle gibt es das Helferscript t/test.sh .
+
+ Will man die komplette Test-Suite ausführen, so muss man einfach nur t/test.sh ohne weitere Parameter aus
+ dem kivitendo-Basisverzeichnis heraus ausführen.
+
+ Um einzelne Test-Scripte auszuführen, übergibt man deren Namen an t/test.sh . Beispielsweise:
+
+ t/test.sh t/form/format_amount.t t/background_job/known_jobs.t
+
+
+
+
+
+ Bedeutung der verschiedenen Test-Scripte
+
+
+ Die Test-Suite umfasst Tests sowohl für Funktionen als auch für Programmierstil. Einige besonders zu erwähnende, weil auch
+ während der Entwicklung nützliche Tests sind:
+
+
+ t/001compile.t -- compiliert alle Quelldateien und bricht bei Fehlern sofort ab
+ t/002goodperl.t -- überprüft alle Perl-Dateien auf Anwesenheit von 'use strict '-Anweisungen
+ t/003safesys.t -- überprüft Aufrufe von system() und exec() auf Gültigkeit
+ t/005no_tabs.t -- überprüft, ob Dateien Tab-Zeichen enthalten
+ t/006spelling.t -- sucht nach häufigen Rechtschreibfehlern
+ t/011pod.t -- überprüft die Syntax von Dokumentation im POD-Format auf Gültigkeit
+
+
+ Weitere Test-Scripte überprüfen primär die Funktionsweise einzelner Funktionen und Module.
+
+
+
+
+ Neue Test-Scripte erstellen
+
+
+ Es wird sehr gern gesehen, wenn neue Funktionalität auch gleich mit einem Test-Script abgesichert wird. Auch bestehende
+ Funktion darf und soll ausdrücklich nachträglich mit Test-Scripten abgesichert werden.
+
+
+
+ Ideen für neue Test-Scripte, die keine konkreten Funktionen testen
+
+
+ Ideen, die abgesehen von Funktions noch nicht umgesetzt wurden:
+
+
+ Ãberprüfung auf fehlende symbolische Links
+ Suche nach Nicht-ASCII-Zeichen in Perl-Code-Dateien (mit gewissen Einschränkungen wie das Erlauben von deutschen Umlauten)
+ Test auf DOS-Zeilenenden (\r\n anstelle von nur \n)
+ Ãberprüfung auf Leerzeichen am Ende von Zeilen
+ Test, ob alle zu übersetzenden Strings in locale/de/all vorhanden sind
+ Test, ob alle Webseiten-Templates in templates/webpages mit vom Perl-Modul Template compiliert werden können
+
+
+
+
+
+ Konvention für Verzeichnis- und Dateinamen
+
+
+ Es gibt momentan eine wenige Richtlinien, wie Test-Scripte zu benennen sind. Bitte die folgenden Punkte als Richtlinie betrachten und ihnen soweit es geht folgen:
+
+
+ Die Dateiendung muss .t lauten.
+
+ Namen sind englisch, komplett klein geschrieben und einzelne Wörter mit Unterstrichten getrennt (beispielsweise
+ bad_function_params.t ).
+
+ Unterverzeichnisse sollten grob nach dem Themenbereich benannt sind, mit dem sich die Scripte darin befassen
+ (beispielsweise background_jobs für Tests rund um Hintergrund-Jobs).
+
+ Test-Scripte sollten einen überschaubaren Bereich von Funktionalität testen, der logisch zusammenhängend ist
+ (z.B. nur Tests für eine einzelne Funktion in einem Modul). Lieber mehrere Test-Scripte schreiben.
+
+
+
+
+
+ Minimales Skelett für eigene Scripte
+
+
+ Der folgenden Programmcode enthält das kleinstmögliche Testscript und kann als Ausgangspunkt für eigene Tests verwendet werden:
+
+ use Test::More tests => 0;
+
+use lib 't';
+
+use Support::TestSetup;
+
+Support::TestSetup::login();
+
+ Wird eine vollständig initialisierte kivitendo-Umgebung benötigt (Stichwort: alle globalen Variablen wie
+ $::auth , $::form oder $::lxdebug ), so muss in der Konfigurationsdatei
+ config/kivitendo.conf im Abschnitt testing.login ein gültiger Login-Name eingetragen
+ sein. Dieser wird für die Datenbankverbindung benötigt.
+
+ Wir keine vollständig initialisierte Umgebung benötigt, so kann die letzte Zeile Support::TestSetup::login();
+ weggelassen werden, was die Ausführungszeit des Scripts leicht verringert.
+
+
+
+
Stil-Richtlinien
diff --git a/doc/html/ch02.html b/doc/html/ch02.html
index 95ad65e7b..28b4e2233 100644
--- a/doc/html/ch02.html
+++ b/doc/html/ch02.html
@@ -6,10 +6,55 @@
bei der Auswahl der Pakete aber darauf Rücksicht genommen, dass es
ohne groÃe Probleme auf den derzeit aktuellen verbreiteten
Distributionen läuft.
Mitte 2012 sind das folgende Systeme, von denen bekannt ist,
- dass kivitendo auf ihnen läuft:
Ubuntu 10.04 LTS Lucid Lynx bis 12.04 Precise Pangolin
Debian 5.0 Lenny und 6.0 Squeeze
openSUSE 11.2 und 11.3
SuSE Linux Enterprice Server 11
Fedora 13 bis 16
Zum Betrieb von kivitendo werden zwingend ein Webserver (meist
+ dass kivitendo auf ihnen läuft:
Ubuntu 10.04 LTS Lucid Lynx bis 12.10 Oneiric Ocelot
Debian 5.0 Lenny und 6.0 Squeeze
openSUSE 11.2 und 11.3
SuSE Linux Enterprice Server 11
Fedora 13 bis 16
Zum Betrieb von kivitendo werden zwingend ein Webserver (meist
Apache) und ein Datenbankserver (PostgreSQL, mindestens v8.2)
benötigt.
Zusätzlich benötigt kivitendo die folgenden Perl-Pakete, die
- nicht Bestandteil einer Standard-Perl-Installation sind:
parent
Archive::Zip
Config::Std
DateTime
DBI
DBD::Pg
Email::Address
JSON
List::MoreUtils
Params::Validate
PDF::API2
Rose::Object
Rose::DB
Rose::DB::Object
Template
Text::CSV_XS
Text::Iconv
URI
XML::Writer
YAML
Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete
+ nicht Bestandteil einer Standard-Perl-Installation sind:
+ parent
+
+ Archive::Zip
+
+ Config::Std
+
+ DateTime
+
+ DBI
+
+ DBD::Pg
+
+ Email::Address
+
+ Email::MIME
+
+ JSON
+
+ List::MoreUtils
+
+ Net::SMTP::SSL (optional, bei E-Mail-Versand über SSL; siehe Abschnitt "E-Mail-Versand über einen SMTP-Server ")
+ Net::SSLGlue (optional, bei E-Mail-Versand über TLS; siehe Abschnitt "E-Mail-Versand über einen SMTP-Server ")
+ Params::Validate
+
+ PDF::API2
+
+ Rose::Object
+
+ Rose::DB
+
+ Rose::DB::Object
+
+ Template
+
+ Text::CSV_XS
+
+ Text::Iconv
+
+ URI
+
+ XML::Writer
+
+ YAML
+
Seit v2.7.0 sind die folgenden Pakete hinzugekommen: Email::MIME, Net::SMTP::SSL,
+ Net::SSLGlue.
Gegenüber Version 2.6.0 sind zu dieser Liste 2 Pakete
hinzugekommen, URI und
XML::Writer sind notwendig. Ohne startet kivitendo
nicht.
Gegenüber Version 2.6.1 sind parent,
@@ -26,20 +71,18 @@
installieren.
Die zu installierenden Pakete können in den verschiedenen
Distributionen unterschiedlich heiÃen.
Für Debian oder Ubuntu benötigen Sie diese Pakete:
apt-get install apache2 postgresql libparent-perl libarchive-zip-perl \
libdatetime-perl libdbi-perl libdbd-pg-perl libpg-perl \
- libemail-address-perl liblist-moreutils-perl libpdf-api2-perl \
+ libemail-address-perl libemail-mime-perl liblist-moreutils-perl libpdf-api2-perl \
librose-object-perl librose-db-perl librose-db-object-perl \
libtemplate-perl libtext-csv-xs-perl libtext-iconv-perl liburi-perl \
libxml-writer-perl libyaml-perl libconfig-std-perl \
- libparams-validate-perl libjson-perl libclass-accessor-perl Für Fedora Core benötigen Sie diese Pakete:
yum install httpd postgresql-server perl-parent perl-DateTime \
- perl-DBI perl-DBD-Pg perl-Email-Address perl-List-MoreUtils \
+ libparams-validate-perl libjson-perl libclass-accessor-perl \
+ libnet-sslglue-perl libnet-smtp-ssl-perl Für Fedora Core benötigen Sie diese Pakete:
yum install httpd postgresql-server perl-parent perl-DateTime \
+ perl-DBI perl-DBD-Pg perl-Email-Address perl-Email-MIME perl-List-MoreUtils \
perl-PDF-API2 perl-Rose-Object perl-Rose-DB perl-Rose-DB-Object \
perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI \
- perl-XML-Writer perl-YAML Für OpenSuSE benötigen Sie diese Pakete:
zypper install apache2 postgresql-server perl-Archive-Zip \
- perl-DateTime perl-DBI perl-DBD-Pg perl-MailTools perl-List-MoreUtils \
+ perl-XML-Writer perl-YAML perl-Net-SSLGlue perl-Net-SMTP-SSL Für OpenSuSE benötigen Sie diese Pakete:
zypper install apache2 postgresql-server perl-Archive-Zip \
+ perl-DateTime perl-DBI perl-DBD-Pg perl-Email-MIME perl-MailTools perl-List-MoreUtils \
perl-PDF-API2 perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv \
- perl-URI perl-XML-Writer perl-YAML Bei openSuSE 11 ist parent bereits enthalten,
- und braucht nicht nachinstalliert werden. Die
- Rose::* Pakete sind derzeit nicht für SuSE gepackt,
- und müssen anderweitig nachinstalliert werden.
kivitendo enthält ein Script, mit dem überprüft werden kann, ob
+ perl-URI perl-XML-Writer perl-YAML perl-Net-SSLGlue perl-Net-SMTP-SSL
kivitendo enthält ein Script, mit dem überprüft werden kann, ob
alle benötigten Perl-Module installiert sind. Der Aufruf lautet wie
folgt:
./scripts/installation_check.pl