Merge branch 'master' into develop.1.8

This commit is contained in:
OpenXE 2023-03-13 12:51:38 +01:00
commit 3f135f6852
28 changed files with 11113 additions and 9607 deletions

View File

@ -34,7 +34,7 @@ if(empty($app->remote)) {
$app->remote = new Remote($app);
}
}
$app->erp->LogFile("Starte Synchronisation");
$app->erp->LogFile("Lagerzahlen-Synchronisation Start");
//$app->DB->Update("UPDATE artikel SET cache_lagerplatzinhaltmenge='999'");
@ -53,6 +53,9 @@ $firmendatenid = $app->DB->Select("SELECT MAX(id) FROM firmendaten LIMIT 1");
$shops = $app->DB->SelectArr('SELECT * FROM `shopexport` WHERE `aktiv` = 1');
if(empty($shops)) {
$app->erp->LogFile("Lagerzahlen-Synchronisation Ende: Keine aktiven Shops");
return;
}
$shopByIds = [];
@ -97,6 +100,9 @@ $firmendatenid = $app->DB->Select("SELECT MAX(id) FROM firmendaten LIMIT 1");
);
if(empty($lagerartikel)) {
$app->erp->LogFile("Lagerzahlen-Synchronisation Ende: Keine fälligen Artikel");
return;
}
@ -110,7 +116,7 @@ $firmendatenid = $app->DB->Select("SELECT MAX(id) FROM firmendaten LIMIT 1");
}
$clagerartikel = $lagerartikel?count($lagerartikel):0;
$app->erp->LogFile('Artikel Gesamt fuer Synchronisation: '.$clagerartikel);
$app->erp->LogFile('Lagerzahlen-Synchronisation, Artikel gesamt: '.$clagerartikel);
foreach($lagerartikel as $ij => $articleId) {
$app->DB->Update(
"UPDATE `prozessstarter`
@ -172,9 +178,10 @@ $firmendatenid = $app->DB->Select("SELECT MAX(id) FROM firmendaten LIMIT 1");
}
}
catch (Exception $exception) {
$app->erp->LogFile($app->DB->real_escape_string($exception->getMessage()));
$app->erp->LogFile("Lagerzahlen-Synchronisation Exception:".$app->DB->real_escape_string($exception->getMessage()));
}
}
$app->erp->LogFile('Ende Synchronisation');
$app->erp->LogFile("Lagerzahlen-Synchronisation Ende");

View File

@ -7868,10 +7868,10 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
// headings
$heading = array('', '', 'Angebot', 'Vom', 'Kd-Nr.', 'Kunde', 'Land', 'Projekt', 'Zahlung', 'Betrag (brutto)', 'Status', 'Menü');
$heading = array('', '', 'Angebot', 'Vom', 'Kd-Nr.', 'Kunde', 'Land', 'Projekt', 'Zahlung', 'Betrag (brutto)', 'Status','Bearbeiter', 'Menü');
$width = array('1%', '1%', '1%', '10%', '10%', '40%', '5%', '1%', '1%', '1%', '1%', '1%', '1%', '1%');
$findcols = array('open', 'a.belegnr', 'a.belegnr', 'a.datum', 'adr.kundennummer', 'a.name', 'a.land', 'p.abkuerzung', 'a.zahlungsweise', 'a.gesamtsumme', 'a.status', 'id');
$searchsql = array('DATE_FORMAT(a.datum,\'%d.%m.%Y\')', 'a.anfrage','a.belegnr', 'adr.kundennummer', 'a.name', 'a.land', 'p.abkuerzung', 'a.zahlungsweise', 'a.status', "FORMAT(a.gesamtsumme,2{$extended_mysql55})", 'a.status', 'adr.freifeld1','a.internebezeichnung');
$findcols = array('open', 'a.belegnr', 'a.belegnr', 'a.datum', 'adr.kundennummer', 'a.name', 'a.land', 'p.abkuerzung', 'a.zahlungsweise', 'a.gesamtsumme', 'a.status','a.bearbeiter', 'id');
$searchsql = array('DATE_FORMAT(a.datum,\'%d.%m.%Y\')', 'a.anfrage','a.belegnr', 'adr.kundennummer', 'a.name', 'a.land', 'p.abkuerzung', 'a.zahlungsweise', 'a.status', "FORMAT(a.gesamtsumme,2{$extended_mysql55})", 'a.status','a.bearbeiter', 'adr.freifeld1','a.internebezeichnung');
$defaultorder = 12; //Optional wenn andere Reihenfolge gewuenscht
$defaultorderdesc = 1;
@ -7904,7 +7904,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
."<td>"
."<a href=\"#\" class=\"label-manager\" data-label-column-number=\"5\" data-label-reference-id=\"%value%\" data-label-reference-table=\"angebot\"><span class=\"label-manager-icon\"></span></a>"
."</td></tr></table>";
$menucol = 11;
$menucol = 12;
$parameter = $this->app->User->GetParameter('table_filter_angebot');
$parameter = base64_decode($parameter);
@ -7925,6 +7925,7 @@ a.land as land, p.abkuerzung as projekt, a.zahlungsweise as zahlungsweise,
a.zahlungsweise as zahlungsweise,
FORMAT(a.gesamtsumme,2{$extended_mysql55}) as betrag,
UPPER(a.status) as status,
a.bearbeiter,
a.id
";

View File

