public function process_event(&$event) { global $DB; $this->force_connect(); $r = false; switch ($event->type) { case 'ProjectPosted': $project_id = $event->data['id']; $this->log->notice('New project posted #id = ' . $project_id); $obj_project = new projects(); $project = $obj_project->GetPrjCust($project_id); // Не выбран испольнитель (если испольнитель выбран, то не пишем ответ на этот проект) if ($project && $project['exec_id'] == 0 && $project['kind'] == 1) { $autoresponses = autoresponse::getListForProject($project); foreach ($autoresponses as $autoresponse) { $freelancer = $autoresponse->data['freelancer']; $contacts_freelancer = $autoresponse->data['contacts_freelancer']; // Проверяем если проект только для про, то и пользователь который на него отвечает должен быть ПРО if ($project['pro_only'] == 't' && !payed::CheckPro($freelancer->login)) { continue; } // Проверяем если проект только для верифицированных, то и пользователь который на него отвечает должен быть верифицирован if ($project['verify_only'] == 't' && !$freelancer->IsVerified()) { continue; } // Проверка, что текущий пользователь не является владельцем проекта if ($project['user_id'] == $freelancer->uid) { continue; } // Добавление нового отзыва к проекту $obj_offer = new projects_offers(); $save_contacts = serialize($contacts_freelancer); $DB->start(); $error_offer = $obj_offer->AddOffer($freelancer->uid, $project['id'], '', '', '', '', '', '', antispam(stripslashes($autoresponse->data['descr'])), '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', $autoresponse->toBoolean($autoresponse->data['only_4_cust']), 0, 0, false, false, $save_contacts, 0, $autoresponse->data['id']); // В случае добавление автоответа, уменьшаем счетчик автоответов для пользователя (в транзакции) if ($error_offer || !$autoresponse->reduce($freelancer, $obj_offer, $project_id)) { $this->log->notice('Rollback autoresponse posted for project #id = ' . $project_id); $DB->rollback(); } else { $obj_project->incrementViews($project_id); $this->log->notice(sprintf('New autoresponse #%d posted for project #%d', $obj_offer->offer_id, $project_id)); $DB->commit(); } } } break; } return PGQ_EVENT_OK; }
/** * Сохранение предложения по проектам * * @param object $objResponse xajaxResponse * @param string $rec_id идентификатор записи * @param string $rec_type тип записи * @param array $aForm массив данных * @param string $sDrawFunc имя функции для выполнения после сохранения */ function _admEditPrjOfferSaveForm(&$objResponse, $rec_id = '', $rec_type = '', $aForm = array(), $sDrawFunc = '') { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/messages.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/user_content.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; $obj_offer = new projects_offers(); $payed_items = $aForm['ps_payed_items']; $payed_color = $aForm['ps_payed_items'][0] == '1'; if ($aForm['is_color'] && !$payed_color) { $account = new account(); $transaction_id = $account->start_transaction(get_uid()); $error_buy = $account->Buy($billing_id, $transaction_id, $answers->color_op_code, get_uid(), "Выделение ответа на проект цветом", "Выделение <a href='" . getFriendlyURL("project", $project['id']) . "#freelancer_{$_SESSION['uid']}' target='_blank'>предложения</a> цветом", 1, 1); $payed_items = '1'; if ($error_buy) { $aForm['is_color'] = false; $payed_items = '0'; } } $sReason = _parseReason($aForm['user_id'], $aForm['adm_edit_text']); $error = $obj_offer->AddOffer($aForm['user_id'], $aForm['pid'], $aForm['ps_cost_from'], $aForm['ps_cost_to'], $aForm['ps_cost_type'], $aForm['ps_time_from'], $aForm['ps_time_to'], $aForm['ps_time_type'], antispam(stripslashes($aForm['ps_text'])), $aForm['ps_work_1_id'], $aForm['ps_work_2_id'], $aForm['ps_work_3_id'], $aForm['ps_work_1_link'], $aForm['ps_work_2_link'], $aForm['ps_work_3_link'], $aForm['ps_work_1_name'], $aForm['ps_work_2_name'], $aForm['ps_work_3_name'], $aForm['ps_work_1_pict'], $aForm['ps_work_2_pict'], $aForm['ps_work_3_pict'], $aForm['ps_work_1_prev_pict'], $aForm['ps_work_2_prev_pict'], $aForm['ps_work_3_prev_pict'], isset($aForm['ps_for_customer_only']), $aForm['edit'], 0, isset($aForm['prefer_sbr']), $aForm['is_color'], null, $payed_items, 0, $_SESSION['uid'], $sReason); if (!$error && !$error_buy && !$payed_color && $account) { $account->commit_transaction($transaction_id, get_uid(), $billing_id); $is_payed_color = true; } if ($error) { $objResponse->alert('Ошибка сохранения предложения' . $error); $sParent = $sDrawFunc == 'stream0' || $sDrawFunc == 'stream1' || $sDrawFunc == 'stream2' ? 'parent.' : ''; $objResponse->script("{$sParent}adm_edit_content.disabled = false; {$sParent}adm_edit_content.button();"); } else { messages::prjOfferModifiedNotification($aForm['user_id'], $aForm['pid'], $sReason); $content_id = user_content::MODER_PRJ_OFFERS; _admEditAfterAll($objResponse, $content_id, $rec_id, $rec_type, $sDrawFunc, $aForm); } }
/** * Переносим ответы на проекты в работающие таблицы * * @param array $offers Ответы на проекты * @return array */ public function transferOffers($offers) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_offers.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/contest.php"; foreach ($offers as $k => $offer) { $pict1 = str_replace("sm_", "", $offer['pict1']); $pict2 = str_replace("sm_", "", $offer['pict2']); $pict3 = str_replace("sm_", "", $offer['pict3']); // Переносим файлы в рабочие папки сайта $files = $this->_db->rows("SELECT DISTINCT id FROM file_wizard WHERE fname IN (?l)", array($pict1, $pict2, $pict3)); if ($files) { $dir = "users/" . substr($this->user->login, 0, 2) . "/" . $this->user->login . "/upload/"; $table = 'file'; $picts = $this->transferFiles($files, $table, $dir, false); $sm_files = $this->_db->rows("SELECT DISTINCT id FROM file_wizard WHERE fname IN (?l)", array($offer['pict1'], $offer['pict2'], $offer['pict3'])); if ($sm_files) { $sm_picts = $this->transferFiles($sm_files, $table, $dir, false); } } if ($offer['kind'] != 7) { $error = projects_offers::AddOffer(wizard::getUserIDReg(), $offer['project_id'], $offer['cost_from'], $offer['cost_to'], $offer['cost_currency'], $offer['time_from'], $offer['time_to'], $offer['time_type'], $offer['descr'], 0, 0, 0, null, null, null, null, null, null, $picts[0]['fname'], $picts[1]['fname'], $picts[2]['fname'], $sm_picts[0]['fname'], $sm_picts[1]['fname'], $sm_picts[2]['fname']); } else { // Пишем ответ на конкурс $contest = new contest($offer['project_id'], wizard::getUserIDReg()); $error = $contest->CreateOffer($offer['descr'], implode('/', $files), false); if ($picts && $contest->new_oid) { $content_pict = array(); foreach ($picts as $k => $pict) { $content_pict[] = array('uid' => wizard::getUserIDReg(), 'file' => $pict['id'], 'prev' => $sm_picts[$k]['id'], 'orig_name' => $pict['orig_name'], 'post_date' => date('Y-m-d H:i:s')); } $contest->addOfferFiles($contest->new_oid, $content_pict); } } if (!$error) { $delete_offers[] = $offer['id']; } else { $error_offer[] = $error . " - ответ на проект #{$offer['id']}"; } unset($error); } // Очищаем перенесенные данные если нет ошибок если есть выводим if ($error_offer) { foreach ($error_offer as $error) { $this->log->writeln("Error transfer offer content - user (" . wizard::getUserIDReg() . "|" . $this->getWizardUserID() . ") - Error: {$error}"); } } else { if ($delete_offers) { $this->_db->query("DELETE FROM wizard_offers WHERE id IN (?l) AND wiz_uid = ?", $delete_offers, $this->getWizardUserID()); } } return $error_offer; }
Руководитель проекта <a href='http://www.dizkon.ru/?utm_source=flnwsldiz&utm_medium=email&utm_campaign=dizkonvsjob' >DizKon.ru</a><br /> <a href='mailto:maxim@dizkon.ru'>maxim@dizkon.ru</a><br /> "; // текст письма */ $mail->recipient = "{$employer->login} <" . $employer->email . ">"; // получатель $mail->send('text/html'); // отправляем письмо как plain/text } } if (!$is_edit && $is_personal) { //Добавляем ответ фрилансера //$message = 'Я получил' . ($sex == 'f' ? 'а' : '') . ' ваше предложение о проекте, в скором времени отвечу на него.'; $message = ''; $obj_offer = new projects_offers(); $obj_offer->AddOffer($freelancer->uid, $proj['id'], '', '', 2, '', '', 0, $message, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', false, 0, 1); $tmpPrj->SetExecutor($proj['id'], $freelancer->uid, $employer->uid); //Отправляем СМС Фрилансеру require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_sms.php"; ProjectsSms::model($freelancer->uid)->sendStatus(0, $proj['id'], 9); } if (hasPermissions("projects")) { $inspect_user_session = new session(); $inspect_user_session->UpdateProEndingDate($view_user_login); } if (!$is_edit) { $_SESSION['new_public'] = 1; } $drafts->DeleteDraft($draft_id, $uid, 1); if ($is_edit) { $back = $backLink ? $backLink : '/projects/' . $proj['id'];
if ($_POST['is_color']) { $account = new account(); $transaction_id = $account->start_transaction(get_uid()); $error_buy = $account->Buy($billing_id, $transaction_id, $answers->color_op_code, get_uid(), 'Выделение ответа на проект цветом', "Выделение <a href='" . getFriendlyURL('project', $project['id']) . "#freelancer_{$_SESSION['uid']}' target='_blank'>ответа на проект</a> цветом", 1, 1); $payed_items = '1'; if ($error_buy) { $_POST['is_color'] = false; $payed_items = '0'; } } if (isset($_POST['contacts'])) { $error_offer = users::validateContacts($_POST['contacts'], $contacts_freelancer); } if (!$error_offer) { $save_contacts = serialize($contacts_freelancer); $error_offer = $obj_offer->AddOffer($uid, $project['id'], $_POST['ps_cost_from'], $_POST['ps_cost_to'], $_POST['ps_cost_type'], $_POST['ps_time_from'], $_POST['ps_time_to'], $_POST['ps_time_type'], antispam(stripslashes($_POST['ps_text'])), $_POST['ps_work_1_id'], $_POST['ps_work_2_id'], $_POST['ps_work_3_id'], $_POST['ps_work_1_link'], $_POST['ps_work_2_link'], $_POST['ps_work_3_link'], $_POST['ps_work_1_name'], $_POST['ps_work_2_name'], $_POST['ps_work_3_name'], $_POST['ps_work_1_pict'], $_POST['ps_work_2_pict'], $_POST['ps_work_3_pict'], $_POST['ps_work_1_prev_pict'], $_POST['ps_work_2_prev_pict'], $_POST['ps_work_3_prev_pict'], isset($_POST['ps_for_customer_only']), 0, 0, isset($_POST['prefer_sbr']), $_POST['is_color'], $save_contacts, $payed_items); //Получаем новые данные о количестве ответов $answers->GetInfo($uid); $projectKindIdent = $projectObject->getKindIdent(); $obj_offer->sendStatistic($projectKindIdent, $answers->offers, $is_pro, $obj_offer->offer_id); require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/external/base.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/external/api/api.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/external/api/mobile.php'; externalApi_Mobile::addPushMsg($project['user_id'], 'prj_response', array('from_user_id' => get_uid(false), 'name' => $project['name'], 'prj_id' => $project['id'])); } $kind = $project['kind']; if (!$error_offer && !$error_buy && $_POST['is_color'] && $account) { $account->commit_transaction($transaction_id, get_uid(), $billing_id); $is_payed_color = true; } if ($is_payed_color) {
/** * Добавления предложения к проекту * * @param array $aParams массив входящих данных * @return array $aResult ответ */ protected function x____projects_response_add($aParams = array()) { $this->_validDevice($aParams); $sId = __paramValue('int', $aParams['project_id'], null, true); if (!empty($sId)) { require_once ABS_PATH . "/classes/projects.php"; $nUid = get_uid(false); $oPrj = new new_projects(); $aProject = $oPrj->GetPrjCust($sId); if (!empty($aProject)) { require_once ABS_PATH . '/classes/projects_offers.php'; if (projects_offers::offerSpecIsAllowed($sId)) { require_once ABS_PATH . '/classes/projects_offers_dialogue.php'; if ($aParams['term'] > 9999) { $this->error(EXTERNAL_ERR_SERVER_ERROR); } else { // TODO: все что с ps_ - по умолчанию $obj_offer = new projects_offers(); $error_offer = $obj_offer->AddOffer($nUid, $sId, $aParams['budget'], $aParams['ps_cost_to'], $aParams['currency'], $aParams['term'], $aParams['ps_time_to'], $aParams['term_dimension'], antispam(stripslashes(iconv('utf-8', 'cp1251', $aParams['comment']))), $aParams['ps_work_1_id'], $aParams['ps_work_2_id'], $aParams['ps_work_3_id'], $aParams['ps_work_1_link'], $aParams['ps_work_2_link'], $aParams['ps_work_3_link'], $aParams['ps_work_1_name'], $aParams['ps_work_2_name'], $aParams['ps_work_3_name'], $aParams['ps_work_1_pict'], $aParams['ps_work_2_pict'], $aParams['ps_work_3_pict'], $aParams['ps_work_1_prev_pict'], $aParams['ps_work_2_prev_pict'], $aParams['ps_work_3_prev_pict'], !empty($aParams['only_customer']), 0, 0, false, false, serialize(array()), '0'); } if ($error_offer) { $this->error(EXTERNAL_ERR_SERVER_ERROR); } $aOffer = $obj_offer->GetPrjOffer($sId, $nUid); $aResult = array('project_response' => $this->_getProjectOfferData($aOffer)); } else { $this->error(EXTERNAL_ERR_OFFER_SPEC); } } else { $this->error(EXTERNAL_ERR_PROJECT_NOT_FOUND); } } else { $this->error(EXTERNAL_ERR_EMPTY_PROJECT_ID); } return $aResult; }