예제 #1
0
 /**
  * Возвращает реквизиты заказчика из слепков
  * @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;
 }
예제 #2
0
 /**
  * Проверить доступность выплаты данному юзеру 
  * и вернуть его реквизиты
  * 
  * @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;
 }
예제 #3
0
 /**
  * Записать СБР-реквизиты пользователя (страница информации, вкладка "Финансы")
  *
  * @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;
 }