finanzen/app/Models/mAccounts.php
2022-04-28 09:40:10 +02:00

207 lines
6.9 KiB
PHP

<?php namespace App\Models;
use CodeIgniter\Model;
class mAccounts extends Model {
protected $table = 'budget_accounts';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'object';
protected $useSoftDeletes = false;
protected $allowedFields = ['parent_id','type','bookable','description','LKZ'];
protected $useTimestamps = false;
private $mAccountList = array();
protected function initialize()
{
$result = $this->findAll();
foreach ($result as $value) {
$this->mAccountList[$value->id] = $value;
}
}
/**
* Erstellt DropDownListe aus gegeben array
* @param array liste der daten
* @param bool wenn true wird auch ein 0-Eintrag erstellt
* @return mixed
*/
private function createDropDownList($data,$withnull = true,$key=0)
{
$liste = array();
if ($withnull)
$liste[$key] = '-----';
foreach ( $data as $row )
{
$liste[$row->id] = $row->description;
}
asort( $liste );
return $liste;
}
/**
* holt Text vom gegebenen Element
* @param int id des gewünschten Elements
* @return string Full Name of Entry
*/
public function getDropDownEntry($id){
$element = $this->mAccountList[$id];
$description = $element->description;
$id = $element->parent_id;
while ( $id > 0 )
{
$description = $this->mAccountList[$id]->description .'-'.$description;
$id = $this->mAccountList[$id]->parent_id;
}
return $description;;
}
/**
* liefert DropDown Liste mit gegeben Suchparametern
* @param string Kontotyp "InOut,In,Out,Acc"
* @param bool ob bookable gesetzt sein muss
* @return bool ob LKZ Flag gesetzt sein darf
*/
public function getDropDownList($type, $bookable = true, $lkz = false )
{
if ($bookable == true)
$this->where('bookable',1);
if ($lkz == false) $this->where('lkz',NULL);
if ( $type == 'InOut' ) $this->where('type !=','account');
elseif ( $type == 'Acc' ) $this->where('type','account');
elseif ( $type == 'In' ) $this->where('type','output');
elseif ( $type == 'Out' ) $this->where('type','input');
$this->orderBy('description');
$result = $this->findAll();
$parent = array();
foreach ( $result as &$element )
{
$id = $element->parent_id;
while ( $id > 0 )
{
$element->description = $this->mAccountList[$id]->description .'-'.$element->description;
if ($this->mAccountList[$id]->parent_id == 0){
$parent[] = (object)['id' => $element->id,'description' => $element->description ];
}
$id = $this->mAccountList[$id]->parent_id;
}
}
return $this->createDropDownList($result);
}
/**
* liefert 2 DropDown Listen mit gegeben Suchparametern
* parent für Vorselektion, subs für Untereinträge
* @param string Kontotyp "InOut,In,Out,Acc"
* @param bool ob bookable gesetzt sein muss
* @return bool ob LKZ Flag gesetzt sein darf
*/
public function getDropDownLists($type, $bookable = true, $lkz = false )
{
if ($bookable == true) $this->where('bookable',1);
if ($lkz == false) $this->where('lkz',null);
if ( $type == 'InOut' ) $this->where('type !=','account');
elseif ( $type == 'Acc' ) $this->where('type','account');
elseif ( $type == 'In' ) $this->where('type','output');
elseif ( $type == 'Out' ) $this->where('type','input');
$this->orderBy('description');
$result = $this->findAll();
$parent = array();
$listen = array();
foreach ( $result as &$element )
{
$id = $element->parent_id;
while ( $id > 0 )
{
if ($this->mAccountList[$id]->LKZ == 1) continue 2;
if ($this->mAccountList[$id]->parent_id == 0){
if (!array_key_exists($id, $parent))
$parent[$id] = (object)['id' => $id,'description' => $this->mAccountList[$id]->description ];
$listen[$id][$element->id] = (object)['id' => $element->id,'description' => $element->description ];
}
else{
$element->description = $this->mAccountList[$id]->description .'-'.$element->description;
}
$id = $this->mAccountList[$id]->parent_id;
}
}
$subs = array();
$subs[0] = $this->createDropDownList(array());
foreach ( $listen as $key => $element ){
$subs[$key] = $this->createDropDownList($element,$this->mAccountList[$key]->bookable, $key);
}
return array('parent'=> $this->createDropDownList($parent),'subs'=>(object)$subs);
}
/**
* liefert parent id für category
* @param int account id
* @return int parent id
*/
public function getParent($sid){
if ($sid == 0) return 0;
$result = $sid;
$id = $this->mAccountList[$sid]->parent_id;
while ( $id > 0 )
{
$result = $id;
$id = $this->mAccountList[$id]->parent_id;
}
return $result;
}
/**
* liefert array für jedes sub element und level
* @return mixed array for each level element
*/
public function getTreeData(){
helper('array');
$parents = array();
$subs = array();
foreach ( $this->mAccountList as $element )
{
if ($element->parent_id == 0)
$parents[$element->id] = $element;
}
foreach ( $this->mAccountList as $element )
{
// if ($element->parent_id > 0)
// echo "".$parents[$element->parent_id]->id;
if (($element->parent_id > 0) && array_key_exists($element->parent_id , $parents))
$parents[$element->parent_id]->subs[$element->id] = $element;
}
array_sort_by_multiple_keys($parents, ['description' => SORT_ASC]);
return ['parents'=>$parents,'subs'=>$subs, 'all'=>$this->mAccountList];
}
/**
* erstellt oder updatet den gegeben Account
* @var array formulardaten
*/
public function saveAccount($data){
$this->set('parent_id',$data['parent']);
$this->set('type', $data['type']);
$this->set('bookable', array_key_exists('bookable', $data) ? 1 : 0);
$this->set('description', $data['description']);
$this->set('LKZ', (array_key_exists('lkz', $data) ? 1 : null));
if ($data['id'] == 0)
$this->insert();
else
$this->update($data['id']);
$this->initialize();
}
public function checkType($id, $type){
return ($this->mAccountList[$id]->type == $type);
}
};
?>