]> wagnertech.de Git - mfinanz.git/commitdiff
Merge branch 'master' of vc.linet-services.de:public/lx-office-erp
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 7 Nov 2012 13:49:25 +0000 (14:49 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 7 Nov 2012 13:49:25 +0000 (14:49 +0100)
46 files changed:
SL/AP.pm
SL/AR.pm
SL/Controller/ClientConfig.pm [new file with mode: 0644]
SL/Controller/DeliveryPlan.pm
SL/DATEV.pm
SL/DB/MetaSetup/Default.pm
SL/Form.pm
SL/GL.pm
SL/IR.pm
SL/IS.pm
SL/InstanceConfiguration.pm
bin/mozilla/ap.pl
bin/mozilla/ar.pl
bin/mozilla/do.pl
bin/mozilla/gl.pl
bin/mozilla/ir.pl
bin/mozilla/is.pl
bin/mozilla/wh.pl
config/kivitendo.conf.default
locale/de/all
locale/de_DE/all
locale/en/all
menu.ini
sql/Pg-upgrade2/defaults_datev_check.pl [new file with mode: 0644]
sql/Pg-upgrade2/defaults_posting_config.pl [new file with mode: 0644]
sql/Pg-upgrade2/defaults_posting_records_config.sql [new file with mode: 0644]
sql/Pg-upgrade2/defaults_show_bestbefore.pl [new file with mode: 0644]
sql/Pg-upgrade2/defaults_show_delete_on_orders.sql [new file with mode: 0644]
sql/Pg-upgrade2/defaults_show_mark_as_paid_config.sql [new file with mode: 0644]
templates/webpages/ap/form_footer.html
templates/webpages/client_config/form.html [new file with mode: 0644]
templates/webpages/dbupgrade/footer.html
templates/webpages/do/form_footer.html
templates/webpages/do/stock_in_form.html
templates/webpages/do/stock_out_form.html
templates/webpages/generic/select_part.html
templates/webpages/ir/form_footer.html
templates/webpages/is/form_footer.html
templates/webpages/oe/form_footer.html
templates/webpages/wh/journal_filter.html
templates/webpages/wh/removal_parts_selection.html
templates/webpages/wh/report_filter.html
templates/webpages/wh/transfer_parts_selection.html
templates/webpages/wh/warehouse_selection.html
templates/webpages/wh/warehouse_selection_assembly.html
templates/webpages/wh/warehouse_selection_stock.html

index eda1e71f41227fd0c43736038888e40b4534b0e7..95bde38e5cf2aea81dbc93ad8094d162fd2ecd32 100644 (file)
--- 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);
   }
 
index 8c72d3cf99c518c96d0527808d5a0fb755a6007c..1f8a0c0f55af8a3d5ecc160e884e6ab6b717ae37 100644 (file)
--- 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/Controller/ClientConfig.pm b/SL/Controller/ClientConfig.pm
new file mode 100644 (file)
index 0000000..aaed72f
--- /dev/null
@@ -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;
index 5937c5b7f5098e06d77fbe287b1852fd975f8a06..980234ef5b8f16a57af85227254986b35cb8c877 100644 (file)
@@ -119,6 +119,26 @@ sub setup_for_list {
               rl.from_table ='oe' AND
               rl.to_table = 'delivery_orders'
           )
+
+        UNION ALL
+
+        -- 5. In case someone deleted a line of the delivery_order there will be a record_link (4 fails)
+        --    but there won't be a delivery_order_items to find (3 fails too). Search for orphaned orderitems this way
+        SELECT oi.id FROM orderitems AS oi, oe, record_links AS rl
+        WHERE
+          rl.from_table = 'oe' AND
+          rl.to_table = 'delivery_orders' AND
+
+          oi.trans_id = rl.from_id AND
+          oi.parts_id NOT IN (
+            SELECT doi.parts_id FROM delivery_order_items AS doi WHERE doi.delivery_order_id = rl.to_id
+          ) AND
+
+          oe.id = oi.trans_id AND
+
+          oe.customer_id IS NOT NULL AND
+          (oe.quotation = 'f' OR oe.quotation IS NULL) AND
+          NOT oe.closed
       " ],
     )
   ];
index bbdc9b53205aedfe021260dcc04aef24de39a857..50fb1c7a602f456792bb25fa60b6256a6107f47f 100644 (file)
@@ -410,12 +410,25 @@ sub _get_transactions {
 
     my $count    = $ref->{amount};
     my $firstrun = 1;
+
+    # if the amount of a booking in a group is smaller than 0.02, any tax
+    # amounts will likely be smaller than 1 cent, so go into subcent mode
     my $subcent  = abs($count) < 0.02;
 
+    # records from acc_trans are ordered by trans_id and acc_trans_id
+    # first check for unbalanced ledger inside one trans_id
+    # there may be several groups inside a trans_id, e.g. the original booking and the payment
+    # each group individually should be exactly balanced and each group
+    # individually needs its own datev lines
+
+    # keep fetching new acc_trans lines until the end of a balanced group is reached
     while (abs($count) > 0.01 || $firstrun || ($subcent && abs($count) > 0.005)) {
       my $ref2 = $sth->fetchrow_hashref("NAME_lc");
       last unless ($ref2);
 
+      # check if trans_id of current acc_trans line is still the same as the
+      # trans_id of the first line in group
+
       if ($ref2->{trans_id} != $trans->[0]->{trans_id}) {
         $self->add_error("Unbalanced ledger! old trans_id " . $trans->[0]->{trans_id} . " new trans_id " . $ref2->{trans_id} . " count $count");
         return;
@@ -452,7 +465,23 @@ sub _get_transactions {
       next;
     }
 
+    # determine at which array position the reference value (called absumsatz) is 
+    # and which amount it has
+
     for my $j (0 .. (scalar(@{$trans}) - 1)) {
+      
+      # Three cases:
+      # 1: gl transaction (Dialogbuchung), invoice is false, no double split booking allowed
+
+      # 2: sales or vendor invoice (Verkaufs- und Einkaufsrechnung): invoice is
+      # true, instead of absumsatz use link AR/AP (there should only be one
+      # entry)
+
+      # 3. AR/AP transaction (Kreditoren- und Debitorenbuchung): invoice is false,
+      # instead of absumsatz use link AR/AP (there should only be one, so jump
+      # out of search as soon as you find it )
+
+      # case 1 and 2
       # for gl-bookings no split is allowed and there is no AR/AP account, so we always use the maximum value as a reference
       # for ap/ar bookings we can always search for AR/AP in link and use that
       if ( ( not $trans->[$j]->{'invoice'} and abs($trans->[$j]->{'amount'}) > abs($absumsatz) )
@@ -460,12 +489,26 @@ sub _get_transactions {
         $absumsatz     = $trans->[$j]->{'amount'};
         $notsplitindex = $j;
       }
+
+      # case 3
+      # Problem: we can't distinguish between AR and AP and normal invoices via boolean "invoice"
+      # for AR and AP transaction exit the loop as soon as an AR or AP account is found
+      # there must be only one AR or AP chart in the booking
+      if ( $trans->[$j]->{'link'} eq 'AR' or $trans->[$j]->{'link'} eq 'AP') {
+        $notsplitindex = $j;   # position in booking with highest amount
+        $absumsatz     = $trans->[$j]->{'amount'};
+        last;
+      };
     }
 
     my $ml             = ($trans->[0]->{'umsatz'} > 0) ? 1 : -1;
     my $rounding_error = 0;
     my @taxed;
 
+    # go through each line and determine if it is a tax booking or not
+    # skip all tax lines and notsplitindex line
+    # push all other accounts (e.g. income or expense) with corresponding taxkey
+
     for my $j (0 .. (scalar(@{$trans}) - 1)) {
       if (   ($j != $notsplitindex)
           && !$trans->[$j]->{is_tax}
index 53ecc68e9b7924ec53883c0d4f11ff5e93a192a4..9365eac9dcf8638847ab6fcb32b89dd2d5c30fe3 100644 (file)
@@ -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' ],
index c14024f95eeac18cb1c193893ae4c311bd5fc040..ce887c34704ece6e24965d1cc68d836654f3876a 100644 (file)
@@ -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}) {
index cdd9d406ffcd6380852677cae3f8096e42f6b8aa..c9fcd9c476ecf207ef064e26ea476e1a77ff5f9c 100644 (file)
--- 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;
 
index 444dffceba7e4c40ee20d661cdf09da5a916fbbd..04e071e27c5c4529d2572741ee44adb832be5e27 100644 (file)
--- 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);
   }
 
index 266e05299d38ade7504d30c309fcd712fe7b88cc..db18d5a43816a36572fc8988bd55c013df941d16 100644 (file)
--- 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);
   }
 
index 24fd3be280aedb9596cf85f215620c7482f4dd92..ac14b0ae0f340338fef98a61e5166afb500058f8 100644 (file)
@@ -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<get_is_changeable>
+
+=item C<get_ir_changeable>
+
+=item C<get_ar_changeable>
+
+=item C<get_ap_changeable>
+
+=item C<get_gl_changeable>
+
+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<get_datev_check_on_sales_invoice>
+
+Returns true if datev check should be performed on sales invoices
+
+=item C<get_datev_check_on_purchase_invoice>
+
+Returns true if datev check should be performed on purchase invoices
+
+=item C<get_datev_check_on_ar_transaction>
+
+Returns true if datev check should be performed on ar transactions
+
+=item C<get_datev_check_on_ap_transaction>
+
+Returns true if datev check should be performed on ap transactions
+
+=item C<get_datev_check_on_gl_transaction>
+
+Returns true if datev check should be performed on gl transactions
+
+=item C<get_show_bestbefore>
+
+Returns the default behavior for showing best before date, true or false
+
+=item C<get_is_show_mark_as_paid>
+
+=item C<get_ir_show_mark_as_paid>
+
+=item C<get_ar_show_mark_as_paid>
+
+=item C<get_ap_show_mark_as_paid>
+
+Returns the default behavior for showing the mark as paid button for the
+corresponding record type (true or false).
+
+=item C<get_sales_order_show_delete>
+
+=item C<get_purchase_order_show_delete>
+
+=item C<get_sales_delivery_order_show_delete>
+
+=item C<get_purchase_delivery_order_show_delete>
+
+Returns the default behavior for showing the delete button for the
+corresponding record type (true or false).
+
 =back
 
 =head1 BUGS
index 8c55a3d9cd29b536bd169fae1e344ba8791ce2d1..732eaed5ed4092ea8da3abebd33254ff3247d8f3 100644 (file)
@@ -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|<input type=hidden name="acc_trans_id_$i" value=$form->{"acc_trans_id_$i"}>\n|;
     print qq|<input type=hidden name="gldate_$i" value=$form->{"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;
index f164997af23e8d5d3403d5837417598829a9aec4..be080ea6ac6692d95b4dbd020436912f87071882 100644 (file)
@@ -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|<input type="submit" class="submit" name="action" value="|
           . $locale->text('mark as paid') . qq|">|;
   }
index b58cd7190bd296f3adf130649cd4990dbf003729..570c7c35832cd0cee8b5772c4b41954660edaff9 100644 (file)
@@ -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},
index a46cad00cdc32288aacbcb519435acc41ffc11d9..719f2220991dd32a42497e73f401b31943ad17ec 100644 (file)
@@ -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,
index 0a468615e5ad037e1c1f6f84f735f47e0c191eee..554d2fd4f7b26beb00717722422e99f9d5c63833 100644 (file)
@@ -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
index d5bd229465454ef67de38924e573fb90096c035b..47e71316755bf41bed527c6f0dcd1cfb382f8a4d 100644 (file)
@@ -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
@@ -804,7 +807,7 @@ sub use_as_template {
 
   $main::auth->assert('invoice_edit');
 
-  map { delete $form->{$_} } qw(printed emailed queued invnumber invdate deliverydate id datepaid_1 gldate_1 acc_trans_id_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno);
+  map { delete $form->{$_} } qw(printed emailed queued invnumber invdate deliverydate id datepaid_1 gldate_1 acc_trans_id_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno locked);
   $form->{paidaccounts} = 1;
   $form->{rowcount}--;
   $form->{invdate} = $form->current_date(\%myconfig);
index 9d387f02e5dbd7705f109067a166f05a55ff3f6b..0315bb9dcf15b1b458069ce6454d6a6ca6e8ea80 100644 (file)
@@ -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} = '';
   }
 
