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;
$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 =
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 :
$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 =
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")) {
}
$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();
# 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) {
$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;
@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"}),
return $exchangerate;
}
-sub get_default_currency {
+sub get_all_currencies {
$main::lxdebug->enter_sub();
my ($self, $myconfig) = @_;
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();
$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} || [] }) {
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>
|;
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);
}
$exchangerate = qq| |;
- 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"}|;
$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",
$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}) {
$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",
my $form = $main::form;
my %myconfig = %main::myconfig;
- my ($duedate, $taxincluded, @curr);
+ my ($duedate, $taxincluded);
$form->create_links("AR", \%myconfig, "customer");
$duedate = $form->{duedate};
$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} || [] }) {
$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>
</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);
}
$exchangerate = qq| |;
- 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"}|;
$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!'));
}
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});
$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!'));
}
$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();
}
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));
# 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};
}
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);
}
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
--- /dev/null
+<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>
'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ü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ä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',
'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte überprü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 "config/authentication.pl" does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => 'Die Konfigurationsdatei für die Authentifizierung "config/authentication.pl" wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollständig aktualisiert oder eingerichtet. Bitte wenden Sie sich an Ihren Administrator.',
'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ält momentan keine Einträge.',
'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?',
'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',
'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.',
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;
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");
$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;
$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
} 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;
<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>
$crm=checkCRM();
if ($_POST["ok"]) {
+ $dir = "../users/";
+
$test=$_POST["test"];
if ($crm) {
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;
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;
}
$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"];
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) {
<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>
} 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;
+ }
}
?>
"partsgroup2" => "3.Warengruppenbezeichnung",
"partsgroup3" => "4.Warengruppenbezeichnung",
"partsgroup4" => "5.Warengruppenbezeichnung",
+ "shop" => "Shopexport vorghesehen",
);
$contactscrm = array(
$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);
+ }
+}
?>
/* 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") {
$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 */
$_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);
<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 ü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
<input type="Radio" name="ware" value="D">Dienstleistung
<input type="Radio" name="ware" value="G">gemischt (Spalte 'art' vorhanden)</td></tr>
<input type="radio" name="bugrufix" value="2">fü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>
-<?
+<?php
//Henry Margies <h.margies@maxina.de>
//Holger Lindemann <hli@lx-system.de>
$parts_fld = array_keys($fields);
/* open csv file */
- $f=fopen("$file","r");
+ $f=fopen($file.'.csv',"r");
/*
* read first line with table descriptions
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);
}
while ( ($zeile=fgetcsv($f,120000,$trenner)) != FALSE) {
$m++; /* increase line */
$unit=false;
-
unset($pgroup);
+ unset($partsgroup_id);
unset($notes);
unset($rop);
unset($weight);
/* 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;
}
}
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);
$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"]]);
// 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) {
$crm=checkCRM();
if ($_POST["ok"] == "Import") {
+ $dir = "../users/";
+
$test=$_POST["test"];
$shipto_fld = array_keys($shiptos);
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;
}
$j=0;
$n=0;
- $prenumber=$_POST["prenumber"];
+ //$prenumber=$_POST["prenumber"];
$zeile=fgetcsv($f,1000,$trenner);
while (!feof($f)){
}
if ($in_fld[$i]=="firma") {
if ($id) continue;
+ if (Translate) translate($data);
$data=suchFirma($file,$data);
if ($data) {
$id=$data["cp_cv_id"];
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++;
<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>
--- /dev/null
+# @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();
\documentclass[twoside]{scrartcl}
\usepackage[frame]{xy}
\usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\setlength{\voffset}{0.5cm}
\setlength{\hoffset}{-2.0cm}
\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}
\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%> \\
\usepackage{eurosym}
\usepackage{tabularx}
\usepackage{ifthen}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\begin{document}
\setlength{\parindent}{0cm}
\usepackage{eurosym}
\usepackage{tabularx}
\usepackage{ifthen}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\begin{document}
\setlength{\parindent}{0cm}
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}
\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}
\documentclass[twoside]{scrartcl}
\usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\begin{document}
\thispagestyle{empty}
\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}}\\
\documentclass[twoside]{scrartcl}
\usepackage[frame]{xy}
\usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\setlength{\voffset}{0.5cm}
\setlength{\hoffset}{-2.0cm}
\documentclass[twoside]{scrartcl}
\usepackage{eurosym}
\usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\begin{document}
\thispagestyle{empty}
\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}
\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%> \\
\usepackage{tabularx}
\usepackage{graphicx}
\usepackage{german}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\setlength{\voffset}{0.5cm}
\setlength{\hoffset}{-2.0cm}
\setlength{\topmargin}{0cm}
\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
\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}
--- /dev/null
+\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}
+
\documentclass[twoside]{scrartcl}
\usepackage{eurosym}
\usepackage{tabularx}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\begin{document}
\thispagestyle{empty}
\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}
\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!} \\ \\
\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%>
\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}
\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}
\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}
\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}
\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}
\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}
\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}
\documentclass[10pt, oneside]{scrartcl}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\usepackage{german}
\usepackage{tabularx}
\usepackage{xspace}
\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 && \\
\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}
\documentclass[10pt, oneside]{scrartcl}
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\usepackage{german}
\usepackage{tabularx}
\usepackage{xspace}
\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\\
\vspace*{0.5cm}
-Mit freundlichen Grüßen,
+Mit freundlichen Grüßen,
\vspace*{2cm}
<%employee_name%>
--- /dev/null
+[% 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">
+
+
--- /dev/null
+[% 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>">
+
+
--- /dev/null
+[% 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">
+
+
--- /dev/null
+[% 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>">
+
+