From 2cce61ca6afa47f0653fe74d7e0cefdcfb31810c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Fri, 15 Mar 2024 13:37:07 +0100 Subject: [PATCH] =?UTF-8?q?Korrekturen=20f=C3=BCr=20Gehaltsimport?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/system/MigrateSalary.php | 140 +++++++++++------- .../Dienstverhaeltnis_model.php | 133 ++++++++++++----- 2 files changed, 177 insertions(+), 96 deletions(-) diff --git a/application/controllers/system/MigrateSalary.php b/application/controllers/system/MigrateSalary.php index e8771f913..4bd1d3e7d 100644 --- a/application/controllers/system/MigrateSalary.php +++ b/application/controllers/system/MigrateSalary.php @@ -3,7 +3,7 @@ * Job zur einmaligen Import der Gehälter * * Aufruf (Encode / im Filenmae mit %2F): - * php index.ci.php system/MigrateSalary/import filename + * php index.ci.php system/MigrateSalary/import filename * */ /* @@ -34,7 +34,7 @@ class MigrateSalary extends CLI_Controller $this->load->model('vertragsbestandteil/VertragsbestandteilStunden_model','VertragsbestandteilStundenModel'); $this->load->model('vertragsbestandteil/VertragsbestandteilFreitext_model','VertragsbestandteilFreitextModel'); $this->load->model('vertragsbestandteil/VertragsbestandteilFunktion_model','VertragsbestandteilFunktionModel'); - + } // ----------------------------------------------------------------------------------------------------------------- @@ -45,7 +45,7 @@ class MigrateSalary extends CLI_Controller */ public function import($file) { - + // CSV Laden $file = urldecode($file); if($handle = fopen($file, "r")) @@ -108,8 +108,8 @@ class MigrateSalary extends CLI_Controller } else { - if ($data[$i] != '' - && isset($gehaltsarr[$gehaltsindex]) && isset($gehaltsarr[$gehaltsindex]['betrag']) + if ($data[$i] != '' + && isset($gehaltsarr[$gehaltsindex]) && isset($gehaltsarr[$gehaltsindex]['betrag']) && $gehaltsarr[$gehaltsindex]['betrag'] == $data[$i]) { // Gehalt bleibt gleich @@ -138,30 +138,31 @@ class MigrateSalary extends CLI_Controller } } } - + $monat++; } // Zeile zu Ende - Ende Datum setzen wenn nicht für alle Monate ein Eintrag vorhanden ist if($monat < count($monate) && isset($gehaltsarr[$gehaltsindex])) - $gehaltsarr[$gehaltsindex]['ende'] == $monate[$monat-1]; - + $gehaltsarr[$gehaltsindex]['ende'] = $monate[$monat-1]; + } $this->_saveGehalt($lastuser, $gehaltsarr); } } /** - * Ermittelt das passende Dienstverhaeltnis uns speichert den + * Ermittelt das passende Dienstverhaeltnis uns speichert den * Gehaltsbestandteil */ private function _saveGehalt($uid, $gehaltsarr) - { + { $failed = false; $this->db->trans_begin(); foreach($gehaltsarr as $row_gehalt) { + //var_dump($row_gehalt); $auszahlungen = 14; $dvid = ''; $vbsid = ''; @@ -171,16 +172,18 @@ class MigrateSalary extends CLI_Controller //DV und VBS Ermitteln $dv = $this->DienstverhaeltnisModel->getDVByPersonUID($uid, $this->OE_DEFAULT, $row_gehalt['beginn']); - if (!hasData($dv)) + // Wenn keiner gefunden wird oder mit Monatsersteln nur ein externer gefunden wird, weitersuchen ob im Monat noch ein + // "richtiger" Vertrag startet + if (!hasData($dv) || getData($dv)[0]->vertragsart_kurzbz='externerLehrender') { $date = new DateTime($row_gehalt['beginn']); $date->modify('last day of this month'); $last_day_this_month = $date->format('Y-m-d'); - // Wenn mit Monatsersten kein DV gefunden wird, wird stattdessen mit Monatsletzten gesucht um DVs zu finden + // Wenn mit Monatsersten kein DV gefunden wird, wird stattdessen mit Monatsletzten gesucht um DVs zu finden // für Personen die erst später im Monat in ihr DV einsteigen - $dv = $this->DienstverhaeltnisModel->getDVByPersonUID($uid, $this->OE_DEFAULT, $last_day_this_month); - + $dv = $this->DienstverhaeltnisModel->getDVByPersonUIDOverlapping($uid, $this->OE_DEFAULT, $row_gehalt['beginn'], $last_day_this_month); + if (!hasData($dv)) { echo "\nKein passendes DV gefunden für User ".$uid." und Datum ".$row_gehalt['beginn']." -> ROLLBACK\n"; @@ -189,34 +192,53 @@ class MigrateSalary extends CLI_Controller } else { - // Gehaltsstart wird auf den Start des DV korrigiert wenn nicht der Monatserste - $row_gehalt['beginn'] = getData($dv)[0]->von; + $resultdata = getData($dv); + foreach($resultdata as $dvdata) + { + // Externer DV wird in Monatsmitte zu echten DV - daher weitersuchen bei externenDVs da + // diese sowieso kein Gehalt zugeordnet haben + if($dvdata->vertragsart_kurzbz != 'externerLehrender') + { + $dvid = $dvdata->dienstverhaeltnis_id; + // Gehaltsstart wird auf den Start des DV korrigiert wenn nicht der Monatserste + // nur wenn das Beginndatum vor dem DV-Start liegt da sonst das Datum korrigiert wird + // wenn der Vertragsbestandteil wechselt + if($row_gehalt['beginn'] < $dvdata->von) + $row_gehalt['beginn'] = $dvdata->von; + break; + } + } } } - - $resultdata = getData($dv); - if (count($resultdata) !== 1) + else { - echo "Kein oder Mehrere DVs gefunden -> ROLLBACK"; + $resultdata = getData($dv); + + if (count($resultdata) == 1) + $dvid = $resultdata[0]->dienstverhaeltnis_id; + } + + if ($dvid == '') + { + echo "Kein oder mehrere DVs gefunden -> ROLLBACK"; $failed = true; break; } - $dvid = $resultdata[0]->dienstverhaeltnis_id; - $allin = $this->_isAllIn($dvid, $row_gehalt['beginn']); $db = new DB_Model(); $resultVBS = $this->_getVBS($dvid, $row_gehalt['beginn']); - + if (hasData($resultVBS)) { $vbsid = getData($resultVBS)[0]->vertragsbestandteil_id; + $vbsbis = getData($resultVBS)[0]->bis; } else { - echo "Vertragsbestandteil wurde nicht gefunden -> ROLLBACK"; + echo "Vertragsbestandteil fuer $uid DV $dvid wurde nicht gefunden mit Beginn ".$row_gehalt['beginn']."-> ROLLBACK"; $failed = true; break; } @@ -246,7 +268,7 @@ class MigrateSalary extends CLI_Controller ); if (isset($row_gehalt['ende']) && $row_gehalt['ende']!='') $data['bis'] = $row_gehalt['ende']; - + $resultVBS = $this->VertragsbestandteilModel->Insert($data); if(!isSuccess($resultVBS)) { @@ -286,7 +308,7 @@ class MigrateSalary extends CLI_Controller ); if (isset($row_gehalt['ende']) && $row_gehalt['ende']!='') $data['bis'] = $row_gehalt['ende']; - + $resultVBS = $this->VertragsbestandteilModel->Insert($data); if(!isSuccess($resultVBS)) { @@ -356,16 +378,24 @@ class MigrateSalary extends CLI_Controller $date->modify('last day of this month'); $last_day_this_month = $date->format('Y-m-d'); - // TODO: wenn das Dienstverhaeltnis in diesem Monat endet und nicht der Monatsletzte ist, + // Wenn das Dienstverhaeltnis in diesem Monat endet und nicht der Monatsletzte ist, // dann muss hier das Ende Datum des DV stehen bzw das Ende // oder das Ende des VBS falls die Person in der Monatsmitte Stunden wechselt $data['bis'] = $last_day_this_month; + + // Wenn der Vertragsbestandteil endet bevor das Gehalt endet, dann wir das Gehaltsende auf VBS Ende gesetzt + //echo "Ende des VBS: $vbsbis Ende des Gehalt: ".$data['bis']; + if ($vbsbis != '' && $vbsbis < $data['bis']) + { + $data['bis'] = $vbsbis; + //echo "Gehalt auf vbs ende gesetzt"; + } } $ret = $this->GehaltsbestandteilModel->insert($data, $this->GehaltsbestandteilModel->getEncryptedColumns() ); - } + } if(!$failed) { @@ -375,7 +405,7 @@ class MigrateSalary extends CLI_Controller { echo "ROLLBACK"; $this->db->trans_rollback(); - } + } } /** @@ -386,17 +416,17 @@ class MigrateSalary extends CLI_Controller $db = new DB_Model(); $qry = " - SELECT - * - FROM - hr.tbl_vertragsbestandteil + SELECT + * + FROM + hr.tbl_vertragsbestandteil JOIN hr.tbl_vertragsbestandteil_freitext USING(vertragsbestandteil_id) - WHERE - dienstverhaeltnis_id=".$db->escape($dvid)." - AND vertragsbestandteiltyp_kurzbz='freitext' + WHERE + dienstverhaeltnis_id=".$db->escape($dvid)." + AND vertragsbestandteiltyp_kurzbz='freitext' AND ".$db->escape($datum)." BETWEEN von AND COALESCE(bis, '2999-12-31') AND freitexttyp_kurzbz='allin'"; - + $resultAllIn = $db->execReadOnlyQuery($qry); if (hasData($resultAllIn)) @@ -410,15 +440,15 @@ class MigrateSalary extends CLI_Controller $db = new DB_Model(); $qry = " - SELECT - * - FROM - hr.tbl_vertragsbestandteil - WHERE - dienstverhaeltnis_id=".$db->escape($dvid)." - AND vertragsbestandteiltyp_kurzbz='stunden' + SELECT + * + FROM + hr.tbl_vertragsbestandteil + WHERE + dienstverhaeltnis_id=".$db->escape($dvid)." + AND vertragsbestandteiltyp_kurzbz='stunden' AND ".$db->escape($datum)." BETWEEN von AND COALESCE(bis, '2999-12-31')"; - + $resultVBS = $db->execReadOnlyQuery($qry); return $resultVBS; @@ -430,22 +460,22 @@ class MigrateSalary extends CLI_Controller private function _getUser($svnr) { $db = new DB_Model(); - + $qry = " - SELECT - mitarbeiter_uid - FROM - public.tbl_person + SELECT + mitarbeiter_uid + FROM + public.tbl_person JOIN public.tbl_benutzer using(person_id) JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE tbl_person.svnr = ". $db->escape($svnr)." AND EXISTS( - SELECT - 1 - FROM - hr.tbl_dienstverhaeltnis - WHERE + SELECT + 1 + FROM + hr.tbl_dienstverhaeltnis + WHERE mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid AND oe_kurzbz=". $db->escape($this->OE_DEFAULT)." ) diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index 5b276c55e..12842e2a3 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -18,7 +18,7 @@ class Dienstverhaeltnis_model extends DB_Model $result = null; $qry = " - SELECT + SELECT dv.dienstverhaeltnis_id, tbl_benutzer.uid, tbl_mitarbeiter.personalnummer, @@ -30,8 +30,8 @@ class Dienstverhaeltnis_model extends DB_Model org.oe_kurzbz, org.bezeichnung oe_bezeichnung, dv.von, - dv.bis, - dv.vertragsart_kurzbz, + dv.bis, + dv.vertragsart_kurzbz, dv.updateamum, dv.updatevon FROM tbl_mitarbeiter @@ -59,13 +59,13 @@ class Dienstverhaeltnis_model extends DB_Model "; return $this->execQuery($qry, $data); - + } public function getDVByID($dvid) { $this->addSelect('hr.tbl_dienstverhaeltnis.*, public.tbl_organisationseinheit.bezeichnung as unternehmen'); $this->addJoin('public.tbl_organisationseinheit', 'hr.tbl_dienstverhaeltnis.oe_kurzbz = public.tbl_organisationseinheit.oe_kurzbz'); - $result = $this->load($dvid); + $result = $this->load($dvid); if (hasData($result)) { return $result; @@ -81,7 +81,7 @@ class Dienstverhaeltnis_model extends DB_Model $datestring = $date->format("Y-m-d"); $qry = " - SELECT + SELECT dv.dienstverhaeltnis_id, tbl_benutzer.uid, tbl_mitarbeiter.personalnummer, @@ -115,26 +115,26 @@ class Dienstverhaeltnis_model extends DB_Model $params = array_merge($params, array($dvid, $dvid)); $dvidclause = <<= COALESCE(vb.von, '1970-01-01'::date) - AND - COALESCE(dv.bis::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31') + AND + vb.vertragsbestandteiltyp_kurzbz = 'karenz' + AND + dv.von::date >= COALESCE(vb.von, '1970-01-01'::date) + AND + COALESCE(dv.bis::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31') ) = 0 AND dv.dienstverhaeltnis_id != ? EODVIDC; - + } - + $query = <<= dv.von + AND + COALESCE(?::date, '2170-12-31'::date) >= dv.von AND ( - SELECT - COUNT(*) AS karenzen - FROM - hr.tbl_vertragsbestandteil vb - WHERE + SELECT + COUNT(*) AS karenzen + FROM + hr.tbl_vertragsbestandteil vb + WHERE vb.dienstverhaeltnis_id = dv.dienstverhaeltnis_id - AND - vb.vertragsbestandteiltyp_kurzbz = 'karenz' - AND - ?::date >= COALESCE(vb.von, '1970-01-01'::date) - AND - COALESCE(?::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31') - ) = 0 + AND + vb.vertragsbestandteiltyp_kurzbz = 'karenz' + AND + ?::date >= COALESCE(vb.von, '1970-01-01'::date) + AND + COALESCE(?::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31') + ) = 0 {$dvidclause} EOSQL; - + $ret = $this->execReadOnlyQuery($query, $params); - + if( ($dvcount = getData($ret)) && ($dvcount[0]->dvcount > 0) ) { return true; } - - return false; + + return false; } -} \ No newline at end of file + + public function getDVByPersonUIDOverlapping($uid, $oe_kurzbz=null, $beginn=null, $ende=null) + { + $result = null; + + $qry = " + SELECT + dv.dienstverhaeltnis_id, + tbl_benutzer.uid, + tbl_mitarbeiter.personalnummer, + tbl_mitarbeiter.kurzbz, + tbl_mitarbeiter.lektor, + tbl_mitarbeiter.fixangestellt, + tbl_person.person_id, + tbl_benutzer.alias, + org.oe_kurzbz, + org.bezeichnung oe_bezeichnung, + dv.von, + dv.bis, + dv.vertragsart_kurzbz, + dv.updateamum, + dv.updatevon + FROM tbl_mitarbeiter + JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid::text = tbl_benutzer.uid::text + JOIN tbl_person USING (person_id) + JOIN hr.tbl_dienstverhaeltnis dv ON(tbl_benutzer.uid::text = dv.mitarbeiter_uid::text) + JOIN public.tbl_organisationseinheit org USING(oe_kurzbz) + WHERE tbl_benutzer.uid=?"; + $data = array($uid); + + if(!is_null($oe_kurzbz)) + { + $qry.=" AND oe_kurzbz=?"; + $data[] = $oe_kurzbz; + } + + if (!is_null($beginn) && !is_null($ende)) + { + $qry.=" AND (?,?) OVERLAPS (dv.von, COALESCE(dv.bis, '2999-12-31'))"; + $data[] = $beginn; + $data[] = $ende; + } + + $qry .=" + ORDER BY dv.von desc + "; + + return $this->execQuery($qry, $data); + + } + +}