user = $user; $this->tmpname = $filename; $this->sperrdatum = $sperrdatum; $this->project_kurzbz_array = []; $projects = $this->project->getProjekteListForMitarbeiter($user); foreach ($projects as $pp) $this->project_kurzbz_array[] = (string) $pp->projekt_kurzbz; $this->projectphasen_kurzbz_array = []; $projektphasen = $this->phase->getProjectphaseForMitarbeiter($user); foreach ($projektphasen as $pp) $this->projectphasen_kurzbz_array[] = (string) $pp->projektphase_id; } /** * @param string $msg * @param boolean $prepend_current_line * @return void */ protected function addError($msg, $prepend_current_line = false) { if( $prepend_current_line ) { $msg = 'Zeile ' . $this->current_line . ' - ' . $msg; } $this->errors[] = $msg; } /** * @return void */ public function import() { try { $this->checkMimeType(); $this->openFileForReading(); $this->checkEncoding(); $this->iterateRows(); $this->checkAndCleanup(); } catch (Exception $ex) { $this->addError($ex->getMessage()); } } /** * @return void * * @throws Exception */ protected function checkMimeType() { $mimeType = mime_content_type($this->tmpname); if ($mimeType !== 'text/plain' ) { throw new Exception('Datei ist nicht im CSV Format.'); } } /** * @return void * * @throws Exception */ protected function openFileForReading() { if (false === ($this->fh = fopen($this->tmpname, 'r')) ) { throw new Exception('CSV - Datei konnte nicht zum lesen geöffnet werden.'); } } /** * @return void * * @throws Exception */ protected function checkEncoding() { $filecontent = file_get_contents($this->tmpname); if (!mb_detect_encoding($filecontent, 'UTF-8', true) ) { throw new Exception('Datei konnte nicht importiert werden. Encoding ist nicht UTF-8!'); } } /** * @return void */ protected function iterateRows() { set_time_limit(0); $this->anzahl = 0; $this->importtage_array = array(); $this->ende_vorher = date('Y-m-d H:i:s'); $data = null; $this->current_line = 0; while (($data = fgetcsv($this->fh, 1000, ';', '"')) !== FALSE) { if ((false !== strpos($data[self::USER], '#')) || count($data) < self::ANZAHL_PFLICHTFELDER) { // ignore lines starting with # continue; } $this->current_line++; $this->processData($data); } } /** * @param array $data * @return void */ protected function processData($data) { try { $this->checkUser($data[self::USER]); $this->initData($data); $this->checkProject($data[self::PROJEKT], $data[self::PHASE]); $this->checkPhase($data[self::PHASE]); $this->checkZeitsperren($this->user, $this->datum->formatDatum($data[self::STARTDT], 'Y-m-d')); $this->checkSperrdatum($data[self::STARTDT]); $this->checkLimitdatum($data[self::STARTDT]); $this->checkDienstreise($data[self::STARTDT], $data[self::ENDEDT], $data[self::AKTIVITAET]); $this->checkTagesgenau($data[self::ENDEDT]); if(empty($data[self::PHASE])) $this->checkProjectInterval($data[self::PROJEKT], $data[self::STARTDT], $data[self::ENDEDT]); $this->checkPhaseInterval($data[self::PHASE], $data[self::STARTDT], $data[self::ENDEDT]); $this->checkVals($data[self::OE],$data[self::PROJEKT],$data[self::PHASE],$data[self::SERVICE]); $this->mapLehreIntern($data); $this->prepareZeitaufzeichnung($data); $this->checkImporttage($data[self::STARTDT]); $this->saveZeit($data[self::STARTDT], $data[self::ENDEDT]); } catch (Exception $ex) { $this->addError($ex->getMessage(), true); } } /** * @param string $user The User ID * @return void * * @throws Exception */ protected function checkUser($user) { if ($user !== $this->user || (strpos($user, '#') !== false)) { throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten").': Falsche UID nicht importiert (' . $user . ')'); } } /** * @param string $project The Project ID or empty string * @param string $phase The Phase ID or empty string * @return void * * @throws Exception */ protected function checkProject($project, $phase) { if(!empty($project) && !in_array($project, $this->project_kurzbz_array) && empty($phase)) { throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten").': Eingabe nicht möglich, da Sie folgendem Projekt entweder nicht zugewiesen sind oder das Projekt schon abgeschlossen wurde: (' . $project . ')'); } } /** * @param string $phase The Phase ID or empty string * @return void * * @throws Exception */ protected function checkPhase($phase) { if(!empty($phase) && !in_array($phase, $this->projectphasen_kurzbz_array)) { throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten").': Eingabe nicht möglich, da Sie folgender Projektphase entweder nicht zugewiesen sind oder die Projektphase schon abgeschlossen wurde: (' . $phase . ')'); } } /** * @param array $data * @return void */ protected function initData(&$data) { foreach ([self::OE, self::PROJEKT, self::PHASE, self::SERVICE] as $key) if (!isset($data[$key])) $data[$key] = NULL; if (!isset($data[self::HOMEOFFICE])) $data[$key] = false; } /** * @param string $start datetimestring * @return void * * @throws Exception */ protected function checkSperrdatum($start) { if ($this->datum->formatDatum($start, 'Y-m-d H:i:s') < $this->sperrdatum) { throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': Eingabe nicht möglich da vor dem Sperrdatum (' . $start . ')'); } } /** * @param string $oe_val * @param string $project_val * @param string $phase_val * @param string $service_val * @return void * * @throws Exception */ protected function checkVals($oe_val, $project_val, $phase_val, $service_val) { $failedvals = $this->_checkVals($oe_val, $project_val, $phase_val, $service_val); if( count($failedvals) > 0 ) { throw new Exception($this->p->t("global/fehlerBeimSpeichernDerDaten").': Fehlerhafte Werte ('.implode(', ', $failedvals).')'); } } /** * @param string $oe_val * @param string $project_val * @param string $phase_val * @param string $service_val * @return array */ protected function _checkVals ($oe_val, $project_val, $phase_val, $service_val) { $error = []; if ($service_val && ( filter_var($service_val, FILTER_VALIDATE_INT) === false )) { $error[] = 'service'; } if ($phase_val && ( filter_var($phase_val, FILTER_VALIDATE_INT) === false )) { $error[] = 'phase'; } if ($oe_val) { $oecheck = new organisationseinheit($oe_val); if ($oecheck->errormsg) { $error[] = 'OE'; } } if ($project_val) { $procheck = new projekt($project_val); if ($procheck->errormsg) { $error[] = 'projekt'; } } return $error; } /** * @param array $data * @return void */ protected function mapLehreIntern(&$data) { if ($data[self::AKTIVITAET] == 'LehreIntern') { $data[self::AKTIVITAET] = 'Lehre'; } } /** * @param array $data * @return void */ protected function prepareZeitaufzeichnung($data) { $this->zeit->new = true; $this->zeit->beschreibung = NULL; $this->zeit->oe_kurzbz_1 = NULL; $this->zeit->projekt_kurzbz = NULL; $this->zeit->projektphase_id = NULL; $this->zeit->service_id = NULL; $this->zeit->insertamum = date('Y-m-d H:i:s'); $this->zeit->updateamum = date('Y-m-d H:i:s'); $this->zeit->updatevon = $this->user; $this->zeit->insertvon = $this->user; $this->zeit->uid = $data[self::USER]; $this->zeit->aktivitaet_kurzbz = $data[self::AKTIVITAET]; $this->zeit->start = $this->datum->formatDatum($data[self::STARTDT], 'Y-m-d H:i:s'); $this->zeit->ende = $this->datum->formatDatum($data[self::ENDEDT], 'Y-m-d H:i:s'); if (isset($data[self::BESCHREIBUNG])) { $this->zeit->beschreibung = $data[self::BESCHREIBUNG]; } if (isset($data[self::OE])) { $this->zeit->oe_kurzbz_1 = $data[self::OE]; } if (isset($data[self::PROJEKT])) { $this->zeit->projekt_kurzbz = $data[self::PROJEKT]; } if (isset($data[self::PHASE])) { $this->zeit->projektphase_id = $data[self::PHASE]; } if (isset($data[self::SERVICE])) { $this->zeit->service_id = $data[self::SERVICE]; } $this->zeit->homeoffice = false; if (isset($data[self::HOMEOFFICE])) { $this->zeit->homeoffice = (strtolower($data[self::HOMEOFFICE]) == 'true'); if (strtolower($data[self::HOMEOFFICE]) == 'true') { // check, ob homeoffice gemäß Bisverwendung $vonCSV = $this->datum->formatDatum($data[self::STARTDT], 'Y-m-d'); $verwendung = new bisverwendung(); $verwendung->getVerwendungDatum($data[self::USER], $vonCSV); foreach ($verwendung->result as $v) { if ($v->homeoffice) { $this->zeit->homeoffice = true; } else { $this->addWarning($this->p->t("zeitaufzeichnung/homeofficeNichtErlaubt", [$vonCSV])); $this->zeit->homeoffice = false; } } } } } /** * @param string $start datestring * @return void * * @throws Exception */ protected function checkImporttage($start) { $tag = $this->datum->formatDatum($start, 'Y-m-d'); if (!in_array($tag, $this->importtage_array)) { $this->importtage_array[] = $tag; $this->zeit->deleteEntriesForUser($this->user, $tag); } else if ($this->ende_vorher < $this->zeit->start) { $this->savePause(); } $this->ende_vorher = $this->zeit->ende; } /** * @return void */ protected function savePause() { $pause = new zeitaufzeichnung(); $pause->new = true; $pause->insertamum = date('Y-m-d H:i:s'); $pause->updateamum = date('Y-m-d H:i:s'); $pause->updatevon = $this->user; $pause->insertvon = $this->user; $pause->uid = $this->user; $pause->aktivitaet_kurzbz = 'Pause'; $pause->start = $this->ende_vorher; $pause->ende = $this->zeit->start; $pause->beschreibung = ''; $pause->homeoffice = $this->zeit->homeoffice; if(!$pause->save()) { $this->addError($this->p->t("global/fehlerBeimSpeichernDerDaten").': '.$pause->errormsg, true); } } /** * @param string $start datetimestring * @param string $end datetimestring * @return void */ protected function saveZeit($start, $end) { if ($start != $end) { if (!$this->zeit->save()) { $this->addError($this->p->t("global/fehlerBeimSpeichernDerDaten") . ': ' . $this->zeit->errormsg . '(' . $this->zeit->start . ')', true); } else { $this->anzahl++; } } else { $this->anzahl++; } } /** * @return void */ protected function checkAndCleanup() { if ($this->anzahl > 0) { $this->addInfo($this->p->t("global/datenWurdenGespeichert") . ' (' . $this->anzahl . ')'); foreach ($this->importtage_array as $ptag) { $this->zeit->cleanPausenForUser($this->user, $ptag); } } } }