1150 lines
80 KiB
PHP
1150 lines
80 KiB
PHP
|
|
<?php
|
|||
|
|
require_once($_SERVER['DOCUMENT_ROOT']."/config.php");
|
|||
|
|
ini_set('display_errors', 1);
|
|||
|
|
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);
|
|||
|
|
|
|||
|
|
// закрываем доступ на выполнение запросов
|
|||
|
|
if (!isset($_SESSION['superadmin'])) {
|
|||
|
|
header("location:/index.php");
|
|||
|
|
die("Доступ запрещён!");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
require_once($_SERVER['DOCUMENT_ROOT'] . "/templates/header-admin.php");
|
|||
|
|
|
|||
|
|
$user = new User();
|
|||
|
|
$user->get($_SESSION['id']);
|
|||
|
|
|
|||
|
|
$agenciesHaveAccessToNewComplexes = [4,12028,12061, 17328, 11325, 13735, 19093, 16378, 19467, 20197, 19909, 19646];
|
|||
|
|
$menuPermissions = $user->checkMenuPermissions();
|
|||
|
|
|
|||
|
|
?>
|
|||
|
|
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
|
|||
|
|
<script src="/js/vue.min.js"></script>
|
|||
|
|
<script src="/js/vue-select.js"></script>
|
|||
|
|
<script type="text/javascript" src="/js/vue-multiselect.min.js"></script>
|
|||
|
|
<script type="text/javascript" src="/js/vue-simple-progress.min.js"></script>
|
|||
|
|
<link rel="stylesheet" href="/css/vue-multiselect.min.css">
|
|||
|
|
<link rel="stylesheet" href="/css/funnel.css?v=<?=filemtime($_SERVER['DOCUMENT_ROOT'].'/css/funnel.css')?>">
|
|||
|
|
<link rel="stylesheet" href="/css/all.min.css">
|
|||
|
|
|
|||
|
|
<input type="hidden" value="<?= $_SESSION['id']; ?>" id="session_user_id" />
|
|||
|
|
<input type="hidden" value="<?=$user->agency_id?>" id="session_agency_id" />
|
|||
|
|
|
|||
|
|
<style>
|
|||
|
|
.is_changing_status-enter-active {
|
|||
|
|
overflow: hidden;
|
|||
|
|
animation: allow_changing_status 0.25s;
|
|||
|
|
}
|
|||
|
|
.is_changing_status-leave-active {
|
|||
|
|
overflow: hidden;
|
|||
|
|
animation: allow_changing_status 0.25s reverse;
|
|||
|
|
}
|
|||
|
|
@keyframes allow_changing_status {
|
|||
|
|
from {
|
|||
|
|
height: 0;
|
|||
|
|
}
|
|||
|
|
to {
|
|||
|
|
height: 36px;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|
|||
|
|
|
|||
|
|
<div id="app_funnel" class="hidden">
|
|||
|
|
<div class="content-right">
|
|||
|
|
<div class="inner" style="padding: 0px 0px 0px 170px;">
|
|||
|
|
<div class="main-title">
|
|||
|
|
<input type="hidden" value="<?=$user->agencyId?>" id="agency_id"/>
|
|||
|
|
<input type="hidden" value="<?=$_SESSION['users_admin']?>" id="session_user_admin"/>
|
|||
|
|
<input type="hidden" value="<?=$_SESSION['to_send']?>" id="session_to_send"/>
|
|||
|
|
<h1>Настройка воронок продаж</h1>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="crm new">
|
|||
|
|
<div class="crm__filters">
|
|||
|
|
<div class="crm__filters-inner">
|
|||
|
|
|
|||
|
|
<div class="crm__new-client" style="height: 55px">
|
|||
|
|
<button class="jw__g-button add_funnel_new" @click="openAddFunnel();">Добавить воронку</button>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
<div id="funnel_list">
|
|||
|
|
<div class="clients">
|
|||
|
|
<div class="client" v-for='(funnel,index) in funnels' >
|
|||
|
|
<div class="client-inner">
|
|||
|
|
|
|||
|
|
<svg style="position: absolute;" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
|
|||
|
|
<defs>
|
|||
|
|
<marker :id="'arrowhead'+funnel.id" viewBox="0 0 10 10" refX="3" refY="5"
|
|||
|
|
markerWidth="6" markerHeight="6" orient="auto">
|
|||
|
|
<path d="M 0 0 L 10 5 L 0 10 z" />
|
|||
|
|
</marker>
|
|||
|
|
</defs>
|
|||
|
|
<g :id="'svg_path'+funnel.id" fill="none" stroke="black" stroke-width="1" :marker-end="'url(#arrowhead'+funnel.id+')'">
|
|||
|
|
<path v-for="(line, lineId) in svgPath[funnel.id]" :id="line.id" />
|
|||
|
|
</g>
|
|||
|
|
</svg>
|
|||
|
|
<div class="additional-info">
|
|||
|
|
<div v-if="funnel.id>0" class="date" >{{ funnel.date }}</div>
|
|||
|
|
<div class="type">{{ funnel.name }}</div>
|
|||
|
|
|
|||
|
|
<div v-if="funnel.id == 0" class="stagebar">
|
|||
|
|
<div class="crm__small-stagebar">
|
|||
|
|
<table>
|
|||
|
|
<tbody>
|
|||
|
|
<tr>
|
|||
|
|
<td class="stage stage-new active" title="Новый клиент">
|
|||
|
|
<div data-stage="1" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">Новый</span>
|
|||
|
|
</td>
|
|||
|
|
<td class="stage stage-work active" title="В работе">
|
|||
|
|
<div data-stage="2" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">В работе</span>
|
|||
|
|
</td>
|
|||
|
|
<td class="stage stage-offer active" title="Презентация">
|
|||
|
|
<div data-stage="3" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">Презентация</span>
|
|||
|
|
</td>
|
|||
|
|
<td class="stage stage-showing active" title="Показ">
|
|||
|
|
<div data-stage="4" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">Показ</span>
|
|||
|
|
</td>
|
|||
|
|
<td class="stage stage-reservation active" title="Бронь">
|
|||
|
|
<div data-stage="5" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">Бронь</span>
|
|||
|
|
</td>
|
|||
|
|
<td class="stage stage-meet active" title="Подаем на ипотеку">
|
|||
|
|
<div data-stage="6" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">Подаем на ипотеку</span>
|
|||
|
|
</td>
|
|||
|
|
<td class="stage stage-deal active" title="Сделка">
|
|||
|
|
<div data-stage="7" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">Сделка</span>
|
|||
|
|
</td>
|
|||
|
|
<td class="stage stage-end active" title="Клиент закрыт">
|
|||
|
|
<div data-stage="8" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">Закрыт</span>
|
|||
|
|
</td>
|
|||
|
|
</tr>
|
|||
|
|
</tbody>
|
|||
|
|
</table>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div v-else-if="funnel.id > 0" class="stagebar">
|
|||
|
|
<div class="crm__small-stagebar">
|
|||
|
|
<table>
|
|||
|
|
<tbody>
|
|||
|
|
<tr>
|
|||
|
|
<td v-for="(step, stepId) in funnel.steps" class="stage stage-new active" :title="step.name">
|
|||
|
|
<div data-stage="1" class="crm__small-stage"></div>
|
|||
|
|
<span class="next-stage">{{ step.name }}</span>
|
|||
|
|
</td>
|
|||
|
|
</tr>
|
|||
|
|
</tbody>
|
|||
|
|
</table>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="stagebar-title"></div>
|
|||
|
|
<div v-if="funnel.id > 0" class="type"><span v-for="(roleuser, index) in JSON.parse(funnel.role)">{{ roleuser.name }} </span></div>
|
|||
|
|
<div v-if="funnel.id > 0" class="type"><span v-for="(client_typeuser, index) in JSON.parse(funnel.client_type)">{{ client_typeuser.name }} </span></div>
|
|||
|
|
<div class="actions">
|
|||
|
|
<a href="javascript:{};" class="no-border" @click="updateFunnel(index, funnel.id)" title="Редактировать">
|
|||
|
|
<span class="simple-button settings"><i class="jw-action-icon-settings"></i></span>
|
|||
|
|
</a>
|
|||
|
|
<a href="javascript:{};" v-if="funnel.id > 0" @click="deleteFunnel(index, funnel.id)" class="no-border" title="Удалить">
|
|||
|
|
<span class="simple-button delete"><i class="jw-action-icon-delete"></i></span>
|
|||
|
|
</a>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="main-info additional-info">
|
|||
|
|
<div>
|
|||
|
|
<span style="margin-right: 15px;" v-if="funnel.is_client == 1">Для клиентов</span>
|
|||
|
|
<span style="margin-right: 15px;" v-if="funnel.is_req == 1">Для заявок</span>
|
|||
|
|
<span style="margin-right: 15px;" v-html="'Номер в очереди: '+funnel.order_number"></span>
|
|||
|
|
<template v-show="funnel.id == 0">
|
|||
|
|
<span style="margin-right: 15px;" v-if="funnel.is_stage == 1">Показывать шкалу</span>
|
|||
|
|
<span style="margin-right: 15px;" v-else-if="funnel.is_stage == 0">Не показывать шкалу</span>
|
|||
|
|
<span style="margin-right: 15px;" v-if="funnel.is_show_funnels == 1">Показывать воронки</span>
|
|||
|
|
<span style="margin-right: 15px;" v-else-if="funnel.is_show_funnels == 0">Не показывать воронки</span>
|
|||
|
|
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div v-if="funnel.id > 0" class="main-info">
|
|||
|
|
<div v-if="funnel.mainsteps" class="first_step">
|
|||
|
|
<div class="stagebar-title">Первый этап</div>
|
|||
|
|
<multiselect v-model="funnel.mainstep" @select="changeFirstStep" tag-placeholder="Добавьте значение" track-by="name" label="name" placeholder="" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" :options="funnel.mainsteps" :searchable="false" :show-labels="false">
|
|||
|
|
<template slot="singleLabel" slot-scope="{ option }"><strong>{{ option.name }}</strong></template>
|
|||
|
|
</multiselect>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
<div class="stagebar-title">Схема этапов</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
<div v-for="(branch, branchId) in funnel.branchs" class="row_step_block">
|
|||
|
|
<div class="step_block" v-for="(step, stepId) in branch">
|
|||
|
|
<div :id="'step'+stepId">
|
|||
|
|
<a @click="onUpdateStepFunnel(stepId, index, funnel.id)" href="javascript:{}" v-html="step.name_number"></a>
|
|||
|
|
<a @click="deleteStep(stepId)" class="fatrash" title="Удалить" href="javascript:{}"><i class="fas fa-trash"></i></a>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div v-if="funnel.id > 0" class="main-info">
|
|||
|
|
|
|||
|
|
<div class="col">
|
|||
|
|
<div class="jw__action-button">
|
|||
|
|
<div class="jw__g-button client-events-new" @click="onUpdateStepFunnel(-1, index, funnel.id)">Новый этап</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<!-- <div class="client-added">
|
|||
|
|
<div class="client-added__by">Добавил Агентство Тестовая учетка Ирина <span>06.04.2019</span></div>
|
|||
|
|
<div class="client-added__work">В работе у менеджер ва <span> c 21.06.2019 13:59</span></div>
|
|||
|
|
|
|||
|
|
</div>-->
|
|||
|
|
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="full_modal-bg" v-if="addFunelmodal" id="addFunnelNew">
|
|||
|
|
<span class="pseudo-link closer"><i class="ti-close" @click="addFunelmodal = false"></i></span>
|
|||
|
|
<div class="full_modal edit-modal new-client__modal" id="addFunnel">
|
|||
|
|
<form class="form-validate" method="post" id="addEditFunnel">
|
|||
|
|
<div class="modal-inner">
|
|||
|
|
<div v-if="mes_error" class="error_msg">{{ error }}</div>
|
|||
|
|
<h2>Новая воронка</h2>
|
|||
|
|
<div class="jv-tabs">
|
|||
|
|
<div>
|
|||
|
|
<div class="tabs__content">
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Наименование</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
|
|||
|
|
<input v-model.trim="name" @input="mes_error = false" type="text" class="text" name="name" style="width:400px;" value="">
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Тип клиента</div>
|
|||
|
|
<div id="ms-funnel-type" class="inputs">
|
|||
|
|
<multiselect v-model="ctype" tag-placeholder="Добавьте значение" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" no-result="Не найдено" placeholder="" label="name" track-by="code" :options="clientstypes" :multiple="true" :close-on-select="false" :clear-on-select="false" :searchable="false">
|
|||
|
|
<span slot="noResult">Ничего не найдено</span>
|
|||
|
|
</multiselect>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Роль клиента</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<multiselect v-model="role" tag-placeholder="Добавьте значение" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" placeholder="" label="name" track-by="code" :options="options_role" :multiple="true" :close-on-select="false" :clear-on-select="false" :searchable="false">
|
|||
|
|
<span slot="noResult">Ничего не найдено</span>
|
|||
|
|
</multiselect>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="checkbox small" style="margin-bottom:0px;">
|
|||
|
|
<input type="checkbox" id="funnel-is_client" v-model="is_client" :checked="Boolean(is_client)" true-value="1">
|
|||
|
|
<label for="funnel-is_client">Для клиентов</label>
|
|||
|
|
|
|||
|
|
<input type="checkbox" id="funnel-is_req" v-model="is_req" :checked="Boolean(is_req)" true-value="1">
|
|||
|
|
<label style="margin-left: 160px;" style="marning-" for="funnel-is_req">Для заявок</label>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="checkbox small" style="margin-bottom:0px;">
|
|||
|
|
<input type="checkbox" id="funnel-is_agent" v-model="is_agent" :checked="Boolean(is_agent)" true-value="1">
|
|||
|
|
<label for="funnel-is_agent">Для агента</label>
|
|||
|
|
|
|||
|
|
<input type="checkbox" id="funnel-is_agency" v-model="is_agency" :checked="Boolean(is_agency)" true-value="1">
|
|||
|
|
<label style="margin-left: 160px;" for="funnel-is_agency">Для агентства</label>
|
|||
|
|
|
|||
|
|
<input type="checkbox" id="funnel-is_dev" v-model="is_dev" :checked="Boolean(is_dev)" true-value="1">
|
|||
|
|
<label style="margin-left: 350px;" for="funnel-is_dev">Для застройщика</label>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="modal-submit">
|
|||
|
|
<button type="button" @click='addFunnel();' class="action_call">Добавить</button>
|
|||
|
|
</div>
|
|||
|
|
</form>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="full_modal-bg" v-if="updateFunnelmodal">
|
|||
|
|
<span class="pseudo-link closer"><i class="ti-close" @click="updateFunnelmodal = false"></i></span>
|
|||
|
|
<div class="full_modal edit-modal new-client__modal" style="max-width: 650px">
|
|||
|
|
<form class="form-validate" method="post">
|
|||
|
|
<div class="modal-inner">
|
|||
|
|
<div v-if="mes_error_update" class="error_msg" v-html="errorUpdate"></div>
|
|||
|
|
<h2>{{ nameUpdate }}</h2>
|
|||
|
|
<div class="jv-tabs">
|
|||
|
|
<div>
|
|||
|
|
<div class="tabs__content">
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Наименование</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
|
|||
|
|
<input v-model.trim="name_update" @input="mes_error_update = false" type="text" class="text" style="width:400px;">
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div v-if="funnelId > 0" class="form-block">
|
|||
|
|
<div class="label">Тип клиента</div>
|
|||
|
|
<div id="ms-funnel-type" class="inputs">
|
|||
|
|
<multiselect v-model="ctype_update" tag-placeholder="Добавьте значение" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" no-result="Не найдено" placeholder="" label="name" track-by="code" :options="clientstypes" :multiple="true" :close-on-select="false" :clear-on-select="false" :searchable="false">
|
|||
|
|
<span slot="noResult">Ничего не найдено</span>
|
|||
|
|
</multiselect>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
<div v-if="funnelId > 0" class="form-block">
|
|||
|
|
<div class="label">Роль клиента</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<multiselect v-model="role_update" tag-placeholder="Добавьте значение" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" placeholder="" label="name" track-by="code" :options="options_role" :multiple="true" :close-on-select="false" :clear-on-select="false" :searchable="false">
|
|||
|
|
<span slot="noResult">Ничего не найдено</span>
|
|||
|
|
</multiselect>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="checkbox small" style="margin-bottom:0px;">
|
|||
|
|
<input type="checkbox" id="funnel-is_client" v-model="is_client" :checked="Boolean(is_client)" true-value="1">
|
|||
|
|
<label for="funnel-is_client">Для клиентов</label>
|
|||
|
|
|
|||
|
|
<input type="checkbox" id="funnel-is_req" v-model="is_req" :checked="Boolean(is_req)" true-value="1">
|
|||
|
|
<label style="margin-left: 160px;" style="marning-" for="funnel-is_req">Для заявок</label>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="checkbox small" style="margin-bottom:0px;">
|
|||
|
|
<input type="checkbox" id="funnel-is_agent" v-model="is_agent" :checked="Boolean(is_agent)" true-value="1">
|
|||
|
|
<label for="funnel-is_agent">Для агента</label>
|
|||
|
|
|
|||
|
|
<input type="checkbox" id="funnel-is_agency" v-model="is_agency" :checked="Boolean(is_agency)" true-value="1">
|
|||
|
|
<label style="margin-left: 160px;" for="funnel-is_agency">Для агентства</label>
|
|||
|
|
|
|||
|
|
<input type="checkbox" id="funnel-is_dev" v-model="is_dev" :checked="Boolean(is_dev)" true-value="1">
|
|||
|
|
<label style="margin-left: 350px;" for="funnel-is_dev">Для застройщика</label>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div v-if="funnelId == 0" class="form-block">
|
|||
|
|
<div class="checkbox small" style="margin-bottom:0px;">
|
|||
|
|
<input type="checkbox" id="funnel-is_stage" v-model="is_stage" :checked="Boolean(is_stage)" true-value="1">
|
|||
|
|
<label for="funnel-is_stage">Показывать шкалу</label>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div v-if="funnelId == 0" class="form-block">
|
|||
|
|
|
|||
|
|
<div class="checkbox small" style="margin-bottom:0px;">
|
|||
|
|
|
|||
|
|
<input type="checkbox" id="funnel-is_show_funnels" v-model="is_show_funnels" :checked="Boolean(is_show_funnels)" true-value="1">
|
|||
|
|
<label for="funnel-is_show_funnels">Показывать воронки</label>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Номер в очереди</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
|
|||
|
|
<input v-model.trim="order_number_funnel" type="number" class="text" style="width:400px;">
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<!--<div v-if="funnelId > 0" class="form-block">
|
|||
|
|
|
|||
|
|
<div class="checkbox small" style="margin-bottom:0px;">
|
|||
|
|
|
|||
|
|
<input type="checkbox" id="funnel-is_no_see" v-model="is_no_see" false-value="0" true-value="1">
|
|||
|
|
<label for="funnel-is_no_see">Не показывать воронку всем</label>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block" v-show="funnelId > 0 && is_no_see == 1">
|
|||
|
|
<div class="label">...кроме сотрудников</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<v-select class="vue_select" :components="{OpenIndicator}" style="width: 400px; border: none;" multiple :options="users_see" :reduce="name => name.code" label="name" v-model="selected_users_see_no"/>
|
|||
|
|
<template #option="{ name, type }">
|
|||
|
|
<span v-if="type=='otdel'" style="margin: 0; color:#000; font-size: 17px">{{ name }}</span>
|
|||
|
|
<span v-else style="margin-left:10px;">{{ name }}</span>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<v-select>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>-->
|
|||
|
|
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="modal-submit">
|
|||
|
|
<button type="button" @click='updateRowFunnel();' class="action_call">Изменить</button>
|
|||
|
|
</div>
|
|||
|
|
</form>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="full_modal-bg" v-if="transmitFunnelmodal">
|
|||
|
|
<span class="pseudo-link closer"><i class="ti-close" @click="transmitFunnelmodal = false"></i></span>
|
|||
|
|
<div class="full_modal edit-modal new-client__modal" style="max-width: 650px">
|
|||
|
|
|
|||
|
|
<div class="form-validate">
|
|||
|
|
<div class="modal-inner">
|
|||
|
|
<div v-if="errorTransmite" class="error_msg" v-html="mesErrorTransmite"></div>
|
|||
|
|
<h2>Передать {{type_trasmite}} в воронку</h2>
|
|||
|
|
<div v-show="process_trasmited" style="display: inline;">
|
|||
|
|
|
|||
|
|
<div style="text-align:center; margin-top: 25px; position: unset;" class="object-content__preloader">
|
|||
|
|
<img src="../images/rocket-spinner.svg" width="96px">
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div v-show="!process_trasmited" class="jv-tabs">
|
|||
|
|
<div>
|
|||
|
|
<div class="tabs__content">
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Воронка</div>
|
|||
|
|
<div id="ms-funnel-type" class="inputs">
|
|||
|
|
<v-select :components="{OpenIndicator}" transition="" class="vue_select" :class="{invalid: errorTransmite}" style="width: 400px; border: none;" :options="funnel_transmite" :reduce="name => name.id" label="name" v-model="funnelTrasmiteId"/>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="modal-submit">
|
|||
|
|
<button type="button" @click="transmite" class="action_call">Передать</button></button>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="full_modal-bg" v-if="updateStepFunnel">
|
|||
|
|
<span class="pseudo-link closer"><i class="ti-close" @click="updateStepFunnel = false"></i></span>
|
|||
|
|
<div class="full_modal edit-modal new-client__modal">
|
|||
|
|
<form class="form-validate" method="post">
|
|||
|
|
<div class="modal-inner">
|
|||
|
|
<div v-if="mes_error_step" class="error_msg"></div>
|
|||
|
|
<div v-if="errorPole" class="error_msg" v-html="textError"></div>
|
|||
|
|
<h2>Настройка этапа</h2>
|
|||
|
|
<div class="jw-tabs">
|
|||
|
|
<ul class="tabs__caption">
|
|||
|
|
<li :class="{'active':tab_close }" @click="open_tab('tab_close')">
|
|||
|
|
<i class="tabs-li__icon">1</i>
|
|||
|
|
<span>Настройки для закрытия этапа</span>
|
|||
|
|
</li>
|
|||
|
|
<li :class="{'active':tab_prev_close }" @click="open_tab('tab_prev_close')">
|
|||
|
|
<i class="tabs-li__icon">2</i>
|
|||
|
|
<span>Настройки перед переходом на этап</span>
|
|||
|
|
</li>
|
|||
|
|
<!-- <li :class="{'active':tab_dop_close }" @click="open_tab('tab_dop_close')" v-if="userId == 5238 || userId == 4">
|
|||
|
|
<i class="tabs-li__icon">3</i>
|
|||
|
|
<span>Дополнительные настройки</span>
|
|||
|
|
</li>-->
|
|||
|
|
|
|||
|
|
</ul>
|
|||
|
|
<div>
|
|||
|
|
<div class="tabs__content" v-show="tab_close">
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Наименование</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<input v-model.trim="name_step" @input="mes_error_step = false" class="text" type="text" style="width:400px;">
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Номер в очереди</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<input v-if="mainStep>0" v-model.number="order_number" disabled="disabled" title="Нельзя изменить в первом этапе" class="text" type="number" value="" placeholder="Определяет место в шкале этапов" style="width:100px;">
|
|||
|
|
<input v-else v-model.number="order_number" class="text" type="number" value="" placeholder="Определяет место в шкале этапов" style="width:100px;">
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Цвет</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<input v-model.trim="color_step" @input="mes_error_step = false" class="text" type="color" value="#43A047" style="width:40px;height:40px;">
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Дней на этап</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<input v-model.number="days_step" @input="mes_error_step = false" class="text" type="number" value="0" style="width:400px;">
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Перенести в Общие, если срок будет исчерпан</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="is_move_end_srok" v-model="is_move_end_srok" true-value="1" false-value="0" type="checkbox">
|
|||
|
|
<label for="is_move_end_srok" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block" v-show="is_move_end_srok > 0">
|
|||
|
|
<div class="label">Условия переноса в общие</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="task_is_move" v-model="tasks_move.is_move" true-value="1" false-value="0" @change="selet_task_move" type="checkbox">
|
|||
|
|
<label for="task_is_move" style="width:400px;" class="label">Просрочили срок действия Этапа</label>
|
|||
|
|
</div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="task_is_task" v-model="tasks_move.is_task" true-value="1" false-value="0" @change="selet_task_task" type="checkbox">
|
|||
|
|
<label for="task_is_task" style="width:400px;" class="label">Не поставлено ни одной задачи на будущее</label>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">При переходе на этап сменить статус на</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<multiselect v-model="stage" tag-placeholder="Добавьте значение" placeholder="" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" :options="stages" :searchable="false" :show-labels="false">
|
|||
|
|
|
|||
|
|
</multiselect>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Уведомлять о закрытии</div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="mes_close" v-model="is_mes" @input="selectMes" type="checkbox" value="">
|
|||
|
|
<label for="mes_close" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block" v-show="is_mes">
|
|||
|
|
<div class="label">Кому отправлять уведомления</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<v-select multiple class="vue_select" :components="{OpenIndicator}" style="width: 400px; border: none;" :options="list_users" :reduce="date_employe => date_employe.code" label="date_employe" v-model="list_users_select"/>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block" v-if="selectedFiles.length > 0">
|
|||
|
|
<div class="label">Список файлов</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<div class="list_files" v-for="(file, infile) in selectedFiles">
|
|||
|
|
<label class="label_file"><i v-bind:class=" [ file.classFile, {active: progressUoload[infile].isUpload} ]"></i>{{ file.name }}</label>
|
|||
|
|
<a title="Загрузить" v-bind:class="{ hidden : progressUoload[infile].isUpload}" @click="onUpload(infile, file)" class="no-border faupload"><i class="fas fa-upload"></i></a>
|
|||
|
|
<a title="Удалить" @click="onDeleteFile(infile,file)" class="no-border fatrash"><i class="fas fa-trash"></i></a>
|
|||
|
|
<vue-simple-progress v-if="progressUoload[infile].uploads" bar-color="#e2574c" :val="progressUoload[infile].progress" :text="progressUoload[infile].progress + '%'"></vue-simple-progress>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Файлы для скачивания</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<div class="dropbox">
|
|||
|
|
<input type="file" @change="onFileSelected" multiple="" class="input-file" style="width:400px;">
|
|||
|
|
<p>
|
|||
|
|
Выберите файл(ы)
|
|||
|
|
</p>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Исполнитель</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<ul class="doer_funnel">
|
|||
|
|
<template v-for = "(doer, doerId) in doers">
|
|||
|
|
<li><a @click="seeDoer(doerId)" href="javascript:{}"><i class="fas fa-users"></i></a></li>
|
|||
|
|
<li v-if="doer.isSee"><a title="Весь отдел" @click="selectDoer(doerId, doer.manager.id, 'all')" href="javascript:{}"><i class="far fa-building"></i></a></li>
|
|||
|
|
|
|||
|
|
<li v-if="doer.isSee"><a :title="doer.manager.role + ' ' + doer.manager.fio" @click="selectDoer(doerId, doer.manager.id, 'manager')" href="javascript:{}"><i class="fas fa-user-tie"></i></a></li>
|
|||
|
|
<li v-if="doer.agents.length > 0 && doer.isSee" v-for="(agent, agentId) in doer.agents"><a :title="agent.role + ' ' + agent.fio" @click="selectDoer(doerId, agentId, 'agent')" href="javascript:{}"><i class="fas fa-user"></i></a></li>
|
|||
|
|
</template>
|
|||
|
|
</ul>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div v-if="listDoers.length>0" class="form-block">
|
|||
|
|
<div class="label">Список исполнитель</div>
|
|||
|
|
<ul class="list_doer_funnel">
|
|||
|
|
<li v-for="(listDoer, listDoerId) in listDoers">{{ listDoer.fio }}<i @click="deleteDoer(listDoerId)" title="Удалить исполнителя" class="fas fa-user-minus"></i></li>
|
|||
|
|
</ul>
|
|||
|
|
</div>
|
|||
|
|
<?php
|
|||
|
|
if (
|
|||
|
|
(
|
|||
|
|
!empty($menuPermissions) && $menuPermissions['menu_complexes'] == 1
|
|||
|
|
)
|
|||
|
|
||
|
|||
|
|
(
|
|||
|
|
(
|
|||
|
|
$_SESSION['agency'] || $_SESSION['users_admin'] || (!empty($menuPermissions) && $menuPermissions['menu_complexes'] == 1)
|
|||
|
|
)
|
|||
|
|
&& (
|
|||
|
|
in_array($_SESSION['agency_id'] , $agenciesHaveAccessToNewComplexes)
|
|||
|
|
)
|
|||
|
|
)
|
|||
|
|
) {
|
|||
|
|
?>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Выбрать объект из комплексов</div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="is_select_room" v-model="is_select_room" type="checkbox">
|
|||
|
|
<label for="is_select_room" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<?php } ?>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Поля для заполнения в заявке или клиенте</div>
|
|||
|
|
<div class="inputs" style="padding-top:15px;">
|
|||
|
|
<a class="green_button" onclick="linking_client_req.open(app.stepId)" type="button" href="javascript:{}">Выбрать поля</a>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<?php
|
|||
|
|
if (
|
|||
|
|
(
|
|||
|
|
!empty($menuPermissions) && $menuPermissions['menu_complexes'] == 1
|
|||
|
|
)
|
|||
|
|
||
|
|||
|
|
(
|
|||
|
|
(
|
|||
|
|
$_SESSION['agency'] || $_SESSION['users_admin'] || (!empty($menuPermissions) && $menuPermissions['menu_complexes'] == 1)
|
|||
|
|
)
|
|||
|
|
&& (
|
|||
|
|
in_array($_SESSION['agency_id'] , $agenciesHaveAccessToNewComplexes)
|
|||
|
|
)
|
|||
|
|
)
|
|||
|
|
) {
|
|||
|
|
?>
|
|||
|
|
<div class="form-block" style="display: flex;">
|
|||
|
|
<div class="label">Сменить статус объекта</div>
|
|||
|
|
<div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="is_changing_status" name="is_changing_status" v-model="is_changing_status" type="checkbox">
|
|||
|
|
<label for="is_changing_status" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
<Transition name="is_changing_status">
|
|||
|
|
<div v-show="is_changing_status" id="status" class="changing_status_block">
|
|||
|
|
<div class="inputs" id="ms-req-status-input">
|
|||
|
|
<img src="../images/rocket-spinner.svg" width="45px">
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</Transition>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<?php } ?>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Поля для заполнения при завершении этапа</div>
|
|||
|
|
<div class="inputs" style="padding-top:15px;">
|
|||
|
|
<a class="green_button" @click="addPole" type="button" href="javascript:{}">Добавить поле</a>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block" v-if="poleEndlist.length > 0">
|
|||
|
|
<div class="label">Список полей</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<ul class="pole_end_etap">
|
|||
|
|
<li class="pole_li" v-for="(poleEnd, poleEndId) in poleEndlist">
|
|||
|
|
<div class="divLiLeft">
|
|||
|
|
<label>Название</label>
|
|||
|
|
<input v-model="poleEnd.name" type="text" value=""/>
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft">
|
|||
|
|
<label>Тип</label>
|
|||
|
|
<multiselect :id="poleEndId" v-model="poleEnd.type" @select="chengePoleSelect" tag-placeholder="Добавьте значение" placeholder="" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" :options="poleType" :searchable="false" :show-labels="false">
|
|||
|
|
|
|||
|
|
</multiselect>
|
|||
|
|
</div>
|
|||
|
|
<div class="pole_checkbox divLiLeft">
|
|||
|
|
<label title="Обязательное заполнение"><i class="fab fa-diaspora"></i></label>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input v-model="poleEnd.binding" :id="'binding_pole'+poleEndId" type="checkbox" value="">
|
|||
|
|
<label :for="'binding_pole'+poleEndId" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft">
|
|||
|
|
<a title="Удалить" @click="deletePole(poleEndId)" class="no-border fatrash"><i class="fas fa-trash"></i></a>
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft" v-if="poleEnd.dopSettings.radio">
|
|||
|
|
<label>Переключатель 1</label>
|
|||
|
|
<input v-model="poleEnd.dopSettings.radio.pole1" type="text" value="">
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft" v-if="poleEnd.dopSettings.radio">
|
|||
|
|
<label>Переключатель 2</label>
|
|||
|
|
<input v-model="poleEnd.dopSettings.radio.pole2" type="text" value="">
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
<div v-if="poleEnd.dopSettings.select" class="dop_settings divLiLeft">
|
|||
|
|
<div>
|
|||
|
|
<label style="width:350px">Значения списка
|
|||
|
|
|
|||
|
|
</label>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
<ul class="pole_select_value">
|
|||
|
|
<template v-if="polesOptionsSetting.length > 0 && poleEndlist.length >0" v-for="(option, optionId) in poleEnd.dopSettings.select.options">
|
|||
|
|
<li v-if="polesOptionsSetting[optionId].isDiv">
|
|||
|
|
<div>{{ option }}</div>
|
|||
|
|
<a title="Изменить значение" @click="editOption(optionId)" class="faplus" href="javascript:{}"><i class="fas fa-pencil-alt"></i></a>
|
|||
|
|
<a @click="deleteOption(poleEndId, optionId)" class="fatrash"><i title="Удалить значение" class="fas fa-trash"></i></a>
|
|||
|
|
</li>
|
|||
|
|
<li v-if="polesOptionsSetting[optionId].isEdit">
|
|||
|
|
<input :value="option" @input="validPole($event.target.value, optionId)" :id="'pole_select_value_'+optionId" type="text"/>
|
|||
|
|
<a @click="saveEditOption(poleEndId, optionId)" class="faplus" href="javascript:{}" title="Сохранить"><i class="fas fa-check"></i></a>
|
|||
|
|
</li>
|
|||
|
|
</template>
|
|||
|
|
<li v-if="isInput">
|
|||
|
|
<input v-model="pole_select_value" type="text"/>
|
|||
|
|
<a @click="setOption(poleEndId)" class="faplus" href="javascript:{}" title="Сохранить"><i class="fas fa-check"></i></a>
|
|||
|
|
|
|||
|
|
</li>
|
|||
|
|
<li class="liPlus"><a class="faplus" href="javascript:{}" title="Добавить значение" @click="isInput = true"><i class="fas fa-plus"></i></a></li>
|
|||
|
|
</ul>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</li>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</ul>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Следующий этап</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<div class="selects_next_step">
|
|||
|
|
<multiselect v-bind:class="[onePole ? '' : 'activeOne']" v-model="nextStepChange" @select="changeNextStep" :allow-empty="false" tag-placeholder="Добавьте значение" placeholder="" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" :options="next_step" :searchable="false" :show-labels="false">
|
|||
|
|
</multiselect>
|
|||
|
|
<multiselect v-if="onePole" v-model="nextStep" tag-placeholder="Добавьте значение" track-by="name" label="name" placeholder="" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" :options="listSteps" :searchable="false" :show-labels="false">
|
|||
|
|
<template slot="singleLabel" slot-scope="{ option }"><strong>{{ option.name }}</strong></template>
|
|||
|
|
</multiselect>
|
|||
|
|
<a title="Сбросить" @click="resetNextStep" class="no-border fatrash"><i class="fas fa-undo-alt"></i></a>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
<ul class="optionsNextStep">
|
|||
|
|
<li v-for="(nextOption, nextOptionId) in arrNextSteps">
|
|||
|
|
<label>{{ poleEndlist[poleListIndex].name }} «{{ nextOption.name }}»</label>
|
|||
|
|
<multiselect v-model="nextOption.id" tag-placeholder="Добавьте значение" track-by="name" label="name" placeholder="" select-label="Добавить" deselect-label="Удалить" selected-label="Выбрано" :options="listSteps" :searchable="false" :show-labels="false">
|
|||
|
|
<template slot="singleLabel" slot-scope="{ option }"><strong>{{ option.name }}</strong></template>
|
|||
|
|
</multiselect>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</li>
|
|||
|
|
</ul>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<h2>Дополнительные действия при закрытии этапа</h2>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Cнять объект с рекламы</div>
|
|||
|
|
<div class="checkbox" style="margin-bottom:0px;">
|
|||
|
|
<input id="req_object_advert_close" true-value="1" false-value="0" type="checkbox" v-model="pole_dop.advert_close">
|
|||
|
|
<label for="req_object_advert_close" class="label"></label>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
<div class="settings-block area-label-right" style="margin-top:0px;margin-left:0px;margin-right:0px;margin-bottom:0px;">
|
|||
|
|
<p style="font-size:13px;"><i style="margin-right:5px;" class="ti-info-alt"></i>Только для заявок Реализация объекта</p>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block" style="display:none">
|
|||
|
|
<div class="label">Действия с автопоиском</div>
|
|||
|
|
<div class="checkbox" style="margin-bottom:0px;">
|
|||
|
|
<input id="req_object_avtopoisk_close" true-value="1" false-value="0" type="checkbox" v-model="pole_dop.avtopoisk_close">
|
|||
|
|
<label for="req_object_avtopoisk_close" class="label"></label>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
<div class="settings-block area-label-right" style="margin-top:0px;margin-left:0px;margin-right:0px;margin-bottom:0px;">
|
|||
|
|
<p style="font-size:13px;"><i style="margin-right:5px;" class="ti-info-alt"></i>Только для заявок с объектами</p>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Добавить договор</div>
|
|||
|
|
<div class="checkbox" style="margin-bottom:0px;">
|
|||
|
|
<input id="add_contract_close_step" true-value="1" false-value="0" type="checkbox" v-model="pole_dop.add_contract_close_step">
|
|||
|
|
<label for="add_contract_close_step" class="label"></label>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Добавить тег</div>
|
|||
|
|
<div class="checkbox" style="margin-bottom:0px;">
|
|||
|
|
<input id="add_activity_close_step" true-value="1" false-value="0" type="checkbox" v-model="pole_dop.add_activity_close_step">
|
|||
|
|
<label for="add_activity_close_step" class="label"></label>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="tabs__content" v-show="tab_prev_close">
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Поставить автоматическую задачу(и) на ответственного</div>
|
|||
|
|
<div class="inputs" style="padding-top: 15px;">
|
|||
|
|
<a type="button" @click="add_pole_prev" href="javascript:{}" class="green_button">Добавить задачу</a>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
<div v-show="pole_prev.tasks.length > 0" class="form-block">
|
|||
|
|
<div class="label">Список задач</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<ul class="pole_end_etap">
|
|||
|
|
<li v-for="(pole, pi) in pole_prev.tasks" class="pole_li">
|
|||
|
|
<div class="divLiLeft">
|
|||
|
|
<label>Название</label>
|
|||
|
|
<input type="text" v-model="pole.name">
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft" style="margin-right: 10px">
|
|||
|
|
<label>Тип</label>
|
|||
|
|
<v-select :components="{OpenIndicator}" transition="" class="vue_select" style="width: 250px; border: none;" :options="types_task" :reduce="name => name.code" label="name" v-model="pole.type"/>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="divLiLeft">
|
|||
|
|
<a title="Удалить" @click="del_pole_prev(pi)" class="no-border fatrash">
|
|||
|
|
<i class="fas fa-trash"></i>
|
|||
|
|
</a>
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft" style="margin-right: 10px">
|
|||
|
|
<label title="Время простановки задачи от наступления этапа">Время простановки</label>
|
|||
|
|
<v-select :components="{OpenIndicator}" transition="" class="vue_select" style="width: 175px; border: none;" :options="time_task" :reduce="name => name.code" label="name" v-model="pole.time"/>
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft" style="margin-right: 10px">
|
|||
|
|
<label>Комментарий к задаче</label>
|
|||
|
|
<textarea rows="4" style="width: 250px;" v-model="pole.comment"></textarea>
|
|||
|
|
</div>
|
|||
|
|
</li>
|
|||
|
|
</ul>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Поставить автоматическую задачу(и) на ВСЕХ ответственных</div>
|
|||
|
|
<div class="inputs" style="padding-top: 15px;">
|
|||
|
|
<a type="button" @click="add_pole_prev('all')" href="javascript:{}" class="green_button">Добавить задачу</a>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div v-show="pole_prev.tasks_all.length > 0" class="form-block">
|
|||
|
|
<div class="label">Список задач</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<ul class="pole_end_etap">
|
|||
|
|
<li v-for="(pole, pi) in pole_prev.tasks_all" class="pole_li">
|
|||
|
|
<div class="divLiLeft">
|
|||
|
|
<label>Название</label>
|
|||
|
|
<input type="text" v-model="pole.name">
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft" style="margin-right: 10px">
|
|||
|
|
<label>Тип</label>
|
|||
|
|
<v-select :components="{OpenIndicator}" transition="" class="vue_select" style="width: 250px; border: none;" :options="types_task" :reduce="name => name.code" label="name" v-model="pole.type"/>
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft">
|
|||
|
|
<a title="Удалить" @click="del_pole_prev(pi, 'all')" class="no-border fatrash">
|
|||
|
|
<i class="fas fa-trash"></i>
|
|||
|
|
</a>
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft" style="margin-right: 10px">
|
|||
|
|
<label title="Время простановки задачи от наступления этапа">Время простановки</label>
|
|||
|
|
<v-select :components="{OpenIndicator}" transition="" class="vue_select" style="width: 175px; border: none;" :options="time_task" :reduce="name => name.code" label="name" v-model="pole.time"/>
|
|||
|
|
</div>
|
|||
|
|
<div class="divLiLeft" style="margin-right: 10px">
|
|||
|
|
<label>Комментарий к задаче</label>
|
|||
|
|
<textarea rows="4" style="width: 250px;" v-model="pole.comment"></textarea>
|
|||
|
|
</div>
|
|||
|
|
</li>
|
|||
|
|
</ul>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Ввести комментарий</div>
|
|||
|
|
<div class="inputs" style="padding-top: 15px;">
|
|||
|
|
<textarea rows="5" style="width: 350px;" v-model="pole_prev.comment"></textarea>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Сменить ответственного</div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="new_who_work" true-value="1" false-value="0" type="checkbox" v-model="pole_prev.is_new_who_work">
|
|||
|
|
<label for="new_who_work" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
<div v-show="pole_prev.is_new_who_work > 0" class="form-block">
|
|||
|
|
<div class="label">Новый ответственный</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<v-select :components="{OpenIndicator}" transition="" class="vue_select" style="width: 400px; border: none;" :options="list_users_prev_pole" :reduce="date_employe => date_employe.code" label="date_employe" v-model="pole_prev.new_who_work"/>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div v-show="pole_prev.is_new_who_work > 0" class="form-block">
|
|||
|
|
<div class="label">Передавать объект с заявкой (для заявки Реализация объекта)</div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="new_who_work_object" true-value="1" false-value="0" type="checkbox" v-model="pole_prev.is_new_who_work_object">
|
|||
|
|
<label for="new_who_work_object" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Добавить партнеров</div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="new_doers" true-value="1" false-value="0" type="checkbox" v-model="pole_prev.is_new_doers">
|
|||
|
|
<label for="new_doers" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
<div v-show="pole_prev.is_new_doers > 0" class="form-block">
|
|||
|
|
<div class="label">Выбрать партнеров</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<v-select :components="{OpenIndicator}" multiple transition="" class="vue_select" style="width: 400px; border: none;" :options="list_users_prev_pole" :reduce="date_employe => date_employe.code" label="date_employe" v-model="pole_prev.new_doers"/>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<!-- смежные воронки -->
|
|||
|
|
<template>
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Переключить на смежную воронку</div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="adjacent_funnel" true-value="1" false-value="0" type="checkbox" @click="change_adjacent_funnels" v-model="pole_prev.is_adjacent_funnels">
|
|||
|
|
<label for="adjacent_funnel" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block" v-show="pole_prev.is_adjacent_funnels > 0">
|
|||
|
|
<div class="label">Выбрать воронки</div>
|
|||
|
|
<div v-if="!isEmpty(adjacent_funnels)" class="inputs">
|
|||
|
|
<v-select :components="{OpenIndicator}" multiple transition="" class="vue_select" style="width: 400px; border: none;" :options="adjacent_funnels" :reduce="name => name.code" label="name" v-model="pole_prev.adjacent_funnels"/>
|
|||
|
|
</div>
|
|||
|
|
<div v-else class="inputs" style="padding-top: 7px;">
|
|||
|
|
<label>Воронок не найдено</label>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block" v-show="!isEmpty(pole_prev.adjacent_funnels)">
|
|||
|
|
<div class="label">Разрешить переходить при закрытом этапе смежной воронки:</div>
|
|||
|
|
<div v-for="funnel_aj in pole_prev.adjacent_funnels" class="inputs">
|
|||
|
|
<template v-if="!isEmpty(adjacent_funnels_steps) && adjacent_funnels_steps[funnel_aj]">
|
|||
|
|
Воронка: "{{ adjacent_funnels_steps[funnel_aj].name }}"
|
|||
|
|
|
|||
|
|
<v-select :components="{OpenIndicator}" transition="" class="vue_select" style="width: 400px; border: none;" :options="adjacent_funnels_steps[funnel_aj].steps" :reduce="name => name.code" label="name" v-model="adjacent_funnels_steps[funnel_aj].value"/>
|
|||
|
|
</template>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Уведомлять о переходе на этап</div>
|
|||
|
|
<div class="checkbox">
|
|||
|
|
<input id="prev_mes_close" v-model="pole_prev.is_mes" @input="check_prev_is_mes" true-value="1" false-value="0" type="checkbox" >
|
|||
|
|
<label for="prev_mes_close" class="label"></label>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block" v-show="pole_prev.is_mes>0">
|
|||
|
|
<div class="label">Кому отправлять уведомления</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<v-select multiple class="vue_select" :components="{OpenIndicator}" style="width: 400px; border: none;" :options="list_users" :reduce="date_employe => date_employe.code" label="date_employe" v-model="pole_prev.list_users_select"/>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div class="label">Прикрепить документ</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<div class="dropbox">
|
|||
|
|
<input type="file" multiple="multiple" @change="onFileSelectedPrev" class="input-file" style="width: 400px;"> <p>
|
|||
|
|
Выберите файл(ы)
|
|||
|
|
</p>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
<div class="form-block" v-if="selectedFilesPrev.length > 0">
|
|||
|
|
<div class="label">Список файлов</div>
|
|||
|
|
<div class="inputs">
|
|||
|
|
<ul class="pole_end_etap">
|
|||
|
|
<li v-for="(file, infile) in selectedFilesPrev" class="pole_li">
|
|||
|
|
|
|||
|
|
|
|||
|
|
<div class="divLiLeft" style="margin-right: 10px">
|
|||
|
|
<label>Название файла</label>
|
|||
|
|
<input style="width: 400px;" type="text" v-model="pole_prev.files_attach[infile].name">
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="divLiLeft" style="margin-right: 10px">
|
|||
|
|
<label>Комментарий к файлу</label>
|
|||
|
|
<textarea rows="4" style="width: 400px;" v-model='pole_prev.files_attach[infile].comment'></textarea>
|
|||
|
|
</div>
|
|||
|
|
<div class="list_files">
|
|||
|
|
<label style="display:inline-block;" class="label_file"><i v-bind:class=" [ file.classFile, {active: progressUoloadPrev[infile].isUpload} ]"></i>{{ file.name }}</label>
|
|||
|
|
<a style="display:inline-block;" title="Удалить" @click="onDeleteFilePrev(infile,file)" class="no-border fatrash"><i style="margin-top:0px" class="fas fa-trash"></i></a>
|
|||
|
|
<vue-simple-progress v-if="progressUoloadPrev[infile].uploads" bar-color="#e2574c" :val="progressUoloadPrev[infile].progress" :text="progressUoloadPrev[infile].progress + '%'"></vue-simple-progress>
|
|||
|
|
</div>
|
|||
|
|
</li>
|
|||
|
|
</ul>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="modal-submit">
|
|||
|
|
<button type="button" @click='saveStep' class="action_call">Сохранить</button>
|
|||
|
|
</div>
|
|||
|
|
</form>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="full_modal-bg" v-if="updateClientStep">
|
|||
|
|
<span class="pseudo-link closer"><i class="ti-close" @click="updateClientStep = false"></i></span>
|
|||
|
|
<div class="full_modal edit-modal new-client__modal" style="max-width: 650px">
|
|||
|
|
<form class="form-validate" method="post">
|
|||
|
|
<div class="modal-inner">
|
|||
|
|
|
|||
|
|
<h2>Перенос клиентов</h2>
|
|||
|
|
<div class="jv-tabs">
|
|||
|
|
<div>
|
|||
|
|
<div class="tabs__content">
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div style="width: 100%" class="label">Чтобы удалить данный этап необходимо перенести клиентов на предыдущий.<br><br> {{ clientsSteps }}</div>
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="modal-submit">
|
|||
|
|
<button type="button" @click="updateStepClients" class="action_call">Перенести</button>
|
|||
|
|
</div>
|
|||
|
|
</form>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="full_modal-bg" v-if="mesUpdateClientStep">
|
|||
|
|
<span class="pseudo-link closer"><i class="ti-close" @click="mesUpdateClientStep = false"></i></span>
|
|||
|
|
<div class="full_modal edit-modal new-client__modal" style="max-width: 650px">
|
|||
|
|
<form class="form-validate" method="post">
|
|||
|
|
<div class="modal-inner">
|
|||
|
|
|
|||
|
|
<h2>ВНИМАНИЕ!!!</h2>
|
|||
|
|
<div class="jv-tabs">
|
|||
|
|
<div>
|
|||
|
|
<div class="tabs__content">
|
|||
|
|
<div class="form-block">
|
|||
|
|
<div style="width: 100%" class="label">После удаления этапов обязательно обновите связи этапов всей воронки</div>
|
|||
|
|
|
|||
|
|
<div class="clear"></div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="modal-submit">
|
|||
|
|
<button type="button" @click="mesUpdateClientStep = false" class="action_call">Закрыть</button>
|
|||
|
|
</div>
|
|||
|
|
</form>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="content-right fr__settings">
|
|||
|
|
|
|||
|
|
<div class="inner">
|
|||
|
|
|
|||
|
|
<div class="mail-settings-form" style="margin: 50px 0 0 0;">
|
|||
|
|
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<?php
|
|||
|
|
|
|||
|
|
require_once($_SERVER['DOCUMENT_ROOT']."/templates/linking_client_req/linking_client_req.php");
|
|||
|
|
|
|||
|
|
?>
|
|||
|
|
|
|||
|
|
|
|||
|
|
<!--<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>-->
|
|||
|
|
<script type="text/javascript" src="/js/admin/funnel_vue.js?v=<?=filemtime($_SERVER['DOCUMENT_ROOT'].'/js/admin/funnel_vue.js')?>"></script>
|
|||
|
|
<script type="text/javascript" src="/js/funnel.js?v=<?=filemtime($_SERVER['DOCUMENT_ROOT'].'/js/funnel.js')?>"></script>
|
|||
|
|
<script src="/js/locale/translations/ru.js"></script>
|
|||
|
|
<script type="text/javascript" src="/js/vue_scripts/linking_client_req/linking_client_req_vue.js?<?=filemtime($_SERVER['DOCUMENT_ROOT'].'/js/vue_scripts/linking_client_req/linking_client_req_vue.js')?>"></script>
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
<?php
|
|||
|
|
|
|||
|
|
require_once($_SERVER['DOCUMENT_ROOT'] . "/templates/footer-admin.php");
|
|||
|
|
|
|||
|
|
?>
|
|||
|
|
|