Umstellung von eur zu 3 Variablen in defaults
authorG. Richardson <information@lx-office-hosting.de>
Thu, 30 Jun 2011 07:57:27 +0000 (09:57 +0200)
committerG. Richardson <information@lx-office-hosting.de>
Wed, 13 Jul 2011 13:06:41 +0000 (15:06 +0200)
accounting_method inventory_system profit_determination

Details siehe doc/umstellung_eur.txt

19 files changed:
SL/DB/Helper/PriceTaxCalculator.pm
SL/DB/MetaSetup/Default.pm
SL/IR.pm
SL/IS.pm
SL/InstanceConfiguration.pm
SL/User.pm
bin/mozilla/admin.pl
bin/mozilla/am.pl
bin/mozilla/ca.pl
bin/mozilla/ic.pl
bin/mozilla/rp.pl
doc/changelog
doc/umstellung_eur.txt [new file with mode: 0644]
locale/de/all
locale/en/all
sql/Pg-upgrade2/umstellung_eur.pl [new file with mode: 0644]
sql/lx-office.sql
templates/webpages/admin/create_dataset.html
templates/webpages/am/edit_defaults.html

index d84d0fe..a8e1548 100644 (file)
@@ -167,7 +167,7 @@ sub _calculate_amounts {
 sub _calculate_assembly_item {
   my ($self, $data, $part, $total_qty, $base_factor) = @_;
 
-  return 0 if $::lx_office_conf{system}->{eur} || !$data->{is_invoice};
+  return 0 if $::instance_conf->get_inventory_system eq 'periodic' || !$data->{is_invoice};
 
   foreach my $assembly_entry (@{ $part->assemblies }) {
     push @{ $data->{assembly_items}->[-1] }, { part      => $assembly_entry->part,
@@ -188,7 +188,7 @@ sub _calculate_part_item {
 
   _dbg("cpsi tq " . $total_qty);
 
-  return 0 if $::lx_office_conf{system}->{eur} || !$data->{is_invoice} || !$total_qty;
+  return 0 if $::instance_conf->get_inventory_system eq 'periodic' || !$data->{is_invoice} || !$total_qty;
 
   my ($entry);
   $base_factor           ||= 1;
index f213eda..7406c22 100644 (file)
@@ -43,6 +43,9 @@ __PACKAGE__->meta->setup(
     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' },
   ],
 
   primary_key_columns => [ 'id' ],
index 1f30c6b..0fe1987 100644 (file)
--- a/SL/IR.pm
+++ b/SL/IR.pm
@@ -103,7 +103,11 @@ sub post_invoice {
     $form->{"qty_$i"}  = $form->parse_amount($myconfig, $form->{"qty_$i"});
     $form->{"qty_$i"} *= -1 if $form->{storno};
 
-    $form->{"inventory_accno_$i"} = $form->{"expense_accno_$i"} if $::lx_office_conf{system}->{eur};
+    if ( $::instance_conf->get_inventory_system eq 'periodic') {
+      # inventory account number is overwritten with expense account number, so
+      # never book incoming to inventory account but always to expense account
+      $form->{"inventory_accno_$i"} = $form->{"expense_accno_$i"} 
+    };
 
     # get item baseunit
     if (!$item_units{$form->{"id_$i"}}) {
@@ -211,7 +215,7 @@ sub post_invoice {
       # check if we sold the item already and
       # make an entry for the expense and inventory
       $query =
-        qq|SELECT i.id, i.qty, i.allocated, i.trans_id,
+        qq|SELECT i.id, i.qty, i.allocated, i.trans_id, i.base_qty,
              p.inventory_accno_id, p.expense_accno_id, a.transdate
            FROM invoice i, ar a, parts p
            WHERE (i.parts_id = p.id)
@@ -219,6 +223,20 @@ sub post_invoice {
              AND ((i.base_qty + i.allocated) > 0)
              AND (i.trans_id = a.id)
            ORDER BY transdate|;
+           # ORDER BY transdate guarantees FIFO
+
+# sold two items without having bought them yet, example result of query:
+# id | qty | allocated | trans_id | inventory_accno_id | expense_accno_id | transdate  
+# ---+-----+-----------+----------+--------------------+------------------+------------
+#  9 |   2 |         0 |        9 |                 15 |              151 | 2011-01-05
+
+# base_qty + allocated > 0 if article has already been sold but not bought yet
+
+# select qty,allocated,base_qty,sellprice from invoice where trans_id = 9;
+#  qty | allocated | base_qty | sellprice  
+# -----+-----------+----------+------------
+#    2 |         0 |        2 | 1000.00000
+
       $sth = prepare_execute_query($form, $dbh, $query, conv_i($form->{"id_$i"}));
 
       my $totalqty = $baseqty;
@@ -227,32 +245,38 @@ sub post_invoice {
         my $qty    = min $totalqty, ($ref->{base_qty} + $ref->{allocated});
         $linetotal = $form->round_amount(($form->{"sellprice_$i"} * $qty) / $basefactor, 2);
 
-        if ($ref->{allocated} < 0) {
-
-          # we have an entry for it already, adjust amount
-          $form->update_balance($dbh, "acc_trans", "amount",
-                                qq|    (trans_id = $ref->{trans_id})
-                                   AND (chart_id = $ref->{inventory_accno_id})
-                                   AND (transdate = '$ref->{transdate}')|,
-                                $linetotal);
-
-          $form->update_balance($dbh, "acc_trans", "amount",
-                                qq|    (trans_id = $ref->{trans_id})
-                                   AND (chart_id = $ref->{expense_accno_id})
-                                   AND (transdate = '$ref->{transdate}')|,
-                                $linetotal * -1);
-
-        } elsif ($linetotal != 0) {
-          # add entry for inventory, this one is for the sold item
-          $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey) VALUES (?, ?, ?, ?, (SELECT taxkey_id FROM chart WHERE id = ?))|;
-          @values = ($ref->{trans_id},  $ref->{inventory_accno_id}, $linetotal, $ref->{transdate}, $ref->{inventory_accno_id});
-          do_query($form, $dbh, $query, @values);
-
-          # add expense
-          $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey) VALUES (?, ?, ?, ?, (SELECT taxkey from tax WHERE chart_id = ?))|;
-          @values = ($ref->{trans_id},  $ref->{expense_accno_id}, ($linetotal * -1), $ref->{transdate}, $ref->{expense_accno_id});
-          do_query($form, $dbh, $query, @values);
-        }
+        if  ( $::instance_conf->get_inventory_system eq 'perpetual' ) {
+        # Warenbestandsbuchungen nur bei Bestandsmethode
+
+          if ($ref->{allocated} < 0) {
+
+# we have an entry for it already, adjust amount
+            $form->update_balance($dbh, "acc_trans", "amount",
+                qq|    (trans_id = $ref->{trans_id})
+                AND (chart_id = $ref->{inventory_accno_id})
+                AND (transdate = '$ref->{transdate}')|,
+                $linetotal);
+
+            $form->update_balance($dbh, "acc_trans", "amount",
+                qq|    (trans_id = $ref->{trans_id})
+                AND (chart_id = $ref->{expense_accno_id})
+                AND (transdate = '$ref->{transdate}')|,
+                $linetotal * -1);
+
+          } elsif ($linetotal != 0) {
+
+            # allocated >= 0
+            # add entry for inventory, this one is for the sold item
+            $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey) VALUES (?, ?, ?, ?, (SELECT taxkey_id FROM chart WHERE id = ?))|;
+            @values = ($ref->{trans_id},  $ref->{inventory_accno_id}, $linetotal, $ref->{transdate}, $ref->{inventory_accno_id});
+            do_query($form, $dbh, $query, @values);
+
+# add expense
+            $query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, taxkey) VALUES (?, ?, ?, ?, (SELECT taxkey from tax WHERE chart_id = ?))|;
+            @values = ($ref->{trans_id},  $ref->{expense_accno_id}, ($linetotal * -1), $ref->{transdate}, $ref->{expense_accno_id});
+            do_query($form, $dbh, $query, @values);
+          }
+        };
 
         # update allocated for sold item
         $form->update_balance($dbh, "invoice", "allocated", qq|id = $ref->{id}|, $qty * -1);
@@ -265,6 +289,8 @@ sub post_invoice {
       $sth->finish();
 
     } else {                    # if ($form->{"inventory_accno_id_$i"})
+      # part doesn't have an inventory_accno_id
+      # lastcost of the part is updated at the end
 
       $linetotal = $form->round_amount($form->{"sellprice_$i"} * $form->{"qty_$i"} / $price_factor, 2);
 
index 261b342..165ae1a 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -1256,18 +1256,45 @@ sub cogs {
   my $allocated = 0;
   my $qty;
 
+# all invoice entries of an example part:
+
+# id | trans_id | base_qty | allocated | sellprice | inventory_accno | income_accno | expense_accno 
+# ---+----------+----------+-----------+-----------+-----------------+--------------+---------------
+#  4 |        4 |       -5 |         5 |  20.00000 | 1140            | 4400         | 5400     bought 5 for 20
+#  5 |        5 |        4 |        -4 |  50.00000 | 1140            | 4400         | 5400     sold   4 for 50
+#  6 |        6 |        1 |        -1 |  50.00000 | 1140            | 4400         | 5400     sold   1 for 50
+#  7 |        7 |       -5 |         1 |  20.00000 | 1140            | 4400         | 5400     bought 5 for 20
+#  8 |        8 |        1 |        -1 |  50.00000 | 1140            | 4400         | 5400     sold   1 for 50
+
+# AND ((i.base_qty + i.allocated) < 0) filters out all but line with id=7, elsewhere i.base_qty + i.allocated has already reached 0
+# and all parts have been allocated
+
+# so transaction 8 only sees transaction 7 with unallocated parts and adjusts allocated for that transaction, before allocated was 0
+#  7 |        7 |       -5 |         1 |  20.00000 | 1140            | 4400         | 5400     bought 5 for 20
+
+# in this example there are still 4 unsold articles
+
+
+  # search all invoice entries for the part in question, adjusting "allocated"
+  # until the total number of sold parts has been reached
+
+  # ORDER BY trans_id ensures FIFO
+
+
   while (my $ref = $sth->fetchrow_hashref('NAME_lc')) {
     if (($qty = (($ref->{base_qty} * -1) - $ref->{allocated})) > $totalqty) {
       $qty = $totalqty;
     }
 
+    # update allocated in invoice
     $form->update_balance($dbh, "invoice", "allocated", qq|id = $ref->{id}|, $qty);
 
     # total expenses and inventory
     # sellprice is the cost of the item
     my $linetotal = $form->round_amount(($ref->{sellprice} * $qty) / ( ($ref->{price_factor} || 1) * ( $basefactor || 1 )), 2);
 
-    if (!$::lx_office_conf{system}->{eur}) {
+    if ( $::instance_conf->get_inventory_system eq 'perpetual' ) {
+      # Bestandsmethode: when selling parts, deduct their purchase value from the inventory account
       $ref->{expense_accno} = ($form->{"expense_accno_$row"}) ? $form->{"expense_accno_$row"} : $ref->{expense_accno};
       # add to expense
       $form->{amount_cogs}{ $form->{id} }{ $ref->{expense_accno} } += -$linetotal;
index b8dbee6..47cdd0e 100644 (file)
@@ -34,6 +34,21 @@ sub get_currencies {
   return $self->{currencies} ? @{ $self->{currencies} } : ();
 }
 
+sub get_accounting_method {
+  my ($self) = @_;
+  return $self->{data}->{accounting_method};
+}
+
+sub get_inventory_system {
+  my ($self) = @_;
+  return $self->{data}->{inventory_system};
+}
+
+sub get_profit_determination {
+  my ($self) = @_;
+  return $self->{data}->{profit_determination};
+}
+
 1;
 
 __END__
@@ -74,6 +89,18 @@ Returns an array of configured currencies.
 Returns the default currency or undef if no currency has been
 configured.
 
+=item C<get_accounting_method>
+
+Returns the default accounting method, accrual or cash
+
+=item C<get_inventory_system>
+
+Returns the default inventory system, perpetual or periodic
+
+=item C<get_profit_determination>
+
+Returns the default profit determination method, balance or income
+
 =back
 
 =head1 BUGS
index d638220..75e7a38 100644 (file)
@@ -404,6 +404,12 @@ sub dbcreate {
 
   $query = "UPDATE defaults SET coa = ?";
   do_query($form, $dbh, $query, $form->{chart});
+  $query = "UPDATE defaults SET accounting_method = ?";
+  do_query($form, $dbh, $query, $form->{accounting_method});
+  $query = "UPDATE defaults SET profit_determination = ?";
+  do_query($form, $dbh, $query, $form->{profit_determination});
+  $query = "UPDATE defaults SET inventory_system = ?";
+  do_query($form, $dbh, $query, $form->{inventory_system});
 
   $dbh->disconnect;
 
index 4be5e33..08b97c4 100755 (executable)
@@ -774,6 +774,24 @@ sub create_dataset {
   }
   closedir SQLDIR;
 
+  $form->{ACCOUNTING_METHODS} = [];
+  foreach my $item ( qw(accrual cash) ) {
+    push @{ $form->{ACCOUNTING_METHODS} }, { "name"     => $item,
+                                 "selected" => $item eq "cash" };
+  };
+
+  $form->{INVENTORY_SYSTEMS} = [];
+  foreach my $item ( qw(perpetual periodic) ) {
+    push @{ $form->{INVENTORY_SYSTEMS} }, { "name"     => $item,
+                                 "selected" => $item eq "periodic" };
+  };
+
+  $form->{PROFIT_DETERMINATIONS} = [];
+  foreach my $item ( qw(balance income) ) {
+    push @{ $form->{PROFIT_DETERMINATIONS} }, { "name"     => $item,
+                                 "selected" => $item eq "income" };
+  };
+
   my $default_charset = $::lx_office_conf{system}->{dbcharset};
   $default_charset ||= Common::DEFAULT_CHARSET;
 
index 19bb23a..9abf798 100644 (file)
@@ -46,8 +46,6 @@ use SL::Printer;
 use CGI::Ajax;
 use CGI;
 
-use Data::Dumper;
-
 require "bin/mozilla/common.pl";
 
 use strict;
@@ -1392,17 +1390,18 @@ sub buchungsgruppe_header {
   }
 
   my $linkaccounts;
-  if (!$::lx_office_conf{system}->{eur}) {
+  if ( $::instance_conf->get_inventory_system eq 'perpetual' ) { # was !$::lx_office_conf{system}->{eur}) {
     $linkaccounts = qq|
                <tr>
                 <th align=right>| . $locale->text('Inventory') . qq|</th>
                 <td><select name=inventory_accno_id>$form->{selectIC}</select></td>
                 <input name=selectIC type=hidden value="$form->{selectIC}">
               </tr>|;
-  } else {
+  } elsif ( $::instance_conf->get_inventory_system eq 'periodic' ) {
+    # don't allow choice of inventory accno and don't show that line
     $linkaccounts = qq|
                 <input type=hidden name=inventory_accno_id value=$form->{inventory_accno_id}>|;
-  }
+  };
 
 
   $linkaccounts .= qq|
@@ -1550,6 +1549,8 @@ sub edit_defaults {
 
   map { $form->{"defaults_${_}"} = $form->{defaults}->{$_} } keys %{ $form->{defaults} };
 
+# EÜR = cash, Bilanzierung = accrual 
+
   foreach my $key (keys %{ $form->{IC} }) {
     foreach my $accno (sort keys %{ $form->{IC}->{$key} }) {
       my $array = "ACCNOS_" . uc($key);
index ecce874..27070bb 100644 (file)
@@ -84,7 +84,8 @@ sub chart_of_accounts {
 
   $form->{title} = $locale->text('Chart of Accounts');
 
-  if ($::lx_office_conf{system}->{eur}) {
+  if ( $::instance_conf->get_accounting_method eq 'cash' ) {
+    # $form->{method} can probably be made redundant now that we have get_accounting_method
     $form->{method} = "cash";
   }
 
@@ -177,8 +178,8 @@ sub list {
           <td colspan=3><select name=department>$form->{selectdepartment}</select></td>
         </tr>
 | if $form->{selectdepartment};
-  my $accrual = $::lx_office_conf{system}->{eur} ? ""        : "checked";
-  my $cash    = $::lx_office_conf{system}->{eur} ? "checked" : "";
+  my $accrual =  $::instance_conf->get_accounting_method eq 'cash' ? ""        : "checked";
+  my $cash    =  $::instance_conf->get_accounting_method eq 'cash' ? "checked" : "";
 
   my $name_1    = "fromdate";
   my $id_1      = "fromdate";
@@ -246,7 +247,7 @@ sub list {
 
   $form->{description} =~ s/\"/&quot;/g;
 
-  my $eur = $::lx_office_conf{system}->{eur};
+  my $eur =  $::instance_conf->get_accounting_method eq 'cash' ? 1 : 0;
 
   print qq|
 <body onLoad="$onload">
index 28bc105..20a9206 100644 (file)
@@ -1528,7 +1528,9 @@ sub form_header {
 
   $auth->assert('part_service_assembly_edit');
 
-  $form->{eur}              = $::lx_office_conf{system}->{eur}; # config dumps into namespace - yuck
+  # what does eur set here? why is it in namespace?
+  # call of get_accounting_method preserves format of $form->{eur}, which expects 1 or 0
+  $form->{eur}              = $::instance_conf->get_accounting_method eq 'cash' ? 1 : 0; # config dumps into namespace - yuck
   $form->{pg_keys}          = sub { "$_[0]->{partsgroup}--$_[0]->{id}" };
   $form->{description_area} = ($form->{rows} = $form->numtextrows($form->{description}, 40)) > 1;
   $form->{notes_rows}       =  max 4, $form->numtextrows($form->{notes}, 40), $form->numtextrows($form->{formel}, 40);
index 1d84469..8d0ec94 100644 (file)
@@ -146,8 +146,8 @@ sub report {
 
   $form->{title} = $locale->text($title{ $form->{report} });
 
-  my $accrual = $::lx_office_conf{system}->{eur} ? ""        : "checked";
-  my $cash    = $::lx_office_conf{system}->{eur} ? "checked" : "";
+  my $accrual =  $::instance_conf->get_accounting_method eq 'cash' ? ""        : "checked";
+  my $cash    =  $::instance_conf->get_accounting_method eq 'cash' ? "checked" : "";
 
   my $year = (localtime)[5] + 1900;
 
index 0b8d98a..43812ee 100644 (file)
@@ -2,6 +2,10 @@
 # Veränderungen von Lx-Office ERP #
 ###################################
 
+- Umstellung der Variablen eur in lx_office.conf zu drei neuen Variablen in
+  Tabelle defaults, zur Einstellung von Gewinnermittlungsart, Versteuerungsart
+  und Warenbuchungsmethode. Siehe Datei doc/umstellung_eur.txt
+
 2011-06-15 - Release 2.6.3
 
   Größere neue Features:
diff --git a/doc/umstellung_eur.txt b/doc/umstellung_eur.txt
new file mode 100644 (file)
index 0000000..5df9003
--- /dev/null
@@ -0,0 +1,49 @@
+Anstelle des Parameters eur in lx_office.conf werden drei neue Parameter
+eingeführt, die in defaults bereitgehalten werden, und damit mandantenabhängig
+konfiguriert werden können.
+
+Die drei Parameter regeln Gewinnermittlungsart, Versteuerungsart und
+Warenbuchungsmethode:
+
+profit_determination (Gewinnermittlung)
+* balance (Betriebsvermögensvergleich/Bilanzierung)
+* income (Einnahmen-Überschuß-Rechnung)
+
+accounting_method (Versteuerungsart)
+* accrual (Sollversteuerung)
+* cash (Istversteuerung)
+
+inventory_system (Warenbuchungsmethode)
+* perpetual (Bestandsmethode)
+* periodic (Aufwandsmethode)
+
+Beim Anlegen eines neuen Mandanten können diese Optionen nun unabhängig
+voneinander eingestellt werden.
+
+Beim Upgrade bestehender Mandanten wird eur ausgelesen und die Variablen werden
+so gesetzt, daß sich an der Funktionalität nichts ändert.
+
+Bisher galt:
+eur = 1: cash + periodic + income
+eur = 0: accrual + perpetual + balance
+
+Die aktuelle Konfiguration wird unter Nummernkreise und Standardkonten unter
+dem neuen Punkt "Einstellungen" angezeigt (read-only).
+
+Für die Umstellung eines bestehenden Mandanten gibt es an der Oberfläche
+derzeit keine Möglichkeit (gab es aber vorher auch nicht).
+
+Die Konfiguration "eur" unter [system] in lx_office.conf wird nun nicht mehr
+benötigt und kann aus der Konfigurationsdatei gelöscht werden (dies muß manuell
+geschehen).
+
+TODO:
+
+* bei bestimmten Berichten kann man derzeit noch inviduell einstellen, ob man
+  nach Ist- oder Sollversteuerung auswertet, und es werden im Code Variablen
+  wie $accrual oder $cash gesetzt. Diese Codestellen wurden noch nicht
+  angefasst, sondern nur die wo bisher $::lx_office_conf{system}->{eur}
+  ausgewertet wurde.
+
+* Hilfetext beim Neuanlegen eines Mandanten, was die Optionen bedeuten, z.B.
+  mit zwei Standardfällen
index 37e8bfa..6a2dbec 100644 (file)
@@ -95,6 +95,7 @@ $self->{texts} = {
   'Account saved!'              => 'Konto gespeichert!',
   'Accounting Group deleted!'   => 'Buchungsgruppe gel&ouml;scht!',
   'Accounting Group saved!'     => 'Buchungsgruppe gespeichert!',
+  'Accounting method'           => 'Versteuerungsart',
   'Accrual'                     => 'Bilanzierung',
   'Active'                      => 'Aktiv',
   'Active?'                     => 'Aktiviert?',
@@ -401,6 +402,7 @@ $self->{texts} = {
   'Company'                     => 'Firma',
   'Company Name'                => 'Firmenname',
   'Compare to'                  => 'Gegenüberstellen zu',
+  'Configuration'               => 'Einstellungen',
   'Configuration of individual TODO items' => 'Konfiguration f&uuml;r die einzelnen Aufgabenlistenpunkte',
   'Configure'                   => 'Konfigurieren',
   'Confirm'                     => 'Best&auml;tigen',
@@ -651,6 +653,7 @@ $self->{texts} = {
   'EAN-Code'                    => 'EAN-Code',
   'EB-Wert'                     => 'EB-Wert',
   'EK'                          => 'EK',
+  'EK-Preis'                    => '',
   'ELSE'                        => 'Zusatz',
   'ELSTER Export (Taxbird)'     => 'ELSTER-Export nach Taxbird',
   'ELSTER Export (Winston)'     => 'ELSTER Export nach Winston',
@@ -921,6 +924,7 @@ $self->{texts} = {
   'Include in Report'           => 'In Bericht aufnehmen',
   'Include in drop-down menus'  => 'In Aufklappmenü aufnehmen',
   'Includeable in reports'      => 'In Berichten anzeigbar',
+  'income'                      => 'Einnahmen-/Überschussrechnung',
   'Income Statement'            => 'GuV',
   'Income accno'                => 'Erl&ouml;skonto',
   'Incoming Payments'           => 'Zahlungseingänge',
@@ -949,6 +953,7 @@ $self->{texts} = {
   'Inventory Account'           => 'Warenbestand',
   'Inventory quantity must be zero before you can set this assembly obsolete!' => 'Bevor dieses Erzeugnis als ungültig markiert werden kann, muß das Inventar auf Null sein!',
   'Inventory quantity must be zero before you can set this part obsolete!' => 'Bevor diese Ware als ungültig markiert werden kann, muß das Inventar Null sein!',
+  'Inventory system'            => 'Warenbuchungsmethode',
   'Invno.'                      => 'Rg. Nr.',
   'Invnumber'                   => 'Rechnungsnummer',
   'Invnumber missing!'          => 'Rechnungsnummer fehlt!',
@@ -1266,6 +1271,9 @@ $self->{texts} = {
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
   'PRINTED'                     => 'Gedruckt',
+  'Packing List'                => '',
+  'Packing List Date missing!'  => '',
+  'Packing List Number missing!' => '',
   'Packing Lists'               => 'Lieferschein',
   'Page #1/#2'                  => 'Seite #1/#2',
   'Paid'                        => 'bezahlt',
@@ -1302,10 +1310,12 @@ $self->{texts} = {
   'Per. Inv.'                   => 'Wied. Rech.',
   'Period'                      => 'Zeitraum',
   'Period:'                     => 'Zeitraum:',
+  'periodic'                    => 'Aufwandsmethode',
   'Periodic Invoices'           => 'Wiederkehrende Rechnungen',
   'Periodic invoices active'    => 'Wiederkehrende Rechnungen aktiv',
   'Periodic invoices inactive'  => 'Wiederkehrende Rechnungen inaktiv',
   'Periodicity'                 => 'Periodizität',
+  'perpetual'                   => 'Bestandsmethode',
   'Personal settings'           => 'Pers&ouml;nliche Einstellungen',
   'Pg Database Administration'  => 'Datenbankadministration',
   'Phone'                       => 'Telefon',
@@ -1391,6 +1401,7 @@ $self->{texts} = {
   'Produce Assembly'            => 'Erzeugnis fertigen',
   'Productivity'                => 'Produktivität',
   'Profit Center'               => 'Erfolgsbereich',
+  'Profit determination'        => 'Gewinnermittlung',
   'Proforma Invoice'            => 'Proformarechnung',
   'Program'                     => 'Programm',
   'Project'                     => 'Projekt',
@@ -1644,6 +1655,7 @@ $self->{texts} = {
   'Storno'                      => 'Storno',
   'Storno (one letter abbreviation)' => 'S',
   'Storno Invoice'              => 'Stornorechnung',
+  'Storno Packing List'         => '',
   'Street'                      => 'Straße',
   'Stylesheet'                  => 'Stilvorlage',
   'Subject'                     => 'Betreff',
@@ -2112,7 +2124,7 @@ $self->{texts} = {
   '[email]'                     => '[email]',
   'absolute'                    => 'absolut',
   'account_description'         => 'Beschreibung',
-  'accrual'                     => 'Bilanzierung (Soll-Versteuerung)',
+  'accrual'                     => 'Soll-Versteuerung',
   'action= not defined!'        => 'action= nicht definiert!',
   'active'                      => 'aktiv',
   'all entries'                 => 'alle Einträge',
@@ -2121,6 +2133,7 @@ $self->{texts} = {
   'as at'                       => 'zum Stand',
   'assembly_list'               => 'erzeugnisliste',
   'back'                        => 'zurück',
+  'balance'                     => 'Betriebsvermögensvergleich',
   'bank_collection_payment_list_#1' => 'bankeinzugszahlungsliste_#1',
   'bank_transfer_payment_list_#1' => 'ueberweisungszahlungsliste_#1',
   'bankaccounts'                => 'Bankkonten',
@@ -2129,7 +2142,7 @@ $self->{texts} = {
   'bin_list'                    => 'Lagerliste',
   'bis'                         => 'bis',
   'button'                      => '?',
-  'cash'                        => 'E/Ü-Rechnung (Ist-Versteuerung)',
+  'cash'                        => 'Ist-Versteuerung',
   'chargenumber #1'             => 'Chargennummer #1',
   'chart_of_accounts'           => 'kontenuebersicht',
   'choice'                      => 'auswählen',
index 0253d49..0e1a4a0 100644 (file)
@@ -105,6 +105,7 @@ $self->{texts} = {
   'Account saved!'              => '',
   'Accounting Group deleted!'   => '',
   'Accounting Group saved!'     => '',
+  'Accounting method'           => '',
   'Accrual'                     => '',
   'Active'                      => '',
   'Active?'                     => '',
@@ -388,6 +389,7 @@ $self->{texts} = {
   'Company'                     => '',
   'Company Name'                => '',
   'Compare to'                  => '',
+  'Configuration'               => '',
   'Configuration of individual TODO items' => '',
   'Configure'                   => '',
   'Confirm'                     => '',
@@ -857,6 +859,7 @@ $self->{texts} = {
   'Include in Report'           => '',
   'Include in drop-down menus'  => '',
   'Includeable in reports'      => '',
+  'income'                      => 'Income statement',
   'Income Statement'            => '',
   'Income accno'                => '',
   'Incoming Payments'           => '',
@@ -883,6 +886,7 @@ $self->{texts} = {
   'Inventory Account'           => '',
   'Inventory quantity must be zero before you can set this assembly obsolete!' => '',
   'Inventory quantity must be zero before you can set this part obsolete!' => '',
+  'Inventory system'            => '',
   'Invno.'                      => '',
   'Invnumber'                   => '',
   'Invnumber missing!'          => '',
@@ -1212,10 +1216,12 @@ $self->{texts} = {
   'Per. Inv.'                   => '',
   'Period'                      => '',
   'Period:'                     => '',
+  'periodic'                   => '',
   'Periodic Invoices'           => '',
   'Periodic invoices active'    => '',
   'Periodic invoices inactive'  => '',
   'Periodicity'                 => '',
+  'perpetual:'                  => '',
   'Personal settings'           => '',
   'Pg Database Administration'  => '',
   'Phone'                       => '',
@@ -1299,6 +1305,7 @@ $self->{texts} = {
   'Produce Assembly'            => '',
   'Productivity'                => '',
   'Profit Center'               => '',
+  'Profit determination'        => '',
   'Proforma Invoice'            => '',
   'Program'                     => '',
   'Project'                     => '',
@@ -1980,6 +1987,7 @@ $self->{texts} = {
   'bankaccounts'                => '',
   'banktransfers'               => '',
   'bestbefore #1'               => '',
+  'balance'                     => '',
   'bin_list'                    => '',
   'bis'                         => '',
   'button'                      => '',
diff --git a/sql/Pg-upgrade2/umstellung_eur.pl b/sql/Pg-upgrade2/umstellung_eur.pl
new file mode 100644 (file)
index 0000000..560bf64
--- /dev/null
@@ -0,0 +1,75 @@
+# @tag: umstellung_eur
+# @description: Variable eur umstellen: bitte doc/umstellung_eur.txt lesen
+# @depends: units_id
+# @charset: utf-8
+
+# this script relies on $eur still being set in lx_office.conf, and the
+# variable available in $::lx_office_conf{system}->{eur}
+# better @depends would be release_2_6_3
+
+use utf8;
+#use strict;
+use Data::Dumper;
+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 {
+
+  # check if accounting_method has already been set (new database), if so return
+  # only set variables according to eur for update of existing database
+
+
+  foreach my $column (qw(accounting_method inventory_system profit_determination)) {
+    # this query will fail if columns already exist (new database)
+    do_query(qq|ALTER TABLE defaults ADD COLUMN ${column} TEXT|, 1);
+  }
+
+  my $accounting_method;
+  my $inventory_system;
+  my $profit_determination;
+
+  # check current configuration and set default variables accordingly, so that
+  # Lx-Office behaviour isn't changed by this update
+
+  if ($::lx_office_conf{system}->{eur} == 0 ) {
+    $accounting_method = 'accrual';
+    $inventory_system = 'perpetual';
+    $profit_determination = 'balance';
+  } elsif ( $::lx_office_conf{system}->{eur} == 1 ) {
+    $accounting_method = 'cash';
+    $inventory_system = 'periodic';
+    $profit_determination = 'income';
+  } else {
+    die "illegal configuration of eur, must be 0 or 1, not " . $::lx_office_conf{system}->{eur} . "\n";
+    # or maybe just return 1, dont do anything, because we assume everything is
+    # already set, or has maybe already been deleted
+  };
+
+  # only set parameters if they haven't already been set (this in only the case
+  # when upgrading)
+
+  my $update_eur = "UPDATE defaults set accounting_method = '$accounting_method' where accounting_method is null;" . 
+                   "UPDATE defaults set inventory_system = '$inventory_system' where inventory_system is null; " .
+                   "UPDATE defaults set profit_determination = '$profit_determination' where profit_determination is null;";
+  do_query($update_eur);
+
+  return 1;
+}
+
+return do_update();
+
index 3cffed0..fcb157c 100644 (file)
@@ -177,7 +177,10 @@ CREATE TABLE "defaults" (
     itime timestamp without time zone DEFAULT now(),
     mtime timestamp without time zone,
     rmanumber text,
-    cnnumber text
+    cnnumber text,
+    accounting_method text,
+    inventory_system text,
+    profit_determination text
 );
 
 
index 0cfe3b9..35f2a31 100644 (file)
      </td>
     </tr>
 
+    <tr>
+     <th valign="top" align="right" nowrap>[% 'Accounting method' | $T8 %]</th>
+     <td>
+      <select name="accounting_method">
+       [% FOREACH row = ACCOUNTING_METHODS %]<option value=[% HTML.escape(row.name) %] [% IF row.selected %]selected[% END %]>[% HTML.escape(row.name) | $T8 %]</option>[% END %]
+      </select>
+     </td>
+    </tr>
+    <tr>
+     <th valign="top" align="right" nowrap>[% 'Inventory system' | $T8 %]</th>
+     <td>
+      <select name="inventory_system">
+       [% FOREACH row = INVENTORY_SYSTEMS %]<option value=[% HTML.escape(row.name) %] [% IF row.selected %]selected[% END %]>[% HTML.escape(row.name) | $T8 %]</option>[% END %]
+      </select>
+     </td>
+    </tr>
+
+    <tr>
+     <th valign="top" align="right" nowrap>[% 'Profit determination' | $T8 %]</th>
+     <td>
+      <select name="profit_determination">
+       [% FOREACH row = PROFIT_DETERMINATIONS %]<option value=[% HTML.escape(row.name) %] [% IF row.selected %]selected[% END %]>[% HTML.escape(row.name) | $T8 %]</option>[% END %]
+      </select>
+     </td>
+    </tr>
+
    </table>
 
    <input type="hidden" name="dbdriver"  value="[% HTML.escape(dbdriver) %]">
index d346b89..8829ba6 100644 (file)
       </td>
     </tr>
 
+    <tr class="listheading">
+     <th colspan="4">[% 'Configuration' | $T8 %]</th>
+    </tr>
+
+    <tr>
+     <th align="right">[% 'Accounting method' | $T8 %] </th>
+     <td colspan="3"><input name="accounting_method" size="20" readonly="readonly" value="[% HTML.escape(defaults_accounting_method) | $T8 %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right">[% 'Inventory system' | $T8 %] </th>
+     <td colspan="3"><input name="inventory_system" size="20" readonly="readonly" value="[% HTML.escape(defaults_inventory_system) | $T8 %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right">[% 'Profit determination' | $T8 %] </th>
+     <td colspan="3"><input name="profit_determination" size="20" readonly="readonly" value="[% HTML.escape(defaults_profit_determination) | $T8 %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right">[% 'Chart of accounts' | $T8 %] </th>
+     <td colspan="3"><input name="coa" size="20" readonly="readonly" value="[% HTML.escape(defaults_coa) | $T8 %]"></td>
+    </tr>
+
+
    </table>
   </p>