/** * This function ends and saves a competition. * The sql will only find ended competitions on tuesdays, it is supposed to run as a cron. * The competitions and all the calculated data are saved in tables: mm_tavling_save, mm_tavling, mm_lag_save * A tavling_id is created for each competition. * Actions are logged to /motiomera/log/motiomera.log * * All members will have some extra days added, see the FORETAGSMEDLEMS_EXTRA_DAYS * * @author krillo * * krillo 091026 changed the sql to only get the records that have a competition thats ending. * krillo 100420 changed to only save the competition to mm_tavling_save, mm_tavling, mm_lag_save * krillo 110511 changed to add extra days after closed competition FORETAGSMEDLEMS_EXTRA_DAYS * krillo 110817 changed to take a date parameter to be bale to run from admin. Please use only Tuesdays after finished competition */ public static function saveAndEndForetagsTavling($date = false) { Misc::logMotiomera("Start foretag::saveAndEndForetagsTavling() ", 'info'); global $db; $jDate = new JDate($date); $subDays = $jDate->subDays(3)->getDate(true); // today - 3 days in unixtime $sql = 'SELECT c.id as foretag_id, namn as foretag_namn, a.id, a.aNamn as user_anamn, a.epost as user_epost, c.startDatum, c.slutDatum FROM mm_medlem a, mm_foretagsnycklar b, mm_foretag c WHERE a.id = b.medlem_id AND b.foretag_id = c.id AND a.epostBekraftad = 1 AND UNIX_TIMESTAMP(c.slutDatum) BETWEEN ' . $subDays . ' AND ' . $jDate->getOrigDate(true); $users = $db->allValuesAsArray($sql); $tavling = new Tavling('0000-00-00', '0000-00-00'); $save = array(); $i = 1; if (count($users) == 0) { Misc::logMotiomera("No tavling ended this last sunday", 'info'); } else { //commence saving Misc::logMotiomera("End of tavling, saving data for " . count($users) . " members", 'info'); foreach ($users as $user) { $medlem = Medlem::loadById($user['id']); if (isset($medlem)) { $startDatum = $user['startDatum']; //$medlem->getForetag()->getStartDatum(); $slutDatum = $user['slutDatum']; //$medlem->getForetag()->getSlutdatum(); if ($tavling->getStartDatum() == '0000-00-00') { $tavling->setStartDatum($startDatum); // give the Tavling object a correct startdate as soon as we've got one (we only do this once) $tavling->setSlutDatum($slutDatum); $tavling->commit(); } if ($medlem->getForetag()) { if ($medlem->getLag()) { //members that are not in a lag, want also to be in the toplists set lagId to -1 $lagId = $medlem->getLag()->getId(); } else { $lagId = 0; } $steg = $medlem->getStegTotal($startDatum, $slutDatum); $antal_dagar = $medlem->getForetag()->getAntalTavlingsDagar(); if ($steg > 0) { //only save data for members who have more than 0 steg try { $save[] = array('medlem_id' => $medlem->getId(), 'foretag_id' => $medlem->getForetag()->getId(), 'lag_id' => $lagId, 'foretagsnyckel' => $medlem->getForetagsnyckel(), 'tavlings_id' => $tavling->getId(), 'steg' => $steg, 'start_datum' => $startDatum, 'stop_datum' => $slutDatum, 'antal_dagar' => $antal_dagar); Misc::logMotiomera(" " . $i++ . " tavling_id: " . $tavling->getId() . " | " . $medlem->getForetag()->getNamn() . ' | id: ' . $medlem->getId() . ' | ' . $medlem->getAnamn() . " | steg: {$steg}" . " | email: " . $medlem->getEpost(), 'ok'); $medlem->addPaidUntil(self::FORETAGSMEDLEMS_EXTRA_DAYS); //add some extra days after finished competition $medlem->commit(); } catch (Exception $e) { Misc::logMotiomera(" " . $i++ . " | something went wrong", 'error'); } } else { Misc::logMotiomera(" " . $i++ . " | Member is omitted due to 0 steps |" . $medlem->getForetag()->getNamn() . ' | id: ' . $medlem->getId() . ' | ' . $medlem->getAnamn() . " | steg: {$steg}" . " | email: " . $medlem->getEpost(), 'warning'); } } else { Misc::logMotiomera(" " . $i++ . " | Member is omitted due to member not in foretag | id: " . $medlem->getId() . ' | ' . $medlem->getAnamn() . " | email: " . $medlem->getEpost(), 'warning'); } } } $lag_save = array(); foreach ($save as $m) { //print_r($m); $i = 0; if (!isset($lag_save[$m['lag_id']]) and $m['lag_id'] > 0) { $lag_save[$m['lag_id']] = Lag::loadById($m['lag_id']); } $sql = "INSERT INTO " . Tavling::RELATION_TABLE . " SET "; foreach ($m as $field => $value) { $i++; if ($i == 9) { $sql .= $field . " = '" . $value . "'"; } else { $sql .= $field . " = '" . $value . "', "; } } //echo "<br />$sql"; $db->query($sql); } if (count($lag_save) != 0) { Tavling::saveLagList($lag_save); } } Misc::logMotiomera("End foretag::saveAndEndForetagsTavling() ", 'info'); }