/** * Создание организации * @param array $data * @param Organization $parent * @return Organization|null */ protected function createOrganization(array $data, Organization $parent = null) { $organization = new Organization(); // если есть родительская организация, берем статус из нее if ($parent === null) { $organization->status()->associate($this->misc['statuses']->get(mb_convert_case(array_get($data, 'Stan'), MB_CASE_TITLE))); } else { $organization->status()->associate($parent->status); } $organization->opf()->associate($this->misc['opfs']->get(mb_convert_case(array_get($data, 'Opf'), MB_CASE_TITLE))); // если передан тип значит это подорганизация, иначе это главная организация и она - юр лицо $organization->type()->associate(array_get($data, 'type', $this->misc['types']['Юридична особа'])); $organization->fullName = array_get($data, 'Name', ''); $organization->shortName = array_get($data, 'ShortName', ''); $organization->edrpou = array_get($data, 'Kod', ''); $organization->address = array_get($data, 'Address', ''); if (!empty($organization->address)) { // почтовый индекс if (preg_match('~^(\\d+),~u', $organization->address, $matches)) { $organization->postCode = $matches[1]; } // вытягиваем город из адреса if (preg_match('~,\\s*(?:м.|місто)\\s*(\\w+)\\s*,~ui', $organization->address, $matches)) { $organization->city()->associate($this->misc['cities'][mb_convert_case($matches[1], MB_CASE_TITLE)]); } } if (!$organization->save()) { return null; } // создаем под организации if (isset($data['Pidrozdil'])) { if (is_array($data['Pidrozdil'])) { foreach ($data['Pidrozdil'] as $subOrg) { $subOrgData = $this->parseSubOrganization($subOrg); $organization->organizations()->save($this->createOrganization($subOrgData, $organization)); } } else { $subOrgData = $this->parseSubOrganization($data['Pidrozdil']); $organization->organizations()->save($this->createOrganization($subOrgData, $organization)); } } // если указан руководитель, добавляем его в БД if (isset($data['Kerivnik'])) { // поднимаем первые буквы в вверхний регист, остальные в нижний $chief = implode(' ', array_map(function ($item) { $parts = explode('-', $item); if (count($parts) == 1) { return mb_convert_case($item, MB_CASE_TITLE); } else { return implode('-', array_map(function ($it) { return mb_convert_case($it, MB_CASE_TITLE); }, $parts)); } }, explode(' ', mb_strtolower($data['Kerivnik'])))); $organization->chief = $chief; $organization->save(); } return $organization; }