diff --git a/application/models/accounting/Kostenstelle_model.php b/application/models/accounting/Kostenstelle_model.php index 4342327f7..f338b69d5 100644 --- a/application/models/accounting/Kostenstelle_model.php +++ b/application/models/accounting/Kostenstelle_model.php @@ -15,39 +15,20 @@ class Kostenstelle_model extends DB_Model /** * Gets all active Kostenstellen for a geschaeftsjahr, as determined by the geschaeftsjahrvon and bis fields * Gets Kostenstellen of current Geschaeftsjahr if Geschaeftsjahr not specified - * Only the Kostenstellen for which a permission exists are returned! * @param $geschaeftsjahr - * @return array|null + * @return array|null Kostenstellen or empty array if no geschaeftsjahr found */ public function getActiveKostenstellenForGeschaeftsjahr($geschaeftsjahr = null) { $this->load->model('organisation/geschaeftsjahr_model', 'GeschaeftsjahrModel'); - if ($geschaeftsjahr === null) + $gj = $this->_getGeschaeftsjahr($geschaeftsjahr); + + if (hasData($gj)) { - $lgj = $this->GeschaeftsjahrModel->getCurrGeschaeftsjahr(); + $gjstart = $gj->retval[0]->start; - if ($lgj->error) - return error($lgj->retval); - - if (count($lgj->retval) < 1) - return success(array()); - - $geschaeftsjahr = $lgj->retval[0]->geschaeftsjahr_kurzbz; - } - - $this->GeschaeftsjahrModel->addSelect('start, ende'); - $gj = $this->GeschaeftsjahrModel->load($geschaeftsjahr); - - if ($gj->error) - return error($gj->retval); - - if (count($gj->retval) < 1) - return success(array()); - - $gjstart = $gj->retval[0]->start; - - $query = 'SELECT kostenstelle_id, kurzbz, wawi.tbl_kostenstelle.bezeichnung, wawi.tbl_kostenstelle.aktiv + $query = 'SELECT kostenstelle_id, kurzbz, wawi.tbl_kostenstelle.bezeichnung, wawi.tbl_kostenstelle.aktiv, wawi.tbl_kostenstelle.oe_kurzbz FROM wawi.tbl_kostenstelle LEFT JOIN public.tbl_geschaeftsjahr kgjvon on wawi.tbl_kostenstelle.geschaeftsjahrvon = kgjvon.geschaeftsjahr_kurzbz LEFT JOIN public.tbl_geschaeftsjahr kgjbis on wawi.tbl_kostenstelle.geschaeftsjahrbis = kgjbis.geschaeftsjahr_kurzbz @@ -57,6 +38,96 @@ class Kostenstelle_model extends DB_Model (DATE ? < kgjbis.ende OR wawi.tbl_kostenstelle.geschaeftsjahrbis IS NULL) ORDER BY wawi.tbl_kostenstelle.bezeichnung'; - return $this->execQuery($query, array($gjstart, $gjstart)); + return $this->execQuery($query, array($gjstart, $gjstart)); + } + else + { + return success(array()); + } + } + + /** + * Gets all active Kostenstellen for a geschaeftsjahr, as determined by the geschaeftsjahrvon and bis fields, together with their oe, + * hierarchally sorted, gets Kostenstellen of current Geschaeftsjahr if Geschaeftsjahr not specified + * @param null $geschaeftsjahr + * @return array|null + */ + public function getActiveKostenstellenForGeschaeftsjahrWithOe($geschaeftsjahr = null) + { + $this->load->model('organisation/geschaeftsjahr_model', 'GeschaeftsjahrModel'); + + $gj = $this->_getGeschaeftsjahr($geschaeftsjahr); + + if (hasData($gj)) + { + $gjstart = $gj->retval[0]->start; + + $query = "WITH RECURSIVE tree (oe_kurzbz, bezeichnung, path, level, organisationseinheittyp_kurzbz) AS ( + SELECT oe_kurzbz, + bezeichnung || ' (' || organisationseinheittyp_kurzbz || ')' AS bezeichnung, + oe_kurzbz || '|' AS path, 0 AS level, + organisationseinheittyp_kurzbz + FROM tbl_organisationseinheit + WHERE oe_parent_kurzbz IS NULL + AND aktiv = true + UNION ALL + SELECT oe.oe_kurzbz, + oe.bezeichnung || ' (' || oe.organisationseinheittyp_kurzbz || ')' AS bezeichnung, + tree.path || oe.oe_kurzbz || '|' AS path, tree.level + 1 AS level, + oe.organisationseinheittyp_kurzbz + FROM tree JOIN tbl_organisationseinheit oe ON (tree.oe_kurzbz = oe.oe_parent_kurzbz) + ) + SELECT oe_kurzbz, + SUBSTRING(REGEXP_REPLACE(path, '[A-z]+\|', '-', 'g') || rec.bezeichnung, 2) AS oe_description, + level, + kst.kostenstelle_id as kostenstelle_id, + kst.kurzbz as kostenstelle_kurzbz, + kst.bezeichnung as kostenstelle_bezeichnung, + kst.aktiv as kostenstelle_aktiv + FROM tree rec + JOIN ( + SELECT kostenstelle_id, kurzbz, wawi.tbl_kostenstelle.bezeichnung, wawi.tbl_kostenstelle.aktiv, wawi.tbl_kostenstelle.oe_kurzbz as kstoe + FROM wawi.tbl_kostenstelle + LEFT JOIN public.tbl_geschaeftsjahr kgjvon on wawi.tbl_kostenstelle.geschaeftsjahrvon = kgjvon.geschaeftsjahr_kurzbz + LEFT JOIN public.tbl_geschaeftsjahr kgjbis on wawi.tbl_kostenstelle.geschaeftsjahrbis = kgjbis.geschaeftsjahr_kurzbz + WHERE + (DATE ? >= kgjvon.start OR wawi.tbl_kostenstelle.geschaeftsjahrvon IS NULL) + AND + (DATE ? < kgjbis.ende OR wawi.tbl_kostenstelle.geschaeftsjahrbis IS NULL) + ORDER BY wawi.tbl_kostenstelle.bezeichnung) + kst on kst.kstoe = rec.oe_kurzbz + ORDER BY level"; + + return $this->execQuery($query, array($gjstart, $gjstart)); + } + else + { + return success(array()); + } + } + + /** + * Gets either given Geschaeftsjahr, current Geschaeftsjahr if not given, or chronologically last Geschaeftsjahr if there is no current + * @param $geschaeftsjahr + * @return mixed + */ + protected function _getGeschaeftsjahr($geschaeftsjahr) + { + if ($geschaeftsjahr === null) + { + $gj = $this->GeschaeftsjahrModel->getCurrGeschaeftsjahr(); + if (!hasData($gj)) + { + $this->GeschaeftsjahrModel->addSelect('geschaeftsjahr_kurzbz, start, ende'); + $this->GeschaeftsjahrModel->addOrder('start', 'DESC'); + $gj = $this->GeschaeftsjahrModel->load(); + } + } + else + { + $this->GeschaeftsjahrModel->addSelect('geschaeftsjahr_kurzbz, start, ende'); + $gj = $this->GeschaeftsjahrModel->load($geschaeftsjahr); + } + return $gj; } }