@ -17,6 +17,8 @@
* PLACEHOLDER_GET_INPUT
* PLACEHOLDER_SET_INPUT
* PLACEHOLDER_COLUMNS
* PLACEHOLDER_ID_COLUMN
* PLACEHOLDER_HEADERS
* PLACEHOLDER_SET_TPL
*/
@ -109,6 +111,7 @@ if ($argc >= 2) {
$columns = array();
$sql_columns = array();
$edit_form = "";
$tab_pos = " "; // Tab position
/* Iterate through the result set */
echo "FIELD\t\t\t\tType\t\tNull\tKey\tDefault\tExtra\n";
@ -150,7 +153,16 @@ if ($argc >= 2) {
// <tr><td>{|Bezeichnung|}:*</td><td><input type="text" id="bezeichnung" name="bezeichnung" value="[BEZEICHNUNG]" size="40"></td></tr>
if ($row['Field'] != 'id') {
$edit_form = $edit_form . '<tr><td>{|' . ucfirst($row['Field']) . '|}:</td><td><input type="text" name="' . $row['Field'].'" id="'.$row['Field'].'" value="[' . strtoupper($row['Field']) . ']" size="20"></td></tr>' . "\n";
$edit_form = $edit_form.
'<tr>
<td>
{|' . ucfirst($row['Field']) . '|}:
</td>
<td>
<input type="text" name="' . $row['Field'].'" id="'.$row['Field'].'" value="[' . strtoupper($row['Field']) . ']" size="20">
</td>
</tr>
';
}
echo("\n");
}
@ -164,6 +176,7 @@ if ($argc >= 2) {
// Create php file
$list_of_columns = implode(', ', $columns);
$list_of_columns_headers_in_quotes = "'" . implode('\', \'', array_map('ucfirst',$columns)) . "'";
$list_of_columns_in_quotes = "'" . implode('\', \'', $columns) . "'";
$sql_list_of_columns = implode(', ', $sql_columns);
$sql_list_of_columns_in_quotes = "'" . implode('\', \'', $sql_columns) . "'";
@ -194,6 +207,8 @@ if ($argc >= 2) {
$php_file_contents = str_replace('PLACEHOLDER_GET_INPUT', $get_input, $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_SET_INPUT', $set_input, $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_COLUMNS', $list_of_columns_in_quotes, $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_ID_COLUMN', $table_short_name.".id", $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_HEADERS', $list_of_columns_headers_in_quotes, $php_file_contents);
$php_file_contents = str_replace('PLACEHOLDER_SQL_COLUMNS', $sql_list_of_columns_in_quotes, $php_file_contents);
$php_file = fopen($target_php_folder . $php_file_name, "w");

View File

@ -1,5 +1,10 @@
<div id="tabs-1">
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
[TAB1]
[TAB1NEXT]
</div>
</div>

View File

@ -30,13 +30,13 @@ class PLACEHOLDER_MODULECLASSNAME {
switch ($name) {
case "PLACEHOLDER_LIST":
$allowed['PLACEHOLDER_LIST'] = array('list');
$heading = array('','',PLACEHOLDER_COLUMNS, 'Men&uuml;');
$heading = array('','',PLACEHOLDER_HEADERS, 'Men&uuml;');
$width = array('1%','1%','10%'); // Fill out manually later
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
$findcols = array(PLACEHOLDER_SQL_COLUMNS);
$findcols = array('PLACEHOLDER_ID_COLUMN','PLACEHOLDER_ID_COLUMN',PLACEHOLDER_SQL_COLUMNS);
$searchsql = array(PLACEHOLDER_SQL_COLUMNS);
$defaultorder = 1;

View File

@ -77688,7 +77688,52 @@
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
},
{
"Field": "buchhaltung_berater",
"Type": "varchar(64)",
"Collation": null,
"Null": "NO",
"Key": "",
"Default": "",
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
},
{
"Field": "buchhaltung_mandant",
"Type": "varchar(64)",
"Collation": null,
"Null": "NO",
"Key": "",
"Default": "",
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
},
{
"Field": "buchhaltung_wj_beginn",
"Type": "varchar(4)",
"Collation": null,
"Null": "NO",
"Key": "",
"Default": "'0101'",
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
},
{
"Field": "buchhaltung_sachkontenlaenge",
"Type": "int(1)",
"Collation": null,
"Null": "NO",
"Key": "",
"Default": "4",
"Extra": "",
"Privileges": "select,insert,update,references",
"Comment": ""
}
],
"keys": [
{

View File

@ -36859,7 +36859,19 @@ function Firmendaten($field,$projekt="")
break;
}
$this->GetArtikelSteuer($artikel, $ust_befreit, $aufwendung,$tmpsteuersatz, $tmpsteuertext, $erloes, $posRow['umsatzsteuer'],null, $projekt);
$this->GetArtikelSteuer($artikel, $ust_befreit, $aufwendung, $tmpsteuersatz, $tmpsteuertext, $erloes, $posRow['umsatzsteuer'], null, $projekt);
$this->getErloesFirmendaten($artikel, $ust_befreit, $aufwendung, $tmpsteuersatzFD, $tmpsteuertextFD, $tmperloesFD, $posRow['umsatzsteuer'], null, $projekt);
if (!$tmpsteuersatz) {
$tmpsteuersatz = $tmpsteuersatzFD;
}
if (!$tmpsteuertext) {
$tmpsteuertext = $tmpsteuertextFD;
}
if (!$erloes) {
$erloes = $tmperloesFD;
}
}
function PortoBerechnen($adresse,$gesamtsumme,$portoartikel, &$realpreis = false)

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,58 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT]</a></li>
</ul>
<!-- ende gehort zu tabview -->
<form action="" method="post">
<div id="tabs-1">
[MESSAGE]
<div class='row'>
<div class='row-height'>
<div class='col-xs-12 col-md-10 col-md-height'>
<div class='inside inside-full-height'>
<fieldset>
<legend>{|Buchungsstapel|}</legend>
<table width="100%" border="0">
<tr>
<td>{|Rechnungen:|}</td>
<td><input type="checkbox" name="rechnung" value="1" [RGCHECKED] /></td>
</tr>
<tr>
<td>{|Gutschriften:|}</td>
<td><input type="checkbox" name="gutschrift" value="1" [GSCHECKED] /></td>
</tr>
<tr>
<td>{|Verbindlichkeiten:|}</td>
<td><input type="checkbox" name="verbindlichkeit" value="1" [VBCHECKED] /></td>
</tr>
<tr>
<td>Datum von:</td>
<td><input type="text" name="von" id="von" value="[VON]" /></td>
</tr>
<tr>
<td>Datum bis:</td>
<td><input type="text" name="bis" id="bis" value="[BIS]" /></td>
</tr>
<tr>
<td>Projekt:</td>
<td><input type="text" name="projekt" id="projekt" value="[PROJEKT]" /></td>
</tr>
</table>
</fieldset>
</div>
</div>
<div class='col-xs-12 col-md-2 col-md-height'>
<div class='inside inside-full-height'>
<fieldset>
<legend>{|Aktionen|}</legend>
<input type="submit" name="submit" value="Download" class="btnGreenBig">
</fieldset>
</div>
</div>
</div>
</div><!-- row -->
</form>
</div>

View File

@ -1059,6 +1059,30 @@
<!--<tr>
<td width="300">Export nach Positionen</td><td colspan="3"><input type="checkbox" name="steuer_positionen_export" value="1" [STEUER_POSITIONEN_EXPORT]"></td>
</tr>-->
<tr>
<td width="300">Berater:</td>
<td>
<input type="text" name="buchhaltung_berater" size="10" value="[BUCHHALTUNG_BERATER]">
</td>
</tr>
<tr>
<td width="300">Mandant:</td>
<td>
<input type="text" name="buchhaltung_mandant" size="10" value="[BUCHHALTUNG_MANDANT]">
</td>
</tr>
<tr>
<td width="300">Wirtschaftsjahr Beginn (MMDD):</td>
<td>
<input type="text" name="buchhaltung_wj_beginn" id="buchhaltung_wj_beginn" size="10" value="[BUCHHALTUNG_WJ_BEGINN]">
</td>
</tr>
<tr>
<td width="300">Sachkontenl&auml;nge (4-8):</td>
<td>
<input type="text" name="buchhaltung_sachkontenlaenge" size="10" value="[BUCHHALTUNG_SACHKONTENLAENGE]">
</td>
</tr>
</table>
</fieldset>
</div>

View File

@ -6,6 +6,7 @@
<li><a href="#tabs-3">{|Zeiterfassung|}</a></li>
<li><a href="#tabs-4">{|Wiedervorlagen|}</a></li>
<li><a href="#tabs-5">{|Notizen|}</a></li>
<li><a href="#tabs-6">{|Kontorahmen|}</a></li>
</ul>
<div id="tabs-1">
@ -503,4 +504,51 @@
</div>
</div>
</div>
<div id="tabs-6">
<div class="row">
<div class="col-xs-12 col-sm-1 col-sm-height">
<div class="inside inside-full-height">
<fieldset><legend>{|Kontorahmen|}</legend>
<table class="mkTable">
<tr>
<th>Variable</th>
<th>Beschreibung</th>
<th>Kommentar</th>
</tr>
<tr>
<td>sachkonto</td>
<td>Sachkontonummer</td>
<td></td>
</tr>
<tr>
<td>beschriftung</td>
<td>Sachkontobeschriftung</td>
<td></td>
</tr>
<tr>
<td>art</td>
<td>Art des Kontos</td>
<td>'Aufwendungen', 'Erl&ouml;se', 'Geldtransit' oder 'Saldo'</td>
</tr>
<tr>
<td>bemerkung</td>
<td>Bemerkung zum Konto</td>
<td>optional</td>
</tr>
<tr>
<td>projekt</td>
<td>Projekt-Kennung</td>
<td>optional</td>
</tr>
<tr>
<td>ausblenden</td>
<td>Soll das Konto ausgeblendet werden?</td>
<td>0 oder 1</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</div>

View File

@ -17,14 +17,14 @@
<tr><td colspan="99">&nbsp;</td></tr>
<tr align="center">
<td width="25%"><a href="index.php?module=exportbelegepositionen&action=export"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_1.gif" border="0" width="30%"></a></td>
<td width="25%"><a href="index.php?module=exportbuchhaltung&action=export"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_1.gif" border="0" width="30%"></a></td>
<td width="25%">[BELEGEIMPORTSTART]<a href="index.php?module=belegeimport&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_1.gif" border="0" width="30%"></a>[BELEGEIMPORTEND]</td>
<td width="25%">&nbsp;</td>
<!--<td width="25%"><a href="index.php?module=shopexport&action=list"><img src="./themes/[THEME]/images/einstellungen/Icons_dunkel_20.gif" border="0" width="30%"></a></td>-->
</tr>
<tr align="center">
<td><a href="index.php?module=exportbelegepositionen&action=export">{|Belegpositionen|} <br>{|Export|}</a></td>
<td><a href="index.php?module=exportbuchhaltung&action=list">{|Buchhaltung|}<br>{|Export|}</a></td>
<td>[BELEGEIMPORTSTART]<a href="index.php?module=belegeimport&action=list">Belege Importer</a>[BELEGEIMPORTEND]</td>
<td>&nbsp;</td>
<!--<td><a href="index.php?module=shopexport&action=list">Export<br>(Online-Shop)</a></td>-->
</tr>
<!--<tr><td colspan="4"><br></td></tr>

View File

@ -0,0 +1,32 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1"></a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|<!--Legend for this form area goes here>-->kontorahmen|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Sachkonto|}:</td><td><input type="text" name="sachkonto" id="sachkonto" value="[SACHKONTO]" size="20"></td></tr>
<tr><td>{|Beschriftung|}:</td><td><input type="text" name="beschriftung" id="beschriftung" value="[BESCHRIFTUNG]" size="20"></td></tr>
<tr><td>{|Bemerkung|}:</td><td><input type="text" name="bemerkung" id="bemerkung" value="[BEMERKUNG]" size="20"></td></tr>
<tr><td>{|Ausblenden|}:</td><td><input type="checkbox" name="ausblenden" id="ausblenden" value="1" [AUSBLENDEN] size="20"></td></tr>
<tr><td>{|Art|}:</td><td><select name="art">[ART]</select></td></tr>
<tr><td>{|Projekt|}:</td><td><input type="text" name="projekt" id="projekt" value="[PROJEKT]" size="20"></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</form>
</div>
</div>

View File

@ -1,333 +1,30 @@
<!-- gehort zu tabview -->
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT]</a></li>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<!-- ende gehort zu tabview -->
<!-- erstes tab -->
<form method="post">
<div id="tabs-1">
<div id="tabs-1">
<form action="#tabs-1" id="frmauto" name="frmauto" method="post">
[MESSAGE]
[TAB1]
<fieldset>
<legend>{|Stapelverarbeitung|}</legend>
<input type="checkbox" id="auswahlalle" onchange="kontorahmenmarkieren();" />&nbsp;{|alle markieren|}&nbsp;
<input type="submit" class="btnBlue" name="loeschen" id="loeschen" value="Alle markierten l&ouml;schen" />
</fieldset>
<!--<fieldset>
<legend>Anlegen</legend>
<table>
<legend>Stapelverarbeitung</legend>
<tr>
<td width="40">Konto:</td><td width="170"><input type="text" name="konto" id="konto"></td>
<td width="75">Beschriftung:</td><td width="170"><input type="text" name="beschriftung" id="beschriftung"></td>
<td width="23">Art:</td><td width="145"><select name="art" id="art" style="width:11em">
<option value="0"></option>
<option value="1">Aufwendungen</option>
<option value="2">Erl&ouml;se</option>
<option value="3">Geldtransit</option>
<option value="9">Saldo</option>
</select></td>
<td>Nicht sichtbar:</td><td width="40"><input type="checkbox" name="nichtsichtbar" id="nichtsichtbar" value="1"></td>
<td><input type="submit" name="anlegen" id="anlegen" value="Anlegen"></td>
<td><input type="checkbox" value="1" id="autoalle" />&nbsp;alle markieren&nbsp;</td><td><input type="submit" class="btnBlue" name="ausfuehren" value="{|L&ouml;schen|}" /></td>
</tr>
</table>
</fieldset>-->
</fieldset>
</form>
[TAB1NEXT]
<!--<input type="button" class="check" onclick="kontorahmenmarkieren()" name="markieren" id="markieren" value="Alle markieren" />-->
</div>
<!-- tab view schließen -->
</div>
<div id="editKontorahmen" style="display:none;" title="Bearbeiten">
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Kontorahmen|}</legend>
<input type="hidden" id="editid">
<table>
<tr>
<td>{|Konto|}:</td>
<td><input type="text" name="editkonto" id="editkonto" size="40"></td>
</tr>
<tr>
<td width="120">{|Beschriftung|}:</td>
<td><input type="text" name="editbeschriftung" id="editbeschriftung" size="40"></td>
</tr>
<tr>
<td>{|Art|}:</td>
<td><select name="editart" id="editart">
<option value="0"></option>
<option value="1">Aufwendungen</option>
<option value="2">Erl&ouml;se</option>
<option value="3">Geldtransit</option>
<option value="9">Saldo</option>
</select>
</td>
</tr>
<tr>
<td>{|Bemerkung|}:</td>
<td><textarea name="editbemerkung" id="editbemerkung" rows="5" cols="38"></textarea></td>
</tr>
<tr>
<td>{|Projekt|}:</td>
<td><input type="text" name="editprojekt" id="editprojekt" size="40"></td>
</tr>
<tr>
<td>{|Nicht sichtbar|}:</td>
<td><input type="checkbox" name="editnichtsichtbar" id="editnichtsichtbar" value="1" size="40"></td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
</div>
<script>
</form>
<script type="text/javascript">
$(document).ready(function() {
$('#editkonto').focus();
$("#editKontorahmen").dialog({
modal: true,
bgiframe: true,
closeOnEscape:false,
minWidth:600,
autoOpen: false,
buttons: {
ABBRECHEN: function() {
KontorahmenReset();
$(this).dialog('close');
},
SPEICHERN: function() {
Kontorahmen_EditSave();
}
}
$('#autoalle').on('change',function(){
var wert = $(this).prop('checked');
$('#kontorahmen_list').find('input[type="checkbox"]').prop('checked',wert);
$('#kontorahmen_list').find('input[type="checkbox"]').first().trigger('change');
});
$("#editKontorahmen").dialog({
close: function( event, ui ) {KontorahmenReset();}
});
});
function KontorahmenReset(){
$('#editKontorahmen').find('#editid').val('');
$('#editKontorahmen').find('#editkonto').val('');
$('#editKontorahmen').find('#editbeschriftung').val('');
$('#editKontorahmen').find('#editart').val('');
$('#editKontorahmen').find('#editbemerkung').val('');
$('#editKontorahmen').find('#editprojekt').val('');
$('#editKontorahmen').find('#editnichtsichtbar').prop('checked', false);
}
function Kontorahmen_EditSave() {
$.ajax({
url: 'index.php?module=kontorahmen&action=save',
data: {
//Alle Felder die fürs editieren vorhanden sind
editid: $('#editid').val(),
editkonto: $('#editkonto').val(),
editbeschriftung: $('#editbeschriftung').val(),
editart: $('#editart').val(),
editbemerkung: $('#editbemerkung').val(),
editprojekt: $('#editprojekt').val(),
editnichtsichtbar: $('#editnichtsichtbar').prop("checked")?1:0,
},
method: 'post',
dataType: 'json',
beforeSend: function() {
App.loading.open();
},
success: function(data) {
App.loading.close();
if (data.status == 1) {
KontorahmenReset();
updateLiveTable();
$("#editKontorahmen").dialog('close');
} else {
alert(data.statusText);
}
}
});
}
function Kontorahmen_Edit(id) {
if(id > 0){
$.ajax({
url: 'index.php?module=kontorahmen&action=edit&cmd=get',
data: {
id: id
},
method: 'post',
dataType: 'json',
beforeSend: function() {
App.loading.open();
},
success: function(data) {
$('#editKontorahmen').find('#editid').val(data.id);
$('#editKontorahmen').find('#editkonto').val(data.sachkonto);
$('#editKontorahmen').find('#editbeschriftung').val(data.beschriftung);
$('#editKontorahmen').find('#editart').val(data.art);
$('#editKontorahmen').find('#editbemerkung').val(data.bemerkung);
$('#editKontorahmen').find('#editprojekt').val(data.projekt);
$('#editKontorahmen').find('#editnichtsichtbar').prop("checked",data.ausblenden==1?true:false);
if(data.art=="" || data.art <=0 )
$('#editKontorahmen').find('#editart').val('0');
else
$('#editKontorahmen').find('#editart').val(data.art);
App.loading.close();
$("#editKontorahmen").dialog('open');
}
});
}else{
KontorahmenReset();
$("#editKontorahmen").dialog('open');
}
}
function updateLiveTable(i) {
var oTableL = $('#kontorahmenlist').dataTable();
var tmp = $('.dataTables_filter input[type=search]').val();
oTableL.fnFilter('%');
//oTableL.fnFilter('');
oTableL.fnFilter(tmp);
}
/*function Kontorahmen_Delete(id) {
var conf = confirm('Wirklich löschen?');
if (conf) {
$.ajax({
url: 'index.php?module=kontorahmen&action=delete',
data: {
id: id
},
method: 'post',
dataType: 'json',
beforeSend: function() {
App.loading.open();
},
success: function(data) {
if (data.status == 1) {
updateLiveTable();
} else {
alert(data.statusText);
}
App.loading.close();
}
});
}
return false;
}*/
</script>
<script type="text/javascript">
function chkontorahmen(kid)
{
var status = 0;
var el = '#kontorahmen_'+kid;
status = $(el).prop('checked');
if(status)status = 1;
if(kid)
{
$.ajax({
url: 'index.php?module=kontorahmen&action=chkontorahmen',
type: 'POST',
dataType: 'json',
data: {kontorahmen :kid, wert : status},
success: function(data) {
},
beforeSend: function() {
}
});
}
}
function alleauswaehlen()
{
var wert = $('#auswahlalle').prop('checked');
$('#kontorahmenlist').find(':checkbox').prop('checked',wert);
$.ajax({
url: 'index.php?module=kontorahmen&action=allemarkieren',
type: 'POST',
dataType: 'json',
data: {markiert : checked},
success: function(data){
},
beforeSend: function(){
}
});
}
function kontorahmenmarkieren(){
//$('.check:button').click(function(){
var checked = !$(this).data('checked');
$('input:checkbox').prop('checked', checked);
$('.check:button').val(checked ? 'Alle entmarkieren' : 'Alle markieren' )
$(this).data('checked', checked);
$.ajax({
url: 'index.php?module=kontorahmen&action=allemarkieren',
type: 'POST',
dataType: 'json',
data: {markiert : checked},
success: function(data){
},
beforeSend: function(){
}
});
//});
}
</script>

View File

@ -0,0 +1,51 @@
<!-- gehort zu tabview -->
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT]</a></li>
</ul>
<!-- ende gehort zu tabview -->
<!-- erstes tab -->
<div id="tabs-1">
<form action="" method="post">
[MESSAGE]
<div class="row-height">
<div class="col-xs-12 col-md-10 col-md-height">
<div class="inside_white inside-full-height">
<fieldset class="white">
<legend></legend>
[TAB1]
</fieldset>
<fieldset>
<table>
<legend>Stapelverarbeitung</legend>
<tr>
<td><input type="checkbox" value="1" id="autoalle" />&nbsp;alle markieren&nbsp;</td><td><input type="submit" class="btnBlue" name="delcacheselected" value="{|Lagerzahlencache zur&uuml;cksetzen|}" /></td>
</tr>
</table>
</fieldset>
</div>
</div>
<div class="col-xs-12 col-md-2 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Aktionen|}</legend>
<input type="submit" class="btnBlueNew" value="{|Lagerzahlencache gesamt zur&uuml;cksetzen|}" name="delcache"><br
</fieldset>
</div>
</div>
</div>
</form>
</div>
<!-- tab view schließen -->
</div>
<script>
$('#autoalle').on('change',function(){
var wert = $(this).prop('checked');
$('#shopexport_artikellist').find('input[type="checkbox"]').prop('checked',wert);
$('#shopexport_artikellist').find('input[type="checkbox"]').first().trigger('change');
});
</script>

View File

@ -40,8 +40,8 @@
<fieldset>
<legend>{|Aktionen|}</legend>
<input type="submit" class="btnBlueNew" value="{|Lagerzahlcache zur&uuml;cksetzen|}" name="delcache"><br>
<input type="submit" class="btnBlueNew" value="{|Lagerzahlcache für Shopartikel mit Menge 0 zur&uuml;cksetzen|}" name="delzerostockcache"><br>
<input type="submit" class="btnBlueNew" value="{|Lagerzahlencache zur&uuml;cksetzen|}" name="delcache"><br>
<input type="submit" class="btnBlueNew" value="{|Lagerzahlencache für Shopartikel mit Menge 0 zur&uuml;cksetzen|}" name="delzerostockcache"><br>
<input type="submit" class="btnBlueNew" value="{|Artikelcache zur&uuml;cksetzen|}" name="delarticlecache"><br>
<input type="submit" class="btnBlueNew" value="{|Alle Artikel laden|}" name="alle" onclick="if(!confirm('{|Wollen Sie wirklich alle Artikel an den Shop übertragen? Eventuell werden hier auch Artikeltexte, Preise, Bilder, Eigenschaften, Kategorien, etc. übertragen und überschrieben. Bitte prüfen Sie das Verhalten vorher an einigen Artikel. Bitte nehmen Sie in jedemfall vorab eine Sicherung im Shop vor.|}')) return false;"><br>
<input type="submit" class="btnBlueNew" value="{|Alle ge&auml;nderten Artikel laden|}" name="allchanged" onclick="if(!confirm('{|Wollen Sie wirklich alle Artikel an den Shop übertragen? Eventuell werden hier auch Artikeltexte, Preise, Bilder, Eigenschaften, Kategorien, etc. übertragen und überschrieben. Bitte prüfen Sie das Verhalten vorher an einigen Artikel. Bitte nehmen Sie in jedemfall vorab eine Sicherung im Shop vor.|}')) return false;"><br>

View File

@ -0,0 +1,77 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1"></a></li>
</ul>
<!-- Example for multiple tabs
<ul hidden">
<li><a href="#tabs-1">First Tab</a></li>
<li><a href="#tabs-2">Second Tab</a></li>
</ul>
-->
<div id="tabs-1">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|<!--Legend for this form area goes here>-->Zolltarifnummer|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Nummer|}:</td><td><input type="text" name="nummer" id="nummer" value="[NUMMER]" size="20"></td></tr>
<tr><td>{|Beschreibung|}:</td><td><input type="text" name="beschreibung" id="beschreibung" value="[BESCHREIBUNG]" size="20"></td></tr>
<tr><td>{|Interne Bemerkung|}:</td><td><input type="text" name="internebemerkung" id="internebemerkung" value="[INTERNEBEMERKUNG]" size="20"></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<!-- Example for 2nd row
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Another legend|}</legend>
<table width="100%" border="0" class="mkTableFormular">
<tr><td>{|Nummer|}:</td><td><input type="text" name="nummer" id="nummer" value="[NUMMER]" size="20"></td></tr>
<tr><td>{|Beschreibung|}:</td><td><input type="text" name="beschreibung" id="beschreibung" value="[BESCHREIBUNG]" size="20"></td></tr>
<tr><td>{|Internebemerkung|}:</td><td><input type="text" name="internebemerkung" id="internebemerkung" value="[INTERNEBEMERKUNG]" size="20"></td></tr>
</table>
</fieldset>
</div>
</div>
</div>
</div> -->
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</form>
</div>
<!-- Example for 2nd tab
<div id="tabs-2">
[MESSAGE]
<form action="" method="post">
[FORMHANDLEREVENT]
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-12 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|...|}</legend>
<table width="100%" border="0" class="mkTableFormular">
...
</table>
</fieldset>
</div>
</div>
</div>
</div>
<input type="submit" name="submit" value="Speichern" style="float:right"/>
</form>
</div>
-->
</div>