index d69ecac9407fc74c84f1216e80e0b667086bad2c..96a7d429020d122d4cd285716ace9cce7cd26abd 100644 (file)
@@ -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
@@ -212,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 =
index 2748c1529aa99fb275bb28b7c96e792e7b486460..a9d468811f77809e1e95ae47afbc8d43d2133ac0 100644 (file)
@@ -48,13 +48,17 @@ $self->{texts} = {
   'AP Transaction Storno (one letter abbreviation)' => 'S',
   'AP Transaction with Storno (abbreviation)' => 'K(S)',
   'AP Transactions'             => 'Kreditorenbuchungen',
+  'AP transactions changeable'  => 'Änderbarkeit von Kreditorenbuchungen',
   'AP transactions with sales taxkeys and/or AR transactions with input taxkeys' => 'Kreditorenbuchungen mit Umsatzsteuer-Steuerschlüsseln und/oder Debitorenbuchungen mit Vorsteuer-Steuerschlüsseln',
   'AR'                          => 'Verkauf',
   'AR Aging'                    => 'Offene Forderungen',
   'AR Transaction'              => 'Debitorenbuchung',
   'AR Transaction (abbreviation)' => 'D',
   'AR Transactions'             => 'Debitorenbuchungen',
+  'AR transactions changeable'  => 'Änderbarkeit von Debitorenbuchungen',
   'ASSETS'                      => 'AKTIVA',
+  '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.' => 'ACHTUNG! Wenn Sie diese Einstellung aktivieren, dann können Sie sie später nicht ohne Weiteres deaktivieren, ohne dafür zu sorgen, dass die Felder der Mindeshaltbarkeitsdaten in der Datenbank leer gemacht werden.',
+  'ATTENTION! You can not simply change it from periodic to perpetual once you started posting.' => 'ACHTUNG! Es kann nicht ohne Weiteres im laufenden Betrieb von der Aufwandsmethode zur Bestandsmethode gewechselt werden.',
   'Abort'                       => 'Abbrechen',
   'Abrechnungsnummer'           => 'Abrechnungsnummer',
   'Abteilung'                   => 'Abteilung',
@@ -185,6 +189,7 @@ $self->{texts} = {
   'An upper-case character is required.' => 'Ein Großbuchstabe ist vorgeschrieben.',
   'Annotations'                 => 'Anmerkungen',
   'Another user with the login #1 does already exist.' => 'Es existiert bereits ein anderer Benutzer mit diesem Login.',
+  'Any stock contents containing a best before date will be impossible to stock out otherwise.' => 'Sonst können Artikel, bei denen ein Mindesthaltbarkeitsdatum gesetzt ist, nicht mehr ausgelagert werden.',
   'Ap aging on %s'              => 'Offene Verbindlichkeiten zum %s',
   'Application Error. No Format given' => 'Fehler in der Anwendung. Das Ausgabeformat fehlt.',
   'Application Error. Wrong Format' => 'Fehler in der Anwendung. Falsches Format: ',
@@ -397,6 +402,11 @@ $self->{texts} = {
   'Check'                       => 'Scheck',
   'Check Details'               => 'Bitte Angaben Ã¼berprüfen',
   'Check for duplicates'        => 'Dublettencheck',
+  'Check on ap transaction'     => 'Prüfen bei Kreditorenbuchung',
+  'Check on ar transaction'     => 'Prüfen bei Debitorenbuchung',
+  'Check on gl transaction'     => 'Prüfen bei Dialogbuchung',
+  'Check on purchase invoice'   => 'Prüfen bei Einkaufsrechnung',
+  'Check on sales invoice'      => 'Prüfen bei Verkaufsrechnung',
   'Checks'                      => 'Schecks',
   'Choose Customer'             => 'Endkunde wählen:',
   'Choose Outputformat'         => 'Ausgabeformat auswählen...',
@@ -406,6 +416,8 @@ $self->{texts} = {
   'Cleared Balance'             => 'abgeschlossen',
   'Clearing Tax Received (No 71)' => 'Verrechnung des Erstattungsbetrages erwünscht (Zeile 71)',
   'Click on login name to edit!' => 'Zum Bearbeiten den Benutzernamen anklicken!',
+  'Client Configuration'        => 'Mandantenkonfiguration',
+  'Client Configuration saved!' => 'Mandantenkonfiguration gespeichert!',
   'Close'                       => 'Übernehmen',
   'Close Books up to'           => 'Die Bücher abschließen bis zum',
   'Close Dialog'                => 'Schließen',
@@ -538,6 +550,7 @@ $self->{texts} = {
   'DATEV - Export Assistent'    => 'DATEV-Exportassistent',
   'DATEV Angaben'               => 'DATEV-Angaben',
   'DATEV Export'                => 'DATEV-Export',
+  'DATEV check configuration'   => 'Einstellungen für DATEV-Prüfung',
   'DATEV check returned errors:' => 'Die DATEV Prüfung dieser Buchung ergab Fehler:',
   'DATEX - Export Assistent'    => 'DATEV-Exportassistent',
   'DELETED'                     => 'Gelöscht',
@@ -901,6 +914,7 @@ $self->{texts} = {
   'Full access to all functions' => 'Vollzugriff auf alle Funktionen',
   'Fwd'                         => 'Vorw&auml;rts',
   'GL Transaction'              => 'Dialogbuchung',
+  'GL transactions changeable'  => 'Änderbarkeit von Dialogbuchungen',
   'Gegenkonto'                  => 'Gegenkonto',
   'Gender'                      => 'Geschlecht',
   'General Ledger'              => 'Finanzbuchhaltung',
@@ -1032,6 +1046,7 @@ $self->{texts} = {
   'It is possible that even after such a correction there is something wrong with this transaction (e.g. taxes that don\'t match the selected taxkey). Therefore you should re-run the general ledger analysis.' => 'Auch nach einer Korrektur kann es mit dieser Buchung noch weitere Probleme geben (z.B. nicht zum Steuerschlüssel passende Steuern), weshalb ein erneutes Ausführen der Hauptbuchanalyse empfohlen wird.',
   'It is possible to do this automatically for some Buchungsgruppen, but not for all.' => 'Es ist m&ouml;glich, dies f&uuml;r einige, aber nicht f&uuml;r alle Buchungsgruppen automatisch zu erledigen.',
   'It is possible to do this automatically for some units, but for others the user has to chose the new unit.' => 'Das ist f&uuml;r einige Einheiten automatisch m&ouml;glich, aber bei anderen muss der Benutzer die neue Einheit ausw&auml;hlen.',
+  '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.' => 'Es ist möglich, bei jeder Buchung einen schnellen DATEV-Export durchzuführen, um sicherzustellen, dass die Datensätze den DATEV-Anforderungen genügen. Da dies einen kleinen Overhead bedeutet, lässt sich die Einstellung für jeden Buchungstyp getrennt einstellen.',
   'It may optionally be compressed with &quot;gzip&quot;.' => 'Sie darf optional mit &quot;gzip&quot; komprimiert sein.',
   'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => 'Es wird einfach die Steuerschlüssel auf  0 setzen, was "keine Steuer" bedeutet und für solche Warenbestandsbuchungen der richtige Wert ist.',
   'Item deleted!'               => 'Artikel gelöscht!',
@@ -1314,6 +1329,7 @@ $self->{texts} = {
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
   'Order deleted!'              => 'Auftrag gelöscht!',
   'Ordered'                     => 'Vom Kunde bestellt',
+  'Orders / Delivery Orders deleteable' => 'Aufträge / Lieferscheine löschbar',
   'Orientation'                 => 'Seitenformat',
   'Orphaned'                    => 'Nie benutzt',
   'Other users\' follow-ups'    => 'Wiedervorlagen anderer Benutzer',
@@ -1369,7 +1385,13 @@ $self->{texts} = {
   'Payment terms (database ID)' => 'Zahlungsbedingungen (Datenbank-ID)',
   'Payment terms (name)'        => 'Zahlungsbedingungen (Name)',
   'Payments'                    => 'Zahlungsausgänge',
+  'Payments Changeable'         => 'Änderbarkeit von Zahlungen',
   'Per. Inv.'                   => 'Wied. Rech.',
+  'Perform check when a gl transaction is posted?' => 'Prüfung durchführen, wenn eine Dialogbuchung gebucht wird?',
+  'Perform check when a purchase invoice or a payment for a purchase invoice is posted?' => 'Prüfung durchführen, wenn eine Einkaufsrechnung oder ein Zahlungsausgang hierfür gebucht wird?',
+  'Perform check when a sales invoice or a payment for a sales invoice is posted?' => 'Prüfung durchführen, wenn eine Verkaufsrechnung oder ein Zahlungseingang hierfür gebucht wird?',
+  'Perform check when an ap transaction is posted?' => 'Prüfung durchführen, wenn eine Kreditorenbuchung gebucht wird?',
+  'Perform check when an ar transaction is posted?' => 'Prüfung durchführen, wenn eine Debiotorenbuchung gebucht wird?',
   'Period'                      => 'Zeitraum',
   'Period:'                     => 'Zeitraum:',
   'Periodic Invoices'           => 'Wiederkehrende Rechnungen',
@@ -1417,6 +1439,7 @@ $self->{texts} = {
   'Post'                        => 'Buchen',
   'Post Payment'                => 'Zahlung buchen',
   'Post payments'               => 'Zahlungen buchen',
+  'Posting Configuration'       => 'Buchungskonfiguration',
   'Postscript'                  => 'Postscript',
   'Posustva_coa'                => 'USTVA Kennz.',
   'Preferences'                 => 'Einstellungen',
@@ -1478,13 +1501,16 @@ $self->{texts} = {
   'Projects'                    => 'Projekte',
   'Projecttransactions'         => 'Projektbuchungen',
   'Prozentual/Absolut'          => 'Prozentual/Absolut',
+  'Purchase Delivery Orders deleteable' => 'Einkaufslieferscheine löschbar',
   'Purchase Invoice'            => 'Einkaufsrechnung',
   'Purchase Order'              => 'Lieferantenauftrag',
   'Purchase Orders'             => 'Lieferantenaufträge',
+  'Purchase Orders deleteable'  => 'Lieferantenaufträge löschbar',
   'Purchase Price'              => 'Einkaufspreis',
   'Purchase Prices'             => 'Einkaufspreise',
   'Purchase delivery order'     => 'Lieferschein (Einkauf)',
   'Purchase invoices'           => 'Einkaufsrechnungen',
+  'Purchase invoices changeable' => 'Änderbarkeit von Einkaufsrechnunen',
   'Purchase net amount'         => 'EK-Betrag',
   'Purchase price'              => 'EK-Preis',
   'Purchase price total'        => 'EK-Betrag',
@@ -1582,16 +1608,19 @@ $self->{texts} = {
   'Saldo neu'                   => 'Saldo neu',
   'Saldo per'                   => 'Saldo per',
   'Sale Prices'                 => 'Verkaufspreise',
+  'Sales Delivery Orders deleteable' => 'Verkaufslieferscheine löschbar',
   'Sales Invoice'               => 'Rechnung',
   'Sales Invoices'              => 'Kundenrechnung',
   'Sales Order'                 => 'Kundenauftrag',
   'Sales Orders'                => 'Aufträge',
+  'Sales Orders deleteable'     => 'Kundenaufträge löschbar',
   'Sales Price information'     => 'Verkaufspreisinformation',
   'Sales Report'                => 'Verkaufsbericht',
   'Sales and purchase invoices with inventory transactions with taxkeys' => 'Einkaufs- und Verkaufsrechnungen mit Warenbestandsbuchungen mit Steuerschlüsseln',
   'Sales delivery order'        => 'Lieferschein (Verkauf)',
   'Sales invoice number'        => 'Ausgangsrechnungsnummer',
   'Sales invoices'              => 'Verkaufsrechnungen',
+  'Sales invoices changeable'   => 'Änderbarkeit von Verkaufsrechnungen',
   'Sales margin'                => 'Marge',
   'Sales margin %'              => 'Marge prozentual',
   'Sales net amount'            => 'VK-Betrag',
@@ -1681,13 +1710,33 @@ $self->{texts} = {
   'Shipto is in use and was flagged invalid.' => 'Lieferadresse ist noch in Verwendung, und wurde als ungültig markiert.',
   'Shopartikel'                 => 'Shopartikel',
   'Short'                       => 'Knapp',
+  'Should ap transactions be and when should they be changeable or deleteable after posting?' => 'Sollen Kreditorenbuchungen nach der Buchung zu Ã¤ndern oder zu löschen sein?',
+  'Should ar transactions be and when should they be changeable or deleteable after posting?' => 'Sollen Debitorenbuchungen nach der Buchung zu Ã¤ndern oder zu löschen sein?',
+  'Should gl transactions be and when should they be changeable or deleteable after posting?' => 'Sollen Dialogbuchungen nach der Buchung zu Ã¤ndern oder zu löschen sein?',
+  'Should payments be and when should they be changeable after posting?' => 'Sollen Zahlungen nach dem Buchen Ã¤nderbar sein, und wenn ja, wann?',
+  'Should purchase invoices be and when should they be deleteable after posting?' => 'Sollen Einkaufsrechnungen nach der Buchung zu löschen sein?',
+  'Should sales invoices be and when should they be changeable or deleteable after posting?' => 'Sollen Verkaufrechnung nach der Buchung zu Ã¤ndern oder zu löschen sein?',
+  'Should the "mark as paid" button showed in ap transactions?' => 'Soll der Knopf "als bezahlt markieren" bei Kreditorenbuchungen angezeigt werden?',
+  'Should the "mark as paid" button showed in ar transactions?' => 'Soll der Knopf "als bezahlt markieren" bei Debitorenbuchungen angezeigt werden?',
+  'Should the "mark as paid" button showed in purchase invoices?' => 'Soll der Knopf "als bezahlt markieren" bei Einkaufsrechnungen angezeigt werden?',
+  'Should the "mark as paid" button showed on sales invoices?' => 'Soll der Knopf "als bezahlt markieren" bei Verkaufsrechnungen angezeigt werden?',
   'Show'                        => 'Zeigen',
+  'Show "mark as paid" in ap transactions' => '"als bezahlt markieren" bei Kreditorenbuchungen anzeigen',
+  'Show "mark as paid" in ar transactions' => '"als bezahlt markieren" bei Debitorenbuchungen anzeigen',
+  'Show "mark as paid" in purchase invoices' => '"als bezahlt markieren" bei Einkaufsrechnungen anzeigen',
+  'Show "mark as paid" in sales invoices' => '"als bezahlt markieren" bei Verkaufsrechnungen anzeigen',
+  'Show Bestbefore'             => 'Mindesthaltbarkeit anzeigen',
   'Show Filter'                 => 'Filter zeigen',
   'Show Salesman'               => 'Verkäufer anzeigen',
   'Show TODO list'              => 'Aufgabenliste anzeigen',
   'Show by default'             => 'Standardm&auml;&szlig;ig anzeigen',
   'Show custom variable search inputs' => 'Suchoptionen für Benutzerdefinierte Variablen verstecken',
+  'Show delete button in purchase delivery orders?' => 'Soll der "Löschen"-Knopf bei Einkaufslieferscheinen angezeigt werden?',
+  'Show delete button in purchase orders?' => 'Soll der "Löschen"-Knopf bei Lieferantenaufträgen angezeigt werden?',
+  'Show delete button in sales delivery orders?' => 'Soll der "Löschen"-Knopf bei Verkaufslieferscheinen angezeigt werden?',
+  'Show delete button in sales orders?' => 'Soll der "Löschen"-Knopf bei Kundenaufträgen angezeigt werden?',
   'Show details'                => 'Detailsanzeige',
+  'Show fields used for the best before date?' => 'Felder zur Eingabe des Mindesthaltbarkeitsdatums anzeigen?',
   'Show follow ups...'          => 'Zeige Wiedervorlagen...',
   'Show help text'              => 'Hilfetext anzeigen',
   'Show items from invoices individually' => 'Artikel aus Rechnungen anzeigen',
@@ -1995,6 +2044,7 @@ $self->{texts} = {
   'Therefore there\'s no need to create the same article more than once if it is sold or bought in/from another tax zone.' => 'Deswegen muss man den gleichen Artikel nicht mehr mehrmals anlegen, wenn er in verschiedenen Steuerzonen gehandelt werden soll.',
   'These units can be based on other units so that kivitendo can convert prices when the user switches from one unit to another.' => 'Einheiten können auf anderen Einheiten basieren, sodass kivitendo Preise automatisch umrechnen kann, wenn die Benutzer zwischen solchen Einheiten umschalten.',
   'These wrong entries cannot be fixed automatically.' => 'Diese Einträge können nicht automatisch bereinigt werden.',
+  'This can be done with the following query:' => 'Dies kann mit der folgenden Datenbankabfrage erreicht werden:',
   'This corresponds to kivitendo\'s behavior prior to version 2.4.4.' => 'Dies entspricht kivitendos Verhalten vor Version 2.4.4.',
   'This could have happened for two reasons:' => 'Dies kann aus zwei Gründen geschehen sein:',
   'This customer number is already in use.' => 'Diese Kundennummer wird bereits verwendet.',
@@ -2004,6 +2054,9 @@ $self->{texts} = {
   'This list is capped at 15 items to keep it fast. If you need a full list, please use reports.' => 'Diese Liste ist auf 15 Zeilen begrenzt. Wenn Sie eine vollständige Liste benötigen, erstellen Sie bitte einen Bericht.',
   'This means that the user has created an AP transaction and chosen a taxkey for sales taxes, or that he has created an AR transaction and chosen a taxkey for input taxes.' => 'Das bedeutet, dass ein Benutzer eine Kreditorenbuchung angelegt und in ihr einen Umsatzsteuer-Steuerschlüssel verwendet oder eine Debitorenbuchung mit Vorsteuer-Steuerschlüssel angelegt hat.',
   'This module can help you identify and correct such entries by analyzing the general ledger and presenting you likely solutions but also allowing you to fix problems yourself.' => 'Dieses Modul kann Ihnen helfen, problematische Einträge im Hauptbuch zu identifizieren und teilweise zu beheben. Dabei werden je nach Problem mögliche Lösungen aufgezeigt, wobei Sie die entscheiden können, welche Probleme automatisch gelöst werden sollen.',
+  'This option controls the inventory system.' => 'Dieser Parameter legt die Warenbuchungsmethode fest.',
+  'This option controls the method used for profit determination.' => 'Dieser Parameter legt die Berechnungsmethode für die Gewinnermittlung fest.',
+  'This option controls the posting and calculation behavior for the accounting method.' => 'Dieser Parameter steuert die Buchungs- und Berechnungsmethoden für die Versteuerungsart.',
   'This transaction has to be split into several transactions manually.' => 'Diese Buchung muss manuell in mehrere Buchungen aufgeteilt werden.',
   'This update will change the nature the onhand of goods is tracked.' => 'Dieses update &auml;ndert die Art und Weise wie Lagermengen gez&auml;lt werden.',
   'This upgrade script tries to map all existing parts in the database to the newly created Buchungsgruppen.' => 'Dieses Upgradescript versucht, bei allen bestehenden Artikeln neu erstellte Buchungsgruppen zuzuordnen.',
@@ -2285,6 +2338,7 @@ $self->{texts} = {
   'ea'                          => 'St.',
   'emailed to'                  => 'gemailt an',
   'empty'                       => 'leer',
+  'every time'                  => 'immer',
   'executed'                    => 'ausgeführt',
   'failed'                      => 'fehlgeschlagen',
   'female'                      => 'weiblich',
@@ -2342,6 +2396,7 @@ $self->{texts} = {
   'not yet executed'            => 'Noch nicht ausgeführt',
   'number'                      => 'Nummer',
   'oe.pl::search called with unknown type' => 'oe.pl::search mit unbekanntem Typ aufgerufen',
+  'on the same day'             => 'am selben Tag',
   'one-time execution'          => 'einmalige Ausführung',
   'only OB Transactions'        => 'nur EB-Buchungen',
   'open'                        => 'Offen',
index eb83e18e3ae31e0f977e080dc62e38f14889ce57..e07e39aca956409dd94e448c8ec376bbcd194da8 100644 (file)
@@ -48,13 +48,17 @@ $self->{texts} = {
   'AP Transaction Storno (one letter abbreviation)' => 'S',
   'AP Transaction with Storno (abbreviation)' => 'K(S)',
   'AP Transactions'             => 'Eingangsrechnungen',
+  'AP transactions changeable'  => 'Änderbarkeit von Kreditorenbuchungen',
   'AP transactions with sales taxkeys and/or AR transactions with input taxkeys' => 'Kreditorenbuchungen mit Umsatzsteuer-Steuerschlüsseln und/oder Debitorenbuchungen mit Vorsteuer-Steuerschlüsseln',
   'AR'                          => 'Verkauf',
   'AR Aging'                    => 'Forderungen',
   'AR Transaction'              => 'Debitorenbuchung',
   'AR Transaction (abbreviation)' => 'D',
   'AR Transactions'             => 'Debitorenbuchungen',
+  'AR transactions changeable'  => 'Änderbarkeit von Debitorenbuchungen',
   'ASSETS'                      => 'AKTIVA',
+  '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.' => 'ACHTUNG! Wenn Sie diese Einstellung aktivieren, dann können Sie sie später nicht ohne Weiteres deaktivieren, ohne dafür zu sorgen, dass die Felder der Mindeshaltbarkeitsdaten in der Datenbank leer gemacht werden.',
+  'ATTENTION! You can not simply change it from periodic to perpetual once you started posting.' => 'ACHTUNG! Es kann nicht ohne Weiteres im laufenden Betrieb von der Aufwandsmethode zur Bestandsmethode gewechselt werden.',
   'Abort'                       => 'Abbrechen',
   'Abrechnungsnummer'           => 'Abrechnungsnummer',
   'Abteilung'                   => 'Abteilung',
@@ -183,6 +187,7 @@ $self->{texts} = {
   'An upper-case character is required.' => 'Ein Großbuchstabe ist vorgeschrieben.',
   'Annotations'                 => 'Hilfe',
   'Another user with the login #1 does already exist.' => 'Es existiert bereits ein anderer Benutzer mit diesem Login.',
+  'Any stock contents containing a best before date will be impossible to stock out otherwise.' => 'Sonst können Artikel, bei denen ein Mindesthaltbarkeitsdatum gesetzt ist, nicht mehr ausgelagert werden.',
   'Ap aging on %s'              => 'Offene Verbindlichkeiten zum %s',
   'Application Error. No Format given' => 'Fehler in der Anwendung. Das Ausgabeformat fehlt.',
   'Application Error. Wrong Format' => 'Fehler in der Anwendung. Falsches Format: ',
@@ -388,6 +393,11 @@ $self->{texts} = {
   'Check'                       => 'Scheck',
   'Check Details'               => 'Bitte Angaben Ã¼berprüfen',
   'Check for duplicates'        => 'Dublettencheck',
+  'Check on ap transaction'     => 'Prüfen bei Kreditorenbuchung',
+  'Check on ar transaction'     => 'Prüfen bei Debitorenbuchung',
+  'Check on gl transaction'     => 'Prüfen bei Dialogbuchung',
+  'Check on purchase invoice'   => 'Prüfen bei Einkaufsrechnung',
+  'Check on sales invoice'      => 'Prüfen bei Verkaufsrechnung',
   'Checks'                      => 'Schecks',
   'Choose Customer'             => 'Endkunde wählen:',
   'Choose Outputformat'         => 'Ausgabeformat auswählen...',
@@ -397,6 +407,8 @@ $self->{texts} = {
   'Cleared Balance'             => 'abgeschlossen',
   'Clearing Tax Received (No 71)' => 'Verrechnung des Erstattungsbetrages erwünscht (Zeile 71)',
   'Click on login name to edit!' => 'Zum Bearbeiten den Benutzernamen anklicken!',
+  'Client Configuration'        => 'Mandantenkonfiguration',
+  'Client Configuration saved!' => 'Mandantenkonfiguration gespeichert!',
   'Close'                       => 'Übernehmen',
   'Close Books up to'           => 'Die Bücher abschließen bis zum',
   'Close Dialog'                => 'Schließen',
@@ -516,6 +528,7 @@ $self->{texts} = {
   'Customers'                   => 'Kunden',
   'Customers and vendors'       => 'Kunden und Lieferanten',
   'Customized Report'           => 'Vorgewählte Zeiträume',
+  'DATEV check configuration'   => 'Einstellungen für DATEV-Prüfung',
   'DATEV - Export Assistent'    => 'DATEV-Exportassistent',
   'DATEV Angaben'               => 'DATEV-Angaben',
   'DATEV Export'                => 'DATEV-Export',
@@ -869,6 +882,7 @@ $self->{texts} = {
   'Full access to all functions' => 'Vollzugriff auf alle Funktionen',
   'Fwd'                         => 'Vorw&auml;rts',
   'GL Transaction'              => 'Dialogbuchung',
+  'GL transactions changeable'  => 'Änderbarkeit von Dialogbuchungen',
   'Gegenkonto'                  => 'Gegenkonto',
   'Gender'                      => 'Geschlecht',
   'General Ledger'              => 'Buchhaltung',
@@ -1000,6 +1014,7 @@ $self->{texts} = {
   'It is possible that even after such a correction there is something wrong with this transaction (e.g. taxes that don\'t match the selected taxkey). Therefore you should re-run the general ledger analysis.' => 'Auch nach einer Korrektur kann es mit dieser Buchung noch weitere Probleme geben (z.B. nicht zum Steuerschlüssel passende Steuern), weshalb ein erneutes Ausführen der Hauptbuchanalyse empfohlen wird.',
   'It is possible to do this automatically for some Buchungsgruppen, but not for all.' => 'Es ist m&ouml;glich, dies f&uuml;r einige, aber nicht f&uuml;r alle Buchungsgruppen automatisch zu erledigen.',
   'It is possible to do this automatically for some units, but for others the user has to chose the new unit.' => 'Das ist f&uuml;r einige Einheiten automatisch m&ouml;glich, aber bei anderen muss der Benutzer die neue Einheit ausw&auml;hlen.',
+  '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.' => 'Es ist möglich, bei jeder Buchung einen schnellen DATEV-Export durchzuführen, um sicherzustellen, dass die Datensätze den DATEV-Anforderungen genügen. Da dies einen kleinen Overhead bedeutet, lässt sich die Einstellung für jeden Buchungstyp getrennt einstellen.',
   'It may optionally be compressed with &quot;gzip&quot;.' => 'Sie darf optional mit &quot;gzip&quot; komprimiert sein.',
   'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => 'Es wird einfach die Steuerschlüssel auf  0 setzen, was "keine Steuer" bedeutet und für solche Warenbestandsbuchungen der richtige Wert ist.',
   'Item deleted!'               => 'Artikel gelöscht!',
@@ -1279,6 +1294,7 @@ $self->{texts} = {
   'Order Number missing!'       => 'Auftragsnummer fehlt!',
   'Order deleted!'              => 'Auftrag gelöscht!',
   'Ordered'                     => 'Vom Kunde bestellt',
+  'Orders / Delivery Orders deleteable' => 'Aufträge / Lieferscheine löschbar',
   'Orientation'                 => 'Seitenformat',
   'Orphaned'                    => 'Nie benutzt',
   'Other users\' follow-ups'    => 'Wiedervorlagen anderer Benutzer',
@@ -1333,7 +1349,13 @@ $self->{texts} = {
   'Payment terms (database ID)' => 'Zahlungsbedingungen (Datenbank-ID)',
   'Payment terms (name)'        => 'Zahlungsbedingungen (Name)',
   'Payments'                    => 'Zahlungsausgänge',
+  'Payments Changeable'         => 'Änderbarkeit von Zahlungen',
   'Per. Inv.'                   => 'Wied. Rech.',
+  'Perform check when a gl transaction is posted?' => 'Prüfung durchführen, wenn eine Dialogbuchung gebucht wird?',
+  'Perform check when a purchase invoice or a payment for a purchase invoice is posted?' => 'Prüfung durchführen, wenn eine Einkaufsrechnung oder ein Zahlungsausgang hierfür gebucht wird?',
+  'Perform check when a sales invoice or a payment for a sales invoice is posted?' => 'Prüfung durchführen, wenn eine Verkaufsrechnung oder ein Zahlungseingang hierfür gebucht wird?',
+  'Perform check when an ap transaction is posted?' => 'Prüfung durchführen, wenn eine Kreditorenbuchung gebucht wird?',
+  'Perform check when an ar transaction is posted?' => 'Prüfung durchführen, wenn eine Debiotorenbuchung gebucht wird?',
   'Period'                      => 'Zeitraum',
   'Period:'                     => 'Zeitraum:',
   'Periodic Invoices'           => 'Wiederkehrende Rechnungen',
@@ -1381,6 +1403,7 @@ $self->{texts} = {
   'Post'                        => 'Buchen',
   'Post Payment'                => 'Zahlung buchen',
   'Post payments'               => 'Zahlungen buchen',
+  'Posting Configuration'       => 'Buchungskonfiguration',
   'Postscript'                  => 'Postscript',
   'Posustva_coa'                => 'USTVA Kennz.',
   'Preferences'                 => 'Einstellungen',
@@ -1441,13 +1464,16 @@ $self->{texts} = {
   'Projects'                    => 'Projekte',
   'Projecttransactions'         => 'Projektbuchungen',
   'Prozentual/Absolut'          => 'Prozentual/Absolut',
+  'Purchase Delivery Orders deleteable' => 'Einkaufslieferscheine löschbar',
   'Purchase Invoice'            => 'Einkaufsrechnung',
   'Purchase Order'              => 'Lieferantenauftrag',
   'Purchase Orders'             => 'Einkaufsbestellungen',
+  'Purchase Orders deleteable'  => 'Lieferantenaufträge löschbar',
   'Purchase Price'              => 'Einkaufspreis',
   'Purchase Prices'             => 'Einkaufspreise',
   'Purchase delivery order'     => 'Lieferschein (Einkauf)',
   'Purchase invoices'           => 'Einkaufsrechnungen',
+  'Purchase invoices changeable' => 'Änderbarkeit von Einkaufsrechnunen',
   'Purchase net amount'         => 'EK-Summe',
   'Purchase price'              => 'EK-Preis',
   'Purchase price total'        => 'EK-Summe',
@@ -1541,16 +1567,19 @@ $self->{texts} = {
   'Saldo neu'                   => 'Saldo neu',
   'Saldo per'                   => 'Saldo per',
   'Sale Prices'                 => 'Verkaufspreise',
+  'Sales Delivery Orders deleteable' => 'Verkaufslieferscheine löschbar',
   'Sales Invoice'               => 'Rechnung',
   'Sales Invoices'              => 'Ausgangsrechnungen',
   'Sales Order'                 => 'Kundenauftrag',
   'Sales Orders'                => 'Aufträge',
+  'Sales Orders deleteable'     => 'Kundenaufträge löschbar',
   'Sales Price information'     => '',
   'Sales Report'                => 'Verkaufsbericht',
   'Sales and purchase invoices with inventory transactions with taxkeys' => 'Einkaufs- und Verkaufsrechnungen mit Warenbestandsbuchungen mit Steuerschlüsseln',
   'Sales delivery order'        => 'Lieferschein (Verkauf)',
   'Sales invoice number'        => 'Ausgangsrechnungsnummer',
   'Sales invoices'              => 'Verkaufsrechnungen',
+  'Sales invoices changeable'   => 'Änderbarkeit von Verkaufsrechnungen',
   'Sales margin'                => 'Marge',
   'Sales margin %'              => 'Marge prozentual',
   'Sales net amount'            => 'VK-Netto',
@@ -1636,12 +1665,32 @@ $self->{texts} = {
   'Shipto is in use and was flagged invalid.' => 'Lieferadresse ist noch in Verwendung, und wurde als ungültig markiert.',
   'Shopartikel'                 => 'Shopartikel',
   'Short'                       => 'Knapp',
+  'Should ap transactions be and when should they be changeable or deleteable after posting?' => 'Sollen Kreditorenbuchungen nach der Buchung zu Ã¤ndern oder zu löschen sein?',
+  'Should ar transactions be and when should they be changeable or deleteable after posting?' => 'Sollen Debitorenbuchungen nach der Buchung zu Ã¤ndern oder zu löschen sein?',
+  'Should gl transactions be and when should they be changeable or deleteable after posting?' => 'Sollen Dialogbuchungen nach der Buchung zu Ã¤ndern oder zu löschen sein?',
+  'Should payments be and when should they be changeable after posting?' => 'Sollen Zahlungen nach dem Buchen Ã¤nderbar sein, und wenn ja, wann?',
+  'Should purchase invoices be and when should they be deleteable after posting?' => 'Sollen Einkaufsrechnungen nach der Buchung zu löschen sein?',
+  'Should sales invoices be and when should they be changeable or deleteable after posting?' => 'Sollen Verkaufrechnung nach der Buchung zu Ã¤ndern oder zu löschen sein?',
+  'Should the "mark as paid" button showed in ap transactions?' => 'Soll der Knopf "als bezahlt markieren" bei Kreditorenbuchungen angezeigt werden?',
+  'Should the "mark as paid" button showed in ar transactions?' => 'Soll der Knopf "als bezahlt markieren" bei Debitorenbuchungen angezeigt werden?',
+  'Should the "mark as paid" button showed in purchase invoices?' => 'Soll der Knopf "als bezahlt markieren" bei Einkaufsrechnungen angezeigt werden?',
+  'Should the "mark as paid" button showed on sales invoices?' => 'Soll der Knopf "als bezahlt markieren" bei Verkaufsrechnungen angezeigt werden?',
   'Show'                        => 'Zeigen',
+  'Show "mark as paid" in ap transactions' => '"als bezahlt markieren" bei Kreditorenbuchungen anzeigen',
+  'Show "mark as paid" in ar transactions' => '"als bezahlt markieren" bei Debitorenbuchungen anzeigen',
+  'Show "mark as paid" in purchase invoices' => '"als bezahlt markieren" bei Einkaufsrechnungen anzeigen',
+  'Show "mark as paid" in sales invoices' => '"als bezahlt markieren" bei Verkaufsrechnungen anzeigen',
+  'Show Bestbefore'             => 'Mindesthaltbarkeit anzeigen',
   'Show Salesman'               => 'Verkäufer anzeigen',
   'Show TODO list'              => 'Meine Aufgaben',
   'Show by default'             => 'Standardm&auml;&szlig;ig anzeigen',
   'Show custom variable search inputs' => 'Suche in erweiterten Datenfeldern',
+  'Show delete button in purchase delivery orders?' => 'Soll der "Löschen"-Knopf bei Einkaufslieferscheinen angezeigt werden?',
+  'Show delete button in purchase orders?' => 'Soll der "Löschen"-Knopf bei Lieferantenaufträgen angezeigt werden?',
+  'Show delete button in sales delivery orders?' => 'Soll der "Löschen"-Knopf bei Verkaufslieferscheinen angezeigt werden?',
+  'Show delete button in sales orders?' => 'Soll der "Löschen"-Knopf bei Kundenaufträgen angezeigt werden?',
   'Show details'                => 'Detailsanzeige',
+  'Show fields used for the best before date?' => 'Felder zur Eingabe des Mindesthaltbarkeitsdatums anzeigen?',
   'Show follow ups...'          => 'Zeige Wiedervorlagen...',
   'Show help text'              => 'Hilfetext anzeigen',
   'Show old dunnings'           => 'Alte Mahnungen anzeigen',
@@ -1925,6 +1974,7 @@ $self->{texts} = {
   'Therefore there\'s no need to create the same article more than once if it is sold or bought in/from another tax zone.' => 'Deswegen muss man den gleichen Artikel nicht mehr mehrmals anlegen, wenn er in verschiedenen Steuerzonen gehandelt werden soll.',
   'These units can be based on other units so that Lx-Office can convert prices when the user switches from one unit to another.' => 'Diese Einheiten k&ouml;nnen auf anderen Einheiten basieren, sodass Lx-Office Preise umrechnen kann, wenn der Benutzer von einer Einheit zu einer anderen Wechselt.',
   'These wrong entries cannot be fixed automatically.' => 'Diese Einträge können nicht automatisch bereinigt werden.',
+  'This can be done with the following query:' => 'Dies kann mit der folgenden Datenbankabfrage erreicht werden:',
   'This corresponds to Lx-Office\'s behavior prior to version 2.4.4.' => 'Dieses entspricht dem Verhalten von Lx-Office vor Version 2.4.4.',
   'This could have happened for two reasons:' => 'Dies kann aus zwei Gründen geschehen sein:',
   'This customer number is already in use.' => 'Diese Kundennummer wird bereits verwendet.',
@@ -1934,6 +1984,9 @@ $self->{texts} = {
   'This list is capped at 15 items to keep it fast. If you need a full list, please use reports.' => 'Diese Liste ist auf 15 Zeilen begrenzt. Wenn Sie eine vollständige Liste benötigen, erstellen Sie bitte einen Bericht.',
   'This means that the user has created an AP transaction and chosen a taxkey for sales taxes, or that he has created an AR transaction and chosen a taxkey for input taxes.' => 'Das bedeutet, dass ein Benutzer eine Kreditorenbuchung angelegt und in ihr einen Umsatzsteuer-Steuerschlüssel verwendet oder eine Debitorenbuchung mit Vorsteuer-Steuerschlüssel angelegt hat.',
   'This module can help you identify and correct such entries by analyzing the general ledger and presenting you likely solutions but also allowing you to fix problems yourself.' => 'Dieses Modul kann Ihnen helfen, problematische Einträge im Hauptbuch zu identifizieren und teilweise zu beheben. Dabei werden je nach Problem mögliche Lösungen aufgezeigt, wobei Sie die entscheiden können, welche Probleme automatisch gelöst werden sollen.',
+  'This option controls the inventory system.' => 'Dieser Parameter legt die Warenbuchungsmethode fest.',
+  'This option controls the method used for profit determination.' => 'Dieser Parameter legt die Berechnungsmethode für die Gewinnermittlung fest.',
+  'This option controls the posting and calculation behavior for the accounting method.' => 'Dieser Parameter steuert die Buchungs- und Berechnungsmethoden für die Versteuerungsart.',
   'This transaction has to be split into several transactions manually.' => 'Diese Buchung muss manuell in mehrere Buchungen aufgeteilt werden.',
   'This update will change the nature the onhand of goods is tracked.' => 'Dieses update &auml;ndert die Art und Weise wie Lagermengen gez&auml;lt werden.',
   'This upgrade script tries to map all existing parts in the database to the newly created Buchungsgruppen.' => 'Dieses Upgradescript versucht, bei allen bestehenden Artikeln neu erstellte Buchungsgruppen zuzuordnen.',
@@ -2209,6 +2262,7 @@ $self->{texts} = {
   'eMail?'                      => 'eMail?',
   'ea'                          => 'St.',
   'emailed to'                  => 'gemailt an',
+  'every time'                  => 'immer',
   'executed'                    => 'ausgeführt',
   'female'                      => 'weiblich',
   'follow_up_list'              => 'wiedervorlageliste',
@@ -2250,6 +2304,7 @@ $self->{texts} = {
   'not yet executed'            => 'Noch nicht ausgeführt',
   'number'                      => 'Nummer',
   'oe.pl::search called with unknown type' => 'oe.pl::search mit unbekanntem Typ aufgerufen',
+  'on the same day'             => 'am selben Tag',
   'only OB Transactions'        => 'nur EB-Buchungen',
   'open'                        => 'Offen',
   'order'                       => 'Reihenfolge',
index bd86b1c23b006bf936de51d3050b35f5e19c8770..89a4ddf1c537f34c90b80d235cf7ab9cf9937472 100644 (file)
@@ -48,13 +48,17 @@ $self->{texts} = {
   'AP Transaction Storno (one letter abbreviation)' => '',
   'AP Transaction with Storno (abbreviation)' => '',
   'AP Transactions'             => 'Purchase Transactions',
+  'AP transactions changeable'  => '',
   'AP transactions with sales taxkeys and/or AR transactions with input taxkeys' => '',
   'AR'                          => 'Sales',
   'AR Aging'                    => 'Debtor Aging',
   'AR Transaction'              => 'Sales Transaction',
   'AR Transaction (abbreviation)' => '',
   'AR Transactions'             => 'Sales Transactions',
+  'AR transactions changeable'  => '',
   'ASSETS'                      => '',
+  '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.' => '',
+  'ATTENTION! You can not simply change it from periodic to perpetual once you started posting.' => '',
   'Abort'                       => '',
   'Abrechnungsnummer'           => '',
   'Abteilung'                   => '',
@@ -183,6 +187,7 @@ $self->{texts} = {
   'An upper-case character is required.' => '',
   'Annotations'                 => '',
   'Another user with the login #1 does already exist.' => '',
+  'Any stock contents containing a best before date will be impossible to stock out otherwise.' => '',
   'Ap aging on %s'              => '',
   'Application Error. No Format given' => '',
   'Application Error. Wrong Format' => '',
@@ -389,6 +394,11 @@ $self->{texts} = {
   'Check'                       => 'Cheque',
   'Check Details'               => '',
   'Check for duplicates'        => '',
+  'Check on ap transaction'     => '',
+  'Check on ar transaction'     => '',
+  'Check on gl transaction'     => '',
+  'Check on purchase invoice'   => '',
+  'Check on sales invoice'      => '',
   'Checks'                      => '',
   'Choose Customer'             => '',
   'Choose Outputformat'         => '',
@@ -398,6 +408,8 @@ $self->{texts} = {
   'Cleared Balance'             => '',
   'Clearing Tax Received (No 71)' => '',
   'Click on login name to edit!' => '',
+  'Client Configuration'        => '',
+  'Client Configuration saved!' => '',
   'Close'                       => '',
   'Close Books up to'           => '',
   'Close Dialog'                => '',
@@ -527,6 +539,7 @@ $self->{texts} = {
   'DATEV - Export Assistent'    => '',
   'DATEV Angaben'               => '',
   'DATEV Export'                => '',
+  'DATEV check configuration'   => '',
   'DATEV check returned errors:' => '',
   'DATEX - Export Assistent'    => '',
   'DELETED'                     => '',
@@ -884,6 +897,7 @@ $self->{texts} = {
   'Full access to all functions' => '',
   'Fwd'                         => 'Forward',
   'GL Transaction'              => '',
+  'GL transactions changeable'  => '',
   'Gegenkonto'                  => '',
   'Gender'                      => '',
   'General Ledger'              => '',
@@ -1016,6 +1030,7 @@ $self->{texts} = {
   'It is possible that even after such a correction there is something wrong with this transaction (e.g. taxes that don\'t match the selected taxkey). Therefore you should re-run the general ledger analysis.' => '',
   'It is possible to do this automatically for some Buchungsgruppen, but not for all.' => '',
   'It is possible to do this automatically for some units, but for others the user has to chose the new unit.' => '',
+  '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.' => '',
   'It may optionally be compressed with &quot;gzip&quot;.' => '',
   'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => '',
   'Item deleted!'               => '',
@@ -1295,6 +1310,7 @@ $self->{texts} = {
   'Order Number missing!'       => '',
   'Order deleted!'              => '',
   'Ordered'                     => '',
+  'Orders / Delivery Orders deleteable' => '',
   'Orientation'                 => '',
   'Orphaned'                    => '',
   'Other users\' follow-ups'    => '',
@@ -1349,7 +1365,13 @@ $self->{texts} = {
   'Payment terms (database ID)' => '',
   'Payment terms (name)'        => '',
   'Payments'                    => '',
+  'Payments Changeable'         => '',
   'Per. Inv.'                   => '',
+  'Perform check when a gl transaction is posted?' => '',
+  'Perform check when a purchase invoice or a payment for a purchase invoice is posted?' => '',
+  'Perform check when a sales invoice or a payment for a sales invoice is posted?' => '',
+  'Perform check when an ap transaction is posted?' => '',
+  'Perform check when an ar transaction is posted?' => '',
   'Period'                      => '',
   'Period:'                     => '',
   'Periodic Invoices'           => '',
@@ -1397,6 +1419,7 @@ $self->{texts} = {
   'Post'                        => '',
   'Post Payment'                => '',
   'Post payments'               => '',
+  'Posting Configuration'       => '',
   'Postscript'                  => '',
   'Posustva_coa'                => '',
   'Preferences'                 => '',
@@ -1458,13 +1481,16 @@ $self->{texts} = {
   'Projects'                    => '',
   'Projecttransactions'         => '',
   'Prozentual/Absolut'          => '',
+  'Purchase Delivery Orders deleteable' => '',
   'Purchase Invoice'            => '',
   'Purchase Order'              => '',
   'Purchase Orders'             => '',
+  'Purchase Orders deleteable'  => '',
   'Purchase Price'              => '',
   'Purchase Prices'             => '',
   'Purchase delivery order'     => '',
   'Purchase invoices'           => '',
+  'Purchase invoices changeable' => '',
   'Purchase net amount'         => '',
   'Purchase price'              => '',
   'Purchase price total'        => '',
@@ -1560,16 +1586,19 @@ $self->{texts} = {
   'Saldo neu'                   => '',
   'Saldo per'                   => '',
   'Sale Prices'                 => '',
+  'Sales Delivery Orders deleteable' => '',
   'Sales Invoice'               => '',
   'Sales Invoices'              => '',
   'Sales Order'                 => '',
   'Sales Orders'                => '',
+  'Sales Orders deleteable'     => '',
   'Sales Price information'     => '',
   'Sales Report'                => '',
   'Sales and purchase invoices with inventory transactions with taxkeys' => '',
   'Sales delivery order'        => '',
   'Sales invoice number'        => '',
   'Sales invoices'              => '',
+  'Sales invoices changeable'   => '',
   'Sales margin'                => '',
   'Sales margin %'              => '',
   'Sales net amount'            => '',
@@ -1658,13 +1687,33 @@ $self->{texts} = {
   'Shipto is in use and was flagged invalid.' => '',
   'Shopartikel'                 => '',
   'Short'                       => '',
+  'Should ap transactions be and when should they be changeable or deleteable after posting?' => '',
+  'Should ar transactions be and when should they be changeable or deleteable after posting?' => '',
+  'Should gl transactions be and when should they be changeable or deleteable after posting?' => '',
+  'Should payments be and when should they be changeable after posting?' => '',
+  'Should purchase invoices be and when should they be deleteable after posting?' => '',
+  'Should sales invoices be and when should they be changeable or deleteable after posting?' => '',
+  'Should the "mark as paid" button showed in ap transactions?' => '',
+  'Should the "mark as paid" button showed in ar transactions?' => '',
+  'Should the "mark as paid" button showed in purchase invoices?' => '',
+  'Should the "mark as paid" button showed on sales invoices?' => '',
   'Show'                        => '',
+  'Show "mark as paid" in ap transactions' => '',
+  'Show "mark as paid" in ar transactions' => '',
+  'Show "mark as paid" in purchase invoices' => '',
+  'Show "mark as paid" in sales invoices' => '',
+  'Show Bestbefore'             => '',
   'Show Filter'                 => '',
   'Show Salesman'               => '',
   'Show TODO list'              => '',
   'Show by default'             => '',
   'Show custom variable search inputs' => '',
+  'Show delete button in purchase delivery orders?' => '',
+  'Show delete button in purchase orders?' => '',
+  'Show delete button in sales delivery orders?' => '',
+  'Show delete button in sales orders?' => '',
   'Show details'                => '',
+  'Show fields used for the best before date?' => '',
   'Show follow ups...'          => '',
   'Show help text'              => '',
   'Show items from invoices individually' => '',
@@ -1949,6 +1998,7 @@ $self->{texts} = {
   'Therefore there\'s no need to create the same article more than once if it is sold or bought in/from another tax zone.' => '',
   'These units can be based on other units so that kivitendo can convert prices when the user switches from one unit to another.' => '',
   'These wrong entries cannot be fixed automatically.' => '',
+  'This can be done with the following query:' => '',
   'This corresponds to kivitendo\'s behavior prior to version 2.4.4.' => '',
   'This could have happened for two reasons:' => '',
   'This customer number is already in use.' => '',
@@ -1958,6 +2008,9 @@ $self->{texts} = {
   'This list is capped at 15 items to keep it fast. If you need a full list, please use reports.' => '',
   'This means that the user has created an AP transaction and chosen a taxkey for sales taxes, or that he has created an AR transaction and chosen a taxkey for input taxes.' => '',
   'This module can help you identify and correct such entries by analyzing the general ledger and presenting you likely solutions but also allowing you to fix problems yourself.' => '',
+  'This option controls the inventory system.' => '',
+  'This option controls the method used for profit determination.' => '',
+  'This option controls the posting and calculation behavior for the accounting method.' => '',
   'This transaction has to be split into several transactions manually.' => '',
   'This update will change the nature the onhand of goods is tracked.' => '',
   'This upgrade script tries to map all existing parts in the database to the newly created Buchungsgruppen.' => '',
@@ -2238,6 +2291,7 @@ $self->{texts} = {
   'ea'                          => '',
   'emailed to'                  => '',
   'empty'                       => '',
+  'every time'                  => '',
   'executed'                    => '',
   'female'                      => '',
   'follow_up_list'              => '',
@@ -2273,6 +2327,7 @@ $self->{texts} = {
   'missing'                     => '',
   'month'                       => '',
   'monthly'                     => '',
+  'never'                       => '',
   'new Window'                  => '',
   'next'                        => '',
   'no'                          => '',
@@ -2288,6 +2343,7 @@ $self->{texts} = {
   'not yet executed'            => '',
   'number'                      => '',
   'oe.pl::search called with unknown type' => '',
+  'on the same day'             => '',
   'only OB Transactions'        => '',
   'open'                        => '',
   'order'                       => '',
index ca7c972f7d730b4d8c4bda56e3e5086adfe3366b..cb0700309de24377d4541c152a042d2748153a1c 100644 (file)
--- a/menu.ini
+++ b/menu.ini
@@ -824,6 +824,11 @@ action=audit_control
 module=am.pl
 action=show_history_search
 
+[System--Client Configuration]
+ACCESS=admin
+module=controller.pl
+action=ClientConfig/edit
+
 [System--Employees]
 ACCESS=admin
 module=controller.pl
diff --git a/sql/Pg-upgrade2/defaults_datev_check.pl b/sql/Pg-upgrade2/defaults_datev_check.pl
new file mode 100644 (file)
index 0000000..5077281
--- /dev/null
@@ -0,0 +1,54 @@
+# @tag: defaults_datev_check
+# @description: Einstellung für DATEV-Überprüfungen (datev_check) vom Config-File in die DB verlagern.
+# @depends: release_2_7_0
+# @charset: utf-8
+
+use utf8;
+use strict;
+
+die("This script cannot be run from the command line.") unless ($main::form);
+
+sub mydberror {
+  my ($msg) = @_;
+  die($dbup_locale->text("Database update error:") .
+      "<br>$msg<br>" . $DBI::errstr);
+}
+
+sub do_query {
+  my ($query, $may_fail) = @_;
+
+  if (!$dbh->do($query)) {
+    mydberror($query) unless ($may_fail);
+    $dbh->rollback();
+    $dbh->begin_work();
+  }
+}
+
+sub do_update {
+
+  # this query will fail if column already exist (new database)
+  do_query(qq|ALTER TABLE defaults ADD COLUMN datev_check_on_sales_invoice boolean    DEFAULT true|, 1);
+  do_query(qq|ALTER TABLE defaults ADD COLUMN datev_check_on_purchase_invoice boolean DEFAULT true|, 1);
+  do_query(qq|ALTER TABLE defaults ADD COLUMN datev_check_on_ar_transaction boolean   DEFAULT true|, 1);
+  do_query(qq|ALTER TABLE defaults ADD COLUMN datev_check_on_ap_transaction boolean   DEFAULT true|, 1);
+  do_query(qq|ALTER TABLE defaults ADD COLUMN datev_check_on_gl_transaction boolean   DEFAULT true|, 1);
+
+  # check current configuration and set default variables accordingly, so that
+  # kivitendo's behaviour isn't changed by this update
+  # if checks are not set in config set it to true
+  foreach my $check (qw(check_on_sales_invoice check_on_purchase_invoice check_on_ar_transaction check_on_ap_transaction check_on_gl_transaction)) {
+    my $check_set = 1;
+    if (!$::lx_office_conf{datev_check}->{$check}) {
+      $check_set = 0;
+    }
+
+    my $update_column = "UPDATE defaults SET datev_$check = '$check_set';";
+    do_query($update_column);
+  }
+
+
+  return 1;
+}
+
+return do_update();
+
diff --git a/sql/Pg-upgrade2/defaults_posting_config.pl b/sql/Pg-upgrade2/defaults_posting_config.pl
new file mode 100644 (file)
index 0000000..dd033d4
--- /dev/null
@@ -0,0 +1,49 @@
+# @tag: defaults_posting_config
+# @description: Einstellung, ob und wann Zahlungen Ã¤nderbar sind, vom Config-File in die DB verlagern.
+# @depends: release_2_7_0
+# @charset: utf-8
+
+use utf8;
+use strict;
+
+die("This script cannot be run from the command line.") unless ($main::form);
+
+sub mydberror {
+  my ($msg) = @_;
+  die($dbup_locale->text("Database update error:") .
+      "<br>$msg<br>" . $DBI::errstr);
+}
+
+sub do_query {
+  my ($query, $may_fail) = @_;
+
+  if (!$dbh->do($query)) {
+    mydberror($query) unless ($may_fail);
+    $dbh->rollback();
+    $dbh->begin_work();
+  }
+}
+
+sub do_update {
+
+  # this query will fail if column already exist (new database)
+  do_query(qq|ALTER TABLE defaults ADD COLUMN payments_changeable integer NOT NULL DEFAULT 0|, 1);
+
+  # check current configuration and set default variables accordingly, so that
+  # Lx-Office behaviour isn't changed by this update
+  # if payments_changeable is not set in config set it to 0
+  my $payments_changeable = 0;
+  if ($::lx_office_conf{features}->{payments_changeable} == 1 ) {
+    $payments_changeable = 1;
+  } elsif ($::lx_office_conf{features}->{payments_changeable} == 2 ) {
+    $payments_changeable = 2;
+  }
+
+  my $update_column = "UPDATE defaults SET payments_changeable = '$payments_changeable';";
+  do_query($update_column);
+
+  return 1;
+}
+
+return do_update();
+
diff --git a/sql/Pg-upgrade2/defaults_posting_records_config.sql b/sql/Pg-upgrade2/defaults_posting_records_config.sql
new file mode 100644 (file)
index 0000000..d6ef501
--- /dev/null
@@ -0,0 +1,10 @@
+-- @tag: defaults_posting_records_config
+-- @description: Einstellung, ob und wann Belegbuchungen Ã¤nderbar/löschbar sind.
+-- @depends: release_2_7_0
+-- @charset: utf-8
+
+ALTER TABLE defaults ADD COLUMN is_changeable integer NOT NULL DEFAULT 2;
+ALTER TABLE defaults ADD COLUMN ir_changeable integer NOT NULL DEFAULT 2;
+ALTER TABLE defaults ADD COLUMN ar_changeable integer NOT NULL DEFAULT 2;
+ALTER TABLE defaults ADD COLUMN ap_changeable integer NOT NULL DEFAULT 2;
+ALTER TABLE defaults ADD COLUMN gl_changeable integer NOT NULL DEFAULT 2;
diff --git a/sql/Pg-upgrade2/defaults_show_bestbefore.pl b/sql/Pg-upgrade2/defaults_show_bestbefore.pl
new file mode 100644 (file)
index 0000000..36b1882
--- /dev/null
@@ -0,0 +1,47 @@
+# @tag: defaults_show_bestbefore
+# @description: Einstellung, ob Mindesthaltbarkeitsdatum angezeigt wird, vom Config-File in die DB verlagern.
+# @depends: release_2_7_0
+# @charset: utf-8
+
+use utf8;
+use strict;
+
+die("This script cannot be run from the command line.") unless ($main::form);
+
+sub mydberror {
+  my ($msg) = @_;
+  die($dbup_locale->text("Database update error:") .
+      "<br>$msg<br>" . $DBI::errstr);
+}
+
+sub do_query {
+  my ($query, $may_fail) = @_;
+
+  if (!$dbh->do($query)) {
+    mydberror($query) unless ($may_fail);
+    $dbh->rollback();
+    $dbh->begin_work();
+  }
+}
+
+sub do_update {
+
+  # this query will fail if column already exist (new database)
+  do_query(qq|ALTER TABLE defaults ADD COLUMN show_bestbefore boolean DEFAULT false|, 1);
+
+  # check current configuration and set default variables accordingly, so that
+  # Lx-Office behaviour isn't changed by this update
+  # if show_best_before is not set in config set it to 0
+  my $show_bestbefore = 0;
+  if ($::lx_office_conf{features}->{show_best_before}) {
+    $show_bestbefore = 1;
+  }
+
+  my $update_column = "UPDATE defaults SET show_bestbefore = '$show_bestbefore';";
+  do_query($update_column);
+
+  return 1;
+}
+
+return do_update();
+
diff --git a/sql/Pg-upgrade2/defaults_show_delete_on_orders.sql b/sql/Pg-upgrade2/defaults_show_delete_on_orders.sql
new file mode 100644 (file)
index 0000000..6f876eb
--- /dev/null
@@ -0,0 +1,9 @@
+-- @tag: defaults_show_delete_on_orders
+-- @description: Einstellung, ob der "Löschen"-Knopf bei Aufträgen und Lieferscheinen angezeigt wird.
+-- @depends: release_2_7_0
+-- @charset: utf-8
+
+ALTER TABLE defaults ADD COLUMN sales_order_show_delete             boolean DEFAULT TRUE;
+ALTER TABLE defaults ADD COLUMN purchase_order_show_delete          boolean DEFAULT TRUE;
+ALTER TABLE defaults ADD COLUMN sales_delivery_order_show_delete    boolean DEFAULT TRUE;
+ALTER TABLE defaults ADD COLUMN purchase_delivery_order_show_delete boolean DEFAULT TRUE;
diff --git a/sql/Pg-upgrade2/defaults_show_mark_as_paid_config.sql b/sql/Pg-upgrade2/defaults_show_mark_as_paid_config.sql
new file mode 100644 (file)
index 0000000..8635763
--- /dev/null
@@ -0,0 +1,9 @@
+-- @tag: defaults_show_mark_as_paid_config
+-- @description: Einstellung, ob der "als bezahlt markieren"-Knopf angezeigt wird.
+-- @depends: release_2_7_0
+-- @charset: utf-8
+
+ALTER TABLE defaults ADD COLUMN is_show_mark_as_paid boolean DEFAULT TRUE;
+ALTER TABLE defaults ADD COLUMN ir_show_mark_as_paid boolean DEFAULT TRUE;
+ALTER TABLE defaults ADD COLUMN ar_show_mark_as_paid boolean DEFAULT TRUE;
+ALTER TABLE defaults ADD COLUMN ap_show_mark_as_paid boolean DEFAULT TRUE;
index 8ac37eca60211c60603615fdb97f6282342d5b79..2408d52456175608fd868c103fc9a89c3588945d 100644 (file)
@@ -42,7 +42,9 @@
 
 [%- IF id %]
   <input type="submit" onclick="set_history_window([% id %]);" name="history" id="history" value="[% 'history' | $T8 %]">
-  <input type="submit" name="action" value="[% 'mark as paid' | $T8 %]">
+  [% IF INSTANCE_CONF.get_ap_show_mark_as_paid %]
+    <input type="submit" name="action" value="[% 'mark as paid' | $T8 %]">
+  [% END %]
 [%- END %]
 
 </form>
diff --git a/templates/webpages/client_config/form.html b/templates/webpages/client_config/form.html
new file mode 100644 (file)
index 0000000..5fc0c04
--- /dev/null
@@ -0,0 +1,189 @@
+[%- USE T8 %][%- USE L %][% USE LxERP %]
+
+<h1>[% title | html %]</h1>
+
+[% PROCESS 'common/flash.html' %]
+
+<form action='controller.pl' method='POST'>
+
+<table>
+
+ <tr class='listheading'>
+   <th colspan="3">[% 'Posting Configuration' | $T8 %]</th>
+ </tr>
+
+ <tr>
+   <td align="right">[% 'Sales invoices changeable' | $T8 %]</td>
+   <td>[% L.select_tag('is_changeable', SELF.posting_options, value_key => 'value', title_key => 'title', default => SELF.is_changeable) %]</td>
+   <td>[% 'Should sales invoices be and when should they be changeable or deleteable after posting?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Purchase invoices changeable' | $T8 %]</td>
+   <td>[% L.select_tag('ir_changeable', SELF.posting_options, value_key => 'value', title_key => 'title', default => SELF.ir_changeable) %]</td>
+   <td>[% 'Should purchase invoices be and when should they be deleteable after posting?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'AR transactions changeable' | $T8 %]</td>
+   <td>[% L.select_tag('ar_changeable', SELF.posting_options, value_key => 'value', title_key => 'title', default => SELF.ar_changeable) %]</td>
+   <td>[% 'Should ar transactions be and when should they be changeable or deleteable after posting?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'AP transactions changeable' | $T8 %]</td>
+   <td>[% L.select_tag('ap_changeable', SELF.posting_options, value_key => 'value', title_key => 'title', default => SELF.ap_changeable) %]</td>
+   <td>[% 'Should ap transactions be and when should they be changeable or deleteable after posting?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'GL transactions changeable' | $T8 %]</td>
+   <td>[% L.select_tag('gl_changeable', SELF.posting_options, value_key => 'value', title_key => 'title', default => SELF.gl_changeable) %]</td>
+   <td>[% 'Should gl transactions be and when should they be changeable or deleteable after posting?' | $T8 %]</td>
+ </tr>
+
+ <tr> </tr>
+ <tr> </tr>
+
+ <tr>
+   <td align="right">[% 'Payments Changeable' | $T8 %]</td>
+   <td>[% L.select_tag('payments_changeable', SELF.payment_options, value_key => 'value', title_key => 'title', default => SELF.payments_changeable) %]</td>
+   <td>[% 'Should payments be and when should they be changeable after posting?' | $T8 %]</td>
+ </tr>
+
+ <tr> </tr>
+ <tr> </tr>
+
+ <tr>
+   <td align="right">[% 'Show "mark as paid" in sales invoices' | $T8 %]</td>
+   <td>[% L.yes_no_tag('is_show_mark_as_paid', SELF.is_show_mark_as_paid) %]</td>
+   <td>[% 'Should the "mark as paid" button showed on sales invoices?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Show "mark as paid" in purchase invoices' | $T8 %]</td>
+   <td>[% L.yes_no_tag('ir_show_mark_as_paid', SELF.ir_show_mark_as_paid) %]</td>
+   <td>[% 'Should the "mark as paid" button showed in purchase invoices?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Show "mark as paid" in ar transactions' | $T8 %]</td>
+   <td>[% L.yes_no_tag('ar_show_mark_as_paid', SELF.ar_show_mark_as_paid) %]</td>
+   <td>[% 'Should the "mark as paid" button showed in ar transactions?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Show "mark as paid" in ap transactions' | $T8 %]</td>
+   <td>[% L.yes_no_tag('ap_show_mark_as_paid', SELF.ap_show_mark_as_paid) %]</td>
+   <td>[% 'Should the "mark as paid" button showed in ap transactions?' | $T8 %]</td>
+ </tr>
+
+ <tr> </tr>
+ <tr> </tr>
+
+ <tr>
+   <td align="right">[% 'Accounting method' | $T8 %]</td>
+   <td>[% L.select_tag('accounting_method', SELF.accounting_options, value_key => 'value', title_key => 'title', default => SELF.accounting_method) %]</td>
+   <td>[% 'This option controls the posting and calculation behavior for the accounting method.' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Inventory system' | $T8 %]</td>
+   <td>[% L.select_tag('inventory_system', SELF.inventory_options, value_key => 'value', title_key => 'title', default => SELF.inventory_system) %]</td>
+   <td>
+     [% 'This option controls the inventory system.' | $T8 %]<br>
+     [% 'ATTENTION! You can not simply change it from periodic to perpetual once you started posting.' | $T8 %]
+   </td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Profit determination' | $T8 %]</td>
+   <td>[% L.select_tag('profit_determination', SELF.profit_options, value_key => 'value', title_key => 'title', default => SELF.profit_determination) %]</td>
+   <td>[% 'This option controls the method used for profit determination.' | $T8 %]</td>
+ </tr>
+
+ <tr> </tr>
+ <tr> </tr>
+
+ <tr class='listheading'>
+   <th colspan="3">[% 'DATEV check configuration' | $T8 %]</th>
+ </tr>
+ <tr>
+   <td colspan="3">[% '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.' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Check on sales invoice' | $T8 %]</td>
+   <td>[% L.yes_no_tag('datev_check_on_sales_invoice', SELF.datev_check_on_sales_invoice) %]</td>
+   <td>[% 'Perform check when a sales invoice or a payment for a sales invoice is posted?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Check on purchase invoice' | $T8 %]</td>
+   <td>[% L.yes_no_tag('datev_check_on_purchase_invoice', SELF.datev_check_on_purchase_invoice) %]</td>
+   <td>[% 'Perform check when a purchase invoice or a payment for a purchase invoice is posted?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Check on ar transaction' | $T8 %]</td>
+   <td>[% L.yes_no_tag('datev_check_on_ar_transaction', SELF.datev_check_on_ar_transaction) %]</td>
+   <td>[% 'Perform check when an ar transaction is posted?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Check on ap transaction' | $T8 %]</td>
+   <td>[% L.yes_no_tag('datev_check_on_ap_transaction', SELF.datev_check_on_ap_transaction) %]</td>
+   <td>[% 'Perform check when an ap transaction is posted?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Check on gl transaction' | $T8 %]</td>
+   <td>[% L.yes_no_tag('datev_check_on_gl_transaction', SELF.datev_check_on_gl_transaction) %]</td>
+   <td>[% 'Perform check when a gl transaction is posted?' | $T8 %]</td>
+ </tr>
+
+ <tr> </tr>
+ <tr> </tr>
+
+ <tr class='listheading'>
+   <th colspan="3">[% 'Orders / Delivery Orders deleteable' | $T8 %]</th>
+ </tr>
+ <tr>
+   <td align="right">[% 'Sales Orders deleteable' | $T8 %]</td>
+   <td>[% L.yes_no_tag('sales_order_show_delete', SELF.sales_order_show_delete) %]</td>
+   <td>[% 'Show delete button in sales orders?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Purchase Orders deleteable' | $T8 %]</td>
+   <td>[% L.yes_no_tag('purchase_order_show_delete', SELF.purchase_order_show_delete) %]</td>
+   <td>[% 'Show delete button in purchase orders?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Sales Delivery Orders deleteable' | $T8 %]</td>
+   <td>[% L.yes_no_tag('sales_delivery_order_show_delete', SELF.sales_delivery_order_show_delete) %]</td>
+   <td>[% 'Show delete button in sales delivery orders?' | $T8 %]</td>
+ </tr>
+ <tr>
+   <td align="right">[% 'Purchase Delivery Orders deleteable' | $T8 %]</td>
+   <td>[% L.yes_no_tag('purchase_delivery_order_show_delete', SELF.purchase_delivery_order_show_delete) %]</td>
+   <td>[% 'Show delete button in purchase delivery orders?' | $T8 %]</td>
+ </tr>
+
+ <tr> </tr>
+ <tr> </tr>
+
+ <tr class='listheading'>
+   <th colspan="3">[% 'Warehouse' | $T8 %]</th>
+ </tr>
+ <tr>
+   <td align="right">[% 'Show Bestbefore' | $T8 %]</td>
+   <td>
+     [% L.yes_no_tag('show_bestbefore', SELF.show_bestbefore) %]
+   </td>
+   <td>
+     [% 'Show fields used for the best before date?' | $T8 %]<br>
+     [% '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.' | $T8 %]<br>
+     [% 'This can be done with the following query:' | $T8 %]<br>
+     <br>
+     UPDATE inventory SET bestbefore = NULL; <br>
+     <br>
+     [% 'Any stock contents containing a best before date will be impossible to stock out otherwise.' | $T8 %]
+   </td>
+ </tr>
+
+</table>
+
+<br>
+
+[%- L.hidden_tag('action',  'ClientConfig/dispatch')  %]
+[%- L.submit_tag('action_save',  LxERP.t8('Save'))  %]
+
+<br><br>
+
+</form>
index a6e26c644c71797faaaff70398b15f45e04a818b..b1a2a5060bff160c145c460abec3b0b0ec126ed6 100644 (file)
@@ -1,7 +1,7 @@
 [%- USE T8 %]
 [% USE HTML %]<p>[% '...done' | $T8 %]</p>
 
-<form action="[% IF is_admin %]admin.pl[% ELSE %][% login.pl %][% END %]">
+<form action="[% IF is_admin %]admin.pl[% ELSE %]login.pl[% END %]">
 
  <input type="hidden" name="action" value="[% IF is_admin %]login[% ELSE %]company_logo[% END %]">
 
index a37e94239510bf7b0f163af711e027b92e14560f..364367b9225f1341afa2e48646d9829c274984e9 100644 (file)
@@ -82,8 +82,8 @@
   <p>
    [% 'Workflow Delivery Order' | $T8 %]<br>
    <input class="submit" type="submit" name="action_save_as_new" value="[% 'Save as new' | $T8 %]">
-   [% UNLESS delivered %]
-   <input class="submit" type="submit" name="action_delete" value="[% 'Delete' | $T8 %]">
+   [% UNLESS delivered || (vc == 'customer' && !INSTANCE_CONF.get_sales_delivery_order_show_delete) || (vc == 'vendor' && !INSTANCE_CONF.get_purchase_delivery_order_show_delete) %]
+     <input class="submit" type="submit" name="action_delete" value="[% 'Delete' | $T8 %]">
    [% END %]
    <input class="submit" type="submit" name="action_invoice" value="[% 'Invoice' | $T8 %]">
   </p>
index 27457f310b9c9421739190dae90340e7aa8e7eec..99b5db1e247073deb500c1170b464c4d92962ecf 100644 (file)
@@ -93,7 +93,7 @@
      <th class="listheading">[% 'Warehouse' | $T8 %]</th>
      <th class="listheading">[% 'Bin' | $T8 %]</th>
      <th class="listheading">[% 'Charge Number' | $T8 %]</th>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <th class="listheading">[% 'Best Before' | $T8 %]</th>
      [% END %]
      <th align="right" class="listheading">[% 'Qty' | $T8 %]</th>
      <td>[% HTML.escape(row.warehouse_description) %]</td>
      <td>[% HTML.escape(row.bin_description) %]</td>
      <td>[% HTML.escape(row.chargenumber) %]</td>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <td>[% HTML.escape(row.bestbefore) %]</td>
      [% END %]
      <td>[% HTML.escape(LxERP.format_amount(row.qty)) %]</td>
 
      <td><select name="bin_id_[% loop.count %]" id="bin_id_[% loop.count %]"></select></td>
      <td><input name="chargenumber_[% loop.count %]" value="[% HTML.escape(row.chargenumber) %]"></td>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <td>
        [% L.date_tag('bestbefore_'_ loop.count, row.bestbefore) %]
      </td>
index 6aee3510f051fb0206d8216b17a23694ee0be1d4..06b599038ff9bda4a18afb05659e9e81f57e321a 100644 (file)
@@ -61,7 +61,7 @@
      <th class="listheading">[% 'Warehouse' | $T8 %]</th>
      <th class="listheading">[% 'Bin' | $T8 %]</th>
      <th class="listheading">[% 'Charge Number' | $T8 %]</th>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <th class="listheading">[% 'Best Before' | $T8 %]</th>
      [% END %]
      [%- UNLESS delivered %]
@@ -77,7 +77,7 @@
      <td>[% HTML.escape(row.warehousedescription) %]</td>
      <td>[% HTML.escape(row.bindescription) %]</td>
      <td>[% HTML.escape(row.chargenumber) %]</td>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <td>[% HTML.escape(row.bestbefore) %]</td>
      [% END %]
      [%- IF delivered %]
     <input type="hidden" name="warehouse_id_[% loop.count %]" value="[% HTML.escape(row.warehouse_id) %]">
     <input type="hidden" name="bin_id_[% loop.count %]"       value="[% HTML.escape(row.bin_id) %]">
     <input type="hidden" name="chargenumber_[% loop.count %]" value="[% HTML.escape(row.chargenumber) %]">
-    [% IF conf_show_best_before %]
+    [% IF INSTANCE_CONF.get_show_bestbefore %]
     <input type="hidden" name="bestbefore_[% loop.count %]" value="[% HTML.escape(row.bestbefore) %]">
     [% END %]
     [%- END %]
index f08104146258faf4b08d700cec3e223d57331410..ddf5511c8917cbfe58fe594bf1eba404e09dff55 100644 (file)
@@ -21,7 +21,7 @@
      <th class="listheading">[% 'Charge number' | $T8 %]</th>
      [% END %]
      [% IF has_bestbefore %]
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <th class="listheading">[% 'Best Before' | $T8 %]</th>
      [% END %]
      [% END %]
@@ -55,7 +55,7 @@
      </td>
      [% END %]
      [% IF has_bestbefore %]
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <td>
       <input type="hidden" name="new_bestbefore_id_[% loop.count %]" value="[% HTML.escape(part.bestbefore_id) %]">
       <input type="hidden" name="new_bestbefore_[% loop.count %]" value="[% HTML.escape(part.bestbefore) %]">
index 2f255f78826accce820552dd14d046938f73c80b..b2732a7ce61326b2d8d57fa69348483afb5d667e 100644 (file)
       [%#- button for saving history %]
       <input type="button" class="submit" onclick="set_history_window([% id | html %]);" name="history" id="history" value="[% 'history' | $T8 %]">
 
-      <input type="submit" class="submit" name="action" value="[% 'mark as paid' | $T8 %]">
+      [% IF INSTANCE_CONF.get_ir_show_mark_as_paid %]
+          <input type="submit" class="submit" name="action" value="[% 'mark as paid' | $T8 %]">
+      [% END %]
   [% END %]
 
 <input type="hidden" name="rowcount" value="[% rowcount %]">
index 6cbcd4ef1db7c0fbe133914807380387473e9f5b..ee093dc95d5de01c1f8f7c3a66e23f8d32333a60 100644 (file)
   [% IF id %]
       [%#- button for saving history %]
       <input type="button" class="submit" onclick="set_history_window([% id | html %]);" name="history" id="history" value="[% 'history' | $T8 %]">
-
-      <input type="submit" class="submit" name="action" value="[% 'mark as paid' | $T8 %]">
+      [% IF INSTANCE_CONF.get_is_show_mark_as_paid %]
+          <input type="submit" class="submit" name="action" value="[% 'mark as paid' | $T8 %]">
+      [% END %]
   [% END %]
 
 <input type="hidden" name="rowcount" value="[% rowcount %]">
index ddf4a53d2b544310958e51035116ee016379f65f..f83334c44c11c4943ae1f21d59df77a132324703 100644 (file)
 
   <br>[% label_workflow %]<br>
   <input class="submit" type="submit" name="action_save_as_new" value="[% 'Save as new' | $T8 %]">
-  <input class="submit" type="submit" name="action_delete" value="[% 'Delete' | $T8 %]">
+
+  [%- UNLESS (is_sales_ord && !INSTANCE_CONF.get_sales_order_show_delete) || (is_pur_ord && !INSTANCE_CONF.get_purchase_order_show_delete) %]
+    <input class="submit" type="submit" name="action_delete" value="[% 'Delete' | $T8 %]">
+  [%- END %]
 
   [%- IF is_sales_quo %]
     <input class="submit" type="submit" name="action_sales_order" value="[% 'Sales Order' | $T8 %]">
index 36740581e2145713e714dd53aa7a41509c1a3d51..e6082cd9c4b8102dd727ef7d25b0eae23d27322f 100644 (file)
         <th align="right" nowrap>[% 'Charge Number' | $T8 %]:</th>
         <td><input name="chargenumber" size=40></td>
        </tr>
-       [% IF conf_show_best_before %]
+       [% IF INSTANCE_CONF.get_show_bestbefore %]
        <tr>
         <th align="right" nowrap>[% 'Best Before' | $T8 %]:</th>
         <td>
         <td nowrap><label for="l_partnumber">[% 'Part Number' | $T8 %]</label></td>
         <td align="right"><input name="l_chargenumber" id="l_chargenumber" class="checkbox" type="checkbox" value="Y" checked></td>
         <td nowrap><label for="l_chargenumber">[% 'Charge Number' | $T8 %]</label></td>
-        [% IF conf_show_best_before %]
+        [% IF INSTANCE_CONF.get_show_bestbefore %]
         <td align="right"><input name="l_bestbefore" id="l_bestbefore" class="checkbox" type="checkbox" value="Y" checked></td>
         <td nowrap><label for="l_bestbefore">[% 'Best Before' | $T8 %]</label></td>
         [% END %]
index 837023ed334d53387405a38fa07337f1e16f13dc..5cf5ffa35db4b839c309d98bf35c4e2712b047d7 100644 (file)
@@ -35,7 +35,7 @@
      <th class="listheading">[% 'Part Number' | $T8 %]</th>
      <th class="listheading">[% 'Part Description' | $T8 %]</th>
      <th class="listheading">[% 'Charge Number' | $T8 %]</th>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <th class="listheading">[% 'Best Before' | $T8 %]</th>
      [% END %]
      <th class="listheading">[% 'EAN' | $T8 %]</th>
@@ -50,7 +50,7 @@
      <input type="hidden" name="partnumber_[% loop.count %]" value="[% HTML.escape(row.partnumber) %]">
      <input type="hidden" name="partdescription_[% loop.count %]" value="[% HTML.escape(row.partdescription) %]">
      <input type="hidden" name="chargenumber_[% loop.count %]" value="[% HTML.escape(row.chargenumber) %]">
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <input type="hidden" name="bestbefore_[% loop.count %]" value="[% HTML.escape(row.bestbefore) %]">
      [% END %]
      <input type="hidden" name="ean_[% loop.count %]" value="[% HTML.escape(row.ean) %]">
@@ -58,7 +58,7 @@
      <td>[% HTML.escape(row.partnumber) %]</td>
      <td>[% HTML.escape(row.partdescription) %]</td>
      <td>[% HTML.escape(row.chargenumber) %]</td>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <td>[% HTML.escape(row.bestbefore) %]</td>
      [% END %]
      <td>[% HTML.escape(row.ean) %]</td>
index 77a5070be5459c3eefef09db350a6d88b8708395..12a3e0b6049772df98f2cfb4b3acfc3bd83c3e82 100644 (file)
         <th align="right" nowrap>[% 'Charge Number' | $T8 %]:</th>
         <td><input name="chargenumber" size=40></td>
        </tr>
-       [% IF conf_show_best_before %]
+       [% IF INSTANCE_CONF.get_show_bestbefore %]
        <tr>
         <th align="right" nowrap>[% 'Best Before' | $T8 %]:</th>
         <td>
         <td nowrap><label for="l_partnumber">[% 'Part Number' | $T8 %]</label></td>
         <td align="right"><input name="l_chargenumber" id="l_chargenumber" class="checkbox" type="checkbox" value="Y" checked></td>
         <td nowrap><label for="l_chargenumber">[% 'Charge Number' | $T8 %]</label></td>
-        [% IF conf_show_best_before %]
+        [% IF INSTANCE_CONF.get_show_bestbefore %]
         <td align="right"><input name="l_bestbefore" id="l_bestbefore" class="checkbox" type="checkbox" value="Y" checked></td>
         <td nowrap><label for="l_bestbefore">[% 'Best Before' | $T8 %]</label></td>
         [% END %]
index e026dc61448d8402e4e1c34d2c67f530bd2f4679..62ded76ff61192a046378ac8b033c4c4d5799f2b 100644 (file)
@@ -66,7 +66,7 @@
      <th class="listheading">[% 'Part Number' | $T8 %]</th>
      <th class="listheading">[% 'Part Description' | $T8 %]</th>
      <th class="listheading">[% 'Charge Number' | $T8 %]</th>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <th class="listheading">[% 'Best Before' | $T8 %]</th>
      [% END %]
      <th class="listheading">[% 'EAN' | $T8 %]</th>
@@ -82,7 +82,7 @@
      <input type="hidden" name="partnumber_[% loop.count %]" value="[% HTML.escape(row.partnumber) %]">
      <input type="hidden" name="partdescription_[% loop.count %]" value="[% HTML.escape(row.partdescription) %]">
      <input type="hidden" name="chargenumber_[% loop.count %]" value="[% HTML.escape(row.chargenumber) %]">
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <input type="hidden" name="bestbefore_[% loop.count %]" value="[% HTML.escape(row.bestbefore) %]">
      [% END %]
      <input type="hidden" name="ean_[% loop.count %]" value="[% HTML.escape(row.ean) %]">
@@ -90,7 +90,7 @@
      <td>[% HTML.escape(row.partnumber) %]</td>
      <td>[% HTML.escape(row.partdescription) %]</td>
      <td>[% HTML.escape(row.chargenumber) %]</td>
-     [% IF conf_show_best_before %]
+     [% IF INSTANCE_CONF.get_show_bestbefore %]
      <td>[% HTML.escape(row.bestbefore) %]</td>
      [% END %]
      <td>[% HTML.escape(row.ean) %]</td>
index 29ffe751c1cab7e8cedbefba94e1768834d9edb0..429b3b1e62586daa886ee6d156aacc22673f24d4 100644 (file)
      <td><input name="chargenumber" size="30"></td>
     </tr>
 
-    [% IF conf_show_best_before %]
+    [% IF INSTANCE_CONF.get_show_bestbefore %]
     <tr>
      <th align="right" nowrap>[% 'Best Before' | $T8 %]</th>
      <td>
index 394450c76d91763082b63bd9ccc832de28df3b0d..4fb3a715fb6a17074d787506b57d4e260a0d68b9 100644 (file)
      <td><input name="chargenumber" size="30" value="[% HTML.escape(chargenumber) %]"></td>
     </tr>
 
-    [% IF conf_show_best_before %]
+    [% IF INSTANCE_CONF.get_show_bestbefore %]
     <tr>
      <th align="right" nowrap>[% 'Best Before' | $T8 %]</th>
      <td>
index bdff7961d8dbe30e2ce0d19649c90fd7e9ee4094..50da3f1e2a477fc7a88b5ade416ab732b51fce03 100644 (file)
      <td><input name="chargenumber" size="30" value="[% HTML.escape(chargenumber) %]"></td>
     </tr>
 
-    [% IF conf_show_best_before %]
+    [% IF INSTANCE_CONF.get_show_bestbefore %]
     <tr>
      <th align="right" nowrap>[% 'Best Before' | $T8 %]</th>
      <td>