/** * Возвращает реквизиты заказчика из слепков * @return type */ public function getEmpReqv() { if (!$this->reserve_data['date_reserve']) { $reqvs = ReservesHelper::getInstance()->getUserReqvs($this->getEmpId()); if ($reqvs && $reqvs['form_type']) { $reqv = $reqvs[$reqvs['form_type']]; $reqv['form_type'] = $reqvs['form_type']; $reqv['rez_type'] = $reqvs['rez_type']; } } elseif ($this->isReserveByService()) { $reqv = $this->getReservesServiceReqvs()->getReqv($this->getEmpId()); } else { $reqv = $this->getReservesBank()->getCheckByReserveId($this->getID()); $reqv['form_type'] = sbr::FT_JURI; //Определяем резидентство $reqv['rez_type'] = sbr::RT_RU; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/country.php'; $country = new country(); $country_iso = !empty($reqv['country_iso']) ? $reqv['country_iso'] : $country->getCountryISO($reqv['country']); if ($country_iso && $country_iso != country::ISO_RUSSIA) { $reqv['rez_type'] = sbr::RT_UABYKZ; } } return $reqv; }
/** * Проверить доступность выплаты данному юзеру * и вернуть его реквизиты * * @param type $uid * @param type $type * @param type $price * @return boolean */ public function getUserReqvs($uid, $type, $price) { $reqvs = ReservesHelper::getInstance()->getUserReqvs($uid); if (!$reqvs) { return false; } $form_type = $reqvs['form_type']; $rez_type = $reqvs['rez_type']; $reqv = $reqvs[$form_type]; $reqv['rez_type'] = $rez_type; $reqv['form_type'] = $form_type; $reqv['moderator_uid'] = $reqvs['moderator_uid']; $reqv['moderator_login'] = $reqvs['moderator_login']; $payments = ReservesHelper::getInstance()->getAllowedPayoutTypes($form_type, $rez_type, $price); if (isset($payments[$type])) { $info = explode(',', @$reqv['address']); //попытка получить код ISO if ((!isset($reqv['country_iso']) || empty($reqv['country_iso'])) && count($info) > 3) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/country.php'; $countryObject = new country(); $country_name = trim($info[1]); $country_iso = $countryObject->getCountryISO($country_name); if ($country_iso) { $reqv['country_iso'] = $country_iso; } } //Если поля mob_phone то пробуем получить из phone if (!isset($reqv['mob_phone']) || empty($reqv['mob_phone'])) { $reqv['mob_phone'] = @$reqv['phone']; } return $reqv; } return false; }
/** * Записать СБР-реквизиты пользователя (страница информации, вкладка "Финансы") * * @param integer $user_id ид. пользователя. * @param integer $form_type 1: это реквизиты физ. лица; 2: юр. лица. * @param integer $rez_type 1: резидент РФ; 2: резидент Украины, Беларуси, Казахстна; NULL: не трогать поле; -1: сбросить в NULL (резиденство неопределено) * @param boolean $ft_disabled true, если нельзя изменить тип лица (меняем только данные этого типа). * @param boolean $is_agree_view_sbr Разрешаю использовать мои паспортные данные в документах сервиса «Безопасная Сделка» * @param array $request массив с реквизитами. Вернется обработанный (убьет лишние слеши и т.д.) * @return mixed 0: успешно; иначе строка/массив с ошибками. */ function setUserReqv($user_id, $rez_type = NULL, $form_type, &$request, $ft_disabled = false, $is_agree_view_sbr = false, $error = array()) { global $DB; if (!$form_type) { $form_type = sbr::FT_PHYS; } if (!$request && !$rez_type) { return 0; } if ($rez_type == -1) { $rez_type = 'NULL'; } if (!$request) { $request = array(); } setlocale(LC_ALL, 'ru_RU.CP1251'); //Передаю статус $validate_status = isset($request['validate_status']) ? $request['validate_status'] : false; unset($request['validate_status']); //Если беженец или вид на жительство то всегда физик if (in_array($rez_type, array(sbr::RT_REFUGEE, sbr::RT_RESIDENCE))) { $form_type = sbr::FT_PHYS; } $sql_u = 'UPDATE sbr_reqv SET form_type = ' . ($ft_disabled ? 'form_type' : $form_type) . ', rez_type = ' . ($rez_type ? $rez_type : 'rez_type'); $sql_u .= ', is_agree_view_sbr = ' . ($is_agree_view_sbr === false ? "is_agree_view_sbr" : "'" . $is_agree_view_sbr . "'"); $sql_u .= ', last = NOW()'; if ($validate_status !== false) { $sql_u .= ", validate_status = {$validate_status}"; } $sql_i = "INSERT INTO sbr_reqv"; $sql_ic = "user_id, form_type, rez_type, is_agree_view_sbr, validate_status"; $sql_iv = "{$user_id}, {$form_type}, " . ($rez_type ? $rez_type : 'NULL') . ", " . ($is_agree_view_sbr === false ? "false" : "'" . $is_agree_view_sbr . "'"); $sql_iv .= ", " . ($validate_status !== false ? $validate_status : 'NULL'); $user = new users(); $user->GetUserByUID($user_id); sbr_meta::getReqvFields(); if ($form_type == sbr::FT_JURI && $rez_type == sbr::RT_RU) { $request['bank_nds'] = $request['bank_nds'] ? 1 : 0; } $bik = $request['bank_bik']; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/country.php'; $countryObject = new country(); foreach ($request as $field => &$value) { // не даем менять верифицированным пользователям некоторые поля // Админ изменить может /*0024645 if (!hasPermissions('users') && $user->is_verify == 't' && in_array($field, array('fio', 'birthday', 'idcard_name', 'idcard', 'idcard_from', 'idcard_to', 'idcard_by', 'mob_phone')) ) { continue; }*/ $err = NULL; if (!($finf = sbr_meta::$reqv_fields[$form_type][$field]) || $finf['rez_type'] && !($finf['rez_type'] & ($rez_type ? $rez_type : sbr::RT_RU) || in_array($rez_type, $finf['rez_type_new']))) { continue; } if ($value = trim($value)) { if (is_scalar($value)) { $value = stripslashes($value); $value = substr($value, 0, $finf['maxlength'] + ($rez_type == 2 ? 3 : 0)); } if ($rez_type == sbr::RT_RU && $field == 'full_name') { //У резидентов отслеживаем и убираем внешние кавычки, //аббревиатуры (ООО, ЗАО, ОАО, ИП, ПК), //внутренние кавычки не отслеживаем. $value = preg_replace('/\\b(ООО|ЗАО|ОАО|ИП|ПК)\\b/i', '', $value); $value = trim($value); $quotes = array('"' => '"', "'" => "'", '«' => '»'); foreach ($quotes as $start => $end) { if (substr($value, 0, 1) == $start) { if (substr($value, strlen($value) - 1) == $end) { $value = trim($value, $start . $end); } } } //$value = trim($value, '"\'«»'); } //var_dump($field); switch ($field) { case 'bank_rf_name': $bank_rf_city_key = 'bank_rf_city'; case 'bank_name': $bank_rf_city_key = !isset($bank_rf_city_key) ? 'bank_city' : $bank_rf_city_key; $parts = explode(',', $value); if (count($parts) == 2) { $request[$bank_rf_city_key] = trim($parts[1]); } else { $err = 'Поле заполнено некорректно.'; } break; case 'address': $save_iso = true; case 'address_reg': case 'address_fct': case 'address_jry': $parts = explode(',', $value); if (count($parts) > 3) { $index = trim($parts[0]); if (!preg_match('/[0-9]+/i', $index)) { $err = 'Поле заполнено некорректно. Укажите индекс.'; } else { $country_name = trim($parts[1]); $country_iso = $countryObject->getCountryISO($country_name); if (!$country_iso) { $err = 'Поле заполнено некорректно. Не найдена указанная страна.'; } elseif ($rez_type == sbr::RT_UABYKZ && $country_iso == country::ISO_RUSSIA) { $err = 'Так как вы нерезидент РФ, ваш адрес должен быть за пределами России.'; } elseif (isset($save_iso)) { $request['country_iso'] = $country_iso; $request['country'] = $country_name; $request['city'] = trim($parts[2]); $request['index'] = trim($parts[0]); } } } else { $err = 'Поле заполнено некорректно.'; } break; case 'fio': $symbols = $rez_type == sbr::RT_RU ? '/^[а-яА-ЯёЁ-]+$/i' : '/^[a-zA-Zа-яА-ЯёЁ-]+$/i'; $fio_parts = preg_split('/ /', $value); $fio_parts_count = 0; if ($fio_parts) { foreach ($fio_parts as $fio_part) { if (trim($fio_part) != '' && preg_match($symbols, $fio_part)) { $fio_parts_count++; } } } if ($fio_parts_count == 3) { break; } if ($fio_parts_count != 3 && $rez_type == sbr::RT_RU) { $err = 'Поле заполнено некорректно. Введите ФАМИЛИЮ, ИМЯ и ОТЧЕСТВО'; } if ($fio_parts_count != 2 && $rez_type == sbr::RT_UABYKZ) { $err = 'Поле заполнено некорректно. Введите ФАМИЛИЮ, ИМЯ'; } break; case 'idcard_to': $time = strtotime($value); if (!$time) { $err = 'Поле заполнено некорректно'; break; } $value = date('d.m.Y', $time); // дата окончания действия документа не должна быть меньше даты выдачи if ($time < strtotime($request['idcard_from'])) { $err = 'Дата окончания действия документа не может быть раньше даты выдачи'; } elseif ($time < time()) { // и меньше сегодняшней даты $err = 'Срок действия документа истек'; } break; case 'el_doc_from': case 'idcard_from': case 'reg_date': case 'birthday': $time = strtotime($value); if (!$time || $time > time() || $time <= strtotime('01.01.1910')) { $err = 'Поле заполнено некорректно'; } elseif ($field == 'birthday' && floor((time() - $time) / (60 * 60 * 24 * 365.25)) < 14) { $err = 'Вам должно быть не меньше 14 лет'; } else { $value = date('d.m.Y', $time); } break; case 'idcard_ser': if ($rez_type == sbr::RT_RU) { $regexp = is_crimea_people($request) ? '/^[a-zA-Zа-яА-Я0-9-]{1,30}$/' : '/^[0-9]{4}$/'; if (!preg_match($regexp, $value)) { $err = 'Поле заполнено некорректно'; } } if ($rez_type == sbr::RT_UABYKZ && !preg_match('/^[a-zA-Zа-яА-Я0-9-]{1,30}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'idcard': if ($rez_type == sbr::RT_RU && !preg_match('/^[0-9]{6}$/', $value)) { $err = 'Поле заполнено некорректно'; } if ($rez_type == sbr::RT_UABYKZ && !preg_match('/^[a-zA-Zа-яА-Я0-9-]{1,30}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'pss': if (!preg_match('/^[ 0-9_-]+$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'bank_rf_inn': case 'inn': if (!preg_match('/^[0-9]{10,12}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'kpp': if (!preg_match('/^[0-9]{9}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'okpo': if (!preg_match('/^(?:\\d{8,10})$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'ogrn': if (!(preg_match('/^[0-9]{13}$/', $value) || preg_match('/^[0-9]{15}$/', $value))) { $err = 'Поле заполнено некорректно'; } break; case 'okved': if (!preg_match('/^\\d\\d(?:\\.\\d|\\.\\d\\d(?:\\.\\d\\d?)?)?$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'el_doc_series': if (!preg_match('/^[a-zA-Zа-яА-Я0-9-\\/\\s]{1,6}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'el_doc_number': if (!preg_match('/^[a-zA-Zа-яА-Я0-9-\\/\\s]{1,10}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'bank_ks': case 'bank_rf_ks': if ($rez_type == sbr::RT_UABYKZ) { // кор счет банка должен начинаться на 30111810 для нерезидентов if (!preg_match('/^30111810[0-9]{12}$/', $value)) { $err = 'Корреспондентский счет должен начинаться с 30111810...'; } } break; case 'bank_rf_bik': if ($rez_type == sbr::RT_UABYKZ && !preg_match('/^044/', $value)) { $err = 'БИК уполномоченного банка должен начинаться с 044...'; } case 'bank_bik': case 'bank_kpp': if (!preg_match('/^[0-9]{9}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'bank_rs': if ($rez_type == sbr::RT_RU) { if (preg_match('/^[0-9]{20,40}$/', $value)) { // проверяем расчетный код по БИК // алгоритм https://beta.free-lance.ru/mantis/view.php?id=19983 $coef = "71371371371371371371371"; if (preg_match("/\\d{6}[0]{2}[012]/", $bik)) { $check = "0" . substr($bik, 4, 2) . $value; } else { $check = substr($bik, 6, 3) . $value; } $csum = 0; for ($i = 0; $i < strlen($check); $i++) { $csum += (int) $check[$i] * (int) $coef[$i] % 10; } if ($csum % 10 != 0) { $err = 'Расчетный счет или БИК указан неверно'; } if ($form_type == sbr::FT_PHYS && !preg_match('/^40817|42301/', $value)) { $err = 'Поле заполнено некорректно'; } elseif ($form_type == sbr::FT_JURI && !preg_match('/^40802|40807|407|406|405/', $value)) { $err = 'Поле заполнено некорректно'; } } else { $err = 'Поле заполнено некорректно'; } } else { if (strlen($value) > 40) { $err = 'Поле заполнено некорректно'; } } break; case 'bank_assignment': if (!preg_match('/^[0-9]{1,30}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'email': if (!is_email($value)) { $err = 'Поле заполнено некорректно'; } break; case 'el_yd': if (!preg_match('/^[\\d]{12,15}$/i', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'el_wmr': if (!preg_match('/^R[\\d]{12}$/i', $value)) { $err = 'Поле заполнено некорректно'; } else { $value = strtoupper($value); } break; case 'el_ccard': if (!preg_match('/^([\\d]{16}|[\\d]{18})$/i', $value)) { $err = 'Поле заполнено некорректно'; } break; case 'mob_phone': $value = str_replace(array('(', ')', ' ', '-'), '', $value); $_phone = intval(substr(str_replace('+', '', $value), 0, 1)); // валидация как в банке $validForBank = preg_match('/^[+]?7[0-9]{10}$/', $value) || preg_match('/^[+]?[^+7][0-9]{9,15}$/', $value); if ($validForBank) { $roleBit = is_emp($user->role) ? "B'100000'" : "B'000000'"; // один телефонный номер одновременно может быть привязан только к двум аккаунтам - один из них фрилансер, другой работодатель $c = $DB->val("\n SELECT \n COUNT(sr.*)\n FROM \n sbr_reqv sr\n INNER JOIN users u ON sr.user_id = u.uid\n WHERE \n (( regexp_replace(regexp_replace(regexp_replace(?, '[-\\s]', '', 'g'), '^8', '+7'), '^00', '+') =\n regexp_replace(regexp_replace(regexp_replace(sr._1_mob_phone, '[-\\s]', '', 'g'), '^8', '+7'), '^00', '+') )\n OR\n ( regexp_replace(regexp_replace(regexp_replace(?, '[-\\s]', '', 'g'), '^8', '+7'), '^00', '+') =\n regexp_replace(regexp_replace(regexp_replace(sr._2_mob_phone, '[-\\s]', '', 'g'), '^8', '+7'), '^00', '+') ))\n AND sr.user_id <> ?\n AND u.role = {$roleBit}\n ", $value, $value, $user_id); if ($c) { $err = 'Номер мобильного телефона уже сохранен в другом аккаунте, ' . 'обратитесь в <a href="https://feedback.fl.ru/" target="_blank">cлужбу поддержки</a>'; } } else { $err = 'Поле заполнено некорректно'; } $value = "+" . str_replace("+", "", trim($value)); break; case 'phone': if (!preg_match('/^[0-9-+]{8,20}$/', $value)) { $err = 'Поле заполнено некорректно'; } break; } } if ($err) { $error[$field] = $err; } // mob_phone записываем для обоих лиц $qvalue = $value ? "'" . pg_escape_string(change_q_x($value, true, false)) . "'" : 'NULL'; if ($field === 'mob_phone') { $sql_u .= ",_1_mob_phone = {$qvalue}, _2_mob_phone = {$qvalue}"; $sql_ic .= ",_1_mob_phone,_2_mob_phone"; $sql_iv .= ",{$qvalue},{$qvalue}"; } else { $qfield = "_{$form_type}_{$field}"; $sql_u .= ",{$qfield} = {$qvalue}"; $sql_ic .= ",{$qfield}"; $sql_iv .= ",{$qvalue}"; } } if ($error) { return $error; } $sql_i = "{$sql_i} ({$sql_ic}) VALUES ({$sql_iv})"; $sql_u = "{$sql_u} WHERE user_id = {$user_id}"; if (!($res = pg_query(self::connect(), $sql_u))) { return 'Ошибка'; } if (!pg_affected_rows($res)) { if (!($res = pg_query(self::connect(), $sql_i))) { return 'Ошибка'; } } return 0; }