Merge branch 'master' of ssh://lx-office/~/lx-office-erp
authorSven Schöling <s.schoeling@linet-services.de>
Fri, 5 Mar 2010 15:35:37 +0000 (16:35 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Fri, 5 Mar 2010 15:35:37 +0000 (16:35 +0100)
51 files changed:
SL/AP.pm
SL/AR.pm
SL/CP.pm
SL/DO.pm
SL/Form.pm
bin/mozilla/ap.pl
bin/mozilla/ar.pl
bin/mozilla/cp.pl
bin/mozilla/do.pl
doc/changelog
doc/skr04-update-3804/konto3804.png [new file with mode: 0644]
doc/skr04-update-3804/konto4315.png [new file with mode: 0644]
doc/skr04-update-3804/skr04_3804_hinzufuegen.html [new file with mode: 0644]
doc/skr04-update-3804/steuer3803.png [new file with mode: 0644]
doc/skr04-update-3804/steuer3804.png [new file with mode: 0644]
doc/skr04-update-3804/steuerliste.png [new file with mode: 0644]
locale/de/all
locale/de/cp
lxo-import/addressB.php
lxo-import/contactB.php
lxo-import/db.php
lxo-import/import_lib.php
lxo-import/partsB.php
lxo-import/parts_import.php
lxo-import/shiptoB.php
sql/Pg-upgrade2/SKR04-3804-addition.pl [new file with mode: 0644]
templates/German-bin_list.tex
templates/German-check.tex
templates/German-credit_note.tex
templates/German-invoice.tex
templates/German-packing_list.tex
templates/German-pick_list.tex
templates/German-purchase_order.tex
templates/German-receipt.tex
templates/German-request_quotation.tex
templates/German-sales_delivery_order.tex [new file with mode: 0644]
templates/German-sales_order.tex
templates/German-sales_quotation.tex
templates/German-statement.tex
templates/German-ustva-2004.tex
templates/German-ustva-2005.tex
templates/German-ustva-2006.tex
templates/German-ustva-2007.tex
templates/German-ustva-2008.tex
templates/German-ustva.tex
templates/German-zahlungserinnerung.tex [changed mode: 0755->0644]
templates/German-zahlungserinnerung_invoice.tex
templates/webpages/dbupgrade/SKR04_3804_already_exists_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/SKR04_3804_already_exists_master.html [new file with mode: 0644]
templates/webpages/dbupgrade/SKR04_3804_update_de.html [new file with mode: 0644]
templates/webpages/dbupgrade/SKR04_3804_update_master.html [new file with mode: 0644]

index c2ed2b5..fce222d 100644 (file)
--- a/SL/AP.pm
+++ b/SL/AP.pm
@@ -54,6 +54,7 @@ sub post_transaction {
   my $exchangerate = 0;
 
   $form->{defaultcurrency} = $form->get_default_currency($myconfig);
+  delete $form->{currency} unless $form->{defaultcurrency};
 
   ($null, $form->{department_id}) = split(/--/, $form->{department});
   $form->{department_id} *= 1;
@@ -587,11 +588,9 @@ sub post_payment {
 
   $self->setup_form($form);
 
-  ($form->{defaultcurrency}) = selectrow_query($form, $dbh, qq|SELECT curr FROM defaults|);
-  $form->{defaultcurrency}   = (split m/:/, $form->{defaultcurrency})[0];
-  $form->{currency}          = $form->{defaultcurrency} if ($form->{defaultcurrency} && ($form->{currency} =~ m/^\s*$/));
-
-  $form->{exchangerate}      = $form->format_amount($myconfig, $form->{exchangerate});
+  $form->{exchangerate}    = $form->format_amount($myconfig, $form->{exchangerate});
+  $form->{defaultcurrency} = $form->get_default_currency($myconfig);
+  delete $form->{currency} unless $form->{defaultcurrency};
 
   # Get the AP accno.
   $query =
index 8cc5ea6..df47076 100644 (file)
--- a/SL/AR.pm
+++ b/SL/AR.pm
@@ -54,6 +54,7 @@ sub post_transaction {
 
   my $dbh = $provided_dbh ? $provided_dbh : $form->dbconnect_noauto($myconfig);
   $form->{defaultcurrency} = $form->get_default_currency($myconfig);
+  delete $form->{currency} unless $form->{default_currency};
 
   # set exchangerate
   $form->{exchangerate} = ($form->{currency} eq $form->{defaultcurrency}) ? 1 :
@@ -346,11 +347,9 @@ sub post_payment {
 
   $self->setup_form($form);
 
-  ($form->{defaultcurrency}) = selectrow_query($form, $dbh, qq|SELECT curr FROM defaults|);
-  $form->{defaultcurrency}   = (split m/:/, $form->{defaultcurrency})[0];
-  $form->{currency}          = $form->{defaultcurrency} if ($form->{defaultcurrency} && ($form->{currency} =~ m/^\s*$/));
-
-  $form->{exchangerate}      = $form->format_amount($myconfig, $form->{exchangerate});
+  $form->{exchangerate}    = $form->format_amount($myconfig, $form->{exchangerate});
+  $form->{defaultcurrency} = $form->get_default_currency($myconfig);
+  delete $form->{currency} unless $form->{default_currency};
 
   # Get the AR accno (which is normally done by Form::create_links()).
   $query =
index b7e6241..f6c8c1a 100644 (file)
--- a/SL/CP.pm
+++ b/SL/CP.pm
@@ -160,16 +160,14 @@ sub get_openinvoices {
   my $buysell = $form->{vc} eq 'customer' ? "buy" : "sell";
   my $arap = $form->{arap} eq "ar" ? "ar" : "ap";
 
-  my $curr_null = $form->{curreny} ? '' : ' OR a.curr IS NULL'; # fix: after sql-injection fix, curr is inserted as NULL, before that as ''
-
   my $query =
      qq|SELECT a.id, a.invnumber, a.transdate, a.amount, a.paid, a.curr | .
      qq|FROM $arap a | .
-     qq|WHERE (a.${vc}_id = ?) AND (a.curr = ? $curr_null) AND NOT (a.amount = paid)| .
+     qq|WHERE (a.${vc}_id = ?) AND (COALESCE(a.curr, '') = ?) AND NOT (a.amount = a.paid)| .
      qq|ORDER BY a.id|;
   my $sth = prepare_execute_query($form, $dbh, $query,
                                   conv_i($form->{"${vc}_id"}),
-                                  $form->{currency});
+                                  "$form->{currency}");
 
   $form->{PR} = [];
   while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
@@ -182,6 +180,16 @@ sub get_openinvoices {
   }
 
   $sth->finish;
+
+  $query = <<SQL;
+    SELECT COUNT(*)
+    FROM $arap
+    WHERE (${vc}_id = ?)
+      AND (COALESCE(curr, '') <> ?)
+      AND (amount <> paid)
+SQL
+  ($form->{openinvoices_other_currencies}) = selectfirst_array_query($form, $dbh, $query, conv_i($form->{"${vc}_id"}), "$form->{currency}");
+
   $dbh->disconnect;
 
   $main::lxdebug->leave_sub();
@@ -363,7 +371,7 @@ sub process_payment {
                # Hier werden negativen Zahlungseingänge abgefangen
                # Besser: in Oberfläche schon prüfen
                # Zahlungsein- und ausgänge sind immer positiv
-    $dbh->rollback;    
+    $dbh->rollback;
     $rc = 0;
   }
   if ($form->round_amount($paymentamount, 2) == 0) {
index 73314bc..b5faeae 100644 (file)
--- a/SL/DO.pm
+++ b/SL/DO.pm
@@ -280,7 +280,7 @@ sub save {
     $form->{"lastcost_$i"} *= 1;
 
     # set values to 0 if nothing entered
-    $form->{"discount_$i"}  = $form->parse_amount($myconfig, $form->{"discount_$i"}) / 100;
+    $form->{"discount_$i"}  = $form->parse_amount($myconfig, $form->{"discount_$i"});
     $form->{"sellprice_$i"} = $form->parse_amount($myconfig, $form->{"sellprice_$i"});
 
     $price_factor = $price_factors{ $form->{"price_factor_id_$i"} } || 1;
@@ -295,7 +295,7 @@ sub save {
     @values = (conv_i($item_id), conv_i($form->{id}), conv_i($form->{"id_$i"}),
                $form->{"description_$i"}, $form->{"longdescription_$i"},
                $form->{"qty_$i"}, $baseqty,
-               $form->{"sellprice_$i"}, $form->{"discount_$i"},
+               $form->{"sellprice_$i"}, $form->{"discount_$i"} / 100,
                $form->{"unit_$i"}, conv_date($reqdate), conv_i($form->{"project_id_$i"}),
                $form->{"serialnumber_$i"},
                $form->{"ordnumber_$i"}, conv_date($form->{"transdate_$i"}),
index c1cc2ab..905c629 100644 (file)
@@ -1738,7 +1738,7 @@ sub check_exchangerate {
   return $exchangerate;
 }
 
-sub get_default_currency {
+sub get_all_currencies {
   $main::lxdebug->enter_sub();
 
   my ($self, $myconfig) = @_;
@@ -1746,14 +1746,24 @@ sub get_default_currency {
 
   my $query = qq|SELECT curr FROM defaults|;
 
-  my ($curr)            = selectrow_query($self, $dbh, $query);
-  my ($defaultcurrency) = split m/:/, $curr;
+  my ($curr)     = selectrow_query($self, $dbh, $query);
+  my @currencies = grep { $_ } map { s/\s//g; $_ } split m/:/, $curr;
 
   $main::lxdebug->leave_sub();
 
-  return $defaultcurrency;
+  return @currencies;
 }
 
+sub get_default_currency {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $myconfig) = @_;
+  my @currencies        = $self->get_all_currencies($myconfig);
+
+  $main::lxdebug->leave_sub();
+
+  return $currencies[0];
+}
 
 sub set_payment_options {
   $main::lxdebug->enter_sub();
index fba5ba1..62edff2 100644 (file)
@@ -156,11 +156,9 @@ sub create_links {
   $form->{notes} = $form->{intnotes} unless $form->{notes};
 
   # currencies
-  my @curr = split(/:/, $form->{currencies});
-  chomp $curr[0];
-  $form->{defaultcurrency} = $curr[0];
+  $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
-  map { $form->{selectcurrency} .= "<option>$_\n" } @curr;
+  map { $form->{selectcurrency} .= "<option>$_\n" } $form->get_all_currencies(\%myconfig);
 
   # vendors
   if (@{ $form->{all_vendor} || [] }) {
@@ -261,7 +259,7 @@ sub form_header {
   my $exchangerate = qq|
 <input type=hidden name=forex value=$form->{forex}>
 |;
-  if ($form->{currency} ne $form->{defaultcurrency}) {
+  if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency})) {
     if ($form->{forex}) {
       $exchangerate .= qq|
             <tr>
@@ -639,7 +637,7 @@ $jsscript
 |;
 
   my @column_index;
-  if ($form->{currency} eq $form->{defaultcurrency}) {
+  if ($form->{defaultcurrency} && ($form->{currency} eq $form->{defaultcurrency})) {
     @column_index = qw(datepaid source memo paid AP_paid paid_project_id);
   } else {
     @column_index = qw(datepaid source memo paid exchangerate AP_paid paid_project_id);
@@ -692,7 +690,7 @@ $jsscript
     }
 
     $exchangerate = qq|&nbsp;|;
-    if ($form->{currency} ne $form->{defaultcurrency}) {
+    if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency})) {
       if ($form->{"forex_$i"}) {
         $exchangerate =
           qq|<input type=hidden name="exchangerate_$i" value=$form->{"exchangerate_$i"}>$form->{"exchangerate_$i"}|;
@@ -985,7 +983,7 @@ sub post_payment {
       $form->error($locale->text('Cannot post payment for a closed period!'))
         if ($form->date_closed($form->{"datepaid_$i"}, \%myconfig));
 
-      if ($form->{currency} ne $form->{defaultcurrency}) {
+      if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency})) {
         $form->{"exchangerate_$i"} = $form->{exchangerate}
           if ($invdate == $datepaid);
         $form->isblank("exchangerate_$i",
@@ -1034,7 +1032,7 @@ sub post {
   $form->error($locale->text('Zero amount posting!')) if $zero_amount_posting;
 
   $form->isblank("exchangerate", $locale->text('Exchangerate missing!'))
-    if ($form->{currency} ne $form->{defaultcurrency});
+    if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency}));
   delete($form->{AP});
 
   for my $i (1 .. $form->{paidaccounts}) {
@@ -1046,7 +1044,7 @@ sub post {
       $form->error($locale->text('Cannot post payment for a closed period!'))
         if ($form->date_closed($form->{"datepaid_$i"}, \%myconfig));
 
-      if ($form->{currency} ne $form->{defaultcurrency}) {
+      if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency})) {
         $form->{"exchangerate_$i"} = $form->{exchangerate}
           if ($transdate == $datepaid);
         $form->isblank("exchangerate_$i",
index a740728..f170407 100644 (file)
@@ -147,7 +147,7 @@ sub create_links {
   my $form     = $main::form;
   my %myconfig = %main::myconfig;
 
-  my ($duedate, $taxincluded, @curr);
+  my ($duedate, $taxincluded);
 
   $form->create_links("AR", \%myconfig, "customer");
   $duedate = $form->{duedate};
@@ -166,11 +166,9 @@ sub create_links {
   $form->{notes} = $form->{intnotes} unless $form->{notes};
 
   # currencies
-  @curr = split(/:/, $form->{currencies});
-  chomp $curr[0];
-  $form->{defaultcurrency} = $curr[0];
+  $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
-  map { $form->{selectcurrency} .= "<option>$_\n" } @curr;
+  map { $form->{selectcurrency} .= "<option>$_\n" } $form->get_all_currencies(\%myconfig);
 
   # customers
   if (@{ $form->{all_customer} || [] }) {
@@ -290,7 +288,7 @@ sub form_header {
   $exchangerate = qq|
 <input type=hidden name=forex value=$form->{forex}>
 |;
-  if ($form->{currency} ne $form->{defaultcurrency}) {
+  if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency})) {
     if ($form->{forex}) {
       $exchangerate .= qq|
         <th align=right>| . $locale->text('Exchangerate') . qq|</th>
@@ -684,7 +682,7 @@ $jsscript
         </tr>
 |;
 
-  if ($form->{currency} eq $form->{defaultcurrency}) {
+  if ($form->{defaultcurrency} && ($form->{currency} eq $form->{defaultcurrency})) {
     @column_index = qw(datepaid source memo paid AR_paid paid_project_id);
   } else {
     @column_index = qw(datepaid source memo paid exchangerate AR_paid paid_project_id);
@@ -737,7 +735,7 @@ $jsscript
     }
 
     $exchangerate = qq|&nbsp;|;
-    if ($form->{currency} ne $form->{defaultcurrency}) {
+    if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency})) {
       if ($form->{"forex_$i"}) {
         $exchangerate =
           qq|<input type=hidden name="exchangerate_$i" value=$form->{"exchangerate_$i"}>$form->{"exchangerate_$i"}|;
@@ -1048,7 +1046,7 @@ sub post_payment {
 
       $form->error($locale->text('Cannot post payment for a closed period!')) if ($form->date_closed($form->{"datepaid_$i"}, \%myconfig));
 
-      if ($form->{currency} ne $form->{defaultcurrency}) {
+      if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency})) {
 #        $form->{"exchangerate_$i"} = $form->{exchangerate} if ($invdate == $datepaid);
         $form->isblank("exchangerate_$i", $locale->text('Exchangerate for payment missing!'));
       }
@@ -1099,7 +1097,7 @@ sub post {
     unless grep $_*1, map $form->parse_amount(\%myconfig, $form->{"amount_$_"}), 1..$form->{rowcount};
 
   $form->isblank("exchangerate", $locale->text('Exchangerate missing!'))
-    if ($form->{currency} ne $form->{defaultcurrency});
+    if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency}));
 
   delete($form->{AR});
 
@@ -1112,7 +1110,7 @@ sub post {
       $form->error($locale->text('Cannot post payment for a closed period!'))
         if ($form->date_closed($form->{"datepaid_$i"}, \%myconfig));
 
-      if ($form->{currency} ne $form->{defaultcurrency}) {
+      if ($form->{defaultcurrency} && ($form->{currency} ne $form->{defaultcurrency})) {
         $form->{"exchangerate_$i"} = $form->{exchangerate} if ($transdate == $datepaid);
         $form->isblank("exchangerate_$i", $locale->text('Exchangerate for payment missing!'));
       }
index 5162433..f4a9efb 100644 (file)
@@ -317,6 +317,19 @@ sub form_header {
 $jsscript
 |;
 
+  if ($form->{openinvoices_other_currencies}) {
+    my $warning = $form->{vc} eq 'customer' ? $::locale->text('There are #1 more open invoices for this customer with other currencies.', $form->{openinvoices_other_currencies})
+                :                             $::locale->text('There are #1 more open invoices from this vendor with other currencies.',  $form->{openinvoices_other_currencies});
+
+    print qq|
+
+  <input type="hidden" name="openinvoices_other_currencies" value="| . H($form->{openinvoices_other_currencies}) . qq|">
+  <tr>
+   <td><b>| . $::locale->text('Note') . qq|: $warning</b></td>
+  </tr>
+|;
+  }
+
   $lxdebug->leave_sub();
 }
 
index 4ae7f45..a57022b 100644 (file)
@@ -183,6 +183,8 @@ sub order_links {
     IR->get_vendor(\%myconfig, \%$form);
   } else {
     IS->get_customer(\%myconfig, \%$form);
+    # OFFEN tritt bug 1284 auch bei vendor auf?
+    $form->{discount} = $form->{customer_discount};
   }
 
   $form->restore_vars(qw(payment_id language_id taxzone_id intnotes cp_id));
@@ -628,14 +630,9 @@ sub save {
   # wird die Maske mit dem falschen Rabatt wieder aufgebaut.
   # Wie immer: backup_vars verwenden um nichts anderes kaputt zu
   # machen. jan 03.03.2010
-  for my $i (1 .. $form->{rowcount}) {
-    $form->{"backup_discount_$i"} = $form->{"discount_$i"};
-  };
+  # nicht mehr notwendig da für bug 1284 der backend aufruf entsprechend
+  # geändert wurde
   DO->save();
-  for my $i (1 .. $form->{rowcount}) {
-    $form->{"discount_$i"} = $form->{"backup_discount_$i"};
-    delete $form->{"backup_discount_$i"};
-  };
   # saving the history
   if(!exists $form->{addition}) {
     $form->{snumbers} = qq|donumber_| . $form->{donumber};
@@ -734,6 +731,11 @@ sub invoice {
   }
 
   for my $i (1 .. $form->{rowcount}) {
+    # für bug 1284
+    if ($form->{discount}){ # Falls wir einen Kundenrabatt haben 
+      # und keinen anderen discount wert an $i ...
+      $form->{"discount_$i"} ||= $form->{discount}*100; # ... nehmen wir den kundenrabatt
+    }
     map { $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig, $form->{"${_}_${i}"}) if $form->{"${_}_${i}"} } qw(ship qty sellprice listprice basefactor);
   }
 
index b52032f..b164a7a 100644 (file)
 
   Liste gefixter Bugs aus dem Bugtracker:
 
-  922 940 1017 1024 1025 1028 1030 1031 1034 1035 1036 1037 1040 1043 1044 1046
-  1051 1055 1057 1058 1072 1073 1077 1079 1081 1082 1095 1098 1100 1101 1108
-  1110 1118 1125 1127 1130 1133 1135 1136 1138 1144 1146 1147 1150 1151 1155
-  1164 1170 1173 1177 1186 1188 1190 1191 1195 1197 1198 1199 1200 1201 1209
-  1213 1243 1248 1250 1262 1286 1287 1289 1290 1291 1294 1299 1331 1334 1336
-  1339 1340 1341 1342 1343 1350 1352 1399
+  922 940 1017 1024 1025 1028 1030 1031 1034 1035 1036 1037 1040 1043
+  1044 1046 1050 1051 1055 1057 1058 1072 1073 1077 1079 1081 1082
+  1095 1098 1100 1101 1108 1110 1118 1125 1127 1130 1133 1135 1136
+  1138 1144 1146 1147 1150 1151 1155 1164 1170 1173 1177 1186 1188
+  1190 1191 1195 1197 1198 1199 1200 1201 1209 1213 1243 1248 1250
+  1262 1284 1286 1287 1289 1290 1291 1294 1299 1311 1317 1326 1328
+  1331 1334 1335 1336 1339 1340 1341 1342 1343 1349 1350 1352 1354
+  1355 1356
 
 
 2009-06-02 - Version 2.6.0
diff --git a/doc/skr04-update-3804/konto3804.png b/doc/skr04-update-3804/konto3804.png
new file mode 100644 (file)
index 0000000..e66b66a
Binary files /dev/null and b/doc/skr04-update-3804/konto3804.png differ
diff --git a/doc/skr04-update-3804/konto4315.png b/doc/skr04-update-3804/konto4315.png
new file mode 100644 (file)
index 0000000..d9971cf
Binary files /dev/null and b/doc/skr04-update-3804/konto4315.png differ
diff --git a/doc/skr04-update-3804/skr04_3804_hinzufuegen.html b/doc/skr04-update-3804/skr04_3804_hinzufuegen.html
new file mode 100644 (file)
index 0000000..14a49ed
--- /dev/null
@@ -0,0 +1,54 @@
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>Lx-Office: SKR04 19% Umstellung für innergemeinschaftlichen Erwerb</title>
+</head>
+<body>
+
+<h1>Umsatzsteuer 19% für Verkauf mit Steuerschlüssel "EU ohne USt.-IdNr.":</h1>
+
+Die Umsatzsteuerumstellung auf 19% für SKR04 für die Steuerschlüssel "EU ohne
+USt-ID Nummer" ist erst 2010 erfolgt. Das Upgradeskript erstellt automatisch
+das Konto 3804 und stellt die Steuereinstellungen korrekt ein, hat der Benutzer
+aber schon selber das Konto 3804 angelegt, oder gab es schon Buchungen im
+Zeitraum nach dem 01.01.2007 auf das Konto 3803, wird das Upgradeskript
+vorsichtshalber nicht ausgeführt, da der Benutzer sich vielleicht schon selbst
+geholfen hat und mit seinen Änderungen zufrieden ist. Die korrekten
+Einstellungen kann man aber auch per Hand ausführen, nachfolgend werden die
+entsprechenden Schritte anhand von Screenshots dargestellt.
+
+Für den Fall, daß Buchungen mit der Steuerschlüssel "EU ohne USt.-IdNr." nach dem
+01.01.2007 erfolgt sind, ist davon auszugehen, daß diese mit dem alten
+Umsatzsteuersatz von 16% gebucht worden sind, und diese Buchungen sollten
+entsprechend kontrolliert werden.
+
+<h2>Lx-Office: 3804 hinzufügen</h2>
+Konto 3804 anlegen:<br>
+
+System -> Kontenübersicht -> Konto erfassen<br>
+
+<img src="konto3804.png" alt="konto3804.png">
+
+
+<h2>Steuergruppe 13 für Konto 3803 anpassen (16%):</h2>
+System -> Steuern -> bearbeiten -> Eintrag mit Steuerschlüssel 13 auswählen<br>
+
+<img src="steuer3803.png" alt="steuer3803.png">
+
+<h2>Neuen Eintrag mit Steuerschlüssel 13 für Konto 3804 (19%) anlegen</h2>
+System -> Steuern -> bearbeiten -> erfassen<br>
+
+<img src="steuer3804.png" alt="steuer3804.png">
+<h2>Alle Konten, die als Steuerautomatikkonto die 3803 haben, kriegen ab 1.1.2007 auch Steuerautomatik auf 3804</h2>
+
+Steuerschlüssel für Konto 4315 anpassen (das gleiche für 4726) <br>
+
+System -> Kontenübersicht -> Konten anzeigen -> 4315<br>
+
+<img src="konto4315.png" alt="konto4315.png">
+
+<h2>Steuerliste kontrolllieren</h2>
+System -> Steuern -> bearbeiten
+
+<img src="steuerliste.png" alt="steuerliste.png">
+
+</body></html>
diff --git a/doc/skr04-update-3804/steuer3803.png b/doc/skr04-update-3804/steuer3803.png
new file mode 100644 (file)
index 0000000..361c0b3
Binary files /dev/null and b/doc/skr04-update-3804/steuer3803.png differ
diff --git a/doc/skr04-update-3804/steuer3804.png b/doc/skr04-update-3804/steuer3804.png
new file mode 100644 (file)
index 0000000..fad5986
Binary files /dev/null and b/doc/skr04-update-3804/steuer3804.png differ
diff --git a/doc/skr04-update-3804/steuerliste.png b/doc/skr04-update-3804/steuerliste.png
new file mode 100644 (file)
index 0000000..2c4945c
Binary files /dev/null and b/doc/skr04-update-3804/steuerliste.png differ
index 4d3e039..442fb7b 100644 (file)
@@ -1184,6 +1184,7 @@ $self->{texts} = {
   'Please insert your longdescription below' => 'Bitte den Langtext eingeben',
   'Please install the below listed modules or ask your system administrator to.' => 'Bitte installieren Sie die unten aufgef&uuml;hrten Module, oder bitten Sie Ihren Administrator darum.',
   'Please re-run the analysis for broken general ledger entries by clicking this button:' => 'Bitte wiederholen Sie die Analyse der Hauptbucheinträge, indem Sie auf diesen Button klicken:',
+  'Please read the file'        => 'Bitte lesen Sie die Datei',
   'Please select a customer from the list below.' => 'Bitte einen Endkunden aus der Liste auswählen',
   'Please select a part from the list below.' => 'Bitte w&auml;hlen Sie einen Artikel aus der Liste aus.',
   'Please select a vendor from the list below.' => 'Bitte einen Händler aus der Liste auswählen',
@@ -1532,6 +1533,8 @@ $self->{texts} = {
   'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
   'The SEPA export has been created.' => 'Der SEPA-Export wurde erstellt',
   'The access rights have been saved.' => 'Die Zugriffsrechte wurden gespeichert.',
+  'The account 3804 already exists, the update will be skipped.' => 'Das Konto 3804 existiert schon, das Update wird übersprungen.',
+  'The account 3804 will not be added automatically.' => 'Das Konto 3804 wird nicht automatisch hinzugefügt.',
   'The assembly has been created.' => 'Das Erzeugnis wurde hergestellt.',
   'The assistant could not find anything wrong with #1. Maybe the problem has been solved in the meantime.' => 'Der Korrekturassistent konnte kein Problem bei #1 feststellen. Eventuell wurde das Problem in der Zwischenzeit bereits behoben.',
   '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.' => 'Die Konfigurationsdatei f&uuml;r die Authentifizierung &quot;config/authentication.pl&quot; wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollst&auml;ndig aktualisiert oder eingerichtet. Bitte wenden Sie sich an Ihren Administrator.',
@@ -1644,7 +1647,10 @@ $self->{texts} = {
   'The wrong taxkeys for AP and AR transactions have been fixed.' => 'Die Probleme mit falschen Steuerschlüssel bei Kreditoren- und Debitorenbuchungen wurden behoben.',
   'The wrong taxkeys for inventory transactions for sales and purchase invoices have been fixed.' => 'Die falschen Steuerschlüssel für Warenbestandsbuchungen bei Einkaufs- und Verkaufsrechnungen wurden behoben.',
   'The wrong taxkeys have been fixed.' => 'Die Steuerschlüssel wurden nach Ihrer Auswahl korrigiert.',
+  'There are #1 more open invoices for this customer with other currencies.' => 'Es gibt #1 weitere offene Rechnungen für diesen Kunden, die in anderen Währungen ausgestellt wurden.',
+  'There are #1 more open invoices from this vendor with other currencies.' => 'Es gibt #1 weitere offene Rechnungen von diesem Lieferanten, die in anderen Währungen ausgestellt wurden.',
   'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 fällig ist/sind.',
+  '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.' => 'Das Konto 3803 wurde nach dem 01.01.2007 bebucht. Falls Sie dieses Konto nicht manuell auf 19% gestellt haben sind die Buchungen wahrscheinlich mit falscher Umsatzsteuer gebucht worden.',
   'There are four tax zones.'   => 'Es gibt vier Steuerzonen.',
   'There are no items in stock.' => 'Dieser Artikel ist nicht eingelagert.',
   'There are no items on your TODO list at the moment.' => 'Ihre Aufgabenliste enth&auml;lt momentan keine Eintr&auml;ge.',
@@ -1753,6 +1759,7 @@ $self->{texts} = {
   'Update'                      => 'Erneuern',
   'Update Dataset'              => 'Datenbank aktualisieren',
   'Update Prices'               => 'Preise aktualisieren',
+  'Update SKR04: new tax account 3804 (19%)' => 'Update SKR04: neues Steuerkonto 3804 (19%) für innergemeinschaftlichen Erwerb',
   'Update complete'             => 'Update beendet.',
   'Update prices'               => 'Preise aktualisieren',
   'Update?'                     => 'Aktualisieren?',
index 9de006c..11ee888 100644 (file)
@@ -106,6 +106,7 @@ $self->{texts} = {
   'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'Note'                        => 'Hinweis',
   'Number'                      => 'Nummer',
   'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
@@ -159,6 +160,8 @@ $self->{texts} = {
   'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
   'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
   'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
+  'There are #1 more open invoices for this customer with other currencies.' => 'Es gibt #1 weitere offene Rechnungen für diesen Kunden, die in anderen Währungen ausgestellt wurden.',
+  'There are #1 more open invoices from this vendor with other currencies.' => 'Es gibt #1 weitere offene Rechnungen von diesem Lieferanten, die in anderen Währungen ausgestellt wurden.',
   'To (email)'                  => 'An',
   'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
index 05ced5e..e7f7be3 100755 (executable)
@@ -48,17 +48,17 @@ function ende($txt) {
     echo "Abbruch: $txt<br>";
     exit(1);
 }
-
+$dir = "../users/";
 clearstatcache ();
 //print_r($_FILES);
 $test=$_POST["test"];
 if (!empty($_FILES["Datei"]["name"])) {
     $file=$_POST["ziel"];
-    if (!move_uploaded_file($_FILES["Datei"]["tmp_name"],$file.".csv")) {
+    if (!move_uploaded_file($_FILES["Datei"]["tmp_name"],$dir.$file.".csv")) {
         $file=false;
         echo "Upload von ".$_FILES["Datei"]["name"]." fehlerhaft. (".$_FILES["Datei"]["error"].")<br>";
     }
-} else if (is_file($_POST["ziel"].".csv")) {
+} else if (is_file($dir.$_POST["ziel"].".csv")) {
     $file=$_POST["ziel"];
 } else {
     $file=false;
@@ -67,8 +67,12 @@ if (!empty($_FILES["Datei"]["name"])) {
 if (!$file) ende ("Kein Datenfile");
 
 $trenner=($_POST["trenner"])?$_POST["trenner"]:",";
+if ($trenner=="other") {
+    $trenner=trim($trennzeichen);
+    if (substr($trenner,0,1)=="#") if (strlen($trenner)>1) $trenner=chr(substr($trenner,1));
+} 
 
-if (!file_exists("$file.csv")) ende("$file.csv nicht im Ordner oder leer");
+if (!file_exists($dir.$file.".csv")) ende("$file.csv nicht im Ordner oder leer");
 
 
 if (!$db->chkcol($file)) ende("Importspalte kann nicht angelegt werden");
@@ -78,7 +82,39 @@ if (!$employee) ende("Ung&uuml;ltiger User");
 
 $kunde_fld = array_keys($address);
 
-$f=fopen("$file.csv","r");
+    //Zeichencodierung des Servers
+    $tmpcode = $db->getServerCode();
+    //Leider sind die Benennungen vom Server anders als von mb_detect_encoding
+    if ($tmpcode == "UTF8") {
+         define("ServerCode","UTF-8");
+    } else if ($tmpcode == "LATIN9") {
+         define("ServerCode","ISO-8859-15");
+    } else if ($tmpcode == "LATIN1") {
+         define("ServerCode","ISO-8859-1");
+    } else {
+         define("ServerCode",$tmpcode);
+    }
+    //Zeichensatz sollte gleich sein, sonst ist die Datenkonvertierung nutzlos
+    //DB und LxO müssen ja nicht auf der gleichen Maschiene sein.
+    if($tmpcode<>$db->getClientCode()) {
+        $rc = $db->setClientCode($tmpcode);
+    }
+
+    // Zeichenkodierung File
+    if ($_POST["encoding"] == "auto") {
+         define("Auto",true);
+         define("Translate",true);
+    } else {
+         define("Auto",false);
+         if ($_POST["encoding"] == ServerCode) {
+            define("Translate",false);
+         } else {
+            define("Translate",true);
+            define("FileCode",$_POST["encoding"]);
+         }
+    }
+
+$f=fopen($dir.$file.".csv","r");
 $zeile=fgets($f,1200);
 $infld=split($trenner,strtolower($zeile));
 $first=true;
@@ -111,14 +147,14 @@ if ($ok) while (!feof($f)){
         $data=trim($data);
         // seit 2.6 ist die DB-Kodierung UTF-8 @holger Ansonsten einmal vorher die DB-Encoding auslesen
         // Falls die Daten ISO-kodiert kommen entsprechend wandeln
+        // done!
         // UTF-8 MUSS als erstes stehen, da ansonsten die Prüfung bei ISO-8859-1 aufhört ...
+        // die blöde mb_detect... tut leider nicht immer, daher die Möglichkeit der Auswahl
         // TODO Umlaute am Anfang wurden bei meinem Test nicht übernommen (Österreich). S.a.:
         // http://forum.de.selfhtml.org/archiv/2007/1/t143904/
 
-        $encoding = mb_detect_encoding($data,"UTF-8,ISO-8859-1,ISO-8859-15");
-        if ($encoding != "UTF-8"){
-          $data=mb_convert_encoding($data, "UTF-8","$encoding");
-        }
+        if (Translate) translate($data);
+
         //$data=htmlentities($data);
         $data=addslashes($data);
         if ($in_fld[$i]==$file."number") {  // customernumber || vendornumber
@@ -132,12 +168,9 @@ if ($ok) while (!feof($f)){
         } else if ($in_fld[$i]=="taxincluded"){
             $data=strtolower(substr($data,0,1));
             if ($data!="f" && $data!="t") $data="f";
-        } /*else if ($in_fld[$i]=="ustid"){
-            Was passiert hier:
-            $data=strtr(" ","",$data);
-            SUCHE IN ' ' nach dem Vorkommen von '' mit der BOOLEAN-Interpretation von $data
-            demnach gibt es immer eine leere Zeichenkette zurück.
-        }*/ /*else if ($in_fld[$i]=="matchcode") {
+        } else if ($in_fld[$i]=="ustid"){
+            $data=strtr($data," ","");
+        } /*else if ($in_fld[$i]=="matchcode") {
                   $matchcode=$data;
                   $i++;
                   continue;
@@ -208,9 +241,26 @@ echo $j." $file importiert.\n";
 <table>
 <tr><td></td><td><input type="submit" name="ok" value="Hilfe"></td></tr>
 <tr><td>Zieltabelle</td><td><input type="radio" name="ziel" value="customer" checked>customer <input type="radio" name="ziel" value="vendor">vendor</td></tr>
-<tr><td>Trennzeichen</td><td><input type="text" size="2" maxlength="1" name="trenner" value=";"></td></tr>
+<tr><td>Trennzeichen</td><td>
+        <input type="radio" name="trenner" value=";" checked>Semikolon
+        <input type="radio" name="trenner" value=",">Komma
+        <input type="radio" name="trenner" value="#9" checked>Tabulator
+        <input type="radio" name="trenner" value=" ">Leerzeichen
+        <input type="radio" name="trenner" value="other">
+        <input type="text" size="2" name="trennzeichen" value="">
+</td></tr>
 <tr><td>Test</td><td><input type="checkbox" name="test" value="1">ja</td></tr>
 <tr><td>Daten</td><td><input type="file" name="Datei"></td></tr>
+<tr><td>Verwendete<br />Zeichecodierung</td><td>
+        <select name="encoding">
+        <option value="auto">Automatisch (versuchen)</option>
+        <option value="UTF-8">UTF-8</option>
+        <option value="ISO-8859-1">ISO-8859-1</option>
+        <option value="ISO-8859-15">ISO-8859-15</option>
+        <option value="Windows-1252">Windows-1252</option>
+        <option value="ASCII">ASCII</option>
+        </select>
+</td></tr>
 <tr><td></td><td><input type="submit" name="ok" value="Import"></td></tr>
 </table>
 </form>
index e07bedb..49e2adc 100644 (file)
@@ -28,6 +28,8 @@ $db=$_SESSION["db"]; //new myDB($login);
 $crm=checkCRM();
 
 if ($_POST["ok"]) {
+    $dir = "../users/";
+
        $test=$_POST["test"];
 
        if ($crm) {
@@ -55,14 +57,19 @@ if ($_POST["ok"]) {
        clearstatcache ();
 
        $trenner=($_POST["trenner"])?$_POST["trenner"]:",";
+    if ($trenner=="other") {
+        $trenner=trim($trennzeichen);
+        if (substr($trenner,0,1)=="#") if (strlen($trenner)>1) $trenner=chr(substr($trenner,1));
+    }
 
 if (!empty($_FILES["Datei"]["name"])) { 
        $file=$_POST["ziel"];
-       if (!move_uploaded_file($_FILES["Datei"]["tmp_name"],$file."_contact.csv")) {
+       if (!move_uploaded_file($_FILES["Datei"]["tmp_name"],$dir.$file."_contact.csv")) {
                $file=false;
                echo "Upload von ".$_FILES["Datei"]["name"]." fehlerhaft. (".$_FILES["Datei"]["error"].")<br>";
        } 
-} else if (is_file($_POST["ziel"]."_contact.csv")) {
+} else if (is_file($dir.$_POST["ziel"]."_contact.csv")) {
        $file=$_POST["ziel"];
 } else {
        $file=false;
@@ -70,16 +77,49 @@ if (!empty($_FILES["Datei"]["name"])) {
 
 if (!$file) ende (2);
 
-if (!file_exists($file."_contact.csv")) ende(5);
+if (!file_exists($dir.$file."_contact.csv")) ende(5);
 
-$prenumber=$_POST["prenumber"];
+//$prenumber=$_POST["prenumber"];
 
 $employee=chkUsr($_SESSION["employee"]);
 if (!$employee) ende(4);
 
 if (!$db->chkcol($file)) ende(6);
 
-$f=fopen($file."_contact.csv","r");
+    //Zeichencodierung des Servers
+    $tmpcode = $db->getServerCode();
+    //Leider sind die Benennungen vom Server anders als von mb_detect_encoding
+    if ($tmpcode == "UTF8") {
+         define("ServerCode","UTF-8");
+    } else if ($tmpcode == "LATIN9") {
+         define("ServerCode","ISO-8859-15");
+    } else if ($tmpcode == "LATIN1") {
+         define("ServerCode","ISO-8859-1");
+    } else {
+         define("ServerCode",$tmpcode);
+    }
+    //Zeichensatz sollte gleich sein, sonst ist die Datenkonvertierung nutzlos
+    //DB und LxO müssen ja nicht auf der gleichen Maschiene sein.
+    if($tmpcode<>$db->getClientCode()) {
+        $rc = $db->setClientCode($tmpcode);
+    }
+
+    // Zeichenkodierung File
+    if ($_POST["encoding"] == "auto") {
+         define("Auto",true);
+         define("Translate",true);
+    } else {
+         define("Auto",false);
+         if ($_POST["encoding"] == ServerCode) {
+            define("Translate",false);
+         } else {
+            define("Translate",true);
+            define("FileCode",$_POST["encoding"]);
+         }
+    }
+
+
+$f=fopen($dir.$file."_contact.csv","r");
 $zeile=fgetcsv($f,2000,$trenner);
 
 $first=true;
@@ -105,6 +145,7 @@ while (!feof($f)){
                }
                $data=addslashes(trim($data));
                if ($in_fld[$i]=="firma" && $data) { 
+            if (Translate) translate($data);
                        $data=suchFirma($file,$data);
                        if ($data) {
                                $id=$data["cp_cv_id"];
@@ -149,15 +190,18 @@ while (!feof($f)){
                if ($data==false or empty($data) or !$data) {
                         $vals.="null,";
                 } else {
-                       if (in_array($in_fld[$i],array("cp_fax","cp_phone1","cp_phone2"))) {
-                               $data=$prenumber.$data;
-                       } else if ($in_fld[$i]=="cp_country" && $data) {
-                               $data=mkland($data);
-                       }
-                       if ($in_fld[$i]=="cp_name") $name=true;
-                        $vals.="'".$data."',";
-                        // bei jedem gefuellten Datenfeld erhoehen
-                        $val_count++;
+
+                    if (Translate) translate($data);
+
+                       /*if (in_array($in_fld[$i],array("cp_fax","cp_phone1","cp_phone2"))) {
+                                       $data=$prenumber.$data;
+                    } else if ($in_fld[$i]=="cp_country" && $data) {
+                        $data=mkland($data);
+                    } */
+                       if ($in_fld[$i]=="cp_name") $name=true;
+                    $vals.="'".$data."',";
+                    // bei jedem gefuellten Datenfeld erhoehen
+                    $val_count++;
                 }
        }
        if (!$name) {
@@ -197,10 +241,27 @@ echo $j." $file importiert.\n";} else {
 <table>
 <tr><td></td><td><input type="submit" name="ok" value="Hilfe"></td></tr>
 <tr><td>Zieltabelle</td><td><input type="radio" name="ziel" value="customer" checked>customer <input type="radio" name="ziel" value="vendor">vendor</td></tr>
-<tr><td>Trennzeichen</td><td><input type="text" size="2" maxlength="1" name="trenner" value=";"></td></tr>
-<tr><td>Telefonvorwahl</td><td><input type="text" size="4" maxlength="1" name="prenumber" value=""></td></tr>
+<tr><td>Trennzeichen</td><td>
+        <input type="radio" name="trenner" value=";" checked>Semikolon
+        <input type="radio" name="trenner" value=",">Komma
+        <input type="radio" name="trenner" value="#9" checked>Tabulator
+        <input type="radio" name="trenner" value=" ">Leerzeichen
+        <input type="radio" name="trenner" value="other">
+        <input type="text" size="2" name="trennzeichen" value="">
+</td></tr>
+<!--tr><td>Telefonvorwahl</td><td><input type="text" size="4" maxlength="1" name="prenumber" value=""></td></tr-->
 <tr><td>Test</td><td><input type="checkbox" name="test" value="1">ja</td></tr>
 <tr><td>Daten</td><td><input type="file" name="Datei"></td></tr>
+<tr><td>Verwendete<br />Zeichecodierung</td><td>
+        <select name="encoding">
+        <option value="auto">Automatisch (versuchen)</option>
+        <option value="UTF-8">UTF-8</option>
+        <option value="ISO-8859-1">ISO-8859-1</option>
+        <option value="ISO-8859-15">ISO-8859-15</option>
+        <option value="Windows-1252">Windows-1252</option>
+        <option value="ASCII">ASCII</option>
+        </select>
+</td></tr>
 <tr><td></td><td><input type="submit" name="ok" value="Import"></td></tr>
 </table>
 </form>
index aae192c..3c884d0 100644 (file)
@@ -134,6 +134,26 @@ class myDB extends DB {
         } else { return true; };
     }
 
+    /**
+     * Zeichekodirung der DB ermitteln
+     * 
+     * @return String
+     */
+    function getServerCode() {
+        $sql="SHOW  server_encoding";
+        $rs = $this->getAll($sql);
+        return $rs[0]["server_encoding"];
+    }
+    function getClientCode() {
+        $sql="SHOW  client_encoding";
+        $rs = $this->getAll($sql);
+        return $rs[0]["client_encoding"];
+    }
+    function setClientCode($encoding) {
+        $sql="SET  client_encoding = '$encoding'";
+        $rc = $this->query($sql);
+        return $rc;
+    }
            
 }
 ?>
index 2abec36..e2eb34c 100644 (file)
@@ -93,6 +93,7 @@ $parts = array(
     "partsgroup2" => "3.Warengruppenbezeichnung",
     "partsgroup3" => "4.Warengruppenbezeichnung",
     "partsgroup4" => "5.Warengruppenbezeichnung",
+    "shop"  => "Shopexport vorghesehen",
     );
     
 $contactscrm = array(
@@ -369,5 +370,20 @@ function authuser($dbhost,$dbport,$dbuser,$dbpasswd,$dbname,$cookie) {
     $db->query($sql,"authuser_3");
     return $auth;
 }
+/**
+ * Zeichencode übersetzen
+ *
+ * @param String $txt
+ */
+function translate(&$txt) {
+    if (Auto) {
+        $encoding = mb_detect_encoding($data,"UTF-8,ISO-8859-1,ISO-8859-15,Windows-1252,ASCII");
+        $txt = iconv("$encoding",ServerCode."//TRANSLIT",$txt);
+        //$txt = mb_convert_encoding($txt, ServerCode,"$encoding");
+    } else {
+        $txt = iconv(FileCode,ServerCode."//TRANSLIT",$txt);
+        //$txt = mb_convert_encoding($txt, ServerCode,FileCode);
+    }
+}
 
 ?>
index 9619466..920b31b 100644 (file)
@@ -27,11 +27,41 @@ if (!anmelden()) ende("Anmeldung fehlgeschlagen.");
 /* get DB instance */
 $db=$_SESSION["db"]; //new myDB($login);
 
-
 /* just display page or do real import? */
 if ($_POST["ok"]) {
 
     require ("parts_import.php");
+    //Zeichencodierung des Servers
+    $tmpcode = $db->getServerCode();
+    //Leider sind die Benennungen vom Server anders als von mb_detect_encoding
+    if ($tmpcode == "UTF8") {
+         define("ServerCode","UTF-8");
+    } else if ($tmpcode == "LATIN9") {
+         define("ServerCode","ISO-8859-15");
+    } else if ($tmpcode == "LATIN1") {
+         define("ServerCode","ISO-8859-1");
+    } else {
+         define("ServerCode",$tmpcode);
+    }
+    //Zeichensatz sollte gleich sein, sonst ist die Datenkonvertierung nutzlos
+    //DB und LxO müssen ja nicht auf der gleichen Maschiene sein.
+    if($tmpcode<>$db->getClientCode()) {
+        $rc = $db->setClientCode($tmpcode);
+    } 
+
+    // Zeichenkodierung File
+    if ($_POST["encoding"] == "auto") {
+         define("Auto",true);
+         define("Translate",true);
+    } else {
+         define("Auto",false);
+         if ($_POST["encoding"] == ServerCode) {
+            define("Translate",false);
+         } else {
+            define("Translate",true);
+            define("FileCode",$_POST["encoding"]);
+         }
+    }
 
     /* display help */
     if ($_POST["ok"]=="Hilfe") {
@@ -66,24 +96,24 @@ if ($_POST["ok"]) {
     $precision = $_POST["precision"];
     $quotation = $_POST["quotation"];
     $quottype = $_POST["quottype"];
-    $file    = "../users/parts.csv";
-    $table   = "parts";
+    $file    = "parts";
 
     /* no data? */
     if (empty($_FILES["Datei"]["name"]))
         ende ("Kein Datenfile angegeben");
 
     /* copy file */
-    if (!move_uploaded_file($_FILES["Datei"]["tmp_name"],$file)) {
+    $dir="../users/";
+    if (!move_uploaded_file($_FILES["Datei"]["tmp_name"],$dir.$file.".csv")) {
         ende ("Upload von Datei fehlerhaft.".$_FILES["Datei"]["error"]);
     } 
 
     /* check if file is really there */
-    if (!file_exists("$file") or filesize("$file")==0) 
-        ende("Datenfile ($file) nicht im Ordner gefunden oder leer");
+    if (!file_exists($dir.$file.'.csv') or filesize($dir.$file.'.csv')==0) 
+        ende("Datenfile ($file.csv) nicht im Ordner gefunden oder leer");
 
     /* Zu diesem Zeitpunkt wurde der Artikel Importiert */
-    if (!$db->chkcol($table)) 
+    if (!$db->chkcol($file)) 
         ende("Importspalte konnte nicht angelegt werden");
 
     /* first check all elements */
@@ -94,7 +124,7 @@ if ($_POST["ok"]) {
     $_test["lagerplatz"]=$_POST["lagerplatz"];
 
     /* just print data or insert it, if test is false */
-    import_parts($db, $file, $trenner, $trennzeichen, $parts, FALSE, !$test, $_POST["show"],$_POST);
+    import_parts($db, $dir.$file, $trenner, $trennzeichen, $parts, FALSE, !$test, $_POST["show"],$_POST);
 
 } else {
     $bugrus=getAllBG($db);
@@ -131,7 +161,7 @@ if ($_POST["ok"]) {
 <tr><td>Test</td><td><input type="checkbox" name="test" value="1">ja</td></tr>
 <tr><td>Textupdate</td><td><input type="checkbox" name="TextUpd" value="1">ja</td></tr>
 <tr><td>Warengruppen<br>verbinder</td><td><input type="text" name="wgtrenner" value="!" size="3"></td></tr>
-<tr><td>Shopartikel,<br>falls Feld leer</td><td><input type="radio" name="shop" value="t">ja <input type="radio" name="shop" value="f" checked>nein</td></tr>
+<tr><td>Shopartikel<br />falls nicht &uuml;bergeben</td><td><input type="radio" name="shop" value="t">ja <input type="radio" name="shop" value="f" checked>nein</td></tr>
 <tr><td>Art</td><td><input type="Radio" name="ware" value="W" checked>Ware &nbsp; 
             <input type="Radio" name="ware" value="D">Dienstleistung
             <input type="Radio" name="ware" value="G">gemischt (Spalte 'art' vorhanden)</td></tr>
@@ -145,6 +175,16 @@ if ($_POST["ok"]) {
     <input type="radio" name="bugrufix" value="2">f&uuml;r Artikel ohne passende Bugru
     </td></tr>
 <tr><td>Daten</td><td><input type="file" name="Datei"></td></tr>
+<tr><td>Verwendete<br />Zeichecodierung</td><td>
+        <select name="encoding">
+        <option value="auto">Automatisch (versuchen)</option>
+        <option value="UTF-8">UTF-8</option>
+        <option value="ISO-8859-1">ISO-8859-1</option>
+        <option value="ISO-8859-15">ISO-8859-15</option>
+        <option value="Windows-1252">Windows-1252</option>
+        <option value="ASCII">ASCII</option>
+        </select>
+</td></tr>
 <tr><td></td><td><input type="submit" name="ok" value="Import"></td></tr>
 </table>
 </form>
index 2f0edd0..0107c39 100644 (file)
@@ -1,4 +1,4 @@
-<?
+<?php
 //Henry Margies <h.margies@maxina.de>
 //Holger Lindemann <hli@lx-system.de>
 
@@ -210,7 +210,7 @@ function import_parts($db, $file, $trenner, $trennzeichen, $fields, $check, $ins
     $parts_fld = array_keys($fields);
 
     /* open csv file */
-    $f=fopen("$file","r");
+    $f=fopen($file.'.csv',"r");
     
     /*
      * read first line with table descriptions
@@ -222,7 +222,7 @@ function import_parts($db, $file, $trenner, $trennzeichen, $fields, $check, $ins
         show("weight");     show("image");      show("partsgroup_id");
         show("bg");         show("income_accno"); show("expense_accno");
         show("inventory_accno"); show("microfiche");show("drawing");show("rop");
-        show("assembly");show("makemodel");show("shop");  show("");
+        show("assembly");show("makemodel");  show("shop"); show("");
         show("</tr>\n",false);
     }
 
@@ -250,8 +250,8 @@ function import_parts($db, $file, $trenner, $trennzeichen, $fields, $check, $ins
     while ( ($zeile=fgetcsv($f,120000,$trenner)) != FALSE) {
         $m++;    /* increase line */
         $unit=false;
-   
         unset($pgroup); 
+        unset($partsgroup_id); 
         unset($notes); 
         unset($rop);
         unset($weight);
@@ -274,15 +274,22 @@ function import_parts($db, $file, $trenner, $trennzeichen, $fields, $check, $ins
 
         /* Langtext zusammenbauen */
         if ($zeile[$fldpos["notes"]]) {
-            $notes = preg_replace('/""[^ ]/','"',$zeile[$fldpos["notes"]]);
-            $notes = addslashes($notes);
+            //Kundenspezifisch:
+            //$notes = preg_replace('/""[^ ]/','"',$zeile[$fldpos["notes"]]);
+            $notes = addslashes($zeile[$fldpos["notes"]]);
+            if (Translate) translate($notes);
         }
         if ($zeile[$fldpos["notes1"]]) {
-            $notes1 = preg_replace('/""[^ ]/','"',$zeile[$fldpos["notes1"]]);
+            //Kundenspezifisch:
+            //$notes1 = preg_replace('/""[^ ]/','"',$zeile[$fldpos["notes1"]]);
+            $notes1 = addslashes($zeile[$fldpos["notes1"]]);
+echo "!".$notes1."!<br>";
+            if (Translate) translate($notes1);
+echo "!".$notes1."!<br>";
             if ($notes) {
-                $notes = "\n".addslashes($notes1);
+                $notes .= "\n".$notes1;
             } else {
-                $notes = addslashes($notes1);
+                $notes = $notes1;
             }
         }
 
@@ -294,16 +301,21 @@ function import_parts($db, $file, $trenner, $trennzeichen, $fields, $check, $ins
         if ($fldpos["partsgroup4"]>0 and $zeile[$fldpos["partsgroup4"]]) $pgroup[]=$zeile[$fldpos["partsgroup4"]];
         if (count($pgroup)>0) {
                 $pgname = implode($wgtrenner,$pgroup);
+                if (Translate) translate($pgname);
                 $partsgroup_id = getPartsgroupId($db, $pgname, $insert);
         }
 
         /* sind Hersteller und Modelnummer hinterlegt 
             wenn ja, erfolgt er insert später */
         if (!empty($zeile[$fldpos["makemodel"]]) and !$artikel) { 
-            $hersteller=suchFirma("vendor",$zeile[$fldpos["makemodel"]]);
+            $mm = $zeile[$fldpos["makemodel"]];
+            if (Translate) translate($mm);
+            $hersteller=suchFirma("vendor",$mm);
             $hersteller=$hersteller["cp_cv_id"];
             if (!empty($zeile[$fldpos["model"]])) {
-                $model = $zeile[$fldpos["model"]];
+                $mo = $zeile[$fldpos["model"]];
+                if (Translate) translate($mo);
+                $model = $mo;
                 $makemodel = 't';
             } else { 
                 unset($hersteller);
@@ -378,6 +390,7 @@ function import_parts($db, $file, $trenner, $trennzeichen, $fields, $check, $ins
 
         $description = preg_replace('/""[^ ]/','"',$zeile[$fldpos["description"]]);
         $description = addslashes($description);
+        if (Translate) translate($description);
 
         // rop und weight müssen null oder Zahl sein
         if ($zeile[$fldpos["rop"]]) $rop = 1 * str_replace(",", ".",$zeile[$fldpos["rop"]]);
@@ -385,12 +398,13 @@ function import_parts($db, $file, $trenner, $trennzeichen, $fields, $check, $ins
 
         // Shop-Artikel
         if ($zeile[$fldpos["shop"]]) {
-                $shop = ($zeile[$fldpos["shop"]] > 0)?'t':'f';
+                $shop = (strtolower($zeile[$fldpos["shop"]]=='t'))?'t':'f';
         } else {
                 $shop = $maske["shop"];
         }
 
         // Artikel updaten
+
         if (getPartsid($db,trim($zeile[$fldpos["partnumber"]]))) {
             /* es gibt die Artikelnummer */
             if ($Update) {
index bc79db1..5bb41d6 100644 (file)
@@ -44,6 +44,8 @@ $db=$_SESSION["db"]; //new myDB($login);
 $crm=checkCRM();
 
 if ($_POST["ok"] == "Import") {
+    $dir = "../users/";
+
     $test=$_POST["test"];
     
     $shipto_fld = array_keys($shiptos);
@@ -54,28 +56,63 @@ if ($_POST["ok"] == "Import") {
     clearstatcache ();
 
     $trenner=($_POST["trenner"])?$_POST["trenner"]:",";
+    if ($trenner=="other") {
+        $trenner=trim($trennzeichen);
+        if (substr($trenner,0,1)=="#") if (strlen($trenner)>1) $trenner=chr(substr($trenner,1));
+    };
 
     if (!empty($_FILES["Datei"]["name"])) { 
         $file=$_POST["ziel"];
-        if (!move_uploaded_file($_FILES["Datei"]["tmp_name"],$file."_shipto.csv")) {
+        if (!move_uploaded_file($_FILES["Datei"]["tmp_name"],$dir.$file."_shipto.csv")) {
             $file=false;
             echo "Upload von ".$_FILES["Datei"]["name"]." fehlerhaft. (".$_FILES["Datei"]["error"].")<br>";
         } 
-    } else if (is_file($_POST["ziel"]."_shipto.csv")) {
+    } else if (is_file($dir.$_POST["ziel"]."_shipto.csv")) {
         $file=$_POST["ziel"];
     } else {
         $file=false;
     } 
     if (!$file) ende ("Kein Datenfile");
 
-    if (!file_exists($file."_shipto.csv")) ende($file."_shipto.csv nicht im Ordner gefunden oder leer");
+    if (!file_exists($dir.$file."_shipto.csv")) ende($file."_shipto.csv nicht im Ordner gefunden oder leer");
 
     $employee=chkUsr($_SESSION["employee"]);
     if (!$employee) ende("Benutzer unbekannt");
 
     if (!$db->chkcol($file)) ende("Importspalte konnte nicht angelegt werden");
+    //Zeichencodierung des Servers
+    $tmpcode = $db->getServerCode();
+    //Leider sind die Benennungen vom Server anders als von mb_detect_encoding
+    if ($tmpcode == "UTF8") {
+         define("ServerCode","UTF-8");
+    } else if ($tmpcode == "LATIN9") {
+         define("ServerCode","ISO-8859-15");
+    } else if ($tmpcode == "LATIN1") {
+         define("ServerCode","ISO-8859-1");
+    } else {
+         define("ServerCode",$tmpcode);
+    }
+    //Zeichensatz sollte gleich sein, sonst ist die Datenkonvertierung nutzlos
+    //DB und LxO müssen ja nicht auf der gleichen Maschiene sein.
+    if($tmpcode<>$db->getClientCode()) {
+        $rc = $db->setClientCode($tmpcode);
+    }
+
+    // Zeichenkodierung File
+    if ($_POST["encoding"] == "auto") {
+         define("Auto",true);
+         define("Translate",true);
+    } else {
+         define("Auto",false);
+         if ($_POST["encoding"] == ServerCode) {
+            define("Translate",false);
+         } else {
+            define("Translate",true);
+            define("FileCode",$_POST["encoding"]);
+         }
+    }
 
-    $f=fopen($file."_shipto.csv","r");
+    $f=fopen($dir.$file."_shipto.csv","r");
     $zeile=fgetcsv($f,1000,$trenner);
     $first=true;
 
@@ -85,7 +122,7 @@ if ($_POST["ok"] == "Import") {
     }
     $j=0;
     $n=0;
-    $prenumber=$_POST["prenumber"];
+    //$prenumber=$_POST["prenumber"];
     $zeile=fgetcsv($f,1000,$trenner);
 
     while (!feof($f)){
@@ -116,6 +153,7 @@ if ($_POST["ok"] == "Import") {
             }
             if ($in_fld[$i]=="firma") {
                 if ($id) continue;
+                if (Translate) translate($data);
                 $data=suchFirma($file,$data);
                 if ($data) {
                     $id=$data["cp_cv_id"];
@@ -127,9 +165,10 @@ if ($_POST["ok"] == "Import") {
             if ($data==false or empty($data) or !$data) {
                             $vals.="null,";
             } else {
-                   if (in_array($in_fld[$i],array("shiptofax","shiptophone"))) {
+                /*if (in_array($in_fld[$i],array("shiptofax","shiptophone"))) {
                     $data=$prenumber.$data;
-                } 
+                } */
+                if (Translate) translate($data);
                 $vals.="'".$data."',";
                 // bei jedem gefuellten Datenfeld erhoehen
                 $val_count++;
@@ -167,10 +206,27 @@ if ($_POST["ok"] == "Import") {
 <table>
 <tr><td></td><td><input type="submit" name="ok" value="Hilfe"></td></tr>
 <tr><td>Zieltabelle</td><td><input type="radio" name="ziel" value="customer" checked>customer <input type="radio" name="ziel" value="vendor">vendor</td></tr>
-<tr><td>Trennzeichen</td><td><input type="text" size="2" maxlength="1" name="trenner" value=";"></td></tr>
-<tr><td>Telefonvorwahl</td><td><input type="text" size="4" maxlength="10" name="prenumber" value=""></td></tr>
+<tr><td>Trennzeichen</td><td>
+        <input type="radio" name="trenner" value=";" checked>Semikolon
+        <input type="radio" name="trenner" value=",">Komma
+        <input type="radio" name="trenner" value="#9" checked>Tabulator
+        <input type="radio" name="trenner" value=" ">Leerzeichen
+        <input type="radio" name="trenner" value="other">
+        <input type="text" size="2" name="trennzeichen" value="">
+</td></tr>
+<!--tr><td>Telefonvorwahl</td><td><input type="text" size="4" maxlength="10" name="prenumber" value=""></td></tr-->
 <tr><td>Test</td><td><input type="checkbox" name="test" value="1">ja</td></tr>
 <tr><td>Daten</td><td><input type="file" name="Datei"></td></tr>
+<tr><td>Verwendete<br />Zeichecodierung</td><td>
+        <select name="encoding">
+        <option value="auto">Automatisch (versuchen)</option>
+        <option value="UTF-8">UTF-8</option>
+        <option value="ISO-8859-1">ISO-8859-1</option>
+        <option value="ISO-8859-15">ISO-8859-15</option>
+        <option value="Windows-1252">Windows-1252</option>
+        <option value="ASCII">ASCII</option>
+        </select>
+</td></tr>
 <tr><td></td><td><input type="submit" name="ok" value="Import"></td></tr>
 </table>
 </form>
diff --git a/sql/Pg-upgrade2/SKR04-3804-addition.pl b/sql/Pg-upgrade2/SKR04-3804-addition.pl
new file mode 100644 (file)
index 0000000..ccea7e9
--- /dev/null
@@ -0,0 +1,136 @@
+# @tag: SKR04-3804-addition
+# @description: Konto 3804 zu SKR04 hinzufügen: Umsatzsteuer 19% für Steuerschlüssel 13 (Umsatzsteuer aus EG-Erwerb)
+# @depends:
+# @charset: UTF-8
+
+use strict;
+
+die("This script cannot be run from the command line.") unless ($main::form);
+
+sub mydberror {
+  my ($msg) = @_;
+  die($dbup_locale->text("Database update error:") . "<br>$msg<br>" . $DBI::errstr);
+}
+
+sub do_query {
+  my ($query, $may_fail) = @_;
+
+  if (!$dbh->do($query)) {
+    mydberror($query) unless ($may_fail);
+    $dbh->rollback();
+    $dbh->begin_work();
+  }
+}
+
+
+sub do_update {
+
+  # 1. Überprüfen ob Kontenrahmen SKR04 ist, wenn nicht alles überspringen
+  my ($kontenrahmen) = $dbh->selectrow_array("select coa from defaults");
+
+  unless ( $kontenrahmen eq 'Germany-DATEV-SKR04EU' ) {
+    print "Kontenrahmen ist nicht SKR04, überspringen<br>";
+    return 1;
+  };
+
+  # Mandant hat SKR04, erst prüfen wir, ob in der Vergangenheit Buchungen mit
+  # taxkey 13 erfolgt sind (Fall "EU ohne USt. ID), diese sind wahrscheinlich
+  # mit der falschen MwSt (16%) gebucht worden, wenn dies nicht manuell
+  # geändert worden ist
+
+  my ($anzahl_buchungen) = $dbh->selectrow_array("select count (*) from acc_trans where taxkey=13 and transdate >= '2007-01-01';");
+  if ( $anzahl_buchungen > 0 ) {
+    if ($main::form->{bookings_exist} ) {
+      # Benutzer hat Meldung bestätigt
+      print "Buchungen nach dem 01.01.2007 existierten, Upgrade überspringen";
+      return 1;  
+    } else {
+      # Meldung anzeigen und auf Rückgabe warten
+      print_past_booking_warning();
+      return 2;
+    };
+  } else {  # es gibt keine Buchungen mit taxkey 13 nach 01.01.2007
+  
+    # prüfen ob Konto 3804 schon existiert
+    my ($konto_existiert) = $dbh->selectrow_array("select count (*) from chart where accno = '3804'");
+    if ( $konto_existiert ) {
+      # 3804 existiert, wir gehen davon aus, daß der Benutzer das Konto schon selber angelegt hat und
+      # ordnungsgemäß benutzt
+
+      if ($main::form->{account_exists} ) {
+      # Benutzer hat Meldung bestätigt
+        print "Konto existiert, Upgrade überspringen\n";
+        return 1;  
+      } else {
+        # Meldung anzeigen und auf Rückgabe warten
+        print_3804_already_exists();
+        return 2;
+      };
+    } else {
+
+    # noch keine Buchungen mit taxkey 13 und Konto 3804 existiert noch nicht,
+    # also legen wir es an und machen noch die nötigen Einstellungen in tax und
+    # taxkeys
+
+        my $insert_chart = <<SQL;
+INSERT INTO chart (
+  accno, description,
+  charttype,   category,  link,
+  taxkey_id, pos_eur
+  )
+SELECT
+  '3804','Umsatzsteuer aus EG-Erwerb 19%',
+  'A','I','AR_tax:IC_taxpart:IC_taxservice',
+  0, (select pos_eur from chart where accno = '3803')
+WHERE EXISTS ( -- update only for SKR04, aber eigentlich schon überprüft
+    SELECT coa FROM defaults
+    WHERE defaults.coa='Germany-DATEV-SKR04EU'
+);
+SQL
+
+        do_query($insert_chart);
+
+        my $konto_anlegen = $dbh->prepare($insert_chart) || mydberror($insert_chart);
+
+
+        # 13-1 (16%) korrigieren:
+        my $edit_taxkey_13 = qq|UPDATE tax SET taxdescription = 'Steuerpflichtige EG-Lieferung zum vollen Steuersatz', rate = '0.16', chart_id = (select id FROM chart where accno = '3803'), taxnumber = 3803 WHERE taxkey = '13'|;
+        do_query($edit_taxkey_13);
+
+        # Sicherstellen, daß 3803 die richtige Bezeichnung hat
+        my $update_3803 = qq|update chart set description = 'Umsatzsteuer aus EG-Erwerb 16%' where accno = '3803'|;
+        do_query($update_3803);
+
+        # Zweiter  Eintrag für taxkey 13 in key: 19%
+        my $insert_taxkey_13_2 = qq|INSERT INTO tax ( taxkey, taxdescription, rate, chart_id, taxnumber ) VALUES ('13', 'Steuerpflichtige EG-Lieferung zum vollen Steuersatz', '0.19', (select id from chart where accno = '3804'), '3804')|;
+
+        do_query($insert_taxkey_13_2);
+
+        # alle Konten finden, bei denen 3803 das Steuerautomatikkonto ist,
+        # und dort den zweiten Eintrag ab 1.1.2007 für 19% einstellen
+        my $sth_query  = $dbh->prepare(qq|select c.id from chart c join taxkeys t on (c.id = t.chart_id) where tax_id = (select id from tax where taxnumber = '3803')|);
+        my $sth_insert = $dbh->prepare(qq|INSERT INTO taxkeys ( taxkey_id, chart_id, tax_id, pos_ustva, startdate )
+                                                       VALUES (13, ?, (select id from tax where taxkey = 13 and rate = '0.19'),
+            (select pos_ustva from taxkeys where tax_id = (select id from tax where taxnumber = '3803') and pos_ustva > 0 limit 1),
+            '01.01.2007')|);
+        $sth_query->execute();
+
+        while (my $ref = $sth_query->fetchrow_hashref()) {
+          $sth_insert->execute($ref->{id});
+        }
+        $sth_query->finish();
+        $sth_insert->finish();
+
+      }; # end code update
+  }; # end check if 3804 exists
+
+}; # end do_update
+
+sub print_past_booking_warning {
+  print $main::form->parse_html_template("dbupgrade/SKR04_3804_update");
+};
+sub print_3804_already_exists {
+  print $main::form->parse_html_template("dbupgrade/SKR04_3804_already_exists");
+};
+
+return do_update();
index e8588dc..91e3b9c 100644 (file)
@@ -1,7 +1,7 @@
 \documentclass[twoside]{scrartcl}
 \usepackage[frame]{xy}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \usepackage{graphicx}
 \setlength{\voffset}{0.5cm}
 \setlength{\hoffset}{-2.0cm}
index 38069dc..6086d45 100644 (file)
@@ -1,7 +1,7 @@
 \documentclass[twoside]{scrartcl}
 \usepackage[frame]{xy}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \setlength{\voffset}{0.4cm}
 \setlength{\hoffset}{-2.0cm}
 \setlength{\topmargin}{0cm}
@@ -58,7 +58,7 @@
 \vspace{0.5cm}
 \begin{tabularx}{\textwidth}{lXrr@{}}
 \textbf{Rechnung} & \textbf{Ausgestellt}
-  & \textbf{Fällig} & \textbf{Verrechnet} \\
+  & \textbf{Fällig} & \textbf{Verrechnet} \\
 <%foreach invnumber%>
 <%invnumber%> & <%invdate%> \dotfill
   & <%due%> & <%paid%> \\
index 959e97c..8236f37 100644 (file)
@@ -2,7 +2,7 @@
 \usepackage{eurosym}
 \usepackage{tabularx}
 \usepackage{ifthen}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \begin{document}
 
 \setlength{\parindent}{0cm}
index 6e02429..ebf304d 100644 (file)
@@ -2,7 +2,7 @@
 \usepackage{eurosym}
 \usepackage{tabularx}
 \usepackage{ifthen}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \begin{document}
 
 \setlength{\parindent}{0cm}
@@ -65,7 +65,7 @@ Ihre Bestellung <%cusordnumber%> vom <%orddate%>
 
 Sehr geehrte Damen und Herren,
 
-für unsere erbrachten Lieferungen und Leistungen erlauben wir uns,
+für unsere erbrachten Lieferungen und Leistungen erlauben wir uns,
 folgende Positionen in Rechnung zu stellen.
 
 \vspace{0.5cm}
@@ -89,7 +89,7 @@ folgende Positionen in Rechnung zu stellen.
 
 \vspace{1cm}
 \ifthenelse{\equal{<%deliverydate%>}{}}{Das Leistungsdatum entspricht, soweit nicht anders angegeben, dem Rechnungsdatum.}{Liefertermin: <%deliverydate%>} \\
-Zahlbar bis <%terms%> <%invtotal%> \euro\ ohne Abzüge.
+Zahlbar bis <%terms%> <%invtotal%> \euro\ ohne Abzüge.
 
 \end{document}
 
index c5360b9..0a568fc 100644 (file)
@@ -1,6 +1,6 @@
 \documentclass[twoside]{scrartcl}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \begin{document}
 
 \thispagestyle{empty}
@@ -70,7 +70,7 @@ Liefertermin: <%deliverydate%>
 
 \vspace{0.5cm}
 
-Oben angeführte Positionen vollständig und ohne Mängel erhalten:
+Oben angeführte Positionen vollständig und ohne Mängel erhalten:
 \vspace*{2.5cm} \\
 \parbox[t]{6cm}{
   \underline{\hspace*{6cm}}\\
index c92c1ea..d560e06 100644 (file)
@@ -1,7 +1,7 @@
 \documentclass[twoside]{scrartcl}
 \usepackage[frame]{xy}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \usepackage{graphicx}
 \setlength{\voffset}{0.5cm}
 \setlength{\hoffset}{-2.0cm}
index 9994519..715bd1b 100644 (file)
@@ -1,7 +1,7 @@
 \documentclass[twoside]{scrartcl}
 \usepackage{eurosym}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \begin{document}
 
 \thispagestyle{empty}
index 38069dc..6086d45 100644 (file)
@@ -1,7 +1,7 @@
 \documentclass[twoside]{scrartcl}
 \usepackage[frame]{xy}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \setlength{\voffset}{0.4cm}
 \setlength{\hoffset}{-2.0cm}
 \setlength{\topmargin}{0cm}
@@ -58,7 +58,7 @@
 \vspace{0.5cm}
 \begin{tabularx}{\textwidth}{lXrr@{}}
 \textbf{Rechnung} & \textbf{Ausgestellt}
-  & \textbf{Fällig} & \textbf{Verrechnet} \\
+  & \textbf{Fällig} & \textbf{Verrechnet} \\
 <%foreach invnumber%>
 <%invnumber%> & <%invdate%> \dotfill
   & <%due%> & <%paid%> \\
index ef78290..f651750 100644 (file)
@@ -3,7 +3,7 @@
 \usepackage{tabularx}
 \usepackage{graphicx}
 \usepackage{german}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \setlength{\voffset}{0.5cm}
 \setlength{\hoffset}{-2.0cm}
 \setlength{\topmargin}{0cm}
@@ -138,7 +138,7 @@ Fax: <%shiptofax%>
 \vspace{1cm}
 
 \begin{tabularx}{\textwidth}{*{6}{|X}|} \hline
-  \textbf{AnfrageNr. \#} & \textbf{Datum} & \textbf{Benötigt am} & \textbf{Kontakt} & \textbf{Lagerplatz} & \textbf{Lieferung mit} \\ [0.5ex]
+  \textbf{AnfrageNr. \#} & \textbf{Datum} & \textbf{Benötigt am} & \textbf{Kontakt} & \textbf{Lagerplatz} & \textbf{Lieferung mit} \\ [0.5ex]
   \hline
   <%quonumber%> & <%quodate%> & <%reqdate%> & <%employee%> & <%shippingpoint%> & <%shipvia%> \\
   \hline
@@ -146,7 +146,7 @@ Fax: <%shiptofax%>
 
 \vspace{1cm}
 
-Bitte nennen Sie uns für folgende Artikel Preis und Liefertermin:
+Bitte nennen Sie uns für folgende Artikel Preis und Liefertermin:
 
 \vspace{1cm}
 
diff --git a/templates/German-sales_delivery_order.tex b/templates/German-sales_delivery_order.tex
new file mode 100644 (file)
index 0000000..d2ecab2
--- /dev/null
@@ -0,0 +1,78 @@
+\documentclass[twoside]{scrartcl}
+\usepackage{eurosym}
+\usepackage{tabularx}
+\usepackage{ifthen}
+\usepackage[utf8]{inputenc}
+\begin{document}
+
+\setlength{\parindent}{0cm}
+
+\pagestyle{empty}
+
+\newlength{\descrwidth}\setlength{\descrwidth}{10cm}
+
+\fontfamily{cmss}\fontshape{n}\selectfont
+
+<%pagebreak 80 28 37%>
+\end{tabularx}
+
+\newpage
+
+\begin{tabularx}{\textwidth}{lrXrr}
+  \hline
+  \textbf{Pos} & \textbf{Menge} & \textbf{Bezeichnung} &
+  \textbf{E-Preis/\euro} & \textbf{G-Preis/\euro} \\
+  \hline
+<%end pagebreak%>
+
+\fontfamily{cmss}\fontsize{10pt}{12pt}\selectfont
+
+\vspace*{1.5cm}
+
+\begin{minipage}{8cm}
+  <%name%>
+
+  <%street%>
+
+  <%zipcode%> <%city%>
+
+  <%country%>
+\end{minipage}
+\hfill
+\begin{minipage}{6cm}
+  \rightline{\LARGE\textbf{\textit{Lieferschein}}} \vspace*{0.2cm}
+  \rightline{\large\textbf{\textit{Nr. <%donumber%>% \vspace*{0.2cm}
+  }}}
+
+  Lieferscheindatum:\hfill <%dodate%>
+
+  Kunden-Nr:\hfill <%customernumber%>
+
+  Telefon:\hfill <%phone%>
+
+  Telefax:\hfill <%fax%>
+
+  Ansprechpartner:\hfill <%employee%>
+\end{minipage}
+
+\vspace*{0.5cm}
+
+\begin{tabular*}{\textwidth}{@{}lp{\descrwidth}@{\extracolsep\fill}rl@{}}
+  \textbf{Nummer} & \textbf{Artikel} & \textbf{Anz} & \textbf{Einh}  \\
+
+<%foreach number%>
+  <%number%> & <%description%> & <%qty%> & <%unit%>   \\
+    & <%serialnumber%>  & & \\
+<%end number%>
+\end{tabular*}
+
+\vspace{1cm}
+<%if deliverydate%>
+        Die Auslieferung/Fertigstellung erfolgte am : <%deliverydate%>
+<%end if%>
+<%if notes%>
+  <%notes%>
+<%end if%>
+
+\end{document}
+
index bbc86b1..f4b43a7 100644 (file)
@@ -1,7 +1,7 @@
 \documentclass[twoside]{scrartcl}
 \usepackage{eurosym}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \begin{document}
 
 \thispagestyle{empty}
@@ -42,7 +42,7 @@
 \end{minipage}
 \hfill
 \begin{minipage}{6cm}
-  \rightline{\LARGE\textbf{\textit{Auftragsbestätigung}}} \vspace*{0.2cm}
+  \rightline{\LARGE\textbf{\textit{Auftragsbestätigung}}} \vspace*{0.2cm}
   \rightline{\large\textbf{\textit{Nr. <%ordnumber%>%
   }}} \vspace*{0.2cm}
 
@@ -82,7 +82,7 @@
 
 \vspace{1cm}
 Vereinbarter Liefertermin: <%reqdate%> \\ \\
-\textit{Bitte kontrollieren Sie alle Positionen auf Übereinstimmung
+\textit{Bitte kontrollieren Sie alle Positionen auf Übereinstimmung
   mit Ihrer Bestellung! Abweichungen teilen Sie innerhalb von 3 Tagen
   mit!} \\ \\
 
index 487e4a1..8fdbace 100644 (file)
@@ -1,7 +1,7 @@
 \documentclass[twoside]{scrartcl}
 \usepackage{eurosym}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \begin{document}
 
 \thispagestyle{empty}
 
 \vspace{0.2cm}
 
-Wir danken für Ihre Anfrage und hoffen, Ihnen hiermit ein interessantes Angebot gemacht zu haben. Das Angebot ist
-  gültig bis zum <%reqdate%>. Sollten Sie noch Fragen oder Änderungswünsche haben, können Sie uns gerne jederzeit
+Wir danken für Ihre Anfrage und hoffen, Ihnen hiermit ein interessantes Angebot gemacht zu haben. Das Angebot ist
+  gültig bis zum <%reqdate%>. Sollten Sie noch Fragen oder Änderungswünsche haben, können Sie uns gerne jederzeit
   unter den oben genannten Telefonnummern oder eMail-Adressen kontaktieren. \\
-  Bei der Durchführung des Auftrags gelten unsere AGB, die wir Ihnen gerne zuschicken. \\ \\
-  Mit freundlichen Grüßen, \\ \\ \\
+  Bei der Durchführung des Auftrags gelten unsere AGB, die wir Ihnen gerne zuschicken. \\ \\
+  Mit freundlichen Grüßen, \\ \\ \\
   <%employee_name%>
 
 
index 80af31a..f2d0e49 100644 (file)
@@ -1,7 +1,7 @@
 \documentclass[twoside]{scrartcl}
 \usepackage[frame]{xy}
 \usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \setlength{\voffset}{0.5cm}
 \setlength{\hoffset}{-2.0cm}
 \setlength{\topmargin}{0cm}
index 405df9e..2444c27 100644 (file)
@@ -12,8 +12,8 @@
 \usepackage{tabularx}
 \usepackage{times, german}
 \usepackage{german}
-\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
-\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
+\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
+\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
 \setlength{\topmargin}{0cm}
 \setlength{\headheight}{0cm}
 \setlength{\headsep}{0cm}
index 7080cf4..f7fd185 100644 (file)
@@ -12,8 +12,8 @@
 \usepackage{tabularx}
 \usepackage{times, german}
 \usepackage{german}
-\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
-\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
+\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
+\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
 \setlength{\topmargin}{0cm}
 \setlength{\headheight}{0cm}
 \setlength{\headsep}{0cm}
index 5fb8b0e..213f3cb 100644 (file)
@@ -12,8 +12,8 @@
 \usepackage{tabularx}
 \usepackage{times, german}
 \usepackage{german}
-\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
-\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
+\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
+\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
 \setlength{\topmargin}{0cm}
 \setlength{\headheight}{0cm}
 \setlength{\headsep}{0cm}
index 3de588a..82e6976 100644 (file)
@@ -12,8 +12,8 @@
 \usepackage{tabularx}
 \usepackage{times, german}
 \usepackage{german}
-\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
-\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
+\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
+\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
 \setlength{\topmargin}{0cm}
 \setlength{\headheight}{0cm}
 \setlength{\headsep}{0cm}
index d16f2be..506773c 100644 (file)
@@ -12,8 +12,8 @@
 \usepackage{tabularx}
 \usepackage{times, german}
 \usepackage{german}
-\setlength{\voffset}{-0.7cm} %hier wird die Höhenverschiebung getätigt
-\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
+\setlength{\voffset}{-0.7cm} %hier wird die Höhenverschiebung getätigt
+\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
 \setlength{\topmargin}{0cm}
 \setlength{\headheight}{0cm}
 \setlength{\headsep}{0cm}
index 0a51be9..e5481e4 100644 (file)
@@ -12,8 +12,8 @@
 \usepackage{tabularx}
 \usepackage{times, german}
 \usepackage{german}
-\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
-\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
+\setlength{\voffset}{-0.8cm} %hier wird die Höhenverschiebung getätigt
+\setlength{\hoffset}{-1cm}  %und hier die Verschiebung seitwärts
 \setlength{\topmargin}{0cm}
 \setlength{\headheight}{0cm}
 \setlength{\headsep}{0cm}
old mode 100755 (executable)
new mode 100644 (file)
index 0469b91..679f6bd
@@ -1,5 +1,5 @@
 \documentclass[10pt, oneside]{scrartcl}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \usepackage{german}
 \usepackage{tabularx}
 \usepackage{xspace}
@@ -46,7 +46,7 @@
 \textbf{Zahlungserinnerung} \\ \\ \\
 \normalsize
 Sehr geehrte Damen und Herren, \\ \\ \\
-man kann seine Augen nicht überall haben - offensichtlich haben Sie übersehen, die folgenden Rechnungen zu begleichen: \\
+man kann seine Augen nicht überall haben - offensichtlich haben Sie übersehen, die folgenden Rechnungen zu begleichen: \\
 \vspace{0.5cm} \\
 \begin{tabularx}{\textwidth}{l@{\hspace*{2cm}}X@{\hspace*{0.5cm}}r}
   \textbf{Rechnungsnummer} & \textbf{Rechnungsdatum} & \textbf{Rechnungsbetrag} \\ \hline && \\
@@ -56,7 +56,7 @@ man kann seine Augen nicht 
 \end{tabularx}
 \vspace*{0.5cm} \\
 Wir bitten Sie, diese bis zum <%dunning_duedate%> zu begleichen. \\ \\ \\
-Bitte beachten Sie, dass wir Zahlungseingänge nur bis zum <%dunning_date%> berücksichtigen konnten. Sollten Sie zwischenzeitlich bezahlt haben, betrachten Sie diese Zahlungserinnerung bitte als gegenstandslos. \\ \\ \\
-Mit freundlichen Grüßen, \\ \\ \\ \\
+Bitte beachten Sie, dass wir Zahlungseingänge nur bis zum <%dunning_date%> berücksichtigen konnten. Sollten Sie zwischenzeitlich bezahlt haben, betrachten Sie diese Zahlungserinnerung bitte als gegenstandslos. \\ \\ \\
+Mit freundlichen Grüßen, \\ \\ \\ \\
 <%employee_name%>
-\end{document}
\ No newline at end of file
+\end{document}
index 593c81b..bc5cfa6 100644 (file)
@@ -1,5 +1,5 @@
 \documentclass[10pt, oneside]{scrartcl}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
 \usepackage{german}
 \usepackage{tabularx}
 \usepackage{xspace}
@@ -55,7 +55,7 @@ Hiermit stellen wir Ihnen zu Mahnung <%dunning_id%> die folgenden Posten in Rech
 \begin{tabularx}{\textwidth}{Xr}
   \textbf{Posten} & \multicolumn{1}{l}{\textbf{Betrag}}\\
   \hline
-  Mahngebühren & <%fee%> EUR \\
+  Mahngebühren & <%fee%> EUR \\
   Zinsen & <%interest%> EUR \\
   \cline{2-2}
   Gesamtsumme & <%invamount%> EUR\\
@@ -67,7 +67,7 @@ Bitte begleichen Sie diese Forderung bis zum <%duedate%>.
 
 \vspace*{0.5cm}
 
-Mit freundlichen Grüßen,
+Mit freundlichen Grüßen,
 
 \vspace*{2cm}
 <%employee_name%>
diff --git a/templates/webpages/dbupgrade/SKR04_3804_already_exists_de.html b/templates/webpages/dbupgrade/SKR04_3804_already_exists_de.html
new file mode 100644 (file)
index 0000000..7c2ecd0
--- /dev/null
@@ -0,0 +1,11 @@
+[% USE HTML %]<div class="listtop">Update SKR04: neues Steuerkonto 3804 (19%) für innergemeinschaftlichen Erwerb</div>
+
+<form action="[% script %]" method="POST">
+
+<p>Das Konto 3804 existiert schon, das Update wird übersprungen.</p>
+<p>Bitte lesen Sie die Dateidoc/skr04-update-3804/skr04_3804_hinzufuegen.html.
+
+<input type="hidden" name="account_exists" value="1">
+<input type="submit" value="Weiter">
+
+
diff --git a/templates/webpages/dbupgrade/SKR04_3804_already_exists_master.html b/templates/webpages/dbupgrade/SKR04_3804_already_exists_master.html
new file mode 100644 (file)
index 0000000..ba36b3e
--- /dev/null
@@ -0,0 +1,11 @@
+[% USE HTML %]<div class="listtop"><translate>Update SKR04: new tax account 3804 (19%)</translate></div>
+
+<form action="[% script %]" method="POST">
+
+<p><translate>The account 3804 already exists, the update will be skipped.</translate></p>
+<p><translate>Please read the file</translate>doc/skr04-update-3804/skr04_3804_hinzufuegen.html.
+
+<input type="hidden" name="account_exists" value="1">
+<input type="submit" value="<translate>Continue</translate>">
+
+
diff --git a/templates/webpages/dbupgrade/SKR04_3804_update_de.html b/templates/webpages/dbupgrade/SKR04_3804_update_de.html
new file mode 100644 (file)
index 0000000..2641022
--- /dev/null
@@ -0,0 +1,12 @@
+[% USE HTML %]<div class="listtop">Update SKR04: neues Steuerkonto 3804 (19%) für innergemeinschaftlichen Erwerb</div>
+
+<form action="[% script %]" method="POST">
+
+<p>Das Konto 3803 wurde nach dem 01.01.2007 bebucht. Falls Sie dieses Konto nicht manuell auf 19% gestellt haben sind die Buchungen wahrscheinlich mit falscher Umsatzsteuer gebucht worden.</p>
+<p>Das Konto 3804 wird nicht automatisch hinzugefügt.</p>
+<p>Bitte lesen Sie die Dateidoc/skr04-update-3804/skr04_3804_hinzufuegen.html</p>
+
+<input type="hidden" name="bookings_exist" value="1">
+<input type="submit" value="Weiter">
+
+
diff --git a/templates/webpages/dbupgrade/SKR04_3804_update_master.html b/templates/webpages/dbupgrade/SKR04_3804_update_master.html
new file mode 100644 (file)
index 0000000..b706a83
--- /dev/null
@@ -0,0 +1,12 @@
+[% USE HTML %]<div class="listtop"><translate>Update SKR04: new tax account 3804 (19%)</translate></div>
+
+<form action="[% script %]" method="POST">
+
+<p><translate>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.</translate></p>
+<p><translate>The account 3804 will not be added automatically.</translate></p>
+<p><translate>Please read the file</translate>doc/skr04-update-3804/skr04_3804_hinzufuegen.html</p>
+
+<input type="hidden" name="bookings_exist" value="1">
+<input type="submit" value="<translate>Continue</translate>">
+
+