rechnungsanhang handlign

charts bugfix only empty database
This commit is contained in:
Markus
2026-06-08 15:58:11 +02:00
parent aedd66202a
commit 6457f38f01
7 changed files with 117 additions and 96 deletions

View File

@@ -56,6 +56,9 @@ class Charts extends BaseController {
GROUP BY description, account_id GROUP BY description, account_id
EOD; EOD;
$data = array(); $data = array();
$werte = array();
$ids = array();
$labels = array();
$result = $this->db->query($query); $result = $this->db->query($query);
foreach ($result->getResult() as $row) { foreach ($result->getResult() as $row) {
$werte[] = $row->amount; $werte[] = $row->amount;

View File

@@ -160,17 +160,23 @@ class Home extends BaseController
return $result; return $result;
} }
public function viewBill($filename) { public function viewBill(string $filename) {
$filePath= WRITEPATH . '/uploads'; $filePath= WRITEPATH . '/uploads';
$file = new \CodeIgniter\Files\File($filePath."/".$filename); $file = new \CodeIgniter\Files\File($filePath."/".$filename);
log_message('debug',$file->getMimeType()); log_message('debug',$file->getMimeType());
if ($file->getMimeType() == 'application/pdf') if ($file->getMimeType() == 'application/pdf')
$this->viewPdf($filename); $this->viewPdf($filename);
else else{
return view('viewBillImg', ['filename'=>WRITEPATH . '/uploads'.$filename]); $imginfo = getimagesize($filePath."/".$filename);
header("Content-type: {$imginfo['mime']}");
readfile($filePath."/".$filename);
exit;
}
// return view('viewBillImg', ['filename'=>'writable/uploads/'.$filename]);
} }
public function viewPdf($filename) {
public function viewPdf(string $filename) {
$view = \Config\Services::renderer(); $view = \Config\Services::renderer();
log_message('debug',$filename); log_message('debug',$filename);
$filePath= WRITEPATH . '/uploads'; $filePath= WRITEPATH . '/uploads';
@@ -212,7 +218,7 @@ class Home extends BaseController
if (! $file->isValid() && ($file->getError() != UPLOAD_ERR_NO_FILE)) { if (! $file->isValid() && ($file->getError() != UPLOAD_ERR_NO_FILE)) {
throw new \RuntimeException($file->getErrorString() . '(' . $file->getError() . ')'); throw new \RuntimeException($file->getErrorString() . '(' . $file->getError() . ')');
} else if ($file->isValid()) { } else if ($file->isValid()) {
$rules['billfile'] = ['uploaded[billfile]','max_size[billfile,10000]','mime_in[billfile,application/pdf]']; $rules['billfile'] = ['uploaded[billfile]','max_size[billfile,10000]','mime_in[billfile,application/pdf,image/jpg,image/jpeg]'];
$errors['billfile'] = ['uploaded'=>'Fehler beim Upload','max_size' => 'Zu Groß', 'mime_in' => "Ungültiger Datentyp"]; $errors['billfile'] = ['uploaded'=>'Fehler beim Upload','max_size' => 'Zu Groß', 'mime_in' => "Ungültiger Datentyp"];
$uploading = true; $uploading = true;
} }
@@ -223,23 +229,30 @@ class Home extends BaseController
} }
else{ else{
$data = $this->request->getPost(); $data = $this->request->getPost();
//log_message('debug',print_r($data,true)); log_message('debug',print_r($data,true));
if ($this->request->getPost('scheduled') =="0"){ if ($this->request->getPost('scheduled') =="0"){
if ($uploading){
$date = Time::parse($this->request->getPost('datum'));
$file->move(WRITEPATH . 'uploads',$date->toLocalizedString('yyyyMMdd')." ".$this->request->getPost('receiver')." ".$this->request->getPost("comment[0]").".".$file->guessExtension());
$data['rechnung'] = $file->getName();
log_message('debug', $file->getName());
}
$bills = model('App\Models\mBills'); $bills = model('App\Models\mBills');
$bills->saveBill($data); if ($this->request->getPost('removeBillFile')){
$bills->deleteBillFile($data['id']);
unlink(WRITEPATH . 'uploads/'.$this->request->getPost('removeBillFile'));
}
$billId = $bills->saveBill($data);
if ($uploading){
$date = Time::parse($data['datum']);
$file->move(WRITEPATH . 'uploads',$date->toLocalizedString('yyyyMMdd')." ".$data['receiver']." ".$billId.".".$file->guessExtension());
log_message('debug', $file->getName());
$bills->storeBillFile($billId, $file->getName());
}
$redirectURL = session('redirect_url') ?? site_url('/'); $redirectURL = session('redirect_url') ?? site_url('/');
unset($_SESSION['redirect_url']); unset($_SESSION['redirect_url']);
return redirect()->to($redirectURL); return redirect()->to($redirectURL);
} }
else{ else{
$scheduled = model('App\Models\mScheduled'); $scheduled = model('App\Models\mScheduled');
$scheduled->saveBill($this->request->getPost()); $scheduled->saveBill($data);
} }
$this->response->redirect(site_url('/')); $this->response->redirect(site_url('/'));
} }

View File

@@ -6,12 +6,17 @@ use App\Models\Mcategories;
class mBills extends Model { class mBills extends Model {
protected $table = 'budget_bills'; protected $table = 'budget_bills';
protected $primaryKey = 'id';
protected $primaryKey = 'id';
protected $useAutoIncrement = true; protected $useAutoIncrement = true;
protected $returnType = 'object'; protected $returnType = 'object';
protected $useSoftDeletes = false; protected $useSoftDeletes = false;
//TODO timestamps aktivieren
// protected $createdField = 'created_at';
// protected $updatedField = 'updated_at';
// protected $deletedField = 'deleted_at';
protected $allowedFields = ['renummer','datum','receiver','source_id','amount','type','comment','validate','lkz','rechnung']; protected $allowedFields = ['renummer','datum','receiver','source_id','amount','type','comment','validate','lkz','rechnung'];
@@ -131,45 +136,19 @@ class mBills extends Model {
return $result; return $result;
} }
function getAccountsBalance(){ function getAccountsBalance(){
// $this->select('SUM(amount) as amount, source_id as idd, budget_accounts.description',FALSE);
// $this->groupby('source_id')->asArray();
// $this->join('budget_accounts', 'budget_accounts.id = budget_bills.source_id', 'left');
// $this->where('budget_accounts.type','account');
// $this->where('budget_accounts.lkz',null);
// $this->where('budget_bills.validate',false);
// $result1 = $this->where('budget_bills.lkz',null)->findAll();
// $assoc1 = array();
// foreach ($result1 as $value) {
// $assoc1[$value['idd']] = $value;
// }
// $details = model('App\Models\mBillDetails');
// $details->select('SUM((-1)*subamount) as amount, account_id as idd, budget_accounts.description',FALSE);
// $details->groupby('account_id')->asArray();
// $details->join('budget_accounts', 'budget_accounts.id = budget_billdetails.account_id', 'left');
// $details->join('budget_bills', 'budget_bills.id = budget_billdetails.bill_id', 'left');
// $details->where('budget_accounts.type','account');
// $details->where('budget_bills.validate',false);
// $details->where('budget_accounts.lkz',NULL);
// $result3 = $details->where('budget_billdetails.lkz',NULL)->findAll();
// $assoc3 = array();
// foreach ($result3 as $value) {
// $assoc3[$value['idd']] = $value;
// }
// $sums = array();
// foreach (array_keys($assoc1 + $assoc3) as $key) {
// $obj = new \stdClass;
// $obj->amount = (isset($assoc1[$key]) ? floatval($assoc1[$key]['amount']) : 0) + (isset($assoc3[$key]) ? floatval($assoc3[$key]['amount']) : 0);
// $obj->description = isset($assoc1[$key]) ? $assoc1[$key]['description'] : $assoc3[$key]['description'];
// $sums[] = $obj;
// }
$sums = $this->db->query("SELECT * FROM get_account_balance4()"); $sums = $this->db->query("SELECT * FROM get_account_balance4()");
//$this->from("get_account_balance4()")->findAll();
// $this->groupby('source_id')->asArray();
return $sums->getResult(); return $sums->getResult();
} }
public function saveBill($data){ public function storeBillFile(int $billId, string $filename){
$this->update($billId, [ 'rechnung' => $filename ]);
}
public function deleteBillFile(int $billId){
$this->set('rechnung', 'NULL',false);
$this->update($billId);
}
public function saveBill($data) : int {
$details = model('App\Models\mBillDetails'); $details = model('App\Models\mBillDetails');
$accounts = model('App\Models\mAccounts'); $accounts = model('App\Models\mAccounts');
$this->set('datum', date( "Y-m-d", strtotime($data['datum'] ) )); $this->set('datum', date( "Y-m-d", strtotime($data['datum'] ) ));
@@ -201,7 +180,7 @@ class mBills extends Model {
$this->update($data['id']); $this->update($data['id']);
} }
$details->saveEntries($data, $billId); $details->saveEntries($data, $billId);
return $billId;
} }
/** /**

View File

@@ -1,6 +1,7 @@
<?= $this->extend('layouts/smarthome'); ?> <?= $this->extend('layout'); ?>
<?= $this->section('menu'); ?> <?= $this->section('menu'); ?>
<?= $this->include('menu/dashboard_menu') ?> <?= $this->include('sidebar') ?>
<?= $this->endSection(); ?> <?= $this->endSection(); ?>
<?= $this->section('content'); ?> <?= $this->section('content'); ?>
<div class="container"> <div class="container">

View File

@@ -14,7 +14,12 @@
<div class="col-md-8 col-12"> <div class="col-md-8 col-12">
<div class="card"> <div class="card">
<div class="card-header pb-0"> <div class="card-header pb-0">
<?php if ($id) : ?>
<h4 class="card-title"><?= ($transfer?'Transfer bearbeiten':($isScheduled?'Terminbuchung bearbeiten':'Rechnung bearbeiten'))?></h4>
<?php else: ?>
<h4 class="card-title"><?= ($transfer?'Neuer Transfer':($isScheduled?'Neue Terminbuchung':'Neue Rechnung'))?></h4> <h4 class="card-title"><?= ($transfer?'Neuer Transfer':($isScheduled?'Neue Terminbuchung':'Neue Rechnung'))?></h4>
<?php endif; ?>
<?php if (! empty($validation)) : ?> <?php if (! empty($validation)) : ?>
<div class='alert alert-danger mt-2'> <div class='alert alert-danger mt-2'>
<div class="errors" role="alert"> <div class="errors" role="alert">
@@ -42,11 +47,11 @@
</div> </div>
</div> </div>
<div class="col-12 <?= ($transfer?' d-none':($isScheduled?' d-none':'')) ?>"> <div class="col-12 <?= ($transfer?' d-none':($isScheduled?' d-none':'')) ?>">
<label for="billfile">Rechnung</label> <label for="billfile">Rechnung:</label>
<?php if (!isset($billfile)): ?> <input type="file" id="billfile" name="billfile" class="form-control <?= (!isset($billfile))?'':'d-none' ?>" capture="environment" accept="image/*, application/pdf">
<input type="file" id="billfile" name="billfile" class="form-control" capture="environment" accept="image/*, application/pdf"> <?php if (isset($billfile)): ?>
<?php else: ?> <a href="/viewBill/<?= $billfile ?>" id="billfileRef"><?= $billfile ?></a>
<input type="text" disabled="disabled" name="temp" id="billfile1" class="form-control" value="<?= set_value('billfile1', $billfile??'') ?>"> <a class="" onclick="removeBillFile(this);"><i class="fa fa-trash"></i></a>
<?php endif; ?> <?php endif; ?>
</div> </div>
<div class="col-12 <?= ($transfer?' d-none':'d-none') ?>"> <div class="col-12 <?= ($transfer?' d-none':'d-none') ?>">
@@ -124,8 +129,11 @@
<a class="btn btn-info multi" onclick="addLine();" role="button">+ Zeile</a> <a class="btn btn-info multi" onclick="addLine();" role="button">+ Zeile</a>
<input type="checkbox" id="validate" name="validate" value="1" class='btn-check' autocomplete="off" <?= set_checkbox('validate', '1', (($validate??"f")=="t")?true:false) ?>> <input type="checkbox" id="validate" name="validate" value="1" class='btn-check' autocomplete="off" <?= set_checkbox('validate', '1', (($validate??"f")=="t")?true:false) ?>>
<label class="btn btn-outline-danger" for="validate">Entwurf</label> <label class="btn btn-outline-danger" for="validate">Entwurf</label>
<?php if ($id) : ?>
<a class="btn btn-danger" data-bs-toggle="modal" data-bs-id="<?= $id ?>" data-bs-target="#mymodal"><i class="fa fa-trash"></i></a>
<?php endif; ?>
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
<a class="btn btn-secondary" onclick="history.back();" role="button">Zurück</a> <a class="btn btn-secondary" onclick="history.back();" role="button"><i class="fa-solid fa-rotate-left"></i></a>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -0,0 +1 @@
<img src="<?=$filename?>" alt="Rechnung <?=$filename?>">

View File

@@ -1,17 +1,17 @@
$(function() { $(function () {
$('.parent').change(function() { $('.parent').change(function () {
var $subs = $(this).parent().parent().children( ".sub" ).children(); var $subs = $(this).parent().parent().children(".sub").children();
$subs.children().remove().end(); $subs.children().remove().end();
var $output = ''; var $output = '';
$liste = subsdata[$(this).val()]; $liste = subsdata[$(this).val()];
$sort = Object.entries($liste).sort((a,b) => (a[1]>b[1])?1:(b[1]>a[1])?-1:0); $sort = Object.entries($liste).sort((a, b) => (a[1] > b[1]) ? 1 : (b[1] > a[1]) ? -1 : 0);
$.each($sort, function(key, value) { $.each($sort, function (key, value) {
$output += '<option value="'+value[0]+'">' + value[1] + '</option>'; $output += '<option value="' + value[0] + '">' + value[1] + '</option>';
}); });
$subs.append($output); $subs.append($output);
}); });
$('#multi').change(function() { $('#multi').change(function () {
if($(this).is(":checked")) { if ($(this).is(":checked")) {
$('.single').addClass('d-none'); $('.single').addClass('d-none');
$('.multi').removeClass('d-none'); $('.multi').removeClass('d-none');
return; return;
@@ -20,9 +20,9 @@ $(function() {
$('.multi').addClass('d-none'); $('.multi').addClass('d-none');
//'unchecked' event code //'unchecked' event code
}).change(); }).change();
$('.dt-amount, .dt-subamount').change(function() { $('.dt-amount, .dt-subamount').change(function () {
var temp = convertInput( $(this).val()); var temp = convertInput($(this).val());
$(this).val( convertOutput(temp)); $(this).val(convertOutput(temp));
if ($('#multi').is(":checked")) { if ($('#multi').is(":checked")) {
recalcOpenAmount(); recalcOpenAmount();
} }
@@ -30,52 +30,68 @@ $(function() {
}); });
function logData(event){ function logData(event) {
var data = document.getElementById("billfile"); var data = document.getElementById("billfile");
console.log(data.value); console.log(data.value);
} }
function addLine(){ function addLine() {
$('#linecont > div').each(function () { $('#linecont > div').each(function () {
if ($(this).hasClass("d-none")){ if ($(this).hasClass("d-none")) {
$(this).removeClass("d-none"); $(this).removeClass("d-none");
return false; return false;
} }
}); });
} }
function convertInput( number ) function removeBillFile(e) {
{ e.classList.add("d-none");
var zahl = number.replace( /\,/g, "." ); document.getElementById("billfile").classList.remove("d-none");
var czahl = eval( zahl );
const billFile = document.getElementById("billfileRef");
const form = document.getElementById('newbill');
var DOB = document.createElement("input");
DOB.setAttribute("name", "removeBillFile");
DOB.setAttribute("value", billFile.innerText);
DOB.setAttribute("type", "hidden");
form.appendChild(DOB);
billFile.innerText = "REMOVED FILE: "+billFile.innerText;
billFile.classList.add("text-decoration-line-through");
billFile.classList.add("text-danger");
billFile.removeAttribute("href");
}
function convertInput(number) {
var zahl = number.replace(/\,/g, ".");
var czahl = eval(zahl);
return czahl; return czahl;
} }
function convertOutput( number ) function convertOutput(number) {
{ if (typeof number !== 'undefined') {
if ( typeof number !== 'undefined' ) var string = number.toFixed(2);
{ return string.replace(/\,/g, ".");
var string = number.toFixed( 2 );
return string.replace( /\,/g, "." );
} }
else else
return ""; return "";
} }
function recalcOpenAmount(){ function recalcOpenAmount() {
var summe = 0.0; var summe = 0.0;
$('.dt-subamount').each(function () { $('.dt-subamount').each(function () {
b = $(this).val(); b = $(this).val();
b = convertInput(b); b = convertInput(b);
if (typeof b !== 'undefined'){ if (typeof b !== 'undefined') {
b = $(this).hasClass("text-danger") ? b*(-1) : b; b = $(this).hasClass("text-danger") ? b * (-1) : b;
summe = summe +b; summe = summe + b;
} }
// summe = summe + convertInput($(this).val()); // summe = summe + convertInput($(this).val());
}); });
$('#openamount').val(Math.round( ($('#total_in').val() - $('#total_out').val() - summe) * 100 ) / 100); $('#openamount').val(Math.round(($('#total_in').val() - $('#total_out').val() - summe) * 100) / 100);
} }
// $('form').submit(function () { // $('form').submit(function () {