/** * Download a specific law's card page. * * @param string $id Law ID. * @param bool $re_download Whether or not to re-download card page. * * @return Law * @throws JobChangePriorityException * @throws Exceptions\ProxyBanned */ function downloadCard($id, $re_download = false) { /** * @var $law Law */ $law = Law::find($id); try { $card = downloadCard($id, ['re_download' => $re_download || $this->re_download, 'check_related' => $law->status == Law::NOT_DOWNLOADED && !max_date()]); } catch (Exceptions\ProxyBanned $e) { throw $e; } catch (\Exception $e) { $message = str_replace('ShvetsGroup\\Service\\Exceptions\\', '', get_class($e)) . ($e->getMessage() ? ': ' . $e->getMessage() : ''); throw new JobChangePriorityException($message, -15); } DB::transaction(function () use($law, $card) { $law->card = $card['card']; $law->title = $card['title']; $law->date = $card['date']; $law->setIssuers($card['meta'][Issuer::FIELD_NAME]); $law->setTypes($card['meta'][Type::FIELD_NAME]); $law->state = isset($card['meta'][State::FIELD_NAME]) ? reset($card['meta'][State::FIELD_NAME]) : State::STATE_UNKNOWN; $law->has_text = $card['has_text'] ? $law->has_text = Law::HAS_TEXT : ($law->has_text = Law::NO_TEXT); $has_unknown_revision = false; foreach ($card['revisions'] as &$revision) { if ($revision['date'] == '??.??.????') { $has_unknown_revision = true; continue; } $data = ['law_id' => $revision['law_id'], 'date' => $revision['date'], 'comment' => $revision['comment']]; if ($law->notHasText() || isset($revision['no_text']) && $revision['no_text'] && $revision['date'] != $card['active_revision']) { $data['status'] = Revision::NO_TEXT; $data['text'] = ''; } $r = Revision::findROrNew($data['law_id'], $data['date']); $r->save(); $r->update($data); } // We should update revision which has just come into power. if ($law->active_revision && $law->active_revision != $card['active_revision']) { Revision::find($data['law_id'], $card['active_revision'])->update(['status' => Revision::NEEDS_UPDATE]); } $law->active_revision = $card['active_revision']; foreach ($law->revisions()->where('status', Revision::NEEDS_UPDATE)->get() as $revision) { $this->jobsManager->add('command.lawgrabber.download', 'downloadRevision', ['law_id' => $revision->law_id, 'date' => $revision->date], 'download', $revision->date == $law->active_revision ? 0 : -1); } if (isset($card['changes_laws']) && $card['changes_laws']) { Law::where('id', array_column($card['changes_laws'], 'id'))->update(['status' => Law::DOWNLOADED_BUT_HAS_UNKNOWN_REVISION]); foreach ($card['changes_laws'] as $l) { $this->jobsManager->add('command.lawgrabber.download', 'downloadCard', ['id' => $l['id'], 're_download' => true], 'download', 2); } } $law->card_updated = $card['timestamp']; $law->status = $has_unknown_revision ? Law::DOWNLOADED_BUT_HAS_UNKNOWN_REVISION : Law::UP_TO_DATE; $law->save(); }); return $law; }
/** * @param Revision $revision * * @return string * @throws LawHasNoTextAtRevision */ public function getRevisionText(Revision $revision) { $law = $revision->getLaw(); if ($law->notHasText()) { return ''; } if ($revision->text) { return $revision->text; } $previous_revision = Revision::where('text', '<>', '')->where('law_id', $revision->law_id)->where('date', '<', $revision->date)->orderBy('date', 'desc')->first(); if (!$previous_revision) { return ''; } return $previous_revision->text; }
public function groupRevisionsForCommits($date) { /** * @var $all Revision[] */ $all = $this->filterQuery(Revision::where(['date' => $date]))->get(); $revisions = []; foreach ($all as $revision) { $revisions[$revision->law_id] = $revision; } foreach ($revisions as $revision) { $revision->related = array_merge($this->getRevisionReferences($revision), $revision->related ?: []); foreach ($revision->related as $ref) { if (!isset($revisions[$ref])) { continue; } $r = $revisions[$ref]->related ?: []; $r[$revision->law_id] = $revision->law_id; $revisions[$ref]->related = $r; } } $commits = []; reset($revisions); while (list($key, $revision) = each($revisions)) { $commit = [$key => $revision]; foreach ($revision->related as $ref) { if (!isset($revisions[$ref])) { continue; } $commit[$ref] = $revisions[$ref]; unset($revisions[$ref]); } $main_revision = $this->getRevisionWithNoReferences($commit); unset($commit[$main_revision->law_id]); $commit = array_merge([$main_revision->law_id => $main_revision], $commit); $commits[] = $commit; } return $commits; }
public function formatRevisionComment(Revision $revision, $add_links = false) { $comment = $revision->comment; $comment = preg_replace_callback('%<a href="(.*?)" target="_blank">(.*?)</a>%', function ($matches) use($revision, $add_links) { $url = urldecode($matches[1]); $title = $matches[2]; if ($add_links) { if (preg_match('%/laws/(.*?)(?:$|/ed|#|\\?)%', $url, $matches)) { $law_id = $matches[1]; $url = $this->getLawURL($law_id, '/RadaData/zakon'); } return "[{$title}]({$url})"; } else { return $title; } }, $comment); $comment = preg_replace_callback('%([\\s\\S]+?)(, підстава.*)?$%', function ($matches) use($revision) { $statuses = explode("\n", array_get($matches, 1, '')); $reason = array_get($matches, 2, ''); $law = $revision->getLaw(); $type = $law->types()->get()->first(); if (!$type) { return $matches[0]; } $title = $law->title; $type_name = $type->name; $type_name = mb_strtolower(mb_substr($type_name, 0, 1)) . mb_substr($type_name, 1, mb_strlen($type_name) - 1); $i = 0; foreach ($statuses as &$status) { $status = trim($status); if ($status == 'Прийняття') { switch ($type->getRid()) { case 'f': $status = 'Прийнята'; break; case 'b': $status = 'Прийнято'; break; case 'b+': $status = 'Прийняті'; break; default: $status = 'Прийнятий'; break; } } if ($status == 'Ратифікація') { switch ($type->getRid()) { case 'f': $status = 'Ратифікована'; break; case 'b': $status = 'Ратифіковано'; break; case 'b+': $status = 'Ратифіковані'; break; default: $status = 'Ратифікований'; break; } } if ($status == 'Скасування') { switch ($type->getRid()) { case 'f': $status = 'Скасована'; break; case 'b': $status = 'Скасовано'; break; case 'b+': $status = 'Скасовані'; break; default: $status = 'Скасований'; break; } } if ($status == 'Затвердження') { switch ($type->getRid()) { case 'f': $status = 'Затверджена'; break; case 'b': $status = 'Затверджено'; break; case 'b+': $status = 'Затверджені'; break; default: $status = 'Затверджений'; break; } } elseif (mb_strpos($status, 'Набрання чинності') !== FALSE) { $status = preg_replace('| міжнародного договору|u', '', $status); switch ($type->getRid()) { case 'f': $status = preg_replace('|Набрання чинності|u', 'Набрала чинності', $status); break; case 'b': $status = preg_replace('|Набрання чинності|u', 'Набрало чинності', $status); break; case 'b+': $status = preg_replace('|Набрання чинності|u', 'Набрали чинності', $status); break; default: $status = preg_replace('|Набрання чинності|u', 'Набрав чинності', $status); break; } } elseif ($status == 'Введення в дію') { switch ($type->getRid()) { case 'f': $status = 'Введена в дію'; break; case 'b': $status = 'Введено в дію'; break; case 'b+': $status = 'Введені в дію'; break; default: $status = 'Введений в дію'; break; } } elseif ($status == 'Припинення дії') { switch ($type->getRid()) { case 'f': $status = 'Припинила дію'; break; case 'b': $status = 'Припинило дію'; break; case 'b+': $status = 'Припинили дію'; break; default: $status = 'Припинив дію'; break; } } elseif ($status == 'Зупинення дії') { switch ($type->getRid()) { case 'f': $status = 'Зупинила дію'; break; case 'b': $status = 'Зупинило дію'; break; case 'b+': $status = 'Зупинили дію'; break; default: $status = 'Зупинив дію'; break; } } elseif ($status == 'Відновлення дії') { switch ($type->getRid()) { case 'f': $status = 'Відновила дію'; break; case 'b': $status = 'Відновило дію'; break; case 'b+': $status = 'Відновили дію'; break; default: $status = 'Відновив дію'; break; } } elseif ($status == 'Не набрав чинності') { switch ($type->getRid()) { case 'f': $status = 'Не набрала чинності'; break; case 'b': $status = 'Не набрало чинності'; break; case 'b+': $status = 'Не набрали чинності'; break; default: $status = 'Не набрав чинності'; break; } } elseif ($status == 'Підписання') { switch ($type->getRid()) { case 'f': $status = 'Підписана'; break; case 'b': $status = 'Підписано'; break; case 'b+': $status = 'Підписані'; break; default: $status = 'Підписаний'; break; } } elseif ($status == 'Редакція') { $status = 'Додано нову редакцію в'; } elseif ($status == 'Тлумачення') { $status = 'Додано нове тлумачення в'; } elseif ($status == 'Приєднання' && $type == 'конвенція') { $status = 'Приєднання до'; $type = 'конвенції'; } if ($i > 0) { $status = mb_strtolower($status); } $i++; } $last_status = array_pop($statuses); $status = $statuses ? implode(', ', $statuses) . ' та ' . $last_status : $last_status; $comment = $status . ' ' . $type_name . ' "' . $title . '"' . $reason; $comment = preg_replace('|україн|u', 'Україн', $comment); return $comment; }, $comment); return $comment; }
<?php use LawGrabber\Laws\Law; use LawGrabber\Laws\Revision; use LawPages\LawRenderer; Route::get('/laws/show/{law_id}/ed{date}/raw', function ($law_id, $date) { $law = Law::findOrFail($law_id); $date = date_format(date_create_from_format('Ymd', $date), 'Y-m-d'); $revision = Revision::find($law_id, $date); return view('lawpages::law_page')->with(['law' => $law, 'revision' => $revision, 'raw' => true]); })->where(['law_id' => '[A-Za-z0-9_абвгґдеєжзиіїйклмнопрстуфхцчшщьюяАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯыЫъЪ\\-\\/]+', 'date' => '[0-9]+']); Route::get('/laws/show/{law_id}/ed{date}', function ($law_id, $date) { $law = Law::findOrFail($law_id); $date = date_format(date_create_from_format('Ymd', $date), 'Y-m-d'); $revision = Revision::find($law_id, $date); return view('lawpages::law_page')->with(['law' => $law, 'revision' => $revision]); })->where(['law_id' => '[A-Za-z0-9_абвгґдеєжзиіїйклмнопрстуфхцчшщьюяАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯыЫъЪ\\-\\/]+', 'date' => '[0-9]+']); Route::get('/laws/show/{law_id}/raw', function ($law_id) { $law = Law::findOrFail($law_id); return view('lawpages::law_page')->with('law', $law)->with('raw', true); })->where('law_id', '[A-Za-z0-9_абвгґдеєжзиіїйклмнопрстуфхцчшщьюяАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯыЫъЪ\\-\\/]+'); Route::get('/laws/show/{law_id}', function ($law_id) { $law = Law::findOrFail($law_id); return view('lawpages::law_page')->with(['law' => $law]); })->where(['law_id' => '[A-Za-z0-9_абвгґдеєжзиіїйклмнопрстуфхцчшщьюяАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯыЫъЪ\\-\\/]+']); // TODO: Laws with includes. // TODO: Laws without text, but with files. // TODO: Laws with tables.