View File

@ -0,0 +1,10 @@
<div id="tabs">
<ul>
<li><a href="#tabs-1">[TABTEXT1]</a></li>
</ul>
<div id="tabs-1">
[MESSAGE]
[TAB1]
[TAB1NEXT]
</div>
</div>

View File

@ -0,0 +1,759 @@
<?php
/*
**** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*
* Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019
*
* This file is licensed under the Embedded Projects General Public License *Version 3.1.
*
* You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis
* to obtain the text of the corresponding license version.
*
**** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE ****
*/
/*
* Copyright (c) 2023 OpenXE project
*/
?>
<?php
class ConsistencyException extends Exception {
/*
contains the result data as array(string 'belegnr', float 'betrag_gesamt', float 'betrag_summe'))
*/
private $_data = array();
public function __construct($message, $data)
{
$this->_data = $data;
parent::__construct($message);
}
public function getData()
{
return $this->_data;
}
}
class Exportbuchhaltung
{
/** @var Application $app */
var $app;
var $belegnummer;
var $headerwritten = false;
/**
* Exportbelegepositionen constructor.
*
* @param Application $app
* @param bool $intern
*/
public function __construct($app, $intern = false)
{
$this->app = $app;
if ($intern == true) {
return;
}
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("export", "ExportBuchhaltungList");
$this->app->ActionHandlerListen($app);
$this->app->erp->Headlines('Buchhaltung Export DATEV');
}
function ExportBuchhaltungList() {
$submit = $this->app->Secure->GetPOST('submit');
$von_form = $this->app->Secure->GetPOST("von");
$bis_form = $this->app->Secure->GetPOST("bis");
$von = date_create($this->app->erp->ReplaceDatum(true, $von_form, true));
$bis = date_create($this->app->erp->ReplaceDatum(true, $bis_form, true));
$projektkuerzel = $this->app->Secure->GetPOST("projekt");
$projekt = $this->app->erp->ReplaceProjekt(true, $projektkuerzel, true);
$rgchecked = $this->app->Secure->GetPOST("rechnung");
$gschecked = $this->app->Secure->GetPOST("gutschrift");
$vbchecked = $this->app->Secure->GetPOST("verbindlichkeit");
$msg = "";
// Preload values
if (empty($submit)) {
$von = date_create('now')->modify('first day of last month');
$von_form = $this->app->erp->ReplaceDatum(false,$von->format('Y-m-d'),false);
$bis = date_create('now')->modify('last day of last month');
$bis_form = $this->app->erp->ReplaceDatum(false,$bis->format('Y-m-d'),false);
$rgchecked = true;
$gschecked = true;
$vbchecked = true;
}
$missing_obligatory = array();
$buchhaltung_berater = $this->app->erp->Firmendaten('buchhaltung_berater');
$buchhaltung_mandant = $this->app->erp->Firmendaten('buchhaltung_mandant');
$buchhaltung_wj_beginn = $this->app->erp->Firmendaten('buchhaltung_wj_beginn');
$buchhaltung_sachkontenlaenge = $this->app->erp->Firmendaten('buchhaltung_sachkontenlaenge');
$buchhaltung_berater = $this->app->erp->Firmendaten('buchhaltung_berater');
if (empty($buchhaltung_berater)) {
$missing_obligatory[] = "Berater";
}
$buchhaltung_mandant = $this->app->erp->Firmendaten('buchhaltung_mandant');
if (empty($buchhaltung_mandant)) {
$missing_obligatory[] = "Mandant";
}
$buchhaltung_wj_beginn = $this->app->erp->Firmendaten('buchhaltung_wj_beginn');
if (empty($buchhaltung_wj_beginn)) {
$missing_obligatory[] = "Wirtschaftsjahr";
}
$buchhaltung_sachkontenlaenge = $this->app->erp->Firmendaten('buchhaltung_sachkontenlaenge');
if (empty($buchhaltung_sachkontenlaenge)) {
$missing_obligatory[] = "Sachkontenl&auml;nge";
}
if (!empty($missing_obligatory)) {
$msg = "<div class=warning>Angaben in den Grundeinstellungen fehlen: ".implode(", ",$missing_obligatory).".</div>";
}
//---------- DOWNLOAD HERE
if ($submit == 'Download') {
$dataok = true;
if (
!$rgchecked &&
!$gschecked &&
!$vbchecked
) {
$msg = "<div class=error>Bitte mindestens eine Belegart auswählen.</div>";
$dataok = false;
}
$von_next_year = clone $von;
$von_next_year = $von_next_year->modify("+1 year");;
$buchhaltung_wj_beginn = date_create(date_format($von,'Y').$buchhaltung_wj_beginn);
if ($buchhaltung_wj_beginn > $von) {
$buchhaltung_wj_beginn = $buchhaltung_wj_beginn->modify("-1 year");
}
$buchhaltung_wj_beginn_next_year = clone $buchhaltung_wj_beginn;
$buchhaltung_wj_beginn_next_year->modify("+1 year");
if ($bis < $von || $bis > $von_next_year || $bis >= $buchhaltung_wj_beginn_next_year) {
$msg = "<div class=error>Ung&uuml;ltiger Datumsbereich.</div>";
$dataok = false;
}
if ($dataok) {
$filename = "EXTF_".date('Ymd') . "_Buchungsstapel_DATEV_export.csv";
try {
$csv = $this->DATEV_Buchuchungsstapel($rgchecked, $gschecked, $vbchecked, $buchhaltung_berater, $buchhaltung_mandant, $buchhaltung_wj_beginn, $buchhaltung_sachkontenlaenge, $von, $bis, $projekt, $filename);
header("Content-Disposition: attachment; filename=" . $filename);
header("Pragma: no-cache");
header("Expires: 0");
echo($csv);
$this->app->ExitXentral();
}
catch (ConsistencyException $e) {
$msg = "<div class=error>Inkonsistente Daten (".$e->getMessage()."): <br>";
$data = $e->getData();
$count = 0;
foreach($data as $item) {
$msg .= $item['typ']." ".$item['belegnr']." (Kopf ".$this->app->erp->ReplaceMengeBetrag(false,$item['betrag_gesamt'],false)." Positionen ".$this->app->erp->ReplaceMengeBetrag(false,$item['betrag_summe'],false).")<br>";
$count++;
if ($count == 10) {
$msg .= "...";
break;
}
}
$msg .= "</div>";
}
}
}
//---------- DOWNLOAD HERE
$this->app->erp->MenuEintrag("index.php?module=exportbuchhaltung&action=export", "&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=importvorlage&action=uebersicht", "Zur&uuml;ck");
$this->app->YUI->AutoComplete("projekt", "projektname", 1);
$this->app->YUI->DatePicker("von");
$this->app->YUI->DatePicker("bis");
$this->app->Tpl->SET('MESSAGE', $msg);
$this->app->Tpl->SET('RGCHECKED',$rgchecked?'checked':'');
$this->app->Tpl->SET('GSCHECKED',$gschecked?'checked':'');
$this->app->Tpl->SET('VBCHECKED',$vbchecked?'checked':'');
$this->app->Tpl->SET('VON', $von_form);
$this->app->Tpl->SET('BIS', $bis_form);
$this->app->Tpl->SET('PROJEKT', $projektkuerzel);
$this->app->Tpl->Parse('PAGE', "exportbuchhaltung_export.tpl");
}
/*
* Create DATEV Buchhungsstapel
* @throws ConsistencyException with string (list of items) if consistency check fails
*/
function DATEV_Buchuchungsstapel(bool $rechnung, bool $gutschrift, bool $verbindlichkeit, string $berater, string $mandant, datetime $wj_beginn, int $sachkontenlaenge, datetime $von, datetime $bis, int $projekt = 0, string $filename = 'EXTF_Buchungsstapel_DATEV_export.csv') : string {
$datev_header_definition = array (
'1' => 'Kennzeichen',
'2' => 'Versionsnummer',
'3' => 'Formatkategorie',
'4' => 'Formatname',
'5' => 'Formatversion',
'6' => 'Erzeugt am',
'7' => 'Reserviert',
'8' => 'Reserviert',
'9' => 'Reserviert',
'10' => 'Reserviert',
'11' => 'Beraternummer',
'12' => 'Mandantennummer',
'13' => 'WJ-Beginn',
'14' => 'Sachkontenlänge',
'15' => 'Datum von',
'16' => 'Datum bis',
'17' => 'Bezeichnung',
'18' => 'Diktatkürzel',
'19' => 'Buchungstyp',
'20' => 'Rechnungs- legungszweck',
'21' => 'Festschreibung',
'22' => 'WKZ',
'23' => 'Reserviert',
'24' => 'Derivatskennzeichen',
'25' => 'Reserviert',
'26' => 'Reserviert',
'27' => 'Sachkonten- rahmen',
'28' => 'ID der Branchen- lösung',
'29' => 'Reserviert',
'30' => 'Reserviert',
'31' => 'Anwendungs- information'
);
$datev_buchungsstapel_definition = array (
'1' => 'Umsatz',
'2' => 'Soll-/Haben-Kennzeichen',
'3' => 'WKZ Umsatz',
'4' => 'Kurs',
'5' => 'Basisumsatz',
'6' => 'WKZ Basisumsatz',
'7' => 'Konto',
'8' => 'Gegenkonto (ohne BU-Schlüssel)',
'9' => 'BU-Schlüssel',
'10' => 'Belegdatum',
'11' => 'Belegfeld 1',
'12' => 'Belegfeld 2',
'13' => 'Skonto',
'14' => 'Buchungstext',
'15' => 'Postensperre',
'16' => 'Diverse Adressnummer',
'17' => 'Geschäftspartnerbank',
'18' => 'Sachverhalt',
'19' => 'Zinssperre',
'20' => 'Beleglink',
'21' => 'Beleginfo -Art 1',
'22' => 'Beleginfo -Inhalt 1',
'23' => 'Beleginfo -Art 2',
'24' => 'Beleginfo -Inhalt 2',
'25' => 'Beleginfo -Art 3',
'26' => 'Beleginfo -Inhalt 3',
'27' => 'Beleginfo -Art 4',
'28' => 'Beleginfo -Inhalt 4',
'29' => 'Beleginfo -Art 5',
'30' => 'Beleginfo -Inhalt 5',
'31' => 'Beleginfo -Art 6',
'32' => 'Beleginfo -Inhalt 6',
'33' => 'Beleginfo -Art 7',
'34' => 'Beleginfo -Inhalt 7',
'35' => 'Beleginfo -Art 8',
'36' => 'Beleginfo -Inhalt 8',
'37' => 'KOST1 -Kostenstelle',
'38' => 'KOST2 -Kostenstelle',
'39' => 'KOST-Menge',
'40' => 'EU-Mitgliedstaat u. UStID (Bestimmung)',
'41' => 'EU-Steuersatz (Bestimmung)',
'42' => 'Abw. Versteuerungsart',
'43' => 'Sachverhalt L+L',
'44' => 'Funktionsergänzung L+L',
'45' => 'BU 49 Hauptfunktiontyp',
'46' => 'BU 49 Hauptfunktionsnummer',
'47' => 'BU 49 Funktionsergänzung',
'48' => 'Zusatzinformation Art 1',
'49' => 'Zusatzinformation Inhalt 1',
'50' => 'Zusatzinformation Art 2',
'51' => 'Zusatzinformation Inhalt 2',
'52' => 'Zusatzinformation Art 3',
'53' => 'Zusatzinformation Inhalt 3',
'54' => 'Zusatzinformation Art 4',
'55' => 'Zusatzinformation Inhalt 4',
'56' => 'Zusatzinformation Art 5',
'57' => 'Zusatzinformation Inhalt 5',
'58' => 'Zusatzinformation Art 6',
'59' => 'Zusatzinformation Inhalt 6',
'60' => 'Zusatzinformation Art 7',
'61' => 'Zusatzinformation Inhalt 7',
'62' => 'Zusatzinformation Art 8',
'63' => 'Zusatzinformation Inhalt 8',
'64' => 'Zusatzinformation Art 9',
'65' => 'Zusatzinformation Inhalt 9',
'66' => 'Zusatzinformation Art 10',
'67' => 'Zusatzinformation Inhalt 10',
'68' => 'Zusatzinformation Art 11',
'69' => 'Zusatzinformation Inhalt 11',
'70' => 'Zusatzinformation Art 12',
'71' => 'Zusatzinformation Inhalt 12',
'72' => 'Zusatzinformation Art 13',
'73' => 'Zusatzinformation Inhalt 13',
'74' => 'Zusatzinformation Art 14',
'75' => 'Zusatzinformation Inhalt 14',
'76' => 'Zusatzinformation Art 15',
'77' => 'Zusatzinformation Inhalt 15',
'78' => 'Zusatzinformation Art 16',
'79' => 'Zusatzinformation Inhalt 16',
'80' => 'Zusatzinformation Art 17',
'81' => 'Zusatzinformation Inhalt 17',
'82' => 'Zusatzinformation Art 18',
'83' => 'Zusatzinformation Inhalt 18',
'84' => 'Zusatzinformation Art 19',
'85' => 'Zusatzinformation Inhalt 19',
'86' => 'Zusatzinformation Art 20',
'87' => 'Zusatzinformation Inhalt 20',
'88' => 'Stück',
'89' => 'Gewicht',
'90' => 'Zahlweise',
'91' => 'Forderungsart',
'92' => 'Veranlagungsjahr',
'93' => 'Zugeordnete Fälligkeit',
'94' => 'Skontotyp',
'95' => 'Auftragsnummer',
'96' => 'Buchungstyp',
'97' => 'USt-Schlüssel (Anzahlungen)',
'98' => 'EU-Mitgliedstaat (Anzahlungen)',
'99' => 'Sachverhalt L+L (Anzahlungen)',
'100' => 'EU-Steuersatz (Anzahlungen)',
'101' => 'Erlöskonto (Anzahlungen)',
'102' => 'Herkunft-Kz',
'103' => 'Leerfeld',
'104' => 'KOST-Datum',
'105' => 'SEPA-Mandatsreferenz',
'106' => 'Skontosperre',
'107' => 'Gesellschaftername',
'108' => 'Beteiligtennummer',
'109' => 'Identifikationsnummer',
'110' => 'Zeichnernummer',
'111' => 'Postensperre bis',
'112' => 'Bezeichnung SoBil-Sachverhalt',
'113' => 'Kennzeichen SoBil-Buchung',
'114' => 'Festschreibung',
'115' => 'Leistungsdatum',
'116' => 'Datum Zuord. Steuerperiode',
'117' => 'Fälligkeit',
'118' => 'Generalumkehr',
'119' => 'Steuersatz',
'120' => 'Land',
'121' => 'Abrechnungsreferenz',
'122' => 'BVV-Position (Betriebsvermögensvergleich)',
'123' => 'EU-Mitgliedstaat u. UStID (Ursprung)',
'124' => 'EU-Steuersatz (Ursprung)');
$usernamearr = explode(' ',strtoupper($this->app->User->GetName()." X X"));
if (count($usernamearr) < 2) {
$kuerzel = $usernamearr[0][0].$usernamearr[0][1];
}
else {
$kuerzel = $usernamearr[0][0].$usernamearr[1][0];
}
$data['Kennzeichen'] = 'EXTF';
$data['Versionsnummer'] = '700';
$data['Formatkategorie'] = '21';
$data['Formatname'] = 'Buchungsstapel';
$data['Formatversion'] = '12';
$data['Erzeugt am'] = date('YmdHis').'000';
$data['Reserviert'] = '';
$data['Reserviert'] = '';
$data['Reserviert'] = '';
$data['Reserviert'] = '';
$data['Beraternummer'] = $berater;
$data['Mandantennummer'] = $mandant;
$data['WJ-Beginn'] = date_format($wj_beginn,"Ymd");
$data['Sachkontenlänge'] = $sachkontenlaenge;
$data['Datum von'] = date_format($von,"Ymd");
$data['Datum bis'] = date_format($bis,"Ymd");
$data['Bezeichnung'] = mb_strimwidth($filename,0,30);
$data['Diktatkürzel'] = $kuerzel;
$data['Buchungstyp'] = 1;
$data['Rechnungs- legungszweck'] = 0;
$data['Festschreibung'] = 1;
$data['WKZ'] = 'EUR';
$data['Reserviert'] = '';
$data['Derivatskennzeichen'] = '';
$data['Reserviert'] = '';
$data['Reserviert'] = '';
$data['Sachkonten- rahmen'] = '';
$data['ID der Branchen- lösung'] = '';
$data['Reserviert'] = '';
$data['Reserviert'] = '';
$data['Anwendungs- information'] = '';
// Start
$csv = "";
// Output data header row
$comma = "";
foreach ($datev_header_definition as $key => $value) {
if (!isset($data[$value])) {
$data[$value] = '';
}
$csv .= $comma.'"'.$data[$value].'"';
$comma = ";";
}
$csv .= "\r\n";
// Output column captions
$comma = "";
foreach ($datev_buchungsstapel_definition as $key => $value) {
$csv .= $comma.'"'.$value.'"';
$comma = ";";
}
$csv .= "\r\n";
// Collate data and transform in RAM
$typen = array(
array(
'typ' => 'rechnung',
'subtable' => 'rechnung_position',
'kennzeichen' => 'S',
'kennzeichen_negativ' => 'H',
'field_belegnr' => 'b.belegnr',
'field_name' => 'b.name',
'field_date' => 'datum',
'field_auftrag' => 'b.auftrag',
'field_kontonummer' => 'a.kundennummer_buchhaltung',
'field_kundennummer' => 'b.kundennummer',
'field_betrag_gesamt' => 'b.soll',
'field_betrag' => 'p.umsatz_brutto_gesamt',
'field_gegenkonto' => '\'\'',
'condition_where' => ' AND b.status IN (\'freigegeben\',\'versendet\',\'storniert\')',
'Buchungstyp' => 'SR',
'do' => $rechnung
),
array(
'typ' => 'gutschrift',
'subtable' => 'gutschrift_position',
'kennzeichen' => 'H',
'kennzeichen_negativ' => 'S',
'field_belegnr' => 'b.belegnr',
'field_name' => 'b.name',
'field_date' => 'datum',
'field_auftrag' => '\'\'',
'field_kontonummer' => 'a.kundennummer_buchhaltung',
'field_kundennummer' => 'b.kundennummer',
'field_betrag_gesamt' => 'b.soll',
'field_betrag' => 'p.umsatz_brutto_gesamt',
'field_gegenkonto' => '\'\'',
'condition_where' => ' AND b.status IN (\'freigegeben\',\'versendet\')',
'Buchungstyp' => '',
'do' => $gutschrift
),
array(
'typ' => 'verbindlichkeit',
'subtable' => 'verbindlichkeit_kontierung',
'kennzeichen' => 'H',
'kennzeichen_negativ' => 'S',
'field_belegnr' => 'b.rechnung',
'field_name' => 'a.name',
'field_date' => 'rechnungsdatum',
'field_auftrag' => 'b.auftrag',
'field_kontonummer' => 'a.lieferantennummer_buchhaltung',
'field_kundennummer' => 'a.lieferantennummer',
'field_betrag_gesamt' => 'b.betrag',
'field_betrag' => 'p.betrag',
'field_gegenkonto' => 'gegenkonto',
'condition_where' => '',
'Buchungstyp' => '',
'do' => $verbindlichkeit
)
);
foreach ($typen as $typ) {
if (!$typ['do']) {
continue;
}
$sql = "SELECT
".$typ['field_belegnr']." as belegnr,
".$typ['field_auftrag']." as auftrag,
if(".$typ['field_kontonummer']." <> '',".$typ['field_kontonummer'].",".$typ['field_kundennummer'].") as kundennummer,
".$typ['field_name']." as name,
b.ustid,
b.".$typ['field_date']." as datum,
p.id as pos_id,
".$typ['field_betrag_gesamt']." as betrag_gesamt,
".$typ['field_betrag']." as betrag,
".$typ['field_gegenkonto']." as gegenkonto,
p.waehrung as pos_waehrung
FROM
".$typ['typ']." b
LEFT JOIN
".$typ['subtable']." p
ON
b.id = p.".$typ['typ']."
INNER JOIN
adresse a ON a.id = b.adresse
WHERE
b.".$typ['field_date']." BETWEEN '".date_format($von,"Y-m-d")."' AND '".date_format($bis,"Y-m-d")."' AND (b.projekt=$projekt OR $projekt=0)".$typ['condition_where'];
// Check consistency of positions
$sql_check = "SELECT *
FROM
(
SELECT
belegnr,
betrag_gesamt,
ROUND(SUM(betrag),2) AS betrag_summe
FROM
(".$sql.") posten
GROUP BY
belegnr
) summen
WHERE betrag_gesamt <> betrag_summe OR betrag_summe IS NULL";
$result = $this->app->DB->SelectArr($sql_check);
if (!empty($result)) {
$e = new ConsistencyException(ucfirst($typ['typ']),$result);
throw $e;
}
// Query position data
$arr = $this->app->DB->Query($sql);
while ($row = $this->app->DB->Fetch_Assoc($arr)) {
// print_r($row);
$posid = $row['pos_id'];
$tmpsteuersatz = 0;
$tmpsteuertext = '';
$erloes = '';
$result = array();
$this->app->erp->GetSteuerPosition($typ['typ'], $posid, $tmpsteuersatz, $tmpsteuertext, $erloes);
$data = array();
if ($row['betrag'] >= 0) {
$data['Umsatz'] = number_format($row['betrag'], 2, ',', ''); // obligatory
$data['Soll-/Haben-Kennzeichen'] = $typ['kennzeichen']; // obligatory
} else {
$data['Umsatz'] = number_format(-$row['betrag'], 2, ',', ''); // obligatory
$data['Soll-/Haben-Kennzeichen'] = $typ['kennzeichen_negativ']; // obligatory
}
$data['EU-Steuersatz (Bestimmung)'] = number_format($$tmpsteuersatz, 2, ',', '');
$data['WKZ Umsatz'] = $row['pos_waehrung'];
$data['Belegfeld 1'] = mb_strimwidth($row['belegnr'],0,12);
$data['Konto'] = $row['kundennummer']; // obligatory
if ($typ['field_gegenkonto'] == 'gegenkonto') {
$data['Gegenkonto (ohne BU-Schlüssel)'] = $row['gegenkonto']; // obligatory
} else {
$data['Gegenkonto (ohne BU-Schlüssel)'] = $erloes; // obligatory
}
$data['Belegdatum'] = date_format(date_create($row['datum']),"dm"); // obligatory
$data['Buchungstext'] = mb_strimwidth($row['name'],0,60);
$data['EU-Mitgliedstaat u. UStID (Bestimmung)'] = $row['ustid'];
$data['Auftragsnummer'] = $row['auftrag'];
$comma = "";
foreach ($datev_buchungsstapel_definition as $key => $value) {
if (!isset($data[$value])) {
$data[$value] = '';
}
$csv .= $comma.'"'.$data[$value].'"';
$comma = ";";
}
$csv .= "\r\n";
}
}
$csv .= '"0";"S";"EUR";"0";"";"";"1234";"1370";"";"101";"";"";"";"Testbuchung";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"0";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";"";""'; // Testbuchung
$csv = mb_convert_encoding($csv, "ISO-8859-1", "UTF-8");
return($csv);
}
}
/*
Documentation DATEV formats
HEADER
| # | Überschrift | Ausdruck | Beschreibung |
|----|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 | Kennzeichen | ^["](EXTF|DTVF)["]$ | EXTF = Export aus 3rd-Party App DTVF = Export aus DATEV App |
| 2 | Versionsnummer | ^(700)$ | Versionsnummer des Headers. Anhand der Versionsnummer können ältere Versionen abwärtskompatibel verarbeitet werden. |
| 3 | Formatkategorie | ^(16|20|21|46|48|65)$ | 16 = Debitoren-/Kreditoren 20 = Kontenbeschriftungen 21 = Buchungsstapel 46 = Zahlungsbedingungen 48 = Diverse Adressen 65 = Wiederkehrende Buchungen |
| 4 | Formatname | ^["](Buchungsstapel|Wiederkehrende Buchungen|Debitoren/Kreditoren| Kontenbeschriftungen| Zahlungsbedingungen| Diverse Adressen)["]$ | Formatname |
| 5 | Formatversion | ^(2|4|5|12)$ | Debitoren-/Kreditoren = 5 Kontenbeschriftungen = 3 Buchungsstapel = 12 Zahlungsbedingungen = 2 Wiederkehrende Buchungen = 4 Diverse Adressen = 2 |
| 6 | Erzeugt am | ^([2])([0])([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])(2[0-3]|[01][0-9])([0-5][0-9])([0-5][0-9][0-9][0-9][0-9])$ | Zeitstempel: YYYYMMDDHHMMSSFFF |
| 7 | Reserviert | ^[]$ | Leerfeld |
| 8 | Reserviert | ^["]\w{0,2}["]$ | Leerfeld |
| 9 | Reserviert | ^["]\w{0,25}["]$ | Leerfeld |
| 10 | Reserviert | ^["]\w{0,25}["]$ | Leerfeld |
| 11 | Beraternummer | ^(\d{4,6}|\d{7})$ | Bereich 1001-9999999 |
| 12 | Mandantennummer | ^\d{1,5}$ | Bereich 1-99999 |
| 13 | WJ-Beginn | ^([2])([0])([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ | Wirtschaftsjahresbeginn Format: YYYYMMDD |
| 14 | Sachkontenlänge | ^[4-8]$ | Nummernlänge der Sachkonten. Wert muss beim Import mit Konfiguration des Mandats in der DATEV App übereinstimmen. |
| 15 | Datum von | ^([2])([0])([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ | Beginn der Periode des Stapels Format: YYYYMMDD Siehe Anhang 2. |
| 16 | Datum bis | ^([2])([0])([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ | Ende der Periode des Stapels Format: YYYYMMDD Siehe Anhang 2. |
| 17 | Bezeichnung | ^["][\w.-/ ]{0,30}["]$ | Bezeichnung des Stapels z.B. „Rechnungsausgang 09/2019 |
| 18 | Diktatkürzel | ^["]([A-Z]{2}){0,2}["]$ | Kürzel in Großbuchstaben des Bearbeiters z.B. "MM" für Max Mustermann |
| 19 | Buchungstyp | ^[1-2]$ | 1 = Finanzbuchführung        (default) 2 = Jahresabschluss |
| 20 | Rechnungs- legungszweck | ^(0|30|40|50|64)$ | 0 = unabhängig        (default) 30 = Steuerrecht 40 = Kalkulatorik 50 = Handelsrecht 64 = IFRS |
| 21 | Festschreibung | ^(0|1)$ | 0 = keine Festschreibung 1 = Festschreibung        (default) |
| 22 | WKZ | ^["]([A-Z]{3})["]$ | ISO-Code der Währung "EUR" = default Liste der ISO-Codes |
| 23 | Reserviert | ^[]$ | Leerfeld |
| 24 | Derivatskennzeichen | ^["]["]$ | Leerfeld |
| 25 | Reserviert | ^[]$ | Leerfeld |
| 26 | Reserviert | ^[]$ | Leerfeld |
| 27 | Sachkonten- rahmen | ^["](\d{2}){0,2}["]$ | Sachkontenrahmen der für die Bewegungsdaten verwendet wurde |
| 28 | ID der Branchen- lösung | ^\d{0,4}$ | Falls eine spezielle DATEV Branchenlösung genutzt wird. |
| 29 | Reserviert | ^[]$ | Leerfeld |
| 30 | Reserviert | ^["]["]$ | Leerfeld |
| 31 | Anwendungs- information | ^["].{0,16}["]$ | Verarbeitungskennzeichen der abgebenden Anwendung z.B. „09/2019 |
| # | Überschrift | Ausdruck | Beschreibung |
|-----|-------------------------------------------|------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 | Umsatz | ^\d{1,10}[,]\d{2}$ | Umsatz/Betrag für den Datensatz z.B.: 1234567890,12 Betrag muss positiv sein. |
| 2 | Soll-/Haben-Kennzeichen | ^["](S|H)["]$ | Soll-/Haben-Kennzeichnung bezieht sich auf das Feld #7 Konto S = SOLL (default) H = HABEN |
| 3 | WKZ Umsatz | ^["]([A-Z]{3})["]$ | ISO-Code der Währung #22 aus Header = default Liste der ISO-Codes |
| 4 | Kurs | ^([1-9]\d{0,3}[,]\d{2,6})$ | Wenn Umsatz in Fremdwährung bei #1 angegeben wird #004, 005 und 006 sind zu übergeben z.B.: 1234,123456 |
| 5 | Basisumsatz | ^(\d{1,10}[,]\d{2})$ | Siehe #004. z.B.: 1234567890,12 |
| 6 | WKZ Basisumsatz | | Siehe #004. Liste der ISO-Codes |
| 7 | Konto | ^(\d{1,9})$ | Sach- oder Personenkonto z.B. 8400 |
| 8 | Gegenkonto (ohne BU-Schlüssel) | ^(\d{1,9})$ | Sach- oder Personenkonto z.B. 70000 |
| 9 | BU-Schlüssel | ^(["]\d{4}["])$ | Steuerungskennzeichen zur Abbildung verschiedener Funktionen/Sachverhalte Weitere Details |
| 10 | Belegdatum | ^(\d{4})$ | Format: TTMM, z.B. 0105 Das Jahr wird immer aus dem Feld 13 des Headers ermittelt |
| 11 | Belegfeld 1 | ^(["][\w$%\-\/]{0,36}["])$ | Rechnungs-/Belegnummer Wird als "Schlüssel" für den Ausgleich offener Rechnungen genutzt z.B. "Rg32029/2019" Sonderzeichen: $ & % * + - / Andere Zeichen sind unzulässig (insbesondere Leerzeichen, Umlaute, Punkt, Komma, Semikolon und Doppelpunkt). |
| 12 | Belegfeld 2 | ^(["][\w$%\-\/]{0,12}["])$ | Mehrere Funktionen Details siehe hier |
| 13 | Skonto | ^([1-9]\d{0,7}[,]\d{2})$ | Skontobetrag z.B. 3,71 nur bei Zahlungsbuchungen zulässig |
| 14 | Buchungstext | ^(["].{0,60}["])$ | 0-60 Zeichen |
| 15 | Postensperre | ^(0|1)$ | Mahn- oder Zahlsperre 0 = keine Sperre (default) 1 = Sperre Die Rechnung kann aus dem Mahnwesen / Zahlungsvorschlag ausgeschlossen werden. |
| 16 | Diverse Adressnummer | ^(["]\w{0,9}["])$ | Adressnummer einer diversen Adresse. #OPOS |
| 17 | Geschäftspartnerbank | ^(\d{3})$ | Referenz um für Lastschrift oder Zahlung eine bestimmte Geschäftspartnerbank genutzt werden soll. #OPOS Beim Import der Geschäftspartnerbank muss auch das Feld SEPA-Mandatsreferenz (Feld-Nr. 105) gefüllt sein. |
| 18 | Sachverhalt | ^(\d{2})$ | Kennzeichen für einen Mahnzins/Mahngebühr-Datensatz 31 = Mahnzins 40 = Mahngebühr #OPOS |
| 19 | Zinssperre | ^(0|1)$ | Sperre für Mahnzinsen 0 = keine Sperre (default) 1 = Sperre #OPOS |
| 20 | Beleglink | Generell:^(["].{0,210}["])$ Konkret für Link in eine DATEV App:^ ["](BEDI|DDMS|DORG)[ ]["] ["][<GUID>]["]["]["]$ | Link zu einem digitalen Beleg in einer DATEV App. BEDI = Unternehmen online Der Beleglink besteht aus einem Programmkürzel und der GUID. Da das Feld Beleglink ein Textfeld ist, müssen in der Schnittstellendatei die Anführungszeichen verdoppelt werden. z.B. "BEDI ""f9a0475d-d0df…""" |
| 21 | Beleginfo -Art 1 | ^(["].{0,20}["])$ | Bei einem DATEV-Format, das aus einem DATEV-Rechnungswesen-Programm erstellt wurde, können diese Felder Informationen aus einem Beleg (z. B. einem elektronischen Kontoumsatz) enthalten. Wird die Feldlänge eines Beleginfo-Inhalts-Feldes überschrit- ten, wird die Information im nächsten Beleginfo-Feld weitergeführt. Wichtiger Hinweis Eine Beleginfo besteht immer aus den Bestandteilen Beleginfo-Art und Beleginfo-Inhalt. Wenn Sie die Beleginfo nutzen möchten, füllen Sie bitte immer beide Felder. Beispiel: Beleginfo-Art: Kontoumsätze der jeweiligen Bank Beleginfo-Inhalt: Buchungsspezifische Inhalte zu den oben genannten Informationsarten |
| 22 | Beleginfo -Inhalt 1 | ^(["].{0,210}["])$ | siehe #21 |
| 23 | Beleginfo -Art 2 | ^(["].{0,20}["])$ | siehe #21 |
| 24 | Beleginfo -Inhalt 2 | ^(["].{0,210}["])$ | siehe #21 |
| 25 | Beleginfo -Art 3 | ^(["].{0,20}["])$ | siehe #21 |
| 26 | Beleginfo -Inhalt 3 | ^(["].{0,210}["])$ | siehe #21 |
| 27 | Beleginfo -Art 4 | ^(["].{0,20}["])$ | siehe #21 |
| 28 | Beleginfo -Inhalt 4 | ^(["].{0,210}["])$ | siehe #21 |
| 29 | Beleginfo -Art 5 | ^(["].{0,20}["])$ | siehe #21 |
| 30 | Beleginfo -Inhalt 5 | ^(["].{0,210}["])$ | siehe #21 |
| 31 | Beleginfo -Art 6 | ^(["].{0,20}["])$ | siehe #21 |
| 32 | Beleginfo -Inhalt 6 | ^(["].{0,210}["])$ | siehe #21 |
| 33 | Beleginfo -Art 7 | ^(["].{0,20}["])$ | siehe #21 |
| 34 | Beleginfo -Inhalt 7 | ^(["].{0,210}["])$ | siehe #21 |
| 35 | Beleginfo -Art 8 | ^(["].{0,20}["])$ | siehe #21 |
| 36 | Beleginfo -Inhalt 8 | ^(["].{0,210}["])$ | siehe #21 |
| 37 | KOST1 -Kostenstelle | ^(["][\w ]{0,36}["])$ | Über KOST1 erfolgt die Zuordnung des Geschäftsvorfalls für die anschließende Kostenrechnung. Die benutzte Länge muss vorher in den Stammdaten vom KOST-Programm eingestellt werden. |
| 38 | KOST2 -Kostenstelle | ^(["][\w ]{0,36}["])$ | Über KOST2 erfolgt die Zuordnung des Geschäftsvorfalls für die anschließende Kostenrechnung. Die benutzte Länge muss vorher in den Stammdaten vom KOST-Programm eingestellt werden. |
| 39 | KOST-Menge | ^\d{12}[,]\d{4}$ | Im KOST-Mengenfeld wird die Wertgabe zu einer bestimmten Bezugsgröße für eine Kostenstelle erfasst. Diese Bezugsgröße kann z. B. kg, g, cm, m, % sein. Die Bezugsgröße ist definiert in den Kostenrechnungs-Stammdaten. Beispiel:123123123,1234 |
| 40 | EU-Mitgliedstaat u. UStID (Bestimmung) | ^(["].{0,15}["])$ | Die USt-IdNr. besteht aus - 2-stelligen Länderkürzel (siehe Dok.-Nr. 1080169; Ausnahme Griechenland und Nordirland: Das Länderkürzel lautet EL für Griechenland und XI für Nordirland) - 13-stelliger USt-IdNr. - Beispiel: DE133546770. Die USt-IdNr kann auch Buchstaben haben, z.B.: bei Österreich Detaillierte Informationen zur Erfassung von EU-Informationen im Buchungssatz: Dok.-Nr: 9211462. |
| 41 | EU-Steuersatz (Bestimmung) | ^\d{2}[,]\d{2}$ | Nur für entsprechende EU-Buchungen: Der im EU-Bestimmungsland gültige Steuersatz. Beispiel: 12,12 |
| 42 | Abw. Versteuerungsart | ^(["](I|K|P|S)["])$ | Für Buchungen, die in einer von der Mandantenstammdaten- Schlüsselung abweichenden Umsatzsteuerart verarbeitet werden sollen, kann die abweichende Versteuerungsart im Buchungssatz übergeben werden: I = Ist-Versteuerung K = keine Umsatzsteuerrechnung P = Pauschalierung (z. B. für Land- und Forstwirtschaft) S = Soll-Versteuerung |
| 43 | Sachverhalt L+L | ^(\d{1,3})$ | Sachverhalte gem. § 13b Abs. 1 Satz 1 Nrn. 1.-5. UStG Achtung: Der Wert 0 ist unzulässig. Sachverhalts-Nummer siehe Info-Doku 1034915 |
| 44 | Funktionsergänzung L+L | ^\d{0,3}$ | Steuersatz / Funktion zum L+L-Sachverhalt Achtung: Der Wert 0 ist unzulässig. Beispiel: Wert 190 für 19% |
| 45 | BU 49 Hauptfunktiontyp | ^\d$ | Bei Verwendung des BU-Schlüssels 49 für „andere Steuer- sätze“ muss der steuerliche Sachverhalt mitgegeben werden |
| 46 | BU 49 Hauptfunktionsnummer | ^\d{0,2}$ | siehe #45 |
| 47 | BU 49 Funktionsergänzung | ^\d{0,3}$ | siehe #45 |
| 48 | Zusatzinformation Art 1 | ^(["].{0,20}["])$ | Zusatzinformationen, die zu Buchungssätzen erfasst werden können. Diese Zusatzinformationen besitzen den Charakter eines Notizzettels und können frei erfasst werden. Wichtiger Hinweis Eine Zusatzinformation besteht immer aus den Bestandtei- len Informationsart und Informationsinhalt. Wenn Sie die Zusatzinformation nutzen möchten, füllen Sie bitte immer beide Felder. Beispiel: Informationsart, z. B. Filiale oder Mengengrößen (qm) Informationsinhalt: buchungsspezifische Inhalte zu den oben genannten Informationsarten. |
| 49 | Zusatzinformation Inhalt 1 | ^(["].{0,210}["])$ | siehe #48 |
| 50 | Zusatzinformation Art 2 | ^(["].{0,20}["])$ | siehe #48 |
| 51 | Zusatzinformation Inhalt 2 | ^(["].{0,210}["])$ | siehe #48 |
| 52 | Zusatzinformation Art 3 | ^(["].{0,20}["])$ | siehe #48 |
| 53 | Zusatzinformation Inhalt 3 | ^(["].{0,210}["])$ | siehe #48 |
| 54 | Zusatzinformation Art 4 | ^(["].{0,20}["])$ | siehe #48 |
| 55 | Zusatzinformation Inhalt 4 | ^(["].{0,210}["])$ | siehe #48 |
| 56 | Zusatzinformation Art 5 | ^(["].{0,20}["])$ | siehe #48 |
| 57 | Zusatzinformation Inhalt 5 | ^(["].{0,210}["])$ | siehe #48 |
| 58 | Zusatzinformation Art 6 | ^(["].{0,20}["])$ | siehe #48 |
| 59 | Zusatzinformation Inhalt 6 | ^(["].{0,210}["])$ | siehe #48 |
| 60 | Zusatzinformation Art 7 | ^(["].{0,20}["])$ | siehe #48 |
| 61 | Zusatzinformation Inhalt 7 | ^(["].{0,210}["])$ | siehe #48 |
| 62 | Zusatzinformation Art 8 | ^(["].{0,20}["])$ | siehe #48 |
| 63 | Zusatzinformation Inhalt 8 | ^(["].{0,210}["])$ | siehe #48 |
| 64 | Zusatzinformation Art 9 | ^(["].{0,20}["])$ | siehe #48 |
| 65 | Zusatzinformation Inhalt 9 | ^(["].{0,210}["])$ | siehe #48 |
| 66 | Zusatzinformation Art 10 | ^(["].{0,20}["])$ | siehe #48 |
| 67 | Zusatzinformation Inhalt 10 | ^(["].{0,210}["])$ | siehe #48 |
| 68 | Zusatzinformation Art 11 | ^(["].{0,20}["])$ | siehe #48 |
| 69 | Zusatzinformation Inhalt 11 | ^(["].{0,210}["])$ | siehe #48 |
| 70 | Zusatzinformation Art 12 | ^(["].{0,20}["])$ | siehe #48 |
| 71 | Zusatzinformation Inhalt 12 | ^(["].{0,210}["])$ | siehe #48 |
| 72 | Zusatzinformation Art 13 | ^(["].{0,20}["])$ | siehe #48 |
| 73 | Zusatzinformation Inhalt 13 | ^(["].{0,210}["])$ | siehe #48 |
| 74 | Zusatzinformation Art 14 | ^(["].{0,20}["])$ | siehe #48 |
| 75 | Zusatzinformation Inhalt 14 | ^(["].{0,210}["])$ | siehe #48 |
| 76 | Zusatzinformation Art 15 | ^(["].{0,20}["])$ | siehe #48 |
| 77 | Zusatzinformation Inhalt 15 | ^(["].{0,210}["])$ | siehe #48 |
| 78 | Zusatzinformation Art 16 | ^(["].{0,20}["])$ | siehe #48 |
| 79 | Zusatzinformation Inhalt 16 | ^(["].{0,210}["])$ | siehe #48 |
| 80 | Zusatzinformation Art 17 | ^(["].{0,20}["])$ | siehe #48 |
| 81 | Zusatzinformation Inhalt 17 | ^(["].{0,210}["])$ | siehe #48 |
| 82 | Zusatzinformation Art 18 | ^(["].{0,20}["])$ | siehe #48 |
| 83 | Zusatzinformation Inhalt 18 | ^(["].{0,210}["])$ | siehe #48 |
| 84 | Zusatzinformation Art 19 | ^(["].{0,20}["])$ | siehe #48 |
| 85 | Zusatzinformation Inhalt 19 | ^(["].{0,210}["])$ | siehe #48 |
| 86 | Zusatzinformation Art 20 | ^(["].{0,20}["])$ | siehe #48 |
| 87 | Zusatzinformation Inhalt 20 | ^(["].{0,210}["])$ | siehe #48 |
| 88 | Stück | ^\d{0,8}$ | Wirkt sich nur bei Sachverhalt mit SKR 14 Land- und Forst- wirtschaft aus, für andere SKR werden die Felder beim Import / Export überlesen bzw. leer exportiert. |
| 89 | Gewicht | ^(\d{1,8}[,]\d{2})$ | siehe #88 |
| 90 | Zahlweise | ^\d{0,2}$ | OPOS-Informationen 1 = Lastschrift 2 = Mahnung 3 = Zahlung |
| 91 | Forderungsart | ^(["]\w{0,10}["])$ | OPOS-Informationen |
| 92 | Veranlagungsjahr | ^(([2])([0])([0-9]{2}))$ | OPOS-Informationen Format: JJJJ |
| 93 | Zugeordnete Fälligkeit | ^((0[1-9]|[1-2][0-9]|3[0-1])(0[1-9]|1[0-2])([2])([0])([0-9]{2}))$ | OPOS-Informationen Format: TTMMJJJJ |
| 94 | Skontotyp | ^\d$ | 1 = Einkauf von Waren 2 = Erwerb von Roh-Hilfs- und Betriebsstoffen |
| 95 | Auftragsnummer | ^(["].{0,30}["])$ | Allgemeine Bezeichnung, des Auftrags / Projekts. Mit der Auftragsnummer muss auch der Buchungstyp (Feld 96) angegeben werden. |
| 96 | Buchungstyp | ^(["][A-Z]{2}["])$ | AA = Angeforderte Anzahlung / Abschlagsrechnung AG = Erhaltene Anzahlung (Geldeingang) AV = Erhaltene Anzahlung (Verbindlichkeit) SR = Schlussrechnung SU = Schlussrechnung (Umbuchung) SG = Schlussrechnung (Geldeingang) SO = Sonstige |
| 97 | USt-Schlüssel (Anzahlungen) | ^\d{0,2}$ | USt-Schlüssel der späteren Schlussrechnung |
| 98 | EU-Mitgliedstaat (Anzahlungen) | ^(["][A-Z]{2}["])$ | EU-Mitgliedstaat der späteren Schlussrechnung siehe Info-Doku 1080169 |
| 99 | Sachverhalt L+L (Anzahlungen) | ^\d{0,3}$ | L+L-Sachverhalt der späteren Schlussrechnung Sachverhalte gem. § 13b UStG Achtung: Der Wert 0 ist unzulässig. Sachverhalts-Nummer siehe Info-Doku 1034915 |
| 100 | EU-Steuersatz (Anzahlungen) | ^(\d{1,2}[,]\d{2})$ | EU-Steuersatz der späteren Schlussrechnung Nur für entsprechende EU-Buchungen: Der im EU-Bestimmungsland gültige Steuersatz. Beispiel: 12,12 |
| 101 | Erlöskonto (Anzahlungen) | ^(\d{4,8})$ | Erlöskonto der späteren Schlussrechnung |
| 102 | Herkunft-Kz | ^(["][A-Z]{2}["])$ | Wird beim Import durch SV (Stapelverarbeitung) ersetzt. |
| 103 | Leerfeld | ^(["].{0,36}["])$ | Wird von DATEV verwendet |
| 104 | KOST-Datum | ^((0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])([2])([0])(\d{2}))$ | Format TTMMJJJJ |
| 105 | SEPA-Mandatsreferenz | ^(["].{0,35}["])$ | Vom Zahlungsempfänger individuell vergebenes Kennzeichen eines Mandats (z.B. Rechnungs- oder Kundennummer). Beim Import der SEPA-Mandatsreferenz muss auch das Feld Geschäftspartnerbank (Feld-Nr. 17) gefüllt sein. |
| 106 | Skontosperre | ^[0|1]$ | Gültige Werte: 0, 1. 1 = Skontosperre 0 = Keine Skontosperre |
| 107 | Gesellschaftername | ^(["].{0,76}["])$ | |
| 108 | Beteiligtennummer | ^(\d{4})$ | Die Beteiligtennummer muss der amtlichen Nummer aus der Feststellungserklärung entsprechen, diese darf nicht beliebig vergeben werden. Die Pflege der Gesellschafterdaten und das Anlegen von Sonderbilanzsachverhalte ist nur in Absprache mit der Steuerkanzlei möglich. Betrifft Feld 107-110. |
| 109 | Identifikationsnummer | ^(["].{0,11}["])$ | |
| 110 | Zeichnernummer | ^(["].{0,20}["])$ | |
| 111 | Postensperre bis | ^((0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])([2])([0])(\d{2}))$ | Format TTMMJJJJ |
| 112 | Bezeichnung SoBil-Sachverhalt | ^(["].{0,30}["])$ | |
| 113 | Kennzeichen SoBil-Buchung | ^(\d{1,2})$ | Sobil-Buchung erzeugt = 1 Sobil-Buchung nicht erzeugt = (Default) bzw. 0 |
| 114 | Festschreibung | ^(0|1)$ | leer = nicht definiert; wird automatisch festgeschrieben 0 = keine Festschreibung 1 = Festschreibung Hat ein Buchungssatz in diesem Feld den Inhalt 1, so wird der gesamte Stapel nach dem Import festgeschrieben. |
| 115 | Leistungsdatum | ^((0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])([2])([0])(\d{2}))$ | Format TTMMJJJJ siehe Info-Doku 9211426 Beim Import des Leistungsdatums muss das Feld „116 Datum Zuord. Steuer-periode“ gefüllt sein. Der Einsatz des Leistungsdatums muss in Absprache mit dem Steuerberater erfolgen. |
| 116 | Datum Zuord. Steuerperiode | ^((0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])([2])([0])(\d{2}))$ | Format TTMMJJJJ |
| 117 | Fälligkeit | ^((0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])([2])([0])(\d{2}))$ | OPOS Informationen, Format: TTMMJJJJ OPOS-Verarbeitungsinformationen über Belegfeld 2 (Feldnummer 12) sind in diesem Fall nicht nutzbar |
| 118 | Generalumkehr | ^(["](0|1)["])$ | G oder 1 = Generalumkehr 0 = keine Generalumkehr |
| 119 | Steuersatz | ^(\d{1,2}[,]\d{2})$ | Wird bei Verwendung von BU-Schlüssel ohne festen Steuersatz benötigt (z. B. BU-Schlüssel 100). Weitere Informationen unter Dok.Nr. 9231347 Kapitel „Erfassung eines Steuersatzes bei Steuerschlüsseln“ |
| 120 | Land | ^(["][A-Z]{2}["])$ | Beispiel: DE für Deutschland |
| 121 | Abrechnungsreferenz | ^(["].{0,50}["])$ | Die Abrechnungsreferenz stellt eine Klammer über alle Transaktionen des Zahlungsdienstleisters und die dazu gehörige Auszahlung dar. Sie wird über den Zahlungsdatenservice bereitgestellt und bei der Erzeugung von Buchungsvorschläge berücksichtigt. |
| 122 | BVV-Position (Betriebsvermögensvergleich) | ^([1|2|3|4|5])$ | Details zum Feld siehe hier 1 Kapitalanpassung 2 Entnahme / Ausschüttung lfd. WJ 3 Einlage / Kapitalzuführung lfd. WJ 4 Übertragung § 6b Rücklage 5 Umbuchung (keine Zuordnung) |
| 123 | EU-Mitgliedstaat u. UStID (Ursprung) | ^(["].{0,15}["])$ | Die USt-IdNr. besteht aus - 2-stelligen Länderkürzel (siehe Dok.-Nr. 1080169) Ausnahme Griechenland: Das Länderkürzel lautet EL) - 13-stelliger USt-IdNr. - Beispiel: DE133546770. Die USt-IdNr kann auch Buchstaben haben, z.B.: bei Österreich Detaillierte Informationen zur Erfassung von EU-Informationen im Buchungssatz: Dok.-Nr: 9211462. |
| 124 | EU-Steuersatz (Ursprung) | ^\d{2}[,]\d{2}$ | Nur für entsprechende EU-Buchungen: Der im EU-Ursprungsland gültige Steuersatz. Beispiel: 12,12 |
*/

