Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * @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;
 }
Example #3
0
 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;
 }
Example #4
0
 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;
 }
Example #5
0
<?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.