addDireccion($data); $data['direccion'] = $direccion->id; $data['dv'] = 'i'; if (str_contains($data['rut'], '-')) { list($rut, $dv) = explode('-', $data['rut']); $data['rut'] = $rut; $data['dv'] = $dv; } $fields = array_fill_keys([ 'rut', 'dv', 'nombres', 'apellido_paterno', 'apellido_materno', 'direccion' ], 0); $filtered_data = array_intersect_key($data, $fields); try { $propietario = $this->propietarioRepository->fetchById($data['rut']); $edits = []; if ($propietario->datos->direccion->id !== $filtered_data['direccion']) { $edits['direccion'] = $filtered_data['direccion']; } $propietario = $this->propietarioRepository->edit($propietario, $edits); } catch (EmptyResult) { $propietario = $this->propietarioRepository->create($filtered_data); $propietario = $this->propietarioRepository->save($propietario); } return $propietario; } public function addSociedad(array $data): Model\Venta\Propietario { $direccion = $this->addDireccion($data); $data['direccion'] = $direccion->id; if (str_contains($data['rut'], '-')) { $data['rut'] = explode('-', $data['rut'])[0]; } $fields = array_fill_keys([ 'rut', 'razon_social', 'direccion', 'representante' ], 0); $filtered_data = array_intersect_key($data, $fields); $mapped_data = array_combine([ 'rut', 'nombres', 'direccion', 'representante' ], $filtered_data); try { $sociedad = $this->propietarioRepository->fetchById($data['rut']); $edits = []; if ($sociedad->datos->direccion->id !== $mapped_data['direccion']) { $edits['direccion'] = $mapped_data['direccion']; } if ($sociedad->representante->rut !== $mapped_data['representante']) { $edits['representante'] = $mapped_data['representante']; } $sociedad = $this->propietarioRepository->edit($sociedad, $edits); } catch (EmptyResult) { $sociedad = $this->propietarioRepository->create($mapped_data); $sociedad = $this->propietarioRepository->save($sociedad); } return $sociedad; } protected function addDireccion(array $data): Model\Direccion { $fields = array_fill_keys([ 'calle', 'numero', 'extra', 'comuna' ], 0); $filtered_data = array_intersect_key($data, $fields); try { $direccion = $this->direccionRepository->fetchByCalleAndNumeroAndExtra($filtered_data['calle'], $filtered_data['numero'], $filtered_data['extra']); } catch (EmptyResult) { $direccion = $this->direccionRepository->create($filtered_data); $direccion = $this->direccionRepository->save($direccion); } return $direccion; } }