/** * Shrani dogodek in pripadajoče ažurirane termine storitve * * * @param \Koledar\Entity\Dogodek $dogodek * @param array $terminiStoritev termini storitev v obliki: * [ { 'id' : 'id-ts' * ,'planiranZacetek' : 'iso-date' * ,'planiranKonec' : 'iso-date' * ,'alternacija' : 'id-alternacije' * ,'dezurni' : 'boolean' * ,'gost' : 'boolean' * ,'sodelujoc' : 'boolean' * ,'oseba' : 'oseba-id' * } ,...] * @return boolean */ public function azurirajTSDogodka(\Koledar\Entity\Dogodek $dogodek, array $terminiStoritev = []) { $em = $this->serviceLocator->get("\\Doctrine\\ORM\\EntityManager"); $tsR = $em->getRepository("Prisotnost\\Entity\\TerminStoritve"); $altR = $em->getRepository("Produkcija\\Entity\\Alternacija"); $osebaR = $em->getRepository("App\\Entity\\Oseba"); /* * - za vse stare ts * . če ne obstaja novi TS -> DELETE stari TS */ foreach ($dogodek->getTerminiStoritve() as $oldts) { if (!in_array($oldts->getId(), array_column($terminiStoritev, "id"))) { $tsR->delete($oldts); } } /* * - za vse nove ts * . če obstaja stari TS -> UPDATE novi TS če se časa starega novega razlikujeta * . sicer -> CREATE novi TS */ foreach ($terminiStoritev as $newts) { /* * ali TS že obstaja v dogodku */ if (array_key_exists('id', $newts) && $dogodek->getTerminiStoritve()->exists(function ($key, $f) use(&$newts) { return $f->getId() === $newts['id']; // nov ts obstaja v dogodku })) { $tsA = $dogodek->getTerminiStoritve()->filter(function ($ent) use(&$newts) { return $ent->getId() === $newts['id']; // nov ts obstaja v dogodku }); $this->expect($tsA->count() == 1, "V dogodku je napačno število terminov storitev z id=" . $newts['id'], 1001270); $ts = $tsA->first(); /* * če je spremennjen začetek ali konec termina storitve ga osvežimo */ $planiranZacetek = empty($newts['planiranZacetek']) ? null : $this->filterDate(date_create($newts['planiranZacetek'])); // polje mora biti v php-jevi PHP-jevem datetime tipu $planiranKonec = empty($newts['planiranKonec']) ? null : $this->filterDate(date_create($newts['planiranKonec'])); // polje mora biti v php-jevi PHP-jevem datetime tipu if ($ts->getPlaniranZacetek() !== $planiranZacetek || $ts->getPlaniranKonec() !== $planiranKonec) { $ts->setPlaniranZacetek($planiranZacetek); $ts->setPlaniranKonec($planiranKonec); $tsR->update($ts); } } else { /* * kreiraj nov TS */ $ts = new \Prisotnost\Entity\TerminStoritve(); $ts->setDogodek($dogodek); $planiranZacetek = empty($newts['planiranZacetek']) ? null : $this->filterDate(date_create($newts['planiranZacetek'])); // polje mora biti v php-jevi PHP-jevem datetime tipu $ts->setPlaniranZacetek($planiranZacetek); $planiranKonec = empty($newts['planiranKonec']) ? null : $this->filterDate(date_create($newts['planiranKonec'])); // polje mora biti v php-jevi PHP-jevem datetime tipu $ts->setPlaniranKonec($planiranKonec); $oseba = empty($newts['oseba']) ? null : $osebaR->findOneById($newts['oseba']['id']); $ts->setOseba($oseba); $alt = empty($newts['alternacija']) ? null : $altR->findOneById($newts['alternacija']['id']); $ts->setAlternacija($alt); $ts->setDezurni($newts['dezurni'] ?: false); $ts->setGost($newts['gost'] ?: FALSE); $ts->setSodelujoc($newts['sodelujoc'] ?: false); $ts->setZasedenost(false); $ts->setVirtZasedenost(false); $tsR->create($ts); } } return TRUE; }
/** * * @param \Tip\Repository\IzbirneOpcije $rep * @param string $object * @param array $vals */ public function populateTerminStoritve($manager, $v) { $rep = $manager->getRepository('Prisotnost\\Entity\\TerminStoritve'); $dogodek = $v[6] ? $this->getReference($v[6]) : null; $alternacija = $v[7] ? $this->getReference($v[7]) : null; $oseba = $v[8] ? $this->getReference($v[8]) : null; $planiranZacetek = empty($v[1]) ? null : date_create($v[1]); // polje mora biti v php-jevi PHP-jevem datetime tipu $o = $rep->findOneBy(["dogodek" => $dogodek, "alternacija" => $alternacija, "oseba" => $oseba, "planiranZacetek" => $planiranZacetek]); $nov = false; if (!$o) { $o = new \Prisotnost\Entity\TerminStoritve(); $o->setDogodek($dogodek); $o->setAlternacija($alternacija); $o->setOseba($oseba); $o->setPlaniranZacetek($planiranZacetek); $nov = true; } $date = empty($v[2]) ? null : date_create($v[2]); // polje mora biti v php-jevi PHP-jevem datetime tipu $o->setPlaniranKonec($date); // $date = empty($v[3]) ? null : date_create($v[3]); // polje mora biti v php-jevi PHP-jevem datetime tipu // $o->setZacetek($date); // $date = empty($v[4]) ? null : date_create($v[4]); // polje mora biti v php-jevi PHP-jevem datetime tipu // $o->setKonec($date); // $o->setPlaniranoTraja($v[5]); $o->setDezurni($v[9]); $o->setGost($v[10]); $o->setSodelujoc($v[11]); $o->setZasedenost($v[12]); if ($nov) { $rep->create($o); } else { $rep->update($o); } /* * izjemoma rabimo flush zaradi kontrole TS pri gostovanju */ $manager->flush(); $referenca = 'TerminStoritve-' . $v[0]; // var_dump($referenca); $this->addReference($referenca, $o); }
/** * Opravila pri ustvarjanju nove entitete * * @param Dogodek $object * @param Parameters $params */ public function create($object, $params = null) { if ($object->getNadrejenoGostovanje()) { $object->getNadrejenoGostovanje()->getPodrejeniDogodki()->add($object); } if (!$object->getStatus()) { $object->setStatus(Dogodek::PLANIRAN); } if (!empty($params['alternacija'])) { $this->expect(is_array($params['alternacija']), "Parameter alternacija mora biti array id-jev", 1000584); $alternacijaIds = $params['alternacija']; } else { $alternacijaIds = []; } if (!empty($params['dezurni'])) { $this->expect(is_array($params['dezurni']), "Parameter dezurni mora biti array id-jev", 1000588); $dezurniIds = $params['dezurni']; } else { $dezurniIds = []; } if (!empty($params['gost'])) { $this->expect(is_array($params['gost']), "Parameter gost mora biti array id-jev", 1000588); $gostIds = $params['gost']; } else { $gostIds = []; } if (!empty($params['sodelujoc'])) { $this->expect(is_array($params['sodelujoc']), "Parameter sodelujoč mora biti array id-jev", 1000588); $sodelujocIds = $params['sodelujoc']; } else { $sodelujocIds = []; } $this->preracunajSezono($object); parent::create($object, $params); /* * preberemo delte iz opcij */ $optionR = $this->getEntityManager()->getRepository('App\\Entity\\Option'); $option = $optionR->findOneByName("dogodek.delte"); $this->expect($option, "Opcija dogodek.delte ne obstaja", 1000587); $delte = $option->getDefaultValue(); /* * init delt */ switch ($object->getRazred()) { case $object::PREDSTAVA: $deltaZacetek = $delte['delPreZac']['value']; $deltaKonec = $delte['delPreKon']['value']; $deltaZacetekTeh = $delte['delPreZacTeh']['value']; $deltaKonecTeh = $delte['delPreKonTeh']['value']; break; case $object::VAJA: $deltaZacetek = $delte['delVajZac']['value']; $deltaKonec = $delte['delVajKon']['value']; $deltaZacetekTeh = $delte['delVajZacTeh']['value']; $deltaKonecTeh = $delte['delVajKonTeh']['value']; break; case $object::SPLOSNO: $deltaZacetek = $deltaZacetekTeh = $delte['delSplZac']['value']; $deltaKonec = $deltaKonecTeh = $delte['delSplKon']['value']; break; case $object::TEHNICNI: $deltaZacetek = $deltaZacetekTeh = $delte['delTehZac']['value']; $deltaKonec = $deltaKonecTeh = $delte['delTehKon']['value']; break; case $object::GOSTOVANJE: $deltaZacetek = $deltaZacetekTeh = $delte['delGosZac']['value']; $deltaKonec = $deltaKonecTeh = $delte['delGosKon']['value']; break; default: $deltaZacetek = $deltaZacetekTeh = $deltaKonecTeh = $deltaKonec = 0; break; } /* * če obstajajo delta parmetri, z njimi povozimo vrednosti: */ if (!empty($params['deltaZac'])) { $deltaZacetek = $params['deltaZac']; } if (!empty($params['deltaZacTeh'])) { $deltaZacetekTeh = $params['deltaZacTeh']; } if (!empty($params['deltaKon'])) { $deltaKonec = $params['deltaKon']; } if (!empty($params['deltaKonTeh'])) { $deltaKonecTeh = $params['deltaKonTeh']; } $terminStoritveR = $this->getEntityManager()->getRepository('Prisotnost\\Entity\\TerminStoritve'); $altR = $this->getEntityManager()->getRepository('Produkcija\\Entity\\Alternacija'); $osebaR = $this->getEntityManager()->getRepository('App\\Entity\\Oseba'); /* * kreiram termine storitve za alternacije */ foreach ($alternacijaIds as $altId) { $alt = $altR->findOneById($altId); $this->expect($alt, "Alternacija ({$altId}) ne obstaja", 1000586); $aliTehnik = false; //init if ($alt->getFunkcija()) { if ($alt->getFunkcija()->getPodrocje() == 'tehnik') { $aliTehnik = true; } } $ts = new \Prisotnost\Entity\TerminStoritve(); $ts->setDogodek($object); $ts->setAlternacija($alt); $deltaZ = $aliTehnik ? $deltaZacetekTeh : $deltaZacetek; $ts->setPlaniranZacetek($this->dodajInterval($object->getZacetek(), $deltaZ)); $deltaK = $aliTehnik ? $deltaKonecTeh : $deltaKonec; $ts->setPlaniranKonec($this->dodajInterval($object->getKonec(), $deltaK)); $ts->setDezurni(false); $ts->setGost(false); $ts->setZasedenost(false); $ts->setVirtZasedenost(false); $ts->setSodelujoc(FALSE); $ts->setUra(null); $object->terminiStoritve->add($ts); // verjetno to ni potrebno $terminStoritveR->create($ts); } /* * kreiram termine storitve za goste */ foreach ($gostIds as $gostId) { $oseba = $osebaR->findOneById($gostId); $this->expect($oseba, "Oseba gost ({$gostId}) ne obstaja", 1000589); $ts = new \Prisotnost\Entity\TerminStoritve(); $ts->setDogodek($object); $ts->setGost(true); $ts->setOseba($oseba); $deltaZ = $deltaZacetek; $ts->setPlaniranZacetek($this->dodajInterval($object->getZacetek(), $deltaZ)); $deltaK = $deltaKonec; $ts->setPlaniranKonec($this->dodajInterval($object->getKonec(), $deltaK)); $ts->setDezurni(false); $ts->setSodelujoc(FALSE); $ts->setZasedenost(false); $ts->setVirtZasedenost(false); $ts->setUra(null); $object->terminiStoritve->add($ts); // verjetno to ni potrebno $terminStoritveR->create($ts); } /* * kreiram termine storitve za dežurne */ foreach ($dezurniIds as $dezurniId) { $oseba = $osebaR->findOneById($dezurniId); $this->expect($oseba, "Oseba dezurni ({$dezurniId}) ne obstaja", 1000590); $ts = new \Prisotnost\Entity\TerminStoritve(); $ts->setDogodek($object); $ts->setDezurni(TRUE); $ts->setOseba($oseba); $deltaZ = $deltaZacetek; $ts->setPlaniranZacetek($this->dodajInterval($object->getZacetek(), $deltaZ)); $deltaK = $deltaKonec; $ts->setPlaniranKonec($this->dodajInterval($object->getKonec(), $deltaK)); $ts->setGost(false); $ts->setSodelujoc(FALSE); $ts->setZasedenost(false); $ts->setVirtZasedenost(false); $ts->setUra(null); $object->terminiStoritve->add($ts); // verjetno to ni potrebno $terminStoritveR->create($ts); } /* * kreiram termine storitve za sodelujoče */ foreach ($sodelujocIds as $sodelujocId) { $oseba = $osebaR->findOneById($sodelujocId); $this->expect($oseba, "Oseba sodelujoč ({$sodelujocId}) ne obstaja", 1000590); $ts = new \Prisotnost\Entity\TerminStoritve(); $ts->setDogodek($object); $ts->setSodelujoc(TRUE); $ts->setOseba($oseba); $deltaZ = $deltaZacetek; $ts->setPlaniranZacetek($this->dodajInterval($object->getZacetek(), $deltaZ)); $deltaK = $deltaKonec; $ts->setPlaniranKonec($this->dodajInterval($object->getKonec(), $deltaK)); $ts->setDezurni(false); $ts->setGost(false); $ts->setZasedenost(false); $ts->setVirtZasedenost(false); $ts->setUra(null); $object->terminiStoritve->add($ts); // verjetno to ni potrebno $terminStoritveR->create($ts); } }