View File

@ -1022,36 +1022,24 @@ class Firmendaten {
'arbeitsnachweis_header','arbeitsnachweis_footer','provisionsgutschrift_header','provisionsgutschrift_footer','proformarechnung_header','proformarechnung_footer','eu_lieferung_vermerk','export_lieferung_vermerk'
,'wareneingang_kamera_waage','layout_iconbar','passwort','host','port','mailssl','signatur','email','absendername','bcc1','bcc2','bcc3'
,'firmenfarbe','name','strasse','plz','ort','steuernummer','projekt','steuer_positionen_export','tabsnavigationfarbe','tabsnavigationfarbeschrift'
,"buchhaltung_berater","buchhaltung_mandant","buchhaltung_wj_beginn","buchhaltung_sachkontenlaenge"
);
if(isset($sql2a)){
unset($sql2a);
}
/*
foreach($toupdate as $v) {
$sql2a[] = $v ." = '".$data[$v]."' ";
}
$sql2 = "UPDATE firmendaten SET ".implode(',',$sql2a)." WHERE firma = '$id' LIMIT 1";
unset($sql2a);
$this->app->DB->Update($sql2);
*/
// if($this->app->DB->error()) {
foreach($toupdate as $v) {
$check = $this->app->DB->SELECT("SHOW COLUMNS FROM firmendaten WHERE Field = '$v'");
if ($check) {
$this->app->DB->Update("UPDATE firmendaten SET ".$v." = '".($data[$v])."'"." WHERE firma = '$id' LIMIT 1");
}
}
// }
if(isset($firmendaten_werte_spalten)) {
if (isset($firmendaten_werte_spalten)) {
foreach($toupdate as $key) {
if(isset($firmendaten_werte_spalten[$key]) && $firmendaten_werte_spalten[$key]['wert'] != $data[$key]) {
if(isset($firmendaten_werte_spalten[$key])) {
if ($firmendaten_werte_spalten[$key]['wert'] != $data[$key]) {
$this->app->DB->Update("UPDATE firmendaten_werte SET wert = '".$data[$key]."' WHERE id = '".$firmendaten_werte_spalten[$key]['id']."' LIMIT 1");
unset($firmendaten_werte_spalten[$key]);
if(!empty($doubletes[$key])) {
@ -1065,10 +1053,13 @@ class Firmendaten {
unset($doubletes[$key]);
}
}
} else {
// Create new value in firmendaten_werte
$sql = "INSERT INTO firmendaten_werte (name, wert) VALUES('$key', '".$data[$key]."')";
$this->app->DB->Update($sql);
}
}
}
for($i = 0; $i <= 3; $i++) {
for($j = 0; $j <= 5; $j++) {
@ -1076,23 +1067,12 @@ class Firmendaten {
}
}
/* foreach($toupdate2 as $k => $v) {
$sql2a[] = $k ." = '".$v."' ";
}
$sql2 = "UPDATE firmendaten SET ".implode(',',$sql2a)." WHERE firma = '$id' LIMIT 1";
unset($sql2a);
$this->app->DB->Update($sql2);
*/
// if($this->app->DB->error()) {
foreach($toupdate2 as $k => $v) {
$check = $this->app->DB->SELECT("SHOW COLUMNS FROM firmendaten WHERE Field = '$k'");
if ($check) {
$this->app->DB->Update("UPDATE firmendaten SET ".$k." = '".$v."'"." WHERE firma = '$id' LIMIT 1");
}
}
// }
if(isset($firmendaten_werte_spalten)) {
foreach($toupdate2 as $key => $v) {
@ -1404,6 +1384,9 @@ class Firmendaten {
if(!isset($data[0][$v['name']])){
$data[0][$v['name']] = $v['wert'];
}
// Fill all fields
$this->app->Tpl->Set(strtoupper($v['name']), $v['wert']);
}
}
@ -2085,8 +2068,8 @@ class Firmendaten {
$this->app->Tpl->Set('PLZ' , $data['plz']);
$this->app->Tpl->Set('ORT' , $data['ort']);
$this->app->Tpl->Set('STEUERNUMMER' , $data['steuernummer']);
}
}
/**
* @return array
*/
@ -2272,6 +2255,12 @@ class Firmendaten {
$data['sprachebevorzugen'] = ($this->app->Secure->POST["sprachebevorzugen"]);
// Buchhaltung export datev
$data['buchhaltung_berater'] = ($this->app->Secure->POST["buchhaltung_berater"]);
$data['buchhaltung_mandant'] = ($this->app->Secure->POST["buchhaltung_mandant"]);
$data['buchhaltung_wj_beginn'] = ($this->app->Secure->POST["buchhaltung_wj_beginn"]);
$data['buchhaltung_sachkontenlaenge'] = ($this->app->Secure->POST["buchhaltung_sachkontenlaenge"]);
return $data;
}
@ -3117,7 +3106,6 @@ class Firmendaten {
$this->app->YUI->AutoComplete('document_project', 'projektname', 1);
$this->app->Tpl->Add('TAB1', $table);
//$this->app->Tpl->Set('TAB1', $ret);
$this->app->Tpl->Parse('PAGE','tabview.tpl');

View File

@ -1418,7 +1418,7 @@ class Importvorlage extends GenImportvorlage {
$ersterdatensatz = 1;
$zeitstempel = time();
$number_of_rows = count($tmp['cmd']);
$number_of_rows = empty($tmp['cmd'])?0:count($tmp['cmd']);
$number_of_rows = $number_of_rows + 2;
if($isCronjob) {
@ -1553,6 +1553,13 @@ class Importvorlage extends GenImportvorlage {
}
}
// HERE START OF PROCESSING OF THE ROWS
// INSIDE FOR LOOP
// $i -> loop counter row number starting with 1
// $number_of_rows
// access data -> $tmp['column_name'][$i]
// $tmp['cmd'] -> create or update
// $tmp['checked'] -> 0 or 1
switch($ziel)
{
@ -5021,7 +5028,61 @@ class Importvorlage extends GenImportvorlage {
}
}
break;
case 'kontorahmen':
// Create a row dataset (without checked and cmd)
$update_sql = "";
$row = array();
$comma = "";
foreach ($tmp as $key => $value) {
if ($key != 'cmd' && $key != 'checked') {
$row[$key] = $value[$i];
$comma = ", ";
}
}
if (empty($row['sachkonto'])) {
break;
}
$art_array = array(
'1' => 'Aufwendungen',
'2' => 'Erlöse',
'3' => 'Geldtransit',
'9' => 'Saldo'
);
$row['art'] = array_search($row['art'], $art_array);
$row['projekt'] = $this->app->erp->ReplaceProjekt(true,$row['projekt'],true); // Parameters: Target db?, value, from form?
$sql = "SELECT * FROM kontorahmen WHERE sachkonto = '".$row['sachkonto']."'";
$result = $this->app->DB->SelectArr($sql);
if (!empty($result)) {
$comma = "";
foreach ($row as $key => $value) {
$update_sql .= $comma."`".$key."` = '".$value."'";
$comma = ", ";
}
$sql = "UPDATE kontorahmen SET ".$update_sql." WHERE `sachkonto` = '".$row['sachkonto']."'";
$result = $this->app->DB->Update($sql);
} else {
$sql = "INSERT INTO kontorahmen (".
implode(", ",array_keys($row)).
") VALUES ('".
implode("', '",array_values($row)).
"')";
$result = $this->app->DB->Update($sql);
}
break;
}
// HERE END OF PROCESSING THE ROWS switch($ziel);
if($isCronjob) {
$this->app->DB->Update(
sprintf(

257
www/pages/kontorahmen.php Normal file
View File

@ -0,0 +1,257 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class Kontorahmen {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "kontorahmen_list");
$this->app->ActionHandler("create", "kontorahmen_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "kontorahmen_edit");
$this->app->ActionHandler("delete", "kontorahmen_delete");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
public function Install() {
/* Fill out manually later */
}
static function TableSearch(&$app, $name, $erlaubtevars) {
switch ($name) {
case "kontorahmen_list":
$allowed['kontorahmen_list'] = array('list');
$heading = array('', 'Sachkonto', 'Beschriftung', 'Art', 'Bemerkung', 'Projekt', 'Ausblenden', 'Men&uuml;');
$width = array( '1%','2%' , '10%', '2%', '10%', '2%', '1%', '1%'); // Fill out manually later
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
$art = "CASE
WHEN k.art = 1 THEN 'Aufwendungen'
WHEN k.art = 2 THEN 'Erl&ouml;se'
WHEN k.art = 3 THEN 'Geldtransit'
WHEN k.art = 9 THEN 'Saldo'
ELSE ''
END";
$findcols = array('','k.sachkonto', 'k.beschriftung', "($art)",'k.bemerkung', '(SELECT abkuerzung FROM projekt WHERE projekt.id = k.projekt LIMIT 1)', 'k.ausblenden');
$searchsql = array('k.sachkonto', 'k.beschriftung', 'k.bemerkung', 'k.art', 'k.projekt');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',k.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=kontorahmen&action=edit&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>&nbsp;<a href=\"#\" onclick=DeleteDialog(\"index.php?module=kontorahmen&action=delete&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "</td></tr></table>";
$sql = "SELECT SQL_CALC_FOUND_ROWS
k.id,
$dropnbox,
if(k.ausblenden,CONCAT('<strike>', k.sachkonto,'</strike>'),k.sachkonto) AS sachkonto,
k.beschriftung,
$art
AS art,
k.bemerkung,
(SELECT abkuerzung FROM projekt WHERE projekt.id = k.projekt LIMIT 1),
k.ausblenden,
k.id
FROM kontorahmen k";
$where = "1";
$count = "SELECT count(DISTINCT id) FROM kontorahmen WHERE $where";
// $groupby = "";
break;
}
$erg = false;
foreach ($erlaubtevars as $k => $v) {
if (isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
function kontorahmen_list() {
// Process multi action
$auswahl = $this->app->Secure->GetPOST('auswahl');
$selectedIds = [];
if(!empty($auswahl)) {
foreach($auswahl as $selectedId) {
$selectedId = (int)$selectedId;
if($selectedId > 0) {
$selectedIds[] = $selectedId;
}
}
$sql = "DELETE FROM kontorahmen";
$sql .= " WHERE id IN (".implode(",",$selectedIds).")";
$this->app->DB->Update($sql);
}
$this->app->erp->MenuEintrag("index.php?module=kontorahmen&action=list", "&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=kontorahmen&action=create", "Neu anlegen");
$this->app->erp->MenuEintrag("index.php", "Zur&uuml;ck");
$this->app->YUI->TableSearch('TAB1', 'kontorahmen_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "kontorahmen_list.tpl");
}
public function kontorahmen_delete() {
$id = (int) $this->app->Secure->GetGET('id');
$this->app->DB->Delete("DELETE FROM `kontorahmen` WHERE `id` = '{$id}'");
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Der Eintrag wurde gel&ouml;scht.</div>");
$this->kontorahmen_list();
}
/*
* Edit kontorahmen item
* If id is empty, create a new one
*/
function kontorahmen_edit() {
$id = $this->app->Secure->GetGET('id');
// Check if other users are editing this id
if($this->app->erp->DisableModul('artikel',$id))
{
return;
}
$this->app->Tpl->Set('ID', $id);
$this->app->erp->MenuEintrag("index.php?module=kontorahmen&action=edit&id=$id", "Details");
$this->app->erp->MenuEintrag("index.php?module=kontorahmen&action=list", "Zur&uuml;ck zur &Uuml;bersicht");
$id = $this->app->Secure->GetGET('id');
$input = $this->GetInput();
$submit = $this->app->Secure->GetPOST('submit');
if (empty($id)) {
// New item
$id = 'NULL';
}
if ($submit != '')
{
// Write to database
// Add checks here
$input['projekt'] = $this->app->erp->ReplaceProjekt(true,$input['projekt'],true); // Parameters: Target db?, value, from form?
$columns = "id, ";
$values = "$id, ";
$update = "";
$fix = "";
foreach ($input as $key => $value) {
$columns = $columns.$fix.$key;
$values = $values.$fix."'".$value."'";
$update = $update.$fix.$key." = '$value'";
$fix = ", ";
}
// echo($columns."<br>");
// echo($values."<br>");
// echo($update."<br>");
$sql = "INSERT INTO kontorahmen (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
// echo($sql);
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$msg = $this->app->erp->base64_url_encode("<div class=\"success\">Das Element wurde erfolgreich angelegt.</div>");
header("Location: index.php?module=kontorahmen&action=list&msg=$msg");
} else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"success\">Die Einstellungen wurden erfolgreich &uuml;bernommen.</div>");
}
}
// Load values again from database
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',k.id,'\" />') AS `auswahl`";
$result = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS k.id, $dropnbox, k.sachkonto, k.beschriftung, k.bemerkung, k.ausblenden, k.art, k.projekt, k.id FROM kontorahmen k"." WHERE id=$id");
$result[0]['projekt'] = $this->app->erp->ReplaceProjekt(false,$result[0]['projekt'],false); // Parameters: Target db?, value, from form?
foreach ($result[0] as $key => $value) {
$this->app->Tpl->Set(strtoupper($key), $value);
}
/*
* Add displayed items later
*
$this->app->Tpl->Add('KURZUEBERSCHRIFT2', $email);
$this->app->Tpl->Add('EMAIL', $email);
$this->app->Tpl->Add('ANGEZEIGTERNAME', $angezeigtername);
*/
$this->app->Tpl->Set('AUSBLENDEN', $result[0]['ausblenden']==1?"checked":"");
$this->app->YUI->AutoComplete("projekt","projektname",1);
$art_array = array(
'1' => 'Aufwendungen',
'2' => 'Erl&ouml;se',
'3' => 'Geldtransit',
'9' => 'Saldo'
);
$this->app->Tpl->Set('ART', $this->app->erp->GetSelectAsso($art_array,$result[0]['art']));
// $this->SetInput($input);
$this->app->Tpl->Parse('PAGE', "kontorahmen_edit.tpl");
}
/**
* Get all paramters from html form and save into $input
*/
public function GetInput(): array {
$input = array();
//$input['EMAIL'] = $this->app->Secure->GetPOST('email');
$input['sachkonto'] = $this->app->Secure->GetPOST('sachkonto');
$input['beschriftung'] = $this->app->Secure->GetPOST('beschriftung');
$input['bemerkung'] = $this->app->Secure->GetPOST('bemerkung');
$input['ausblenden'] = !empty($this->app->Secure->GetPOST('ausblenden'))?"1":"0";
$input['art'] = $this->app->Secure->GetPOST('art');
$input['projekt'] = $this->app->Secure->GetPOST('projekt');
return $input;
}
/*
* Set all fields in the page corresponding to $input
*/
function SetInput($input) {
// $this->app->Tpl->Set('EMAIL', $input['email']);
$this->app->Tpl->Set('SACHKONTO', $input['sachkonto']);
$this->app->Tpl->Set('BESCHRIFTUNG', $input['beschriftung']);
$this->app->Tpl->Set('BEMERKUNG', $input['bemerkung']);
$this->app->Tpl->Set('AUSBLENDEN', $input['ausblenden']);
$this->app->Tpl->Set('ART', $input['art']);
$this->app->Tpl->Set('PROJEKT', $input['projekt']);
}
}

View File

@ -147,6 +147,48 @@ class Onlineshops extends GenShopexport {
$where = " s.shopid = '$id' AND g.aktiv = 1";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"#\" onclick=kundengruppenEdit(%value%)>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>" . "&nbsp;" . "<a href=\"#\" onclick=DeleteDialog(\"index.php?module=onlineshops&action=kundengruppendelete&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "&nbsp;</td></tr></table>";
break;
case 'shopexport_artikellist':
$id = $app->Secure->GetGET('id');
$allowed['onlineshops'] = array('artikellist');
$heading = array('', '', 'Artikel-Nr.','Artikel','Aktiv','Lagersync','Einstellungen aus Artikel','Letzte Artikel&uuml;bertragung','Letzter Lagersync','Lagercache','Men&uuml;');
$width = array( '1%','1%', '5%', '40%', '1%', '1%', '1%', '7%', '7%', '1%', '1%');
$findcols = array('a.id','a.id','a.nummer','a.name_de','aos.aktiv','a.autolagerlampe','aos.ausartikel','last_article_transfer','aos.last_storage_transfer','a.cache_lagerplatzinhaltmenge');
$searchsql = array('a.nummer','a.name_de');
$defaultorder = 1; //Optional wenn andere Reihenfolge gewuenscht
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',a.id,'\" />') AS `auswahl`";
$sql = "
SELECT SQL_CALC_FOUND_ROWS
a.id,".
$dropnbox.",
a.nummer,
a.name_de,
aos.aktiv,
a.autolagerlampe,
aos.ausartikel,".
$app->erp->FormatDateTime('aos.last_article_transfer').",".
$app->erp->FormatDateTime('aos.last_storage_transfer').",
if(a.cache_lagerplatzinhaltmenge = -999,'',a.cache_lagerplatzinhaltmenge) cache,
a.id
FROM
artikel a
INNER JOIN artikel_onlineshops aos ON
a.id = aos.artikel
INNER JOIN shopexport s ON
s.id = aos.shop
";
$where = " s.id = '$id'";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=artikel&action=edit&id=%value%#tabs-4\"><img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a></td></tr></table>";
// $menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"#\" onclick=kundengruppenEdit(%value%)>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>" . "&nbsp;" . "<a href=\"#\" onclick=DeleteDialog(\"index.php?module=onlineshops&action=kundengruppendelete&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "&nbsp;</td></tr></table>";
$orderby = null;
break;
}
$erg = [];
@ -216,6 +258,8 @@ class Onlineshops extends GenShopexport {
$this->app->ActionHandler('itemlink', 'ShopexportItemlink');
$this->app->ActionHandler('orderlink', 'ShopexportOrderlink');
$this->app->ActionHandler('artikellist', 'ShopexportArtikelList');
$this->app->erp->Headlines('Shopexport');
$this->app->ActionHandlerListen($app);
}
@ -2790,6 +2834,46 @@ class Onlineshops extends GenShopexport {
parent::ShopexportList();
}
public function ShopexportArtikelList()
{
// Copied from shopexport (dirty)
$id = (int)$this->app->Secure->GetGET('id');
$delcache = $this->app->Secure->GetPOST('delcache');
$delcacheselected = $this->app->Secure->GetPOST('delcacheselected');
// Process multi action
$where = "1";
$auswahl = $this->app->Secure->GetPOST('auswahl');
$selectedIds = [];
if(!empty($auswahl)) {
foreach($auswahl as $selectedId) {
$selectedId = (int)$selectedId;
if($selectedId > 0) {
$selectedIds[] = $selectedId;
}
}
$where = "a.id IN (".implode(",",$selectedIds).")";
}
if(!empty($delcache) || !empty($delcacheselected)) {
$anz = 0;
if($id > 0) {
$this->app->DB->Update("UPDATE artikel a
LEFT JOIN (SELECT artikel FROM artikel_onlineshops WHERE shop = '$id' AND aktiv = 1 GROUP BY artikel) oa ON a.id = oa.artikel
SET a.cache_lagerplatzinhaltmenge = -999 WHERE (a.shop = '$id' OR a.shop2 = '$id' OR a.shop3 = '$id' OR NOT ISNULL(oa.artikel)) AND a.geloescht = 0 AND ($where)");
$anz = $this->app->DB->affected_rows();
$this->app->erp->LogFile("Lagerzahlencache zurückgesetzt für $anz Artikel, shopid: $id");
$this->app->Tpl->Add('MESSAGE','<div class="info">Lagerzahlencache zurückgesetzt für '.$anz.' Artikel, shopid: '.$id.'</div>');
}
}
$this->ShopexportMenu();
$this->app->YUI->TableSearch('TAB1','shopexport_artikellist', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "shopexport_artikellist.tpl");
}
/**
* @param array $importerCapabilities
* @param array $featureKeys
@ -2942,6 +3026,7 @@ class Onlineshops extends GenShopexport {
//$this->app->Tpl->Add('KURZUEBERSCHRIFT2',$name);
$this->app->erp->MenuEintrag('index.php?module=onlineshops&action=edit&id='.$id,'Details');
//$this->app->erp->MenuEintrag("index.php?module=shopexport&action=export&id=$id","Export");
$this->app->erp->MenuEintrag('index.php?module=onlineshops&action=artikellist&id='.$id,'Artikelliste');
$this->app->erp->MenuEintrag('index.php?module=shopexport&action=artikeluebertragung&id='.$id,'Artikel &Uuml;bertragung');
if($this->app->DB->Select("SELECT modulename FROM shopexport WHERE id = '$id'") === 'shopimporter_shopware'){
//Soll nur in Shopware angezeigt werden, da nur in Shopware unterstüzt

View File

@ -52,6 +52,8 @@ class Shopexport
$this->app->ActionHandler("dateien","ShopexportDateien");
$this->app->ActionHandler("live","ShopexportLive");
$this->app->ActionHandler('artikellist', 'ShopexportArtikelList');
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
@ -260,6 +262,7 @@ class Shopexport
$this->app->erp->MenuEintrag("index.php?module=onlineshops&action=edit&id=$id",'Details');
//$this->app->erp->MenuEintrag("index.php?module=shopexport&action=export&id=$id","Export");
$this->app->erp->MenuEintrag('index.php?module=onlineshops&action=artikellist&id='.$id,'Artikelliste');
$this->app->erp->MenuEintrag("index.php?module=shopexport&action=artikeluebertragung&id=$id","Artikel &Uuml;bertragung");
if($this->app->DB->Select("SELECT modulename FROM shopexport WHERE id = '$id'") === 'shopimporter_shopware'){
//Soll nur in Shopware angezeigt werden, da nur in Shopware unterstüzt
@ -927,6 +930,13 @@ class Shopexport
$this->app->Tpl->Parse('PAGE','shopexport_artikeluebertragung.tpl');
}
public function ShopexportArtikelList()
{
$this->ShopexportMenu();
$this->app->YUI->TableSearch('TAB1','shopexport_artikellist', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "shopexport_artikellist.tpl");
}
public function ShopexportAdressuebertragung()
{
$id = (int)$this->app->Secure->GetGET('id');

View File

@ -0,0 +1,202 @@
<?php
/*
* Copyright (c) 2022 OpenXE project
*/
use Xentral\Components\Database\Exception\QueryFailureException;
class Zolltarifnummer {
function __construct($app, $intern = false) {
$this->app = $app;
if ($intern)
return;
$this->app->ActionHandlerInit($this);
$this->app->ActionHandler("list", "zolltarifnummer_list");
$this->app->ActionHandler("create", "zolltarifnummer_edit"); // This automatically adds a "New" button
$this->app->ActionHandler("edit", "zolltarifnummer_edit");
$this->app->ActionHandler("delete", "zolltarifnummer_delete");
$this->app->DefaultActionHandler("list");
$this->app->ActionHandlerListen($app);
}
public function Install() {
/* Fill out manually later */
}
static function TableSearch(&$app, $name, $erlaubtevars) {
switch ($name) {
case "zolltarifnummer_list":
$allowed['zolltarifnummer_list'] = array('list');
$heading = array('','','Nummer', 'Beschreibung', 'Interne Bemerkung', 'Men&uuml;');
$width = array('1%','1%','30%','30%','30%','1%'); // Fill out manually later
// columns that are aligned right (numbers etc)
// $alignright = array(4,5,6,7,8);
$findcols = array('z.id','z.id','z.nummer', 'z.beschreibung', 'z.internebemerkung');
$searchsql = array('z.nummer', 'z.beschreibung', 'z.internebemerkung');
$defaultorder = 1;
$defaultorderdesc = 0;
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',z.id,'\" />') AS `auswahl`";
$menu = "<table cellpadding=0 cellspacing=0><tr><td nowrap>" . "<a href=\"index.php?module=zolltarifnummer&action=edit&id=%value%\"><img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\"></a>&nbsp;<a href=\"#\" onclick=DeleteDialog(\"index.php?module=zolltarifnummer&action=delete&id=%value%\");>" . "<img src=\"themes/{$app->Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\"></a>" . "</td></tr></table>";
$sql = "SELECT SQL_CALC_FOUND_ROWS z.id, $dropnbox, z.nummer, z.beschreibung, z.internebemerkung, z.id FROM zolltarifnummer z";
$where = "1";
$count = "SELECT count(DISTINCT id) FROM zolltarifnummer WHERE $where";
// $groupby = "";
break;
}
$erg = false;
foreach ($erlaubtevars as $k => $v) {
if (isset($$v)) {
$erg[$v] = $$v;
}
}
return $erg;
}
function zolltarifnummer_list() {
$this->app->erp->MenuEintrag("index.php?module=zolltarifnummer&action=list", "&Uuml;bersicht");
$this->app->erp->MenuEintrag("index.php?module=zolltarifnummer&action=create", "Neu anlegen");
$this->app->erp->MenuEintrag("index.php", "Zur&uuml;ck");
$this->app->YUI->TableSearch('TAB1', 'zolltarifnummer_list', "show", "", "", basename(__FILE__), __CLASS__);
$this->app->Tpl->Parse('PAGE', "zolltarifnummer_list.tpl");
}
public function zolltarifnummer_delete() {
$id = (int) $this->app->Secure->GetGET('id');
$this->app->DB->Delete("DELETE FROM `zolltarifnummer` WHERE `id` = '{$id}'");
$this->app->Tpl->Set('MESSAGE', "<div class=\"error\">Der Eintrag wurde gel&ouml;scht.</div>");
$this->zolltarifnummer_list();
}
/*
* Edit zolltarifnummer item
* If id is empty, create a new one
*/
function zolltarifnummer_edit() {
$id = $this->app->Secure->GetGET('id');
// Check if other users are editing this id
if($this->app->erp->DisableModul('artikel',$id))
{
return;
}
$this->app->Tpl->Set('ID', $id);
$this->app->erp->MenuEintrag("index.php?module=zolltarifnummer&action=edit&id=$id", "Details");
$this->app->erp->MenuEintrag("index.php?module=zolltarifnummer&action=list", "Zur&uuml;ck zur &Uuml;bersicht");
$id = $this->app->Secure->GetGET('id');
$input = $this->GetInput();
$submit = $this->app->Secure->GetPOST('submit');
if (empty($id)) {
// New item
$id = 'NULL';
}
if ($submit != '')
{
// Write to database
// Add checks here
$columns = "id, ";
$values = "$id, ";
$update = "";
$fix = "";
foreach ($input as $key => $value) {
$columns = $columns.$fix.$key;
$values = $values.$fix."'".$value."'";
$update = $update.$fix.$key." = '$value'";
$fix = ", ";
}
// echo($columns."<br>");
// echo($values."<br>");
// echo($update."<br>");
$sql = "INSERT INTO zolltarifnummer (".$columns.") VALUES (".$values.") ON DUPLICATE KEY UPDATE ".$update;
// echo($sql);
$this->app->DB->Update($sql);
if ($id == 'NULL') {
$msg = $this->app->erp->base64_url_encode("<div class=\"success\">Das Element wurde erfolgreich angelegt.</div>");
header("Location: index.php?module=zolltarifnummer&action=list&msg=$msg");
} else {
$this->app->Tpl->Set('MESSAGE', "<div class=\"success\">Die Einstellungen wurden erfolgreich &uuml;bernommen.</div>");
}
}
// Load values again from database
$dropnbox = "'<img src=./themes/new/images/details_open.png class=details>' AS `open`, CONCAT('<input type=\"checkbox\" name=\"auswahl[]\" value=\"',z.id,'\" />') AS `auswahl`";
$result = $this->app->DB->SelectArr("SELECT SQL_CALC_FOUND_ROWS z.id, $dropnbox, z.nummer, z.beschreibung, z.internebemerkung, z.id FROM zolltarifnummer z"." WHERE id=$id");
foreach ($result[0] as $key => $value) {
$this->app->Tpl->Set(strtoupper($key), $value);
}
/*
* Add displayed items later
*
$this->app->Tpl->Add('KURZUEBERSCHRIFT2', $email);
$this->app->Tpl->Add('EMAIL', $email);
$this->app->Tpl->Add('ANGEZEIGTERNAME', $angezeigtername);
*/
// $this->SetInput($input);
$this->app->Tpl->Parse('PAGE', "zolltarifnummer_edit.tpl");
}
/**
* Get all paramters from html form and save into $input
*/
public function GetInput(): array {
$input = array();
//$input['EMAIL'] = $this->app->Secure->GetPOST('email');
$input['nummer'] = $this->app->Secure->GetPOST('nummer');
$input['beschreibung'] = $this->app->Secure->GetPOST('beschreibung');
$input['internebemerkung'] = $this->app->Secure->GetPOST('internebemerkung');
return $input;
}
/*
* Set all fields in the page corresponding to $input
*/
function SetInput($input) {
// $this->app->Tpl->Set('EMAIL', $input['email']);
$this->app->Tpl->Set('NUMMER', $input['nummer']);
$this->app->Tpl->Set('BESCHREIBUNG', $input['beschreibung']);
$this->app->Tpl->Set('INTERNEBEMERKUNG', $input['internebemerkung']);
}
}

View File

@ -75,9 +75,10 @@ class WidgetGenimportvorlage
$field->AddOption('Adresse&nbsp;(min. Angabe: name)','adresse');
$field->AddOption('Artikel&nbsp;(min. Angabe: nummer oder name_de)','artikel');
$field->AddOption('Einkaufspreise&nbsp;(min. Angabe: lieferantennummer und herstellernummer oder herstellernummer )','einkauf');
$field->AddOption('Zeiterfassung&nbsp;(min. Angabe datum_von,zeit_von,datum_bis,zeit_bis,kundennummer,taetigkeit)','zeiterfassung');
$field->AddOption('Wiedervorlagen (min. Angabe datum_faellig, kundennummer,mitarbeiternummer,betreff)','wiedervorlagen');
$field->AddOption('Notizen (min. Angabe datum,kundennummer,mitarbeiternummer,betreff)','notizen');
$field->AddOption('Zeiterfassung&nbsp;(min. Angabe: datum_von,zeit_von,datum_bis,zeit_bis,kundennummer,taetigkeit)','zeiterfassung');
$field->AddOption('Wiedervorlagen (min. Angabe: datum_faellig, kundennummer,mitarbeiternummer,betreff)','wiedervorlagen');
$field->AddOption('Notizen (min. Angabe: datum,kundennummer,mitarbeiternummer,betreff)','notizen');
$field->AddOption('Kontenrahmen (min. Angabe: sachkonto,beschriftung,art)','kontorahmen');
$this->form->NewField($field);
$field = new HTMLInput("importerstezeilenummer","text","","15","","","","","","","","0","","");

View File

@ -509,6 +509,18 @@ class WidgetGenprojekt
$field = new HTMLInput("steuer_aufwendung_inland_import","text","","10","","","","","","","","0","","");
$this->form->NewField($field);
$field = new HTMLInput("buchhaltung_berater","text","","10","","","","","","","","0","","");
$this->form->NewField($field);
$field = new HTMLInput("buchhaltung_mandant","text","","10","","","","","","","","0","","");
$this->form->NewField($field);
$field = new HTMLInput("buchhaltung_wj_beginn","text","","10","","","","","","","","0","","");
$this->form->NewField($field);
$field = new HTMLInput("buchhaltung_sachkontenlaenge","text","","10","","","","","","","","0","","");
$this->form->NewField($field);
$field = new HTMLSelect("kasse_lagerprozess",0,"kasse_lagerprozess","","","0");
$field->AddOption('{|Keine Lagerbuchung erzeugen|}','kein');

View File

@ -348,14 +348,11 @@
<div class="row">
<div class="row-height">
<div class="col-xs-12 col-md-6 col-md-height">
<div class="col-xs-12 col-md-4 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Finanzbuchhaltung Export Kontenrahmen|}</legend>
<legend>{|Finanzbuchhaltung Export Erl&ouml;se|}</legend>
<table border="0" width="100%">
<tr>
<td width="300"></td><td>Erl&ouml;se</td>
</tr>
<tr>
<td width="300">Inland (normal):</td><td>[STEUER_ERLOESE_INLAND_NORMAL][MSGSTEUER_ERLOESE_INLAND_NORMAL]</td>
</tr>
@ -380,13 +377,11 @@
</fieldset>
</div>
</div>
<div class="col-xs-12 col-md-6 col-md-height">
<div class="col-xs-12 col-md-4 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Finanzbuchhaltung Export Aufwendungen|}</legend>
<table>
<tr>
<td width="300"></td><td>Aufwendungen</td>
</tr>
<tr>
<td width="300">Inland (normal):</td><td>[STEUER_AUFWENDUNG_INLAND_NORMAL][MSGSTEUER_AUFWENDUNG_INLAND_NORMAL]</td>
</tr>
@ -412,6 +407,27 @@
</fieldset>
</div>
</div>
<div class="col-xs-12 col-md-4 col-md-height">
<div class="inside inside-full-height">
<fieldset>
<legend>{|Finanzbuchhaltung Export Einstellungen|}</legend>
<table>
<tr>
<td width="300">Berater:</td><td>[BUCHHALTUNG_BERATER]</td>
</tr>
<tr>
<td width="300">Mandant:</td><td>[BUCHHALTUNG_MANDANT]</td>
</tr>
<tr>
<td width="300">Wirtschaftsjahr Beginn (MMDD):</td><td>[BUCHHALTUNG_WJ_BEGINN]</td>
</tr>
<tr>
<td width="300">Sachkontenl&auml;nge (4-8):</td><td>[BUCHHALTUNG_SACHKONTENLAENGE]</td>
</tr>
</table>
</fieldset>
</div>
</div>
</div>
</div>
<br />