| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /tmp/sc/ |
Upload File : |
<?php
/* Smarty version 3.1.30, created on 2026-06-27 05:56:50
from "/var/www/clients/client1/web17/web/includes/templates/templates/pacim/system.tpl" */
/* @var Smarty_Internal_Template $_smarty_tpl */
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
'version' => '3.1.30',
'unifunc' => 'content_6a3f4a029d75f8_96293921',
'has_nocache_code' => false,
'file_dependency' =>
array (
'aaa9bd23e3f1e2b5299abb073c09508af0e52f73' =>
array (
0 => '/var/www/clients/client1/web17/web/includes/templates/templates/pacim/system.tpl',
1 => 1782389322,
2 => 'file',
),
),
'includes' =>
array (
'file:pacim/_company.tpl' => 1,
'file:pacim/_api.tpl' => 1,
'file:pacim/_users.tpl' => 1,
),
),false)) {
function content_6a3f4a029d75f8_96293921 (Smarty_Internal_Template $_smarty_tpl) {
?>
<link rel="stylesheet" href="<?php echo @constant('SITE_URL');?>
/assets/css/cockpit.css?v=<?php echo filemtime((@constant('PATH_SYSTEM')).('/assets/css/cockpit.css'));?>
">
<div class="page-header">
<div class="page-header-row d-flex justify-content-between align-items-center flex-wrap gap-2">
<div>
<div class="stat-label">PaCIM System</div>
<h1 class="h3 mb-0">Einstellungen</h1>
</div>
</div>
</div>
<ul class="nav nav-tabs mb-3" role="tablist">
<li class="nav-item"><button class="nav-link active" data-bs-toggle="tab" data-bs-target="#set-overview" type="button" role="tab">Übersicht</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#set-company" type="button" role="tab">Unternehmen</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#set-accounting" type="button" role="tab">Buchhaltung</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#set-sources" type="button" role="tab">Buchungsquellen</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#set-mail" type="button" role="tab">E-Mail</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#set-api" type="button" role="tab">API</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#set-users" type="button" role="tab">Benutzer</button></li>
</ul>
<div class="tab-content">
<div class="tab-pane fade show active" id="set-overview" role="tabpanel">
<form id="overview-settings-form" autocomplete="off" style="max-width:560px;">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<span class="fw-bold">Benachrichtigungen (Pushover)</span>
<button type="submit" class="btn btn-sm btn-primary"><i class="material-icons sm">save</i> Speichern</button>
</div>
<div class="card-body">
<label class="form-label">Pushover App-Token <span class="text-muted">(systemweit)</span></label>
<input type="text" class="form-control" id="set-pushover-app" name="pushover_app_token" autocomplete="off" placeholder="leer lassen = unverändert">
<div class="form-text">
Gilt für alle Benutzer. Einmal in <a href="https://pushover.net/apps/build" target="_blank" rel="noopener">Pushover</a> eine Anwendung anlegen und den API-Token hier eintragen.
Den persönlichen User-Key und die gewünschten Benachrichtigungen legt jeder Benutzer selbst fest (Reiter <em>Benutzer</em> → bearbeiten → <em>Benachrichtigungen</em>).
<span id="set-pushover-app-state" class="fw-semibold"></span>
</div>
<div id="set-overview-msg" class="small mt-2"></div>
</div>
</div>
</form>
</div>
<div class="tab-pane fade" id="set-company" role="tabpanel">
<?php $_smarty_tpl->_subTemplateRender("file:pacim/_company.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
?>
</div>
<div class="tab-pane fade" id="set-accounting" role="tabpanel">
<form id="accounting-settings-form" autocomplete="off">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<span class="fw-bold">Google Drive – Buchhaltung</span>
<button type="submit" class="btn btn-sm btn-primary"><i class="material-icons sm">save</i> Speichern</button>
</div>
<div class="card-body">
<div class="mb-3" style="max-width:560px;">
<label class="form-label">Google-Drive-Zielordner (Ordner-ID)</label>
<input type="text" class="form-control" id="set-gdrive-folder" name="gdrive_accounting_folder" placeholder="z. B. 1WwoH_3YU20LSrQEcGK_cGWm46RfNjlq1">
<div class="form-text">In diesen Ordner werden die Monatsabrechnungen (Rechnungen + Excel) übertragen. Die Ordner-ID findest du in der Google-Drive-URL (…/folders/<strong>ID</strong>).</div>
</div>
<div id="set-accounting-msg" class="small"></div>
</div>
</div>
</form>
</div>
<div class="tab-pane fade" id="set-sources" role="tabpanel">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<span class="fw-bold">Buchungsquellen</span>
<button class="btn btn-sm btn-primary" id="srcAddBtn"><i class="material-icons sm">add</i> Quelle hinzufügen</button>
</div>
<div class="card-body">
<div class="text-muted small mb-2">Die Quelle (<code>customer_source</code>) kennzeichnet die Herkunft einer Buchung. Feste Quellen sind nicht löschbar. Partner-/Reisebüro-Buchungen werden automatisch mit der Quelle <strong>partner</strong> erfasst.</div>
<div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Bezeichnung</th><th>Wert</th><th>Typ</th><th class="text-end">Kunden</th><th></th></tr></thead>
<tbody id="srcBody"><tr><td colspan="5" class="text-center text-muted py-3">Wird geladen …</td></tr></tbody>
</table>
</div>
<div id="srcOther" class="small text-muted mt-2"></div>
<div id="srcMsg" class="small mt-2"></div>
</div>
</div>
</div>
<div class="tab-pane fade" id="set-mail" role="tabpanel">
<form id="mailSettingsForm" autocomplete="off">
<input type="hidden" name="smtpform" value="1">
<div class="card mb-3">
<div class="card-header d-flex justify-content-between align-items-center">
<span class="fw-bold">SMTP-Versand (PHPMailer)</span>
<button type="submit" class="btn btn-sm btn-primary"><i class="material-icons sm">save</i> Speichern</button>
</div>
<div class="card-body">
<div class="alert alert-info small">Versandweg: <strong>Extern</strong> = bisheriger Versand bleibt aktiv. <strong>SMTP (lokal)</strong> = PaCIM versendet selbst. Erst nach Umschalten auf SMTP wird der lokale Versand produktiv genutzt.</div>
<div class="row g-3">
<div class="col-12 col-md-4"><label class="form-label">Versandweg</label>
<select class="form-select" name="transport" id="ms-transport">
<option value="external">Extern (bisheriger Versand)</option>
<option value="smtp">SMTP lokal (PHPMailer)</option>
</select>
</div>
<div class="col-12 col-md-5"><label class="form-label">SMTP-Host</label><input class="form-control" name="host" id="ms-host"></div>
<div class="col-6 col-md-3"><label class="form-label">Port</label><input class="form-control" type="number" name="port" id="ms-port"></div>
<div class="col-6 col-md-3"><label class="form-label">Verschlüsselung</label>
<select class="form-select" name="secure" id="ms-secure"><option value="">keine</option><option value="tls">TLS (STARTTLS)</option><option value="ssl">SSL</option></select>
</div>
<div class="col-6 col-md-3 d-flex align-items-end"><label class="form-check d-flex align-items-center gap-2"><input class="form-check-input" type="checkbox" name="auth" id="ms-auth" value="1"> <span>Authentifizierung</span></label></div>
<div class="col-12 col-md-6"><label class="form-label">Benutzer</label><input class="form-control" name="user" id="ms-user" autocomplete="off"></div>
<div class="col-12 col-md-6"><label class="form-label">Passwort</label><input class="form-control" type="password" name="pass" id="ms-pass" autocomplete="new-password" placeholder="•••••• (leer = unverändert)"></div>
<div class="col-12 col-md-6"><label class="form-label">Absender-Adresse</label><input class="form-control" type="email" name="from_email" id="ms-from-email"></div>
<div class="col-12 col-md-6"><label class="form-label">Absender-Name</label><input class="form-control" name="from_name" id="ms-from-name"></div>
</div>
<hr>
<div class="d-flex flex-wrap align-items-center gap-2">
<button type="button" class="btn btn-light border" id="ms-test-connect"><i class="material-icons sm">wifi_tethering</i> Verbindung testen</button>
<input class="form-control" style="max-width:260px;" type="email" id="ms-test-to" placeholder="Testmail an …">
<button type="button" class="btn btn-light border" id="ms-test-mail"><i class="material-icons sm">send</i> Testmail senden</button>
<span class="small ms-2" id="ms-test-status"></span>
</div>
<div class="js-status small mt-2" id="ms-status"></div>
<div class="text-muted small mt-2">Universeller Header & Footer sowie Navigations-Links werden im Bereich <a href="<?php echo @constant('SITE_URL');?>
/mailing/">Mailing → Einstellungen</a> gepflegt.</div>
</div>
</div>
</form>
</div>
<div class="tab-pane fade" id="set-api" role="tabpanel">
<?php $_smarty_tpl->_subTemplateRender("file:pacim/_api.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
?>
</div>
<div class="tab-pane fade" id="set-users" role="tabpanel">
<?php $_smarty_tpl->_subTemplateRender("file:pacim/_users.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, $_smarty_tpl->cache_lifetime, array(), 0, false);
?>
</div>
</div>
<div class="modal fade" id="srcModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title" id="srcModalTitle">Quelle</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
<form id="srcForm" autocomplete="off">
<div class="modal-body">
<input type="hidden" name="orig" id="srcOrig">
<div class="mb-3"><label class="form-label">Bezeichnung</label><input class="form-control" name="label" id="srcLabel" placeholder="z. B. Costa"></div>
<div class="mb-1"><label class="form-label">Wert (customer_source) *</label><input class="form-control" name="key" id="srcKey" required placeholder="z. B. Costa"></div>
<div class="form-text">Dieser Wert wird in der Datenbank gespeichert. Nach dem Anlegen nicht mehr änderbar.</div>
<div class="js-status small mt-2" id="srcFormMsg"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Abbrechen</button>
<button class="btn btn-primary" type="submit"><i class="material-icons sm">save</i> Speichern</button>
</div>
</form>
</div>
</div>
</div>
<?php echo '<script'; ?>
>
document.addEventListener('DOMContentLoaded', function () {
if (typeof SITE_URL === 'undefined') return;
var API = SITE_URL + '/settings-api.php';
var accForm = document.getElementById('accounting-settings-form');
var ovForm = document.getElementById('overview-settings-form');
var gdrive = document.getElementById('set-gdrive-folder');
var pushApp = document.getElementById('set-pushover-app');
var pushState= document.getElementById('set-pushover-app-state');
function setPushState(on) {
if (!pushState) return;
pushState.textContent = on ? '✓ hinterlegt' : 'noch nicht hinterlegt';
pushState.className = 'fw-semibold ' + (on ? 'text-success' : 'text-warning');
}
fetch(API).then(function (r) { return r.json(); }).then(function (res) {
if (!res || !res.ok || !res.settings) return;
if (gdrive) gdrive.value = res.settings.gdrive_accounting_folder || '';
setPushState(!!res.settings.pushover_app_token_set);
}).catch(function () {});
function bindSave(form, fields, msgId) {
if (!form) return;
var msg = document.getElementById(msgId);
form.addEventListener('submit', function (e) {
e.preventDefault();
var body = new URLSearchParams();
fields.forEach(function (f) { var el = document.getElementById(f.id); if (el) body.append(f.name, el.value.trim()); });
if (msg) { msg.textContent = 'Speichern …'; msg.className = 'small text-muted'; }
fetch(API, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, body: body.toString() })
.then(function (r) { return r.json(); })
.then(function (res) {
if (res && res.ok) {
if (msg) { msg.textContent = 'Gespeichert.'; msg.className = 'small text-success'; }
if (res.settings) setPushState(!!res.settings.pushover_app_token_set);
if (pushApp && form.contains(pushApp)) pushApp.value = ''; // Token-Feld nach Speichern leeren
} else {
if (msg) { msg.textContent = 'Speichern fehlgeschlagen.'; msg.className = 'small text-danger'; }
}
})
.catch(function () { if (msg) { msg.textContent = 'Speichern fehlgeschlagen.'; msg.className = 'small text-danger'; } });
});
}
bindSave(accForm, [{ id: 'set-gdrive-folder', name: 'gdrive_accounting_folder' }], 'set-accounting-msg');
bindSave(ovForm, [{ id: 'set-pushover-app', name: 'pushover_app_token' }], 'set-overview-msg');
});
<?php echo '</script'; ?>
>
<?php echo '<script'; ?>
src="<?php echo @constant('SITE_URL');?>
/assets/js/users.js?v=<?php echo filemtime((@constant('PATH_SYSTEM')).('/assets/js/users.js'));?>
"><?php echo '</script'; ?>
>
<?php echo '<script'; ?>
src="<?php echo @constant('SITE_URL');?>
/assets/js/company.js?v=<?php echo filemtime((@constant('PATH_SYSTEM')).('/assets/js/company.js'));?>
"><?php echo '</script'; ?>
>
<?php echo '<script'; ?>
src="<?php echo @constant('SITE_URL');?>
/assets/js/sources.js?v=<?php echo filemtime((@constant('PATH_SYSTEM')).('/assets/js/sources.js'));?>
"><?php echo '</script'; ?>
>
<?php echo '<script'; ?>
src="<?php echo @constant('SITE_URL');?>
/assets/js/mail-settings.js?v=<?php echo filemtime((@constant('PATH_SYSTEM')).('/assets/js/mail-settings.js'));?>
"><?php echo '</script'; ?>
>
<?php echo '<script'; ?>
src="<?php echo @constant('SITE_URL');?>
/assets/js/apikeys.js?v=<?php echo filemtime((@constant('PATH_SYSTEM')).('/assets/js/apikeys.js'));?>
"><?php echo '</script'; ?>
>
<?php }
}