Merge fix
authorSven Donath <lxo@dexo.de>
Thu, 23 Sep 2010 21:46:51 +0000 (23:46 +0200)
committerSven Donath <lxo@dexo.de>
Thu, 23 Sep 2010 21:46:51 +0000 (23:46 +0200)
220 files changed:
DEBIAN/DEBIAN/control
DEBIAN/files/lx-office-erp.apache2.conf
SL/CVar.pm
SL/DB.pm [new file with mode: 0644]
SL/DB/AccTrans.pm [new file with mode: 0644]
SL/DB/AccTransaction.pm [new file with mode: 0644]
SL/DB/Assembly.pm [new file with mode: 0644]
SL/DB/AuditTrail.pm [new file with mode: 0644]
SL/DB/BankAccount.pm [new file with mode: 0644]
SL/DB/Bin.pm [new file with mode: 0644]
SL/DB/Buchungsgruppe.pm [new file with mode: 0644]
SL/DB/Business.pm [new file with mode: 0644]
SL/DB/Chart.pm [new file with mode: 0644]
SL/DB/Contact.pm [new file with mode: 0644]
SL/DB/CustomVariable.pm [new file with mode: 0644]
SL/DB/CustomVariableConfig.pm [new file with mode: 0644]
SL/DB/CustomVariableValidity.pm [new file with mode: 0644]
SL/DB/Customer.pm [new file with mode: 0644]
SL/DB/CustomerTax.pm [new file with mode: 0644]
SL/DB/Datev.pm [new file with mode: 0644]
SL/DB/Default.pm [new file with mode: 0644]
SL/DB/DeliveryOrder.pm [new file with mode: 0644]
SL/DB/DeliveryOrderItem.pm [new file with mode: 0644]
SL/DB/DeliveryOrderItemsStock.pm [new file with mode: 0644]
SL/DB/Department.pm [new file with mode: 0644]
SL/DB/DptTrans.pm [new file with mode: 0644]
SL/DB/Draft.pm [new file with mode: 0644]
SL/DB/Dunning.pm [new file with mode: 0644]
SL/DB/DunningConfig.pm [new file with mode: 0644]
SL/DB/Employee.pm [new file with mode: 0644]
SL/DB/Exchangerate.pm [new file with mode: 0644]
SL/DB/Finanzamt.pm [new file with mode: 0644]
SL/DB/FollowUp.pm [new file with mode: 0644]
SL/DB/FollowUpAccess.pm [new file with mode: 0644]
SL/DB/FollowUpLink.pm [new file with mode: 0644]
SL/DB/GLTransaction.pm [new file with mode: 0644]
SL/DB/GenericTranslation.pm [new file with mode: 0644]
SL/DB/Gifi.pm [new file with mode: 0644]
SL/DB/Helpers/ALL.pm [new file with mode: 0644]
SL/DB/Helpers/Attr.pm [new file with mode: 0644]
SL/DB/Helpers/ConventionManager.pm [new file with mode: 0644]
SL/DB/Helpers/Manager.pm [new file with mode: 0644]
SL/DB/Helpers/Mappings.pm [new file with mode: 0644]
SL/DB/Helpers/Metadata.pm [new file with mode: 0644]
SL/DB/History.pm [new file with mode: 0644]
SL/DB/Inventory.pm [new file with mode: 0644]
SL/DB/Invoice.pm [new file with mode: 0644]
SL/DB/InvoiceItem.pm [new file with mode: 0644]
SL/DB/Language.pm [new file with mode: 0644]
SL/DB/License.pm [new file with mode: 0644]
SL/DB/LicenseInvoice.pm [new file with mode: 0644]
SL/DB/MakeModel.pm [new file with mode: 0644]
SL/DB/Manager/DeliveryOrder.pm [new file with mode: 0644]
SL/DB/Manager/Invoice.pm [new file with mode: 0644]
SL/DB/Manager/Order.pm [new file with mode: 0644]
SL/DB/Manager/Part.pm [new file with mode: 0644]
SL/DB/Manager/PurchaseInvoice.pm [new file with mode: 0644]
SL/DB/Manager/TransferType.pm [new file with mode: 0644]
SL/DB/MetaSetup/AccTrans.pm [new file with mode: 0644]
SL/DB/MetaSetup/AccTransaction.pm [new file with mode: 0644]
SL/DB/MetaSetup/Assembly.pm [new file with mode: 0644]
SL/DB/MetaSetup/AuditTrail.pm [new file with mode: 0644]
SL/DB/MetaSetup/BankAccount.pm [new file with mode: 0644]
SL/DB/MetaSetup/Bin.pm [new file with mode: 0644]
SL/DB/MetaSetup/Buchungsgruppe.pm [new file with mode: 0644]
SL/DB/MetaSetup/Business.pm [new file with mode: 0644]
SL/DB/MetaSetup/Chart.pm [new file with mode: 0644]
SL/DB/MetaSetup/Contact.pm [new file with mode: 0644]
SL/DB/MetaSetup/CustomVariable.pm [new file with mode: 0644]
SL/DB/MetaSetup/CustomVariableConfig.pm [new file with mode: 0644]
SL/DB/MetaSetup/CustomVariableValidity.pm [new file with mode: 0644]
SL/DB/MetaSetup/Customer.pm [new file with mode: 0644]
SL/DB/MetaSetup/CustomerTax.pm [new file with mode: 0644]
SL/DB/MetaSetup/Datev.pm [new file with mode: 0644]
SL/DB/MetaSetup/Default.pm [new file with mode: 0644]
SL/DB/MetaSetup/DeliveryOrder.pm [new file with mode: 0644]
SL/DB/MetaSetup/DeliveryOrderItem.pm [new file with mode: 0644]
SL/DB/MetaSetup/DeliveryOrderItemsStock.pm [new file with mode: 0644]
SL/DB/MetaSetup/Department.pm [new file with mode: 0644]
SL/DB/MetaSetup/DptTrans.pm [new file with mode: 0644]
SL/DB/MetaSetup/Draft.pm [new file with mode: 0644]
SL/DB/MetaSetup/Dunning.pm [new file with mode: 0644]
SL/DB/MetaSetup/DunningConfig.pm [new file with mode: 0644]
SL/DB/MetaSetup/Employee.pm [new file with mode: 0644]
SL/DB/MetaSetup/Exchangerate.pm [new file with mode: 0644]
SL/DB/MetaSetup/Finanzamt.pm [new file with mode: 0644]
SL/DB/MetaSetup/FollowUp.pm [new file with mode: 0644]
SL/DB/MetaSetup/FollowUpAccess.pm [new file with mode: 0644]
SL/DB/MetaSetup/FollowUpLink.pm [new file with mode: 0644]
SL/DB/MetaSetup/GLTransaction.pm [new file with mode: 0644]
SL/DB/MetaSetup/GenericTranslation.pm [new file with mode: 0644]
SL/DB/MetaSetup/Gifi.pm [new file with mode: 0644]
SL/DB/MetaSetup/History.pm [new file with mode: 0644]
SL/DB/MetaSetup/Inventory.pm [new file with mode: 0644]
SL/DB/MetaSetup/Invoice.pm [new file with mode: 0644]
SL/DB/MetaSetup/InvoiceItem.pm [new file with mode: 0644]
SL/DB/MetaSetup/Language.pm [new file with mode: 0644]
SL/DB/MetaSetup/Licemse.pm [new file with mode: 0644]
SL/DB/MetaSetup/License.pm [new file with mode: 0644]
SL/DB/MetaSetup/LicenseInvoice.pm [new file with mode: 0644]
SL/DB/MetaSetup/MakeModel.pm [new file with mode: 0644]
SL/DB/MetaSetup/Note.pm [new file with mode: 0644]
SL/DB/MetaSetup/Order.pm [new file with mode: 0644]
SL/DB/MetaSetup/OrderItem.pm [new file with mode: 0644]
SL/DB/MetaSetup/Part.pm [new file with mode: 0644]
SL/DB/MetaSetup/PartsGroup.pm [new file with mode: 0644]
SL/DB/MetaSetup/PartsTax.pm [new file with mode: 0644]
SL/DB/MetaSetup/PaymentTerm.pm [new file with mode: 0644]
SL/DB/MetaSetup/PriceFactor.pm [new file with mode: 0644]
SL/DB/MetaSetup/Pricegroup.pm [new file with mode: 0644]
SL/DB/MetaSetup/Prices.pm [new file with mode: 0644]
SL/DB/MetaSetup/Printer.pm [new file with mode: 0644]
SL/DB/MetaSetup/Project.pm [new file with mode: 0644]
SL/DB/MetaSetup/PurchaseInvoice.pm [new file with mode: 0644]
SL/DB/MetaSetup/RMA.pm [new file with mode: 0644]
SL/DB/MetaSetup/RMAItem.pm [new file with mode: 0644]
SL/DB/MetaSetup/RecordLink.pm [new file with mode: 0644]
SL/DB/MetaSetup/SchemaInfo.pm [new file with mode: 0644]
SL/DB/MetaSetup/SepaExport.pm [new file with mode: 0644]
SL/DB/MetaSetup/SepaExportItem.pm [new file with mode: 0644]
SL/DB/MetaSetup/Shipto.pm [new file with mode: 0644]
SL/DB/MetaSetup/Status.pm [new file with mode: 0644]
SL/DB/MetaSetup/Tax.pm [new file with mode: 0644]
SL/DB/MetaSetup/TaxKey.pm [new file with mode: 0644]
SL/DB/MetaSetup/TaxZone.pm [new file with mode: 0644]
SL/DB/MetaSetup/Taxkey.pm [new file with mode: 0644]
SL/DB/MetaSetup/TodoUserConfig.pm [new file with mode: 0644]
SL/DB/MetaSetup/TransferType.pm [new file with mode: 0644]
SL/DB/MetaSetup/Translation.pm [new file with mode: 0644]
SL/DB/MetaSetup/TranslationPaymentTerm.pm [new file with mode: 0644]
SL/DB/MetaSetup/Unit.pm [new file with mode: 0644]
SL/DB/MetaSetup/UnitsLanguage.pm [new file with mode: 0644]
SL/DB/MetaSetup/Vendor.pm [new file with mode: 0644]
SL/DB/MetaSetup/VendorTax.pm [new file with mode: 0644]
SL/DB/MetaSetup/Warehouse.pm [new file with mode: 0644]
SL/DB/Note.pm [new file with mode: 0644]
SL/DB/Object.pm [new file with mode: 0644]
SL/DB/Order.pm [new file with mode: 0644]
SL/DB/OrderItem.pm [new file with mode: 0644]
SL/DB/Part.pm [new file with mode: 0644]
SL/DB/PartsGroup.pm [new file with mode: 0644]
SL/DB/PartsTax.pm [new file with mode: 0644]
SL/DB/PaymentTerm.pm [new file with mode: 0644]
SL/DB/PriceFactor.pm [new file with mode: 0644]
SL/DB/Pricegroup.pm [new file with mode: 0644]
SL/DB/Prices.pm [new file with mode: 0644]
SL/DB/Printer.pm [new file with mode: 0644]
SL/DB/Project.pm [new file with mode: 0644]
SL/DB/PurchaseInvoice.pm [new file with mode: 0644]
SL/DB/RMA.pm [new file with mode: 0644]
SL/DB/RMAItem.pm [new file with mode: 0644]
SL/DB/RecordLink.pm [new file with mode: 0644]
SL/DB/SchemaInfo.pm [new file with mode: 0644]
SL/DB/SepaExport.pm [new file with mode: 0644]
SL/DB/SepaExportItem.pm [new file with mode: 0644]
SL/DB/Shipto.pm [new file with mode: 0644]
SL/DB/Status.pm [new file with mode: 0644]
SL/DB/Tax.pm [new file with mode: 0644]
SL/DB/TaxKey.pm [new file with mode: 0644]
SL/DB/TaxZone.pm [new file with mode: 0644]
SL/DB/TodoUserConfig.pm [new file with mode: 0644]
SL/DB/TransferType.pm [new file with mode: 0644]
SL/DB/Translation.pm [new file with mode: 0644]
SL/DB/TranslationPaymentTerm.pm [new file with mode: 0644]
SL/DB/Unit.pm [new file with mode: 0644]
SL/DB/UnitsLanguage.pm [new file with mode: 0644]
SL/DB/VC.pm [new file with mode: 0644]
SL/DB/Vendor.pm [new file with mode: 0644]
SL/DB/VendorTax.pm [new file with mode: 0644]
SL/DB/Warehouse.pm [new file with mode: 0644]
SL/Dispatcher.pm
SL/FCGIFixes.pm [new file with mode: 0644]
SL/IC.pm
SL/InstallationCheck.pm
SL/Locale.pm
SL/Projects.pm
SL/ReportGenerator.pm
SL/Template/Excel.pm
SL/Template/OpenDocument.pm
SL/Template/Plugin/T8.pm
bin/mozilla/admin.pl
bin/mozilla/common.pl
config/lx-erp.conf
dispatcher.fcgi [new symlink]
dispatcher.fpl
doc/INSTALL.fcgi
doc/sql-upgrade-dateien.txt
image/AP.png [deleted file]
image/AR.png [deleted file]
image/Backup.png [deleted file]
image/Batch Printing.png [deleted file]
image/CRM.png [deleted file]
image/Cash.png [deleted file]
image/Dunning Process.png [deleted file]
image/General Ledger.png [deleted file]
image/Master Data.png [deleted file]
image/Productivity.png [deleted file]
image/Program.png [deleted file]
image/Reports.png [deleted file]
image/System.png [deleted file]
image/Warehouse.png [deleted file]
image/bench_computer.png [deleted file]
image/error.png [deleted file]
image/fade_short.png [deleted file]
image/rechnung_anlegen.png [deleted file]
image/tux.png [deleted file]
image/unterpunkt2.png [deleted file]
locale/fr/all
locale/fr/all.old [new file with mode: 0644]
locale/fr/charset [new file with mode: 0644]
locale/fr/missing [new file with mode: 0644]
modules/override/PDF/Table.pm
scripts/console
scripts/installation_check.pl
scripts/rose_auto_create_model.pl [new file with mode: 0755]
sql/Pg-upgrade2/fix_acc_trans_ap_taxkey_bug.pl
sql/Pg-upgrade2/schema_nomalization_1.sql [new file with mode: 0644]
sql/Pg-upgrade2/schema_normalization_2.sql [new file with mode: 0644]
t/helper/attr.t [new file with mode: 0644]
t/helper/mapping.t [new file with mode: 0644]

index 63516c3..0c3a7b4 100644 (file)
@@ -5,7 +5,7 @@ Section: universe/web
 Priority: optional
 Installed-Size: 0
 Maintainer: Holger Lindemann <hli@lx-system.de>, Adrian Weibel <adrian_weibel@web.de>
-Depends: patch, apache2 | apache | lighttpd, postgresql | postgresql-7.4 | postgresql-8.0  | postgresql-8.1 | postgresql-8.2 | postgresql-8.3 | postgresql-8.4, libdbi-perl, libdbd-pg-perl, libpg-perl, libarchive-zip-perl, libyaml-perl, libtext-csv-perl, libio-stringy-perl, libtemplate-perl, libpdf-api2-perl, libcgi-ajax-perl, liblist-moreutils-perl, libxml-writer-perl, libtext-csv-xs-perl | libtext-csv-perl, liburi-perl, libdatetime-perl, libparent-perl
+Depends: patch, apache2 | apache | lighttpd, postgresql | postgresql-7.4 | postgresql-8.0  | postgresql-8.1 | postgresql-8.2 | postgresql-8.3 | postgresql-8.4, libdbi-perl, libdbd-pg-perl, libpg-perl, libarchive-zip-perl, libyaml-perl, libio-stringy-perl, libtemplate-perl, libpdf-api2-perl, libcgi-ajax-perl, liblist-moreutils-perl, libxml-writer-perl, libtext-csv-xs-perl | libtext-csv-perl, liburi-perl, libdatetime-perl, libtext-iconv-perl, libclass-accessor-perl,libemail-address-perl,libparent-perl
 Suggests: tetex-base, tetex-bin, tetex-extra, xpdf | evince | okular, libfcgi-perl, libapache2-mod-fastcgi
 Homepage: http://www.lx-office.org
 Description: Extended double entry accounting system for the german market.
index 2eea3de..b9a4aaf 100644 (file)
@@ -1,5 +1,6 @@
 AddHandler cgi-script .pl
-Alias /lx-office/ /usr/lib/lx-office-erp/
+Alias /lx-office /usr/lib/lx-office-erp/
+Alias /lx-office-erp /usr/lib/lx-office-erp/
 
 <Directory /usr/lib/lx-office-erp>
   Options ExecCGI Includes FollowSymlinks
index 19f1e5f..7f82a2d 100644 (file)
@@ -337,11 +337,10 @@ sub save_custom_variables {
 
     do_statement($form, $sth, $query, @values);
 
-    unless ($params{always_valid}) {
-      $self->save_custom_variables_validity(trans_id => $params{trans_id}, config_id => $config->{id},
-        validity => ($params{variables}->{"$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid"} ? 1 : 0)
-      );
-    };
+    my $valid_index = "$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid";
+    $self->save_custom_variables_validity(trans_id => $params{trans_id}, config_id => $config->{id},
+      validity => ($params{variables}{$valid_index} || $params{always_valid} ? 1 : 0)
+    );
   }
 
   $sth->finish();
diff --git a/SL/DB.pm b/SL/DB.pm
new file mode 100644 (file)
index 0000000..18f8696
--- /dev/null
+++ b/SL/DB.pm
@@ -0,0 +1,54 @@
+package SL::DB;
+
+use strict;
+
+use Carp;
+use Data::Dumper;
+use English qw(-no_match_vars);
+use Rose::DB;
+
+use base qw(Rose::DB);
+
+__PACKAGE__->use_private_registry;
+
+my (%_db_registered, %_initial_sql_executed);
+
+sub create {
+  my $domain = shift || SL::DB->default_domain;
+  my $type   = shift || SL::DB->default_type;
+
+  if ($type eq 'LXOFFICE') {
+    $domain = 'LXEMPTY' unless %::myconfig && $::myconfig{dbname};
+    $type   = join $SUBSCRIPT_SEPARATOR, map { $::myconfig{$_} } qw(dbdriver dbname dbhost dbport dbuser dbpasswd) if %::myconfig;
+  }
+
+  _register_db($domain, $type);
+
+  my $db = __PACKAGE__->new_or_cached(domain => $domain, type => $type);
+
+  return $db;
+}
+
+sub _register_db {
+  my $domain = shift;
+  my $type   = shift;
+
+  my $idx    = "${domain}::${type}";
+  return if $_db_registered{$idx};
+
+  $_db_registered{$idx} = 1;
+
+  __PACKAGE__->register_db(domain          => $domain,
+                           type            => $type,
+                           driver          => $::myconfig{dbdriver} || 'Pg',
+                           database        => $::myconfig{dbname},
+                           host            => $::myconfig{dbhost},
+                           port            => $::myconfig{dbport} || 5432,
+                           username        => $::myconfig{dbuser},
+                           password        => $::myconfig{dbpasswd},
+                           connect_options => { pg_enable_utf8 => $::locale && $::locale->is_utf8,
+                                              },
+                          );
+}
+
+1;
diff --git a/SL/DB/AccTrans.pm b/SL/DB/AccTrans.pm
new file mode 100644 (file)
index 0000000..e058b8d
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::AccTrans;
+
+use strict;
+
+use SL::DB::MetaSetup::AccTrans;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/AccTransaction.pm b/SL/DB/AccTransaction.pm
new file mode 100644 (file)
index 0000000..0f78717
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::AccTransaction;
+
+use strict;
+
+use SL::DB::MetaSetup::AccTransaction;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Assembly.pm b/SL/DB/Assembly.pm
new file mode 100644 (file)
index 0000000..2bc9c16
--- /dev/null
@@ -0,0 +1,23 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Assembly;
+
+use strict;
+
+use SL::DB::MetaSetup::Assembly;
+
+__PACKAGE__->meta->add_relationships(
+  part => {
+    type         => 'one to one',
+    class        => 'SL::DB::Part',
+    column_map   => { parts_id => 'id' },
+  },
+);
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+__PACKAGE__->meta->initialize;
+
+1;
diff --git a/SL/DB/AuditTrail.pm b/SL/DB/AuditTrail.pm
new file mode 100644 (file)
index 0000000..9c2fbc0
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::AuditTrail;
+
+use strict;
+
+use SL::DB::MetaSetup::AuditTrail;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/BankAccount.pm b/SL/DB/BankAccount.pm
new file mode 100644 (file)
index 0000000..c293c6c
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::BankAccount;
+
+use strict;
+
+use SL::DB::MetaSetup::BankAccount;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Bin.pm b/SL/DB/Bin.pm
new file mode 100644 (file)
index 0000000..d9d29b4
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Bin;
+
+use strict;
+
+use SL::DB::MetaSetup::Bin;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Buchungsgruppe.pm b/SL/DB/Buchungsgruppe.pm
new file mode 100644 (file)
index 0000000..2dffaa5
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Buchungsgruppe;
+
+use strict;
+
+use SL::DB::MetaSetup::Buchungsgruppe;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Business.pm b/SL/DB/Business.pm
new file mode 100644 (file)
index 0000000..badd0b5
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Business;
+
+use strict;
+
+use SL::DB::MetaSetup::Business;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Chart.pm b/SL/DB/Chart.pm
new file mode 100644 (file)
index 0000000..2d865b5
--- /dev/null
@@ -0,0 +1,9 @@
+package SL::DB::Chart;
+
+use strict;
+
+use SL::DB::MetaSetup::Chart;
+
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Contact.pm b/SL/DB/Contact.pm
new file mode 100644 (file)
index 0000000..69d666f
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Contact;
+
+use strict;
+
+use SL::DB::MetaSetup::Contact;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/CustomVariable.pm b/SL/DB/CustomVariable.pm
new file mode 100644 (file)
index 0000000..6410e3f
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::CustomVariable;
+
+use strict;
+
+use SL::DB::MetaSetup::CustomVariable;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/CustomVariableConfig.pm b/SL/DB/CustomVariableConfig.pm
new file mode 100644 (file)
index 0000000..3410a49
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::CustomVariableConfig;
+
+use strict;
+
+use SL::DB::MetaSetup::CustomVariableConfig;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/CustomVariableValidity.pm b/SL/DB/CustomVariableValidity.pm
new file mode 100644 (file)
index 0000000..a96afdb
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::CustomVariableValidity;
+
+use strict;
+
+use SL::DB::MetaSetup::CustomVariableValidity;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Customer.pm b/SL/DB/Customer.pm
new file mode 100644 (file)
index 0000000..fd5f66e
--- /dev/null
@@ -0,0 +1,27 @@
+package SL::DB::Customer;
+
+use strict;
+
+use SL::DB::MetaSetup::Customer;
+
+use SL::DB::VC;
+
+__PACKAGE__->meta->add_relationship(
+  shipto => {
+    type         => 'one to many',
+    class        => 'SL::DB::Shipto',
+    column_map   => { id      => 'trans_id' },
+    manager_args => { sort_by => 'lower(shipto.shiptoname)' },
+    query_args   => [ 'shipto.module' => 'CT' ],
+  },
+  business => {
+    type         => 'one to one',
+    class        => 'SL::DB::Business',
+    column_map   => { business_id => 'id' },
+  },
+);
+
+__PACKAGE__->meta->make_manager_class;
+__PACKAGE__->meta->initialize;
+
+1;
diff --git a/SL/DB/CustomerTax.pm b/SL/DB/CustomerTax.pm
new file mode 100644 (file)
index 0000000..2efc60e
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::CustomerTax;
+
+use strict;
+
+use SL::DB::MetaSetup::CustomerTax;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Datev.pm b/SL/DB/Datev.pm
new file mode 100644 (file)
index 0000000..4d33d58
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Datev;
+
+use strict;
+
+use SL::DB::MetaSetup::Datev;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Default.pm b/SL/DB/Default.pm
new file mode 100644 (file)
index 0000000..497ce35
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Default;
+
+use strict;
+
+use SL::DB::MetaSetup::Default;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/DeliveryOrder.pm b/SL/DB/DeliveryOrder.pm
new file mode 100644 (file)
index 0000000..b5bdcb4
--- /dev/null
@@ -0,0 +1,36 @@
+package SL::DB::DeliveryOrder;
+
+use strict;
+
+use SL::DB::MetaSetup::DeliveryOrder;
+use SL::DB::Manager::DeliveryOrder;
+use SL::DB::Order;
+
+use List::Util qw(first);
+
+__PACKAGE__->meta->add_relationship(orderitems => { type         => 'one to many',
+                                                    class        => 'SL::DB::DeliveryOrderItem',
+                                                    column_map   => { id => 'trans_id' },
+                                                    manager_args => { with_objects => [ 'part' ] }
+                                                  },
+                                   );
+
+__PACKAGE__->meta->initialize;
+
+# methods
+
+sub sales_order {
+  my $self   = shift;
+  my %params = @_;
+
+  my $orders = SL::DB::Manager::Order->get_all(
+    query => [
+      ordnumber => $self->ordnumber,
+      @{ $params{query} || [] },
+    ],
+  );
+
+  return first { $_->is_type('sales_order') } @{ $orders };
+}
+
+1;
diff --git a/SL/DB/DeliveryOrderItem.pm b/SL/DB/DeliveryOrderItem.pm
new file mode 100644 (file)
index 0000000..2f508d3
--- /dev/null
@@ -0,0 +1,16 @@
+package SL::DB::DeliveryOrderItem;
+
+use strict;
+
+use SL::DB::MetaSetup::DeliveryOrderItem;
+
+__PACKAGE__->meta->make_manager_class;
+
+# methods
+
+sub part {
+  # canonial alias for parts.
+  return shift->parts;
+}
+
+1;
diff --git a/SL/DB/DeliveryOrderItemsStock.pm b/SL/DB/DeliveryOrderItemsStock.pm
new file mode 100644 (file)
index 0000000..2b951ef
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::DeliveryOrderItemsStock;
+
+use strict;
+
+use SL::DB::MetaSetup::DeliveryOrderItemsStock;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Department.pm b/SL/DB/Department.pm
new file mode 100644 (file)
index 0000000..ea62791
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Department;
+
+use strict;
+
+use SL::DB::MetaSetup::Department;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/DptTrans.pm b/SL/DB/DptTrans.pm
new file mode 100644 (file)
index 0000000..3712903
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::DptTrans;
+
+use strict;
+
+use SL::DB::MetaSetup::DptTrans;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Draft.pm b/SL/DB/Draft.pm
new file mode 100644 (file)
index 0000000..ea6ebd6
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Draft;
+
+use strict;
+
+use SL::DB::MetaSetup::Draft;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Dunning.pm b/SL/DB/Dunning.pm
new file mode 100644 (file)
index 0000000..80ffd77
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Dunning;
+
+use strict;
+
+use SL::DB::MetaSetup::Dunning;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/DunningConfig.pm b/SL/DB/DunningConfig.pm
new file mode 100644 (file)
index 0000000..059b798
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::DunningConfig;
+
+use strict;
+
+use SL::DB::MetaSetup::DunningConfig;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Employee.pm b/SL/DB/Employee.pm
new file mode 100644 (file)
index 0000000..841696b
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Employee;
+
+use strict;
+
+use SL::DB::MetaSetup::Employee;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Exchangerate.pm b/SL/DB/Exchangerate.pm
new file mode 100644 (file)
index 0000000..cd3eaee
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Exchangerate;
+
+use strict;
+
+use SL::DB::MetaSetup::Exchangerate;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Finanzamt.pm b/SL/DB/Finanzamt.pm
new file mode 100644 (file)
index 0000000..82daba1
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Finanzamt;
+
+use strict;
+
+use SL::DB::MetaSetup::Finanzamt;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/FollowUp.pm b/SL/DB/FollowUp.pm
new file mode 100644 (file)
index 0000000..b50c90f
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::FollowUp;
+
+use strict;
+
+use SL::DB::MetaSetup::FollowUp;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/FollowUpAccess.pm b/SL/DB/FollowUpAccess.pm
new file mode 100644 (file)
index 0000000..581a497
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::FollowUpAccess;
+
+use strict;
+
+use SL::DB::MetaSetup::FollowUpAccess;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/FollowUpLink.pm b/SL/DB/FollowUpLink.pm
new file mode 100644 (file)
index 0000000..6945bfa
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::FollowUpLink;
+
+use strict;
+
+use SL::DB::MetaSetup::FollowUpLink;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/GLTransaction.pm b/SL/DB/GLTransaction.pm
new file mode 100644 (file)
index 0000000..b1550e9
--- /dev/null
@@ -0,0 +1,10 @@
+package SL::DB::GLTransaction;
+
+use strict;
+
+use SL::DB::MetaSetup::GLTransaction;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/GenericTranslation.pm b/SL/DB/GenericTranslation.pm
new file mode 100644 (file)
index 0000000..14b5618
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::GenericTranslation;
+
+use strict;
+
+use SL::DB::MetaSetup::GenericTranslation;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Gifi.pm b/SL/DB/Gifi.pm
new file mode 100644 (file)
index 0000000..9a1c7f5
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Gifi;
+
+use strict;
+
+use SL::DB::MetaSetup::Gifi;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Helpers/ALL.pm b/SL/DB/Helpers/ALL.pm
new file mode 100644 (file)
index 0000000..16184c5
--- /dev/null
@@ -0,0 +1,107 @@
+package SL::DB::Helpers::ALL;
+
+use strict;
+
+use SL::DB::AccTrans;
+use SL::DB::AccTransaction;
+use SL::DB::Assembly;
+use SL::DB::AuditTrail;
+use SL::DB::BankAccount;
+use SL::DB::Bin;
+use SL::DB::Buchungsgruppe;
+use SL::DB::Business;
+use SL::DB::Chart;
+use SL::DB::Contact;
+use SL::DB::CustomVariable;
+use SL::DB::CustomVariableConfig;
+use SL::DB::CustomVariableValidity;
+use SL::DB::Customer;
+use SL::DB::CustomerTax;
+use SL::DB::Datev;
+use SL::DB::Default;
+use SL::DB::DeliveryOrder;
+use SL::DB::DeliveryOrderItem;
+use SL::DB::DeliveryOrderItemsStock;
+use SL::DB::Department;
+use SL::DB::DptTrans;
+use SL::DB::Draft;
+use SL::DB::Dunning;
+use SL::DB::DunningConfig;
+use SL::DB::Employee;
+use SL::DB::Exchangerate;
+use SL::DB::Finanzamt;
+use SL::DB::FollowUp;
+use SL::DB::FollowUpAccess;
+use SL::DB::FollowUpLink;
+use SL::DB::GLTransaction;
+use SL::DB::GenericTranslation;
+use SL::DB::Gifi;
+use SL::DB::History;
+use SL::DB::Inventory;
+use SL::DB::Invoice;
+use SL::DB::InvoiceItem;
+use SL::DB::Language;
+use SL::DB::License;
+use SL::DB::LicenseInvoice;
+use SL::DB::MakeModel;
+use SL::DB::Note;
+use SL::DB::Order;
+use SL::DB::OrderItem;
+use SL::DB::Part;
+use SL::DB::PartsGroup;
+use SL::DB::PartsTax;
+use SL::DB::PaymentTerm;
+use SL::DB::PriceFactor;
+use SL::DB::Pricegroup;
+use SL::DB::Prices;
+use SL::DB::Printer;
+use SL::DB::Project;
+use SL::DB::PurchaseInvoice;
+use SL::DB::RMA;
+use SL::DB::RMAItem;
+use SL::DB::RecordLink;
+use SL::DB::SchemaInfo;
+use SL::DB::SepaExport;
+use SL::DB::SepaExportItem;
+use SL::DB::Shipto;
+use SL::DB::Status;
+use SL::DB::Tax;
+use SL::DB::TaxKey;
+use SL::DB::TaxZone;
+use SL::DB::TodoUserConfig;
+use SL::DB::TransferType;
+use SL::DB::Translation;
+use SL::DB::TranslationPaymentTerm;
+use SL::DB::Unit;
+use SL::DB::UnitsLanguage;
+use SL::DB::Vendor;
+use SL::DB::VendorTax;
+use SL::DB::Warehouse;
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+SL::DB::Helpers::ALL: Dependency-only package for all SL::DB::* modules
+
+=head1 SYNOPSIS
+
+  use SL::DB::Helpers::ALL;
+
+=head1 DESCRIPTION
+
+This module depends on all modules in SL/DB/*.pm for the convenience
+of being able to write a simple \C<use SL::DB::Helpers::ALL> and
+having everything loaded. This is supposed to be used only in the
+Lx-Office console. Normal modules should C<use> only the modules they
+actually need.
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut
diff --git a/SL/DB/Helpers/Attr.pm b/SL/DB/Helpers/Attr.pm
new file mode 100644 (file)
index 0000000..01c97c2
--- /dev/null
@@ -0,0 +1,135 @@
+package SL::DB::Helper::Attr;
+
+use strict;
+
+sub auto_make {
+  my ($package, %params) = @_;
+
+  for my $col ($package->meta->columns) {
+    next if $col->primary_key_position; # don't make attr helper for primary keys
+    _make_by_type($package, $col->name, $col->type);
+  }
+
+  return $package;
+}
+
+sub make {
+  my ($package, %params) = @_;
+
+  for my $name (keys %params) {
+    my @types = ref $params{$name} eq 'ARRAY' ? @{ $params{$name} } : ($params{$name});
+    for my $type (@types) {
+      _make_by_type($package, $name, $type);
+    }
+  }
+  return $package;
+}
+
+
+
+sub _make_by_type {
+  my ($package, $name, $type) = @_;
+  _as_number ($package, $name, places => -2) if $type =~ /numeric | real | float/xi;
+  _as_percent($package, $name, places =>  0) if $type =~ /numeric | real | float/xi;
+  _as_number ($package, $name, places =>  0) if $type =~ /int/xi;
+  _as_date   ($package, $name)               if $type =~ /date | timestamp/xi;
+}
+
+sub _as_number {
+  my $package     = shift;
+  my $attribute   = shift;
+  my %params      = @_;
+
+  $params{places} = 2 if !defined($params{places});
+
+  no strict 'refs';
+  *{ $package . '::' . $attribute . '_as_number' } = sub {
+    my ($self, $string) = @_;
+
+    $self->$attribute($::form->parse_amount(\%::myconfig, $string)) if @_ > 1;
+
+    return $::form->format_amount(\%::myconfig, $self->$attribute, $params{places});
+  };
+}
+
+sub _as_percent {
+  my $package     = shift;
+  my $attribute   = shift;
+  my %params      = @_;
+
+  $params{places} = 2 if !defined($params{places});
+
+  no strict 'refs';
+  *{ $package . '::' . $attribute . '_as_percent' } = sub {
+    my ($self, $string) = @_;
+
+    $self->$attribute($::form->parse_amount(\%::myconfig, $string) / 100) if @_ > 1;
+
+    return $::form->format_amount(\%::myconfig, 100 * $self->$attribute, $params{places});
+  };
+
+  return 1;
+}
+
+sub _as_date {
+  my $package     = shift;
+  my $attribute   = shift;
+  my %params      = @_;
+
+  no strict 'refs';
+  *{ $package . '::' . $attribute . '_as_date' } = sub {
+    my ($self, $string) = @_;
+
+    if (@_ > 1) {
+      if ($string) {
+        my ($yy, $mm, $dd) = $::locale->parse_date(\%::myconfig, $string);
+        $self->$attribute(DateTime->new(year => $yy, month => $mm, day => $dd));
+      } else {
+        $self->$attribute(undef);
+      }
+    }
+
+    return $self->$attribute
+      ? $::locale->reformat_date(
+          { dateformat => 'yy-mm-dd' },
+          ( $self->$attribute eq 'now'
+             ? DateTime->now
+             : $self->$attribute
+          )->ymd,
+          $::myconfig{dateformat}
+        )
+      : undef;
+  };
+
+  return 1;
+}
+
+1;
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+SL::DB::Helpers::Attr - attribute helpers
+
+=head1 SYNOPSIS
+
+  use SL::DB::Helpers::Attr;
+  SL::DB::Helpers::Attr::make($class,
+    method_name => 'numeric(15,5)',
+    datemethod  => 'date'
+  );
+  SL::DB::Helpers::Attr::auto_make($class);
+
+=head1 DESCRIPTION
+
+=head1 FUNCTIONS
+
+=head1 BUGS
+
+=head1 AUTHOR
+
+=cut
diff --git a/SL/DB/Helpers/ConventionManager.pm b/SL/DB/Helpers/ConventionManager.pm
new file mode 100644 (file)
index 0000000..1d9cd84
--- /dev/null
@@ -0,0 +1,29 @@
+package SL::DB::Helpers::ConventionManager;
+
+use strict;
+
+use Rose::DB::Object::ConventionManager;
+
+use base qw(Rose::DB::Object::ConventionManager);
+
+sub auto_manager_class_name {
+  my $self         = shift;
+  my $object_class = shift || $self->meta->class;
+
+  my @parts        = split m/::/, $object_class;
+  my $last         = pop @parts;
+
+  return join('::', @parts, 'Manager', $last);
+}
+
+# Base name used for 'make_manager_class', e.g. 'get_all',
+# 'update_all'
+sub auto_manager_base_name {
+  return 'all';
+}
+
+sub auto_manager_base_class {
+  return 'SL::DB::Helpers::Manager';
+}
+
+1;
diff --git a/SL/DB/Helpers/Manager.pm b/SL/DB/Helpers/Manager.pm
new file mode 100644 (file)
index 0000000..4399f5d
--- /dev/null
@@ -0,0 +1,27 @@
+package SL::DB::Helpers::Manager;
+
+use strict;
+
+use Rose::DB::Object::Manager;
+use base qw(Rose::DB::Object::Manager);
+
+sub make_manager_methods {
+  my $class  = shift;
+  my @params = scalar(@_) ? @_ : qw(all);
+  return $class->SUPER::make_manager_methods(@params);
+}
+
+sub find_by {
+  my $class = shift;
+
+  return if !@_;
+  return $class->get_all(query => [ @_ ], limit => 1)->[0];
+}
+
+sub get_first {
+  shift->get_all(
+    limit => 1,
+  )->[0];
+}
+
+1;
diff --git a/SL/DB/Helpers/Mappings.pm b/SL/DB/Helpers/Mappings.pm
new file mode 100644 (file)
index 0000000..fe7dc86
--- /dev/null
@@ -0,0 +1,186 @@
+package SL::DB::Helpers::Mappings;
+
+use strict;
+
+# these will not be managed as Rose::DB models, because they are not normalized,
+# significant changes are needed to get them done, or they were done by CRM.
+my @lxoffice_blacklist_permanent = qw(
+  leads
+);
+
+# these are not managed _yet_, but will hopefully at some point.
+# if you are confident that one of these works, remove it here.
+my @lxoffice_blacklist_temp = qw(
+);
+
+my @lxoffice_blacklist = (@lxoffice_blacklist_permanent, @lxoffice_blacklist_temp);
+
+# map table names to their models.
+# unlike rails we have no singular<->plural magic.
+# remeber: tables should be named as the plural of the model name.
+my %lxoffice_package_names = (
+  acc_trans                      => 'acc_transaction',
+  audittrail                     => 'audit_trail',
+  ar                             => 'invoice',
+  ap                             => 'purchase_invoice',
+  bank_accounts                  => 'bank_account',
+  buchungsgruppen                => 'buchungsgruppe',
+  contacts                       => 'contact',
+  custom_variable_configs        => 'custom_variable_config',
+  custom_variables               => 'custom_variable',
+  custom_variables_validity      => 'custom_variable_validity',
+  customertax                    => 'customer_tax',
+  datev                          => 'datev',
+  defaults                       => 'default',
+  delivery_orders                => 'delivery_order',
+  delivery_order_items           => 'delivery_order_item',
+  department                     => 'department',
+  dpt_trans                      => 'dpt_trans',
+  drafts                         => 'draft',
+  dunning                        => 'dunning',
+  dunning_config                 => 'dunning_config',
+  employee                       => 'employee',
+  exchangerate                   => 'exchangerate',
+  finanzamt                      => 'finanzamt',
+  follow_up_access               => 'follow_up_access',
+  follow_up_links                => 'follow_up_link',
+  follow_ups                     => 'follow_up',
+  generic_translations           => 'generic_translation',
+  gifi                           => 'gifi',
+  gl                             => 'GLTransaction',
+  history_erp                    => 'history',
+  inventory                      => 'inventory',
+  invoice                        => 'invoice_item',
+  language                       => 'language',
+  license                        => 'license',
+  licenseinvoice                 => 'license_invoice',
+  makemodel                      => 'make_model',
+  notes                          => 'note',
+  orderitems                     => 'order_item',
+  oe                             => 'order',
+  parts                          => 'part',
+  partsgroup                     => 'parts_group',
+  partstax                       => 'parts_tax',
+  payment_terms                  => 'payment_term',
+  prices                         => 'prices',
+  price_factors                  => 'price_factor',
+  pricegroup                     => 'pricegroup',
+  printers                       => 'Printer',
+  record_links                   => 'record_link',
+  rma                            => 'RMA',
+  rmaitems                       => 'RMA_item',
+  sepa_export                    => 'sepa_export',
+  sepa_export_items              => 'sepa_export_item',
+  schema_info                    => 'schema_info',
+  status                         => 'status',
+  tax                            => 'tax',
+  taxkeys                        => 'tax_key',
+  tax_zones                      => 'tax_zone',
+  todo_user_config               => 'todo_user_config',
+  translation                    => 'translation',
+  translation_payment_terms      => 'translation_payment_term',
+  units                          => 'unit',
+  units_language                 => 'units_language',
+  vendortax                      => 'vendor_tax',
+);
+
+sub get_blacklist {
+  return LXOFFICE => \@lxoffice_blacklist;
+}
+
+sub get_package_names {
+  return LXOFFICE => \%lxoffice_package_names;
+}
+
+sub db {
+  my $string = $_[0];
+  my $lookup = $lxoffice_package_names{$_[0]} ||
+      plurify($lxoffice_package_names{singlify($_[0])});
+
+  for my $thing ($string, $lookup) {
+
+    # best guess? its already the name. like part. camelize it first
+    my $class = "SL::DB::" . camelify($thing);
+    return $class if defined *{ $class. '::' };
+
+    # next, someone wants a manager and pluralized.
+    my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
+    return $manager if defined *{ $manager . '::' };
+  }
+
+  die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
+}
+
+sub camelify {
+  my ($str) = @_;
+  $str =~ s/_+(.)/uc($1)/ge;
+  ucfirst $str;
+}
+
+sub snakify {
+  my ($str) = @_;
+  $str =~ s/(?<!^)\u(.)/'_' . lc($1)/ge;
+  lcfirst $str;
+}
+
+sub plurify {
+  my ($str) = @_;
+  $str . 's';
+}
+
+sub singlify {
+  my ($str) = @_;
+  local $/ = 's';
+  chomp $str;
+  $str;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+SL::DB::Helpers::Mappings - Rose Table <-> Model mapping information
+
+=head1 SYNOPSIS
+
+  use SL::DB::Helpers::Mappings qw(@blacklist %table2model);
+
+=head1 DESCRIPTION
+
+This modul stores table <-> model mappings used by the
+L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
+custom mappings, add it here.
+
+=head2 db
+
+A special function provided here is E<db>. Without it you'd have to write:
+
+  my $part = SL::DB::Part->new(id => 1234);
+  my @all_parts = SL::DB::Manager::Part->get_all;
+
+with them it becomes:
+
+  my $part = db('part')->new(id => 123);
+  my @all_parts = db('parts')->get_all;
+
+You don't have to care about add that SL::DB:: incantation anymore. Also, a
+simple s at the end will get you the associated Manager class.
+
+db is written to try to make sense of what you give it, but if all fails, it
+will die with an error.
+
+=head1 BUGS
+
+nothing yet
+
+=head1 SEE ALSO
+
+L<scripts/rose_auto_create_model.pl>
+
+=head1 AUTHOR
+
+Sven Schöling <s.schoeling@linet-services.de>
+
+=cut
diff --git a/SL/DB/Helpers/Metadata.pm b/SL/DB/Helpers/Metadata.pm
new file mode 100644 (file)
index 0000000..30c59f4
--- /dev/null
@@ -0,0 +1,34 @@
+package SL::DB::Helpers::Metadata;
+
+use strict;
+
+use Rose::DB::Object::Metadata;
+use SL::DB::Helpers::ConventionManager;
+
+use base qw(Rose::DB::Object::Metadata);
+
+sub convention_manager_class {
+  return 'SL::DB::Helpers::ConventionManager';
+}
+
+sub default_manager_base_class {
+  return 'SL::DB::Helpers::Manager';
+}
+
+sub initialize {
+  my $self = shift;
+  $self->make_attr_auto_helpers;
+  $self->SUPER::initialize(@_);
+}
+
+sub make_attr_helpers {
+  my ($self, %params) = @_;
+  SL::DB::Helper::Attr::make($self->class, %params);
+}
+
+sub make_attr_auto_helpers {
+  my ($self) = @_;
+  SL::DB::Helper::Attr::auto_make($self->class);
+}
+
+1;
diff --git a/SL/DB/History.pm b/SL/DB/History.pm
new file mode 100644 (file)
index 0000000..c935a82
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::History;
+
+use strict;
+
+use SL::DB::MetaSetup::History;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Inventory.pm b/SL/DB/Inventory.pm
new file mode 100644 (file)
index 0000000..98d505d
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Inventory;
+
+use strict;
+
+use SL::DB::MetaSetup::Inventory;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Invoice.pm b/SL/DB/Invoice.pm
new file mode 100644 (file)
index 0000000..993920c
--- /dev/null
@@ -0,0 +1,60 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Invoice;
+
+use strict;
+
+use List::Util qw(first);
+
+use SL::DB::MetaSetup::Invoice;
+use SL::DB::Manager::Invoice;
+
+__PACKAGE__->meta->add_relationship(
+  invoiceitems => {
+    type         => 'one to many',
+    class        => 'SL::DB::InvoiceItem',
+    column_map   => { id => 'trans_id' },
+    manager_args => {
+      with_objects => [ 'part' ]
+    }
+  },
+);
+
+__PACKAGE__->meta->initialize;
+
+# methods
+
+# it is assumed, that ordnumbers are unique here.
+sub first_order_by_ordnumber {
+  my $self = shift;
+
+  my $orders = SL::DB::Manager::Order->get_all(
+    query => [
+      ordnumber => $self->ordnumber,
+
+    ],
+  );
+
+  return first { $_->is_type('sales_order') } @{ $orders };
+}
+
+sub abschlag_percentage {
+  my $self         = shift;
+  my $order        = $self->first_order_by_ordnumber or return;
+  my $order_amount = $order->netamount               or return;
+  return $self->abschlag
+    ? $self->netamount / $order_amount
+    : undef;
+}
+
+sub taxamount {
+  my $self = shift;
+  die 'not a setter method' if @_;
+
+  return $self->amount - $self->netamount;
+}
+
+__PACKAGE__->meta->make_attr_helpers(taxamount => 'numeric(15,5)');
+
+1;
diff --git a/SL/DB/InvoiceItem.pm b/SL/DB/InvoiceItem.pm
new file mode 100644 (file)
index 0000000..d8b3903
--- /dev/null
@@ -0,0 +1,20 @@
+package SL::DB::InvoiceItem;
+
+use strict;
+
+use SL::DB::MetaSetup::InvoiceItem;
+
+__PACKAGE__->meta->add_relationship(
+  part => {
+    type         => 'one to one',
+    class        => 'SL::DB::Part',
+    column_map   => { parts_id => 'id' },
+  }
+);
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+__PACKAGE__->meta->initialize;
+
+1;
diff --git a/SL/DB/Language.pm b/SL/DB/Language.pm
new file mode 100644 (file)
index 0000000..abfdebc
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Language;
+
+use strict;
+
+use SL::DB::MetaSetup::Language;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/License.pm b/SL/DB/License.pm
new file mode 100644 (file)
index 0000000..b75add7
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::License;
+
+use strict;
+
+use SL::DB::MetaSetup::License;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/LicenseInvoice.pm b/SL/DB/LicenseInvoice.pm
new file mode 100644 (file)
index 0000000..9a03e3a
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::LicenseInvoice;
+
+use strict;
+
+use SL::DB::MetaSetup::LicenseInvoice;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/MakeModel.pm b/SL/DB/MakeModel.pm
new file mode 100644 (file)
index 0000000..8831a66
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::MakeModel;
+
+use strict;
+
+use SL::DB::MetaSetup::MakeModel;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Manager/DeliveryOrder.pm b/SL/DB/Manager/DeliveryOrder.pm
new file mode 100644 (file)
index 0000000..f63987e
--- /dev/null
@@ -0,0 +1,22 @@
+package SL::DB::Manager::DeliveryOrder;
+
+use strict;
+
+use SL::DB::Helpers::Manager;
+use base qw(SL::DB::Helpers::Manager);
+
+sub object_class { 'SL::DB::DeliveryOrder' }
+
+__PACKAGE__->make_manager_methods;
+
+sub type_filter {
+  my $class = shift;
+  my $type  = lc(shift || '');
+
+  return ('!customer_id' => undef) if $type eq 'sales_delivery_order';
+  return ('!vendor_id'   => undef) if $type eq 'purchase_delivery_order';
+
+  die "Unknown type $type";
+}
+
+1;
diff --git a/SL/DB/Manager/Invoice.pm b/SL/DB/Manager/Invoice.pm
new file mode 100644 (file)
index 0000000..025f7f2
--- /dev/null
@@ -0,0 +1,24 @@
+package SL::DB::Manager::Invoice;
+
+use strict;
+
+use base qw(SL::DB::Helpers::Manager);
+
+sub object_class { 'SL::DB::Invoice' }
+
+__PACKAGE__->make_manager_methods;
+
+sub type_filter {
+  my $class = shift;
+  my $type  = lc(shift || '');
+
+  return (or  => [ invoice => 0, invoice => undef                                               ]) if $type eq 'ar_transaction';
+  return (and => [ invoice => 1, amount  => { ge => 0 }, or => [ storno => 0, storno => undef ] ]) if $type eq 'invoice';
+  return (and => [ invoice => 1, amount  => { lt => 0 }, or => [ storno => 0, storno => undef ] ]) if $type eq 'credit_note';
+  return (and => [ invoice => 1, amount  => { lt => 0 },         storno => 1                    ]) if $type =~ m/(?:invoice_)?storno/;
+  return (and => [ invoice => 1, amount  => { ge => 0 },         storno => 1                    ]) if $type eq 'credit_note_storno';
+
+  die "Unknown type $type";
+}
+
+1;
diff --git a/SL/DB/Manager/Order.pm b/SL/DB/Manager/Order.pm
new file mode 100644 (file)
index 0000000..451a43a
--- /dev/null
@@ -0,0 +1,24 @@
+package SL::DB::Manager::Order;
+
+use strict;
+
+use SL::DB::Helpers::Manager;
+use base qw(SL::DB::Helpers::Manager);
+
+sub object_class { 'SL::DB::Order' }
+
+__PACKAGE__->make_manager_methods;
+
+sub type_filter {
+  my $class = shift;
+  my $type  = lc(shift || '');
+
+  return (and => [ '!customer_id' => undef,         quotation => 1                       ]) if $type eq 'sales_quotation';
+  return (and => [ '!vendor_id'   => undef,         quotation => 1                       ]) if $type eq 'request_quotation';
+  return (and => [ '!customer_id' => undef, or => [ quotation => 0, quotation => undef ] ]) if $type eq 'sales_order';
+  return (and => [ '!vendor_id'   => undef, or => [ quotation => 0, quotation => undef ] ]) if $type eq 'purchase_order';
+
+  die "Unknown type $type";
+}
+
+1;
diff --git a/SL/DB/Manager/Part.pm b/SL/DB/Manager/Part.pm
new file mode 100644 (file)
index 0000000..1564b9b
--- /dev/null
@@ -0,0 +1,63 @@
+package SL::DB::Manager::Part;
+
+use strict;
+
+use SL::DB::Helpers::Manager;
+use base qw(SL::DB::Helpers::Manager);
+
+use Carp;
+use SL::DBUtils;
+
+sub object_class { 'SL::DB::Part' }
+
+__PACKAGE__->make_manager_methods;
+
+sub type_filter {
+  my $class = shift;
+  my $type  = lc(shift || '');
+
+  if ($type =~ m/^part/) {
+    return (and => [ or                    => [ assembly => 0, assembly => undef ],
+                     '!inventory_accno_id' => 0,
+                     '!inventory_accno_id' => undef,
+                   ]);
+
+  } elsif ($type =~ m/^service/) {
+    return (and => [ or => [ assembly           => 0, assembly           => undef ],
+                     or => [ inventory_accno_id => 0, inventory_accno_id => undef ],
+                   ]);
+
+  } elsif ($type =~ m/^assembl/) {
+    return (assembly => 1);
+
+  }
+
+  return ();
+}
+
+sub get_ordered_qty {
+  my $class    = shift;
+  my @part_ids = @_;
+
+  return () unless @part_ids;
+
+  my $placeholders = join ',', ('?') x @part_ids;
+  my $query        = <<SQL;
+    SELECT oi.parts_id, SUM(oi.base_qty) AS qty
+    FROM orderitems oi
+    LEFT JOIN oe ON (oi.trans_id = oe.id)
+    WHERE (oi.parts_id IN ($placeholders))
+      AND (NOT COALESCE(oe.quotation, FALSE))
+      AND (NOT COALESCE(oe.closed,    FALSE))
+      AND (NOT COALESCE(oe.delivered, FALSE))
+      AND (COALESCE(oe.vendor_id, 0) <> 0)
+    GROUP BY oi.parts_id
+SQL
+
+  my %qty_by_id = map { $_->{parts_id} => $_->{qty} * 1 } @{ selectall_hashref_query($::form, $class->object_class->init_db->dbh, $query, @part_ids) };
+  map { $qty_by_id{$_} ||= 0 } @part_ids;
+
+  return %qty_by_id;
+}
+
+1;
diff --git a/SL/DB/Manager/PurchaseInvoice.pm b/SL/DB/Manager/PurchaseInvoice.pm
new file mode 100644 (file)
index 0000000..c717a04
--- /dev/null
@@ -0,0 +1,23 @@
+package SL::DB::Manager::PurchaseInvoice;
+
+use strict;
+
+use SL::DB::Helpers::Manager;
+use base qw(SL::DB::Helpers::Manager);
+
+sub object_class { 'SL::DB::PurchaseInvoice' }
+
+__PACKAGE__->make_manager_methods;
+
+sub type_filter {
+  my $class = shift;
+  my $type  = lc(shift || '');
+
+  return (or  => [ invoice => 0, invoice => undef                       ]) if $type eq 'ap_transaction';
+  return (and => [ invoice => 1, or => [ storno => 0, storno => undef ] ]) if $type eq 'invoice';
+  return (and => [ invoice => 1,         storno => 1                    ]) if $type =~ m/(?:invoice_)?storno/;
+
+  die "Unknown type $type";
+}
+
+1;
diff --git a/SL/DB/Manager/TransferType.pm b/SL/DB/Manager/TransferType.pm
new file mode 100644 (file)
index 0000000..82bcc5f
--- /dev/null
@@ -0,0 +1,27 @@
+package SL::DB::Manager::TransferType;
+
+use strict;
+
+use base qw(SL::DB::Helpers::Manager);
+
+use Carp;
+
+sub object_class { 'SL::DB::TransferType' }
+
+__PACKAGE__->make_manager_methods;
+
+# class functions
+
+sub get_all_in {
+  return shift()->get_all( query => [ direction => 'in', ] );
+}
+
+sub get_all_out {
+  return shift()->get_all( query => [ direction => 'out', ] );
+}
+
+sub get_all_transfer {
+  return shift()->get_all( query => [ direction => 'transfer', ] );
+}
+
+1;
diff --git a/SL/DB/MetaSetup/AccTrans.pm b/SL/DB/MetaSetup/AccTrans.pm
new file mode 100644 (file)
index 0000000..8fcedbc
--- /dev/null
@@ -0,0 +1,50 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::AccTrans;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'acc_trans',
+
+  columns => [
+    acc_trans_id   => { type => 'bigint', sequence => 'acc_trans_id_seq' },
+    trans_id       => { type => 'integer', not_null => 1 },
+    chart_id       => { type => 'integer', not_null => 1 },
+    amount         => { type => 'numeric', precision => 5, scale => 15 },
+    transdate      => { type => 'date', default => 'now' },
+    gldate         => { type => 'date', default => 'now' },
+    source         => { type => 'text' },
+    cleared        => { type => 'boolean', default => 'false' },
+    fx_transaction => { type => 'boolean', default => 'false' },
+    ob_transaction => { type => 'boolean', default => 'false' },
+    cb_transaction => { type => 'boolean', default => 'false' },
+    project_id     => { type => 'integer' },
+    memo           => { type => 'text' },
+    taxkey         => { type => 'integer' },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    id             => { type => 'integer', not_null => 1, sequence => 'acc_trans_id_seq1' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    chart => {
+      class       => 'SL::DB::Chart',
+      key_columns => { chart_id => 'id' },
+    },
+
+    project => {
+      class       => 'SL::DB::Project',
+      key_columns => { project_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/AccTransaction.pm b/SL/DB/MetaSetup/AccTransaction.pm
new file mode 100644 (file)
index 0000000..9f6e6b4
--- /dev/null
@@ -0,0 +1,50 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::AccTransaction;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'acc_trans',
+
+  columns => [
+    acc_trans_id   => { type => 'bigint', sequence => 'acc_trans_id_seq' },
+    trans_id       => { type => 'integer', not_null => 1 },
+    chart_id       => { type => 'integer', not_null => 1 },
+    amount         => { type => 'numeric', precision => 5, scale => 15 },
+    transdate      => { type => 'date', default => 'now' },
+    gldate         => { type => 'date', default => 'now' },
+    source         => { type => 'text' },
+    cleared        => { type => 'boolean', default => 'false' },
+    fx_transaction => { type => 'boolean', default => 'false' },
+    ob_transaction => { type => 'boolean', default => 'false' },
+    cb_transaction => { type => 'boolean', default => 'false' },
+    project_id     => { type => 'integer' },
+    memo           => { type => 'text' },
+    taxkey         => { type => 'integer' },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    id             => { type => 'integer', not_null => 1, sequence => 'acc_trans_id_seq1' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    chart => {
+      class       => 'SL::DB::Chart',
+      key_columns => { chart_id => 'id' },
+    },
+
+    project => {
+      class       => 'SL::DB::Project',
+      key_columns => { project_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Assembly.pm b/SL/DB/MetaSetup/Assembly.pm
new file mode 100644 (file)
index 0000000..408eea7
--- /dev/null
@@ -0,0 +1,30 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Assembly;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'assembly',
+
+  columns => [
+    id          => { type => 'integer' },
+    parts_id    => { type => 'integer' },
+    qty         => { type => 'float', precision => 4 },
+    bom         => { type => 'boolean' },
+    itime       => { type => 'timestamp', default => 'now()' },
+    mtime       => { type => 'timestamp' },
+    variable    => { type => 'boolean', default => 'false', not_null => 1, remarks => 'true if this part of the assembly is variable, and can be modified' },
+    item_id     => { type => 'integer', remarks => 'used to group parts in an assembly for exclusive options' },
+    assembly_id => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'assembly_id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/AuditTrail.pm b/SL/DB/MetaSetup/AuditTrail.pm
new file mode 100644 (file)
index 0000000..0edc6ed
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::AuditTrail;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'audittrail',
+
+  columns => [
+    trans_id    => { type => 'integer' },
+    tablename   => { type => 'text' },
+    reference   => { type => 'text' },
+    formname    => { type => 'text' },
+    action      => { type => 'text' },
+    transdate   => { type => 'timestamp', default => 'now' },
+    employee_id => { type => 'integer' },
+    id          => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/BankAccount.pm b/SL/DB/MetaSetup/BankAccount.pm
new file mode 100644 (file)
index 0000000..5cd8e7a
--- /dev/null
@@ -0,0 +1,33 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::BankAccount;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'bank_accounts',
+
+  columns => [
+    id             => { type => 'integer', not_null => 1, sequence => 'id' },
+    account_number => { type => 'varchar', length => 100 },
+    bank_code      => { type => 'varchar', length => 100 },
+    iban           => { type => 'varchar', length => 100 },
+    bic            => { type => 'varchar', length => 100 },
+    bank           => { type => 'text' },
+    chart_id       => { type => 'integer', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    chart => {
+      class       => 'SL::DB::Chart',
+      key_columns => { chart_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Bin.pm b/SL/DB/MetaSetup/Bin.pm
new file mode 100644 (file)
index 0000000..ff22520
--- /dev/null
@@ -0,0 +1,33 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Bin;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'bin',
+
+  columns => [
+    id           => { type => 'integer', not_null => 1, sequence => 'id' },
+    warehouse_id => { type => 'integer', not_null => 1 },
+    description  => { type => 'text' },
+    itime        => { type => 'timestamp', default => 'now()' },
+    mtime        => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    warehouse => {
+      class       => 'SL::DB::Warehouse',
+      key_columns => { warehouse_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Buchungsgruppe.pm b/SL/DB/MetaSetup/Buchungsgruppe.pm
new file mode 100644 (file)
index 0000000..8acc5a7
--- /dev/null
@@ -0,0 +1,31 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Buchungsgruppe;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'buchungsgruppen',
+
+  columns => [
+    id                 => { type => 'integer', not_null => 1, sequence => 'id' },
+    description        => { type => 'text' },
+    inventory_accno_id => { type => 'integer' },
+    income_accno_id_0  => { type => 'integer' },
+    expense_accno_id_0 => { type => 'integer' },
+    income_accno_id_1  => { type => 'integer' },
+    expense_accno_id_1 => { type => 'integer' },
+    income_accno_id_2  => { type => 'integer' },
+    expense_accno_id_2 => { type => 'integer' },
+    income_accno_id_3  => { type => 'integer' },
+    expense_accno_id_3 => { type => 'integer' },
+    sortkey            => { type => 'integer', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Business.pm b/SL/DB/MetaSetup/Business.pm
new file mode 100644 (file)
index 0000000..243d524
--- /dev/null
@@ -0,0 +1,28 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Business;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'business',
+
+  columns => [
+    id                 => { type => 'integer', not_null => 1, sequence => 'id' },
+    description        => { type => 'text' },
+    discount           => { type => 'float', precision => 4 },
+    customernumberinit => { type => 'text' },
+    salesman           => { type => 'boolean', default => 'false' },
+    itime              => { type => 'timestamp', default => 'now()' },
+    mtime              => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Chart.pm b/SL/DB/MetaSetup/Chart.pm
new file mode 100644 (file)
index 0000000..c6cce71
--- /dev/null
@@ -0,0 +1,40 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Chart;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'chart',
+
+  columns => [
+    id             => { type => 'integer', not_null => 1, sequence => 'id' },
+    accno          => { type => 'text', not_null => 1 },
+    description    => { type => 'text' },
+    charttype      => { type => 'character', default => 'A', length => 1 },
+    category       => { type => 'character', length => 1 },
+    link           => { type => 'text' },
+    gifi_accno     => { type => 'text' },
+    taxkey_id      => { type => 'integer' },
+    pos_ustva      => { type => 'integer' },
+    pos_bwa        => { type => 'integer' },
+    pos_bilanz     => { type => 'integer' },
+    pos_eur        => { type => 'integer' },
+    datevautomatik => { type => 'boolean', default => 'false' },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    new_chart_id   => { type => 'integer' },
+    valid_from     => { type => 'date' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  unique_key => [ 'accno' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Contact.pm b/SL/DB/MetaSetup/Contact.pm
new file mode 100644 (file)
index 0000000..2eb4fa5
--- /dev/null
@@ -0,0 +1,42 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Contact;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'contacts',
+
+  columns => [
+    cp_id          => { type => 'integer', not_null => 1, sequence => 'id' },
+    cp_cv_id       => { type => 'integer' },
+    cp_title       => { type => 'varchar', length => 75 },
+    cp_givenname   => { type => 'varchar', length => 75 },
+    cp_name        => { type => 'varchar', length => 75 },
+    cp_email       => { type => 'text' },
+    cp_phone1      => { type => 'varchar', length => 75 },
+    cp_phone2      => { type => 'varchar', length => 75 },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    cp_fax         => { type => 'text' },
+    cp_mobile1     => { type => 'text' },
+    cp_mobile2     => { type => 'text' },
+    cp_satphone    => { type => 'text' },
+    cp_satfax      => { type => 'text' },
+    cp_project     => { type => 'text' },
+    cp_privatphone => { type => 'text' },
+    cp_privatemail => { type => 'text' },
+    cp_birthday    => { type => 'text' },
+    cp_abteilung   => { type => 'text' },
+    cp_gender      => { type => 'character', length => 1 },
+  ],
+
+  primary_key_columns => [ 'cp_id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/CustomVariable.pm b/SL/DB/MetaSetup/CustomVariable.pm
new file mode 100644 (file)
index 0000000..bb2380a
--- /dev/null
@@ -0,0 +1,38 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::CustomVariable;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'custom_variables',
+
+  columns => [
+    id              => { type => 'integer', not_null => 1, sequence => 'custom_variables_id' },
+    config_id       => { type => 'integer', not_null => 1 },
+    trans_id        => { type => 'integer', not_null => 1 },
+    bool_value      => { type => 'boolean' },
+    timestamp_value => { type => 'timestamp' },
+    text_value      => { type => 'text' },
+    number_value    => { type => 'numeric', precision => 5, scale => 25 },
+    itime           => { type => 'timestamp', default => 'now()' },
+    mtime           => { type => 'timestamp' },
+    sub_module      => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    config => {
+      class       => 'SL::DB::CustomVariableConfig',
+      key_columns => { config_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/CustomVariableConfig.pm b/SL/DB/MetaSetup/CustomVariableConfig.pm
new file mode 100644 (file)
index 0000000..5ee01c1
--- /dev/null
@@ -0,0 +1,35 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::CustomVariableConfig;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'custom_variable_configs',
+
+  columns => [
+    id                  => { type => 'integer', not_null => 1, sequence => 'custom_variable_configs_id' },
+    name                => { type => 'text' },
+    description         => { type => 'text' },
+    type                => { type => 'varchar', length => 20 },
+    module              => { type => 'varchar', length => 20 },
+    default_value       => { type => 'text' },
+    options             => { type => 'text' },
+    searchable          => { type => 'boolean' },
+    includeable         => { type => 'boolean' },
+    included_by_default => { type => 'boolean' },
+    sortkey             => { type => 'integer' },
+    itime               => { type => 'timestamp', default => 'now()' },
+    mtime               => { type => 'timestamp' },
+    flags               => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/CustomVariableValidity.pm b/SL/DB/MetaSetup/CustomVariableValidity.pm
new file mode 100644 (file)
index 0000000..25876d7
--- /dev/null
@@ -0,0 +1,32 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::CustomVariableValidity;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'custom_variables_validity',
+
+  columns => [
+    id        => { type => 'integer', not_null => 1, sequence => 'id' },
+    config_id => { type => 'integer', not_null => 1 },
+    trans_id  => { type => 'integer', not_null => 1 },
+    itime     => { type => 'timestamp', default => 'now()' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    config => {
+      class       => 'SL::DB::CustomVariableConfig',
+      key_columns => { config_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Customer.pm b/SL/DB/MetaSetup/Customer.pm
new file mode 100644 (file)
index 0000000..93f63b7
--- /dev/null
@@ -0,0 +1,65 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Customer;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'customer',
+
+  columns => [
+    id             => { type => 'integer', not_null => 1, sequence => 'id' },
+    name           => { type => 'varchar', length => 75, not_null => 1 },
+    department_1   => { type => 'varchar', length => 75 },
+    department_2   => { type => 'varchar', length => 75 },
+    street         => { type => 'varchar', length => 75 },
+    zipcode        => { type => 'varchar', length => 10 },
+    city           => { type => 'varchar', length => 75 },
+    country        => { type => 'varchar', length => 75 },
+    contact        => { type => 'varchar', length => 75 },
+    phone          => { type => 'varchar', length => 30 },
+    fax            => { type => 'varchar', length => 30 },
+    homepage       => { type => 'text' },
+    email          => { type => 'text' },
+    notes          => { type => 'text' },
+    discount       => { type => 'float', precision => 4 },
+    taxincluded    => { type => 'boolean' },
+    creditlimit    => { type => 'numeric', default => '0', precision => 5, scale => 15 },
+    terms          => { type => 'integer', default => '0' },
+    customernumber => { type => 'text' },
+    cc             => { type => 'text' },
+    bcc            => { type => 'text' },
+    business_id    => { type => 'integer' },
+    taxnumber      => { type => 'text' },
+    account_number => { type => 'varchar', length => 15 },
+    bank_code      => { type => 'varchar', length => 10 },
+    bank           => { type => 'text' },
+    language       => { type => 'varchar', length => 5 },
+    datevexport    => { type => 'integer' },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    obsolete       => { type => 'boolean', default => 'false' },
+    username       => { type => 'varchar', length => 50 },
+    user_password  => { type => 'text' },
+    salesman_id    => { type => 'integer' },
+    c_vendor_id    => { type => 'text' },
+    klass          => { type => 'integer', default => '0' },
+    language_id    => { type => 'integer' },
+    payment_id     => { type => 'integer' },
+    taxzone_id     => { type => 'integer', default => '0', not_null => 1 },
+    greeting       => { type => 'text' },
+    ustid          => { type => 'varchar', length => 14 },
+    direct_debit   => { type => 'boolean', default => 'false' },
+    iban           => { type => 'varchar', length => 100 },
+    bic            => { type => 'varchar', length => 100 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/CustomerTax.pm b/SL/DB/MetaSetup/CustomerTax.pm
new file mode 100644 (file)
index 0000000..2522995
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::CustomerTax;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'customertax',
+
+  columns => [
+    customer_id => { type => 'integer' },
+    chart_id    => { type => 'integer' },
+    itime       => { type => 'timestamp', default => 'now()' },
+    mtime       => { type => 'timestamp' },
+    id          => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Datev.pm b/SL/DB/MetaSetup/Datev.pm
new file mode 100644 (file)
index 0000000..cc03ba3
--- /dev/null
@@ -0,0 +1,30 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Datev;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'datev',
+
+  columns => [
+    beraternr      => { type => 'varchar', length => 7 },
+    beratername    => { type => 'varchar', length => 9 },
+    mandantennr    => { type => 'varchar', length => 5 },
+    dfvkz          => { type => 'varchar', length => 2 },
+    datentraegernr => { type => 'varchar', length => 3 },
+    abrechnungsnr  => { type => 'varchar', length => 6 },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    id             => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Default.pm b/SL/DB/MetaSetup/Default.pm
new file mode 100644 (file)
index 0000000..4eb5e66
--- /dev/null
@@ -0,0 +1,54 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Default;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__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' },
+    yearend                    => { type => 'varchar', length => 5 },
+    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' },
+    id                         => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/DeliveryOrder.pm b/SL/DB/MetaSetup/DeliveryOrder.pm
new file mode 100644 (file)
index 0000000..806c963
--- /dev/null
@@ -0,0 +1,89 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::DeliveryOrder;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'delivery_orders',
+
+  columns => [
+    id                      => { type => 'integer', not_null => 1, sequence => 'id' },
+    donumber                => { type => 'text', not_null => 1 },
+    ordnumber               => { type => 'text' },
+    transdate               => { type => 'date', default => 'now()' },
+    vendor_id               => { type => 'integer' },
+    customer_id             => { type => 'integer' },
+    reqdate                 => { type => 'date' },
+    shippingpoint           => { type => 'text' },
+    notes                   => { type => 'text' },
+    intnotes                => { type => 'text' },
+    employee_id             => { type => 'integer' },
+    closed                  => { type => 'boolean', default => 'false' },
+    delivered               => { type => 'boolean', default => 'false' },
+    cusordnumber            => { type => 'text' },
+    oreqnumber              => { type => 'text' },
+    department_id           => { type => 'integer' },
+    shipvia                 => { type => 'text' },
+    cp_id                   => { type => 'integer' },
+    language_id             => { type => 'integer' },
+    shipto_id               => { type => 'integer' },
+    globalproject_id        => { type => 'integer' },
+    salesman_id             => { type => 'integer' },
+    transaction_description => { type => 'text' },
+    is_sales                => { type => 'boolean' },
+    itime                   => { type => 'timestamp', default => 'now()' },
+    mtime                   => { type => 'timestamp' },
+    notes_bottom            => { type => 'text' },
+    taxzone_id              => { type => 'integer' },
+    taxincluded             => { type => 'boolean' },
+    terms                   => { type => 'integer' },
+    curr                    => { type => 'character', length => 3 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    contact => {
+      class       => 'SL::DB::Contact',
+      key_columns => { cp_id => 'cp_id' },
+    },
+
+    customer => {
+      class       => 'SL::DB::Customer',
+      key_columns => { customer_id => 'id' },
+    },
+
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { employee_id => 'id' },
+    },
+
+    globalproject => {
+      class       => 'SL::DB::Project',
+      key_columns => { globalproject_id => 'id' },
+    },
+
+    language => {
+      class       => 'SL::DB::Language',
+      key_columns => { language_id => 'id' },
+    },
+
+    salesman => {
+      class       => 'SL::DB::Employee',
+      key_columns => { salesman_id => 'id' },
+    },
+
+    vendor => {
+      class       => 'SL::DB::Vendor',
+      key_columns => { vendor_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/DeliveryOrderItem.pm b/SL/DB/MetaSetup/DeliveryOrderItem.pm
new file mode 100644 (file)
index 0000000..6bdfe43
--- /dev/null
@@ -0,0 +1,65 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::DeliveryOrderItem;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'delivery_order_items',
+
+  columns => [
+    id                 => { type => 'integer', not_null => 1, sequence => 'delivery_order_items_id' },
+    delivery_order_id  => { type => 'integer', not_null => 1 },
+    parts_id           => { type => 'integer', not_null => 1 },
+    description        => { type => 'text' },
+    qty                => { type => 'numeric', precision => 5, scale => 25 },
+    sellprice          => { type => 'numeric', precision => 5, scale => 15 },
+    discount           => { type => 'float', precision => 4 },
+    project_id         => { type => 'integer' },
+    reqdate            => { type => 'date' },
+    serialnumber       => { type => 'text' },
+    ordnumber          => { type => 'text' },
+    transdate          => { type => 'text' },
+    cusordnumber       => { type => 'text' },
+    unit               => { type => 'varchar', length => 20 },
+    base_qty           => { type => 'float', precision => 4 },
+    longdescription    => { type => 'text' },
+    lastcost           => { type => 'numeric', precision => 5, scale => 15 },
+    price_factor_id    => { type => 'integer' },
+    price_factor       => { type => 'numeric', default => 1, precision => 5, scale => 15 },
+    marge_price_factor => { type => 'numeric', default => 1, precision => 5, scale => 15 },
+    itime              => { type => 'timestamp', default => 'now()' },
+    mtime              => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    delivery_order => {
+      class       => 'SL::DB::DeliveryOrder',
+      key_columns => { delivery_order_id => 'id' },
+    },
+
+    parts => {
+      class       => 'SL::DB::Part',
+      key_columns => { parts_id => 'id' },
+    },
+
+    price_factor_obj => {
+      class       => 'SL::DB::PriceFactor',
+      key_columns => { price_factor_id => 'id' },
+    },
+
+    project => {
+      class       => 'SL::DB::Project',
+      key_columns => { project_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/DeliveryOrderItemsStock.pm b/SL/DB/MetaSetup/DeliveryOrderItemsStock.pm
new file mode 100644 (file)
index 0000000..99a2925
--- /dev/null
@@ -0,0 +1,48 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::DeliveryOrderItemsStock;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'delivery_order_items_stock',
+
+  columns => [
+    id                     => { type => 'integer', not_null => 1, sequence => 'id' },
+    delivery_order_item_id => { type => 'integer', not_null => 1 },
+    qty                    => { type => 'numeric', not_null => 1, precision => 5, scale => 15 },
+    unit                   => { type => 'varchar', length => 20, not_null => 1 },
+    warehouse_id           => { type => 'integer', not_null => 1 },
+    bin_id                 => { type => 'integer', not_null => 1 },
+    chargenumber           => { type => 'text' },
+    itime                  => { type => 'timestamp', default => 'now()' },
+    mtime                  => { type => 'timestamp' },
+    bestbefore             => { type => 'date' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    bin => {
+      class       => 'SL::DB::Bin',
+      key_columns => { bin_id => 'id' },
+    },
+
+    delivery_order_item => {
+      class       => 'SL::DB::DeliveryOrderItem',
+      key_columns => { delivery_order_item_id => 'id' },
+    },
+
+    warehouse => {
+      class       => 'SL::DB::Warehouse',
+      key_columns => { warehouse_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Department.pm b/SL/DB/MetaSetup/Department.pm
new file mode 100644 (file)
index 0000000..1d1d957
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Department;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'department',
+
+  columns => [
+    id          => { type => 'integer', not_null => 1, sequence => 'id' },
+    description => { type => 'text' },
+    role        => { type => 'character', default => 'P', length => 1 },
+    itime       => { type => 'timestamp', default => 'now()' },
+    mtime       => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/DptTrans.pm b/SL/DB/MetaSetup/DptTrans.pm
new file mode 100644 (file)
index 0000000..9d30883
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::DptTrans;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'dpt_trans',
+
+  columns => [
+    trans_id      => { type => 'integer' },
+    department_id => { type => 'integer' },
+    itime         => { type => 'timestamp', default => 'now()' },
+    mtime         => { type => 'timestamp' },
+    id            => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Draft.pm b/SL/DB/MetaSetup/Draft.pm
new file mode 100644 (file)
index 0000000..1a8ffc6
--- /dev/null
@@ -0,0 +1,35 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Draft;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'drafts',
+
+  columns => [
+    id          => { type => 'varchar', length => 50, not_null => 1 },
+    module      => { type => 'varchar', length => 50, not_null => 1 },
+    submodule   => { type => 'varchar', length => 50, not_null => 1 },
+    description => { type => 'text' },
+    itime       => { type => 'timestamp', default => 'now()' },
+    form        => { type => 'text' },
+    employee_id => { type => 'integer' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { employee_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Dunning.pm b/SL/DB/MetaSetup/Dunning.pm
new file mode 100644 (file)
index 0000000..bc4ba87
--- /dev/null
@@ -0,0 +1,45 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Dunning;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'dunning',
+
+  columns => [
+    id                 => { type => 'integer', not_null => 1, sequence => 'id' },
+    trans_id           => { type => 'integer' },
+    dunning_id         => { type => 'integer' },
+    dunning_level      => { type => 'integer' },
+    transdate          => { type => 'date' },
+    duedate            => { type => 'date' },
+    fee                => { type => 'numeric', precision => 5, scale => 15 },
+    interest           => { type => 'numeric', precision => 5, scale => 15 },
+    dunning_config_id  => { type => 'integer' },
+    itime              => { type => 'timestamp', default => 'now()' },
+    mtime              => { type => 'timestamp' },
+    fee_interest_ar_id => { type => 'integer' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    dunning_config => {
+      class       => 'SL::DB::DunningConfig',
+      key_columns => { dunning_config_id => 'id' },
+    },
+
+    fee_interest_ar => {
+      class       => 'SL::DB::Invoice',
+      key_columns => { fee_interest_ar_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/DunningConfig.pm b/SL/DB/MetaSetup/DunningConfig.pm
new file mode 100644 (file)
index 0000000..c670265
--- /dev/null
@@ -0,0 +1,34 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::DunningConfig;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'dunning_config',
+
+  columns => [
+    id                       => { type => 'integer', not_null => 1, sequence => 'id' },
+    dunning_level            => { type => 'integer' },
+    dunning_description      => { type => 'text' },
+    active                   => { type => 'boolean' },
+    auto                     => { type => 'boolean' },
+    email                    => { type => 'boolean' },
+    terms                    => { type => 'integer' },
+    payment_terms            => { type => 'integer' },
+    fee                      => { type => 'numeric', precision => 5, scale => 15 },
+    interest_rate            => { type => 'numeric', precision => 5, scale => 15 },
+    email_body               => { type => 'text' },
+    email_subject            => { type => 'text' },
+    email_attachment         => { type => 'boolean' },
+    template                 => { type => 'text' },
+    create_invoices_for_fees => { type => 'boolean', default => 'true' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Employee.pm b/SL/DB/MetaSetup/Employee.pm
new file mode 100644 (file)
index 0000000..f86174f
--- /dev/null
@@ -0,0 +1,39 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Employee;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'employee',
+
+  columns => [
+    id        => { type => 'integer', not_null => 1, sequence => 'id' },
+    login     => { type => 'text' },
+    startdate => { type => 'date', default => 'now' },
+    enddate   => { type => 'date' },
+    notes     => { type => 'text' },
+    role      => { type => 'text' },
+    sales     => { type => 'boolean', default => 'true' },
+    itime     => { type => 'timestamp', default => 'now()' },
+    mtime     => { type => 'timestamp' },
+    name      => { type => 'text' },
+    addr1     => { type => 'text' },
+    addr2     => { type => 'text' },
+    addr3     => { type => 'text' },
+    addr4     => { type => 'text' },
+    homephone => { type => 'text' },
+    workphone => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  unique_key => [ 'login' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Exchangerate.pm b/SL/DB/MetaSetup/Exchangerate.pm
new file mode 100644 (file)
index 0000000..95ea23c
--- /dev/null
@@ -0,0 +1,28 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Exchangerate;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'exchangerate',
+
+  columns => [
+    curr      => { type => 'character', length => 3 },
+    transdate => { type => 'date' },
+    buy       => { type => 'numeric', precision => 5, scale => 15 },
+    sell      => { type => 'numeric', precision => 5, scale => 15 },
+    itime     => { type => 'timestamp', default => 'now()' },
+    mtime     => { type => 'timestamp' },
+    id        => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Finanzamt.pm b/SL/DB/MetaSetup/Finanzamt.pm
new file mode 100644 (file)
index 0000000..fa22919
--- /dev/null
@@ -0,0 +1,40 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Finanzamt;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'finanzamt',
+
+  columns => [
+    fa_land_nr           => { type => 'text' },
+    fa_bufa_nr           => { type => 'text' },
+    fa_name              => { type => 'text' },
+    fa_strasse           => { type => 'text' },
+    fa_plz               => { type => 'text' },
+    fa_ort               => { type => 'text' },
+    fa_telefon           => { type => 'text' },
+    fa_fax               => { type => 'text' },
+    fa_plz_grosskunden   => { type => 'text' },
+    fa_plz_postfach      => { type => 'text' },
+    fa_postfach          => { type => 'text' },
+    fa_blz_1             => { type => 'text' },
+    fa_kontonummer_1     => { type => 'text' },
+    fa_bankbezeichnung_1 => { type => 'text' },
+    fa_blz_2             => { type => 'text' },
+    fa_kontonummer_2     => { type => 'text' },
+    fa_bankbezeichnung_2 => { type => 'text' },
+    fa_oeffnungszeiten   => { type => 'text' },
+    fa_email             => { type => 'text' },
+    fa_internet          => { type => 'text' },
+    id                   => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/FollowUp.pm b/SL/DB/MetaSetup/FollowUp.pm
new file mode 100644 (file)
index 0000000..3e83f0e
--- /dev/null
@@ -0,0 +1,46 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::FollowUp;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'follow_ups',
+
+  columns => [
+    id               => { type => 'integer', not_null => 1, sequence => 'follow_up_id' },
+    follow_up_date   => { type => 'date', not_null => 1 },
+    created_for_user => { type => 'integer', not_null => 1 },
+    done             => { type => 'boolean', default => 'false' },
+    note_id          => { type => 'integer', not_null => 1 },
+    created_by       => { type => 'integer', not_null => 1 },
+    itime            => { type => 'timestamp', default => 'now()' },
+    mtime            => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { created_for_user => 'id' },
+    },
+
+    employee_obj => {
+      class       => 'SL::DB::Employee',
+      key_columns => { created_by => 'id' },
+    },
+
+    note => {
+      class       => 'SL::DB::Note',
+      key_columns => { note_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/FollowUpAccess.pm b/SL/DB/MetaSetup/FollowUpAccess.pm
new file mode 100644 (file)
index 0000000..0a26083
--- /dev/null
@@ -0,0 +1,34 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::FollowUpAccess;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'follow_up_access',
+
+  columns => [
+    who  => { type => 'integer', not_null => 1 },
+    what => { type => 'integer', not_null => 1 },
+    id   => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { who => 'id' },
+    },
+
+    employee_obj => {
+      class       => 'SL::DB::Employee',
+      key_columns => { what => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/FollowUpLink.pm b/SL/DB/MetaSetup/FollowUpLink.pm
new file mode 100644 (file)
index 0000000..7bfec7d
--- /dev/null
@@ -0,0 +1,35 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::FollowUpLink;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'follow_up_links',
+
+  columns => [
+    id           => { type => 'integer', not_null => 1, sequence => 'follow_up_link_id' },
+    follow_up_id => { type => 'integer', not_null => 1 },
+    trans_id     => { type => 'integer', not_null => 1 },
+    trans_type   => { type => 'text', not_null => 1 },
+    trans_info   => { type => 'text' },
+    itime        => { type => 'timestamp', default => 'now()' },
+    mtime        => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    follow_up => {
+      class       => 'SL::DB::FollowUp',
+      key_columns => { follow_up_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/GLTransaction.pm b/SL/DB/MetaSetup/GLTransaction.pm
new file mode 100644 (file)
index 0000000..a7d25f7
--- /dev/null
@@ -0,0 +1,44 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::GLTransaction;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'gl',
+
+  columns => [
+    id             => { type => 'integer', not_null => 1, sequence => 'glid' },
+    reference      => { type => 'text' },
+    description    => { type => 'text' },
+    transdate      => { type => 'date', default => 'now' },
+    gldate         => { type => 'date', default => 'now' },
+    employee_id    => { type => 'integer' },
+    notes          => { type => 'text' },
+    department_id  => { type => 'integer', default => '0' },
+    taxincluded    => { type => 'boolean' },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    type           => { type => 'text' },
+    storno         => { type => 'boolean', default => 'false' },
+    storno_id      => { type => 'integer' },
+    ob_transaction => { type => 'boolean' },
+    cb_transaction => { type => 'boolean' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    storno_obj => {
+      class       => 'SL::DB::GLTransaction',
+      key_columns => { storno_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/GenericTranslation.pm b/SL/DB/MetaSetup/GenericTranslation.pm
new file mode 100644 (file)
index 0000000..4522224
--- /dev/null
@@ -0,0 +1,31 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::GenericTranslation;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'generic_translations',
+
+  columns => [
+    id               => { type => 'serial', not_null => 1 },
+    language_id      => { type => 'integer' },
+    translation_type => { type => 'varchar', length => 100, not_null => 1 },
+    translation_id   => { type => 'integer' },
+    translation      => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    language => {
+      class       => 'SL::DB::Language',
+      key_columns => { language_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Gifi.pm b/SL/DB/MetaSetup/Gifi.pm
new file mode 100644 (file)
index 0000000..dc9c8b8
--- /dev/null
@@ -0,0 +1,24 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Gifi;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'gifi',
+
+  columns => [
+    accno       => { type => 'text' },
+    description => { type => 'text' },
+    id          => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  unique_key => [ 'accno' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/History.pm b/SL/DB/MetaSetup/History.pm
new file mode 100644 (file)
index 0000000..1146f8f
--- /dev/null
@@ -0,0 +1,35 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::History;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'history_erp',
+
+  columns => [
+    id          => { type => 'integer', not_null => 1, sequence => 'id' },
+    trans_id    => { type => 'integer' },
+    employee_id => { type => 'integer' },
+    addition    => { type => 'text' },
+    what_done   => { type => 'text' },
+    itime       => { type => 'timestamp', default => 'now()' },
+    snumbers    => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { employee_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Inventory.pm b/SL/DB/MetaSetup/Inventory.pm
new file mode 100644 (file)
index 0000000..e732f88
--- /dev/null
@@ -0,0 +1,70 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Inventory;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'inventory',
+
+  columns => [
+    warehouse_id  => { type => 'integer', not_null => 1 },
+    parts_id      => { type => 'integer', not_null => 1 },
+    oe_id         => { type => 'integer' },
+    orderitems_id => { type => 'integer' },
+    shippingdate  => { type => 'date' },
+    employee_id   => { type => 'integer', not_null => 1 },
+    itime         => { type => 'timestamp', default => 'now()' },
+    mtime         => { type => 'timestamp' },
+    bin_id        => { type => 'integer', not_null => 1 },
+    qty           => { type => 'numeric', precision => 5, scale => 25 },
+    trans_id      => { type => 'integer', not_null => 1 },
+    trans_type_id => { type => 'integer', not_null => 1 },
+    project_id    => { type => 'integer' },
+    chargenumber  => { type => 'text' },
+    comment       => { type => 'text' },
+    bestbefore    => { type => 'date' },
+    id            => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    bin => {
+      class       => 'SL::DB::Bin',
+      key_columns => { bin_id => 'id' },
+    },
+
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { employee_id => 'id' },
+    },
+
+    parts => {
+      class       => 'SL::DB::Part',
+      key_columns => { parts_id => 'id' },
+    },
+
+    project => {
+      class       => 'SL::DB::Project',
+      key_columns => { project_id => 'id' },
+    },
+
+    trans_type => {
+      class       => 'SL::DB::TransferType',
+      key_columns => { trans_type_id => 'id' },
+    },
+
+    warehouse => {
+      class       => 'SL::DB::Warehouse',
+      key_columns => { warehouse_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Invoice.pm b/SL/DB/MetaSetup/Invoice.pm
new file mode 100644 (file)
index 0000000..6269da9
--- /dev/null
@@ -0,0 +1,94 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Invoice;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'ar',
+
+  columns => [
+    id                      => { type => 'integer', not_null => 1, sequence => 'glid' },
+    invnumber               => { type => 'text', not_null => 1 },
+    transdate               => { type => 'date', default => 'now' },
+    gldate                  => { type => 'date', default => 'now' },
+    customer_id             => { type => 'integer' },
+    taxincluded             => { type => 'boolean' },
+    amount                  => { type => 'numeric', precision => 5, scale => 15 },
+    netamount               => { type => 'numeric', precision => 5, scale => 15 },
+    paid                    => { type => 'numeric', precision => 5, scale => 15 },
+    datepaid                => { type => 'date' },
+    duedate                 => { type => 'date' },
+    deliverydate            => { type => 'date' },
+    invoice                 => { type => 'boolean', default => 'false' },
+    shippingpoint           => { type => 'text' },
+    terms                   => { type => 'integer', default => '0' },
+    notes                   => { type => 'text' },
+    curr                    => { type => 'character', length => 3 },
+    ordnumber               => { type => 'text' },
+    employee_id             => { type => 'integer' },
+    quonumber               => { type => 'text' },
+    cusordnumber            => { type => 'text' },
+    intnotes                => { type => 'text' },
+    department_id           => { type => 'integer', default => '0' },
+    shipvia                 => { type => 'text' },
+    itime                   => { type => 'timestamp', default => 'now()' },
+    mtime                   => { type => 'timestamp' },
+    cp_id                   => { type => 'integer' },
+    language_id             => { type => 'integer' },
+    payment_id              => { type => 'integer' },
+    delivery_customer_id    => { type => 'integer' },
+    delivery_vendor_id      => { type => 'integer' },
+    storno                  => { type => 'boolean', default => 'false' },
+    taxzone_id              => { type => 'integer' },
+    shipto_id               => { type => 'integer' },
+    type                    => { type => 'text' },
+    dunning_config_id       => { type => 'integer' },
+    orddate                 => { type => 'date' },
+    quodate                 => { type => 'date' },
+    globalproject_id        => { type => 'integer' },
+    salesman_id             => { type => 'integer' },
+    transaction_description => { type => 'text' },
+    storno_id               => { type => 'integer' },
+    marge_total             => { type => 'numeric', precision => 5, scale => 15 },
+    marge_percent           => { type => 'numeric', precision => 5, scale => 15 },
+    notes_bottom            => { type => 'text' },
+    donumber                => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    customer => {
+      class       => 'SL::DB::Customer',
+      key_columns => { customer_id => 'id' },
+    },
+
+    dunning_config => {
+      class       => 'SL::DB::DunningConfig',
+      key_columns => { dunning_config_id => 'id' },
+    },
+
+    globalproject => {
+      class       => 'SL::DB::Project',
+      key_columns => { globalproject_id => 'id' },
+    },
+
+    salesman => {
+      class       => 'SL::DB::Employee',
+      key_columns => { salesman_id => 'id' },
+    },
+
+    storno_obj => {
+      class       => 'SL::DB::Invoice',
+      key_columns => { storno_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/InvoiceItem.pm b/SL/DB/MetaSetup/InvoiceItem.pm
new file mode 100644 (file)
index 0000000..9a851e0
--- /dev/null
@@ -0,0 +1,57 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::InvoiceItem;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'invoice',
+
+  columns => [
+    id                 => { type => 'integer', not_null => 1, sequence => 'invoiceid' },
+    trans_id           => { type => 'integer' },
+    parts_id           => { type => 'integer' },
+    description        => { type => 'text' },
+    qty                => { type => 'float', precision => 4 },
+    allocated          => { type => 'float', precision => 4 },
+    sellprice          => { type => 'numeric', precision => 5, scale => 15 },
+    fxsellprice        => { type => 'numeric', precision => 5, scale => 15 },
+    discount           => { type => 'float', precision => 4 },
+    assemblyitem       => { type => 'boolean', default => 'false' },
+    project_id         => { type => 'integer' },
+    deliverydate       => { type => 'date' },
+    serialnumber       => { type => 'text' },
+    itime              => { type => 'timestamp', default => 'now()' },
+    mtime              => { type => 'timestamp' },
+    pricegroup_id      => { type => 'integer' },
+    ordnumber          => { type => 'text' },
+    transdate          => { type => 'text' },
+    cusordnumber       => { type => 'text' },
+    unit               => { type => 'varchar', length => 20 },
+    base_qty           => { type => 'float', precision => 4 },
+    subtotal           => { type => 'boolean', default => 'false' },
+    longdescription    => { type => 'text' },
+    marge_total        => { type => 'numeric', precision => 5, scale => 15 },
+    marge_percent      => { type => 'numeric', precision => 5, scale => 15 },
+    lastcost           => { type => 'numeric', precision => 5, scale => 15 },
+    price_factor_id    => { type => 'integer' },
+    price_factor       => { type => 'numeric', default => 1, precision => 5, scale => 15 },
+    marge_price_factor => { type => 'numeric', default => 1, precision => 5, scale => 15 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    parts => {
+      class       => 'SL::DB::Part',
+      key_columns => { parts_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Language.pm b/SL/DB/MetaSetup/Language.pm
new file mode 100644 (file)
index 0000000..662abc9
--- /dev/null
@@ -0,0 +1,30 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Language;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'language',
+
+  columns => [
+    id                  => { type => 'integer', not_null => 1, sequence => 'id' },
+    description         => { type => 'text' },
+    template_code       => { type => 'text' },
+    article_code        => { type => 'text' },
+    itime               => { type => 'timestamp', default => 'now()' },
+    mtime               => { type => 'timestamp' },
+    output_numberformat => { type => 'text' },
+    output_dateformat   => { type => 'text' },
+    output_longdates    => { type => 'boolean' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Licemse.pm b/SL/DB/MetaSetup/Licemse.pm
new file mode 100644 (file)
index 0000000..aea45d2
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Licemse;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'license',
+
+  columns => [
+    id            => { type => 'integer', not_null => 1, sequence => 'id' },
+    parts_id      => { type => 'integer' },
+    customer_id   => { type => 'integer' },
+    comment       => { type => 'text' },
+    validuntil    => { type => 'date' },
+    issuedate     => { type => 'date', default => 'now' },
+    quantity      => { type => 'integer' },
+    licensenumber => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/License.pm b/SL/DB/MetaSetup/License.pm
new file mode 100644 (file)
index 0000000..6ea5da5
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::License;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'license',
+
+  columns => [
+    id            => { type => 'integer', not_null => 1, sequence => 'id' },
+    parts_id      => { type => 'integer' },
+    customer_id   => { type => 'integer' },
+    comment       => { type => 'text' },
+    validuntil    => { type => 'date' },
+    issuedate     => { type => 'date', default => 'now' },
+    quantity      => { type => 'integer' },
+    licensenumber => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/LicenseInvoice.pm b/SL/DB/MetaSetup/LicenseInvoice.pm
new file mode 100644 (file)
index 0000000..b14f2ca
--- /dev/null
@@ -0,0 +1,22 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::LicenseInvoice;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'licenseinvoice',
+
+  columns => [
+    trans_id   => { type => 'integer' },
+    license_id => { type => 'integer' },
+    id         => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/MakeModel.pm b/SL/DB/MetaSetup/MakeModel.pm
new file mode 100644 (file)
index 0000000..cc0ae7f
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::MakeModel;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'makemodel',
+
+  columns => [
+    parts_id => { type => 'integer' },
+    model    => { type => 'text' },
+    itime    => { type => 'timestamp', default => 'now()' },
+    mtime    => { type => 'timestamp' },
+    make     => { type => 'integer' },
+    id       => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Note.pm b/SL/DB/MetaSetup/Note.pm
new file mode 100644 (file)
index 0000000..a055c02
--- /dev/null
@@ -0,0 +1,36 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Note;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'notes',
+
+  columns => [
+    id           => { type => 'integer', not_null => 1, sequence => 'note_id' },
+    subject      => { type => 'text' },
+    body         => { type => 'text' },
+    created_by   => { type => 'integer', not_null => 1 },
+    trans_id     => { type => 'integer' },
+    trans_module => { type => 'varchar', length => 10 },
+    itime        => { type => 'timestamp', default => 'now()' },
+    mtime        => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { created_by => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Order.pm b/SL/DB/MetaSetup/Order.pm
new file mode 100644 (file)
index 0000000..914918d
--- /dev/null
@@ -0,0 +1,81 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Order;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'oe',
+
+  columns => [
+    id                      => { type => 'integer', not_null => 1, sequence => 'id' },
+    ordnumber               => { type => 'text', not_null => 1 },
+    transdate               => { type => 'date', default => 'now' },
+    vendor_id               => { type => 'integer' },
+    customer_id             => { type => 'integer' },
+    amount                  => { type => 'numeric', precision => 5, scale => 15 },
+    netamount               => { type => 'numeric', precision => 5, scale => 15 },
+    reqdate                 => { type => 'date' },
+    taxincluded             => { type => 'boolean' },
+    shippingpoint           => { type => 'text' },
+    notes                   => { type => 'text' },
+    curr                    => { type => 'character', length => 3 },
+    employee_id             => { type => 'integer' },
+    closed                  => { type => 'boolean', default => 'false' },
+    quotation               => { type => 'boolean', default => 'false' },
+    quonumber               => { type => 'text' },
+    cusordnumber            => { type => 'text' },
+    intnotes                => { type => 'text' },
+    department_id           => { type => 'integer', default => '0' },
+    itime                   => { type => 'timestamp', default => 'now()' },
+    mtime                   => { type => 'timestamp' },
+    shipvia                 => { type => 'text' },
+    cp_id                   => { type => 'integer' },
+    language_id             => { type => 'integer' },
+    payment_id              => { type => 'integer' },
+    delivery_customer_id    => { type => 'integer' },
+    delivery_vendor_id      => { type => 'integer' },
+    taxzone_id              => { type => 'integer' },
+    proforma                => { type => 'boolean', default => 'false' },
+    shipto_id               => { type => 'integer' },
+    delivered               => { type => 'boolean', default => 'false' },
+    globalproject_id        => { type => 'integer' },
+    salesman_id             => { type => 'integer' },
+    transaction_description => { type => 'text' },
+    marge_total             => { type => 'numeric', precision => 5, scale => 15 },
+    marge_percent           => { type => 'numeric', precision => 5, scale => 15 },
+    notes_bottom            => { type => 'text' },
+    project_manager_id      => { type => 'integer' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { employee_id => 'id' },
+    },
+
+    globalproject => {
+      class       => 'SL::DB::Project',
+      key_columns => { globalproject_id => 'id' },
+    },
+
+    project_manager => {
+      class       => 'SL::DB::Employee',
+      key_columns => { project_manager_id => 'id' },
+    },
+
+    salesman => {
+      class       => 'SL::DB::Employee',
+      key_columns => { salesman_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/OrderItem.pm b/SL/DB/MetaSetup/OrderItem.pm
new file mode 100644 (file)
index 0000000..3f048c3
--- /dev/null
@@ -0,0 +1,55 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::OrderItem;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'orderitems',
+
+  columns => [
+    trans_id           => { type => 'integer' },
+    parts_id           => { type => 'integer' },
+    description        => { type => 'text' },
+    qty                => { type => 'float', precision => 4 },
+    sellprice          => { type => 'numeric', precision => 5, scale => 15 },
+    discount           => { type => 'float', precision => 4 },
+    project_id         => { type => 'integer' },
+    reqdate            => { type => 'date' },
+    ship               => { type => 'float', precision => 4 },
+    serialnumber       => { type => 'text' },
+    id                 => { type => 'integer', not_null => 1, sequence => 'orderitemsid' },
+    itime              => { type => 'timestamp', default => 'now()' },
+    mtime              => { type => 'timestamp' },
+    pricegroup_id      => { type => 'integer' },
+    ordnumber          => { type => 'text' },
+    transdate          => { type => 'text' },
+    cusordnumber       => { type => 'text' },
+    unit               => { type => 'varchar', length => 20 },
+    base_qty           => { type => 'float', precision => 4 },
+    subtotal           => { type => 'boolean', default => 'false' },
+    longdescription    => { type => 'text' },
+    marge_total        => { type => 'numeric', precision => 5, scale => 15 },
+    marge_percent      => { type => 'numeric', precision => 5, scale => 15 },
+    lastcost           => { type => 'numeric', precision => 5, scale => 15 },
+    price_factor_id    => { type => 'integer' },
+    price_factor       => { type => 'numeric', default => 1, precision => 5, scale => 15 },
+    marge_price_factor => { type => 'numeric', default => 1, precision => 5, scale => 15 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    parts => {
+      class       => 'SL::DB::Part',
+      key_columns => { parts_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Part.pm b/SL/DB/MetaSetup/Part.pm
new file mode 100644 (file)
index 0000000..d6814e8
--- /dev/null
@@ -0,0 +1,66 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Part;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'parts',
+
+  columns => [
+    id                 => { type => 'integer', not_null => 1, sequence => 'id' },
+    partnumber         => { type => 'text', not_null => 1 },
+    description        => { type => 'text' },
+    listprice          => { type => 'numeric', precision => 5, scale => 15 },
+    sellprice          => { type => 'numeric', precision => 5, scale => 15 },
+    lastcost           => { type => 'numeric', precision => 5, scale => 15 },
+    priceupdate        => { type => 'date', default => 'now' },
+    weight             => { type => 'float', precision => 4 },
+    notes              => { type => 'text' },
+    makemodel          => { type => 'boolean', default => 'false' },
+    assembly           => { type => 'boolean', default => 'false' },
+    alternate          => { type => 'boolean', default => 'false' },
+    rop                => { type => 'float', precision => 4 },
+    inventory_accno_id => { type => 'integer' },
+    income_accno_id    => { type => 'integer' },
+    expense_accno_id   => { type => 'integer' },
+    bin                => { type => 'text' },
+    shop               => { type => 'boolean', default => 'false' },
+    obsolete           => { type => 'boolean', default => 'false' },
+    bom                => { type => 'boolean', default => 'false' },
+    image              => { type => 'text' },
+    drawing            => { type => 'text' },
+    microfiche         => { type => 'text' },
+    partsgroup_id      => { type => 'integer' },
+    ve                 => { type => 'integer' },
+    gv                 => { type => 'numeric', precision => 5, scale => 15 },
+    itime              => { type => 'timestamp', default => 'now()' },
+    mtime              => { type => 'timestamp' },
+    unit               => { type => 'varchar', length => 20, not_null => 1 },
+    formel             => { type => 'text' },
+    not_discountable   => { type => 'boolean', default => 'false' },
+    buchungsgruppen_id => { type => 'integer' },
+    payment_id         => { type => 'integer' },
+    ean                => { type => 'text' },
+    price_factor_id    => { type => 'integer' },
+    onhand             => { type => 'numeric', default => '0', precision => 5, scale => 25 },
+    stockable          => { type => 'boolean', default => 'false' },
+    has_sernumber      => { type => 'boolean', default => 'false' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    buchungsgruppen => {
+      class       => 'SL::DB::Buchungsgruppe',
+      key_columns => { buchungsgruppen_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/PartsGroup.pm b/SL/DB/MetaSetup/PartsGroup.pm
new file mode 100644 (file)
index 0000000..166f2b8
--- /dev/null
@@ -0,0 +1,25 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::PartsGroup;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'partsgroup',
+
+  columns => [
+    id         => { type => 'integer', not_null => 1, sequence => 'id' },
+    partsgroup => { type => 'text' },
+    itime      => { type => 'timestamp', default => 'now()' },
+    mtime      => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/PartsTax.pm b/SL/DB/MetaSetup/PartsTax.pm
new file mode 100644 (file)
index 0000000..9bcdb5d
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::PartsTax;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'partstax',
+
+  columns => [
+    parts_id => { type => 'integer' },
+    chart_id => { type => 'integer' },
+    itime    => { type => 'timestamp', default => 'now()' },
+    mtime    => { type => 'timestamp' },
+    id       => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/PaymentTerm.pm b/SL/DB/MetaSetup/PaymentTerm.pm
new file mode 100644 (file)
index 0000000..4e18f5d
--- /dev/null
@@ -0,0 +1,31 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::PaymentTerm;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'payment_terms',
+
+  columns => [
+    id               => { type => 'integer', not_null => 1, sequence => 'id' },
+    description      => { type => 'text' },
+    description_long => { type => 'text' },
+    terms_netto      => { type => 'integer' },
+    terms_skonto     => { type => 'integer' },
+    percent_skonto   => { type => 'float', precision => 4 },
+    itime            => { type => 'timestamp', default => 'now()' },
+    mtime            => { type => 'timestamp' },
+    ranking          => { type => 'integer' },
+    sortkey          => { type => 'integer', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/PriceFactor.pm b/SL/DB/MetaSetup/PriceFactor.pm
new file mode 100644 (file)
index 0000000..2eeb596
--- /dev/null
@@ -0,0 +1,23 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::PriceFactor;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'price_factors',
+
+  columns => [
+    id          => { type => 'integer', not_null => 1, sequence => 'id' },
+    description => { type => 'text' },
+    factor      => { type => 'numeric', precision => 5, scale => 15 },
+    sortkey     => { type => 'integer' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Pricegroup.pm b/SL/DB/MetaSetup/Pricegroup.pm
new file mode 100644 (file)
index 0000000..09ce093
--- /dev/null
@@ -0,0 +1,21 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Pricegroup;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'pricegroup',
+
+  columns => [
+    id         => { type => 'integer', not_null => 1, sequence => 'id' },
+    pricegroup => { type => 'text', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Prices.pm b/SL/DB/MetaSetup/Prices.pm
new file mode 100644 (file)
index 0000000..819d14c
--- /dev/null
@@ -0,0 +1,35 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Prices;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'prices',
+
+  columns => [
+    parts_id      => { type => 'integer' },
+    pricegroup_id => { type => 'integer' },
+    price         => { type => 'numeric', precision => 5, scale => 15 },
+    id            => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    parts => {
+      class       => 'SL::DB::Part',
+      key_columns => { parts_id => 'id' },
+    },
+
+    pricegroup => {
+      class       => 'SL::DB::Pricegroup',
+      key_columns => { pricegroup_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Printer.pm b/SL/DB/MetaSetup/Printer.pm
new file mode 100644 (file)
index 0000000..fc2446a
--- /dev/null
@@ -0,0 +1,23 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Printer;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'printers',
+
+  columns => [
+    id                  => { type => 'integer', not_null => 1, sequence => 'id' },
+    printer_description => { type => 'text', not_null => 1 },
+    printer_command     => { type => 'text' },
+    template_code       => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Project.pm b/SL/DB/MetaSetup/Project.pm
new file mode 100644 (file)
index 0000000..6b3ab91
--- /dev/null
@@ -0,0 +1,29 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Project;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'project',
+
+  columns => [
+    id            => { type => 'integer', not_null => 1, sequence => 'id' },
+    projectnumber => { type => 'text' },
+    description   => { type => 'text' },
+    itime         => { type => 'timestamp', default => 'now()' },
+    mtime         => { type => 'timestamp' },
+    active        => { type => 'boolean', default => 'true' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  unique_key => [ 'projectnumber' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/PurchaseInvoice.pm b/SL/DB/MetaSetup/PurchaseInvoice.pm
new file mode 100644 (file)
index 0000000..0ea9d10
--- /dev/null
@@ -0,0 +1,72 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::PurchaseInvoice;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'ap',
+
+  columns => [
+    id                      => { type => 'integer', not_null => 1, sequence => 'glid' },
+    invnumber               => { type => 'text', not_null => 1 },
+    transdate               => { type => 'date', default => 'now' },
+    gldate                  => { type => 'date', default => 'now' },
+    vendor_id               => { type => 'integer' },
+    taxincluded             => { type => 'boolean', default => 'false' },
+    amount                  => { type => 'numeric', precision => 5, scale => 15 },
+    netamount               => { type => 'numeric', precision => 5, scale => 15 },
+    paid                    => { type => 'numeric', precision => 5, scale => 15 },
+    datepaid                => { type => 'date' },
+    duedate                 => { type => 'date' },
+    invoice                 => { type => 'boolean', default => 'false' },
+    ordnumber               => { type => 'text' },
+    curr                    => { type => 'character', length => 3 },
+    notes                   => { type => 'text' },
+    employee_id             => { type => 'integer' },
+    quonumber               => { type => 'text' },
+    intnotes                => { type => 'text' },
+    department_id           => { type => 'integer', default => '0' },
+    itime                   => { type => 'timestamp', default => 'now()' },
+    mtime                   => { type => 'timestamp' },
+    shipvia                 => { type => 'text' },
+    cp_id                   => { type => 'integer' },
+    language_id             => { type => 'integer' },
+    payment_id              => { type => 'integer' },
+    storno                  => { type => 'boolean', default => 'false' },
+    taxzone_id              => { type => 'integer' },
+    type                    => { type => 'text' },
+    orddate                 => { type => 'date' },
+    quodate                 => { type => 'date' },
+    globalproject_id        => { type => 'integer' },
+    transaction_description => { type => 'text' },
+    storno_id               => { type => 'integer' },
+    notes_bottom            => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    globalproject => {
+      class       => 'SL::DB::Project',
+      key_columns => { globalproject_id => 'id' },
+    },
+
+    storno_obj => {
+      class       => 'SL::DB::PurchaseInvoice',
+      key_columns => { storno_id => 'id' },
+    },
+
+    vendor => {
+      class       => 'SL::DB::Vendor',
+      key_columns => { vendor_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/RMA.pm b/SL/DB/MetaSetup/RMA.pm
new file mode 100644 (file)
index 0000000..20790e3
--- /dev/null
@@ -0,0 +1,48 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::RMA;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'rma',
+
+  columns => [
+    id                   => { type => 'integer', not_null => 1, sequence => 'id' },
+    rmanumber            => { type => 'text', not_null => 1 },
+    transdate            => { type => 'date', default => 'now' },
+    vendor_id            => { type => 'integer' },
+    customer_id          => { type => 'integer' },
+    amount               => { type => 'numeric', precision => 5, scale => 15 },
+    netamount            => { type => 'numeric', precision => 5, scale => 15 },
+    reqdate              => { type => 'date' },
+    taxincluded          => { type => 'boolean' },
+    shippingpoint        => { type => 'text' },
+    notes                => { type => 'text' },
+    curr                 => { type => 'character', length => 3 },
+    employee_id          => { type => 'integer' },
+    closed               => { type => 'boolean', default => 'false' },
+    quotation            => { type => 'boolean', default => 'false' },
+    quonumber            => { type => 'text' },
+    cusrmanumber         => { type => 'text' },
+    intnotes             => { type => 'text' },
+    delivery_customer_id => { type => 'integer' },
+    delivery_vendor_id   => { type => 'integer' },
+    language_id          => { type => 'integer' },
+    payment_id           => { type => 'integer' },
+    department_id        => { type => 'integer', default => '0' },
+    itime                => { type => 'timestamp', default => 'now()' },
+    mtime                => { type => 'timestamp' },
+    shipvia              => { type => 'text' },
+    cp_id                => { type => 'integer' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/RMAItem.pm b/SL/DB/MetaSetup/RMAItem.pm
new file mode 100644 (file)
index 0000000..dd32700
--- /dev/null
@@ -0,0 +1,47 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::RMAItem;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'rmaitems',
+
+  columns => [
+    trans_id      => { type => 'integer' },
+    parts_id      => { type => 'integer' },
+    description   => { type => 'text' },
+    qty           => { type => 'float', precision => 4 },
+    base_qty      => { type => 'float', precision => 4 },
+    sellprice     => { type => 'numeric', precision => 5, scale => 15 },
+    discount      => { type => 'float', precision => 4 },
+    project_id    => { type => 'integer' },
+    reqdate       => { type => 'date' },
+    ship          => { type => 'float', precision => 4 },
+    serialnumber  => { type => 'text' },
+    id            => { type => 'integer', not_null => 1, sequence => 'orderitemsid' },
+    itime         => { type => 'timestamp', default => 'now()' },
+    mtime         => { type => 'timestamp' },
+    pricegroup_id => { type => 'integer' },
+    rmanumber     => { type => 'text' },
+    transdate     => { type => 'text' },
+    cusrmanumber  => { type => 'text' },
+    unit          => { type => 'varchar', length => 20 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    parts => {
+      class       => 'SL::DB::Part',
+      key_columns => { parts_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/RecordLink.pm b/SL/DB/MetaSetup/RecordLink.pm
new file mode 100644 (file)
index 0000000..4059be8
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::RecordLink;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'record_links',
+
+  columns => [
+    from_table => { type => 'varchar', length => 50, not_null => 1 },
+    from_id    => { type => 'integer', not_null => 1 },
+    to_table   => { type => 'varchar', length => 50, not_null => 1 },
+    to_id      => { type => 'integer', not_null => 1 },
+    itime      => { type => 'timestamp', default => 'now()' },
+    id         => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/SchemaInfo.pm b/SL/DB/MetaSetup/SchemaInfo.pm
new file mode 100644 (file)
index 0000000..0a1e70e
--- /dev/null
@@ -0,0 +1,24 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::SchemaInfo;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'schema_info',
+
+  columns => [
+    tag   => { type => 'text', not_null => 1 },
+    login => { type => 'text' },
+    itime => { type => 'timestamp', default => 'now()' },
+  ],
+
+  primary_key_columns => [ 'tag' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/SepaExport.pm b/SL/DB/MetaSetup/SepaExport.pm
new file mode 100644 (file)
index 0000000..943121a
--- /dev/null
@@ -0,0 +1,33 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::SepaExport;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'sepa_export',
+
+  columns => [
+    id          => { type => 'serial', not_null => 1 },
+    employee_id => { type => 'integer', not_null => 1 },
+    executed    => { type => 'boolean', default => 'false' },
+    closed      => { type => 'boolean', default => 'false' },
+    itime       => { type => 'timestamp', default => 'now()' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+
+  foreign_keys => [
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { employee_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/SepaExportItem.pm b/SL/DB/MetaSetup/SepaExportItem.pm
new file mode 100644 (file)
index 0000000..b9899c2
--- /dev/null
@@ -0,0 +1,50 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::SepaExportItem;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'sepa_export_items',
+
+  columns => [
+    id                       => { type => 'integer', not_null => 1, sequence => 'id' },
+    sepa_export_id           => { type => 'integer', not_null => 1 },
+    ap_id                    => { type => 'integer', not_null => 1 },
+    chart_id                 => { type => 'integer', not_null => 1 },
+    amount                   => { type => 'numeric', precision => 5, scale => 25 },
+    reference                => { type => 'varchar', length => 35 },
+    requested_execution_date => { type => 'date' },
+    executed                 => { type => 'boolean', default => 'false' },
+    execution_date           => { type => 'date' },
+    our_iban                 => { type => 'varchar', length => 100 },
+    our_bic                  => { type => 'varchar', length => 100 },
+    vendor_iban              => { type => 'varchar', length => 100 },
+    vendor_bic               => { type => 'varchar', length => 100 },
+    end_to_end_id            => { type => 'varchar', length => 35 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    ap => {
+      class       => 'SL::DB::PurchaseInvoice',
+      key_columns => { ap_id => 'id' },
+    },
+
+    chart => {
+      class       => 'SL::DB::Chart',
+      key_columns => { chart_id => 'id' },
+    },
+
+    sepa_export => {
+      class       => 'SL::DB::SepaExport',
+      key_columns => { sepa_export_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Shipto.pm b/SL/DB/MetaSetup/Shipto.pm
new file mode 100644 (file)
index 0000000..0943c04
--- /dev/null
@@ -0,0 +1,37 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Shipto;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'shipto',
+
+  columns => [
+    trans_id           => { type => 'integer' },
+    shiptoname         => { type => 'varchar', length => 75 },
+    shiptodepartment_1 => { type => 'varchar', length => 75 },
+    shiptodepartment_2 => { type => 'varchar', length => 75 },
+    shiptostreet       => { type => 'varchar', length => 75 },
+    shiptozipcode      => { type => 'varchar', length => 75 },
+    shiptocity         => { type => 'varchar', length => 75 },
+    shiptocountry      => { type => 'varchar', length => 75 },
+    shiptocontact      => { type => 'varchar', length => 75 },
+    shiptophone        => { type => 'varchar', length => 30 },
+    shiptofax          => { type => 'varchar', length => 30 },
+    shiptoemail        => { type => 'text' },
+    itime              => { type => 'timestamp', default => 'now()' },
+    mtime              => { type => 'timestamp' },
+    module             => { type => 'text' },
+    shipto_id          => { type => 'integer', not_null => 1, sequence => 'id' },
+  ],
+
+  primary_key_columns => [ 'shipto_id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Status.pm b/SL/DB/MetaSetup/Status.pm
new file mode 100644 (file)
index 0000000..c916a78
--- /dev/null
@@ -0,0 +1,30 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Status;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'status',
+
+  columns => [
+    trans_id  => { type => 'integer' },
+    formname  => { type => 'text' },
+    printed   => { type => 'boolean', default => 'false' },
+    emailed   => { type => 'boolean', default => 'false' },
+    spoolfile => { type => 'text' },
+    chart_id  => { type => 'integer' },
+    itime     => { type => 'timestamp', default => 'now()' },
+    mtime     => { type => 'timestamp' },
+    id        => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Tax.pm b/SL/DB/MetaSetup/Tax.pm
new file mode 100644 (file)
index 0000000..793b649
--- /dev/null
@@ -0,0 +1,29 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Tax;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'tax',
+
+  columns => [
+    chart_id       => { type => 'integer' },
+    rate           => { type => 'numeric', precision => 5, scale => 15 },
+    taxnumber      => { type => 'text' },
+    taxkey         => { type => 'integer' },
+    taxdescription => { type => 'text' },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    id             => { type => 'integer', not_null => 1, sequence => 'id' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/TaxKey.pm b/SL/DB/MetaSetup/TaxKey.pm
new file mode 100644 (file)
index 0000000..087903f
--- /dev/null
@@ -0,0 +1,32 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::TaxKey;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'taxkeys',
+
+  columns => [
+    id        => { type => 'integer', not_null => 1, sequence => 'id' },
+    chart_id  => { type => 'integer' },
+    tax_id    => { type => 'integer' },
+    taxkey_id => { type => 'integer' },
+    pos_ustva => { type => 'integer' },
+    startdate => { type => 'date' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    tax => {
+      class       => 'SL::DB::Tax',
+      key_columns => { tax_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/TaxZone.pm b/SL/DB/MetaSetup/TaxZone.pm
new file mode 100644 (file)
index 0000000..5823d68
--- /dev/null
@@ -0,0 +1,21 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::TaxZone;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'tax_zones',
+
+  columns => [
+    id          => { type => 'integer', not_null => 1 },
+    description => { type => 'text' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Taxkey.pm b/SL/DB/MetaSetup/Taxkey.pm
new file mode 100644 (file)
index 0000000..558163f
--- /dev/null
@@ -0,0 +1,32 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Taxkey;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'taxkeys',
+
+  columns => [
+    id        => { type => 'integer', not_null => 1, sequence => 'id' },
+    chart_id  => { type => 'integer' },
+    tax_id    => { type => 'integer' },
+    taxkey_id => { type => 'integer' },
+    pos_ustva => { type => 'integer' },
+    startdate => { type => 'date' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    tax => {
+      class       => 'SL::DB::Tax',
+      key_columns => { tax_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/TodoUserConfig.pm b/SL/DB/MetaSetup/TodoUserConfig.pm
new file mode 100644 (file)
index 0000000..2be46cd
--- /dev/null
@@ -0,0 +1,33 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::TodoUserConfig;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'todo_user_config',
+
+  columns => [
+    employee_id                         => { type => 'integer', not_null => 1 },
+    show_after_login                    => { type => 'boolean', default => 'true' },
+    show_follow_ups                     => { type => 'boolean', default => 'true' },
+    show_follow_ups_login               => { type => 'boolean', default => 'true' },
+    show_overdue_sales_quotations       => { type => 'boolean', default => 'true' },
+    show_overdue_sales_quotations_login => { type => 'boolean', default => 'true' },
+    id                                  => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    employee => {
+      class       => 'SL::DB::Employee',
+      key_columns => { employee_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/TransferType.pm b/SL/DB/MetaSetup/TransferType.pm
new file mode 100644 (file)
index 0000000..1f018bf
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::TransferType;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'transfer_type',
+
+  columns => [
+    id          => { type => 'integer', not_null => 1, sequence => 'id' },
+    direction   => { type => 'varchar', length => 10, not_null => 1 },
+    description => { type => 'text' },
+    sortkey     => { type => 'integer' },
+    itime       => { type => 'timestamp', default => 'now()' },
+    mtime       => { type => 'timestamp' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Translation.pm b/SL/DB/MetaSetup/Translation.pm
new file mode 100644 (file)
index 0000000..acd9606
--- /dev/null
@@ -0,0 +1,28 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Translation;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'translation',
+
+  columns => [
+    parts_id        => { type => 'integer' },
+    language_id     => { type => 'integer' },
+    translation     => { type => 'text' },
+    itime           => { type => 'timestamp', default => 'now()' },
+    mtime           => { type => 'timestamp' },
+    longdescription => { type => 'text' },
+    id              => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/TranslationPaymentTerm.pm b/SL/DB/MetaSetup/TranslationPaymentTerm.pm
new file mode 100644 (file)
index 0000000..9f1fa1c
--- /dev/null
@@ -0,0 +1,35 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::TranslationPaymentTerm;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'translation_payment_terms',
+
+  columns => [
+    payment_terms_id => { type => 'integer', not_null => 1 },
+    language_id      => { type => 'integer', not_null => 1 },
+    description_long => { type => 'text' },
+    id               => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    language => {
+      class       => 'SL::DB::Language',
+      key_columns => { language_id => 'id' },
+    },
+
+    payment_terms => {
+      class       => 'SL::DB::PaymentTerm',
+      key_columns => { payment_terms_id => 'id' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Unit.pm b/SL/DB/MetaSetup/Unit.pm
new file mode 100644 (file)
index 0000000..c229462
--- /dev/null
@@ -0,0 +1,31 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Unit;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'units',
+
+  columns => [
+    name      => { type => 'varchar', length => 20, not_null => 1 },
+    base_unit => { type => 'varchar', length => 20 },
+    factor    => { type => 'numeric', precision => 5, scale => 20 },
+    type      => { type => 'varchar', length => 20 },
+    sortkey   => { type => 'integer', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'name' ],
+
+  foreign_keys => [
+    unit => {
+      class       => 'SL::DB::Unit',
+      key_columns => { base_unit => 'name' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/UnitsLanguage.pm b/SL/DB/MetaSetup/UnitsLanguage.pm
new file mode 100644 (file)
index 0000000..cd00dc8
--- /dev/null
@@ -0,0 +1,36 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::UnitsLanguage;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'units_language',
+
+  columns => [
+    unit             => { type => 'varchar', length => 20, not_null => 1 },
+    language_id      => { type => 'integer', not_null => 1 },
+    localized        => { type => 'varchar', length => 20 },
+    localized_plural => { type => 'varchar', length => 20 },
+    id               => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  foreign_keys => [
+    language => {
+      class       => 'SL::DB::Language',
+      key_columns => { language_id => 'id' },
+    },
+
+    unit_obj => {
+      class       => 'SL::DB::Unit',
+      key_columns => { unit => 'name' },
+    },
+  ],
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Vendor.pm b/SL/DB/MetaSetup/Vendor.pm
new file mode 100644 (file)
index 0000000..6d858e5
--- /dev/null
@@ -0,0 +1,65 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Vendor;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'vendor',
+
+  columns => [
+    id             => { type => 'integer', not_null => 1, sequence => 'id' },
+    name           => { type => 'varchar', length => 75, not_null => 1 },
+    department_1   => { type => 'varchar', length => 75 },
+    department_2   => { type => 'varchar', length => 75 },
+    street         => { type => 'varchar', length => 75 },
+    zipcode        => { type => 'varchar', length => 10 },
+    city           => { type => 'varchar', length => 75 },
+    country        => { type => 'varchar', length => 75 },
+    contact        => { type => 'varchar', length => 75 },
+    phone          => { type => 'varchar', length => 30 },
+    fax            => { type => 'varchar', length => 30 },
+    homepage       => { type => 'text' },
+    email          => { type => 'text' },
+    notes          => { type => 'text' },
+    terms          => { type => 'integer', default => '0' },
+    taxincluded    => { type => 'boolean' },
+    vendornumber   => { type => 'text' },
+    cc             => { type => 'text' },
+    bcc            => { type => 'text' },
+    gifi_accno     => { type => 'text' },
+    business_id    => { type => 'integer' },
+    taxnumber      => { type => 'text' },
+    discount       => { type => 'float', precision => 4 },
+    creditlimit    => { type => 'numeric', precision => 5, scale => 15 },
+    account_number => { type => 'varchar', length => 15 },
+    bank_code      => { type => 'varchar', length => 10 },
+    bank           => { type => 'text' },
+    language       => { type => 'varchar', length => 5 },
+    datevexport    => { type => 'integer' },
+    itime          => { type => 'timestamp', default => 'now()' },
+    mtime          => { type => 'timestamp' },
+    obsolete       => { type => 'boolean', default => 'false' },
+    username       => { type => 'varchar', length => 50 },
+    user_password  => { type => 'varchar', length => 12 },
+    salesman_id    => { type => 'integer' },
+    v_customer_id  => { type => 'text' },
+    language_id    => { type => 'integer' },
+    payment_id     => { type => 'integer' },
+    taxzone_id     => { type => 'integer', default => '0', not_null => 1 },
+    greeting       => { type => 'text' },
+    ustid          => { type => 'varchar', length => 14 },
+    direct_debit   => { type => 'boolean', default => 'false' },
+    iban           => { type => 'varchar', length => 100 },
+    bic            => { type => 'varchar', length => 100 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/VendorTax.pm b/SL/DB/MetaSetup/VendorTax.pm
new file mode 100644 (file)
index 0000000..bbd3988
--- /dev/null
@@ -0,0 +1,26 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::VendorTax;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'vendortax',
+
+  columns => [
+    vendor_id => { type => 'integer' },
+    chart_id  => { type => 'integer' },
+    itime     => { type => 'timestamp', default => 'now()' },
+    mtime     => { type => 'timestamp' },
+    id        => { type => 'serial', not_null => 1 },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/MetaSetup/Warehouse.pm b/SL/DB/MetaSetup/Warehouse.pm
new file mode 100644 (file)
index 0000000..0638b06
--- /dev/null
@@ -0,0 +1,27 @@
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by rose_auto_create_model.pl automatically.
+package SL::DB::Warehouse;
+
+use strict;
+
+use base qw(SL::DB::Object);
+
+__PACKAGE__->meta->setup(
+  table   => 'warehouse',
+
+  columns => [
+    id          => { type => 'integer', not_null => 1, sequence => 'id' },
+    description => { type => 'text' },
+    itime       => { type => 'timestamp', default => 'now()' },
+    mtime       => { type => 'timestamp' },
+    sortkey     => { type => 'integer' },
+    invalid     => { type => 'boolean' },
+  ],
+
+  primary_key_columns => [ 'id' ],
+
+  allow_inline_column_values => 1,
+);
+
+1;
+;
diff --git a/SL/DB/Note.pm b/SL/DB/Note.pm
new file mode 100644 (file)
index 0000000..3678295
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Note;
+
+use strict;
+
+use SL::DB::MetaSetup::Note;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Object.pm b/SL/DB/Object.pm
new file mode 100644 (file)
index 0000000..f138518
--- /dev/null
@@ -0,0 +1,140 @@
+package SL::DB::Object;
+
+use strict;
+
+use Readonly;
+use Rose::DB::Object;
+use List::MoreUtils qw(any);
+
+use SL::DB;
+use SL::DB::Helpers::Attr;
+use SL::DB::Helpers::Metadata;
+use SL::DB::Helpers::Manager;
+
+use base qw(Rose::DB::Object);
+
+sub new {
+  my $class = shift;
+  my $self  = $class->SUPER::new();
+
+  $self->_assign_attributes(@_) if $self;
+
+  return $self;
+}
+
+sub init_db {
+  my $class_or_self = shift;
+  my $class         = ref($class_or_self) || $class_or_self;
+  my $type          = 'LXOFFICE';
+
+  return SL::DB::create(undef, $type);
+}
+
+sub meta_class {
+  return 'SL::DB::Helpers::Metadata';
+}
+
+sub _get_manager_class {
+  my $class_or_self = shift;
+  my $class         = ref($class_or_self) || $class_or_self;
+
+  return $class->meta->convention_manager->auto_manager_class_name($class);
+}
+
+Readonly my %text_column_types => (text => 1, char => 1, varchar => 1);
+
+sub assign_attributes {
+  my $self       = shift;
+  my %attributes = @_;
+
+  my $pk         = ref($self)->meta->primary_key;
+  delete @attributes{$pk->column_names} if $pk;
+
+  return $self->_assign_attributes(%attributes);
+}
+
+sub _assign_attributes {
+  my $self       = shift;
+  my %attributes = @_;
+
+  my %types      = map { $_->name => $_->type } ref($self)->meta->columns;
+
+  while (my ($attribute, $value) = each %attributes) {
+    my $type = lc($types{$attribute} || 'text');
+    $value   = $type eq 'boolean'        ? ($value ? 't' : 'f')
+             : $text_column_types{$type} ? $value
+             :                             ($value || undef);
+    $self->$attribute($value);
+  }
+
+  return $self;
+}
+
+sub update_attributes {
+  my $self = shift;
+
+  $self->assign_attributes(@_)->save;
+
+  return $self;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+SL::DB::Object: Base class for all of our model classes
+
+=head1 DESCRIPTION
+
+This is the base class from which all other model classes are
+derived. It contains functionality and settings required for all model
+classes.
+
+Several functions (e.g. C<make_manager_class>, C<init_db>) in this
+class are used for setting up the classes / base classes used for all
+model instances. They overwrite the functions from
+L<Rose::DB::Object>.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item assign_attributes %attributes
+
+=item _assign_attributes %attributes
+
+Assigns all elements from C<%attributes> to the columns by calling
+their setter functions. The difference between the two functions is
+that C<assign_attributes> protects primary key columns while
+C<_assign_attributes> doesn't.
+
+Both functions handle values that are empty strings by replacing them
+with C<undef> for non-text columns. This allows the calling functions
+to use data from HTML forms as the input for C<assign_attributes>
+without having to remove empty strings themselves (think of
+e.g. select boxes with an empty option which should be turned into
+C<NULL> in the database).
+
+=item update_attributes %attributes
+
+Assigns the attributes from C<%attributes> by calling the
+C<assign_attributes> function and saves the object afterwards. Returns
+the object itself.
+
+=item _get_manager_class
+
+Returns the manager package for the object or class that it is called
+on. Can be used from methods in this package for getting the actual
+object's manager.
+
+=back
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut
diff --git a/SL/DB/Order.pm b/SL/DB/Order.pm
new file mode 100644 (file)
index 0000000..2dd29c3
--- /dev/null
@@ -0,0 +1,103 @@
+package SL::DB::Order;
+
+use strict;
+
+use SL::RecordLinks;
+
+use SL::DB::MetaSetup::Order;
+use SL::DB::Manager::Order;
+use SL::DB::Invoice;
+
+__PACKAGE__->meta->add_relationship(
+  orderitems => {
+    type         => 'one to many',
+    class        => 'SL::DB::OrderItem',
+    column_map   => { id => 'trans_id' },
+    manager_args => {
+      with_objects => [ 'part' ]
+    }
+  }
+);
+
+__PACKAGE__->meta->initialize;
+
+# methods
+
+sub type {
+  my $self = shift;
+
+  return 'sales_order'       if $self->customer_id && ! $self->quotation;
+  return 'purchase_order'    if $self->vendor_id   && ! $self->quotation;
+  return 'sales_quotation'   if $self->customer_id &&   $self->quotation;
+  return 'request_quotation' if $self->vendor_id   &&   $self->quotation;
+
+  return;
+}
+
+sub is_type {
+  return shift->type eq shift;
+}
+
+sub invoices {
+  my $self   = shift;
+  my %params = @_;
+
+  if ($self->quotation) {
+    return [];
+  } else {
+    return SL::DB::Manager::Invoice->get_all(
+      query => [
+        ordnumber => $self->ordnumber,
+        @{ $params{query} || [] },
+      ]
+    );
+  }
+}
+
+sub abschlag_invoices {
+  return shift()->invoices(query => [ abschlag => 1 ]);
+}
+
+sub end_invoice {
+  return shift()->invoices(query => [ abschlag => 0 ]);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+SL::DB::Order - Order Datenbank Objekt.
+
+=head1 FUNCTIONS
+
+=head2 type
+
+Returns one of the following string types:
+
+=over 4
+
+=item saes_order
+
+=item purchase_order
+
+=item sales_quotation
+
+=item request_quotation
+
+=back
+
+=head2 is_type TYPE
+
+Rreturns true if the order is of the given type.
+
+=head1 BUGS
+
+Nothing here yet.
+
+=head1 AUTHOR
+
+  Sven Schöling <s.schoeling@linet-services.de>
+
+=cut
diff --git a/SL/DB/OrderItem.pm b/SL/DB/OrderItem.pm
new file mode 100644 (file)
index 0000000..94d2bc8
--- /dev/null
@@ -0,0 +1,25 @@
+package SL::DB::OrderItem;
+
+use strict;
+
+use SL::DB::MetaSetup::OrderItem;
+
+__PACKAGE__->meta->add_relationship(
+  part => {
+    type         => 'one to one',
+    class        => 'SL::DB::Part',
+    column_map   => { parts_id => 'id' },
+  }
+);
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+__PACKAGE__->meta->initialize;
+
+sub is_price_update_available {
+  my $self = shift;
+  return $self->origprice > $self->part->sellprice;
+}
+
+1;
diff --git a/SL/DB/Part.pm b/SL/DB/Part.pm
new file mode 100644 (file)
index 0000000..52b7520
--- /dev/null
@@ -0,0 +1,123 @@
+package SL::DB::Part;
+
+use strict;
+
+use Carp;
+use SL::DBUtils;
+use SL::DB::MetaSetup::Part;
+use SL::DB::Manager::Part;
+
+__PACKAGE__->meta->add_relationships(
+  unit_obj                     => {
+    type         => 'one to one',
+    class        => 'SL::DB::Unit',
+    column_map   => { unit => 'name' },
+  },
+  assemblies                     => {
+    type         => 'one to many',
+    class        => 'SL::DB::Assembly',
+    column_map   => { id => 'id' },
+  },
+);
+
+__PACKAGE__->meta->initialize;
+
+sub is_type {
+  my $self = shift;
+  my $type  = lc(shift || '');
+
+  if ($type =~ m/^part/) {
+    return !$self->assembly && $self->inventory_accno_id  ? 1 : 0;
+
+  } elsif ($type =~ m/^service/) {
+    return !$self->inventory_accno_id && !$self->assembly ? 1 : 0;
+
+  } elsif ($type =~ m/^assembl/) {
+    return $self->assembly                                ? 1 : 0;
+
+  }
+
+  confess "Unknown type parameter '$type'";
+}
+
+sub get_sellprice_info {
+  my $self   = shift;
+  my %params = @_;
+
+  confess "Missing part id" unless $self->id;
+
+  my $object = $self->load;
+
+  return { sellprice       => $object->sellprice,
+           price_factor_id => $object->price_factor_id };
+}
+
+sub get_ordered_qty {
+  my $self   = shift;
+  my %result = SL::DB::Manager::Part->get_ordered_qty($self->id);
+
+  return $result{ $self->id };
+}
+
+sub available_units {
+  shift->unit_obj->convertible_units;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+SL::DB::Part: Model for the 'parts' table
+
+=head1 SYNOPSIS
+
+This is a standard Rose::DB::Object based model and can be used as one.
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item is_type $type
+
+Tests if the current object is a part, a service or an
+assembly. C<$type> must be one of the words 'part', 'service' or
+'assembly' (their plurals are ok, too).
+
+Returns 1 if the requested type matches, 0 if it doesn't and
+C<confess>es if an unknown C<$type> parameter is encountered.
+
+=item get_sellprice_info %params
+
+Retrieves the C<sellprice> and C<price_factor_id> for a part under
+different conditions and returns a hash reference with those two keys.
+
+If C<%params> contains a key C<project_id> then a project price list
+will be consulted if one exists for that project. In this case the
+parameter C<country_id> is evaluated as well: if a price list entry
+has been created for this country then it will be used. Otherwise an
+entry without a country set will be used.
+
+If none of the above conditions is met then the information from
+C<$self> is used.
+
+=item get_ordered_qty %params
+
+Retrieves the quantity that has been ordered from a vendor but that
+has not been delivered yet. Only open purchase orders are considered.
+
+=item get_uncommissioned_qty %params
+
+Retrieves the quantity that has been ordered by a customer but that
+has not been commissioned yet. Only open sales orders are considered.
+
+=back
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut
diff --git a/SL/DB/PartsGroup.pm b/SL/DB/PartsGroup.pm
new file mode 100644 (file)
index 0000000..88ab22f
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::PartsGroup;
+
+use strict;
+
+use SL::DB::MetaSetup::PartsGroup;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/PartsTax.pm b/SL/DB/PartsTax.pm
new file mode 100644 (file)
index 0000000..3bea19b
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::PartsTax;
+
+use strict;
+
+use SL::DB::MetaSetup::PartsTax;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/PaymentTerm.pm b/SL/DB/PaymentTerm.pm
new file mode 100644 (file)
index 0000000..b525910
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::PaymentTerm;
+
+use strict;
+
+use SL::DB::MetaSetup::PaymentTerm;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/PriceFactor.pm b/SL/DB/PriceFactor.pm
new file mode 100644 (file)
index 0000000..6680a12
--- /dev/null
@@ -0,0 +1,31 @@
+package SL::DB::PriceFactor;
+
+use strict;
+
+use SL::DB::MetaSetup::PriceFactor;
+
+__PACKAGE__->meta->make_manager_class;
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+SL::DB::PriceFactor: Model for the 'price_factors' table
+
+=head1 SYNOPSIS
+
+This is a standard Rose::DB::Object based model and can be used as one.
+
+=head1 FUNCTIONS
+
+None so far.
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut
diff --git a/SL/DB/Pricegroup.pm b/SL/DB/Pricegroup.pm
new file mode 100644 (file)
index 0000000..8c9c372
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Pricegroup;
+
+use strict;
+
+use SL::DB::MetaSetup::Pricegroup;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Prices.pm b/SL/DB/Prices.pm
new file mode 100644 (file)
index 0000000..45d54a0
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Prices;
+
+use strict;
+
+use SL::DB::MetaSetup::Prices;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Printer.pm b/SL/DB/Printer.pm
new file mode 100644 (file)
index 0000000..2c3eacc
--- /dev/null
@@ -0,0 +1,9 @@
+package SL::DB::Printer;
+
+use strict;
+
+use SL::DB::MetaSetup::Printer;
+
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Project.pm b/SL/DB/Project.pm
new file mode 100644 (file)
index 0000000..4b93c5a
--- /dev/null
@@ -0,0 +1,31 @@
+package SL::DB::Project;
+
+use strict;
+
+use SL::DB::MetaSetup::Project;
+
+__PACKAGE__->meta->make_manager_class;
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+SL::DB::Project: Model for the 'project' table
+
+=head1 SYNOPSIS
+
+This is a standard Rose::DB::Object based model and can be used as one.
+
+=head1 FUNCTIONS
+
+None so far.
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut
diff --git a/SL/DB/PurchaseInvoice.pm b/SL/DB/PurchaseInvoice.pm
new file mode 100644 (file)
index 0000000..a06a3b6
--- /dev/null
@@ -0,0 +1,17 @@
+package SL::DB::PurchaseInvoice;
+
+use strict;
+
+use SL::DB::MetaSetup::PurchaseInvoice;
+use SL::DB::Manager::PurchaseInvoice;
+
+__PACKAGE__->meta->add_relationship(invoiceitems => { type         => 'one to many',
+                                                      class        => 'SL::DB::InvoiceItem',
+                                                      column_map   => { id => 'trans_id' },
+                                                      manager_args => { with_objects => [ 'part' ] }
+                                                    },
+                                   );
+
+__PACKAGE__->meta->initialize;
+
+1;
diff --git a/SL/DB/RMA.pm b/SL/DB/RMA.pm
new file mode 100644 (file)
index 0000000..49c8d71
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::RMA;
+
+use strict;
+
+use SL::DB::MetaSetup::RMA;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/RMAItem.pm b/SL/DB/RMAItem.pm
new file mode 100644 (file)
index 0000000..c62e807
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::RMAItem;
+
+use strict;
+
+use SL::DB::MetaSetup::RMAItem;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/RecordLink.pm b/SL/DB/RecordLink.pm
new file mode 100644 (file)
index 0000000..7aed15a
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::RecordLink;
+
+use strict;
+
+use SL::DB::MetaSetup::RecordLink;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/SchemaInfo.pm b/SL/DB/SchemaInfo.pm
new file mode 100644 (file)
index 0000000..b1c38d4
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::SchemaInfo;
+
+use strict;
+
+use SL::DB::MetaSetup::SchemaInfo;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/SepaExport.pm b/SL/DB/SepaExport.pm
new file mode 100644 (file)
index 0000000..ab45045
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::SepaExport;
+
+use strict;
+
+use SL::DB::MetaSetup::SepaExport;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/SepaExportItem.pm b/SL/DB/SepaExportItem.pm
new file mode 100644 (file)
index 0000000..3c46ee3
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::SepaExportItem;
+
+use strict;
+
+use SL::DB::MetaSetup::SepaExportItem;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Shipto.pm b/SL/DB/Shipto.pm
new file mode 100644 (file)
index 0000000..98b7ca1
--- /dev/null
@@ -0,0 +1,23 @@
+package SL::DB::Shipto;
+
+use strict;
+use Readonly;
+
+use SL::DB::MetaSetup::Shipto;
+
+Readonly our @SHIPTO_VARIABLES => qw(shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact
+                                     shiptophone shiptofax shiptoemail shiptodepartment_1 shiptodepartment_2);
+
+__PACKAGE__->meta->make_manager_class;
+
+sub displayable_id {
+  my $self = shift;
+  my $text = join('; ', grep { $_ } (map({ $self->$_ } qw(shiptoname shiptostreet)),
+                                     join(' ', grep { $_ }
+                                               map  { $self->$_ }
+                                               qw(shiptozipcode shiptocity))));
+
+  return $text;
+}
+
+1;
diff --git a/SL/DB/Status.pm b/SL/DB/Status.pm
new file mode 100644 (file)
index 0000000..38d230e
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Status;
+
+use strict;
+
+use SL::DB::MetaSetup::Status;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Tax.pm b/SL/DB/Tax.pm
new file mode 100644 (file)
index 0000000..58161ae
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Tax;
+
+use strict;
+
+use SL::DB::MetaSetup::Tax;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/TaxKey.pm b/SL/DB/TaxKey.pm
new file mode 100644 (file)
index 0000000..bd27ccf
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::TaxKey;
+
+use strict;
+
+use SL::DB::MetaSetup::TaxKey;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/TaxZone.pm b/SL/DB/TaxZone.pm
new file mode 100644 (file)
index 0000000..7e0f2e7
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::TaxZone;
+
+use strict;
+
+use SL::DB::MetaSetup::TaxZone;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/TodoUserConfig.pm b/SL/DB/TodoUserConfig.pm
new file mode 100644 (file)
index 0000000..fd12020
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::TodoUserConfig;
+
+use strict;
+
+use SL::DB::MetaSetup::TodoUserConfig;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/TransferType.pm b/SL/DB/TransferType.pm
new file mode 100644 (file)
index 0000000..9d13a86
--- /dev/null
@@ -0,0 +1,17 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::TransferType;
+
+use strict;
+
+use SL::DB::MetaSetup::TransferType;
+use SL::DB::Manager::TransferType;
+
+# methods
+
+sub description_t8 {
+  return $::locale->text(shift()->description);
+}
+
+1;
diff --git a/SL/DB/Translation.pm b/SL/DB/Translation.pm
new file mode 100644 (file)
index 0000000..841a3a8
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Translation;
+
+use strict;
+
+use SL::DB::MetaSetup::Translation;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/TranslationPaymentTerm.pm b/SL/DB/TranslationPaymentTerm.pm
new file mode 100644 (file)
index 0000000..92cf84a
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::TranslationPaymentTerm;
+
+use strict;
+
+use SL::DB::MetaSetup::TranslationPaymentTerm;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Unit.pm b/SL/DB/Unit.pm
new file mode 100644 (file)
index 0000000..6a19733
--- /dev/null
@@ -0,0 +1,41 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Unit;
+
+use strict;
+
+use SL::DB::MetaSetup::Unit;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+__PACKAGE__->meta->add_relationships(
+  base => {
+    type         => 'one to one',
+    class        => 'SL::DB::Unit',
+    column_map   => { base_unit => 'name' },
+  },
+);
+
+__PACKAGE__->meta->initialize;
+
+#methods
+
+sub unit_class {
+  my $self   = shift;
+
+  return $self if !$self->base_unit || $self->name eq $self->base_unit;
+  return $self->base->unit_class;
+}
+
+sub convertible_units {
+  my $self = shift;
+  return [
+    sort { $a->sortkey <=> $b->sortkey }
+    grep { $_->unit_class->name eq $self->unit_class->name }
+    @{ SL::DB::Manager::Unit->get_all }
+  ];
+}
+
+1;
diff --git a/SL/DB/UnitsLanguage.pm b/SL/DB/UnitsLanguage.pm
new file mode 100644 (file)
index 0000000..256da5f
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::UnitsLanguage;
+
+use strict;
+
+use SL::DB::MetaSetup::UnitsLanguage;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/VC.pm b/SL/DB/VC.pm
new file mode 100644 (file)
index 0000000..44b2dbb
--- /dev/null
@@ -0,0 +1,53 @@
+package SL::DB::VC;
+
+use strict;
+
+require Exporter;
+use SL::DBUtils;
+
+our @ISA    = qw(Exporter);
+our @EXPORT = qw(get_credit_remaining);
+
+sub get_credit_remaining {
+  my $vc               = shift;
+  my ($type, $arap)    = ref $vc eq 'SL::DB::Customer' ? ('customer', 'ar') : ('vendor', 'ap');
+  my %params           = @_;
+
+  my $credit_remaining = $vc->creditlimit || 0;
+
+  my $query            = <<SQL;
+    SELECT SUM(${arap}.amount - ${arap}.paid)
+    FROM ${arap}
+    WHERE ${type}_id = ?
+SQL
+  my ($amount_unpaid)  = selectfirst_array_query($::form, $vc->dbh, $query, $vc->id);
+  $credit_remaining   -= $amount_unpaid;
+
+  $query = <<SQL;
+    SELECT o.amount,
+      (SELECT e.buy FROM exchangerate e
+       WHERE e.curr = o.curr
+         AND e.transdate = o.transdate)
+    FROM oe o
+    WHERE (o.${type}_id = ?)
+      AND NOT COALESCE(o.quotation, FALSE)
+      AND NOT COALESCE(o.closed,    FALSE)
+SQL
+
+  my @values;
+  if ($params{exclude_order_id}) {
+    $query .= qq| AND (o.id <> ?)|;
+    push @values, $params{exclude_order_id};
+  }
+
+  my $sth = prepare_execute_query($::form, $vc->dbh, $query, $vc->id, @values);
+
+  while (my ($amount, $exch) = $sth->fetchrow_array) {
+    $credit_remaining -= $amount * ($exch || 1);
+  }
+  $sth->finish;
+
+  return $credit_remaining;
+}
+
+1;
diff --git a/SL/DB/Vendor.pm b/SL/DB/Vendor.pm
new file mode 100644 (file)
index 0000000..11e23fe
--- /dev/null
@@ -0,0 +1,27 @@
+package SL::DB::Vendor;
+
+use strict;
+
+use SL::DB::MetaSetup::Vendor;
+
+use SL::DB::VC;
+
+__PACKAGE__->meta->add_relationship(
+  shipto => {
+    type         => 'one to many',
+    class        => 'SL::DB::Shipto',
+    column_map   => { id      => 'trans_id' },
+    manager_args => { sort_by => 'lower(shipto.shiptoname)' },
+    query_args   => [ 'shipto.module' => 'CT' ],
+  },
+  business => {
+    type         => 'one to one',
+    class        => 'SL::DB::Business',
+    column_map   => { business_id => 'id' },
+  },
+);
+
+__PACKAGE__->meta->make_manager_class;
+__PACKAGE__->meta->initialize;
+
+1;
diff --git a/SL/DB/VendorTax.pm b/SL/DB/VendorTax.pm
new file mode 100644 (file)
index 0000000..a4c6fc9
--- /dev/null
@@ -0,0 +1,13 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::VendorTax;
+
+use strict;
+
+use SL::DB::MetaSetup::VendorTax;
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
diff --git a/SL/DB/Warehouse.pm b/SL/DB/Warehouse.pm
new file mode 100644 (file)
index 0000000..938c31e
--- /dev/null
@@ -0,0 +1,29 @@
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::Warehouse;
+
+use strict;
+
+use SL::DB::MetaSetup::Warehouse;
+
+__PACKAGE__->meta->make_manager_class;
+
+__PACKAGE__->meta->add_relationship(
+  bins => {
+    type         => 'one to many',
+    class        => 'SL::DB::Bin',
+    column_map   => { id => 'warehouse_id' },
+  }
+);
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+#__PACKAGE__->meta->make_manager_class;
+
+__PACKAGE__->meta->initialize;
+
+sub first_bin {
+  return shift()->bins->[0];
+}
+
+1;
index 2c0539b..8bd2968 100644 (file)
@@ -130,13 +130,9 @@ sub handle_request {
   my $interface = lc(shift || 'cgi');
   my ($script_name, $action);
 
-  if ($interface =~ m/^(?:fastcgi|fcgid|fcgi)$/) {
-    $script_name = $ENV{SCRIPT_NAME};
-    unrequire_bin_mozilla();
+  $script_name = $ENV{SCRIPT_NAME};
 
-  } else {
-    $script_name = $0;
-  }
+  unrequire_bin_mozilla($interface);
 
   $::cgi         = CGI->new('');
   $::locale      = Locale->new($::language);
@@ -205,6 +201,8 @@ sub handle_request {
 }
 
 sub unrequire_bin_mozilla {
+  return unless $_[0] =~ m/^(?:fastcgi|fcgid|fcgi)$/;
+
   for (keys %INC) {
     next unless m#^bin/mozilla/#;
     next if /\bcommon.pl$/;
diff --git a/SL/FCGIFixes.pm b/SL/FCGIFixes.pm
new file mode 100644 (file)
index 0000000..47393aa
--- /dev/null
@@ -0,0 +1,49 @@
+package SL::FCGIFixes;
+
+use strict;
+
+use Encode;
+use FCGI;
+use version;
+
+# FCGI does not use Perl's I/O layer. Therefore it does not honor
+# setting STDOUT to ":utf8" with "binmode".  Also FCGI starting with
+# 0.69 implements proper handling for UTF-8 flagged strings -- namely
+# by downgrading them into bytes. The combination of the two causes
+# Lx-Office's way of handling strings to go belly up (storing
+# everything in Perl's internal encoding and using Perl's I/O layer
+# for automatic conversion on output).
+#
+# This workaround monkeypatches FCGI's print routine so that all of
+# its arguments safe for "$self" are encoded into UTF-8 before calling
+# FCGI's original PRINT function.
+#
+# However, this must not be done if raw I/O is requested -- e.g. when
+# sending out binary data. Fortunately that has been centralized via
+# Locale's "with_raw_io" function which sets a variable indicating
+# that current I/O operations should be raw.
+
+sub fix_print_and_internal_encoding_after_0_68 {
+  return if version->new("$FCGI::VERSION")->numify <= version->new("0.68")->numify;
+
+  my $encoder             = Encode::find_encoding('UTF-8');
+  my $original_fcgi_print = \&FCGI::Stream::PRINT;
+
+  no warnings 'redefine';
+
+  *FCGI::Stream::PRINT = sub {
+    if (!$::locale || !$::locale->raw_io_active) {
+      my $self = shift;
+      my @vals = map { $encoder->encode($_, Encode::FB_CROAK|Encode::LEAVE_SRC) } @_;
+      @_ = ($self, @vals);
+    }
+
+    goto $original_fcgi_print;
+  };
+}
+
+sub apply_fixes {
+  fix_print_and_internal_encoding_after_0_68();
+}
+
+1;
index 3845017..d5b0f53 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
@@ -350,7 +350,7 @@ sub save {
     }
 
     ($form->{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('id')|);
-    do_query($form, $dbh, qq|INSERT INTO parts (id, partnumber) VALUES (?, '')|, $form->{id});
+    do_query($form, $dbh, qq|INSERT INTO parts (id, partnumber, unit) VALUES (?, '', '')|, $form->{id});
 
     $form->{orphaned} = 1;
     if ($form->{partnumber} eq "" && $form->{"item"} eq "service") {
index da419e9..d8d058b 100644 (file)
@@ -7,65 +7,51 @@ use vars qw(@required_modules @optional_modules);
 
 use strict;
 
+BEGIN {
 @required_modules = (
-  { name => "Archive::Zip",    url => "http://search.cpan.org/~adamk/" },
-  { name => "Class::Accessor", url => "http://search.cpan.org/~kasei/" },
-  { name => "CGI::Ajax",       url => "http://search.cpan.org/~bct/" },
-  { name => "DateTime",        url => "http://search.cpan.org/~drolsky/" },
-  { name => "DBI",             url => "http://search.cpan.org/~timb/" },
-  { name => "DBD::Pg",         url => "http://search.cpan.org/~dbdpg/" },
-  { name => "Email::Address",  url => "http://search.cpan.org/~rjbs/" },
-  { name => "FCGI",            url => "http://search.cpan.org/~mstrout/" },
-  { name => "IO::Wrap",        url => "http://search.cpan.org/~dskoll/" },
-  { name => "List::MoreUtils", url => "http://search.cpan.org/~vparseval/" },
-  { name => "PDF::API2",       url => "http://search.cpan.org/~areibens/" },
-  { name => "Template",        url => "http://search.cpan.org/~abw/" },
-  { name => "Text::CSV_XS",    url => "http://search.cpan.org/~hmbrand/" },
-  { name => "Text::Iconv",     url => "http://search.cpan.org/~mpiotr/" },
-  { name => "URI",             url => "http://search.cpan.org/~gaas/" },
-  { name => "XML::Writer",     url => "http://search.cpan.org/~josephw/" },
-  { name => "YAML",            url => "http://search.cpan.org/~ingy/" },
-  { name => "parent",          url => "http://search.cpan.org/dist/parent/" },
+  { name => "parent",                              url => "http://search.cpan.org/~corion/" },
+  { name => "Archive::Zip",    version => '1.16',  url => "http://search.cpan.org/~adamk/" },
+  { name => "Class::Accessor", version => '0.30',  url => "http://search.cpan.org/~kasei/" },
+  { name => "CGI::Ajax",       version => '0.697', url => "http://search.cpan.org/~bct/" },
+  { name => "DateTime",                            url => "http://search.cpan.org/~drolsky/" },
+  { name => "DBI",             version => '1.50',  url => "http://search.cpan.org/~timb/" },
+  { name => "DBD::Pg",         version => '1.49',  url => "http://search.cpan.org/~dbdpg/" },
+  { name => "Email::Address",                      url => "http://search.cpan.org/~rjbs/" },
+  { name => "FCGI",                                url => "http://search.cpan.org/~mstrout/" },
+  { name => "IO::Wrap",        version => '2.110', url => "http://search.cpan.org/~dskoll/" },
+  { name => "List::MoreUtils", version => '0.21',  url => "http://search.cpan.org/~vparseval/" },
+  { name => "PDF::API2",       version => '2.000', url => "http://search.cpan.org/~areibens/" },
+  { name => "Template",        version => '2.18',  url => "http://search.cpan.org/~abw/" },
+  { name => "Text::CSV_XS",    version => '0.23',  url => "http://search.cpan.org/~hmbrand/" },
+  { name => "Text::Iconv",     version => '1.2',   url => "http://search.cpan.org/~mpiotr/" },
+  { name => "URI",             version => '1.35',  url => "http://search.cpan.org/~gaas/" },
+  { name => "XML::Writer",     version => '0.602', url => "http://search.cpan.org/~josephw/" },
+  { name => "YAML",            version => '0.62',  url => "http://search.cpan.org/~ingy/" },
 );
 
 @optional_modules = ();
 
+$_->{fullname} = join ' ', grep $_, @$_{qw(name version)}
+  for @required_modules, @optional_modules;
+}
+
 sub module_available {
-  my ($module) = @_;
+  my $module  = $_[0];
+  my $version = $_[1] || '' ;
 
-  if (!defined(eval("require $module;"))) {
-    return 0;
-  } else {
-    return 1;
-  }
+  return eval "use $module $version; 1";
 }
 
 my %conditional_dependencies;
 
 sub check_for_conditional_dependencies {
-  if (!$conditional_dependencies{net_ldap}) {
-    $conditional_dependencies{net_ldap} = 1;
-
-    my $in = IO::File->new('config/authentication.pl', 'r');
-    if ($in) {
-      my $self = {};
-      my $code;
-
-      while (my $line = <$in>) {
-        $code .= $line;
-      }
-      $in->close();
-
-      eval $code;
+  return if $conditional_dependencies{net_ldap}++;
 
-      if (! $EVAL_ERROR) {
+  my $self = {};
+  eval do { local (@ARGV, $/) = 'config/authentication.pl'; <> } or return;
 
-        if ($self->{module} && ($self->{module} eq 'LDAP')) {
-          push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' };
-        }
-      }
-    }
-  }
+  push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' }
+    if $self->{module} && ($self->{module} eq 'LDAP');
 }
 
 sub test_all_modules {
index 881d592..4fde616 100644 (file)
@@ -462,14 +462,22 @@ sub remap_special_chars {
   return $self->quote_special_chars($dst_format, $self->quote_special_chars("${src_format}-reverse", shift));
 }
 
+sub raw_io_active {
+  my $self = shift;
+
+  return !!$self->{raw_io_active};
+}
+
 sub with_raw_io {
   my $self = shift;
   my $fh   = shift;
   my $code = shift;
 
+  $self->{raw_io_active} = 1;
   binmode $fh, ":raw";
   $code->();
   binmode $fh, ":utf8" if $self->is_utf8;
+  $self->{raw_io_active} = 0;
 }
 
 1;
index f5f48e7..c25e75a 100644 (file)
@@ -189,7 +189,8 @@ sub save_project {
   CVar->save_custom_variables('dbh'       => $dbh,
                               'module'    => 'Projects',
                               'trans_id'  => $params{id},
-                              'variables' => $form);
+                              'variables' => $form,
+                              'always_valid' => 1);
 
   $dbh->commit();
 
index e593a5e..afae863 100644 (file)
@@ -7,8 +7,6 @@ use Text::CSV_XS;
 #use PDF::API2;    # these two eat up to .75s on startup. only load them if we actually need them
 #use PDF::Table;
 
-use SL::Form;
-
 use strict;
 
 # Cause locales.pl to parse these files:
index 206e043..e961f28 100644 (file)
@@ -1,5 +1,6 @@
 package SL::Template::Excel;
 
+use strict;
 use parent qw(SL::Template::Simple);
 
 sub new {
index 626d3c0..2ed3c60 100644 (file)
@@ -3,6 +3,7 @@ package SL::Template::OpenDocument;
 use parent qw(SL::Template::Simple);
 
 use Archive::Zip;
+use Encode;
 use POSIX 'setsid';
 
 use SL::Iconv;
@@ -109,21 +110,27 @@ sub parse_block {
         $contents =~ m|^(.*?)(</table:table-row[^>]*>)|;
         my $table_row = $1;
         my $end_tag = $2;
-        substr($contents, 0, length($1) + length($end_tag)) = "";
 
         if ($table_row =~ m|\&lt;\%foreachrow\s+(.*?)\%\&gt;|) {
           my $var = $1;
 
-          substr($table_row, length($`), length($&)) = "";
+          $contents =~ m|\&lt;\%foreachrow\s+.*?\%\&gt;|;
+          substr($contents, length($`), length($&)) = "";
 
-          my ($t1, $t2) = $self->find_end($table_row, length($`));
-          if (!$t1) {
+          ($table_row, $contents) = $self->find_end($contents, length($`));
+          if (!$table_row) {
             $self->{"error"} = "Unclosed <\%foreachrow\%>." unless ($self->{"error"});
             $main::lxdebug->leave_sub();
             return undef;
           }
 
-          my $new_text = $self->parse_foreach($var, $t1 . $t2, $tag, $end_tag, @indices);
+          $contents   =~ m|^(.*?)(</table:table-row[^>]*>)|;
+          $table_row .=  $1;
+          $end_tag    =  $2;
+
+          substr $contents, 0, length($&), '';
+
+          my $new_text = $self->parse_foreach($var, $table_row, $tag, $end_tag, @indices);
           if (!defined($new_text)) {
             $main::lxdebug->leave_sub();
             return undef;
@@ -131,6 +138,7 @@ sub parse_block {
           $new_contents .= $new_text;
 
         } else {
+          substr($contents, 0, length($table_row) + length($end_tag)) = "";
           my $new_text = $self->parse_block($table_row, @indices);
           if (!defined($new_text)) {
             $main::lxdebug->leave_sub();
@@ -221,7 +229,7 @@ sub parse {
     return 0;
   }
 
-  my $contents = $zip->contents("content.xml");
+  my $contents = Encode::decode('utf-8-strict', $zip->contents("content.xml"));
   if (!$contents) {
     $self->{"error"} = "File is not a OpenDocument file.";
     $main::lxdebug->leave_sub();
@@ -260,7 +268,7 @@ sub parse {
 
 #   $new_contents =~ s|>|>\n|g;
 
-  $zip->contents("content.xml", $new_contents);
+  $zip->contents("content.xml", Encode::encode('utf-8-strict', $new_contents));
 
   my $styles = $zip->contents("styles.xml");
   if ($contents) {
index 2208ff4..6c584d7 100644 (file)
@@ -1,5 +1,7 @@
 package SL::Template::Plugin::T8;
 
+use strict;
+
 use Template::Plugin::Filter;
 use base qw( Template::Plugin::Filter );
 
index b8b4cfe..ebf01c6 100755 (executable)
@@ -79,7 +79,10 @@ sub run {
       $form->{error_message} = $locale->text('Incorrect Password!');
       adminlogin();
     } else {
-      $auth->create_or_refresh_session() if ($auth->session_tables_present());
+      if ($auth->session_tables_present()) {
+        $::auth->set_session_value('rpw', $::form->{rpw});
+        $::auth->create_or_refresh_session();
+      }
       call_sub($locale->findsub($form->{action}));
     }
   } elsif ($auth->authenticate_root($form->{rpw}, 0) == $auth->OK()) {
index 6729d16..82a988e 100644 (file)
@@ -727,4 +727,13 @@ sub gl_transaction {
   $main::lxdebug->leave_sub();
 }
 
+if ($::use_rdbo) {
+  eval {
+    require SL::DB::Helpers::Mappings;
+    sub db {
+      goto &SL::DB::Helpers::Mappings::db;
+    }
+  } or die $@;
+}
+
 1;
index e388b85..225098a 100644 (file)
@@ -1,8 +1,12 @@
 use Cwd;
 
-use vars qw($dbcharset $eur $ghostscript_bin $html2ps_bin $language $latex_bin $latex_templates $lizenzen $memberfile
-            $opendocument_templates $openofficeorg_daemon $openofficeorg_daemon_port $openofficeorg_writer_bin
-            $pg_dump_exe $pg_restore_exe $sendmail $show_best_before $sid $spool $templates $userspath $vertreter $webdav $xvfb_bin);
+use vars qw(
+$dbcharset $eur $ghostscript_bin $html2ps_bin $language $latex_bin
+$latex_templates $lizenzen $memberfile $opendocument_templates
+$openofficeorg_daemon $openofficeorg_daemon_port $openofficeorg_writer_bin
+$pg_dump_exe $pg_restore_exe $sendmail $show_best_before $sid $spool $templates
+$use_rdbo $userspath $vertreter $webdav $xvfb_bin
+);
 
 # path to user configuration files
 $userspath = "users";
@@ -92,6 +96,13 @@ $latex_bin = 'pdflatex';
 $pg_dump_exe    = "pg_dump";
 $pg_restore_exe = "pg_restore";
 
+# Rose::DB::Object Environment laden.
+# Die RDBO Klassen bieten für Addon Schreiber sehr einfache Interfaces zu den
+# bestehenden Klassen, haben aber den Nachteil, dass der Start des Programms
+# etwa 2s mehr dauert. Damit fällt die Möglichkeit Lx-Office Ã¼ber CGI zu
+# betreiben weg.
+$use_rdbo = 1;
+
 # Globale Debug-Ausgaben (de-)aktivieren? Moegliche Werte sind
 # LXDebug::NONE   - keine Debugausgaben
 # LXDebug::INFO
diff --git a/dispatcher.fcgi b/dispatcher.fcgi
new file mode 120000 (symlink)
index 0000000..777f2b6
--- /dev/null
@@ -0,0 +1 @@
+dispatcher.fpl
\ No newline at end of file
index 7fae716..afe1bc6 100755 (executable)
@@ -4,6 +4,9 @@ use strict;
 
 use FCGI;
 use SL::Dispatcher;
+use SL::FCGIFixes;
+
+SL::FCGIFixes::apply_fixes();
 
 SL::Dispatcher::pre_startup();
 my $request = FCGI::Request();
index 063aa42..4583901 100644 (file)
@@ -38,31 +38,43 @@ eigentliche Programmlogik ausgef
 Folgende Kombinationen sind getestet:
 
  * Apache 2.2.11 (Ubuntu) und mod_fastcgi.
-
-Folgende Kombinationen funktionieren nicht:
-
- * Apache 2.2.11 (Ubuntu) + mod_fcgid:
+ * Apache 2.2.11 (Ubuntu) und mod_fcgid:
 
 Als Perl Backend wird das Modul FCGI.pm verwendet. Vorsicht: FCGI 0.69 und
 höher ist extrem strict in der Behandlung von Unicode, und verweigert bestimmte
 Eingaben von Lx-Office. Solange diese Probleme nicht behoben sind, muss auf die
 Vorgängerversion FCGI 0.68 ausgewichen werden.
 
+Mit cpan lässt sie sich wie folgt installieren:
+
+ force install M/MS/MSTROUT/FCGI-0.68.tar.gz
 
 =head2 Konfiguration des Webservers.
 
+Bevor Sie versuchen eine Lx-Office Installation unter FCGI laufen zu lassen,
+empfliehlt es sich die Installation ersteinmal unter CGI aufzusetzen. FCGI
+macht es nicht einfach Fehler zu debuggen die beim ersten aufsetzen auftreten
+können. Sollte die Installation schon funktionieren, lesen Sie weiter.
+
 Zuerst muss das FastCGI-Modul aktiviert werden. Dies kann unter
 Debian/Ubuntu z.B. mit folgendem Befehl geschehen:
 
   a2enmod fastcgi
 
+bzw.
+
+  a2enmod fcgid
+
 Die Konfiguration für die Verwendung von Lx-Office mit FastCGI erfolgt
 durch Anpassung der vorhandenen Alias- und Directory-Direktiven. Dabei
 wird zwischen dem Installationspfad von Lx-Office im Dateisystem
 ("/path/to/lx-office-erp") und der URL unterschieden, unter der
 Lx-Office im Webbrowser erreichbar ist ("/web/path/to/lx-office-erp").
 
+Folgendes Template funktioniert mit mod_fastcgi:
+
   AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
+  Alias       /web/path/to/lx-office-erp/          /path/to/lx-office-erp/
 
   <Directory /path/to/lx-office-erp>
     AllowOverride All
@@ -77,6 +89,11 @@ Lx-Office im Webbrowser erreichbar ist ("/web/path/to/lx-office-erp").
     Deny from All
   </DirectoryMatch>
 
+...und für mod_fcgid muss die erste Zeile geändert werden in:
+
+  AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fcgi
+
+
 Hierdurch wird nur ein zentraler Dispatcher gestartet. Alle Zugriffe
 auf die einzelnen Scripte werden auf diesen umgeleitet. Dadurch, dass
 zur Laufzeit Ã¶fter mal Scripte neu geladen werden, gibt es hier kleine
@@ -84,22 +101,12 @@ Performance-Einbu
 Benutzung von "AddHandler fastcgi-script .pl" vorzuziehen.
 
 
-=head2 Entwicklungsaspekte
-
-Die AddHandler Direktive vom Apache ist entgegen der Dokumentation
-anscheinend nicht lokal auf das Verzeichnis beschränkt sondern global im
-vhost.
-
-Wenn Ã„nderungen in der Konfiguration von Lx-Office gemacht werden, oder wenn
-Templates editiert werden muss der Server neu gestartet werden.
-
 Es ist möglich die gleiche Lx-Office Version parallel unter cgi und fastcgi zu
-betreiben. Da nimmt man Variante 2 wie oben beschrieben, und Ã¤ndert die
-AliasMatch Zeile auf eine andere URL, und lässt alle anderen URLs auch
-weiterleiten:
+betreiben. Dafür bleiben Directorydirektiven bleiben wie oben beschrieben, die
+URLs werden aber umgeleitet:
 
   # Zugriff ohne FastCGI
-  Alias /web/path/to/lx-office-erp /path/to/lx-office-erp
+  Alias       /web/path/to/lx-office-erp                /path/to/lx-office-erp
 
   # Zugriff mit FastCGI:
   AliasMatch ^/web/path/to/lx-office-erp-fcgi/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
@@ -108,6 +115,17 @@ weiterleiten:
 Dann ist unter C</web/path/to/lx-office-erp/> die normale Version erreichbar,
 und unter C</web/opath/to/lx-office-erp-fcgi/> die FastCGI Version.
 
+Achtung:
+
+Die AddHandler Direktive vom Apache ist entgegen der Dokumentation
+anscheinend nicht lokal auf das Verzeichnis beschränkt sondern global im
+vhost.
+
+=head2 Entwicklungsaspekte
+
+Wenn Ã„nderungen in der Konfiguration von Lx-Office gemacht werden, muss der
+Server neu gestartet werden.
+
 Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu achten. Dadurch
 dass das Programm in einer Endlosschleife läuft, müssen folgende Aspekte
 geachtet werden:
@@ -120,11 +138,12 @@ kann mit C<die>, C<confess> oder C<carp> Fehler ausgeben, die dann vom Dispatche
 angezeigt werden. Die Lx-Office eigene C<$::form->error()> tut im Prinzip das
 Gleiche, mit ein paar Extraoptionen. C<warn> und C<exit> hingegen werden nicht
 abgefangen. C<warn> wird direkt nach STDERR, also in Server Log eine Nachricht
-schreiben, und C<exit> wird die Ausführung beenden.
+schreiben (sofern in der Konfiguration nicht die Warnungen in das Lx-Office Log
+umgeleitet wurden), und C<exit> wird die Ausführung beenden.
 
 Prinzipiell ist es kein Beinbruch, wenn sich der Prozess beendet, fcgi wird ihn
 sofort neu starten. Allerdings sollte das die Ausnahme sein. Quintessenz: Bitte
-kein C<warn> oder C<exit> benutzen, alle anderen Exceptionmechanismen sind ok.
+kein C<exit> benutzen, alle anderen Exceptionmechanismen sind ok.
 
 =head3 Globale Variablen
 
@@ -133,6 +152,10 @@ m
 Das ist besonders wichtig im C<$::cgi> und C<$::auth> Objekt, weil diese nicht
 gelöscht werden pro Instanz, sondern persistent gehalten werden.
 
+In C<SL::Dispatcher> gibt es einen sauber abgetrennten Block der alle
+kanonischen globalen Variablen listet und erklärt. Bitte keine anderen
+einführen ohne das sauber zu dokumentieren.
+
 Datenbankverbindungen wird noch ein Guide verfasst werden, wie man sichergeht,
 dass man die richtige erwischt.
 
@@ -140,12 +163,20 @@ dass man die richtige erwischt.
 
 Die kritischen Pfade des Programms sind die Belegmasken, und unter diesen ganz
 besonders die Verkaufsrechnungsmaske. Ein Aufruf der Rechnungsmaske in
-Lx-Office 2.4.3 stable dauert auf einem Core2duo mit 2GB Arbeitsspeicher und
+Lx-Office 2.4.3 stable dauert auf einem Core2duo mit 4GB Arbeitsspeicher und
 Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0 sind es je nach Menge der
 definierten Variablen 1-2s. Ab der Moose/Rose::DB Version sind es 5-6s.
 
-Mit FastCGI ist die neuste Version auf 0,4 Sekunden selbst in den kritischen
+Mit FastCGI ist die neuste Version auf 0,26 Sekunden selbst in den kritischen
 Pfaden, unter 0,15 sonst.
 
 =head2 Bekannte Probleme
 
+=head3 Encoding Awareness
+
+UTF-8 kodierte Installationen sind sehr anfällig gegen fehlerhfate Encodings
+unter FCGI. latin9 Installationen behandeln falsch kodierte Zeichen eher
+unwissend, und geben sie einfach weiter. UTF-8 verweigert bei fehlerhaften
+Programmpfaden kurzerhand aus ausliefern. Es wird noch daran gearbeitet alles
+Fehler da zu beseitigen.
+
index c944749..0d75069 100644 (file)
@@ -42,7 +42,7 @@ Für Perl-Upgradedateien:
 # @key: value
 
 
-Leerzeichen vor "value" werden entfern.
+Leerzeichen vor "value" werden entfernt.
 
 Die folgenden Schlüsselworte werden verarbeitet:
 
diff --git a/image/AP.png b/image/AP.png
deleted file mode 100644 (file)
index a7b9e9d..0000000
Binary files a/image/AP.png and /dev/null differ
diff --git a/image/AR.png b/image/AR.png
deleted file mode 100644 (file)
index 60bdcac..0000000
Binary files a/image/AR.png and /dev/null differ
diff --git a/image/Backup.png b/image/Backup.png
deleted file mode 100644 (file)
index 465b82a..0000000
Binary files a/image/Backup.png and /dev/null differ
diff --git a/image/Batch Printing.png b/image/Batch Printing.png
deleted file mode 100644 (file)
index 7d5cdd3..0000000
Binary files a/image/Batch Printing.png and /dev/null differ
diff --git a/image/CRM.png b/image/CRM.png
deleted file mode 100644 (file)
index 2c3e139..0000000
Binary files a/image/CRM.png and /dev/null differ
diff --git a/image/Cash.png b/image/Cash.png
deleted file mode 100644 (file)
index b086f92..0000000
Binary files a/image/Cash.png and /dev/null differ
diff --git a/image/Dunning Process.png b/image/Dunning Process.png
deleted file mode 100644 (file)
index b086f92..0000000
Binary files a/image/Dunning Process.png and /dev/null differ
diff --git a/image/General Ledger.png b/image/General Ledger.png
deleted file mode 100644 (file)
index d081dea..0000000
Binary files a/image/General Ledger.png and /dev/null differ
diff --git a/image/Master Data.png b/image/Master Data.png
deleted file mode 100644 (file)
index 4872754..0000000
Binary files a/image/Master Data.png and /dev/null differ
diff --git a/image/Productivity.png b/image/Productivity.png
deleted file mode 100644 (file)
index fa1d076..0000000
Binary files a/image/Productivity.png and /dev/null differ
diff --git a/image/Program.png b/image/Program.png
deleted file mode 100644 (file)
index 01509c3..0000000
Binary files a/image/Program.png and /dev/null differ
diff --git a/image/Reports.png b/image/Reports.png
deleted file mode 100644 (file)
index 13f510e..0000000
Binary files a/image/Reports.png and /dev/null differ
diff --git a/image/System.png b/image/System.png
deleted file mode 100644 (file)
index 2ff892b..0000000
Binary files a/image/System.png and /dev/null differ
diff --git a/image/Warehouse.png b/image/Warehouse.png
deleted file mode 100644 (file)
index a19c637..0000000
Binary files a/image/Warehouse.png and /dev/null differ
diff --git a/image/bench_computer.png b/image/bench_computer.png
deleted file mode 100644 (file)
index 1336b4d..0000000
Binary files a/image/bench_computer.png and /dev/null differ
diff --git a/image/error.png b/image/error.png
deleted file mode 100644 (file)
index 6b990a2..0000000
Binary files a/image/error.png and /dev/null differ
diff --git a/image/fade_short.png b/image/fade_short.png
deleted file mode 100644 (file)
index 6a93e2c..0000000
Binary files a/image/fade_short.png and /dev/null differ
diff --git a/image/rechnung_anlegen.png b/image/rechnung_anlegen.png
deleted file mode 100644 (file)
index e713bb9..0000000
Binary files a/image/rechnung_anlegen.png and /dev/null differ
diff --git a/image/tux.png b/image/tux.png
deleted file mode 100644 (file)
index 049c041..0000000
Binary files a/image/tux.png and /dev/null differ
diff --git a/image/unterpunkt2.png b/image/unterpunkt2.png
deleted file mode 100644 (file)
index 3b9f550..0000000
Binary files a/image/unterpunkt2.png and /dev/null differ
index f0637d5..2ab00b6 100644 (file)
+#!/usr/bin/perl
+# -*- coding: utf-8; -*-
+# vim: fenc=utf-8
+
 # These are all the texts to build the translations files.
 # The file has the form of 'english text'  => 'foreign text',
 # you can add the translation in this file or in the 'missing' file
 # run locales.pl from this directory to rebuild the translation files
 
-$self{texts} = {
-  'AP'                          => 'Dépenses',
-  'AP Aging'                    => 'Dépenses exigibles',
-  'AP Transaction'              => 'Ecriture Dépense',
-  'AP Transactions'             => 'Mouvements - Dépenses',
-  'AR'                          => 'Recettes',
-  'AR Aging'                    => 'Recettes exigibles',
-  'AR Transaction'              => 'Ecriture Recette',
-  'AR Transactions'             => 'Mouvements - Recettes',
-  'About'                       => 'A propos',
-  'Access Control'              => 'Contrôle d\'accès',
-  'Account'                     => 'Compte',
-  'Account Number'              => 'Numéro de compte',
-  'Account Number missing!'     => 'Numéro de compte manquant!',
-  'Account Type'                => 'Type de compte',
-  'Account Type missing!'       => 'Type de compte manquant!',
-  'Account deleted!'            => 'Compte supprimé',
-  'Account saved!'              => 'Compte enregistré',
-  'Accounting'                  => 'Comptabilité',
-  'Accounting Menu'             => 'Menu de comptabilité',
-  'Accounts'                    => 'Comptes',
-  'Active'                      => 'Actif',
-  'Add'                         => 'Ajouter',
-  'Add Account'                 => 'Ajouter compte',
-  'Add Accounts Payables Transaction' => 'Saisie d\'écriture - Dépenses',
-  'Add Accounts Receivables Transaction' => 'Saisie d\'écriture - Recettes',
-  'Add Assembly'                => 'Ajouter produit',
-  'Add Customer'                => 'Ajouter client',
-  'Add GIFI'                    => 'Ajouter Code d\'Identification Comptable ou Fiscale',
-  'Add General Ledger Transaction' => 'Ajouter une Ã©criture au Grand Livre',
-  'Add Group'                   => 'Ajouter group',
-  'Add Part'                    => 'Ajouter marchandise',
-  'Add Project'                 => 'Ajouter projet',
-  'Add Purchase Order'          => 'Etablir commande d\'achat',
-  'Add Sales Invoice'           => 'Etablir facture de vente',
-  'Add Sales Order'             => 'Etablir commande de vente',
-  'Add Service'                 => 'Ajouter service',
-  'Add Transaction'             => 'Saisie d\'écriture',
-  'Add User'                    => 'Ajouter utilisateur',
-  'Add Vendor'                  => 'Ajouter fournisseur',
-  'Add Vendor Invoice'          => 'Etablir facture de vente',
-  'Address'                     => 'Adresse',
-  'Administration'              => 'Administration',
-  'Administrator'               => 'Administrateur',
-  'All'                         => 'Tous',
-  'All Datasets up to date!'    => 'Tous les fichiers de données sont Ã  jour!',
-  'Amount'                      => 'Total',
-  'Amount Due'                  => 'Montant dû',
-  'Amount does not equal applied!' => 'Le montant n\'est Ã©gal Ã  celui appliqué!',
-  'Amount missing!'             => 'Montant manquant',
-  'Applied'                     => 'Appliquer',
-  'Apr'                         => 'Avril',
-  'April'                       => 'Avril',
-  'Are you sure you want to delete Invoice Number' => 'Êtes-vous sûr de vouloir supprimer la Facture N°',
-  'Are you sure you want to delete Order Number' => 'Êtes vous sûr de vouloir supprimer Commande N°',
-  'Are you sure you want to delete Transaction' => 'Êtes vous sûr de vouloir effacer la saisie?',
-  'Assemblies'                  => 'Produits finis',
-  'Assemblies restocked!'       => 'Renvoyer produits vers stock!',
-  'Assembly Number missing!'    => 'Numéro de produit manquant',
-  'Asset'                       => 'Actif',
-  'Attachment'                  => 'Pièce jointe',
-  'Audit Control'               => 'Clôture périodique',
-  'Aug'                         => 'Août',
-  'August'                      => 'Août',
-  'BOM'                         => 'Nomenclature composantes',
-  'Backup'                      => 'Sauvegarder',
-  'Backup sent to'              => 'Sauvegarde envoyée Ã ',
-  'Balance'                     => 'Solde',
-  'Balance Sheet'               => 'Bilan',
-  'Bcc'                         => 'Bcc',
-  'Bin'                         => 'Localisation',
-  'Books are open'              => 'Début exercice',
-  'Bought'                      => 'Acheté',
-  'Business Number'             => 'Numéro d\'enregistrement société',
-  'C'                           => 'C',
-  'COGS'                        => 'CMV',
-  'Cannot delete account!'      => 'Impossible de supprimer le compte!',
-  'Cannot delete customer!'     => 'Impossible de supprimer le client!',
-  'Cannot delete default account!' => 'Ne peut pas supprimer le compte par defaut!',
-  'Cannot delete invoice!'      => 'Impossible de supprimer la facture',
-  'Cannot delete item!'         => 'Impossible de supprimer ce poste!',
-  'Cannot delete order!'        => 'Impossible de supprimer la commande!',
-  'Cannot delete transaction!'  => 'Impossible de supprimer la saisie!',
-  'Cannot delete vendor!'       => 'Impossible de supprimer le fournisseur!',
-  'Cannot have a value in both Debit and Credit!' => 'Impossible d\'avoir des valeurs dans Crédit et Débit en même temps!',
-  'Cannot post a transaction without a value!' => 'Impossible d\'effectuer une Ã©criture sans valeur!',
-  'Cannot post invoice for a closed period!' => 'Impossible d\'enregistrer la facture sur un exercice clos!',
-  'Cannot post invoice!'        => 'Impossible d\'enregistrer la facture!',
-  'Cannot post payment for a closed period!' => 'Impossible d\'enregistrer le paiement sur un exercice clos!',
-  'Cannot post payment!'        => 'Impossible d\'enregistrer le paiement!',
-  'Cannot post transaction for a closed period!' => 'Impossible d\'enregistrer l\'écriture sur un exercice clos!',
-  'Cannot post transaction!'    => 'Impossible d\'enregistrer l\'écriture!',
-  'Cannot process payment for a closed period!' => 'Impossible de faire un paiement sur un exercice clos!',
-  'Cannot save account!'        => 'Impossible d\'enregistrer le compte!',
-  'Cannot save order!'          => 'Impossible d\'enregistrer la commande!',
-  'Cannot save preferences!'    => 'Impossible d\'enregistrer les préférences',
-  'Cannot stock assemblies!'    => 'Impossible de stocker l\'assemblage!',
-  'Cash'                        => 'Financier',
-  'Cash based'                  => 'En liquide',
-  'Cc'                          => 'Cc',
-  'Change Admin Password'       => 'Changement de mot de passe administrateur',
-  'Change Password'             => 'Changement de mot de passe',
-  'Character Set'               => 'Encodage des caractères',
-  'Chart of Accounts'           => 'Plan Comptable',
-  'Check'                       => 'Chèque',
-  'Check printed!'              => 'Chèque imprimé!',
-  'Check printing failed!'      => 'Impression du chèque Ã©choué!',
-  'Cleared Balance'             => 'Solde rapproché',
-  'Click on login name to edit!' => 'Cliquer sur votre identifiant pour editer',
-  'Close Books up to'           => 'Clôturer l\'exercice jusqu\'au',
-  'Closed'                      => 'Clôturé',
-  'Company'                     => 'Société',
-  'Compare to'                  => 'Comparer Ã ',
-  'Confirm!'                    => 'Confirmez!',
-  'Connect to'                  => 'Connecter Ã ',
-  'Contact'                     => 'Contact',
-  'Continue'                    => 'Continuer',
-  'Copies'                      => 'Copies',
-  'Copy to COA'                 => 'Copier dans le Plan Comptable',
-  'Create Chart of Accounts'    => 'Créer le Plan Comptable',
-  'Create Dataset'              => 'Créer fichier de données',
-  'Credit'                      => 'Crédit',
-  'Credit Limit'                => 'Encours autorisé',
-  'Curr'                        => 'En cours',
-  'Currency'                    => 'Devise',
-  'Current'                     => 'En cours',
-  'Customer'                    => 'Client',
-  'Customer deleted!'           => 'Client supprimé!',
-  'Customer missing!'           => 'Client manquant!',
-  'Customer not on file!'       => 'Client absent du fichier!',
-  'Customer saved!'             => 'Client enregistré!',
-  'Customers'                   => 'Clients',
-  'DBI not installed!'          => 'DBI non installée!',
-  'Database'                    => 'Base de données',
-  'Database Administration'     => 'Gérer base de données',
-  'Database Driver not checked!' => 'Pilotes de base de données pas verifiés!',
-  'Database Host'               => 'Hôte de base de données',
-  'Database User missing!'      => 'Utilisateur base de données manquante!',
-  'Dataset'                     => 'Fichier de données',
-  'Dataset missing!'            => 'Fichier de données manquant!',
-  'Dataset updated!'            => 'Base de données mise Ã  jour!',
-  'Date'                        => 'Date',
-  'Date Format'                 => 'Format de Date',
-  'Date Paid'                   => 'Date de paiement',
-  'Date missing!'               => 'Date manquante!',
-  'Debit'                       => 'Débit',
-  'Debit and credit out of balance!' => 'Le débit et le crédit ne sont pas Ã©quilibrés!',
-  'Dec'                         => 'Déc.',
-  'December'                    => 'Décembre',
-  'Decimalplaces'               => 'Décimales',
-  'Delete'                      => 'Supprimer',
-  'Delete Account'              => 'Supprimer compte',
-  'Delete Dataset'              => 'Supprimer fichier de données',
-  'Delivery Date'               => 'Date de livraison',
-  'Deposit'                     => 'Dépôt',
-  'Description'                 => 'Description',
-  'Difference'                  => 'Différence',
-  'Directory'                   => 'Répertoire',
-  'Discount'                    => 'Remise',
-  'Done'                        => 'Fait!',
-  'Drawing'                     => 'Dessin',
-  'Driver'                      => 'Pilote',
-  'Dropdown Limit'              => 'Limit de déroulement',
-  'Due'                         => 'Echéance',
-  'Due Date'                    => 'Date d\'échéance',
-  'Due Date missing!'           => 'Date d\'échéance manquante!',
-  'E-mail'                      => 'Email',
-  'E-mail Statement to'         => 'Message Ã©léctronique Ã ',
-  'E-mail address missing!'     => 'Adresse email manquante!',
-  'Edit'                        => 'Modifier',
-  'Edit Account'                => 'Modifier le compte',
-  'Edit Accounts Payables Transaction' => 'Modifier Mouvements - Dépenses',
-  'Edit Accounts Receivables Transaction' => 'Modifier Mouvements - Recettes',
-  'Edit Assembly'               => 'Modifier produit fini / transformé',
-  'Edit Customer'               => 'Modifier client',
-  'Edit GIFI'                   => 'Modifier Code d\'Identification Comptable ou Fiscale',
-  'Edit General Ledger Transaction' => 'Modifier Ã©criture Grand Livre',
-  'Edit Group'                  => 'Modifier groupe',
-  'Edit Part'                   => 'Modifier marchandise',
-  'Edit Preferences for'        => 'Modifier les préférences pour',
-  'Edit Project'                => 'Modifier projet',
-  'Edit Purchase Order'         => 'Modifier commande d\'achat',
-  'Edit Sales Invoice'          => 'Modifier facture de vente',
-  'Edit Sales Order'            => 'Modifier commande de vente',
-  'Edit Service'                => 'Modifier service',
-  'Edit Template'               => 'Modifier modèle',
-  'Edit User'                   => 'Modifier utilisateur',
-  'Edit Vendor'                 => 'Modifier fournisseur',
-  'Edit Vendor Invoice'         => 'Modifier facture de fournisseur',
-  'Employee'                    => 'Employé',
-  'Enforce transaction reversal for all dates' => 'Appliquer l\'inversion des Ã©critures pour toutes les dates',
-  'Enter up to 3 letters separated by a colon (i.e CAD:USD:EUR) for your native and foreign currencies' => 'Entrer le nom de la monnaie nationale et des monnaies Ã©trangères en 3 lettres séparées par (:) (Ex: EUR:USD:CAD)',
-  'Equity'                      => 'Capital',
-  'Exch'                        => 'Change',
-  'Exchangerate'                => 'Taux de change',
-  'Exchangerate Difference'     => 'Différence de taux de change',
-  'Exchangerate for payment missing!' => 'Taux de change manquant pour le paiement!',
-  'Exchangerate missing!'       => 'Taux de change manquant!',
-  'Existing Datasets'           => 'Fichiers de données existants',
-  'Expense'                     => 'Dépense',
-  'Expense Account'             => 'Compte Dépenses',
-  'Expense/Asset'               => 'Dépense/Actif',
-  'Extended'                    => 'Prix Total',
-  'Fax'                         => 'Fax',
-  'Feb'                         => 'Fév.',
-  'February'                    => 'Février',
-  'Foreign Exchange Gain'       => 'Produit conversion devises',
-  'Foreign Exchange Loss'       => 'Perte conversion devises',
-  'From'                        => 'De',
-  'GIFI'                        => 'Code d\'Identification Comptable ou Fiscale',
-  'GIFI deleted!'               => 'Code d\'Identification Comptable ou Fiscale supprimé!',
-  'GIFI missing!'               => 'Code d\'Identification Comptable ou Fiscale manquant!',
-  'GIFI saved!'                 => 'Code d\'Identification Comptable ou Fiscale enregistré!',
-  'GL Transaction'              => 'Transaction Grand Livre',
-  'General Ledger'              => 'Grand Livre',
-  'Goods & Services'            => 'Articles & Services',
-  'Group'                       => 'Groupe',
-  'Group Items'                 => 'Grouper objets',
-  'Group deleted!'              => 'Groupe effacé!',
-  'Group missing!'              => 'Groupe absent!',
-  'Group saved!'                => 'Groupe enregistré!',
-  'Groups'                      => 'Groupes',
-  'HTML Templates'              => 'Gabarits HTML',
-  'Heading'                     => 'En-tête',
-  'Host'                        => 'Hôte',
-  'Hostname missing!'           => 'Nom de l\'hôte manquant',
-  'ID'                          => 'ID',
-  'Image'                       => 'Image',
-  'In-line'                     => 'En ligne',
-  'Include in Report'           => 'Inclure dans l\'état',
-  'Include in drop-down menus'  => 'Inclure dans les menus deroulants',
-  'Include this account on the customer/vendor forms to flag customer/vendor as taxable?' => 'Afficher ce compte sur les formulaires de client/fournisseur pour le marquer comme imposable?',
-  'Income'                      => 'Recettes',
-  'Income Account'              => 'Compte Recettes',
-  'Income Statement'            => 'Compte de Résultat',
-  'Incorrect Dataset version!'  => 'Fichier de données incorrect!',
-  'Incorrect Password!'         => 'Mot de passe incorrect!',
-  'Individual Items'            => 'Composition en marchandises individuelles',
-  'Inventory'                   => 'Inventaire',
-  'Inventory Account'           => 'Compte d\'Inventaire',
-  'Inventory quantity must be zero before you can set this assembly obsolete!' => 'La quantité en stock doit Ãªtre Ã  zéro avant de pouvoir indiquer cet assemblage comme obsolète!',
-  'Inventory quantity must be zero before you can set this part obsolete!' => 'La quantité en stock devrait Ãªtre zero avant de pouvoir indiquer cette pièce comme obsolète!',
-  'Invoice'                     => 'Facture',
-  'Invoice Date'                => 'Date de facturation',
-  'Invoice Date missing!'       => 'Date de facture manquante!',
-  'Invoice Number'              => 'Numéro de facture',
-  'Invoice Number missing!'     => 'Numéro de facture manquant!',
-  'Invoice deleted!'            => 'Facture supprimé!',
-  'Invoice posted!'             => 'Facture enregistré!',
-  'Invoices'                    => 'Factures',
-  'Is this a summary account to record' => 'Est-ce que c\'est un compte sommaire Ã  enregistrer?',
-  'Item deleted!'               => 'Objet supprimé!',
-  'Item not on file!'           => 'Objet non-listé!',
-  'Jan'                         => 'Jan.',
-  'January'                     => 'Janvier',
-  'Jul'                         => 'Juil.',
-  'July'                        => 'Juillet',
-  'Jun'                         => 'Juin',
-  'June'                        => 'Juin',
-  'LaTeX Templates'             => 'Gabarits LaTeX',
-  'Language'                    => 'Langue',
-  'Last Cost'                   => 'Dernier prix',
-  'Last Invoice Number'         => 'Dernier numéro de facture',
-  'Last Numbers & Default Accounts' => 'Derniers numéros et comptes par défauts',
-  'Last Purchase Order Number'  => 'Dernier numéro de commande d\'achat',
-  'Last Sales Order Number'     => 'Numéro de la dernière commande de vente',
-  'Leave host and port field empty unless you want to make a remote connection.' => 'Laisser "port" et "hôte" vide, sauf si vous voulez vous connecter Ã  distance (par réseau)',
-  'Liability'                   => 'Passif',
-  'Licensed to'                 => 'Licence Ã ',
-  'Line Total'                  => 'Total ligne',
-  'Link'                        => 'Liens',
-  'Link Accounts'               => 'Lier Comptes',
-  'List Accounts'               => 'Liste des comptes',
-  'List GIFI'                   => 'Afficher la liste des Codes d\'Identification Comptable ou Fiscale',
-  'List Price'                  => 'Prix de revient',
-  'List Transactions'           => 'Afficher Ã©critures',
-  'Login'                       => 'Login',
+$self->{texts} = {
+  ' Date missing!'              => '',
+  ' Part Number missing!'       => '',
+  ' missing!'                   => '',
+  '#1 prices were updated.'     => '',
+  '&lt;%account_number%&gt; -- Your account number' => '',
+  '&lt;%bank%&gt; -- Your bank' => '',
+  '&lt;%bank_code%&gt; -- Your bank code' => '',
+  '&lt;%currency%&gt; -- The selected currency' => '',
+  '&lt;%invtotal%&gt; -- Invoice total' => '',
+  '&lt;%invtotal_wo_skonto%&gt; -- Invoice total less discount' => '',
+  '&lt;%netto_date%&gt; -- Date the payment is due in full' => '',
+  '&lt;%skonto_amount%&gt; -- The deductible amount' => '',
+  '&lt;%skonto_date%&gt; -- Date the payment is due with discount' => '',
+  '&lt;%skonto_in_percent%&gt; -- The discount in percent' => '',
+  '&lt;%terms_netto%&gt; -- The number of days for full payment' => '',
+  '&lt;%total%&gt; -- Amount payable' => '',
+  '&lt;%total_wo_skonto%&gt; -- Amount payable less discount' => '',
+  '*/'                          => '',
+  '---please select---'         => '',
+  '...after loggin in'          => '',
+  '...done'                     => '',
+  '...on the TODO list'         => '',
+  '1. Quarter'                  => '',
+  '2. Quarter'                  => '',
+  '3. Quarter'                  => '',
+  '4. Quarter'                  => '',
+  '<b>What</b> do you want to look for?' => '',
+  'A Buchungsgruppe consists of a descriptive name and the account numbers for the income and expense accounts for those four tax zones as well as the inventory account number.' => '',
+  'A group named &quot;Full Access&quot; has been created.' => '',
+  'A group with that name does already exist.' => '',
+  'A lot of the usability of Lx-Office has been enhanced with javascript. Although it is currently possible to use every aspect of Lx-Office without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.' => '',
+  'A temporary directory could not be created:' => '',
+  'A temporary file could not be created. Please verify that the directory "#1" is writeable by the webserver.' => '',
+  'A temporary file could not be created:' => '',
+  'A unit with this name does already exist.' => '',
+  'A variable marked as \'editable\' can be changed in each quotation, order, invoice etc.' => '',
+  'ADDED'                       => '',
+  'AP'                          => '',
+  'AP Aging'                    => '',
+  'AP Transaction'              => '',
+  'AP Transaction (abbreviation)' => '',
+  'AP Transaction Storno (one letter abbreviation)' => '',
+  'AP Transaction with Storno (abbreviation)' => '',
+  'AP Transactions'             => '',
+  'AP transactions with sales taxkeys and/or AR transactions with input taxkeys' => '',
+  'AR'                          => '',
+  'AR Aging'                    => '',
+  'AR Transaction'              => '',
+  'AR Transaction (abbreviation)' => '',
+  'AR Transactions'             => '',
+  'ASSETS'                      => '',
+  'Abrechnungsnummer'           => '',
+  'Abteilung'                   => '',
+  'Account'                     => '',
+  'Account Category A'          => '',
+  'Account Category C'          => '',
+  'Account Category E'          => '',
+  'Account Category G'          => '',
+  'Account Category I'          => '',
+  'Account Category L'          => '',
+  'Account Category Q'          => '',
+  'Account Description missing!' => '',
+  'Account Link AP'             => '',
+  'Account Link AP_amount'      => '',
+  'Account Link AP_paid'        => '',
+  'Account Link AP_tax'         => '',
+  'Account Link AR'             => '',
+  'Account Link AR_amount'      => '',
+  'Account Link AR_paid'        => '',
+  'Account Link AR_tax'         => '',
+  'Account Link CT_tax'         => '',
+  'Account Link IC'             => '',
+  'Account Link IC_cogs'        => '',
+  'Account Link IC_expense'     => '',
+  'Account Link IC_income'      => '',
+  'Account Link IC_sale'        => '',
+  'Account Link IC_taxpart'     => '',
+  'Account Link IC_taxservice'  => '',
+  'Account Number'              => '',
+  'Account Number already used!' => '',
+  'Account Number missing!'     => '',
+  'Account Nummer'              => '',
+  'Account Type'                => '',
+  'Account Type missing!'       => '',
+  'Account deleted!'            => '',
+  'Account for fees'            => '',
+  'Account for interest'        => '',
+  'Account number'              => '',
+  'Account number #1, bank code #2, #3' => '',
+  'Account saved!'              => '',
+  'Accounting Group deleted!'   => '',
+  'Accounting Group saved!'     => '',
+  'Accrual'                     => '',
+  'Active'                      => '',
+  'Active?'                     => '',
+  'Add'                         => '',
+  'Add AP Transaction'          => '',
+  'Add AR Transaction'          => '',
+  'Add Account'                 => '',
+  'Add Accounting Group'        => '',
+  'Add Accounts Payables Transaction' => '',
+  'Add Accounts Receivables Transaction' => '',
+  'Add Assembly'                => '',
+  'Add Buchungsgruppe'          => '',
+  'Add Business'                => '',
+  'Add Credit Note'             => '',
+  'Add Customer'                => '',
+  'Add Delivery Order'          => '',
+  'Add Department'              => '',
+  'Add Dunning'                 => '',
+  'Add Exchangerate'            => '',
+  'Add Follow-Up'               => '',
+  'Add Follow-Up for #1'        => '',
+  'Add General Ledger Transaction' => '',
+  'Add Group'                   => '',
+  'Add Language'                => '',
+  'Add Lead'                    => '',
+  'Add License'                 => '',
+  'Add Part'                    => '',
+  'Add Payment Terms'           => '',
+  'Add Price Factor'            => '',
+  'Add Pricegroup'              => '',
+  'Add Printer'                 => '',
+  'Add Project'                 => '',
+  'Add Purchase Delivery Order' => '',
+  'Add Purchase Order'          => '',
+  'Add Quotation'               => '',
+  'Add RFQ'                     => '',
+  'Add Request for Quotation'   => '',
+  'Add Sales Delivery Order'    => '',
+  'Add Sales Invoice'           => '',
+  'Add Sales Order'             => '',
+  'Add Service'                 => '',
+  'Add Storno Credit Note'      => '',
+  'Add Transaction'             => '',
+  'Add User'                    => '',
+  'Add Vendor'                  => '',
+  'Add Vendor Invoice'          => '',
+  'Add Warehouse'               => '',
+  'Add a new group'             => '',
+  'Add and edit units'          => '',
+  'Add bank account'            => '',
+  'Add custom variable'         => '',
+  'Add note'                    => '',
+  'Add to group'                => '',
+  'Add unit'                    => '',
+  'Address'                     => '',
+  'Administration'              => '',
+  'Administration area'         => '',
+  'Advance turnover tax return' => '',
+  'Aktion'                      => '',
+  'All'                         => '',
+  'All Accounts'                => '',
+  'All Datasets up to date!'    => '',
+  'All changes in that file have been reverted.' => '',
+  'All database upgrades have been applied.' => '',
+  'All general ledger entries'  => '',
+  'All of the exports you have selected were already closed.' => '',
+  'All reports'                 => '',
+  'All the selected exports have already been closed, or all of their items have already been executed.' => '',
+  'Allow access'                => '',
+  'Allow the following users access to my follow-ups:' => '',
+  'Alternatively you can create a new part which will then be selected.' => '',
+  'Alternatively you can skip this step and create groups yourself.' => '',
+  'Amended Advance Turnover Tax Return' => '',
+  'Amended Advance Turnover Tax Return (Nr. 10)' => '',
+  'Amount'                      => '',
+  'Amount Due'                  => '',
+  'Annotations'                 => '',
+  'Another user with the login #1 does already exist.' => '',
+  'Ap aging on %s'              => '',
+  'Application Error. No Format given' => '',
+  'Application Error. Wrong Format' => '',
+  'Applying #1:'                => '',
+  'Approximately #1 prices will be updated.' => '',
+  'Apr'                         => '',
+  'April'                       => '',
+  'Ar aging on %s'              => '',
+  'Are you sure you want to delete Delivery Order Number #1?' => '',
+  'Are you sure you want to delete Invoice Number' => '',
+  'Are you sure you want to delete Order Number' => '',
+  'Are you sure you want to delete Quotation Number' => '',
+  'Are you sure you want to delete Transaction' => '',
+  'Are you sure you want to remove the marked entries from the queue?' => '',
+  'Are you sure you want to update the prices' => '',
+  'Article Code'                => '',
+  'Article Code missing!'       => '',
+  'As a result, the saved onhand values of the present goods can be stored into a warehouse designated by you, or will be reset for a proper warehouse tracking' => '',
+  'Assemblies'                  => '',
+  'Assembly Description'        => '',
+  'Assembly Number'             => '',
+  'Assembly Number missing!'    => '',
+  'Asset'                       => '',
+  'Assets'                      => '',
+  'Assign new units'            => '',
+  'Assign units'                => '',
+  'Assistant for general ledger corrections' => '',
+  'Assume Tax Consultant Data in Tax Computation?' => '',
+  'At least'                    => '',
+  'At least one Perl module that Lx-Office ERP requires for running is not installed on your system.' => '',
+  'At most'                     => '',
+  'At the moment the transaction looks like this:' => '',
+  'Attach PDF:'                 => '',
+  'Attachment'                  => '',
+  'Attachment name'             => '',
+  'Attempt to call an undefined sub named \'%s\'' => '',
+  'Audit Control'               => '',
+  'Aug'                         => '',
+  'August'                      => '',
+  'Authentification database creation' => '',
+  'Authentification tables creation' => '',
+  'Auto Send?'                  => '',
+  'Automatically created invoice for fee and interest for dunning %s' => '',
+  'Available qty'               => '',
+  'BALANCE SHEET'               => '',
+  'BIC'                         => '',
+  'BOM'                         => '',
+  'BWA'                         => '',
+  'Back'                        => '',
+  'Backup Dataset'              => '',
+  'Backup file'                 => '',
+  'Backup of dataset'           => '',
+  'Balance'                     => '',
+  'Balance Sheet'               => '',
+  'Bank'                        => '',
+  'Bank Code'                   => '',
+  'Bank Code (long)'            => '',
+  'Bank Code Number'            => '',
+  'Bank Connection Tax Office'  => '',
+  'Bank Connections'            => '',
+  'Bank accounts'               => '',
+  'Bank code'                   => '',
+  'Bank transfer amount'        => '',
+  'Bank transfer payment list for export #1' => '',
+  'Bank transfer via SEPA'      => '',
+  'Bank transfers via SEPA'     => '',
+  'Base unit'                   => '',
+  'Basic data'                  => '',
+  'Batch Printing'              => '',
+  'Bcc'                         => '',
+  'Belegnummer'                 => '',
+  'Beratername'                 => '',
+  'Beraternummer'               => '',
+  'Best Before'                 => '',
+  'Bestandskonto'               => '',
+  'Bilanz'                      => '',
+  'Billing Address'             => '',
+  'Billing/shipping address (city)' => '',
+  'Billing/shipping address (street)' => '',
+  'Billing/shipping address (zipcode)' => '',
+  'Bin'                         => '',
+  'Bin From'                    => '',
+  'Bin List'                    => '',
+  'Bin To'                      => '',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => '',
+  'Bins saved.'                 => '',
+  'Bins that have been used in the past cannot be deleted anymore. For these bins there\'s no checkbox in the &quot;Delete&quot; column.' => '',
+  'Birthday'                    => '',
+  'Bis'                         => '',
+  'Bis Konto: '                 => '',
+  'Body'                        => '',
+  'Body:'                       => '',
+  'Books are open'              => '',
+  'Books closed up to'          => '',
+  'Boolean variables: If the default value is non-empty then the checkbox will be checked by default and unchecked otherwise.' => '',
+  'Both'                        => '',
+  'Bottom'                      => '',
+  'Bought'                      => '',
+  'Buchungsdatum'               => '',
+  'Buchungsgruppe'              => '',
+  'Buchungsgruppen'             => '',
+  'Buchungskonto'               => '',
+  'Buchungsnummer'              => '',
+  'Business Number'             => '',
+  'Business Volume'             => '',
+  'Business deleted!'           => '',
+  'Business saved!'             => '',
+  'CANCELED'                    => '',
+  'CB Transaction'              => '',
+  'CR'                          => '',
+  'CRM admin'                   => '',
+  'CRM create customers, vendors and contacts' => '',
+  'CRM follow up'               => '',
+  'CRM know how'                => '',
+  'CRM notices'                 => '',
+  'CRM opportunity'             => '',
+  'CRM optional software'       => '',
+  'CRM other'                   => '',
+  'CRM search'                  => '',
+  'CRM send email'              => '',
+  'CRM services'                => '',
+  'CRM status'                  => '',
+  'CRM termin'                  => '',
+  'CRM user'                    => '',
+  'CSV export -- options'       => '',
+  'Calculate'                   => '',
+  'Can not create that quantity with current stock' => '',
+  'Cancel'                      => '',
+  'Cancel Accounts Payables Transaction' => '',
+  'Cancel Accounts Receivables Transaction' => '',
+  'Cannot create Lock!'         => '',
+  'Cannot delete account!'      => '',
+  'Cannot delete customer!'     => '',
+  'Cannot delete default account!' => '',
+  'Cannot delete delivery order!' => '',
+  'Cannot delete invoice!'      => '',
+  'Cannot delete item!'         => '',
+  'Cannot delete order!'        => '',
+  'Cannot delete quotation!'    => '',
+  'Cannot delete transaction!'  => '',
+  'Cannot delete vendor!'       => '',
+  'Cannot have a value in both Debit and Credit!' => '',
+  'Cannot post Payment!'        => '',
+  'Cannot post Receipt!'        => '',
+  'Cannot post a transaction without a value!' => '',
+  'Cannot post invoice for a closed period!' => '',
+  'Cannot post invoice!'        => '',
+  'Cannot post payment for a closed period!' => '',
+  'Cannot post payment!'        => '',
+  'Cannot post transaction for a closed period!' => '',
+  'Cannot post transaction with a debit and credit entry for the same account!' => '',
+  'Cannot post transaction!'    => '',
+  'Cannot process payment for a closed period!' => '',
+  'Cannot remove files!'        => '',
+  'Cannot save account!'        => '',
+  'Cannot save order!'          => '',
+  'Cannot save preferences!'    => '',
+  'Cannot save quotation!'      => '',
+  'Cannot storno storno invoice!' => '',
+  'Carry over shipping address' => '',
+  'Cash'                        => '',
+  'Cc'                          => '',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => '',
+  'Change representative to'    => '',
+  'Charge Number'               => '',
+  'Charge number'               => '',
+  'Chart'                       => '',
+  'Chart Type'                  => '',
+  'Chart balance'               => '',
+  'Chart of Accounts'           => '',
+  'Chart of accounts'           => '',
+  'Chartaccounts connected to this Tax:' => '',
+  'Check'                       => '',
+  'Check Details'               => '',
+  'Checks'                      => '',
+  'Choose Customer'             => '',
+  'Choose Outputformat'         => '',
+  'Choose Vendor'               => '',
+  'Choose a Tax Number'         => '',
+  'City'                        => '',
+  'Cleared Balance'             => '',
+  'Clearing Tax Received (No 71)' => '',
+  'Click on login name to edit!' => '',
+  'Close'                       => '',
+  'Close Books up to'           => '',
+  'Close SEPA exports'          => '',
+  'Close Window'                => '',
+  'Closed'                      => '',
+  'Collective Orders only work for orders from one customer!' => '',
+  'Comment'                     => '',
+  'Company'                     => '',
+  'Company Name'                => '',
+  'Compare to'                  => '',
+  'Configuration of individual TODO items' => '',
+  'Confirm'                     => '',
+  'Confirm!'                    => '',
+  'Confirmation'                => '',
+  'Contact'                     => '',
+  'Contact Person'              => '',
+  'Contact person (surname)'    => '',
+  'Contacts'                    => '',
+  'Continue'                    => '',
+  'Contra'                      => '',
+  'Copies'                      => '',
+  'Correct taxkey'              => '',
+  'Corrections'                 => '',
+  'Cost Center'                 => '',
+  'Costs'                       => '',
+  'Could not copy %s to %s. Reason: %s' => '',
+  'Could not open the file users/members.' => '',
+  'Could not open the old memberfile.' => '',
+  'Could not print dunning.'    => '',
+  'Could not rename %s to %s. Reason: %s' => '',
+  'Could not spawn ghostscript.' => '',
+  'Could not spawn the printer command.' => '',
+  'Could not update prices!'    => '',
+  'Country'                     => '',
+  'Create Assembly'             => '',
+  'Create Buchungsgruppen'      => '',
+  'Create Chart of Accounts'    => '',
+  'Create Dataset'              => '',
+  'Create Date'                 => '',
+  'Create a standard group'     => '',
+  'Create and edit RFQs'        => '',
+  'Create and edit customers and vendors' => '',
+  'Create and edit dunnings'    => '',
+  'Create and edit invoices and credit notes' => '',
+  'Create and edit parts, services, assemblies' => '',
+  'Create and edit projects'    => '',
+  'Create and edit purchase delivery orders' => '',
+  'Create and edit purchase orders' => '',
+  'Create and edit sales delivery orders' => '',
+  'Create and edit sales orders' => '',
+  'Create and edit sales quotations' => '',
+  'Create and edit vendor invoices' => '',
+  'Create bank transfer'        => '',
+  'Create bank transfer via SEPA XML' => '',
+  'Create invoice?'             => '',
+  'Create new'                  => '',
+  'Create tables'               => '',
+  'Created by'                  => '',
+  'Created for'                 => '',
+  'Created on'                  => '',
+  'Credit'                      => '',
+  'Credit (one letter abbreviation)' => '',
+  'Credit Account'              => '',
+  'Credit Limit'                => '',
+  'Credit Limit exceeded!!!'    => '',
+  'Credit Note'                 => '',
+  'Credit Note Date'            => '',
+  'Credit Note Number'          => '',
+  'Credit Starting Balance'     => '',
+  'Credit Tax'                  => '',
+  'Credit Tax Account'          => '',
+  'Credit note (one letter abbreviation)' => '',
+  'Curr'                        => '',
+  'Currencies'                  => '',
+  'Currency'                    => '',
+  'Current / Next Level'        => '',
+  'Current Earnings'            => '',
+  'Current unit'                => '',
+  'Current value:'              => '',
+  'Custom Variables'            => '',
+  'Custom variables for module' => '',
+  'Customer'                    => '',
+  'Customer Name'               => '',
+  'Customer Number'             => '',
+  'Customer Order Number'       => '',
+  'Customer deleted!'           => '',
+  'Customer details'            => '',
+  'Customer missing!'           => '',
+  'Customer not on file or locked!' => '',
+  'Customer not on file!'       => '',
+  'Customer saved!'             => '',
+  'Customer type'               => '',
+  'Customername'                => '',
+  'Customernumberinit'          => '',
+  'Customers'                   => '',
+  'Customers and vendors'       => '',
+  'Customized Report'           => '',
+  'DATEV - Export Assistent'    => '',
+  'DATEV Angaben'               => '',
+  'DATEV Export'                => '',
+  'DATEX - Export Assistent'    => '',
+  'DELETED'                     => '',
+  'DFV-Kennzeichen'             => '',
+  'DR'                          => '',
+  'DUNNING STARTED'             => '',
+  'DUNS-Nr'                     => '',
+  'Database'                    => '',
+  'Database Administration'     => '',
+  'Database Connection Test'    => '',
+  'Database Host'               => '',
+  'Database User missing!'      => '',
+  'Database backups and restorations are disabled in lx-erp.conf.' => '',
+  'Database name'               => '',
+  'Database template'           => '',
+  'Database update error:'      => '',
+  'Dataset'                     => '',
+  'Dataset missing!'            => '',
+  'Dataset name'                => '',
+  'Dataset upgrade'             => '',
+  'Date'                        => '',
+  'Date Format'                 => '',
+  'Date Paid'                   => '',
+  'Date and timestamp variables: If the default value equals \'NOW\' then the current date/current timestamp will be used. Otherwise the default value is copied as-is.' => '',
+  'Date missing!'               => '',
+  'Datevautomatik'              => '',
+  'Datum von'                   => '',
+  'Debit'                       => '',
+  'Debit (one letter abbreviation)' => '',
+  'Debit Account'               => '',
+  'Debit Starting Balance'      => '',
+  'Debit Tax'                   => '',
+  'Debit Tax Account'           => '',
+  'Debit and credit out of balance!' => '',
+  'Dec'                         => '',
+  'December'                    => '',
+  'Decimalplaces'               => '',
+  'Decrease'                    => '',
+  'Default (no language selected)' => '',
+  'Default Accounts'            => '',
+  'Default output medium'       => '',
+  'Default printer'             => '',
+  'Default template format'     => '',
+  'Default value'               => '',
+  'Defaults saved.'             => '',
+  'Delete'                      => '',
+  'Delete Account'              => '',
+  'Delete Contact'              => '',
+  'Delete Dataset'              => '',
+  'Delete Shipto'               => '',
+  'Delete delivery order'       => '',
+  'Delete drafts'               => '',
+  'Delete group'                => '',
+  'Delete transaction'          => '',
+  'Delivered'                   => '',
+  'Delivery Date'               => '',
+  'Delivery Order'              => '',
+  'Delivery Order Date'         => '',
+  'Delivery Order Date missing!' => '',
+  'Delivery Order Number'       => '',
+  'Delivery Order deleted!'     => '',
+  'Delivery Orders'             => '',
+  'Department'                  => '',
+  'Department deleted!'         => '',
+  'Department saved!'           => '',
+  'Departments'                 => '',
+  'Dependency loop detected:'   => '',
+  'Deposit'                     => '',
+  'Description'                 => '',
+  'Description (Click on Description for details)' => '',
+  'Description missing!'        => '',
+  'Description must not be empty!' => '',
+  'Destination BIC'             => '',
+  'Destination IBAN'            => '',
+  'Destination bin'             => '',
+  'Destination warehouse'       => '',
+  'Destination warehouse and bin' => '',
+  'Details (one letter abbreviation)' => '',
+  'Difference'                  => '',
+  'Dimension unit'              => '',
+  'Directory'                   => '',
+  'Discount'                    => '',
+  'Display'                     => '',
+  'Display file'                => '',
+  'Display options'             => '',
+  'Do you really want to close the following SEPA exports? No payment will be recorded for bank transfers that haven\'t been marked as executed yet.' => '',
+  'Do you really want to delete AP transaction #1?' => '',
+  'Do you really want to delete AR transaction #1?' => '',
+  'Do you really want to delete GL transaction #1?' => '',
+  'Do you really want to delete this group:' => '',
+  'Do you really want to delete this warehouse?' => '',
+  'Do you want Lx-Office to create a group for access to all functions?' => '',
+  'Do you want to <b>limit</b> your search?' => '',
+  'Do you want to carry this shipping address over to the new purchase order so that the vendor can deliver the goods directly to your customer?' => '',
+  'Do you want to store the existing onhand values into a new warehouse?' => '',
+  'Document'                    => '',
+  'Documents in the WebDAV repository' => '',
+  'Done'                        => '',
+  'Download SEPA XML export file' => '',
+  'Download the backup'         => '',
+  'Draft saved.'                => '',
+  'Drawing'                     => '',
+  'Driver'                      => '',
+  'Dropdown Limit'              => '',
+  'Due'                         => '',
+  'Due Date'                    => '',
+  'Due Date missing!'           => '',
+  'Duedate +Days'               => '',
+  'Dunning'                     => '',
+  'Dunning Amount'              => '',
+  'Dunning Date'                => '',
+  'Dunning Date from'           => '',
+  'Dunning Description'         => '',
+  'Dunning Description missing in row ' => '',
+  'Dunning Duedate'             => '',
+  'Dunning Level'               => '',
+  'Dunning Level missing in row ' => '',
+  'Dunning Process Config saved!' => '',
+  'Dunning Process started for selected invoices!' => '',
+  'Dunning number'              => '',
+  'Dunning overview'            => '',
+  'Dunnings'                    => '',
+  'During this user migration Lx-Office can create such a group for you and grant all users access to all of Lx-Office\'s functions.' => '',
+  'E-mail'                      => '',
+  'E-mail Statement to'         => '',
+  'E-mail address missing!'     => '',
+  'EAN'                         => '',
+  'EAN-Code'                    => '',
+  'EB-Wert'                     => '',
+  'EK'                          => '',
+  'ELSE'                        => '',
+  'ELSTER Export (Taxbird)'     => '',
+  'ELSTER Export (Winston)'     => '',
+  'ELSTER Export nach Winston'  => '',
+  'ELSTER Tax Number'           => '',
+  'EQUITY'                      => '',
+  'EU with VAT ID'              => '',
+  'EU without VAT ID'           => '',
+  'EUER'                        => '',
+  'EUR'                         => '',
+  'Earlier versions of Lx-Office contained bugs which might have led to wrong entries in the general ledger.' => '',
+  'Edit'                        => '',
+  'Edit Access Rights'          => '',
+  'Edit Access Rights for Follow-Ups' => '',
+  'Edit Account'                => '',
+  'Edit Accounting Group'       => '',
+  'Edit Accounts Payables Transaction' => '',
+  'Edit Accounts Receivables Transaction' => '',
+  'Edit Assembly'               => '',
+  'Edit Bins'                   => '',
+  'Edit Buchungsgruppe'         => '',
+  'Edit Business'               => '',
+  'Edit Credit Note'            => '',
+  'Edit Customer'               => '',
+  'Edit Department'             => '',
+  'Edit Dunning'                => '',
+  'Edit Dunning Process Config' => '',
+  'Edit Follow-Up'              => '',
+  'Edit Follow-Up for #1'       => '',
+  'Edit General Ledger Transaction' => '',
+  'Edit Group'                  => '',
+  'Edit Language'               => '',
+  'Edit Lead'                   => '',
+  'Edit Part'                   => '',
+  'Edit Payment Terms'          => '',
+  'Edit Preferences for #1'     => '',
+  'Edit Price Factor'           => '',
+  'Edit Pricegroup'             => '',
+  'Edit Printer'                => '',
+  'Edit Project'                => '',
+  'Edit Purchase Delivery Order' => '',
+  'Edit Purchase Order'         => '',
+  'Edit Quotation'              => '',
+  'Edit Request for Quotation'  => '',
+  'Edit Sales Delivery Order'   => '',
+  'Edit Sales Invoice'          => '',
+  'Edit Sales Order'            => '',
+  'Edit Service'                => '',
+  'Edit Storno Credit Note'     => '',
+  'Edit Storno Invoice'         => '',
+  'Edit User'                   => '',
+  'Edit Vendor'                 => '',
+  'Edit Vendor Invoice'         => '',
+  'Edit Warehouse'              => '',
+  'Edit and delete a group'     => '',
+  'Edit bank account'           => '',
+  'Edit custom variable'        => '',
+  'Edit file'                   => '',
+  'Edit greetings'              => '',
+  'Edit group '                 => '',
+  'Edit group membership'       => '',
+  'Edit groups'                 => '',
+  'Edit note'                   => '',
+  'Edit rights'                 => '',
+  'Edit templates'              => '',
+  'Edit the Delivery Order'     => '',
+  'Edit the membership of all users in all groups:' => '',
+  'Edit the purchase_order'     => '',
+  'Edit the request_quotation'  => '',
+  'Edit the sales_order'        => '',
+  'Edit the sales_quotation'    => '',
+  'Edit the stylesheet'         => '',
+  'Edit units'                  => '',
+  'Editable'                    => '',
+  'Either there are no open invoices, or you have already initiated bank transfers with the open amounts for those that are still open.' => '',
+  'Element disabled'            => '',
+  'Employee'                    => '',
+  'Empty transaction!'          => '',
+  'Enter a description for this new draft.' => '',
+  'Enter longdescription'       => '',
+  'Enter the requested execution date or leave empty for the quickest possible execution:' => '',
+  'Enter up to 3 letters separated by a colon (i.e CAD:USD:EUR) for your native and foreign currencies' => '',
+  'Equity'                      => '',
+  'Error'                       => '',
+  'Error in database control file \'%s\': %s' => '',
+  'Error in position #1: You must either assign no stock at all or the full quantity of #2 #3.' => '',
+  'Error in position #1: You must either assign no transfer at all or the full quantity of #2 #3.' => '',
+  'Error in row #1: The quantity you entered is bigger than the stocked quantity.' => '',
+  'Error message from the database driver:' => '',
+  'Error!'                      => '',
+  'Ertrag'                      => '',
+  'Ertrag prozentual'           => '',
+  'Escape character'            => '',
+  'Exact'                       => '',
+  'Excel'                       => '',
+  'Exch'                        => '',
+  'Exchangerate'                => '',
+  'Exchangerate Difference'     => '',
+  'Exchangerate for payment missing!' => '',
+  'Exchangerate missing!'       => '',
+  'Executed'                    => '',
+  'Execution date'              => '',
+  'Execution date from'         => '',
+  'Execution date to'           => '',
+  'Existing Buchungsgruppen'    => '',
+  'Existing Datasets'           => '',
+  'Existing pending follow-ups for this item' => '',
+  'Expected Tax'                => '',
+  'Expense'                     => '',
+  'Expense Account'             => '',
+  'Expense accno'               => '',
+  'Expense/Asset'               => '',
+  'Expenses EU with UStId'      => '',
+  'Expenses EU without UStId'   => '',
+  'Expired licenses'            => '',
+  'Expiring in x month(s)'      => '',
+  'Export Buchungsdaten'        => '',
+  'Export Stammdaten'           => '',
+  'Export as CSV'               => '',
+  'Export as PDF'               => '',
+  'Export date'                 => '',
+  'Export date from'            => '',
+  'Export date to'              => '',
+  'Extended'                    => '',
+  'Extension Of Time'           => '',
+  'Factor'                      => '',
+  'Factor missing!'             => '',
+  'Falsches Datumsformat!'      => '',
+  'Favorites'                   => '',
+  'Fax'                         => '',
+  'Feb'                         => '',
+  'February'                    => '',
+  'Fee'                         => '',
+  'File'                        => '',
+  'File name'                   => '',
+  'Files created by Lx-Office\'s &quot;Backup Dataset&quot; function are such files.' => '',
+  'Filter'                      => '',
+  'Finish'                      => '',
+  'Fix transaction'             => '',
+  'Fix transactions'            => '',
+  'Folgekonto'                  => '',
+  'Follow-Up'                   => '',
+  'Follow-Up Date'              => '',
+  'Follow-Up On'                => '',
+  'Follow-Up done'              => '',
+  'Follow-Up for'               => '',
+  'Follow-Up for user'          => '',
+  'Follow-Up saved.'            => '',
+  'Follow-Ups'                  => '',
+  'Follow-up for'               => '',
+  'Font'                        => '',
+  'Font size'                   => '',
+  'For AP transactions it will replace the sales taxkeys with input taxkeys with the same tax rate.' => '',
+  'For AR transactions it will replace the input taxkeys with sales taxkeys with the same tax rate.' => '',
+  'For each unit there\'s either no or exactly one base unit. If you chose a base unit then you also have to chose a factor. That way the new unit will be defined as a multiple of the base unit. The base unit must be the &quot;smaller&quot; one. A factor may not be less than 1. Therefore you may define &quot;kg&quot; with the base unit &quot;g&quot; and a factor of &quot;1&quot;, but not the other way round.' => '',
+  'Foreign Exchange Gain'       => '',
+  'Foreign Exchange Loss'       => '',
+  'Foreign Expenses'            => '',
+  'Foreign Revenues'            => '',
+  'Form details (second row)'   => '',
+  'Formula'                     => '',
+  'Free report period'          => '',
+  'Free-form text'              => '',
+  'Fristsetzung'                => '',
+  'From'                        => '',
+  'From Date'                   => '',
+  'Full Access'                 => '',
+  'Full access to all functions' => '',
+  'Fwd'                         => '',
+  'GL Transaction'              => '',
+  'Gegenkonto'                  => '',
+  'Gender'                      => '',
+  'General Ledger'              => '',
+  'General Ledger Corrections'  => '',
+  'General Ledger Transaction'  => '',
+  'General ledger and cash'     => '',
+  'General ledger corrections'  => '',
+  'Generic Tax Report'          => '',
+  'Given Name'                  => '',
+  'Go one step back'            => '',
+  'Go one step forward'         => '',
+  'Greeting'                    => '',
+  'Greetings'                   => '',
+  'Group'                       => '',
+  'Group Invoices'              => '',
+  'Group Items'                 => '',
+  'Group deleted!'              => '',
+  'Group membership'            => '',
+  'Group missing!'              => '',
+  'Group saved!'                => '',
+  'Groups'                      => '',
+  'HTML'                        => '',
+  'HTML Templates'              => '',
+  'Hardcopy'                    => '',
+  'Has serial number'           => '',
+  'Header'                      => '',
+  'Heading'                     => '',
+  'Help'                        => '',
+  'Here\'s an example command line:' => '',
+  'Hide by default'             => '',
+  'History'                     => '',
+  'History Search'              => '',
+  'History Search Engine'       => '',
+  'Homepage'                    => '',
+  'Host'                        => '',
+  'However, you can create a new part which will then be selected.' => '',
+  'I'                           => '',
+  'IBAN'                        => '',
+  'ID'                          => '',
+  'ID-Nummer'                   => '',
+  'II'                          => '',
+  'III'                         => '',
+  'IV'                          => '',
+  'If the automatic creation of invoices for fees and interest is switched on for a dunning level then the following accounts will be used for the invoice.' => '',
+  'If the database user listed above does not have the right to create a database then enter the name and password of the superuser below:' => '',
+  'If you chose to let Lx-Office do the migration then Lx-Office will also remove the old member file after creating a backup copy of it in the directory &quot;#1&quot;.' => '',
+  'If you enter values for the part number and / or part description then only those bins containing parts whose part number or part description match your input will be shown.' => '',
+  'If you see this message, you most likely just setup your LX-Office and haven\'t added any entry types. If this is the case, the option is accessible for administrators in the System menu.' => '',
+  'If you want to change any of these parameters then press the &quot;Back&quot; button, edit the file &quot;config/authentication.pl&quot; and login into the admin module again.' => '',
+  'If you want to delete such a dataset you have to edit the user(s) that are using the dataset in question and have them use another dataset.' => '',
+  'If you want to set up the authentication database yourself then log in to the administration panel. Lx-Office will then create the database and tables for you.' => '',
+  'If you yourself want to upgrade the installation then please read the file &quot;doc/UPGRADE&quot; and follow the steps outlined in this file.' => '',
+  'Image'                       => '',
+  'Import CSV'                  => '',
+  'In Lx-Office 2.4.0 the administrator has to enter a list of units in the administrative section.' => '',
+  'In order to do that hit the button "Delete transaction".' => '',
+  'In the latter case the tables needed by Lx-Office will be created in that database.' => '',
+  'In-line'                     => '',
+  'Inactive'                    => '',
+  'Include Exchangerate Difference' => '',
+  'Include column headings'     => '',
+  'Include empty bins'          => '',
+  'Include in Report'           => '',
+  'Include in drop-down menus'  => '',
+  'Includeable in reports'      => '',
+  'Income Statement'            => '',
+  'Income accno'                => '',
+  'Incoming Payments'           => '',
+  'Incoming invoice number'     => '',
+  'Incorrect Password!'         => '',
+  'Incorrect username or password!' => '',
+  'Increase'                    => '',
+  'Individual Items'            => '',
+  'Information'                 => '',
+  'Interest'                    => '',
+  'Interest Rate'               => '',
+  'Internal Notes'              => '',
+  'International'               => '',
+  'Internet'                    => '',
+  'Introduction of Buchungsgruppen' => '',
+  'Introduction of units'       => '',
+  'Inv. Duedate'                => '',
+  'Invalid'                     => '',
+  'Invalid follow-up ID.'       => '',
+  'Invalid quantity.'           => '',
+  'Invdate'                     => '',
+  'Invdate from'                => '',
+  'Inventory'                   => '',
+  '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!' => '',
+  'Invno.'                      => '',
+  'Invnumber'                   => '',
+  'Invnumber missing!'          => '',
+  'Invoice'                     => '',
+  'Invoice (one letter abbreviation)' => '',
+  'Invoice Date'                => '',
+  'Invoice Date missing!'       => '',
+  'Invoice Duedate'             => '',
+  'Invoice Number'              => '',
+  'Invoice Number missing!'     => '',
+  'Invoice deleted!'            => '',
+  'Invoice for fees'            => '',
+  'Invoice has already been storno\'d!' => '',
+  'Invoice number'              => '',
+  'Invoice with Storno (abbreviation)' => '',
+  'Invoices'                    => '',
+  'Is this a summary account to record' => '',
+  '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 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!'               => '',
+  'Item not on file!'           => '',
+  'Jahresverkehrszahlen neu'    => '',
+  'Jan'                         => '',
+  'January'                     => '',
+  'Journal'                     => '',
+  'Jul'                         => '',
+  'July'                        => '',
+  'Jump to'                     => '',
+  'Jun'                         => '',
+  'June'                        => '',
+  'KNE-Export erfolgreich!'     => '',
+  'KNr. beim Kunden'            => '',
+  'Keine Suchergebnisse gefunden!' => '',
+  'Konten'                      => '',
+  'Kontonummernerweiterung (KNE)' => '',
+  'L'                           => '',
+  'LIABILITIES'                 => '',
+  'LP'                          => '',
+  'LaTeX Templates'             => '',
+  'Landscape'                   => '',
+  'Language'                    => '',
+  'Language Values'             => '',
+  'Language deleted!'           => '',
+  'Language missing!'           => '',
+  'Language saved!'             => '',
+  'Languages'                   => '',
+  'Last Article Number'         => '',
+  'Last Cost'                   => '',
+  'Last Credit Note Number'     => '',
+  'Last Customer Number'        => '',
+  'Last Invoice Number'         => '',
+  'Last Purchase Delivery Order Number' => '',
+  'Last Purchase Order Number'  => '',
+  'Last RFQ Number'             => '',
+  'Last Sales Delivery Order Number' => '',
+  'Last Sales Order Number'     => '',
+  'Last Sales Quotation Number' => '',
+  'Last Service Number'         => '',
+  'Last Transaction'            => '',
+  'Last Vendor Number'          => '',
+  'Lead'                        => '',
+  'Leave host and port field empty unless you want to make a remote connection.' => '',
+  'Left'                        => '',
+  'Liability'                   => '',
+  'License'                     => '',
+  'License key'                 => '',
+  'Licensed to'                 => '',
+  'Licenses'                    => '',
+  'Limit part selection'        => '',
+  'Line Total'                  => '',
+  'Line endings'                => '',
+  'List'                        => '',
+  'List Accounting Groups'      => '',
+  'List Accounts'               => '',
+  'List Businesses'             => '',
+  'List Departments'            => '',
+  'List Groups'                 => '',
+  'List Languages'              => '',
+  'List Lead'                   => '',
+  'List Payment Terms'          => '',
+  'List Price'                  => '',
+  'List Price Factors'          => '',
+  'List Pricegroups'            => '',
+  'List Printer'                => '',
+  'List Tax'                    => '',
+  'List Transactions'           => '',
+  'List Warehouses'             => '',
+  'List bank accounts'          => '',
+  'List export'                 => '',
+  'List of bank accounts'       => '',
+  'List of bank transfers'      => '',
+  'List of custom variables'    => '',
+  'List open SEPA exports'      => '',
+  'Load draft'                  => '',
+  'Local Tax Office Preferences' => '',
+  'Lock System'                 => '',
+  'Lockfile created!'           => '',
+  'Lockfile removed!'           => '',
+  'Login'                       => '',
+  'Login Name'                  => '',
   'Login name missing!'         => '',
-  'Logout'                      => 'Déconnexion',
-  'Make'                        => 'Marque',
-  'Mar'                         => 'Mars',
-  'March'                       => 'Mars',
-  'May'                         => 'Mai',
-  'May '                        => 'Mai ',
-  'Message'                     => 'Message',
-  'Microfiche'                  => 'Microfiche',
-  'Model'                       => 'Modèle',
-  'Multibyte Encoding'          => 'Encodage multibyte',
-  'N/A'                         => 'Non Applicable',
-  'Name'                        => 'Nom',
-  'Name missing!'               => 'Nom manquant!',
-  'New Templates'               => 'Nouveaux gabarits',
-  'No'                          => 'Non',
-  'No Database Drivers available!' => 'Pas de pilotes de base de données disponibles!',
-  'No Dataset selected!'        => 'Pas de fichier de données sélectioné!',
-  'No email address for'        => 'Pas d\'adresse email pour',
-  'No.'                         => 'No.',
-  'Notes'                       => 'Notes',
-  'Nothing applied!'            => 'Rien n\'a Ã©té appliqué!',
-  'Nothing selected!'           => 'Pas de sélection!',
-  'Nothing to delete!'          => 'Rien Ã  supprimer',
-  'Nov'                         => 'Nov.',
-  'November'                    => 'Novembre',
-  'Number'                      => 'Numéro',
-  'Number Format'               => 'Format des numéros',
-  'Number missing in Row'       => 'Numéro manquant dans ligne',
-  'O'                           => 'O',
-  'Obsolete'                    => 'Obsolète',
-  'Oct'                         => 'Oct.',
-  'October'                     => 'Octobre',
-  'On Hand'                     => 'En Stock / Disponible',
-  'On Order'                    => 'Sur Commande',
-  'Open'                        => 'Ouvert',
-  'Oracle Database Administration' => 'Administration de base de données Oracle',
-  'Order'                       => 'Commande',
-  'Order Date'                  => 'Date commande',
-  'Order Date missing!'         => 'Date de commande manquante!',
-  'Order Entry'                 => 'Bons de Commandes',
-  'Order Number'                => 'Numéro de commande',
-  'Order Number missing!'       => 'Numéro de commande manquant!',
-  'Order deleted!'              => 'Commande supprimé!',
-  'Order saved!'                => 'Commande enregistré!',
-  'Ordered'                     => 'Commandé',
-  'Orphaned'                    => 'Orphelin',
-  'Out of balance!'             => 'Solde non Ã©quilibré!',
-  'PDF'                         => 'PDF',
-  'Packing List'                => 'Liste d\'envoi',
-  'Packing List Date missing!'  => 'La date est manquante sur la liste d\'envoi!',
-  'Packing List Number missing!' => 'Le numéro de liste d\'envoi est manquant!',
-  'Paid'                        => 'Total Payé',
-  'Paid in full'                => 'Complètement payé',
-  'Part'                        => 'Marchandise',
-  'Part Number missing!'        => 'Numéro de marchandise manquant!',
-  'Parts'                       => 'Marchandises',
-  'Parts Inventory'             => 'Inventaire marchandises',
-  'Password'                    => 'Mot de Passe',
-  'Password changed!'           => 'Mot de passe changé!',
-  'Payables'                    => 'À Payer',
-  'Payment'                     => 'Paiement',
-  'Payment date missing!'       => 'Date de paiement manquant!',
-  'Payment posted!'             => 'Paiement enregistré!',
-  'Payments'                    => 'Paiements',
-  'Pg Database Administration'  => 'Administration base de données PostgreSQL',
-  'Phone'                       => 'Tél.',
-  'Port'                        => 'Port',
-  'Port missing!'               => 'Port manquant!',
-  'Post'                        => 'Enregistrer',
-  'Post as new'                 => 'Enregistrer comme nouveau',
-  'Postscript'                  => 'Postcript',
-  'Preferences'                 => 'Préférences',
-  'Preferences saved!'          => 'Préférences enregistrées!',
-  'Price'                       => 'Prix',
-  'Print'                       => 'Imprimer',
-  'Printer'                     => 'Imprimante',
-  'Project'                     => 'Projet',
-  'Project Number'              => 'Numéro de projet',
-  'Project Number missing!'     => 'Numéro du projet manquant!',
-  'Project deleted!'            => 'Projet supprimé!',
-  'Project not on file!'        => 'Projet absent du fichier!',
-  'Project saved!'              => 'Projet enregistré!',
-  'Projects'                    => 'Projets',
-  'Purchase Order'              => 'Commande d\'Achat',
-  'Purchase Orders'             => 'Commandes d\'Achats',
-  'Qty'                         => 'Qté',
-  'ROP'                         => 'Niveau de commande',
-  'Rate'                        => 'Cadence',
-  'Recd'                        => 'Reçu',
-  'Receipt'                     => 'Reçu',
-  'Receipt printed!'            => 'Impression reçu!',
-  'Receipt printing failed!'    => 'Erreur lors de l\'impression du reçu!',
-  'Receipts'                    => 'Reçus',
-  'Receivables'                 => 'À recevoir',
-  'Reconciliation'              => 'Rapprochement',
-  'Record in'                   => 'Enregistrer dans',
-  'Reference'                   => 'Référence',
-  'Reference missing!'          => 'Référence manquant!',
-  'Remaining'                   => 'Restant',
-  'Report for'                  => 'Rapport de',
-  'Reports'                     => 'Rapports',
-  'Required by'                 => 'Requis pour',
-  'Retained Earnings'           => 'Éxcédents non distribués',
-  'Sales'                       => 'Ventes',
-  'Sales Invoice'               => 'Facture de Vente',
-  'Sales Order'                 => 'Commande de Vente',
-  'Sales Orders'                => 'Commandes de Vente',
-  'Salesperson'                 => 'Vendeur',
-  'Save'                        => 'Enregistrer',
-  'Save as new'                 => 'Enregistrer comme nouveau',
-  'Save to File'                => 'Enregistrer comme fichier',
-  'Screen'                      => 'Écran',
-  'Select a Dataset to delete and press "Continue"' => 'Sélectionner la base de données Ã  supprimer et cliquer sur "Continuer"',
-  'Select all'                  => 'Sélectionner tout',
-  'Select from one of the items below' => 'Sélectionner un des postes ci-dessous',
-  'Select from one of the names below' => 'Sélectionner un des noms ci-dessous',
-  'Select from one of the projects below' => 'Sélectionner un des projets ci-dessous',
-  'Select postscript or PDF!'   => 'Sélectionner Postscript ou PDF',
-  'Sell Price'                  => 'Prix de vente',
-  'Send by E-Mail'              => 'Envoyer par email',
-  'Sep'                         => 'Sept.',
-  'September'                   => 'Septembre',
-  'Service'                     => 'Service',
-  'Service Items'               => 'Services',
-  'Service Number missing!'     => 'Numéro de service manquant!',
-  'Services'                    => 'Services',
-  'Setup Templates'             => 'Configuration des Gabarits',
-  'Ship'                        => 'Expédier',
-  'Ship to'                     => 'Expédier Ã ',
-  'Ship via'                    => 'Expédier via',
-  'Short'                       => 'Court',
-  'Signature'                   => 'Signature',
-  'Sold'                        => 'Vendu',
-  'Source'                      => 'Source',
-  'Standard'                    => 'Standard',
-  'Statement'                   => 'Relevé',
-  'Statement Balance'           => 'Relevé de compte',
-  'Statement sent to'           => 'Relevé envoyé Ã ',
-  'Statements sent to printer!' => 'Relevés envoyés Ã  l\'imprimante!',
-  'Stock'                       => 'Stock',
-  'Stock Assembly'              => 'Stock de produits',
-  'Stylesheet'                  => 'Feuille de style',
-  'Subject'                     => 'Objet',
-  'Subtotal'                    => 'Sous Total',
-  'System'                      => 'Système',
-  'Tax'                         => 'Taxe',
-  'Tax Accounts'                => 'Comptes de taxe',
-  'Tax Included'                => 'Taxe incluse',
-  'Tax collected'               => 'Taxe collectée',
-  'Tax paid'                    => 'Taxe payée',
-  'Taxable'                     => 'Imposable',
-  'Template saved!'             => 'Gabarit enregistré!',
-  'Templates'                   => 'Gabarits',
-  'Terms: Net'                  => 'Crédit limité Ã ',
-  'The following Datasets are not in use and can be deleted' => 'Les fichiers de données suivants ne sont pas utilisés et peuvent Ãªtre supprimés.',
-  'The following Datasets need to be updated' => 'Les fichiers de données suivants doivent Ãªtre mis a jour',
-  'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => 'Ceci est un test préliminaire des sources existante. Aucune modification Ã  ce stade!!',
-  'To'                          => 'à ',
-  'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => 'Pour ajouter un utilisateur Ã  un groupe, editer un "nom", changer le "login" et enregistrer. Un nouveau utilisateur avec les mêmes données sera enregistré avec le nouveau "login".',
-  'Top Level'                   => 'Description principale',
-  'Total'                       => 'Total',
-  'Transaction Date missing!'   => 'Date d\'écriture manquante!',
-  'Transaction deleted!'        => 'Ecriture supprimée!',
-  'Transaction posted!'         => 'Ecriture enregistrée!',
-  'Transaction reversal enforced for all dates' => 'Inversion des Ã©critures exécuté pour toutes les dates',
-  'Transaction reversal enforced up to' => 'Inversion des Ã©critures exécuté jusqu\'au',
-  'Transactions'                => 'Mouvements',
-  'Transactions exist, cannot delete customer!' => 'Des Ã©critures existent, impossible d\'effacer le client!',
-  'Transactions exist, cannot delete vendor!' => 'Des Ã©critures existent, impossible d\'effacer le fournisseur!',
-  'Transactions exist; cannot delete account!' => 'Des Ã©critures existent, impossible d\'effacer le compte!',
-  'Trial Balance'               => 'Balance Globale',
-  'Unit'                        => 'Unité',
-  'Unit of measure'             => 'Unité de mesure',
-  'Update'                      => 'Mettre Ã  jour',
-  'Update Dataset'              => 'Mis Ã  jour de la base de données',
-  'Updated'                     => 'Mis Ã  jour',
-  'Use Templates'               => 'Utiliser les modèles',
-  'User'                        => 'Utilisateur',
-  'User deleted!'               => 'Utilisateur supprimé!',
-  'User saved!'                 => 'Utilisateur enregistré!',
-  'Vendor'                      => 'Fournisseur',
-  'Vendor Invoice'              => 'Facture d\'Achat',
-  'Vendor deleted!'             => 'Fournisseur supprimé!',
-  'Vendor missing!'             => 'Fournisseur manquant!',
-  'Vendor not on file!'         => 'Fournisseur absent du fichier!',
-  'Vendor saved!'               => 'Fournisseur enregistré!',
-  'Vendors'                     => 'Fournisseurs',
-  'Version'                     => 'Version',
-  'Weight'                      => 'Poids',
-  'Weight Unit'                 => 'Unité de poids',
-  'What type of item is this?'  => 'De quel type est ce poste?',
-  'Year End'                    => 'Fin d\'année',
-  'Yes'                         => 'Oui',
-  'You are logged out!'         => 'Vous Ãªtes déconnecté!',
-  'You did not enter a name!'   => 'Vous n\'avez pas saisi de nom!',
-  'You must enter a host and port for local and remote connections!' => 'Vous devez saisir un "hôte" et un "port" pour les connexions distantes!',
-  'as at'                       => 'au',
-  'collected on sales'          => 'collectées sur les ventes',
-  'days'                        => 'jours',
-  'does not exist'              => 'n\'existe pas!',
-  'ea'                          => 'ch',
-  'emailed to'                  => 'envoyé par email Ã ',
-  'for Period'                  => 'pour la période',
-  'hr'                          => 'h',
-  'is already a member!'        => 'est déjà un membre!',
-  'is not a member!'            => 'n\'est pas un membre',
-  'localhost'                   => 'hôte local',
-  'locked!'                     => 'verrouillé!',
-  'paid on purchases'           => 'payées sur les achats',
-  'sent to printer'             => 'envoyé Ã  l\'imprimante',
-  'successfully created!'       => 'créé avec succès',
-  'successfully deleted!'       => 'supprimé avec succès',
-  'to'                          => 'jusqu\'au',
-  'website'                     => 'site web',
+  'Logout'                      => '',
+  'Logout now'                  => '',
+  'Long Dates'                  => '',
+  'Long Description'            => '',
+  'Lx-Office'                   => '',
+  'Lx-Office 2.4.0 introduces two new concepts: tax zones and Buchungsgruppen.' => '',
+  'Lx-Office can fix these problems automatically.' => '',
+  'Lx-Office has been switched to group-based access restrictions.' => '',
+  'Lx-Office has found one or more problems in the general ledger.' => '',
+  'Lx-Office is about to update the database <b>#1</b>.' => '',
+  'Lx-Office is now able to manage warehouses instead of just tracking the amount of goods in your system.' => '',
+  'Lx-Office website'           => '',
+  'MAILED'                      => '',
+  'MSG_BROWSER_DOES_NOT_SUPPORT_IFRAMES' => '',
+  'Main Preferences'            => '',
+  'Make'                        => '',
+  'Manage license keys'         => '',
+  'Mandantennummer'             => '',
+  'Mandatory Departments'       => '',
+  'Mar'                         => '',
+  'March'                       => '',
+  'Margins'                     => '',
+  'Mark as closed'              => '',
+  'Mark as paid?'               => '',
+  'Mark closed'                 => '',
+  'Marked as paid'              => '',
+  'Marked entries printed!'     => '',
+  'Master Data'                 => '',
+  'Max. Dunning Level'          => '',
+  'May'                         => '',
+  'May '                        => '',
+  'May set the BCC field when sending emails' => '',
+  'Medium Number'               => '',
+  'Memo'                        => '',
+  'Menu'                        => '',
+  'Message'                     => '',
+  'Method'                      => '',
+  'Microfiche'                  => '',
+  'Minimum Amount'              => '',
+  'Miscellaneous'               => '',
+  'Missing \'description\' field.' => '',
+  'Missing \'tag\' field.'      => '',
+  'Missing Method!'             => '',
+  'Missing Tax Authoritys Preferences' => '',
+  'Missing amount'              => '',
+  'Missing parameter #1 in call to sub #2.' => '',
+  'Missing parameter (at least one of #1) in call to sub #2.' => '',
+  'Missing taxkeys in invoices with taxes.' => '',
+  'Mitarbeiter'                 => '',
+  'Mobile1'                     => '',
+  'Mobile2'                     => '',
+  'Model'                       => '',
+  'Module'                      => '',
+  'Module home page'            => '',
+  'Module name'                 => '',
+  'Monat'                       => '',
+  'Monthly'                     => '',
+  'More than one #1 found matching, please be more specific.' => '',
+  'More than one control file with the tag \'%s\' exist.' => '',
+  'Multi mode not supported.'   => '',
+  'Multibyte Encoding'          => '',
+  'MwSt. inkl.'                 => '',
+  'Name'                        => '',
+  'Name missing!'               => '',
+  'National'                    => '',
+  'National Expenses'           => '',
+  'National Revenues'           => '',
+  'Netto Terms'                 => '',
+  'New Buchungsgruppe #1'       => '',
+  'New Templates'               => '',
+  'New Win/Tab'                 => '',
+  'New assembly'                => '',
+  'New bank account'            => '',
+  'New contact'                 => '',
+  'New customer'                => '',
+  'New invoice'                 => '',
+  'New part'                    => '',
+  'New sales order'             => '',
+  'New service'                 => '',
+  'New unit'                    => '',
+  'New vendor'                  => '',
+  'Next Dunning Level'          => '',
+  'No'                          => '',
+  'No %s was found matching the search parameters.' => '',
+  'No Company Address given'    => '',
+  'No Company Name given'       => '',
+  'No Customer was found matching the search parameters.' => '',
+  'No Database Drivers available!' => '',
+  'No Dataset selected!'        => '',
+  'No Vendor was found matching the search parameters.' => '',
+  'No action defined.'          => '',
+  'No backup file has been uploaded.' => '',
+  'No bank information has been entered in this vendor\'s master data entry. You cannot create bank transfers unless you enter bank information.' => '',
+  'No bins have been added to this warehouse yet.' => '',
+  'No customer has been selected yet.' => '',
+  'No data was found.'          => '',
+  'No databases have been found on this server.' => '',
+  'No datasets have been selected.' => '',
+  'No dunnings have been selected for printing.' => '',
+  'No entries were found which had no unit assigned to them.' => '',
+  'No group has been selected, or the group does not exist anymore.' => '',
+  'No groups have been added yet.' => '',
+  'No licenses were found that match the search criteria.' => '',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => '',
+  'No part was found matching the search parameters.' => '',
+  'No prices will be updated because no prices have been entered.' => '',
+  'No problems were recognized.' => '',
+  'No transfers were executed in this export.' => '',
+  'No unknown units where found.' => '',
+  'No user has been selected.'  => '',
+  'No valid number entered for pricegroup "#1".' => '',
+  'No vendor has been selected yet.' => '',
+  'No warehouse has been created yet or the quantity of the bins is not configured yet.' => '',
+  'No.'                         => '',
+  'Non-taxable Purchases'       => '',
+  'Non-taxable Sales'           => '',
+  'None'                        => '',
+  'Not Discountable'            => '',
+  'Not delivered'               => '',
+  'Not done yet'                => '',
+  'Not obsolete'                => '',
+  'Note'                        => '',
+  'Note: Taxkeys must have a "valid from" date, and will not be in effect otherwise.' => '',
+  'Notes'                       => '',
+  'Nothing has been selected for removal.' => '',
+  'Nothing has been selected for transfer.' => '',
+  'Nothing selected!'           => '',
+  'Nothing to delete!'          => '',
+  'Nov'                         => '',
+  'November'                    => '',
+  'Now the user must select a single Buchungsgruppe for each part instead of three distinct accounts.' => '',
+  'Number'                      => '',
+  'Number Format'               => '',
+  'Number missing in Row'       => '',
+  'Number of bins'              => '',
+  'Number of copies'            => '',
+  'Number of entries changed: #1' => '',
+  'Number of new bins'          => '',
+  'Number pages'                => '',
+  'Number variables: \'PRECISION=n\' forces numbers to be shown with exactly n decimal places.' => '',
+  'OB Transaction'              => '',
+  'OBE-Export erfolgreich!'     => '',
+  'Obsolete'                    => '',
+  'Oct'                         => '',
+  'October'                     => '',
+  'Off'                         => '',
+  'Old (on the side)'           => '',
+  'On'                          => '',
+  'On Hand'                     => '',
+  'On Order'                    => '',
+  'One or more Perl modules missing' => '',
+  'Only due follow-ups'         => '',
+  'Open'                        => '',
+  'Open Amount'                 => '',
+  'Open a further Lx-Office Window or Tab' => '',
+  'Open amount'                 => '',
+  'OpenDocument/OASIS'          => '',
+  'Openings'                    => '',
+  'Optional comment'            => '',
+  'Options'                     => '',
+  'Order'                       => '',
+  'Order Date'                  => '',
+  'Order Date missing!'         => '',
+  'Order Number'                => '',
+  'Order Number missing!'       => '',
+  'Order deleted!'              => '',
+  'Ordered'                     => '',
+  'Orientation'                 => '',
+  'Orphaned'                    => '',
+  'Other users\' follow-ups'    => '',
+  'Other values are ignored.'   => '',
+  'Others'                      => '',
+  'Otherwise all users will only have access to their own settings.' => '',
+  'Otherwise the variable is only available for printing.' => '',
+  'Out of balance transaction!' => '',
+  'Out of balance!'             => '',
+  'Output Number Format'        => '',
+  'Outputformat'                => '',
+  'Overdue sales quotations and requests for quotations' => '',
+  'Own Product'                 => '',
+  'PAYMENT POSTED'              => '',
+  'PDF'                         => '',
+  'PDF (OpenDocument/OASIS)'    => '',
+  'PDF export -- options'       => '',
+  'POSTED'                      => '',
+  'POSTED AS NEW'               => '',
+  'PRINTED'                     => '',
+  'Packing List'                => '',
+  'Packing List Date missing!'  => '',
+  'Packing List Number missing!' => '',
+  'Packing Lists'               => '',
+  'Page #1/#2'                  => '',
+  'Paid'                        => '',
+  'Part'                        => '',
+  'Part Description'            => '',
+  'Part Description missing!'   => '',
+  'Part Number'                 => '',
+  'Part Number missing!'        => '',
+  'Part description'            => '',
+  'Partnumber must not be set to empty!' => '',
+  'Partnumber not unique!'      => '',
+  'Parts'                       => '',
+  'Parts Inventory'             => '',
+  'Parts must have an entry type.' => '',
+  'Parts, services and assemblies' => '',
+  'Password'                    => '',
+  'Payables'                    => '',
+  'Payment'                     => '',
+  'Payment Reminder'            => '',
+  'Payment Terms'               => '',
+  'Payment Terms missing in row ' => '',
+  'Payment Terms saved!'        => '',
+  'Payment date missing!'       => '',
+  'Payment list as PDF'         => '',
+  'Payment posted!'             => '',
+  'Payment terms deleted!'      => '',
+  'Payments'                    => '',
+  'Period'                      => '',
+  'Period:'                     => '',
+  'Personal settings'           => '',
+  'Pg Database Administration'  => '',
+  'Phone'                       => '',
+  'Phone1'                      => '',
+  'Phone2'                      => '',
+  'Pick List'                   => '',
+  'Please Check the bank information for each vendor:' => '',
+  'Please ask your administrator to create warehouses and bins.' => '',
+  'Please enter a license key.' => '',
+  'Please enter a number of licenses.' => '',
+  'Please enter the login for the new user.' => '',
+  'Please enter the name of the database that will be used as the template for the new database:' => '',
+  'Please enter the name of the dataset you want to restore the backup in.' => '',
+  'Please enter the taxnumber in the administration menu user preferences' => '',
+  'Please enter values'         => '',
+  'Please insert object dimensions below.' => '',
+  'Please insert your language values below' => '',
+  'Please insert your longdescription below' => '',
+  'Please install the below listed modules or ask your system administrator to.' => '',
+  'Please re-run the analysis for broken general ledger entries by clicking this button:' => '',
+  'Please read the file'        => '',
+  'Please select a customer from the list below.' => '',
+  'Please select a part from the list below.' => '',
+  'Please select a vendor from the list below.' => '',
+  'Please select the chart of accounts this installation is using from the list below.' => '',
+  'Please select the database you want to backup' => '',
+  'Please select the source bank account for the transfers:' => '',
+  'Please seletct the dataset you want to delete:' => '',
+  'Please specify a description for the warehouse designated for these goods.' => '',
+  'Plural'                      => '',
+  'Port'                        => '',
+  'Portrait'                    => '',
+  'Post'                        => '',
+  'Post Payment'                => '',
+  'Post payments'               => '',
+  'Postscript'                  => '',
+  'Posustva_coa'                => '',
+  'Preferences'                 => '',
+  'Preferences saved!'          => '',
+  'Prefix for the new bins\' names' => '',
+  'Preis'                       => '',
+  'Preisgruppe'                 => '',
+  'Preisklasse'                 => '',
+  'Prepare bank transfer via SEPA XML' => '',
+  'Prepayment'                  => '',
+  'Preview'                     => '',
+  'Previous transdate text'     => '',
+  'Previous transnumber text'   => '',
+  'Price'                       => '',
+  'Price Factor'                => '',
+  'Price Factors'               => '',
+  'Price factor deleted!'       => '',
+  'Price factor saved!'         => '',
+  'Pricegroup'                  => '',
+  'Pricegroup deleted!'         => '',
+  'Pricegroup missing!'         => '',
+  'Pricegroup saved!'           => '',
+  'Pricegroups'                 => '',
+  'Print'                       => '',
+  'Print and Post'              => '',
+  'Print dunnings'              => '',
+  'Print list'                  => '',
+  'Print options'               => '',
+  'Printer'                     => '',
+  'Printer Command'             => '',
+  'Printer Command missing!'    => '',
+  'Printer Description'         => '',
+  'Printer deleted!'            => '',
+  'Printer saved!'              => '',
+  'Printing ... '               => '',
+  'Prior to Lx-Office v2.4.0 the user could enter arbitrary strings as units for parts, services and in invoices, sales quotations etc.' => '',
+  'Prior to Lx-Office v2.4.0 the user had to chose the accounts for each part and service.' => '',
+  'Private E-mail'              => '',
+  'Private Phone'               => '',
+  'Problem'                     => '',
+  'Produce Assembly'            => '',
+  'Productivity'                => '',
+  'Profit Center'               => '',
+  'Proforma Invoice'            => '',
+  'Program'                     => '',
+  'Project'                     => '',
+  'Project Number'              => '',
+  'Project Number missing!'     => '',
+  'Project Numbers'             => '',
+  'Project Transactions'        => '',
+  'Project deleted!'            => '',
+  'Project not on file!'        => '',
+  'Project saved!'              => '',
+  'Projects'                    => '',
+  'Projecttransactions'         => '',
+  'Prozentual/Absolut'          => '',
+  'Purchase Invoice'            => '',
+  'Purchase Order'              => '',
+  'Purchase Orders'             => '',
+  'Purchase Price'              => '',
+  'Purchase Prices'             => '',
+  'Purchase delivery order'     => '',
+  'Purchase invoices'           => '',
+  'Purpose'                     => '',
+  'Qty'                         => '',
+  'Qty according to delivery order' => '',
+  'Qty in stock'                => '',
+  'Quantity'                    => '',
+  'Quantity missing.'           => '',
+  'Quartal'                     => '',
+  'Quarter'                     => '',
+  'Quarterly'                   => '',
+  'Queue'                       => '',
+  'Quotation'                   => '',
+  'Quotation Date'              => '',
+  'Quotation Date missing!'     => '',
+  'Quotation Number'            => '',
+  'Quotation Number missing!'   => '',
+  'Quotation deleted!'          => '',
+  'Quotations'                  => '',
+  'Quote chararacter'           => '',
+  'Quoted'                      => '',
+  'RFQ'                         => '',
+  'RFQ Number'                  => '',
+  'RFQs'                        => '',
+  'ROP'                         => '',
+  'Ranges of numbers'           => '',
+  'Ranges of numbers and default accounts' => '',
+  'Re-run analysis'             => '',
+  'Receipt'                     => '',
+  'Receipt posted!'             => '',
+  'Receipt, payment, reconciliation' => '',
+  'Receipts'                    => '',
+  'Receivables'                 => '',
+  'Rechnungsnummer'             => '',
+  'Reconciliation'              => '',
+  'Record in'                   => '',
+  'Recorded Tax'                => '',
+  'Recorded taxkey'             => '',
+  'Reference'                   => '',
+  'Reference missing!'          => '',
+  'Release From Stock'          => '',
+  'Remaining'                   => '',
+  'Removal'                     => '',
+  'Removal from Warehouse'      => '',
+  'Removal from warehouse'      => '',
+  'Removal qty'                 => '',
+  'Remove'                      => '',
+  'Remove Draft'                => '',
+  'Remove draft when posting'   => '',
+  'Remove from group'           => '',
+  'Removed spoolfiles!'         => '',
+  'Removing marked entries from queue ...' => '',
+  'Rename the group'            => '',
+  'Report Positions'            => '',
+  'Report about warehouse contents' => '',
+  'Report about warehouse transactions' => '',
+  'Report and misc. Preferences' => '',
+  'Report for'                  => '',
+  'Reports'                     => '',
+  'Representative'              => '',
+  'Reqdate'                     => '',
+  'Request for Quotation'       => '',
+  'Request for Quotations'      => '',
+  'Request quotation'           => '',
+  'Requested execution date'    => '',
+  'Requested execution date from' => '',
+  'Requested execution date to' => '',
+  'Required by'                 => '',
+  'Restore Dataset'             => '',
+  'Revenue'                     => '',
+  'Revenue Account'             => '',
+  'Revenues EU with UStId'      => '',
+  'Revenues EU without UStId'   => '',
+  'Right'                       => '',
+  'SAVED'                       => '',
+  'SAVED FOR DUNNING'           => '',
+  'SCREENED'                    => '',
+  'SEPA XML download'           => '',
+  'SEPA exports:'               => '',
+  'Saldo Credit'                => '',
+  'Saldo Debit'                 => '',
+  'Saldo neu'                   => '',
+  'Saldo per'                   => '',
+  'Sale Prices'                 => '',
+  'Sales Invoice'               => '',
+  'Sales Invoices'              => '',
+  'Sales Order'                 => '',
+  'Sales Orders'                => '',
+  'Sales and purchase invoices with inventory transactions with taxkeys' => '',
+  'Sales delivery order'        => '',
+  'Sales invoice number'        => '',
+  'Sales invoices'              => '',
+  'Sales quotation'             => '',
+  'Salesman'                    => '',
+  'Salesperson'                 => '',
+  'Same as the quote character' => '',
+  'Sat. Fax'                    => '',
+  'Sat. Phone'                  => '',
+  'Satz %'                      => '',
+  'Save'                        => '',
+  'Save Draft'                  => '',
+  'Save account first to insert taxkeys' => '',
+  'Save and AP Transaction'     => '',
+  'Save and AR Transaction'     => '',
+  'Save and Close'              => '',
+  'Save and Invoice'            => '',
+  'Save and Order'              => '',
+  'Save and Quotation'          => '',
+  'Save and RFQ'                => '',
+  'Save and close'              => '',
+  'Save as new'                 => '',
+  'Save draft'                  => '',
+  'Saving the file \'%s\' failed. OS error message: %s' => '',
+  'Screen'                      => '',
+  'Searchable'                  => '',
+  'Select'                      => '',
+  'Select a Customer'           => '',
+  'Select a customer'           => '',
+  'Select a part'               => '',
+  'Select a part or assembly'   => '',
+  'Select a period'             => '',
+  'Select a vendor'             => '',
+  'Select all'                  => '',
+  'Select federal state...'     => '',
+  'Select from one of the items below' => '',
+  'Select from one of the names below' => '',
+  'Select from one of the projects below' => '',
+  'Select postscript or PDF!'   => '',
+  'Select tax office...'        => '',
+  'Select the chart of accounts in use' => '',
+  'Select the checkboxes that match users to the groups they should belong to.' => '',
+  'Select type of removal'      => '',
+  'Select type of transfer'     => '',
+  'Selection'                   => '',
+  'Selection fields: The option field must contain the available options for the selection. Options are separated by \'##\', for example \'Early##Normal##Late\'.' => '',
+  'Sell Price'                  => '',
+  'Send the backup via Email'   => '',
+  'Sep'                         => '',
+  'Separator chararacter'       => '',
+  'September'                   => '',
+  'Serial No.'                  => '',
+  'Serial Number'               => '',
+  'Service'                     => '',
+  'Service Items'               => '',
+  'Service Number missing!'     => '',
+  'Service unit'                => '',
+  'Services'                    => '',
+  'Set Language Values'         => '',
+  'Set eMail text'              => '',
+  'Setup Menu'                  => '',
+  'Setup Templates'             => '',
+  'Ship to'                     => '',
+  'Ship via'                    => '',
+  'Shipping Address'            => '',
+  'Shipping Point'              => '',
+  'Shipto'                      => '',
+  'Shopartikel'                 => '',
+  'Short'                       => '',
+  'Show'                        => '',
+  'Show Salesman'               => '',
+  'Show TODO list'              => '',
+  'Show by default'             => '',
+  'Show custom variable search inputs' => '',
+  'Show details'                => '',
+  'Show follow ups...'          => '',
+  'Show old dunnings'           => '',
+  'Show overdue sales quotations and requests for quotations...' => '',
+  'Show your TODO list after loggin in' => '',
+  'Signature'                   => '',
+  'Since bin is not enforced in the parts data, please specify a bin where goods without a specified bin will be put.' => '',
+  'Skip'                        => '',
+  'Skonto'                      => '',
+  'Skonto Terms'                => '',
+  'Sold'                        => '',
+  'Solution'                    => '',
+  'Source'                      => '',
+  'Source BIC'                  => '',
+  'Source IBAN'                 => '',
+  'Source bank account'         => '',
+  'Source bin'                  => '',
+  'Spoolfile'                   => '',
+  'Start Dunning Process'       => '',
+  'Start analysis'              => '',
+  'Start the correction assistant' => '',
+  'Startdate_coa'               => '',
+  'Starting Balance'            => '',
+  'Statement'                   => '',
+  'Statement Balance'           => '',
+  'Statement sent to'           => '',
+  'Statements sent to printer!' => '',
+  'Step 1 of 3: Parts'          => '',
+  'Step 2'                      => '',
+  'Step 2 of 3: Services'       => '',
+  'Step 3 of 3: Assemblies'     => '',
+  'Step 3 of 3: Default units'  => '',
+  'Steuersatz'                  => '',
+  'Stock'                       => '',
+  'Stock value'                 => '',
+  'Storno'                      => '',
+  'Storno (one letter abbreviation)' => '',
+  'Storno Invoice'              => '',
+  'Storno Packing List'         => '',
+  'Street'                      => '',
+  'Stylesheet'                  => '',
+  'Subject'                     => '',
+  'Subject:'                    => '',
+  'Subtotal'                    => '',
+  'Such entries cannot be exported into the DATEV format and have to be fixed as well.' => '',
+  'Sum Credit'                  => '',
+  'Sum Debit'                   => '',
+  'Sum for'                     => '',
+  'Sum per'                     => '',
+  'Summen- und Saldenliste'     => '',
+  'Superuser name'              => '',
+  'Supplies'                    => '',
+  'Switch Menu on / off'        => '',
+  'System'                      => '',
+  'TODO list'                   => '',
+  'TODO list options'           => '',
+  'TOP100'                      => '',
+  'TOTAL'                       => '',
+  'Target bank account'         => '',
+  'Tax'                         => '',
+  'Tax Consultant'              => '',
+  'Tax Included'                => '',
+  'Tax Number'                  => '',
+  'Tax Number / SSN'            => '',
+  'Tax Office'                  => '',
+  'Tax Office Preferences'      => '',
+  'Tax Percent is a number between 0 and 100' => '',
+  'Tax Period'                  => '',
+  'Tax Position'                => '',
+  'Tax collected'               => '',
+  'Tax deleted!'                => '',
+  'Tax number'                  => '',
+  'Tax paid'                    => '',
+  'Tax saved!'                  => '',
+  'Tax-O-Matic'                 => '',
+  'Tax-o-matic Account'         => '',
+  'Taxaccount_coa'              => '',
+  'Taxation'                    => '',
+  'Taxdescription  missing!'    => '',
+  'Taxdescription_coa'          => '',
+  'Taxes'                       => '',
+  'Taxkey'                      => '',
+  'Taxkey  missing!'            => '',
+  'Taxkey_coa'                  => '',
+  'Taxkeys and Taxreport Preferences' => '',
+  'Taxlink_coa'                 => '',
+  'Taxnumber'                   => '',
+  'Taxrate missing!'            => '',
+  'Tel'                         => '',
+  'Tel.'                        => '',
+  'Telephone'                   => '',
+  'Template'                    => '',
+  'Template Code'               => '',
+  'Template Code missing!'      => '',
+  'Template database'           => '',
+  'Templates'                   => '',
+  'Terms missing in row '       => '',
+  'Test connection'             => '',
+  'Text field'                  => '',
+  'Text field variables: \'WIDTH=w HEIGHT=h\' sets the width and height of the text field. They default to 30 and 5 respectively.' => '',
+  'Text variables: \'MAXLENGTH=n\' sets the maximum entry length to \'n\'.' => '',
+  'Text, text field and number variables: The default value will be used as-is.' => '',
+  'That export does not exist.' => '',
+  'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => '',
+  'The AP transaction #1 has been deleted.' => '',
+  'The AR transaction #1 has been deleted.' => '',
+  'The GL transaction #1 has been deleted.' => '',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => '',
+  'The SEPA export has been created.' => '',
+  'The access rights have been saved.' => '',
+  'The account 3804 already exists, the update will be skipped.' => '',
+  'The account 3804 will not be added automatically.' => '',
+  'The assembly has been created.' => '',
+  'The assistant could not find anything wrong with #1. Maybe the problem has been solved in the meantime.' => '',
+  'The authentication configuration file &quot;config/authentication.pl&quot; does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => '',
+  'The authentication database is not reachable at the moment. Either it hasn\'t been set up yet or the database server might be down. Please contact your administrator.' => '',
+  'The available options depend on the varibale type:' => '',
+  'The backup you upload here has to be a file created with &quot;pg_dump -o -Ft&quot;.' => '',
+  'The bank information must not be empty.' => '',
+  'The base unit does not exist or it is about to be deleted in row %d.' => '',
+  'The base unit does not exist.' => '',
+  'The base unit relations must not contain loops (e.g. by saying that unit A\'s base unit is B, B\'s base unit is C and C\'s base unit is A) in row %d.' => '',
+  'The columns &quot;Dunning Duedate&quot;, &quot;Total Fees&quot; and &quot;Interest&quot; show data for the previous dunning created for this invoice.' => '',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => '',
+  'The config file "config/authentication.pl" was not found.' => '',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '',
+  'The connection to the authentication database failed:' => '',
+  'The connection to the database could not be established.' => '',
+  'The connection to the template database failed:' => '',
+  'The connection was established successfully.' => '',
+  'The creation of the authentication database failed:' => '',
+  'The custom variable has been deleted.' => '',
+  'The custom variable has been saved.' => '',
+  'The database #1 has been successfully deleted.' => '',
+  'The database for user management and authentication does not exist. You can create let Lx-Office create it with the following parameters:' => '',
+  'The database update/creation did not succeed. The file #1 contained the following error:' => '',
+  'The database upgrade for the introduction of Buchungsgruppen is now complete.' => '',
+  'The database upgrade for the introduction of units is now complete.' => '',
+  'The dataset #1 has been successfully created.' => '',
+  'The dataset backup has been sent via email to #1.' => '',
+  'The dataset has to exist before a restoration can be started.' => '',
+  'The dataset name is missing.' => '',
+  'The default value depends on the variable type:' => '',
+  'The delivery order has not been marked as delivered. The warehouse contents have not changed.' => '',
+  'The description is missing.' => '',
+  'The description is shown on the form. Chose something short and descriptive.' => '',
+  'The directory "%s" could not be created:\n%s' => '',
+  'The directory %s does not exist.' => '',
+  'The dunning process started' => '',
+  'The dunnings have been printed.' => '',
+  'The email address is missing.' => '',
+  'The factor is missing in row %d.' => '',
+  'The factor is missing.'      => '',
+  'The first reason is that Lx-Office contained a bug which resulted in the wrong taxkeys being recorded for transactions in which two entries are posted for the same chart with different taxkeys.' => '',
+  'The follow-up date is missing.' => '',
+  'The following Buchungsgruppen have already been created:' => '',
+  'The following Datasets need to be updated' => '',
+  'The following drafts have been saved and can be loaded.' => '',
+  'The following transaction contains wrong taxes:' => '',
+  'The following transaction contains wrong taxkeys:' => '',
+  'The following units are unknown.' => '',
+  'The following units exist already:' => '',
+  'The following users have been migrated into the authentication database:' => '',
+  'The following warnings occured during an upgrade to the document templates:' => '',
+  'The formula needs the following syntax:<br>For regular article:<br>Variablename= Variable Unit;<br>Variablename2= Variable2 Unit2;<br>...<br>###<br>Variable + ( Variable2 / Variable )<br><b>Please be beware of the spaces in the formula</b><br>' => '',
+  'The greetings have been saved.' => '',
+  'The group has been added.'   => '',
+  'The group has been deleted.' => '',
+  'The group has been saved.'   => '',
+  'The group memberships have been saved.' => '',
+  'The group name is missing.'  => '',
+  'The licensing module has been deactivated in lx-erp.conf.' => '',
+  'The list has been printed.'  => '',
+  'The login is missing.'       => '',
+  'The name in row %d has already been used before.' => '',
+  'The name is missing in row %d.' => '',
+  'The name is missing.'        => '',
+  'The name must only consist of letters, numbers and underscores and start with a letter.' => '',
+  'The old file containing the user information is still present (&quot;#1&quot;). Do you want to migrate these users into the database? If not then you will not be able to log in with any of the users present in the old file.' => '',
+  'The option field is empty.'  => '',
+  'The parts for this delivery order have already been transferred in.' => '',
+  'The parts for this delivery order have already been transferred out.' => '',
+  'The parts have been removed.' => '',
+  'The parts have been stocked.' => '',
+  'The parts have been transferred.' => '',
+  'The payments have been posted.' => '',
+  'The pg_dump process could not be started.' => '',
+  'The pg_restore process could not be started.' => '',
+  'The preferred one is to install packages provided by your operating system distribution (e.g. Debian or RPM packages).' => '',
+  'The program\'s exit code was #1 (&quot;0&quot; usually means that everything went OK).' => '',
+  'The project has been added.' => '',
+  'The project has been saved.' => '',
+  'The restoration process has started. Here\'s the output of the &quot;pg_restore&quot; command:' => '',
+  'The restoration process is complete. Please review &quot;pg_restore&quot;\'s output to find out if the restoration was successful.' => '',
+  'The second reason is that Lx-Office allowed the user to enter the tax amount manually regardless of the taxkey used.' => '',
+  'The second way is to use Perl\'s CPAN module and let it download and install the module for you.' => '',
+  'The selected  PostgreSQL installation uses UTF-8 as its encoding. Therefore you have to configure Lx-Office to use UTF-8 as well.' => '',
+  'The selected bank account does not exist anymore.' => '',
+  'The selected bin does not exist.' => '',
+  'The selected exports have been closed.' => '',
+  'The selected warehouse does not exist.' => '',
+  'The selected warehouse is empty.' => '',
+  'The session is invalid or has expired.' => '',
+  'The source warehouse does not contain any bins.' => '',
+  'The subject is missing.'     => '',
+  'The tables for user management and authentication do not exist. They will be created in the next step in the following database:' => '',
+  'The tabulator character'     => '',
+  'The third way is to download the module from the above mentioned URL and to install the module manually following the installations instructions contained in the source archive.' => '',
+  'The transaction is shown below in its current state.' => '',
+  'The unit has been saved.'    => '',
+  'The unit in row %d has been deleted in the meantime.' => '',
+  'The unit in row %d has been used in the meantime and cannot be changed anymore.' => '',
+  'The units have been saved.'  => '',
+  'The user has been added to this group.' => '',
+  'The user has been removed from this group.' => '',
+  'The user is a member in the following group(s):' => '',
+  'The user migration process is complete.' => '',
+  'The variable name must only consist of letters, numbers and underscores. It must begin with a letter. Example: send_christmas_present' => '',
+  'The warehouse could not be deleted because it has already been used.' => '',
+  'The warehouse does not contain any bins.' => '',
+  'The warehouse or the bin is missing.' => '',
+  'The wrong taxkeys for AP and AR transactions have been fixed.' => '',
+  'The wrong taxkeys for inventory transactions for sales and purchase invoices have been fixed.' => '',
+  'The wrong taxkeys have been fixed.' => '',
+  'There are #1 more open invoices for this customer with other currencies.' => '',
+  'There are #1 more open invoices from this vendor with other currencies.' => '',
+  'There are #1 unfinished follow-ups of which #2 are due.' => '',
+  'There are bookings to the account 3803 after 01.01.2007. If you didn\'t change this account manually to 19% the bookings are probably incorrect.' => '',
+  'There are four tax zones.'   => '',
+  'There are no items in stock.' => '',
+  'There are no items on your TODO list at the moment.' => '',
+  'There are still entries in the database for which no unit has been assigned.' => '',
+  'There are usually three ways to install Perl modules.' => '',
+  'There is at least one sales or purchase invoice for which Lx-Office recorded an inventory transaction with taxkeys even though no tax was recorded.' => '',
+  'There is at least one transaction for which the user has chosen a logically wrong taxkey.' => '',
+  'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, #5, for the transfer of #6.' => '',
+  'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, for the transfer of #5.' => '',
+  'There is not enough left of \'#1\' in bin \'#2\' for the removal of #3.' => '',
+  'There is nothing to do in this step.' => '',
+  '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 Lx-Office can convert prices when the user switches from one unit to another.' => '',
+  'These will only be effective if the account is NOT a summary account AND there exists at least one taxkey. Setting the account as a summary account will erase these settings.' => '',
+  'These wrong entries cannot be fixed automatically.' => '',
+  'This corresponds to Lx-Office\'s behavior prior to version 2.4.4.' => '',
+  'This could have happened for two reasons:' => '',
+  'This customer number is already in use.' => '',
+  'This group will be called &quot;Full Access&quot;.' => '',
+  'This installation uses an unknown chart of accounts (&quot;#1&quot;). This database upgrade cannot create standard buchungsgruppen automatically.' => '',
+  'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => '',
+  '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 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.' => '',
+  'This upgrade script tries to map all existing units in the database to the newly created units.' => '',
+  'This vendor number is already in use.' => '',
+  'Time period for the analysis:' => '',
+  'Timestamp'                   => '',
+  'Title'                       => '',
+  'To'                          => '',
+  'To (email)'                  => '',
+  'To (time)'                   => '',
+  'To Date'                     => '',
+  'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => '',
+  'Top'                         => '',
+  'Top (CSS)'                   => '',
+  'Top (CSS) new'               => '',
+  'Top (Javascript)'            => '',
+  'Top (XUL; only for Mozilla Firefox)' => '',
+  'Top 100'                     => '',
+  'Top 100 hinzufuegen'         => '',
+  'Top Level'                   => '',
+  'Total'                       => '',
+  'Total Fees'                  => '',
+  'Total stock value'           => '',
+  'Totals'                      => '',
+  'Trade Discount'              => '',
+  'Trans Id'                    => '',
+  'Trans Type'                  => '',
+  'Transaction'                 => '',
+  'Transaction %d cancelled.'   => '',
+  'Transaction Date missing!'   => '',
+  'Transaction ID missing.'     => '',
+  'Transaction deleted!'        => '',
+  'Transaction description'     => '',
+  'Transaction has already been cancelled!' => '',
+  'Transaction has been split on both the credit and the debit side' => '',
+  'Transaction posted!'         => '',
+  'Transactions, AR transactions, AP transactions' => '',
+  'Transdate'                   => '',
+  'Transfer'                    => '',
+  'Transfer Quantity'           => '',
+  'Transfer To Stock'           => '',
+  'Transfer from warehouse'     => '',
+  'Transfer in'                 => '',
+  'Transfer out'                => '',
+  'Transfer qty'                => '',
+  'Translation (%s)'            => '',
+  'Trial Balance'               => '',
+  'Trial balance between %s and %s' => '',
+  'Trying to call a sub without a name' => '',
+  'Type'                        => '',
+  'Type of Business'            => '',
+  'Type of Customer'            => '',
+  'Type of Vendor'              => '',
+  'USTVA'                       => '',
+  'USTVA 2004'                  => '',
+  'USTVA 2005'                  => '',
+  'USTVA 2006'                  => '',
+  'USTVA 2007'                  => '',
+  'USTVA-Hint: Method'          => '',
+  'USTVA-Hint: Tax Authoritys'  => '',
+  'USt-IdNr.'                   => '',
+  'USt-Konto'                   => '',
+  'UStVA'                       => '',
+  'UStVA (PDF-Dokument)'        => '',
+  'UStVa'                       => '',
+  'UStVa Einstellungen'         => '',
+  'Unbalanced Ledger'           => '',
+  'Unchecked custom variables will not appear in orders and invoices.' => '',
+  'Unfinished follow-ups'       => '',
+  'Unit'                        => '',
+  'Unit missing.'               => '',
+  'Unit of measure'             => '',
+  'Units marked for deletion will be deleted upon saving.' => '',
+  'Units that have already been used (e.g. for parts and services or in invoices or warehouse transactions) cannot be changed.' => '',
+  'Unknown Category'            => '',
+  'Unknown Link'                => '',
+  'Unknown chart of accounts'   => '',
+  'Unknown dependency \'%s\'.'  => '',
+  'Unknown problem type.'       => '',
+  'Unlock System'               => '',
+  'Until'                       => '',
+  'Update'                      => '',
+  'Update Dataset'              => '',
+  'Update Prices'               => '',
+  'Update SKR04: new tax account 3804 (19%)' => '',
+  'Update complete'             => '',
+  'Update prices'               => '',
+  'Update?'                     => '',
+  'Updated'                     => '',
+  'Use As Template'             => '',
+  'Use Templates'               => '',
+  'User'                        => '',
+  'User Config'                 => '',
+  'User data migration'         => '',
+  'User deleted!'               => '',
+  'User migration complete'     => '',
+  'User name'                   => '',
+  'User saved!'                 => '',
+  'Username'                    => '',
+  'Users in<br>this group'      => '',
+  'Users not in this group'     => '',
+  'Ust-IDNr'                    => '',
+  'Valid from'                  => '',
+  'Valid until'                 => '',
+  'Value'                       => '',
+  'Variable'                    => '',
+  'Vendor'                      => '',
+  'Vendor Invoice'              => '',
+  'Vendor Invoices'             => '',
+  'Vendor Name'                 => '',
+  'Vendor Number'               => '',
+  'Vendor Order Number'         => '',
+  'Vendor deleted!'             => '',
+  'Vendor details'              => '',
+  'Vendor missing!'             => '',
+  'Vendor not on file or locked!' => '',
+  'Vendor not on file!'         => '',
+  'Vendor saved!'               => '',
+  'Vendor type'                 => '',
+  'Vendors'                     => '',
+  'Verrechnungseinheit'         => '',
+  'Version'                     => '',
+  'View License'                => '',
+  'View SEPA export'            => '',
+  'View warehouse content'      => '',
+  'View/edit all employees sales documents' => '',
+  'Von Konto: '                 => '',
+  'WHJournal'                   => '',
+  'Warehouse'                   => '',
+  'Warehouse From'              => '',
+  'Warehouse Migration'         => '',
+  'Warehouse To'                => '',
+  'Warehouse content'           => '',
+  'Warehouse deleted.'          => '',
+  'Warehouse management'        => '',
+  'Warehouse saved.'            => '',
+  'Warehouses'                  => '',
+  'Warnings during template upgrade' => '',
+  'WebDAV link'                 => '',
+  'Weight'                      => '',
+  'Weight unit'                 => '',
+  'What <b>term</b> you are looking for?' => '',
+  'What type of item is this?'  => '',
+  'With Extension Of Time'      => '',
+  'Workflow Delivery Order'     => '',
+  'Workflow purchase_order'     => '',
+  'Workflow request_quotation'  => '',
+  'Workflow sales_order'        => '',
+  'Workflow sales_quotation'    => '',
+  'Wrong Period'                => '',
+  'Wrong date format!'          => '',
+  'Wrong tax keys recorded'     => '',
+  'Wrong taxes recorded'        => '',
+  'YYYY'                        => '',
+  'Year'                        => '',
+  'Year End'                    => '',
+  'Yearly'                      => '',
+  'Yearly taxreport not yet implemented' => '',
+  'Yes'                         => '',
+  'Yes, included by default'    => '',
+  'Yes/No (Checkbox)'           => '',
+  'You are logged out!'         => '',
+  'You can also create new units now.' => '',
+  'You can also delete this transaction and re-enter it manually.' => '',
+  'You can correct this transaction by chosing the correct taxkeys from the drop down boxes and hitting the button "Fix transaction" afterwards.' => '',
+  'You can create a missing dataset by going back and chosing &quot;Create Dataset&quot;.' => '',
+  'You can create warehouses and bins via the menu "System -> Warehouses".' => '',
+  'You can declare different translations for singular and plural for each unit (e.g. &quot;day&quot; and &quot;days).' => '',
+  'You can either create a new database or chose an existing database.' => '',
+  'You can only delete datasets that are not in use.' => '',
+  'You can use the following strings in the long description and all translations. They will be replaced by their actual values by Lx-Office before they\'re output.' => '',
+  'You cannot adjust the price for pricegroup "#1" by a negative percentage.' => '',
+  'You cannot continue before all required modules are installed.' => '',
+  'You cannot continue until all unknown units have been mapped to known ones.' => '',
+  'You cannot create an invoice for delivery orders for different customers.' => '',
+  'You cannot create an invoice for delivery orders from different vendors.' => '',
+  'You did not enter a name!'   => '',
+  'You do not have the permissions to access this function.' => '',
+  'You have entered or selected the following shipping address for this customer:' => '',
+  'You have not added bank accounts yet.' => '',
+  'You have not selected any delivery order.' => '',
+  'You have not selected any export.' => '',
+  'You have not selected any item.' => '',
+  'You have selected none of the invoices.' => '',
+  'You have to chose a dimension unit and a service unit which will then be assigned to those entries.' => '',
+  'You have to chose which unit to save for each of them.' => '',
+  'You have to create at least one group, grant it access to Lx-Office\'s functions and assign users to it.' => '',
+  'You have to create new Buchungsgruppen for all the combinations of inventory, income and expense accounts that have been used already.' => '',
+  'You have to enter a company name in your user preferences (see the "Program" menu, "Preferences").' => '',
+  'You have to fill in at least an account number, the bank code, the IBAN and the BIC.' => '',
+  'You have to specify a department.' => '',
+  'You have to specify an execution date for each antry.' => '',
+  'You must chose a user.'      => '',
+  'You should create a backup of the database before proceeding because the backup might not be reversible.' => '',
+  'You will now be forwarded to the administration panel.' => '',
+  'You\'re not editing a file.' => '',
+  'You\'ve already chosen the following limitations:' => '',
+  'Your PostgreSQL installationen uses UTF-8 as its encoding. Therefore you have to configure Lx-Office to use UTF-8 as well.' => '',
+  'Your TODO list'              => '',
+  'Your browser does not currently support Javascript.' => '',
+  'Your download does not exist anymore. Please re-run the DATEV export assistant.' => '',
+  'Zeitpunkt'                   => '',
+  'Zeitraum'                    => '',
+  'Zero amount posting!'        => '',
+  'Zip, City'                   => '',
+  'Zipcode'                     => '',
+  'Zusatz'                      => '',
+  '[email]'                     => '',
+  'account_description'         => '',
+  'accrual'                     => '',
+  'all entries'                 => '',
+  'ap_aging_list'               => '',
+  'ar_aging_list'               => '',
+  'as at'                       => '',
+  'assembly_list'               => '',
+  'back'                        => '',
+  'bank_transfer_payment_list_#1' => '',
+  'bankaccounts'                => '',
+  'banktransfers'               => '',
+  'bestbefore #1'               => '',
+  'bin_list'                    => '',
+  'bis'                         => '',
+  'button'                      => '',
+  'cash'                        => '',
+  'chargenumber #1'             => '',
+  'chart_of_accounts'           => '',
+  'choice'                      => '',
+  'choice part'                 => '',
+  'click here to edit cvars'    => '',
+  'close'                       => '',
+  'closed'                      => '',
+  'config/authentication.pl: Key "DB_config" is missing.' => '',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => '',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => '',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => '',
+  'continue'                    => '',
+  'correction'                  => '',
+  'cp_greeting to cp_gender migration' => '',
+  'customer'                    => '',
+  'customer_list'               => '',
+  'debug'                       => '',
+  'delete'                      => '',
+  'deliverydate'                => '',
+  'direct debit'                => '',
+  'disposed'                    => '',
+  'done'                        => '',
+  'down'                        => '',
+  'dunning_list'                => '',
+  'eMail Send?'                 => '',
+  'eMail?'                      => '',
+  'ea'                          => '',
+  'emailed to'                  => '',
+  'executed'                    => '',
+  'female'                      => '',
+  'follow_up_list'              => '',
+  'for'                         => '',
+  'for Period'                  => '',
+  'found'                       => '',
+  'from (time)'                 => '',
+  'general_ledger_list'         => '',
+  'history'                     => '',
+  'history search engine'       => '',
+  'invoice'                     => '',
+  'invoice_list'                => '',
+  'lead deleted!'               => '',
+  'lead saved!'                 => '',
+  'list'                        => '',
+  'list_of_payments'            => '',
+  'list_of_receipts'            => '',
+  'list_of_transactions'        => '',
+  'logout'                      => '',
+  'male'                        => '',
+  'mark as paid'                => '',
+  'missing'                     => '',
+  'month'                       => '',
+  'new Window'                  => '',
+  'no'                          => '',
+  'no bestbefore'               => '',
+  'no chargenumber'             => '',
+  'none (pricegroup)'           => '',
+  'not executed'                => '',
+  'not transferred in yet'      => '',
+  'not transferred out yet'     => '',
+  'not yet executed'            => '',
+  'number'                      => '',
+  'oe.pl::search called with unknown type' => '',
+  'open'                        => '',
+  'order'                       => '',
+  'our vendor number at customer' => '',
+  'packing_list'                => '',
+  'part_list'                   => '',
+  'pick_list'                   => '',
+  'plural first char'           => '',
+  'pos_bilanz'                  => '',
+  'pos_bwa'                     => '',
+  'pos_eur'                     => '',
+  'pos_ustva'                   => '',
+  'posted!'                     => '',
+  'print'                       => '',
+  'proforma'                    => '',
+  'project_list'                => '',
+  'purchase_delivery_order_list' => '',
+  'purchase_order'              => '',
+  'purchase_order_list'         => '',
+  'quarter'                     => '',
+  'quotation_list'              => '',
+  'release_material'            => '',
+  'report_generator_dispatch_to is not defined.' => '',
+  'report_generator_nextsub is not defined.' => '',
+  'request_quotation'           => '',
+  'reset'                       => '',
+  'return_material'             => '',
+  'rfq_list'                    => '',
+  'sales tax identification number' => '',
+  'sales_delivery_order_list'   => '',
+  'sales_order'                 => '',
+  'sales_order_list'            => '',
+  'sales_quotation'             => '',
+  'saved'                       => '',
+  'saved!'                      => '',
+  'sent'                        => '',
+  'sent to printer'             => '',
+  'service_list'                => '',
+  'shipped'                     => '',
+  'singular first char'         => '',
+  'soldtotal'                   => '',
+  'stock'                       => '',
+  'submit'                      => '',
+  'tax_chartaccno'              => '',
+  'tax_percent'                 => '',
+  'tax_rate'                    => '',
+  'tax_taxdescription'          => '',
+  'tax_taxkey'                  => '',
+  'taxnumber'                   => '',
+  'to (date)'                   => '',
+  'to (time)'                   => '',
+  'transfer'                    => '',
+  'transferred in'              => '',
+  'transferred out'             => '',
+  'trial_balance'               => '',
+  'up'                          => '',
+  'use program settings'        => '',
+  'used'                        => '',
+  'valid from'                  => '',
+  'vendor'                      => '',
+  'vendor_invoice_list'         => '',
+  'vendor_list'                 => '',
+  'warehouse_journal_list'      => '',
+  'warehouse_report_list'       => '',
+  'wrongformat'                 => '',
+  'yes'                         => '',
 };
 
 1;
diff --git a/locale/fr/all.old b/locale/fr/all.old
new file mode 100644 (file)
index 0000000..f0637d5
--- /dev/null
@@ -0,0 +1,500 @@
+# These are all the texts to build the translations files.
+# The file has the form of 'english text'  => 'foreign text',
+# you can add the translation in this file or in the 'missing' file
+# run locales.pl from this directory to rebuild the translation files
+
+$self{texts} = {
+  'AP'                          => 'Dépenses',
+  'AP Aging'                    => 'Dépenses exigibles',
+  'AP Transaction'              => 'Ecriture Dépense',
+  'AP Transactions'             => 'Mouvements - Dépenses',
+  'AR'                          => 'Recettes',
+  'AR Aging'                    => 'Recettes exigibles',
+  'AR Transaction'              => 'Ecriture Recette',
+  'AR Transactions'             => 'Mouvements - Recettes',
+  'About'                       => 'A propos',
+  'Access Control'              => 'Contrôle d\'accès',
+  'Account'                     => 'Compte',
+  'Account Number'              => 'Numéro de compte',
+  'Account Number missing!'     => 'Numéro de compte manquant!',
+  'Account Type'                => 'Type de compte',
+  'Account Type missing!'       => 'Type de compte manquant!',
+  'Account deleted!'            => 'Compte supprimé',
+  'Account saved!'              => 'Compte enregistré',
+  'Accounting'                  => 'Comptabilité',
+  'Accounting Menu'             => 'Menu de comptabilité',
+  'Accounts'                    => 'Comptes',
+  'Active'                      => 'Actif',
+  'Add'                         => 'Ajouter',
+  'Add Account'                 => 'Ajouter compte',
+  'Add Accounts Payables Transaction' => 'Saisie d\'écriture - Dépenses',
+  'Add Accounts Receivables Transaction' => 'Saisie d\'écriture - Recettes',
+  'Add Assembly'                => 'Ajouter produit',
+  'Add Customer'                => 'Ajouter client',
+  'Add GIFI'                    => 'Ajouter Code d\'Identification Comptable ou Fiscale',
+  'Add General Ledger Transaction' => 'Ajouter une Ã©criture au Grand Livre',
+  'Add Group'                   => 'Ajouter group',
+  'Add Part'                    => 'Ajouter marchandise',
+  'Add Project'                 => 'Ajouter projet',
+  'Add Purchase Order'          => 'Etablir commande d\'achat',
+  'Add Sales Invoice'           => 'Etablir facture de vente',
+  'Add Sales Order'             => 'Etablir commande de vente',
+  'Add Service'                 => 'Ajouter service',
+  'Add Transaction'             => 'Saisie d\'écriture',
+  'Add User'                    => 'Ajouter utilisateur',
+  'Add Vendor'                  => 'Ajouter fournisseur',
+  'Add Vendor Invoice'          => 'Etablir facture de vente',
+  'Address'                     => 'Adresse',
+  'Administration'              => 'Administration',
+  'Administrator'               => 'Administrateur',
+  'All'                         => 'Tous',
+  'All Datasets up to date!'    => 'Tous les fichiers de données sont Ã  jour!',
+  'Amount'                      => 'Total',
+  'Amount Due'                  => 'Montant dû',
+  'Amount does not equal applied!' => 'Le montant n\'est Ã©gal Ã  celui appliqué!',
+  'Amount missing!'             => 'Montant manquant',
+  'Applied'                     => 'Appliquer',
+  'Apr'                         => 'Avril',
+  'April'                       => 'Avril',
+  'Are you sure you want to delete Invoice Number' => 'Êtes-vous sûr de vouloir supprimer la Facture N°',
+  'Are you sure you want to delete Order Number' => 'Êtes vous sûr de vouloir supprimer Commande N°',
+  'Are you sure you want to delete Transaction' => 'Êtes vous sûr de vouloir effacer la saisie?',
+  'Assemblies'                  => 'Produits finis',
+  'Assemblies restocked!'       => 'Renvoyer produits vers stock!',
+  'Assembly Number missing!'    => 'Numéro de produit manquant',
+  'Asset'                       => 'Actif',
+  'Attachment'                  => 'Pièce jointe',
+  'Audit Control'               => 'Clôture périodique',
+  'Aug'                         => 'Août',
+  'August'                      => 'Août',
+  'BOM'                         => 'Nomenclature composantes',
+  'Backup'                      => 'Sauvegarder',
+  'Backup sent to'              => 'Sauvegarde envoyée Ã ',
+  'Balance'                     => 'Solde',
+  'Balance Sheet'               => 'Bilan',
+  'Bcc'                         => 'Bcc',
+  'Bin'                         => 'Localisation',
+  'Books are open'              => 'Début exercice',
+  'Bought'                      => 'Acheté',
+  'Business Number'             => 'Numéro d\'enregistrement société',
+  'C'                           => 'C',
+  'COGS'                        => 'CMV',
+  'Cannot delete account!'      => 'Impossible de supprimer le compte!',
+  'Cannot delete customer!'     => 'Impossible de supprimer le client!',
+  'Cannot delete default account!' => 'Ne peut pas supprimer le compte par defaut!',
+  'Cannot delete invoice!'      => 'Impossible de supprimer la facture',
+  'Cannot delete item!'         => 'Impossible de supprimer ce poste!',
+  'Cannot delete order!'        => 'Impossible de supprimer la commande!',
+  'Cannot delete transaction!'  => 'Impossible de supprimer la saisie!',
+  'Cannot delete vendor!'       => 'Impossible de supprimer le fournisseur!',
+  'Cannot have a value in both Debit and Credit!' => 'Impossible d\'avoir des valeurs dans Crédit et Débit en même temps!',
+  'Cannot post a transaction without a value!' => 'Impossible d\'effectuer une Ã©criture sans valeur!',
+  'Cannot post invoice for a closed period!' => 'Impossible d\'enregistrer la facture sur un exercice clos!',
+  'Cannot post invoice!'        => 'Impossible d\'enregistrer la facture!',
+  'Cannot post payment for a closed period!' => 'Impossible d\'enregistrer le paiement sur un exercice clos!',
+  'Cannot post payment!'        => 'Impossible d\'enregistrer le paiement!',
+  'Cannot post transaction for a closed period!' => 'Impossible d\'enregistrer l\'écriture sur un exercice clos!',
+  'Cannot post transaction!'    => 'Impossible d\'enregistrer l\'écriture!',
+  'Cannot process payment for a closed period!' => 'Impossible de faire un paiement sur un exercice clos!',
+  'Cannot save account!'        => 'Impossible d\'enregistrer le compte!',
+  'Cannot save order!'          => 'Impossible d\'enregistrer la commande!',
+  'Cannot save preferences!'    => 'Impossible d\'enregistrer les préférences',
+  'Cannot stock assemblies!'    => 'Impossible de stocker l\'assemblage!',
+  'Cash'                        => 'Financier',
+  'Cash based'                  => 'En liquide',
+  'Cc'                          => 'Cc',
+  'Change Admin Password'       => 'Changement de mot de passe administrateur',
+  'Change Password'             => 'Changement de mot de passe',
+  'Character Set'               => 'Encodage des caractères',
+  'Chart of Accounts'           => 'Plan Comptable',
+  'Check'                       => 'Chèque',
+  'Check printed!'              => 'Chèque imprimé!',
+  'Check printing failed!'      => 'Impression du chèque Ã©choué!',
+  'Cleared Balance'             => 'Solde rapproché',
+  'Click on login name to edit!' => 'Cliquer sur votre identifiant pour editer',
+  'Close Books up to'           => 'Clôturer l\'exercice jusqu\'au',
+  'Closed'                      => 'Clôturé',
+  'Company'                     => 'Société',
+  'Compare to'                  => 'Comparer Ã ',
+  'Confirm!'                    => 'Confirmez!',
+  'Connect to'                  => 'Connecter Ã ',
+  'Contact'                     => 'Contact',
+  'Continue'                    => 'Continuer',
+  'Copies'                      => 'Copies',
+  'Copy to COA'                 => 'Copier dans le Plan Comptable',
+  'Create Chart of Accounts'    => 'Créer le Plan Comptable',
+  'Create Dataset'              => 'Créer fichier de données',
+  'Credit'                      => 'Crédit',
+  'Credit Limit'                => 'Encours autorisé',
+  'Curr'                        => 'En cours',
+  'Currency'                    => 'Devise',
+  'Current'                     => 'En cours',
+  'Customer'                    => 'Client',
+  'Customer deleted!'           => 'Client supprimé!',
+  'Customer missing!'           => 'Client manquant!',
+  'Customer not on file!'       => 'Client absent du fichier!',
+  'Customer saved!'             => 'Client enregistré!',
+  'Customers'                   => 'Clients',
+  'DBI not installed!'          => 'DBI non installée!',
+  'Database'                    => 'Base de données',
+  'Database Administration'     => 'Gérer base de données',
+  'Database Driver not checked!' => 'Pilotes de base de données pas verifiés!',
+  'Database Host'               => 'Hôte de base de données',
+  'Database User missing!'      => 'Utilisateur base de données manquante!',
+  'Dataset'                     => 'Fichier de données',
+  'Dataset missing!'            => 'Fichier de données manquant!',
+  'Dataset updated!'            => 'Base de données mise Ã  jour!',
+  'Date'                        => 'Date',
+  'Date Format'                 => 'Format de Date',
+  'Date Paid'                   => 'Date de paiement',
+  'Date missing!'               => 'Date manquante!',
+  'Debit'                       => 'Débit',
+  'Debit and credit out of balance!' => 'Le débit et le crédit ne sont pas Ã©quilibrés!',
+  'Dec'                         => 'Déc.',
+  'December'                    => 'Décembre',
+  'Decimalplaces'               => 'Décimales',
+  'Delete'                      => 'Supprimer',
+  'Delete Account'              => 'Supprimer compte',
+  'Delete Dataset'              => 'Supprimer fichier de données',
+  'Delivery Date'               => 'Date de livraison',
+  'Deposit'                     => 'Dépôt',
+  'Description'                 => 'Description',
+  'Difference'                  => 'Différence',
+  'Directory'                   => 'Répertoire',
+  'Discount'                    => 'Remise',
+  'Done'                        => 'Fait!',
+  'Drawing'                     => 'Dessin',
+  'Driver'                      => 'Pilote',
+  'Dropdown Limit'              => 'Limit de déroulement',
+  'Due'                         => 'Echéance',
+  'Due Date'                    => 'Date d\'échéance',
+  'Due Date missing!'           => 'Date d\'échéance manquante!',
+  'E-mail'                      => 'Email',
+  'E-mail Statement to'         => 'Message Ã©léctronique Ã ',
+  'E-mail address missing!'     => 'Adresse email manquante!',
+  'Edit'                        => 'Modifier',
+  'Edit Account'                => 'Modifier le compte',
+  'Edit Accounts Payables Transaction' => 'Modifier Mouvements - Dépenses',
+  'Edit Accounts Receivables Transaction' => 'Modifier Mouvements - Recettes',
+  'Edit Assembly'               => 'Modifier produit fini / transformé',
+  'Edit Customer'               => 'Modifier client',
+  'Edit GIFI'                   => 'Modifier Code d\'Identification Comptable ou Fiscale',
+  'Edit General Ledger Transaction' => 'Modifier Ã©criture Grand Livre',
+  'Edit Group'                  => 'Modifier groupe',
+  'Edit Part'                   => 'Modifier marchandise',
+  'Edit Preferences for'        => 'Modifier les préférences pour',
+  'Edit Project'                => 'Modifier projet',
+  'Edit Purchase Order'         => 'Modifier commande d\'achat',
+  'Edit Sales Invoice'          => 'Modifier facture de vente',
+  'Edit Sales Order'            => 'Modifier commande de vente',
+  'Edit Service'                => 'Modifier service',
+  'Edit Template'               => 'Modifier modèle',
+  'Edit User'                   => 'Modifier utilisateur',
+  'Edit Vendor'                 => 'Modifier fournisseur',
+  'Edit Vendor Invoice'         => 'Modifier facture de fournisseur',
+  'Employee'                    => 'Employé',
+  'Enforce transaction reversal for all dates' => 'Appliquer l\'inversion des Ã©critures pour toutes les dates',
+  'Enter up to 3 letters separated by a colon (i.e CAD:USD:EUR) for your native and foreign currencies' => 'Entrer le nom de la monnaie nationale et des monnaies Ã©trangères en 3 lettres séparées par (:) (Ex: EUR:USD:CAD)',
+  'Equity'                      => 'Capital',
+  'Exch'                        => 'Change',
+  'Exchangerate'                => 'Taux de change',
+  'Exchangerate Difference'     => 'Différence de taux de change',
+  'Exchangerate for payment missing!' => 'Taux de change manquant pour le paiement!',
+  'Exchangerate missing!'       => 'Taux de change manquant!',
+  'Existing Datasets'           => 'Fichiers de données existants',
+  'Expense'                     => 'Dépense',
+  'Expense Account'             => 'Compte Dépenses',
+  'Expense/Asset'               => 'Dépense/Actif',
+  'Extended'                    => 'Prix Total',
+  'Fax'                         => 'Fax',
+  'Feb'                         => 'Fév.',
+  'February'                    => 'Février',
+  'Foreign Exchange Gain'       => 'Produit conversion devises',
+  'Foreign Exchange Loss'       => 'Perte conversion devises',
+  'From'                        => 'De',
+  'GIFI'                        => 'Code d\'Identification Comptable ou Fiscale',
+  'GIFI deleted!'               => 'Code d\'Identification Comptable ou Fiscale supprimé!',
+  'GIFI missing!'               => 'Code d\'Identification Comptable ou Fiscale manquant!',
+  'GIFI saved!'                 => 'Code d\'Identification Comptable ou Fiscale enregistré!',
+  'GL Transaction'              => 'Transaction Grand Livre',
+  'General Ledger'              => 'Grand Livre',
+  'Goods & Services'            => 'Articles & Services',
+  'Group'                       => 'Groupe',
+  'Group Items'                 => 'Grouper objets',
+  'Group deleted!'              => 'Groupe effacé!',
+  'Group missing!'              => 'Groupe absent!',
+  'Group saved!'                => 'Groupe enregistré!',
+  'Groups'                      => 'Groupes',
+  'HTML Templates'              => 'Gabarits HTML',
+  'Heading'                     => 'En-tête',
+  'Host'                        => 'Hôte',
+  'Hostname missing!'           => 'Nom de l\'hôte manquant',
+  'ID'                          => 'ID',
+  'Image'                       => 'Image',
+  'In-line'                     => 'En ligne',
+  'Include in Report'           => 'Inclure dans l\'état',
+  'Include in drop-down menus'  => 'Inclure dans les menus deroulants',
+  'Include this account on the customer/vendor forms to flag customer/vendor as taxable?' => 'Afficher ce compte sur les formulaires de client/fournisseur pour le marquer comme imposable?',
+  'Income'                      => 'Recettes',
+  'Income Account'              => 'Compte Recettes',
+  'Income Statement'            => 'Compte de Résultat',
+  'Incorrect Dataset version!'  => 'Fichier de données incorrect!',
+  'Incorrect Password!'         => 'Mot de passe incorrect!',
+  'Individual Items'            => 'Composition en marchandises individuelles',
+  'Inventory'                   => 'Inventaire',
+  'Inventory Account'           => 'Compte d\'Inventaire',
+  'Inventory quantity must be zero before you can set this assembly obsolete!' => 'La quantité en stock doit Ãªtre Ã  zéro avant de pouvoir indiquer cet assemblage comme obsolète!',
+  'Inventory quantity must be zero before you can set this part obsolete!' => 'La quantité en stock devrait Ãªtre zero avant de pouvoir indiquer cette pièce comme obsolète!',
+  'Invoice'                     => 'Facture',
+  'Invoice Date'                => 'Date de facturation',
+  'Invoice Date missing!'       => 'Date de facture manquante!',
+  'Invoice Number'              => 'Numéro de facture',
+  'Invoice Number missing!'     => 'Numéro de facture manquant!',
+  'Invoice deleted!'            => 'Facture supprimé!',
+  'Invoice posted!'             => 'Facture enregistré!',
+  'Invoices'                    => 'Factures',
+  'Is this a summary account to record' => 'Est-ce que c\'est un compte sommaire Ã  enregistrer?',
+  'Item deleted!'               => 'Objet supprimé!',
+  'Item not on file!'           => 'Objet non-listé!',
+  'Jan'                         => 'Jan.',
+  'January'                     => 'Janvier',
+  'Jul'                         => 'Juil.',
+  'July'                        => 'Juillet',
+  'Jun'                         => 'Juin',
+  'June'                        => 'Juin',
+  'LaTeX Templates'             => 'Gabarits LaTeX',
+  'Language'                    => 'Langue',
+  'Last Cost'                   => 'Dernier prix',
+  'Last Invoice Number'         => 'Dernier numéro de facture',
+  'Last Numbers & Default Accounts' => 'Derniers numéros et comptes par défauts',
+  'Last Purchase Order Number'  => 'Dernier numéro de commande d\'achat',
+  'Last Sales Order Number'     => 'Numéro de la dernière commande de vente',
+  'Leave host and port field empty unless you want to make a remote connection.' => 'Laisser "port" et "hôte" vide, sauf si vous voulez vous connecter Ã  distance (par réseau)',
+  'Liability'                   => 'Passif',
+  'Licensed to'                 => 'Licence Ã ',
+  'Line Total'                  => 'Total ligne',
+  'Link'                        => 'Liens',
+  'Link Accounts'               => 'Lier Comptes',
+  'List Accounts'               => 'Liste des comptes',
+  'List GIFI'                   => 'Afficher la liste des Codes d\'Identification Comptable ou Fiscale',
+  'List Price'                  => 'Prix de revient',
+  'List Transactions'           => 'Afficher Ã©critures',
+  'Login'                       => 'Login',
+  'Login name missing!'         => '',
+  'Logout'                      => 'Déconnexion',
+  'Make'                        => 'Marque',
+  'Mar'                         => 'Mars',
+  'March'                       => 'Mars',
+  'May'                         => 'Mai',
+  'May '                        => 'Mai ',
+  'Message'                     => 'Message',
+  'Microfiche'                  => 'Microfiche',
+  'Model'                       => 'Modèle',
+  'Multibyte Encoding'          => 'Encodage multibyte',
+  'N/A'                         => 'Non Applicable',
+  'Name'                        => 'Nom',
+  'Name missing!'               => 'Nom manquant!',
+  'New Templates'               => 'Nouveaux gabarits',
+  'No'                          => 'Non',
+  'No Database Drivers available!' => 'Pas de pilotes de base de données disponibles!',
+  'No Dataset selected!'        => 'Pas de fichier de données sélectioné!',
+  'No email address for'        => 'Pas d\'adresse email pour',
+  'No.'                         => 'No.',
+  'Notes'                       => 'Notes',
+  'Nothing applied!'            => 'Rien n\'a Ã©té appliqué!',
+  'Nothing selected!'           => 'Pas de sélection!',
+  'Nothing to delete!'          => 'Rien Ã  supprimer',
+  'Nov'                         => 'Nov.',
+  'November'                    => 'Novembre',
+  'Number'                      => 'Numéro',
+  'Number Format'               => 'Format des numéros',
+  'Number missing in Row'       => 'Numéro manquant dans ligne',
+  'O'                           => 'O',
+  'Obsolete'                    => 'Obsolète',
+  'Oct'                         => 'Oct.',
+  'October'                     => 'Octobre',
+  'On Hand'                     => 'En Stock / Disponible',
+  'On Order'                    => 'Sur Commande',
+  'Open'                        => 'Ouvert',
+  'Oracle Database Administration' => 'Administration de base de données Oracle',
+  'Order'                       => 'Commande',
+  'Order Date'                  => 'Date commande',
+  'Order Date missing!'         => 'Date de commande manquante!',
+  'Order Entry'                 => 'Bons de Commandes',
+  'Order Number'                => 'Numéro de commande',
+  'Order Number missing!'       => 'Numéro de commande manquant!',
+  'Order deleted!'              => 'Commande supprimé!',
+  'Order saved!'                => 'Commande enregistré!',
+  'Ordered'                     => 'Commandé',
+  'Orphaned'                    => 'Orphelin',
+  'Out of balance!'             => 'Solde non Ã©quilibré!',
+  'PDF'                         => 'PDF',
+  'Packing List'                => 'Liste d\'envoi',
+  'Packing List Date missing!'  => 'La date est manquante sur la liste d\'envoi!',
+  'Packing List Number missing!' => 'Le numéro de liste d\'envoi est manquant!',
+  'Paid'                        => 'Total Payé',
+  'Paid in full'                => 'Complètement payé',
+  'Part'                        => 'Marchandise',
+  'Part Number missing!'        => 'Numéro de marchandise manquant!',
+  'Parts'                       => 'Marchandises',
+  'Parts Inventory'             => 'Inventaire marchandises',
+  'Password'                    => 'Mot de Passe',
+  'Password changed!'           => 'Mot de passe changé!',
+  'Payables'                    => 'À Payer',
+  'Payment'                     => 'Paiement',
+  'Payment date missing!'       => 'Date de paiement manquant!',
+  'Payment posted!'             => 'Paiement enregistré!',
+  'Payments'                    => 'Paiements',
+  'Pg Database Administration'  => 'Administration base de données PostgreSQL',
+  'Phone'                       => 'Tél.',
+  'Port'                        => 'Port',
+  'Port missing!'               => 'Port manquant!',
+  'Post'                        => 'Enregistrer',
+  'Post as new'                 => 'Enregistrer comme nouveau',
+  'Postscript'                  => 'Postcript',
+  'Preferences'                 => 'Préférences',
+  'Preferences saved!'          => 'Préférences enregistrées!',
+  'Price'                       => 'Prix',
+  'Print'                       => 'Imprimer',
+  'Printer'                     => 'Imprimante',
+  'Project'                     => 'Projet',
+  'Project Number'              => 'Numéro de projet',
+  'Project Number missing!'     => 'Numéro du projet manquant!',
+  'Project deleted!'            => 'Projet supprimé!',
+  'Project not on file!'        => 'Projet absent du fichier!',
+  'Project saved!'              => 'Projet enregistré!',
+  'Projects'                    => 'Projets',
+  'Purchase Order'              => 'Commande d\'Achat',
+  'Purchase Orders'             => 'Commandes d\'Achats',
+  'Qty'                         => 'Qté',
+  'ROP'                         => 'Niveau de commande',
+  'Rate'                        => 'Cadence',
+  'Recd'                        => 'Reçu',
+  'Receipt'                     => 'Reçu',
+  'Receipt printed!'            => 'Impression reçu!',
+  'Receipt printing failed!'    => 'Erreur lors de l\'impression du reçu!',
+  'Receipts'                    => 'Reçus',
+  'Receivables'                 => 'À recevoir',
+  'Reconciliation'              => 'Rapprochement',
+  'Record in'                   => 'Enregistrer dans',
+  'Reference'                   => 'Référence',
+  'Reference missing!'          => 'Référence manquant!',
+  'Remaining'                   => 'Restant',
+  'Report for'                  => 'Rapport de',
+  'Reports'                     => 'Rapports',
+  'Required by'                 => 'Requis pour',
+  'Retained Earnings'           => 'Éxcédents non distribués',
+  'Sales'                       => 'Ventes',
+  'Sales Invoice'               => 'Facture de Vente',
+  'Sales Order'                 => 'Commande de Vente',
+  'Sales Orders'                => 'Commandes de Vente',
+  'Salesperson'                 => 'Vendeur',
+  'Save'                        => 'Enregistrer',
+  'Save as new'                 => 'Enregistrer comme nouveau',
+  'Save to File'                => 'Enregistrer comme fichier',
+  'Screen'                      => 'Écran',
+  'Select a Dataset to delete and press "Continue"' => 'Sélectionner la base de données Ã  supprimer et cliquer sur "Continuer"',
+  'Select all'                  => 'Sélectionner tout',
+  'Select from one of the items below' => 'Sélectionner un des postes ci-dessous',
+  'Select from one of the names below' => 'Sélectionner un des noms ci-dessous',
+  'Select from one of the projects below' => 'Sélectionner un des projets ci-dessous',
+  'Select postscript or PDF!'   => 'Sélectionner Postscript ou PDF',
+  'Sell Price'                  => 'Prix de vente',
+  'Send by E-Mail'              => 'Envoyer par email',
+  'Sep'                         => 'Sept.',
+  'September'                   => 'Septembre',
+  'Service'                     => 'Service',
+  'Service Items'               => 'Services',
+  'Service Number missing!'     => 'Numéro de service manquant!',
+  'Services'                    => 'Services',
+  'Setup Templates'             => 'Configuration des Gabarits',
+  'Ship'                        => 'Expédier',
+  'Ship to'                     => 'Expédier Ã ',
+  'Ship via'                    => 'Expédier via',
+  'Short'                       => 'Court',
+  'Signature'                   => 'Signature',
+  'Sold'                        => 'Vendu',
+  'Source'                      => 'Source',
+  'Standard'                    => 'Standard',
+  'Statement'                   => 'Relevé',
+  'Statement Balance'           => 'Relevé de compte',
+  'Statement sent to'           => 'Relevé envoyé Ã ',
+  'Statements sent to printer!' => 'Relevés envoyés Ã  l\'imprimante!',
+  'Stock'                       => 'Stock',
+  'Stock Assembly'              => 'Stock de produits',
+  'Stylesheet'                  => 'Feuille de style',
+  'Subject'                     => 'Objet',
+  'Subtotal'                    => 'Sous Total',
+  'System'                      => 'Système',
+  'Tax'                         => 'Taxe',
+  'Tax Accounts'                => 'Comptes de taxe',
+  'Tax Included'                => 'Taxe incluse',
+  'Tax collected'               => 'Taxe collectée',
+  'Tax paid'                    => 'Taxe payée',
+  'Taxable'                     => 'Imposable',
+  'Template saved!'             => 'Gabarit enregistré!',
+  'Templates'                   => 'Gabarits',
+  'Terms: Net'                  => 'Crédit limité Ã ',
+  'The following Datasets are not in use and can be deleted' => 'Les fichiers de données suivants ne sont pas utilisés et peuvent Ãªtre supprimés.',
+  'The following Datasets need to be updated' => 'Les fichiers de données suivants doivent Ãªtre mis a jour',
+  'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => 'Ceci est un test préliminaire des sources existante. Aucune modification Ã  ce stade!!',
+  'To'                          => 'à ',
+  'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => 'Pour ajouter un utilisateur Ã  un groupe, editer un "nom", changer le "login" et enregistrer. Un nouveau utilisateur avec les mêmes données sera enregistré avec le nouveau "login".',
+  'Top Level'                   => 'Description principale',
+  'Total'                       => 'Total',
+  'Transaction Date missing!'   => 'Date d\'écriture manquante!',
+  'Transaction deleted!'        => 'Ecriture supprimée!',
+  'Transaction posted!'         => 'Ecriture enregistrée!',
+  'Transaction reversal enforced for all dates' => 'Inversion des Ã©critures exécuté pour toutes les dates',
+  'Transaction reversal enforced up to' => 'Inversion des Ã©critures exécuté jusqu\'au',
+  'Transactions'                => 'Mouvements',
+  'Transactions exist, cannot delete customer!' => 'Des Ã©critures existent, impossible d\'effacer le client!',
+  'Transactions exist, cannot delete vendor!' => 'Des Ã©critures existent, impossible d\'effacer le fournisseur!',
+  'Transactions exist; cannot delete account!' => 'Des Ã©critures existent, impossible d\'effacer le compte!',
+  'Trial Balance'               => 'Balance Globale',
+  'Unit'                        => 'Unité',
+  'Unit of measure'             => 'Unité de mesure',
+  'Update'                      => 'Mettre Ã  jour',
+  'Update Dataset'              => 'Mis Ã  jour de la base de données',
+  'Updated'                     => 'Mis Ã  jour',
+  'Use Templates'               => 'Utiliser les modèles',
+  'User'                        => 'Utilisateur',
+  'User deleted!'               => 'Utilisateur supprimé!',
+  'User saved!'                 => 'Utilisateur enregistré!',
+  'Vendor'                      => 'Fournisseur',
+  'Vendor Invoice'              => 'Facture d\'Achat',
+  'Vendor deleted!'             => 'Fournisseur supprimé!',
+  'Vendor missing!'             => 'Fournisseur manquant!',
+  'Vendor not on file!'         => 'Fournisseur absent du fichier!',
+  'Vendor saved!'               => 'Fournisseur enregistré!',
+  'Vendors'                     => 'Fournisseurs',
+  'Version'                     => 'Version',
+  'Weight'                      => 'Poids',
+  'Weight Unit'                 => 'Unité de poids',
+  'What type of item is this?'  => 'De quel type est ce poste?',
+  'Year End'                    => 'Fin d\'année',
+  'Yes'                         => 'Oui',
+  'You are logged out!'         => 'Vous Ãªtes déconnecté!',
+  'You did not enter a name!'   => 'Vous n\'avez pas saisi de nom!',
+  'You must enter a host and port for local and remote connections!' => 'Vous devez saisir un "hôte" et un "port" pour les connexions distantes!',
+  'as at'                       => 'au',
+  'collected on sales'          => 'collectées sur les ventes',
+  'days'                        => 'jours',
+  'does not exist'              => 'n\'existe pas!',
+  'ea'                          => 'ch',
+  'emailed to'                  => 'envoyé par email Ã ',
+  'for Period'                  => 'pour la période',
+  'hr'                          => 'h',
+  'is already a member!'        => 'est déjà un membre!',
+  'is not a member!'            => 'n\'est pas un membre',
+  'localhost'                   => 'hôte local',
+  'locked!'                     => 'verrouillé!',
+  'paid on purchases'           => 'payées sur les achats',
+  'sent to printer'             => 'envoyé Ã  l\'imprimante',
+  'successfully created!'       => 'créé avec succès',
+  'successfully deleted!'       => 'supprimé avec succès',
+  'to'                          => 'jusqu\'au',
+  'website'                     => 'site web',
+};
+
+1;
diff --git a/locale/fr/charset b/locale/fr/charset
new file mode 100644 (file)
index 0000000..a524421
--- /dev/null
@@ -0,0 +1 @@
+utf-8
diff --git a/locale/fr/missing b/locale/fr/missing
new file mode 100644 (file)
index 0000000..f9f9bb5
--- /dev/null
@@ -0,0 +1,2039 @@
+#!/usr/bin/perl
+# -*- coding: utf-8; -*-
+# vim: fenc=utf-8
+
+# add the missing texts and run locales.pl to rebuild
+
+$missing = {
+  ' Date missing!'              => '',
+  ' Part Number missing!'       => '',
+  ' missing!'                   => '',
+  '#1 prices were updated.'     => '',
+  '&lt;%account_number%&gt; -- Your account number' => '',
+  '&lt;%bank%&gt; -- Your bank' => '',
+  '&lt;%bank_code%&gt; -- Your bank code' => '',
+  '&lt;%currency%&gt; -- The selected currency' => '',
+  '&lt;%invtotal%&gt; -- Invoice total' => '',
+  '&lt;%invtotal_wo_skonto%&gt; -- Invoice total less discount' => '',
+  '&lt;%netto_date%&gt; -- Date the payment is due in full' => '',
+  '&lt;%skonto_amount%&gt; -- The deductible amount' => '',
+  '&lt;%skonto_date%&gt; -- Date the payment is due with discount' => '',
+  '&lt;%skonto_in_percent%&gt; -- The discount in percent' => '',
+  '&lt;%terms_netto%&gt; -- The number of days for full payment' => '',
+  '&lt;%total%&gt; -- Amount payable' => '',
+  '&lt;%total_wo_skonto%&gt; -- Amount payable less discount' => '',
+  '*/'                          => '',
+  '---please select---'         => '',
+  '...after loggin in'          => '',
+  '...done'                     => '',
+  '...on the TODO list'         => '',
+  '1. Quarter'                  => '',
+  '2. Quarter'                  => '',
+  '3. Quarter'                  => '',
+  '4. Quarter'                  => '',
+  '<b>What</b> do you want to look for?' => '',
+  'A Buchungsgruppe consists of a descriptive name and the account numbers for the income and expense accounts for those four tax zones as well as the inventory account number.' => '',
+  'A group named &quot;Full Access&quot; has been created.' => '',
+  'A group with that name does already exist.' => '',
+  'A lot of the usability of Lx-Office has been enhanced with javascript. Although it is currently possible to use every aspect of Lx-Office without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.' => '',
+  'A temporary directory could not be created:' => '',
+  'A temporary file could not be created. Please verify that the directory "#1" is writeable by the webserver.' => '',
+  'A temporary file could not be created:' => '',
+  'A unit with this name does already exist.' => '',
+  'A variable marked as \'editable\' can be changed in each quotation, order, invoice etc.' => '',
+  'ADDED'                       => '',
+  'AP'                          => '',
+  'AP Aging'                    => '',
+  'AP Transaction'              => '',
+  'AP Transaction (abbreviation)' => '',
+  'AP Transaction Storno (one letter abbreviation)' => '',
+  'AP Transaction with Storno (abbreviation)' => '',
+  'AP Transactions'             => '',
+  'AP transactions with sales taxkeys and/or AR transactions with input taxkeys' => '',
+  'AR'                          => '',
+  'AR Aging'                    => '',
+  'AR Transaction'              => '',
+  'AR Transaction (abbreviation)' => '',
+  'AR Transactions'             => '',
+  'ASSETS'                      => '',
+  'Abrechnungsnummer'           => '',
+  'Abteilung'                   => '',
+  'Account'                     => '',
+  'Account Category A'          => '',
+  'Account Category C'          => '',
+  'Account Category E'          => '',
+  'Account Category G'          => '',
+  'Account Category I'          => '',
+  'Account Category L'          => '',
+  'Account Category Q'          => '',
+  'Account Description missing!' => '',
+  'Account Link AP'             => '',
+  'Account Link AP_amount'      => '',
+  'Account Link AP_paid'        => '',
+  'Account Link AP_tax'         => '',
+  'Account Link AR'             => '',
+  'Account Link AR_amount'      => '',
+  'Account Link AR_paid'        => '',
+  'Account Link AR_tax'         => '',
+  'Account Link CT_tax'         => '',
+  'Account Link IC'             => '',
+  'Account Link IC_cogs'        => '',
+  'Account Link IC_expense'     => '',
+  'Account Link IC_income'      => '',
+  'Account Link IC_sale'        => '',
+  'Account Link IC_taxpart'     => '',
+  'Account Link IC_taxservice'  => '',
+  'Account Number'              => '',
+  'Account Number already used!' => '',
+  'Account Number missing!'     => '',
+  'Account Nummer'              => '',
+  'Account Type'                => '',
+  'Account Type missing!'       => '',
+  'Account deleted!'            => '',
+  'Account for fees'            => '',
+  'Account for interest'        => '',
+  'Account number'              => '',
+  'Account number #1, bank code #2, #3' => '',
+  'Account saved!'              => '',
+  'Accounting Group deleted!'   => '',
+  'Accounting Group saved!'     => '',
+  'Accrual'                     => '',
+  'Active'                      => '',
+  'Active?'                     => '',
+  'Add'                         => '',
+  'Add AP Transaction'          => '',
+  'Add AR Transaction'          => '',
+  'Add Account'                 => '',
+  'Add Accounting Group'        => '',
+  'Add Accounts Payables Transaction' => '',
+  'Add Accounts Receivables Transaction' => '',
+  'Add Assembly'                => '',
+  'Add Buchungsgruppe'          => '',
+  'Add Business'                => '',
+  'Add Credit Note'             => '',
+  'Add Customer'                => '',
+  'Add Delivery Order'          => '',
+  'Add Department'              => '',
+  'Add Dunning'                 => '',
+  'Add Exchangerate'            => '',
+  'Add Follow-Up'               => '',
+  'Add Follow-Up for #1'        => '',
+  'Add General Ledger Transaction' => '',
+  'Add Group'                   => '',
+  'Add Language'                => '',
+  'Add Lead'                    => '',
+  'Add License'                 => '',
+  'Add Part'                    => '',
+  'Add Payment Terms'           => '',
+  'Add Price Factor'            => '',
+  'Add Pricegroup'              => '',
+  'Add Printer'                 => '',
+  'Add Project'                 => '',
+  'Add Purchase Delivery Order' => '',
+  'Add Purchase Order'          => '',
+  'Add Quotation'               => '',
+  'Add RFQ'                     => '',
+  'Add Request for Quotation'   => '',
+  'Add Sales Delivery Order'    => '',
+  'Add Sales Invoice'           => '',
+  'Add Sales Order'             => '',
+  'Add Service'                 => '',
+  'Add Storno Credit Note'      => '',
+  'Add Transaction'             => '',
+  'Add User'                    => '',
+  'Add Vendor'                  => '',
+  'Add Vendor Invoice'          => '',
+  'Add Warehouse'               => '',
+  'Add a new group'             => '',
+  'Add and edit units'          => '',
+  'Add bank account'            => '',
+  'Add custom variable'         => '',
+  'Add note'                    => '',
+  'Add to group'                => '',
+  'Add unit'                    => '',
+  'Address'                     => '',
+  'Administration'              => '',
+  'Administration area'         => '',
+  'Advance turnover tax return' => '',
+  'Aktion'                      => '',
+  'All'                         => '',
+  'All Accounts'                => '',
+  'All Datasets up to date!'    => '',
+  'All changes in that file have been reverted.' => '',
+  'All database upgrades have been applied.' => '',
+  'All general ledger entries'  => '',
+  'All of the exports you have selected were already closed.' => '',
+  'All reports'                 => '',
+  'All the selected exports have already been closed, or all of their items have already been executed.' => '',
+  'Allow access'                => '',
+  'Allow the following users access to my follow-ups:' => '',
+  'Alternatively you can create a new part which will then be selected.' => '',
+  'Alternatively you can skip this step and create groups yourself.' => '',
+  'Amended Advance Turnover Tax Return' => '',
+  'Amended Advance Turnover Tax Return (Nr. 10)' => '',
+  'Amount'                      => '',
+  'Amount Due'                  => '',
+  'Annotations'                 => '',
+  'Another user with the login #1 does already exist.' => '',
+  'Ap aging on %s'              => '',
+  'Application Error. No Format given' => '',
+  'Application Error. Wrong Format' => '',
+  'Applying #1:'                => '',
+  'Approximately #1 prices will be updated.' => '',
+  'Apr'                         => '',
+  'April'                       => '',
+  'Ar aging on %s'              => '',
+  'Are you sure you want to delete Delivery Order Number #1?' => '',
+  'Are you sure you want to delete Invoice Number' => '',
+  'Are you sure you want to delete Order Number' => '',
+  'Are you sure you want to delete Quotation Number' => '',
+  'Are you sure you want to delete Transaction' => '',
+  'Are you sure you want to remove the marked entries from the queue?' => '',
+  'Are you sure you want to update the prices' => '',
+  'Article Code'                => '',
+  'Article Code missing!'       => '',
+  'As a result, the saved onhand values of the present goods can be stored into a warehouse designated by you, or will be reset for a proper warehouse tracking' => '',
+  'Assemblies'                  => '',
+  'Assembly Description'        => '',
+  'Assembly Number'             => '',
+  'Assembly Number missing!'    => '',
+  'Asset'                       => '',
+  'Assets'                      => '',
+  'Assign new units'            => '',
+  'Assign units'                => '',
+  'Assistant for general ledger corrections' => '',
+  'Assume Tax Consultant Data in Tax Computation?' => '',
+  'At least'                    => '',
+  'At least one Perl module that Lx-Office ERP requires for running is not installed on your system.' => '',
+  'At most'                     => '',
+  'At the moment the transaction looks like this:' => '',
+  'Attach PDF:'                 => '',
+  'Attachment'                  => '',
+  'Attachment name'             => '',
+  'Attempt to call an undefined sub named \'%s\'' => '',
+  'Audit Control'               => '',
+  'Aug'                         => '',
+  'August'                      => '',
+  'Authentification database creation' => '',
+  'Authentification tables creation' => '',
+  'Auto Send?'                  => '',
+  'Automatically created invoice for fee and interest for dunning %s' => '',
+  'Available qty'               => '',
+  'BALANCE SHEET'               => '',
+  'BIC'                         => '',
+  'BOM'                         => '',
+  'BWA'                         => '',
+  'Back'                        => '',
+  'Backup Dataset'              => '',
+  'Backup file'                 => '',
+  'Backup of dataset'           => '',
+  'Balance'                     => '',
+  'Balance Sheet'               => '',
+  'Bank'                        => '',
+  'Bank Code'                   => '',
+  'Bank Code (long)'            => '',
+  'Bank Code Number'            => '',
+  'Bank Connection Tax Office'  => '',
+  'Bank Connections'            => '',
+  'Bank accounts'               => '',
+  'Bank code'                   => '',
+  'Bank transfer amount'        => '',
+  'Bank transfer payment list for export #1' => '',
+  'Bank transfer via SEPA'      => '',
+  'Bank transfers via SEPA'     => '',
+  'Base unit'                   => '',
+  'Basic data'                  => '',
+  'Batch Printing'              => '',
+  'Bcc'                         => '',
+  'Belegnummer'                 => '',
+  'Beratername'                 => '',
+  'Beraternummer'               => '',
+  'Best Before'                 => '',
+  'Bestandskonto'               => '',
+  'Bilanz'                      => '',
+  'Billing Address'             => '',
+  'Billing/shipping address (city)' => '',
+  'Billing/shipping address (street)' => '',
+  'Billing/shipping address (zipcode)' => '',
+  'Bin'                         => '',
+  'Bin From'                    => '',
+  'Bin List'                    => '',
+  'Bin To'                      => '',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => '',
+  'Bins saved.'                 => '',
+  'Bins that have been used in the past cannot be deleted anymore. For these bins there\'s no checkbox in the &quot;Delete&quot; column.' => '',
+  'Birthday'                    => '',
+  'Bis'                         => '',
+  'Bis Konto: '                 => '',
+  'Body'                        => '',
+  'Body:'                       => '',
+  'Books are open'              => '',
+  'Books closed up to'          => '',
+  'Boolean variables: If the default value is non-empty then the checkbox will be checked by default and unchecked otherwise.' => '',
+  'Both'                        => '',
+  'Bottom'                      => '',
+  'Bought'                      => '',
+  'Buchungsdatum'               => '',
+  'Buchungsgruppe'              => '',
+  'Buchungsgruppen'             => '',
+  'Buchungskonto'               => '',
+  'Buchungsnummer'              => '',
+  'Business Number'             => '',
+  'Business Volume'             => '',
+  'Business deleted!'           => '',
+  'Business saved!'             => '',
+  'CANCELED'                    => '',
+  'CB Transaction'              => '',
+  'CR'                          => '',
+  'CRM admin'                   => '',
+  'CRM create customers, vendors and contacts' => '',
+  'CRM follow up'               => '',
+  'CRM know how'                => '',
+  'CRM notices'                 => '',
+  'CRM opportunity'             => '',
+  'CRM optional software'       => '',
+  'CRM other'                   => '',
+  'CRM search'                  => '',
+  'CRM send email'              => '',
+  'CRM services'                => '',
+  'CRM status'                  => '',
+  'CRM termin'                  => '',
+  'CRM user'                    => '',
+  'CSV export -- options'       => '',
+  'Calculate'                   => '',
+  'Can not create that quantity with current stock' => '',
+  'Cancel'                      => '',
+  'Cancel Accounts Payables Transaction' => '',
+  'Cancel Accounts Receivables Transaction' => '',
+  'Cannot create Lock!'         => '',
+  'Cannot delete account!'      => '',
+  'Cannot delete customer!'     => '',
+  'Cannot delete default account!' => '',
+  'Cannot delete delivery order!' => '',
+  'Cannot delete invoice!'      => '',
+  'Cannot delete item!'         => '',
+  'Cannot delete order!'        => '',
+  'Cannot delete quotation!'    => '',
+  'Cannot delete transaction!'  => '',
+  'Cannot delete vendor!'       => '',
+  'Cannot have a value in both Debit and Credit!' => '',
+  'Cannot post Payment!'        => '',
+  'Cannot post Receipt!'        => '',
+  'Cannot post a transaction without a value!' => '',
+  'Cannot post invoice for a closed period!' => '',
+  'Cannot post invoice!'        => '',
+  'Cannot post payment for a closed period!' => '',
+  'Cannot post payment!'        => '',
+  'Cannot post transaction for a closed period!' => '',
+  'Cannot post transaction with a debit and credit entry for the same account!' => '',
+  'Cannot post transaction!'    => '',
+  'Cannot process payment for a closed period!' => '',
+  'Cannot remove files!'        => '',
+  'Cannot save account!'        => '',
+  'Cannot save order!'          => '',
+  'Cannot save preferences!'    => '',
+  'Cannot save quotation!'      => '',
+  'Cannot storno storno invoice!' => '',
+  'Carry over shipping address' => '',
+  'Cash'                        => '',
+  'Cc'                          => '',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => '',
+  'Change representative to'    => '',
+  'Charge Number'               => '',
+  'Charge number'               => '',
+  'Chart'                       => '',
+  'Chart Type'                  => '',
+  'Chart balance'               => '',
+  'Chart of Accounts'           => '',
+  'Chart of accounts'           => '',
+  'Chartaccounts connected to this Tax:' => '',
+  'Check'                       => '',
+  'Check Details'               => '',
+  'Checks'                      => '',
+  'Choose Customer'             => '',
+  'Choose Outputformat'         => '',
+  'Choose Vendor'               => '',
+  'Choose a Tax Number'         => '',
+  'City'                        => '',
+  'Cleared Balance'             => '',
+  'Clearing Tax Received (No 71)' => '',
+  'Click on login name to edit!' => '',
+  'Close'                       => '',
+  'Close Books up to'           => '',
+  'Close SEPA exports'          => '',
+  'Close Window'                => '',
+  'Closed'                      => '',
+  'Collective Orders only work for orders from one customer!' => '',
+  'Comment'                     => '',
+  'Company'                     => '',
+  'Company Name'                => '',
+  'Compare to'                  => '',
+  'Configuration of individual TODO items' => '',
+  'Confirm'                     => '',
+  'Confirm!'                    => '',
+  'Confirmation'                => '',
+  'Contact'                     => '',
+  'Contact Person'              => '',
+  'Contact person (surname)'    => '',
+  'Contacts'                    => '',
+  'Continue'                    => '',
+  'Contra'                      => '',
+  'Copies'                      => '',
+  'Correct taxkey'              => '',
+  'Corrections'                 => '',
+  'Cost Center'                 => '',
+  'Costs'                       => '',
+  'Could not copy %s to %s. Reason: %s' => '',
+  'Could not open the file users/members.' => '',
+  'Could not open the old memberfile.' => '',
+  'Could not print dunning.'    => '',
+  'Could not rename %s to %s. Reason: %s' => '',
+  'Could not spawn ghostscript.' => '',
+  'Could not spawn the printer command.' => '',
+  'Could not update prices!'    => '',
+  'Country'                     => '',
+  'Create Assembly'             => '',
+  'Create Buchungsgruppen'      => '',
+  'Create Chart of Accounts'    => '',
+  'Create Dataset'              => '',
+  'Create Date'                 => '',
+  'Create a standard group'     => '',
+  'Create and edit RFQs'        => '',
+  'Create and edit customers and vendors' => '',
+  'Create and edit dunnings'    => '',
+  'Create and edit invoices and credit notes' => '',
+  'Create and edit parts, services, assemblies' => '',
+  'Create and edit projects'    => '',
+  'Create and edit purchase delivery orders' => '',
+  'Create and edit purchase orders' => '',
+  'Create and edit sales delivery orders' => '',
+  'Create and edit sales orders' => '',
+  'Create and edit sales quotations' => '',
+  'Create and edit vendor invoices' => '',
+  'Create bank transfer'        => '',
+  'Create bank transfer via SEPA XML' => '',
+  'Create invoice?'             => '',
+  'Create new'                  => '',
+  'Create tables'               => '',
+  'Created by'                  => '',
+  'Created for'                 => '',
+  'Created on'                  => '',
+  'Credit'                      => '',
+  'Credit (one letter abbreviation)' => '',
+  'Credit Account'              => '',
+  'Credit Limit'                => '',
+  'Credit Limit exceeded!!!'    => '',
+  'Credit Note'                 => '',
+  'Credit Note Date'            => '',
+  'Credit Note Number'          => '',
+  'Credit Starting Balance'     => '',
+  'Credit Tax'                  => '',
+  'Credit Tax Account'          => '',
+  'Credit note (one letter abbreviation)' => '',
+  'Curr'                        => '',
+  'Currencies'                  => '',
+  'Currency'                    => '',
+  'Current / Next Level'        => '',
+  'Current Earnings'            => '',
+  'Current unit'                => '',
+  'Current value:'              => '',
+  'Custom Variables'            => '',
+  'Custom variables for module' => '',
+  'Customer'                    => '',
+  'Customer Name'               => '',
+  'Customer Number'             => '',
+  'Customer Order Number'       => '',
+  'Customer deleted!'           => '',
+  'Customer details'            => '',
+  'Customer missing!'           => '',
+  'Customer not on file or locked!' => '',
+  'Customer not on file!'       => '',
+  'Customer saved!'             => '',
+  'Customer type'               => '',
+  'Customername'                => '',
+  'Customernumberinit'          => '',
+  'Customers'                   => '',
+  'Customers and vendors'       => '',
+  'Customized Report'           => '',
+  'DATEV - Export Assistent'    => '',
+  'DATEV Angaben'               => '',
+  'DATEV Export'                => '',
+  'DATEX - Export Assistent'    => '',
+  'DELETED'                     => '',
+  'DFV-Kennzeichen'             => '',
+  'DR'                          => '',
+  'DUNNING STARTED'             => '',
+  'DUNS-Nr'                     => '',
+  'Database'                    => '',
+  'Database Administration'     => '',
+  'Database Connection Test'    => '',
+  'Database Host'               => '',
+  'Database User missing!'      => '',
+  'Database backups and restorations are disabled in lx-erp.conf.' => '',
+  'Database name'               => '',
+  'Database template'           => '',
+  'Database update error:'      => '',
+  'Dataset'                     => '',
+  'Dataset missing!'            => '',
+  'Dataset name'                => '',
+  'Dataset upgrade'             => '',
+  'Date'                        => '',
+  'Date Format'                 => '',
+  'Date Paid'                   => '',
+  'Date and timestamp variables: If the default value equals \'NOW\' then the current date/current timestamp will be used. Otherwise the default value is copied as-is.' => '',
+  'Date missing!'               => '',
+  'Datevautomatik'              => '',
+  'Datum von'                   => '',
+  'Debit'                       => '',
+  'Debit (one letter abbreviation)' => '',
+  'Debit Account'               => '',
+  'Debit Starting Balance'      => '',
+  'Debit Tax'                   => '',
+  'Debit Tax Account'           => '',
+  'Debit and credit out of balance!' => '',
+  'Dec'                         => '',
+  'December'                    => '',
+  'Decimalplaces'               => '',
+  'Decrease'                    => '',
+  'Default (no language selected)' => '',
+  'Default Accounts'            => '',
+  'Default output medium'       => '',
+  'Default printer'             => '',
+  'Default template format'     => '',
+  'Default value'               => '',
+  'Defaults saved.'             => '',
+  'Delete'                      => '',
+  'Delete Account'              => '',
+  'Delete Contact'              => '',
+  'Delete Dataset'              => '',
+  'Delete Shipto'               => '',
+  'Delete delivery order'       => '',
+  'Delete drafts'               => '',
+  'Delete group'                => '',
+  'Delete transaction'          => '',
+  'Delivered'                   => '',
+  'Delivery Date'               => '',
+  'Delivery Order'              => '',
+  'Delivery Order Date'         => '',
+  'Delivery Order Date missing!' => '',
+  'Delivery Order Number'       => '',
+  'Delivery Order deleted!'     => '',
+  'Delivery Orders'             => '',
+  'Department'                  => '',
+  'Department deleted!'         => '',
+  'Department saved!'           => '',
+  'Departments'                 => '',
+  'Dependency loop detected:'   => '',
+  'Deposit'                     => '',
+  'Description'                 => '',
+  'Description (Click on Description for details)' => '',
+  'Description missing!'        => '',
+  'Description must not be empty!' => '',
+  'Destination BIC'             => '',
+  'Destination IBAN'            => '',
+  'Destination bin'             => '',
+  'Destination warehouse'       => '',
+  'Destination warehouse and bin' => '',
+  'Details (one letter abbreviation)' => '',
+  'Difference'                  => '',
+  'Dimension unit'              => '',
+  'Directory'                   => '',
+  'Discount'                    => '',
+  'Display'                     => '',
+  'Display file'                => '',
+  'Display options'             => '',
+  'Do you really want to close the following SEPA exports? No payment will be recorded for bank transfers that haven\'t been marked as executed yet.' => '',
+  'Do you really want to delete AP transaction #1?' => '',
+  'Do you really want to delete AR transaction #1?' => '',
+  'Do you really want to delete GL transaction #1?' => '',
+  'Do you really want to delete this group:' => '',
+  'Do you really want to delete this warehouse?' => '',
+  'Do you want Lx-Office to create a group for access to all functions?' => '',
+  'Do you want to <b>limit</b> your search?' => '',
+  'Do you want to carry this shipping address over to the new purchase order so that the vendor can deliver the goods directly to your customer?' => '',
+  'Do you want to store the existing onhand values into a new warehouse?' => '',
+  'Document'                    => '',
+  'Documents in the WebDAV repository' => '',
+  'Done'                        => '',
+  'Download SEPA XML export file' => '',
+  'Download the backup'         => '',
+  'Draft saved.'                => '',
+  'Drawing'                     => '',
+  'Driver'                      => '',
+  'Dropdown Limit'              => '',
+  'Due'                         => '',
+  'Due Date'                    => '',
+  'Due Date missing!'           => '',
+  'Duedate +Days'               => '',
+  'Dunning'                     => '',
+  'Dunning Amount'              => '',
+  'Dunning Date'                => '',
+  'Dunning Date from'           => '',
+  'Dunning Description'         => '',
+  'Dunning Description missing in row ' => '',
+  'Dunning Duedate'             => '',
+  'Dunning Level'               => '',
+  'Dunning Level missing in row ' => '',
+  'Dunning Process Config saved!' => '',
+  'Dunning Process started for selected invoices!' => '',
+  'Dunning number'              => '',
+  'Dunning overview'            => '',
+  'Dunnings'                    => '',
+  'During this user migration Lx-Office can create such a group for you and grant all users access to all of Lx-Office\'s functions.' => '',
+  'E-mail'                      => '',
+  'E-mail Statement to'         => '',
+  'E-mail address missing!'     => '',
+  'EAN'                         => '',
+  'EAN-Code'                    => '',
+  'EB-Wert'                     => '',
+  'EK'                          => '',
+  'ELSE'                        => '',
+  'ELSTER Export (Taxbird)'     => '',
+  'ELSTER Export (Winston)'     => '',
+  'ELSTER Export nach Winston'  => '',
+  'ELSTER Tax Number'           => '',
+  'EQUITY'                      => '',
+  'EU with VAT ID'              => '',
+  'EU without VAT ID'           => '',
+  'EUER'                        => '',
+  'EUR'                         => '',
+  'Earlier versions of Lx-Office contained bugs which might have led to wrong entries in the general ledger.' => '',
+  'Edit'                        => '',
+  'Edit Access Rights'          => '',
+  'Edit Access Rights for Follow-Ups' => '',
+  'Edit Account'                => '',
+  'Edit Accounting Group'       => '',
+  'Edit Accounts Payables Transaction' => '',
+  'Edit Accounts Receivables Transaction' => '',
+  'Edit Assembly'               => '',
+  'Edit Bins'                   => '',
+  'Edit Buchungsgruppe'         => '',
+  'Edit Business'               => '',
+  'Edit Credit Note'            => '',
+  'Edit Customer'               => '',
+  'Edit Department'             => '',
+  'Edit Dunning'                => '',
+  'Edit Dunning Process Config' => '',
+  'Edit Follow-Up'              => '',
+  'Edit Follow-Up for #1'       => '',
+  'Edit General Ledger Transaction' => '',
+  'Edit Group'                  => '',
+  'Edit Language'               => '',
+  'Edit Lead'                   => '',
+  'Edit Part'                   => '',
+  'Edit Payment Terms'          => '',
+  'Edit Preferences for #1'     => '',
+  'Edit Price Factor'           => '',
+  'Edit Pricegroup'             => '',
+  'Edit Printer'                => '',
+  'Edit Project'                => '',
+  'Edit Purchase Delivery Order' => '',
+  'Edit Purchase Order'         => '',
+  'Edit Quotation'              => '',
+  'Edit Request for Quotation'  => '',
+  'Edit Sales Delivery Order'   => '',
+  'Edit Sales Invoice'          => '',
+  'Edit Sales Order'            => '',
+  'Edit Service'                => '',
+  'Edit Storno Credit Note'     => '',
+  'Edit Storno Invoice'         => '',
+  'Edit User'                   => '',
+  'Edit Vendor'                 => '',
+  'Edit Vendor Invoice'         => '',
+  'Edit Warehouse'              => '',
+  'Edit and delete a group'     => '',
+  'Edit bank account'           => '',
+  'Edit custom variable'        => '',
+  'Edit file'                   => '',
+  'Edit greetings'              => '',
+  'Edit group '                 => '',
+  'Edit group membership'       => '',
+  'Edit groups'                 => '',
+  'Edit note'                   => '',
+  'Edit rights'                 => '',
+  'Edit templates'              => '',
+  'Edit the Delivery Order'     => '',
+  'Edit the membership of all users in all groups:' => '',
+  'Edit the purchase_order'     => '',
+  'Edit the request_quotation'  => '',
+  'Edit the sales_order'        => '',
+  'Edit the sales_quotation'    => '',
+  'Edit the stylesheet'         => '',
+  'Edit units'                  => '',
+  'Editable'                    => '',
+  'Either there are no open invoices, or you have already initiated bank transfers with the open amounts for those that are still open.' => '',
+  'Element disabled'            => '',
+  'Employee'                    => '',
+  'Empty transaction!'          => '',
+  'Enter a description for this new draft.' => '',
+  'Enter longdescription'       => '',
+  'Enter the requested execution date or leave empty for the quickest possible execution:' => '',
+  'Enter up to 3 letters separated by a colon (i.e CAD:USD:EUR) for your native and foreign currencies' => '',
+  'Equity'                      => '',
+  'Error'                       => '',
+  'Error in database control file \'%s\': %s' => '',
+  'Error in position #1: You must either assign no stock at all or the full quantity of #2 #3.' => '',
+  'Error in position #1: You must either assign no transfer at all or the full quantity of #2 #3.' => '',
+  'Error in row #1: The quantity you entered is bigger than the stocked quantity.' => '',
+  'Error message from the database driver:' => '',
+  'Error!'                      => '',
+  'Ertrag'                      => '',
+  'Ertrag prozentual'           => '',
+  'Escape character'            => '',
+  'Exact'                       => '',
+  'Excel'                       => '',
+  'Exch'                        => '',
+  'Exchangerate'                => '',
+  'Exchangerate Difference'     => '',
+  'Exchangerate for payment missing!' => '',
+  'Exchangerate missing!'       => '',
+  'Executed'                    => '',
+  'Execution date'              => '',
+  'Execution date from'         => '',
+  'Execution date to'           => '',
+  'Existing Buchungsgruppen'    => '',
+  'Existing Datasets'           => '',
+  'Existing pending follow-ups for this item' => '',
+  'Expected Tax'                => '',
+  'Expense'                     => '',
+  'Expense Account'             => '',
+  'Expense accno'               => '',
+  'Expense/Asset'               => '',
+  'Expenses EU with UStId'      => '',
+  'Expenses EU without UStId'   => '',
+  'Expired licenses'            => '',
+  'Expiring in x month(s)'      => '',
+  'Export Buchungsdaten'        => '',
+  'Export Stammdaten'           => '',
+  'Export as CSV'               => '',
+  'Export as PDF'               => '',
+  'Export date'                 => '',
+  'Export date from'            => '',
+  'Export date to'              => '',
+  'Extended'                    => '',
+  'Extension Of Time'           => '',
+  'Factor'                      => '',
+  'Factor missing!'             => '',
+  'Falsches Datumsformat!'      => '',
+  'Favorites'                   => '',
+  'Fax'                         => '',
+  'Feb'                         => '',
+  'February'                    => '',
+  'Fee'                         => '',
+  'File'                        => '',
+  'File name'                   => '',
+  'Files created by Lx-Office\'s &quot;Backup Dataset&quot; function are such files.' => '',
+  'Filter'                      => '',
+  'Finish'                      => '',
+  'Fix transaction'             => '',
+  'Fix transactions'            => '',
+  'Folgekonto'                  => '',
+  'Follow-Up'                   => '',
+  'Follow-Up Date'              => '',
+  'Follow-Up On'                => '',
+  'Follow-Up done'              => '',
+  'Follow-Up for'               => '',
+  'Follow-Up for user'          => '',
+  'Follow-Up saved.'            => '',
+  'Follow-Ups'                  => '',
+  'Follow-up for'               => '',
+  'Font'                        => '',
+  'Font size'                   => '',
+  'For AP transactions it will replace the sales taxkeys with input taxkeys with the same tax rate.' => '',
+  'For AR transactions it will replace the input taxkeys with sales taxkeys with the same tax rate.' => '',
+  'For each unit there\'s either no or exactly one base unit. If you chose a base unit then you also have to chose a factor. That way the new unit will be defined as a multiple of the base unit. The base unit must be the &quot;smaller&quot; one. A factor may not be less than 1. Therefore you may define &quot;kg&quot; with the base unit &quot;g&quot; and a factor of &quot;1&quot;, but not the other way round.' => '',
+  'Foreign Exchange Gain'       => '',
+  'Foreign Exchange Loss'       => '',
+  'Foreign Expenses'            => '',
+  'Foreign Revenues'            => '',
+  'Form details (second row)'   => '',
+  'Formula'                     => '',
+  'Free report period'          => '',
+  'Free-form text'              => '',
+  'Fristsetzung'                => '',
+  'From'                        => '',
+  'From Date'                   => '',
+  'Full Access'                 => '',
+  'Full access to all functions' => '',
+  'Fwd'                         => '',
+  'GL Transaction'              => '',
+  'Gegenkonto'                  => '',
+  'Gender'                      => '',
+  'General Ledger'              => '',
+  'General Ledger Corrections'  => '',
+  'General Ledger Transaction'  => '',
+  'General ledger and cash'     => '',
+  'General ledger corrections'  => '',
+  'Generic Tax Report'          => '',
+  'Given Name'                  => '',
+  'Go one step back'            => '',
+  'Go one step forward'         => '',
+  'Greeting'                    => '',
+  'Greetings'                   => '',
+  'Group'                       => '',
+  'Group Invoices'              => '',
+  'Group Items'                 => '',
+  'Group deleted!'              => '',
+  'Group membership'            => '',
+  'Group missing!'              => '',
+  'Group saved!'                => '',
+  'Groups'                      => '',
+  'HTML'                        => '',
+  'HTML Templates'              => '',
+  'Hardcopy'                    => '',
+  'Has serial number'           => '',
+  'Header'                      => '',
+  'Heading'                     => '',
+  'Help'                        => '',
+  'Here\'s an example command line:' => '',
+  'Hide by default'             => '',
+  'History'                     => '',
+  'History Search'              => '',
+  'History Search Engine'       => '',
+  'Homepage'                    => '',
+  'Host'                        => '',
+  'However, you can create a new part which will then be selected.' => '',
+  'I'                           => '',
+  'IBAN'                        => '',
+  'ID'                          => '',
+  'ID-Nummer'                   => '',
+  'II'                          => '',
+  'III'                         => '',
+  'IV'                          => '',
+  'If the automatic creation of invoices for fees and interest is switched on for a dunning level then the following accounts will be used for the invoice.' => '',
+  'If the database user listed above does not have the right to create a database then enter the name and password of the superuser below:' => '',
+  'If you chose to let Lx-Office do the migration then Lx-Office will also remove the old member file after creating a backup copy of it in the directory &quot;#1&quot;.' => '',
+  'If you enter values for the part number and / or part description then only those bins containing parts whose part number or part description match your input will be shown.' => '',
+  'If you see this message, you most likely just setup your LX-Office and haven\'t added any entry types. If this is the case, the option is accessible for administrators in the System menu.' => '',
+  'If you want to change any of these parameters then press the &quot;Back&quot; button, edit the file &quot;config/authentication.pl&quot; and login into the admin module again.' => '',
+  'If you want to delete such a dataset you have to edit the user(s) that are using the dataset in question and have them use another dataset.' => '',
+  'If you want to set up the authentication database yourself then log in to the administration panel. Lx-Office will then create the database and tables for you.' => '',
+  'If you yourself want to upgrade the installation then please read the file &quot;doc/UPGRADE&quot; and follow the steps outlined in this file.' => '',
+  'Image'                       => '',
+  'Import CSV'                  => '',
+  'In Lx-Office 2.4.0 the administrator has to enter a list of units in the administrative section.' => '',
+  'In order to do that hit the button "Delete transaction".' => '',
+  'In the latter case the tables needed by Lx-Office will be created in that database.' => '',
+  'In-line'                     => '',
+  'Inactive'                    => '',
+  'Include Exchangerate Difference' => '',
+  'Include column headings'     => '',
+  'Include empty bins'          => '',
+  'Include in Report'           => '',
+  'Include in drop-down menus'  => '',
+  'Includeable in reports'      => '',
+  'Income Statement'            => '',
+  'Income accno'                => '',
+  'Incoming Payments'           => '',
+  'Incoming invoice number'     => '',
+  'Incorrect Password!'         => '',
+  'Incorrect username or password!' => '',
+  'Increase'                    => '',
+  'Individual Items'            => '',
+  'Information'                 => '',
+  'Interest'                    => '',
+  'Interest Rate'               => '',
+  'Internal Notes'              => '',
+  'International'               => '',
+  'Internet'                    => '',
+  'Introduction of Buchungsgruppen' => '',
+  'Introduction of units'       => '',
+  'Inv. Duedate'                => '',
+  'Invalid'                     => '',
+  'Invalid follow-up ID.'       => '',
+  'Invalid quantity.'           => '',
+  'Invdate'                     => '',
+  'Invdate from'                => '',
+  'Inventory'                   => '',
+  '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!' => '',
+  'Invno.'                      => '',
+  'Invnumber'                   => '',
+  'Invnumber missing!'          => '',
+  'Invoice'                     => '',
+  'Invoice (one letter abbreviation)' => '',
+  'Invoice Date'                => '',
+  'Invoice Date missing!'       => '',
+  'Invoice Duedate'             => '',
+  'Invoice Number'              => '',
+  'Invoice Number missing!'     => '',
+  'Invoice deleted!'            => '',
+  'Invoice for fees'            => '',
+  'Invoice has already been storno\'d!' => '',
+  'Invoice number'              => '',
+  'Invoice with Storno (abbreviation)' => '',
+  'Invoices'                    => '',
+  'Is this a summary account to record' => '',
+  '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 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!'               => '',
+  'Item not on file!'           => '',
+  'Jahresverkehrszahlen neu'    => '',
+  'Jan'                         => '',
+  'January'                     => '',
+  'Journal'                     => '',
+  'Jul'                         => '',
+  'July'                        => '',
+  'Jump to'                     => '',
+  'Jun'                         => '',
+  'June'                        => '',
+  'KNE-Export erfolgreich!'     => '',
+  'KNr. beim Kunden'            => '',
+  'Keine Suchergebnisse gefunden!' => '',
+  'Konten'                      => '',
+  'Kontonummernerweiterung (KNE)' => '',
+  'L'                           => '',
+  'LIABILITIES'                 => '',
+  'LP'                          => '',
+  'LaTeX Templates'             => '',
+  'Landscape'                   => '',
+  'Language'                    => '',
+  'Language Values'             => '',
+  'Language deleted!'           => '',
+  'Language missing!'           => '',
+  'Language saved!'             => '',
+  'Languages'                   => '',
+  'Last Article Number'         => '',
+  'Last Cost'                   => '',
+  'Last Credit Note Number'     => '',
+  'Last Customer Number'        => '',
+  'Last Invoice Number'         => '',
+  'Last Purchase Delivery Order Number' => '',
+  'Last Purchase Order Number'  => '',
+  'Last RFQ Number'             => '',
+  'Last Sales Delivery Order Number' => '',
+  'Last Sales Order Number'     => '',
+  'Last Sales Quotation Number' => '',
+  'Last Service Number'         => '',
+  'Last Transaction'            => '',
+  'Last Vendor Number'          => '',
+  'Lead'                        => '',
+  'Leave host and port field empty unless you want to make a remote connection.' => '',
+  'Left'                        => '',
+  'Liability'                   => '',
+  'License'                     => '',
+  'License key'                 => '',
+  'Licensed to'                 => '',
+  'Licenses'                    => '',
+  'Limit part selection'        => '',
+  'Line Total'                  => '',
+  'Line endings'                => '',
+  'List'                        => '',
+  'List Accounting Groups'      => '',
+  'List Accounts'               => '',
+  'List Businesses'             => '',
+  'List Departments'            => '',
+  'List Groups'                 => '',
+  'List Languages'              => '',
+  'List Lead'                   => '',
+  'List Payment Terms'          => '',
+  'List Price'                  => '',
+  'List Price Factors'          => '',
+  'List Pricegroups'            => '',
+  'List Printer'                => '',
+  'List Tax'                    => '',
+  'List Transactions'           => '',
+  'List Warehouses'             => '',
+  'List bank accounts'          => '',
+  'List export'                 => '',
+  'List of bank accounts'       => '',
+  'List of bank transfers'      => '',
+  'List of custom variables'    => '',
+  'List open SEPA exports'      => '',
+  'Load draft'                  => '',
+  'Local Tax Office Preferences' => '',
+  'Lock System'                 => '',
+  'Lockfile created!'           => '',
+  'Lockfile removed!'           => '',
+  'Login'                       => '',
+  'Login Name'                  => '',
+  'Login name missing!'         => '',
+  'Logout'                      => '',
+  'Logout now'                  => '',
+  'Long Dates'                  => '',
+  'Long Description'            => '',
+  'Lx-Office'                   => '',
+  'Lx-Office 2.4.0 introduces two new concepts: tax zones and Buchungsgruppen.' => '',
+  'Lx-Office can fix these problems automatically.' => '',
+  'Lx-Office has been switched to group-based access restrictions.' => '',
+  'Lx-Office has found one or more problems in the general ledger.' => '',
+  'Lx-Office is about to update the database <b>#1</b>.' => '',
+  'Lx-Office is now able to manage warehouses instead of just tracking the amount of goods in your system.' => '',
+  'Lx-Office website'           => '',
+  'MAILED'                      => '',
+  'MSG_BROWSER_DOES_NOT_SUPPORT_IFRAMES' => '',
+  'Main Preferences'            => '',
+  'Make'                        => '',
+  'Manage license keys'         => '',
+  'Mandantennummer'             => '',
+  'Mandatory Departments'       => '',
+  'Mar'                         => '',
+  'March'                       => '',
+  'Margins'                     => '',
+  'Mark as closed'              => '',
+  'Mark as paid?'               => '',
+  'Mark closed'                 => '',
+  'Marked as paid'              => '',
+  'Marked entries printed!'     => '',
+  'Master Data'                 => '',
+  'Max. Dunning Level'          => '',
+  'May'                         => '',
+  'May '                        => '',
+  'May set the BCC field when sending emails' => '',
+  'Medium Number'               => '',
+  'Memo'                        => '',
+  'Menu'                        => '',
+  'Message'                     => '',
+  'Method'                      => '',
+  'Microfiche'                  => '',
+  'Minimum Amount'              => '',
+  'Miscellaneous'               => '',
+  'Missing \'description\' field.' => '',
+  'Missing \'tag\' field.'      => '',
+  'Missing Method!'             => '',
+  'Missing Tax Authoritys Preferences' => '',
+  'Missing amount'              => '',
+  'Missing parameter #1 in call to sub #2.' => '',
+  'Missing parameter (at least one of #1) in call to sub #2.' => '',
+  'Missing taxkeys in invoices with taxes.' => '',
+  'Mitarbeiter'                 => '',
+  'Mobile1'                     => '',
+  'Mobile2'                     => '',
+  'Model'                       => '',
+  'Module'                      => '',
+  'Module home page'            => '',
+  'Module name'                 => '',
+  'Monat'                       => '',
+  'Monthly'                     => '',
+  'More than one #1 found matching, please be more specific.' => '',
+  'More than one control file with the tag \'%s\' exist.' => '',
+  'Multi mode not supported.'   => '',
+  'Multibyte Encoding'          => '',
+  'MwSt. inkl.'                 => '',
+  'Name'                        => '',
+  'Name missing!'               => '',
+  'National'                    => '',
+  'National Expenses'           => '',
+  'National Revenues'           => '',
+  'Netto Terms'                 => '',
+  'New Buchungsgruppe #1'       => '',
+  'New Templates'               => '',
+  'New Win/Tab'                 => '',
+  'New assembly'                => '',
+  'New bank account'            => '',
+  'New contact'                 => '',
+  'New customer'                => '',
+  'New invoice'                 => '',
+  'New part'                    => '',
+  'New sales order'             => '',
+  'New service'                 => '',
+  'New unit'                    => '',
+  'New vendor'                  => '',
+  'Next Dunning Level'          => '',
+  'No'                          => '',
+  'No %s was found matching the search parameters.' => '',
+  'No Company Address given'    => '',
+  'No Company Name given'       => '',
+  'No Customer was found matching the search parameters.' => '',
+  'No Database Drivers available!' => '',
+  'No Dataset selected!'        => '',
+  'No Vendor was found matching the search parameters.' => '',
+  'No action defined.'          => '',
+  'No backup file has been uploaded.' => '',
+  'No bank information has been entered in this vendor\'s master data entry. You cannot create bank transfers unless you enter bank information.' => '',
+  'No bins have been added to this warehouse yet.' => '',
+  'No customer has been selected yet.' => '',
+  'No data was found.'          => '',
+  'No databases have been found on this server.' => '',
+  'No datasets have been selected.' => '',
+  'No dunnings have been selected for printing.' => '',
+  'No entries were found which had no unit assigned to them.' => '',
+  'No group has been selected, or the group does not exist anymore.' => '',
+  'No groups have been added yet.' => '',
+  'No licenses were found that match the search criteria.' => '',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => '',
+  'No part was found matching the search parameters.' => '',
+  'No prices will be updated because no prices have been entered.' => '',
+  'No problems were recognized.' => '',
+  'No transfers were executed in this export.' => '',
+  'No unknown units where found.' => '',
+  'No user has been selected.'  => '',
+  'No valid number entered for pricegroup "#1".' => '',
+  'No vendor has been selected yet.' => '',
+  'No warehouse has been created yet or the quantity of the bins is not configured yet.' => '',
+  'No.'                         => '',
+  'Non-taxable Purchases'       => '',
+  'Non-taxable Sales'           => '',
+  'None'                        => '',
+  'Not Discountable'            => '',
+  'Not delivered'               => '',
+  'Not done yet'                => '',
+  'Not obsolete'                => '',
+  'Note'                        => '',
+  'Note: Taxkeys must have a "valid from" date, and will not be in effect otherwise.' => '',
+  'Notes'                       => '',
+  'Nothing has been selected for removal.' => '',
+  'Nothing has been selected for transfer.' => '',
+  'Nothing selected!'           => '',
+  'Nothing to delete!'          => '',
+  'Nov'                         => '',
+  'November'                    => '',
+  'Now the user must select a single Buchungsgruppe for each part instead of three distinct accounts.' => '',
+  'Number'                      => '',
+  'Number Format'               => '',
+  'Number missing in Row'       => '',
+  'Number of bins'              => '',
+  'Number of copies'            => '',
+  'Number of entries changed: #1' => '',
+  'Number of new bins'          => '',
+  'Number pages'                => '',
+  'Number variables: \'PRECISION=n\' forces numbers to be shown with exactly n decimal places.' => '',
+  'OB Transaction'              => '',
+  'OBE-Export erfolgreich!'     => '',
+  'Obsolete'                    => '',
+  'Oct'                         => '',
+  'October'                     => '',
+  'Off'                         => '',
+  'Old (on the side)'           => '',
+  'On'                          => '',
+  'On Hand'                     => '',
+  'On Order'                    => '',
+  'One or more Perl modules missing' => '',
+  'Only due follow-ups'         => '',
+  'Open'                        => '',
+  'Open Amount'                 => '',
+  'Open a further Lx-Office Window or Tab' => '',
+  'Open amount'                 => '',
+  'OpenDocument/OASIS'          => '',
+  'Openings'                    => '',
+  'Optional comment'            => '',
+  'Options'                     => '',
+  'Order'                       => '',
+  'Order Date'                  => '',
+  'Order Date missing!'         => '',
+  'Order Number'                => '',
+  'Order Number missing!'       => '',
+  'Order deleted!'              => '',
+  'Ordered'                     => '',
+  'Orientation'                 => '',
+  'Orphaned'                    => '',
+  'Other users\' follow-ups'    => '',
+  'Other values are ignored.'   => '',
+  'Others'                      => '',
+  'Otherwise all users will only have access to their own settings.' => '',
+  'Otherwise the variable is only available for printing.' => '',
+  'Out of balance transaction!' => '',
+  'Out of balance!'             => '',
+  'Output Number Format'        => '',
+  'Outputformat'                => '',
+  'Overdue sales quotations and requests for quotations' => '',
+  'Own Product'                 => '',
+  'PAYMENT POSTED'              => '',
+  'PDF'                         => '',
+  'PDF (OpenDocument/OASIS)'    => '',
+  'PDF export -- options'       => '',
+  'POSTED'                      => '',
+  'POSTED AS NEW'               => '',
+  'PRINTED'                     => '',
+  'Packing List'                => '',
+  'Packing List Date missing!'  => '',
+  'Packing List Number missing!' => '',
+  'Packing Lists'               => '',
+  'Page #1/#2'                  => '',
+  'Paid'                        => '',
+  'Part'                        => '',
+  'Part Description'            => '',
+  'Part Description missing!'   => '',
+  'Part Number'                 => '',
+  'Part Number missing!'        => '',
+  'Part description'            => '',
+  'Partnumber must not be set to empty!' => '',
+  'Partnumber not unique!'      => '',
+  'Parts'                       => '',
+  'Parts Inventory'             => '',
+  'Parts must have an entry type.' => '',
+  'Parts, services and assemblies' => '',
+  'Password'                    => '',
+  'Payables'                    => '',
+  'Payment'                     => '',
+  'Payment Reminder'            => '',
+  'Payment Terms'               => '',
+  'Payment Terms missing in row ' => '',
+  'Payment Terms saved!'        => '',
+  'Payment date missing!'       => '',
+  'Payment list as PDF'         => '',
+  'Payment posted!'             => '',
+  'Payment terms deleted!'      => '',
+  'Payments'                    => '',
+  'Period'                      => '',
+  'Period:'                     => '',
+  'Personal settings'           => '',
+  'Pg Database Administration'  => '',
+  'Phone'                       => '',
+  'Phone1'                      => '',
+  'Phone2'                      => '',
+  'Pick List'                   => '',
+  'Please Check the bank information for each vendor:' => '',
+  'Please ask your administrator to create warehouses and bins.' => '',
+  'Please enter a license key.' => '',
+  'Please enter a number of licenses.' => '',
+  'Please enter the login for the new user.' => '',
+  'Please enter the name of the database that will be used as the template for the new database:' => '',
+  'Please enter the name of the dataset you want to restore the backup in.' => '',
+  'Please enter the taxnumber in the administration menu user preferences' => '',
+  'Please enter values'         => '',
+  'Please insert object dimensions below.' => '',
+  'Please insert your language values below' => '',
+  'Please insert your longdescription below' => '',
+  'Please install the below listed modules or ask your system administrator to.' => '',
+  'Please re-run the analysis for broken general ledger entries by clicking this button:' => '',
+  'Please read the file'        => '',
+  'Please select a customer from the list below.' => '',
+  'Please select a part from the list below.' => '',
+  'Please select a vendor from the list below.' => '',
+  'Please select the chart of accounts this installation is using from the list below.' => '',
+  'Please select the database you want to backup' => '',
+  'Please select the source bank account for the transfers:' => '',
+  'Please seletct the dataset you want to delete:' => '',
+  'Please specify a description for the warehouse designated for these goods.' => '',
+  'Plural'                      => '',
+  'Port'                        => '',
+  'Portrait'                    => '',
+  'Post'                        => '',
+  'Post Payment'                => '',
+  'Post payments'               => '',
+  'Postscript'                  => '',
+  'Posustva_coa'                => '',
+  'Preferences'                 => '',
+  'Preferences saved!'          => '',
+  'Prefix for the new bins\' names' => '',
+  'Preis'                       => '',
+  'Preisgruppe'                 => '',
+  'Preisklasse'                 => '',
+  'Prepare bank transfer via SEPA XML' => '',
+  'Prepayment'                  => '',
+  'Preview'                     => '',
+  'Previous transdate text'     => '',
+  'Previous transnumber text'   => '',
+  'Price'                       => '',
+  'Price Factor'                => '',
+  'Price Factors'               => '',
+  'Price factor deleted!'       => '',
+  'Price factor saved!'         => '',
+  'Pricegroup'                  => '',
+  'Pricegroup deleted!'         => '',
+  'Pricegroup missing!'         => '',
+  'Pricegroup saved!'           => '',
+  'Pricegroups'                 => '',
+  'Print'                       => '',
+  'Print and Post'              => '',
+  'Print dunnings'              => '',
+  'Print list'                  => '',
+  'Print options'               => '',
+  'Printer'                     => '',
+  'Printer Command'             => '',
+  'Printer Command missing!'    => '',
+  'Printer Description'         => '',
+  'Printer deleted!'            => '',
+  'Printer saved!'              => '',
+  'Printing ... '               => '',
+  'Prior to Lx-Office v2.4.0 the user could enter arbitrary strings as units for parts, services and in invoices, sales quotations etc.' => '',
+  'Prior to Lx-Office v2.4.0 the user had to chose the accounts for each part and service.' => '',
+  'Private E-mail'              => '',
+  'Private Phone'               => '',
+  'Problem'                     => '',
+  'Produce Assembly'            => '',
+  'Productivity'                => '',
+  'Profit Center'               => '',
+  'Proforma Invoice'            => '',
+  'Program'                     => '',
+  'Project'                     => '',
+  'Project Number'              => '',
+  'Project Number missing!'     => '',
+  'Project Numbers'             => '',
+  'Project Transactions'        => '',
+  'Project deleted!'            => '',
+  'Project not on file!'        => '',
+  'Project saved!'              => '',
+  'Projects'                    => '',
+  'Projecttransactions'         => '',
+  'Prozentual/Absolut'          => '',
+  'Purchase Invoice'            => '',
+  'Purchase Order'              => '',
+  'Purchase Orders'             => '',
+  'Purchase Price'              => '',
+  'Purchase Prices'             => '',
+  'Purchase delivery order'     => '',
+  'Purchase invoices'           => '',
+  'Purpose'                     => '',
+  'Qty'                         => '',
+  'Qty according to delivery order' => '',
+  'Qty in stock'                => '',
+  'Quantity'                    => '',
+  'Quantity missing.'           => '',
+  'Quartal'                     => '',
+  'Quarter'                     => '',
+  'Quarterly'                   => '',
+  'Queue'                       => '',
+  'Quotation'                   => '',
+  'Quotation Date'              => '',
+  'Quotation Date missing!'     => '',
+  'Quotation Number'            => '',
+  'Quotation Number missing!'   => '',
+  'Quotation deleted!'          => '',
+  'Quotations'                  => '',
+  'Quote chararacter'           => '',
+  'Quoted'                      => '',
+  'RFQ'                         => '',
+  'RFQ Number'                  => '',
+  'RFQs'                        => '',
+  'ROP'                         => '',
+  'Ranges of numbers'           => '',
+  'Ranges of numbers and default accounts' => '',
+  'Re-run analysis'             => '',
+  'Receipt'                     => '',
+  'Receipt posted!'             => '',
+  'Receipt, payment, reconciliation' => '',
+  'Receipts'                    => '',
+  'Receivables'                 => '',
+  'Rechnungsnummer'             => '',
+  'Reconciliation'              => '',
+  'Record in'                   => '',
+  'Recorded Tax'                => '',
+  'Recorded taxkey'             => '',
+  'Reference'                   => '',
+  'Reference missing!'          => '',
+  'Release From Stock'          => '',
+  'Remaining'                   => '',
+  'Removal'                     => '',
+  'Removal from Warehouse'      => '',
+  'Removal from warehouse'      => '',
+  'Removal qty'                 => '',
+  'Remove'                      => '',
+  'Remove Draft'                => '',
+  'Remove draft when posting'   => '',
+  'Remove from group'           => '',
+  'Removed spoolfiles!'         => '',
+  'Removing marked entries from queue ...' => '',
+  'Rename the group'            => '',
+  'Report Positions'            => '',
+  'Report about warehouse contents' => '',
+  'Report about warehouse transactions' => '',
+  'Report and misc. Preferences' => '',
+  'Report for'                  => '',
+  'Reports'                     => '',
+  'Representative'              => '',
+  'Reqdate'                     => '',
+  'Request for Quotation'       => '',
+  'Request for Quotations'      => '',
+  'Request quotation'           => '',
+  'Requested execution date'    => '',
+  'Requested execution date from' => '',
+  'Requested execution date to' => '',
+  'Required by'                 => '',
+  'Restore Dataset'             => '',
+  'Revenue'                     => '',
+  'Revenue Account'             => '',
+  'Revenues EU with UStId'      => '',
+  'Revenues EU without UStId'   => '',
+  'Right'                       => '',
+  'SAVED'                       => '',
+  'SAVED FOR DUNNING'           => '',
+  'SCREENED'                    => '',
+  'SEPA XML download'           => '',
+  'SEPA exports:'               => '',
+  'Saldo Credit'                => '',
+  'Saldo Debit'                 => '',
+  'Saldo neu'                   => '',
+  'Saldo per'                   => '',
+  'Sale Prices'                 => '',
+  'Sales Invoice'               => '',
+  'Sales Invoices'              => '',
+  'Sales Order'                 => '',
+  'Sales Orders'                => '',
+  'Sales and purchase invoices with inventory transactions with taxkeys' => '',
+  'Sales delivery order'        => '',
+  'Sales invoice number'        => '',
+  'Sales invoices'              => '',
+  'Sales quotation'             => '',
+  'Salesman'                    => '',
+  'Salesperson'                 => '',
+  'Same as the quote character' => '',
+  'Sat. Fax'                    => '',
+  'Sat. Phone'                  => '',
+  'Satz %'                      => '',
+  'Save'                        => '',
+  'Save Draft'                  => '',
+  'Save account first to insert taxkeys' => '',
+  'Save and AP Transaction'     => '',
+  'Save and AR Transaction'     => '',
+  'Save and Close'              => '',
+  'Save and Invoice'            => '',
+  'Save and Order'              => '',
+  'Save and Quotation'          => '',
+  'Save and RFQ'                => '',
+  'Save and close'              => '',
+  'Save as new'                 => '',
+  'Save draft'                  => '',
+  'Saving the file \'%s\' failed. OS error message: %s' => '',
+  'Screen'                      => '',
+  'Searchable'                  => '',
+  'Select'                      => '',
+  'Select a Customer'           => '',
+  'Select a customer'           => '',
+  'Select a part'               => '',
+  'Select a part or assembly'   => '',
+  'Select a period'             => '',
+  'Select a vendor'             => '',
+  'Select all'                  => '',
+  'Select federal state...'     => '',
+  'Select from one of the items below' => '',
+  'Select from one of the names below' => '',
+  'Select from one of the projects below' => '',
+  'Select postscript or PDF!'   => '',
+  'Select tax office...'        => '',
+  'Select the chart of accounts in use' => '',
+  'Select the checkboxes that match users to the groups they should belong to.' => '',
+  'Select type of removal'      => '',
+  'Select type of transfer'     => '',
+  'Selection'                   => '',
+  'Selection fields: The option field must contain the available options for the selection. Options are separated by \'##\', for example \'Early##Normal##Late\'.' => '',
+  'Sell Price'                  => '',
+  'Send the backup via Email'   => '',
+  'Sep'                         => '',
+  'Separator chararacter'       => '',
+  'September'                   => '',
+  'Serial No.'                  => '',
+  'Serial Number'               => '',
+  'Service'                     => '',
+  'Service Items'               => '',
+  'Service Number missing!'     => '',
+  'Service unit'                => '',
+  'Services'                    => '',
+  'Set Language Values'         => '',
+  'Set eMail text'              => '',
+  'Setup Menu'                  => '',
+  'Setup Templates'             => '',
+  'Ship to'                     => '',
+  'Ship via'                    => '',
+  'Shipping Address'            => '',
+  'Shipping Point'              => '',
+  'Shipto'                      => '',
+  'Shopartikel'                 => '',
+  'Short'                       => '',
+  'Show'                        => '',
+  'Show Salesman'               => '',
+  'Show TODO list'              => '',
+  'Show by default'             => '',
+  'Show custom variable search inputs' => '',
+  'Show details'                => '',
+  'Show follow ups...'          => '',
+  'Show old dunnings'           => '',
+  'Show overdue sales quotations and requests for quotations...' => '',
+  'Show your TODO list after loggin in' => '',
+  'Signature'                   => '',
+  'Since bin is not enforced in the parts data, please specify a bin where goods without a specified bin will be put.' => '',
+  'Skip'                        => '',
+  'Skonto'                      => '',
+  'Skonto Terms'                => '',
+  'Sold'                        => '',
+  'Solution'                    => '',
+  'Source'                      => '',
+  'Source BIC'                  => '',
+  'Source IBAN'                 => '',
+  'Source bank account'         => '',
+  'Source bin'                  => '',
+  'Spoolfile'                   => '',
+  'Start Dunning Process'       => '',
+  'Start analysis'              => '',
+  'Start the correction assistant' => '',
+  'Startdate_coa'               => '',
+  'Starting Balance'            => '',
+  'Statement'                   => '',
+  'Statement Balance'           => '',
+  'Statement sent to'           => '',
+  'Statements sent to printer!' => '',
+  'Step 1 of 3: Parts'          => '',
+  'Step 2'                      => '',
+  'Step 2 of 3: Services'       => '',
+  'Step 3 of 3: Assemblies'     => '',
+  'Step 3 of 3: Default units'  => '',
+  'Steuersatz'                  => '',
+  'Stock'                       => '',
+  'Stock value'                 => '',
+  'Storno'                      => '',
+  'Storno (one letter abbreviation)' => '',
+  'Storno Invoice'              => '',
+  'Storno Packing List'         => '',
+  'Street'                      => '',
+  'Stylesheet'                  => '',
+  'Subject'                     => '',
+  'Subject:'                    => '',
+  'Subtotal'                    => '',
+  'Such entries cannot be exported into the DATEV format and have to be fixed as well.' => '',
+  'Sum Credit'                  => '',
+  'Sum Debit'                   => '',
+  'Sum for'                     => '',
+  'Sum per'                     => '',
+  'Summen- und Saldenliste'     => '',
+  'Superuser name'              => '',
+  'Supplies'                    => '',
+  'Switch Menu on / off'        => '',
+  'System'                      => '',
+  'TODO list'                   => '',
+  'TODO list options'           => '',
+  'TOP100'                      => '',
+  'TOTAL'                       => '',
+  'Target bank account'         => '',
+  'Tax'                         => '',
+  'Tax Consultant'              => '',
+  'Tax Included'                => '',
+  'Tax Number'                  => '',
+  'Tax Number / SSN'            => '',
+  'Tax Office'                  => '',
+  'Tax Office Preferences'      => '',
+  'Tax Percent is a number between 0 and 100' => '',
+  'Tax Period'                  => '',
+  'Tax Position'                => '',
+  'Tax collected'               => '',
+  'Tax deleted!'                => '',
+  'Tax number'                  => '',
+  'Tax paid'                    => '',
+  'Tax saved!'                  => '',
+  'Tax-O-Matic'                 => '',
+  'Tax-o-matic Account'         => '',
+  'Taxaccount_coa'              => '',
+  'Taxation'                    => '',
+  'Taxdescription  missing!'    => '',
+  'Taxdescription_coa'          => '',
+  'Taxes'                       => '',
+  'Taxkey'                      => '',
+  'Taxkey  missing!'            => '',
+  'Taxkey_coa'                  => '',
+  'Taxkeys and Taxreport Preferences' => '',
+  'Taxlink_coa'                 => '',
+  'Taxnumber'                   => '',
+  'Taxrate missing!'            => '',
+  'Tel'                         => '',
+  'Tel.'                        => '',
+  'Telephone'                   => '',
+  'Template'                    => '',
+  'Template Code'               => '',
+  'Template Code missing!'      => '',
+  'Template database'           => '',
+  'Templates'                   => '',
+  'Terms missing in row '       => '',
+  'Test connection'             => '',
+  'Text field'                  => '',
+  'Text field variables: \'WIDTH=w HEIGHT=h\' sets the width and height of the text field. They default to 30 and 5 respectively.' => '',
+  'Text variables: \'MAXLENGTH=n\' sets the maximum entry length to \'n\'.' => '',
+  'Text, text field and number variables: The default value will be used as-is.' => '',
+  'That export does not exist.' => '',
+  'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => '',
+  'The AP transaction #1 has been deleted.' => '',
+  'The AR transaction #1 has been deleted.' => '',
+  'The GL transaction #1 has been deleted.' => '',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => '',
+  'The SEPA export has been created.' => '',
+  'The access rights have been saved.' => '',
+  'The account 3804 already exists, the update will be skipped.' => '',
+  'The account 3804 will not be added automatically.' => '',
+  'The assembly has been created.' => '',
+  'The assistant could not find anything wrong with #1. Maybe the problem has been solved in the meantime.' => '',
+  'The authentication configuration file &quot;config/authentication.pl&quot; does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => '',
+  'The authentication database is not reachable at the moment. Either it hasn\'t been set up yet or the database server might be down. Please contact your administrator.' => '',
+  'The available options depend on the varibale type:' => '',
+  'The backup you upload here has to be a file created with &quot;pg_dump -o -Ft&quot;.' => '',
+  'The bank information must not be empty.' => '',
+  'The base unit does not exist or it is about to be deleted in row %d.' => '',
+  'The base unit does not exist.' => '',
+  'The base unit relations must not contain loops (e.g. by saying that unit A\'s base unit is B, B\'s base unit is C and C\'s base unit is A) in row %d.' => '',
+  'The columns &quot;Dunning Duedate&quot;, &quot;Total Fees&quot; and &quot;Interest&quot; show data for the previous dunning created for this invoice.' => '',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => '',
+  'The config file "config/authentication.pl" was not found.' => '',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => '',
+  'The connection to the authentication database failed:' => '',
+  'The connection to the database could not be established.' => '',
+  'The connection to the template database failed:' => '',
+  'The connection was established successfully.' => '',
+  'The creation of the authentication database failed:' => '',
+  'The custom variable has been deleted.' => '',
+  'The custom variable has been saved.' => '',
+  'The database #1 has been successfully deleted.' => '',
+  'The database for user management and authentication does not exist. You can create let Lx-Office create it with the following parameters:' => '',
+  'The database update/creation did not succeed. The file #1 contained the following error:' => '',
+  'The database upgrade for the introduction of Buchungsgruppen is now complete.' => '',
+  'The database upgrade for the introduction of units is now complete.' => '',
+  'The dataset #1 has been successfully created.' => '',
+  'The dataset backup has been sent via email to #1.' => '',
+  'The dataset has to exist before a restoration can be started.' => '',
+  'The dataset name is missing.' => '',
+  'The default value depends on the variable type:' => '',
+  'The delivery order has not been marked as delivered. The warehouse contents have not changed.' => '',
+  'The description is missing.' => '',
+  'The description is shown on the form. Chose something short and descriptive.' => '',
+  'The directory "%s" could not be created:\n%s' => '',
+  'The directory %s does not exist.' => '',
+  'The dunning process started' => '',
+  'The dunnings have been printed.' => '',
+  'The email address is missing.' => '',
+  'The factor is missing in row %d.' => '',
+  'The factor is missing.'      => '',
+  'The first reason is that Lx-Office contained a bug which resulted in the wrong taxkeys being recorded for transactions in which two entries are posted for the same chart with different taxkeys.' => '',
+  'The follow-up date is missing.' => '',
+  'The following Buchungsgruppen have already been created:' => '',
+  'The following Datasets need to be updated' => '',
+  'The following drafts have been saved and can be loaded.' => '',
+  'The following transaction contains wrong taxes:' => '',
+  'The following transaction contains wrong taxkeys:' => '',
+  'The following units are unknown.' => '',
+  'The following units exist already:' => '',
+  'The following users have been migrated into the authentication database:' => '',
+  'The following warnings occured during an upgrade to the document templates:' => '',
+  'The formula needs the following syntax:<br>For regular article:<br>Variablename= Variable Unit;<br>Variablename2= Variable2 Unit2;<br>...<br>###<br>Variable + ( Variable2 / Variable )<br><b>Please be beware of the spaces in the formula</b><br>' => '',
+  'The greetings have been saved.' => '',
+  'The group has been added.'   => '',
+  'The group has been deleted.' => '',
+  'The group has been saved.'   => '',
+  'The group memberships have been saved.' => '',
+  'The group name is missing.'  => '',
+  'The licensing module has been deactivated in lx-erp.conf.' => '',
+  'The list has been printed.'  => '',
+  'The login is missing.'       => '',
+  'The name in row %d has already been used before.' => '',
+  'The name is missing in row %d.' => '',
+  'The name is missing.'        => '',
+  'The name must only consist of letters, numbers and underscores and start with a letter.' => '',
+  'The old file containing the user information is still present (&quot;#1&quot;). Do you want to migrate these users into the database? If not then you will not be able to log in with any of the users present in the old file.' => '',
+  'The option field is empty.'  => '',
+  'The parts for this delivery order have already been transferred in.' => '',
+  'The parts for this delivery order have already been transferred out.' => '',
+  'The parts have been removed.' => '',
+  'The parts have been stocked.' => '',
+  'The parts have been transferred.' => '',
+  'The payments have been posted.' => '',
+  'The pg_dump process could not be started.' => '',
+  'The pg_restore process could not be started.' => '',
+  'The preferred one is to install packages provided by your operating system distribution (e.g. Debian or RPM packages).' => '',
+  'The program\'s exit code was #1 (&quot;0&quot; usually means that everything went OK).' => '',
+  'The project has been added.' => '',
+  'The project has been saved.' => '',
+  'The restoration process has started. Here\'s the output of the &quot;pg_restore&quot; command:' => '',
+  'The restoration process is complete. Please review &quot;pg_restore&quot;\'s output to find out if the restoration was successful.' => '',
+  'The second reason is that Lx-Office allowed the user to enter the tax amount manually regardless of the taxkey used.' => '',
+  'The second way is to use Perl\'s CPAN module and let it download and install the module for you.' => '',
+  'The selected  PostgreSQL installation uses UTF-8 as its encoding. Therefore you have to configure Lx-Office to use UTF-8 as well.' => '',
+  'The selected bank account does not exist anymore.' => '',
+  'The selected bin does not exist.' => '',
+  'The selected exports have been closed.' => '',
+  'The selected warehouse does not exist.' => '',
+  'The selected warehouse is empty.' => '',
+  'The session is invalid or has expired.' => '',
+  'The source warehouse does not contain any bins.' => '',
+  'The subject is missing.'     => '',
+  'The tables for user management and authentication do not exist. They will be created in the next step in the following database:' => '',
+  'The tabulator character'     => '',
+  'The third way is to download the module from the above mentioned URL and to install the module manually following the installations instructions contained in the source archive.' => '',
+  'The transaction is shown below in its current state.' => '',
+  'The unit has been saved.'    => '',
+  'The unit in row %d has been deleted in the meantime.' => '',
+  'The unit in row %d has been used in the meantime and cannot be changed anymore.' => '',
+  'The units have been saved.'  => '',
+  'The user has been added to this group.' => '',
+  'The user has been removed from this group.' => '',
+  'The user is a member in the following group(s):' => '',
+  'The user migration process is complete.' => '',
+  'The variable name must only consist of letters, numbers and underscores. It must begin with a letter. Example: send_christmas_present' => '',
+  'The warehouse could not be deleted because it has already been used.' => '',
+  'The warehouse does not contain any bins.' => '',
+  'The warehouse or the bin is missing.' => '',
+  'The wrong taxkeys for AP and AR transactions have been fixed.' => '',
+  'The wrong taxkeys for inventory transactions for sales and purchase invoices have been fixed.' => '',
+  'The wrong taxkeys have been fixed.' => '',
+  'There are #1 more open invoices for this customer with other currencies.' => '',
+  'There are #1 more open invoices from this vendor with other currencies.' => '',
+  'There are #1 unfinished follow-ups of which #2 are due.' => '',
+  'There are bookings to the account 3803 after 01.01.2007. If you didn\'t change this account manually to 19% the bookings are probably incorrect.' => '',
+  'There are four tax zones.'   => '',
+  'There are no items in stock.' => '',
+  'There are no items on your TODO list at the moment.' => '',
+  'There are still entries in the database for which no unit has been assigned.' => '',
+  'There are usually three ways to install Perl modules.' => '',
+  'There is at least one sales or purchase invoice for which Lx-Office recorded an inventory transaction with taxkeys even though no tax was recorded.' => '',
+  'There is at least one transaction for which the user has chosen a logically wrong taxkey.' => '',
+  'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, #5, for the transfer of #6.' => '',
+  'There is not enough available of \'#1\' at warehouse \'#2\', bin \'#3\', #4, for the transfer of #5.' => '',
+  'There is not enough left of \'#1\' in bin \'#2\' for the removal of #3.' => '',
+  'There is nothing to do in this step.' => '',
+  '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 Lx-Office can convert prices when the user switches from one unit to another.' => '',
+  'These will only be effective if the account is NOT a summary account AND there exists at least one taxkey. Setting the account as a summary account will erase these settings.' => '',
+  'These wrong entries cannot be fixed automatically.' => '',
+  'This corresponds to Lx-Office\'s behavior prior to version 2.4.4.' => '',
+  'This could have happened for two reasons:' => '',
+  'This customer number is already in use.' => '',
+  'This group will be called &quot;Full Access&quot;.' => '',
+  'This installation uses an unknown chart of accounts (&quot;#1&quot;). This database upgrade cannot create standard buchungsgruppen automatically.' => '',
+  'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!' => '',
+  '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 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.' => '',
+  'This upgrade script tries to map all existing units in the database to the newly created units.' => '',
+  'This vendor number is already in use.' => '',
+  'Time period for the analysis:' => '',
+  'Timestamp'                   => '',
+  'Title'                       => '',
+  'To'                          => '',
+  'To (email)'                  => '',
+  'To (time)'                   => '',
+  'To Date'                     => '',
+  'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.' => '',
+  'Top'                         => '',
+  'Top (CSS)'                   => '',
+  'Top (CSS) new'               => '',
+  'Top (Javascript)'            => '',
+  'Top (XUL; only for Mozilla Firefox)' => '',
+  'Top 100'                     => '',
+  'Top 100 hinzufuegen'         => '',
+  'Top Level'                   => '',
+  'Total'                       => '',
+  'Total Fees'                  => '',
+  'Total stock value'           => '',
+  'Totals'                      => '',
+  'Trade Discount'              => '',
+  'Trans Id'                    => '',
+  'Trans Type'                  => '',
+  'Transaction'                 => '',
+  'Transaction %d cancelled.'   => '',
+  'Transaction Date missing!'   => '',
+  'Transaction ID missing.'     => '',
+  'Transaction deleted!'        => '',
+  'Transaction description'     => '',
+  'Transaction has already been cancelled!' => '',
+  'Transaction has been split on both the credit and the debit side' => '',
+  'Transaction posted!'         => '',
+  'Transactions, AR transactions, AP transactions' => '',
+  'Transdate'                   => '',
+  'Transfer'                    => '',
+  'Transfer Quantity'           => '',
+  'Transfer To Stock'           => '',
+  'Transfer from warehouse'     => '',
+  'Transfer in'                 => '',
+  'Transfer out'                => '',
+  'Transfer qty'                => '',
+  'Translation (%s)'            => '',
+  'Trial Balance'               => '',
+  'Trial balance between %s and %s' => '',
+  'Trying to call a sub without a name' => '',
+  'Type'                        => '',
+  'Type of Business'            => '',
+  'Type of Customer'            => '',
+  'Type of Vendor'              => '',
+  'USTVA'                       => '',
+  'USTVA 2004'                  => '',
+  'USTVA 2005'                  => '',
+  'USTVA 2006'                  => '',
+  'USTVA 2007'                  => '',
+  'USTVA-Hint: Method'          => '',
+  'USTVA-Hint: Tax Authoritys'  => '',
+  'USt-IdNr.'                   => '',
+  'USt-Konto'                   => '',
+  'UStVA'                       => '',
+  'UStVA (PDF-Dokument)'        => '',
+  'UStVa'                       => '',
+  'UStVa Einstellungen'         => '',
+  'Unbalanced Ledger'           => '',
+  'Unchecked custom variables will not appear in orders and invoices.' => '',
+  'Unfinished follow-ups'       => '',
+  'Unit'                        => '',
+  'Unit missing.'               => '',
+  'Unit of measure'             => '',
+  'Units marked for deletion will be deleted upon saving.' => '',
+  'Units that have already been used (e.g. for parts and services or in invoices or warehouse transactions) cannot be changed.' => '',
+  'Unknown Category'            => '',
+  'Unknown Link'                => '',
+  'Unknown chart of accounts'   => '',
+  'Unknown dependency \'%s\'.'  => '',
+  'Unknown problem type.'       => '',
+  'Unlock System'               => '',
+  'Until'                       => '',
+  'Update'                      => '',
+  'Update Dataset'              => '',
+  'Update Prices'               => '',
+  'Update SKR04: new tax account 3804 (19%)' => '',
+  'Update complete'             => '',
+  'Update prices'               => '',
+  'Update?'                     => '',
+  'Updated'                     => '',
+  'Use As Template'             => '',
+  'Use Templates'               => '',
+  'User'                        => '',
+  'User Config'                 => '',
+  'User data migration'         => '',
+  'User deleted!'               => '',
+  'User migration complete'     => '',
+  'User name'                   => '',
+  'User saved!'                 => '',
+  'Username'                    => '',
+  'Users in<br>this group'      => '',
+  'Users not in this group'     => '',
+  'Ust-IDNr'                    => '',
+  'Valid from'                  => '',
+  'Valid until'                 => '',
+  'Value'                       => '',
+  'Variable'                    => '',
+  'Vendor'                      => '',
+  'Vendor Invoice'              => '',
+  'Vendor Invoices'             => '',
+  'Vendor Name'                 => '',
+  'Vendor Number'               => '',
+  'Vendor Order Number'         => '',
+  'Vendor deleted!'             => '',
+  'Vendor details'              => '',
+  'Vendor missing!'             => '',
+  'Vendor not on file or locked!' => '',
+  'Vendor not on file!'         => '',
+  'Vendor saved!'               => '',
+  'Vendor type'                 => '',
+  'Vendors'                     => '',
+  'Verrechnungseinheit'         => '',
+  'Version'                     => '',
+  'View License'                => '',
+  'View SEPA export'            => '',
+  'View warehouse content'      => '',
+  'View/edit all employees sales documents' => '',
+  'Von Konto: '                 => '',
+  'WHJournal'                   => '',
+  'Warehouse'                   => '',
+  'Warehouse From'              => '',
+  'Warehouse Migration'         => '',
+  'Warehouse To'                => '',
+  'Warehouse content'           => '',
+  'Warehouse deleted.'          => '',
+  'Warehouse management'        => '',
+  'Warehouse saved.'            => '',
+  'Warehouses'                  => '',
+  'Warnings during template upgrade' => '',
+  'WebDAV link'                 => '',
+  'Weight'                      => '',
+  'Weight unit'                 => '',
+  'What <b>term</b> you are looking for?' => '',
+  'What type of item is this?'  => '',
+  'With Extension Of Time'      => '',
+  'Workflow Delivery Order'     => '',
+  'Workflow purchase_order'     => '',
+  'Workflow request_quotation'  => '',
+  'Workflow sales_order'        => '',
+  'Workflow sales_quotation'    => '',
+  'Wrong Period'                => '',
+  'Wrong date format!'          => '',
+  'Wrong tax keys recorded'     => '',
+  'Wrong taxes recorded'        => '',
+  'YYYY'                        => '',
+  'Year'                        => '',
+  'Year End'                    => '',
+  'Yearly'                      => '',
+  'Yearly taxreport not yet implemented' => '',
+  'Yes'                         => '',
+  'Yes, included by default'    => '',
+  'Yes/No (Checkbox)'           => '',
+  'You are logged out!'         => '',
+  'You can also create new units now.' => '',
+  'You can also delete this transaction and re-enter it manually.' => '',
+  'You can correct this transaction by chosing the correct taxkeys from the drop down boxes and hitting the button "Fix transaction" afterwards.' => '',
+  'You can create a missing dataset by going back and chosing &quot;Create Dataset&quot;.' => '',
+  'You can create warehouses and bins via the menu "System -> Warehouses".' => '',
+  'You can declare different translations for singular and plural for each unit (e.g. &quot;day&quot; and &quot;days).' => '',
+  'You can either create a new database or chose an existing database.' => '',
+  'You can only delete datasets that are not in use.' => '',
+  'You can use the following strings in the long description and all translations. They will be replaced by their actual values by Lx-Office before they\'re output.' => '',
+  'You cannot adjust the price for pricegroup "#1" by a negative percentage.' => '',
+  'You cannot continue before all required modules are installed.' => '',
+  'You cannot continue until all unknown units have been mapped to known ones.' => '',
+  'You cannot create an invoice for delivery orders for different customers.' => '',
+  'You cannot create an invoice for delivery orders from different vendors.' => '',
+  'You did not enter a name!'   => '',
+  'You do not have the permissions to access this function.' => '',
+  'You have entered or selected the following shipping address for this customer:' => '',
+  'You have not added bank accounts yet.' => '',
+  'You have not selected any delivery order.' => '',
+  'You have not selected any export.' => '',
+  'You have not selected any item.' => '',
+  'You have selected none of the invoices.' => '',
+  'You have to chose a dimension unit and a service unit which will then be assigned to those entries.' => '',
+  'You have to chose which unit to save for each of them.' => '',
+  'You have to create at least one group, grant it access to Lx-Office\'s functions and assign users to it.' => '',
+  'You have to create new Buchungsgruppen for all the combinations of inventory, income and expense accounts that have been used already.' => '',
+  'You have to enter a company name in your user preferences (see the "Program" menu, "Preferences").' => '',
+  'You have to fill in at least an account number, the bank code, the IBAN and the BIC.' => '',
+  'You have to specify a department.' => '',
+  'You have to specify an execution date for each antry.' => '',
+  'You must chose a user.'      => '',
+  'You should create a backup of the database before proceeding because the backup might not be reversible.' => '',
+  'You will now be forwarded to the administration panel.' => '',
+  'You\'re not editing a file.' => '',
+  'You\'ve already chosen the following limitations:' => '',
+  'Your PostgreSQL installationen uses UTF-8 as its encoding. Therefore you have to configure Lx-Office to use UTF-8 as well.' => '',
+  'Your TODO list'              => '',
+  'Your browser does not currently support Javascript.' => '',
+  'Your download does not exist anymore. Please re-run the DATEV export assistant.' => '',
+  'Zeitpunkt'                   => '',
+  'Zeitraum'                    => '',
+  'Zero amount posting!'        => '',
+  'Zip, City'                   => '',
+  'Zipcode'                     => '',
+  'Zusatz'                      => '',
+  '[email]'                     => '',
+  'account_description'         => '',
+  'accrual'                     => '',
+  'all entries'                 => '',
+  'ap_aging_list'               => '',
+  'ar_aging_list'               => '',
+  'as at'                       => '',
+  'assembly_list'               => '',
+  'back'                        => '',
+  'bank_transfer_payment_list_#1' => '',
+  'bankaccounts'                => '',
+  'banktransfers'               => '',
+  'bestbefore #1'               => '',
+  'bin_list'                    => '',
+  'bis'                         => '',
+  'button'                      => '',
+  'cash'                        => '',
+  'chargenumber #1'             => '',
+  'chart_of_accounts'           => '',
+  'choice'                      => '',
+  'choice part'                 => '',
+  'click here to edit cvars'    => '',
+  'close'                       => '',
+  'closed'                      => '',
+  'config/authentication.pl: Key "DB_config" is missing.' => '',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => '',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => '',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => '',
+  'continue'                    => '',
+  'correction'                  => '',
+  'cp_greeting to cp_gender migration' => '',
+  'customer'                    => '',
+  'customer_list'               => '',
+  'debug'                       => '',
+  'delete'                      => '',
+  'deliverydate'                => '',
+  'direct debit'                => '',
+  'disposed'                    => '',
+  'done'                        => '',
+  'down'                        => '',
+  'dunning_list'                => '',
+  'eMail Send?'                 => '',
+  'eMail?'                      => '',
+  'ea'                          => '',
+  'emailed to'                  => '',
+  'executed'                    => '',
+  'female'                      => '',
+  'follow_up_list'              => '',
+  'for'                         => '',
+  'for Period'                  => '',
+  'found'                       => '',
+  'from (time)'                 => '',
+  'general_ledger_list'         => '',
+  'history'                     => '',
+  'history search engine'       => '',
+  'invoice'                     => '',
+  'invoice_list'                => '',
+  'lead deleted!'               => '',
+  'lead saved!'                 => '',
+  'list'                        => '',
+  'list_of_payments'            => '',
+  'list_of_receipts'            => '',
+  'list_of_transactions'        => '',
+  'logout'                      => '',
+  'male'                        => '',
+  'mark as paid'                => '',
+  'missing'                     => '',
+  'month'                       => '',
+  'new Window'                  => '',
+  'no'                          => '',
+  'no bestbefore'               => '',
+  'no chargenumber'             => '',
+  'none (pricegroup)'           => '',
+  'not executed'                => '',
+  'not transferred in yet'      => '',
+  'not transferred out yet'     => '',
+  'not yet executed'            => '',
+  'number'                      => '',
+  'oe.pl::search called with unknown type' => '',
+  'open'                        => '',
+  'order'                       => '',
+  'our vendor number at customer' => '',
+  'packing_list'                => '',
+  'part_list'                   => '',
+  'pick_list'                   => '',
+  'plural first char'           => '',
+  'pos_bilanz'                  => '',
+  'pos_bwa'                     => '',
+  'pos_eur'                     => '',
+  'pos_ustva'                   => '',
+  'posted!'                     => '',
+  'print'                       => '',
+  'proforma'                    => '',
+  'project_list'                => '',
+  'purchase_delivery_order_list' => '',
+  'purchase_order'              => '',
+  'purchase_order_list'         => '',
+  'quarter'                     => '',
+  'quotation_list'              => '',
+  'release_material'            => '',
+  'report_generator_dispatch_to is not defined.' => '',
+  'report_generator_nextsub is not defined.' => '',
+  'request_quotation'           => '',
+  'reset'                       => '',
+  'return_material'             => '',
+  'rfq_list'                    => '',
+  'sales tax identification number' => '',
+  'sales_delivery_order_list'   => '',
+  'sales_order'                 => '',
+  'sales_order_list'            => '',
+  'sales_quotation'             => '',
+  'saved'                       => '',
+  'saved!'                      => '',
+  'sent'                        => '',
+  'sent to printer'             => '',
+  'service_list'                => '',
+  'shipped'                     => '',
+  'singular first char'         => '',
+  'soldtotal'                   => '',
+  'stock'                       => '',
+  'submit'                      => '',
+  'tax_chartaccno'              => '',
+  'tax_percent'                 => '',
+  'tax_rate'                    => '',
+  'tax_taxdescription'          => '',
+  'tax_taxkey'                  => '',
+  'taxnumber'                   => '',
+  'to (date)'                   => '',
+  'to (time)'                   => '',
+  'transfer'                    => '',
+  'transferred in'              => '',
+  'transferred out'             => '',
+  'trial_balance'               => '',
+  'up'                          => '',
+  'use program settings'        => '',
+  'used'                        => '',
+  'valid from'                  => '',
+  'vendor'                      => '',
+  'vendor_invoice_list'         => '',
+  'vendor_list'                 => '',
+  'warehouse_journal_list'      => '',
+  'warehouse_report_list'       => '',
+  'wrongformat'                 => '',
+  'yes'                         => '',
+};
+
+1;
index 7040b29..113344d 100644 (file)
@@ -981,6 +981,7 @@ Stone Environmental Inc. (www.stone-env.com).
 The text_block() method is a slightly modified copy of the one from
 Rick Measham's PDF::API2 tutorial at
 http://pdfapi2.sourceforge.net/cgi-bin/view/Main/YourFirstDocument
+update: The tutorial is no longer available. Please visit http://pdfapi2.sourceforge.net .
 
 by Desislav Kamenov
 
index 6a9d000..c374d22 100755 (executable)
@@ -12,9 +12,7 @@ BEGIN {
 use Config::Std;
 use Data::Dumper;
 use Devel::REPL 1.002001;
-eval {
-require Term::ReadLine::Perl::Bind;     # use sane key binding for rxvt users
-};
+use Term::ReadLine::Perl::Bind;     # use sane key binding for rxvt users
 
 read_config 'config/console.conf' => my %config;# if -f 'config/console.conf';
 
@@ -36,6 +34,12 @@ $repl->run;
 
 package Devel::REPL;
 
+use CGI qw( -no_xhtml);
+use SL::Auth;
+use SL::Form;
+use SL::Locale;
+use SL::LXDebug;
+use Data::Dumper;
 
 # this is a cleaned up version of am.pl
 # it lacks redirection, some html setup and most of the authentication process.
@@ -51,25 +55,18 @@ sub lxinit {
   { no warnings 'once';
     $::userspath  = "users";
     $::templates  = "templates";
-    $::memberfile = "users/members";
     $::sendmail   = "| /usr/sbin/sendmail -t";
   }
 
-  use SL::LXDebug;
   $::lxdebug = LXDebug->new;
 
-  use CGI qw( -no_xhtml);
-  use SL::Auth;
-  use SL::Form;
-  use SL::Locale;
-  use Data::Dumper;
-
   eval { require "config/lx-erp.conf"; };
   eval { require "config/lx-erp-local.conf"; } if -f "config/lx-erp-local.conf";
 
-  $::cgi  = CGI->new qw();
-  $::form = Form->new;
-  $::auth = SL::Auth->new;
+  $::locale = Locale->new($::language);
+  $::cgi    = CGI->new qw();
+  $::form   = Form->new;
+  $::auth   = SL::Auth->new;
 
   die 'cannot reach auth db'               unless $::auth->session_tables_present;
 
index c7a7cdc..0e6a6c5 100755 (executable)
@@ -1,5 +1,7 @@
 #!/usr/bin/perl -w
 
+use strict;
+
 BEGIN {
   unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
   push    @INC, "modules/fallback"; # Only use our own versions of modules if there's no system version.
@@ -9,32 +11,55 @@ use SL::InstallationCheck;
 
 $| = 1;
 
-foreach my $module (@SL::InstallationCheck::required_modules) {
-  print("Looking for $module->{name}...");
-  if (!SL::InstallationCheck::module_available($module->{"name"})) {
-    print(" NOT found\n" .
-          "  The module '$module->{name}' is not available on your system.\n" .
-          "  Please install it with the CPAN shell, e.g.\n" .
-          "    perl -MCPAN -e \"install $module->{name}\"\n" .
-          "  or download it from this URL and install it manually:\n" .
-          "    $module->{url}\n\n");
-  } else {
-    print(" ok\n");
-  }
+check($_, 0) for @SL::InstallationCheck::required_modules;
+check($_, 1) for @SL::InstallationCheck::optional_modules;
+
+sub check {
+  my ($module, $optional) = @_;
+
+  print "Looking for $module->{fullname}...";
+  my $res = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
+  print $res ? '' : " NOT", " ok\n";
+
+  return if $res;
+
+  my $needed_text = $optional
+    ? 'It is OPTIONAL for Lx-Office but recommended for improved functionality.'
+    : 'It is NEEDED by Lx-Office and must be installed.';
+
+  my @source_texts = source_texts($module);
+  local $" = $/;
+  print <<EOL;
++-----------------------------------------------------------------------------+
+  $module->{fullname} could not be loaded.
+
+  This module is either too old or not available on your system.
+  $needed_text
+
+  Here are some ideas how to get it:
+
+@source_texts
++-----------------------------------------------------------------------------+
+EOL
 }
 
-foreach my $module (@SL::InstallationCheck::optional_modules) {
-  print("Looking for $module->{name} (optional)...");
-  if (!SL::InstallationCheck::module_available($module->{"name"})) {
-    print(" NOT found\n" .
-          "  The module '$module->{name}' is not available on your system.\n" .
-          "  While it is not strictly needed it provides extra functionality\n" .
-          "  and should be installed.\n" .
-          "  You can install it with the CPAN shell, e.g.\n" .
-          "    perl -MCPAN -e \"install $module->{name}\"\n" .
-          "  or download it from this URL and install it manually:\n" .
-          "    $module->{url}\n\n");
-  } else {
-    print(" ok\n");
-  }
+sub source_texts {
+  my ($module) = @_;
+  my @texts;
+  push @texts, <<EOL;
+  - You can get it from CPAN:
+      perl -MCPAN -e "install $module->{name}"
+EOL
+  push @texts, <<EOL if $module->{url};
+  - You can download it from this URL and install it manually:
+      $module->{url}
+EOL
+  push @texts, <<EOL if $module->{debian};
+  - On Debian, Ubuntu and other distros you can install it with apt-get:
+      sudo apt-get install $module->{debian}
+    Note these may be out of date as well if you system is old.
+EOL
+ # TODO: SuSE and Fedora packaging. Windows packaging.
+
+  return @texts;
 }
diff --git a/scripts/rose_auto_create_model.pl b/scripts/rose_auto_create_model.pl
new file mode 100755 (executable)
index 0000000..b1a7040
--- /dev/null
@@ -0,0 +1,154 @@
+#!/usr/bin/perl
+
+use strict;
+
+BEGIN {
+  unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
+  push    @INC, "modules/fallback"; # Only use our own versions of modules if there's no system version.
+}
+
+use CGI qw( -no_xhtml);
+use Data::Dumper;
+use English qw( -no_match_vars );
+use List::MoreUtils qw(any);
+
+use SL::Auth;
+use SL::DBUtils;
+use SL::DB;
+use SL::Form;
+use SL::Locale;
+use SL::LXDebug;
+use SL::DB::Helpers::ALL;
+use SL::DB::Helpers::Mappings;
+
+our $form;
+our $cgi;
+our $auth;
+
+our $script =  __FILE__;
+$script     =~ s:.*/::;
+
+$OUTPUT_AUTOFLUSH       = 1;
+$Data::Dumper::Sortkeys = 1;
+
+our $meta_path = "SL/DB/MetaSetup";
+
+sub setup {
+  if (@ARGV < 2) {
+    print "Usage: $PROGRAM_NAME login table1[=package1] [table2[=package2] ...]\n";
+    print "   or  $PROGRAM_NAME login [--all|-a] [--sugar|-s]\n";
+    exit 1;
+  }
+
+  my $login     = shift @ARGV;
+
+  $::userspath  = "users";
+  $::templates  = "templates";
+  $::sendmail   = "| /usr/sbin/sendmail -t";
+
+  $::lxdebug    = LXDebug->new();
+
+  require "config/lx-erp.conf";
+  require "config/lx-erp-local.conf" if -f "config/lx-erp-local.conf";
+
+  # locale messages
+  $::locale       = Locale->new("de");
+  $::form         = new Form;
+  $::cgi          = new CGI('');
+  $::auth         = SL::Auth->new();
+
+  $::user         = User->new($login);
+
+  %::myconfig     = $auth->read_user($login);
+  $form->{script} = 'rose_meta_data.pl';
+  $form->{login}  = $login;
+
+  map { $form->{$_} = $::myconfig{$_} } qw(stylesheet charset);
+
+  mkdir $meta_path unless -d $meta_path;
+}
+
+sub process_table {
+  my @spec       =  split(/=/, shift, 2);
+  my $table      =  $spec[0];
+  my $package    =  ucfirst($spec[1] || $spec[0]);
+  $package       =~ s/_+(.)/uc($1)/ge;
+  my $meta_file  =  "${meta_path}/${package}.pm";
+  my $file       =  "SL/DB/${package}.pm";
+
+  my $definition =  eval <<CODE;
+    package SL::DB::AUTO::$package;
+    use SL::DB::Object;
+    use base qw(SL::DB::Object);
+
+    __PACKAGE__->meta->table('$table');
+    __PACKAGE__->meta->auto_initialize;
+
+    __PACKAGE__->meta->perl_class_definition(indent => 2); # , braces => 'bsd'
+CODE
+
+  if ($EVAL_ERROR) {
+    print STDERR "Error in execution for table '$table': $EVAL_ERROR";
+    return;
+  }
+
+  $definition =~ s/::AUTO::/::/g;
+
+  my $file_exists = -f $meta_file;
+
+  open(OUT, ">$meta_file") || die;
+  print OUT <<CODE;
+# This file has been auto-generated. Do not modify it; it will be overwritten
+# by $::script automatically.
+$definition;
+CODE
+  close OUT;
+
+  print "File '$meta_file' " . ($file_exists ? 'updated' : 'created') . " for table '$table'\n";
+
+  if (! -f $file) {
+    open(OUT, ">$file") || die;
+    print OUT <<CODE;
+# This file has been auto-generated only because it didn't exist.
+# Feel free to modify it at will; it will not be overwritten automatically.
+
+package SL::DB::${package};
+
+use strict;
+
+use SL::DB::MetaSetup::${package};
+
+# Creates get_all, get_all_count, get_all_iterator, delete_all and update_all.
+__PACKAGE__->meta->make_manager_class;
+
+1;
+CODE
+    close OUT;
+
+    print "File '$file' created as well.\n";
+  }
+}
+
+setup();
+
+my %blacklist     = SL::DB::Helpers::Mappings->get_blacklist;
+my %package_names = SL::DB::Helpers::Mappings->get_package_names;
+
+my @tables = ();
+if (($ARGV[0] eq '--all') || ($ARGV[0] eq '-a') || ($ARGV[0] eq '--sugar') || ($ARGV[0] eq '-s')) {
+  my ($type, $prefix) = ($ARGV[0] eq '--sugar') || ($ARGV[0] eq '-s') ? ('SUGAR', 'sugar_') : ('LXOFFICE', '');
+  my $db              = SL::DB::create(undef, $type);
+  @tables             = map  { $package_names{$type}->{$_} ? "${_}=" . $package_names{$type}->{$_} : $prefix ? "${_}=${prefix}${_}" : $_ }
+                        grep { my $table = $_; !any { $_ eq $table } @{ $blacklist{$type} } }
+                        $db->list_tables;
+
+} else {
+  @tables = @ARGV;
+}
+
+foreach my $table (@tables) {
+  # add default model name unless model name is given or no defaults exists
+  $table .= '=' . $package_names{LXOFFICE}->{lc $table} if $table !~ /=/ && $package_names{LXOFFICE}->{lc $table};
+
+  process_table($table);
+}
diff --git a/sql/Pg-upgrade2/schema_nomalization_1.sql b/sql/Pg-upgrade2/schema_nomalization_1.sql
new file mode 100644 (file)
index 0000000..2a54118
--- /dev/null
@@ -0,0 +1,38 @@
+-- @tag: schema_normalization_1
+-- @description: Datenbankschema Normalisierungen
+-- @depends: release_2_6_1
+
+-- assembly-id
+CREATE SEQUENCE assembly_assembly_id_seq;
+ALTER TABLE assembly ADD COLUMN assembly_id INTEGER;
+UPDATE assembly SET assembly_id = nextval('assembly_assembly_id_seq');
+ALTER TABLE assembly ADD PRIMARY KEY( assembly_id );
+ALTER TABLE assembly ALTER assembly_id SET DEFAULT nextval('assembly_assembly_id_seq');
+
+-- shipto_primary_key
+ALTER TABLE shipto ALTER COLUMN shipto_id SET NOT NULL;
+ALTER TABLE shipto ADD PRIMARY KEY (shipto_id);
+
+-- oe_vc_foreign_keys
+--ALTER TABLE oe ADD FOREIGN KEY (customer_id) REFERENCES customer (id);
+--ALTER TABLE oe ADD FOREIGN KEY (vendor_id)   REFERENCES vendor   (id);
+
+-- orderitems_primary_key
+ALTER TABLE orderitems ADD PRIMARY KEY (id);
+
+-- part_unit_not_null
+UPDATE parts SET unit = 'Stck' WHERE unit IS NULL;
+ALTER TABLE parts ALTER COLUMN unit SET NOT NULL;
+
+-- makemodel_id_column
+ALTER TABLE makemodel ADD COLUMN tmp integer;
+UPDATE makemodel SET tmp = make::integer WHERE COALESCE(make, '') <> '';
+ALTER TABLE makemodel DROP COLUMN make;
+ALTER TABLE makemodel RENAME COLUMN tmp TO make;
+
+CREATE SEQUENCE makemodel_id_seq;
+ALTER TABLE makemodel ADD COLUMN id integer;
+ALTER TABLE makemodel ALTER COLUMN id SET DEFAULT nextval('makemodel_id_seq');
+UPDATE makemodel SET id = nextval('makemodel_id_seq');
+ALTER TABLE makemodel ALTER COLUMN id SET NOT NULL;
+ALTER TABLE makemodel ADD PRIMARY KEY (id);
diff --git a/sql/Pg-upgrade2/schema_normalization_2.sql b/sql/Pg-upgrade2/schema_normalization_2.sql
new file mode 100644 (file)
index 0000000..87ab636
--- /dev/null
@@ -0,0 +1,29 @@
+-- @tag: schema_normalization_2
+-- @description: Datenbankschema Normalisierungen Teil 2
+-- @depends: schema_normalization_1
+
+ALTER TABLE acc_trans ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE audittrail ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE customertax ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE datev ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE defaults ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE department ADD PRIMARY KEY (id);
+ALTER TABLE dpt_trans ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE exchangerate ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE finanzamt ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE follow_up_access ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE gifi ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE inventory ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE licenseinvoice ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE partsgroup ADD PRIMARY KEY (id);
+ALTER TABLE partstax ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE prices ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE record_links ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE rmaitems ADD PRIMARY KEY (id);
+ALTER TABLE status ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE tax_zones ADD PRIMARY KEY (id);
+ALTER TABLE todo_user_config ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE translation ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE translation_payment_terms ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE units_language ADD COLUMN id SERIAL PRIMARY KEY;
+ALTER TABLE vendortax ADD COLUMN id SERIAL PRIMARY KEY;
diff --git a/t/helper/attr.t b/t/helper/attr.t
new file mode 100644 (file)
index 0000000..4de1a53
--- /dev/null
@@ -0,0 +1,50 @@
+use Test::More tests => 29;
+
+use DateTime;
+
+use_ok 'SL::DB::Part';
+use_ok 'SL::DB::Order';
+use_ok 'SL::DB::Invoice';
+use_ok 'SL::Dispatcher';
+
+SL::Dispatcher::pre_startup_setup();
+
+$::form = Form->new;
+$::myconfig{numberformat} = '1.000,00';
+$::myconfig{dateformat} = 'dd.mm.yyyy';
+$::locale = Locale->new('de');
+
+my $p = new_ok 'SL::DB::Part';
+is($p->sellprice_as_number('2,30'), '2,30');
+is($p->sellprice, 2.30);
+is($p->sellprice_as_number, '2,30');
+is($p->sellprice_as_number('2,3442'), '2,3442');
+is($p->sellprice, 2.3442);
+is($p->sellprice_as_number, '2,3442');
+
+my $o = new_ok 'SL::DB::Order';
+is($o->reqdate_as_date('11.12.2007'), '11.12.2007');
+is($o->reqdate->year, 2007);
+is($o->reqdate->month, 12);
+is($o->reqdate->day, 11);
+is($o->reqdate_as_date, '11.12.2007');
+$o->reqdate(DateTime->new(year => 2010, month => 4, day => 12));
+is($o->reqdate_as_date, '12.04.2010');
+
+is($o->marge_percent_as_percent('40'), '40');
+is($o->marge_percent, 0.40);
+is($o->marge_percent_as_percent, '40');
+is($o->marge_percent_as_percent('22,4'), '22');
+is($o->marge_percent, 0.224);
+is($o->marge_percent_as_percent, '22');
+is($o->marge_percent(0.231), 0.231);
+is($o->marge_percent_as_percent, '23');
+
+# overloaded attr: invoice taxamount
+my $i = new_ok 'SL::DB::Invoice';
+
+is($i->taxamount_as_number, '0,00');
+$i->amount(12);
+$i->netamount(10.34);
+is($i->taxamount_as_number, '1,66');
+
diff --git a/t/helper/mapping.t b/t/helper/mapping.t
new file mode 100644 (file)
index 0000000..d0c015c
--- /dev/null
@@ -0,0 +1,19 @@
+use Test::More tests => 12;
+
+use_ok 'SL::DB::Helpers::ALL';
+use_ok 'SL::DB::Helpers::Mappings', qw(db);
+
+is db('part'), 'SL::DB::Part';
+is db('parts'), 'SL::DB::Manager::Part';
+
+is db('order'), 'SL::DB::Order';
+is db('orders'), 'SL::DB::Manager::Order';
+
+is db('gl'), 'SL::DB::GLTransaction';
+is db('gls'), 'SL::DB::Manager::GLTransaction';
+
+is db('ar'), 'SL::DB::Invoice';
+is db('ars'), 'SL::DB::Manager::Invoice';
+
+is db('Unit'), 'SL::DB::Unit';
+is db('Units'), 'SL::DB::Manager::Unit';