Joywork/tuning_funnel.php
2026-05-22 21:21:54 +03:00

1225 lines
85 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
require_once($_SERVER['DOCUMENT_ROOT']."/config.php");
if(!$_SESSION['id']) { header("location:index.php"); die("Доступ запрещён!");}
require($_SERVER['DOCUMENT_ROOT']."/templates/new-header.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 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">
<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;
}
}
.modal-submit button:disabled {
opacity: 0.8;
cursor: not-allowed;
}
.new-client__modal .crm__small-stagebar {
height: 8px !important;
}
.new-client__modal .crm__small-stagebar table td{
height: 8px !important;
}
</style>
<div id="app" class="hidden">
<div class="content-right">
<div class="inner" style="padding: 0px 0px 0px 110px;">
<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 class="crm__new-client" style="height: 55px">
<button class="jw__g-button add_funnel_new" @click="openFunelmodalTemplate();">Добавить воронку по шаблону JoyWork</button>
</div>
</div>
</div>
<div id="funnel_list">
<div class="clients">
<div class="client" v-for='(funnel,index) in funnels' >
<div class="client-inner" :id="'idFunnelBlock'+funnel.id">
<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="addFunelmodalTemplate" id="addFunnelTemplateNew">
<span class="pseudo-link closer"><i class="ti-close" @click="addFunelmodalTemplate = false"></i></span>
<div class="full_modal edit-modal new-client__modal" id="addFunnelTemplate">
<form class="form-validate" method="post">
<div class="modal-inner">
<h2>Выберите воронку</h2>
<div class="jv-tabs">
<template v-if="funnelTemplateLoad">
<div style="text-align: center;">
<img src="../images/rocket-spinner.svg" width="150px">
</div>
</template>
<template v-else>
<div class="clients">
<div class="client" v-for='(funnel,index) in templateFunnels' >
<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 class="type">{{ funnel.name }}</div>
<div v-if="!isEmpty(funnel.steps)" 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" style="margin-right: 100px;">
<div class="checkbox small" style="margin-bottom:0px;">
<input type="checkbox" :id="'funnel-is_change'+ funnel.id" v-model="funnel.is_change" @change="changeFunnel" :checked="Boolean(funnel.is_change)" true-value="1">
<label :for="'funnel-is_change'+funnel.id">Выбрать</label>
</div>
<div class="clear"></div>
</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>
<div class="clear"></div>
</div>
</div>
</div>
</div>
</div>
</template>
</div>
</div>
<div class="modal-submit">
<button type="button" @click='addFunnelTemplate();' :disabled="isDisabled" class="action_call">Добавить</button>
</div>
</form>
</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>
</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 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, app.list_next_poles)" 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" style="display: flex;flex-wrap: nowrap;flex-direction: row;">
<div class="label">Список полей</div>
<div class="inputs">
<ul class="pole_end_etap">
<li class="pole_li" v-for="(poleEnd, poleEndId) in poleEndlist" style="width: 700px">
<div class="divLiLeft">
<label>Название</label>
<input style="width: 100px; margin-right: 10px;" 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" 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="divLiLeft" v-if="!onePole && poleEnd.type != 'Выпадающий список' && poleEnd.type != 'Ветвление этапов'">
<label>Показывать при переходе на этап:</label>
<v-select :components="{OpenIndicator}" transition="" placeholder="Все этапы" class="vue_select" multiple style="width: 270px; border: none;" label="name" :reduce="name => name.code" :options="list_next_poles" v-model="poleEnd.view_next"/>
</div>
<div class="divLiLeft" style="margin-left: 10px">
<a title="Удалить" @click="deletePole(poleEndId)" class="no-border fatrash"><i class="fas fa-trash"></i></a>
</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 }} &laquo;{{ nextOption.name }}&raquo;</label>
<multiselect v-model="nextOption.id" @select="nextOptionUpdate" 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 class="content-bottom" style="padding: 0 35px 60px 145px;">
<div class="copyrights" style="border-top: 0;">
<div class="text-logo">
<span>Joy<span class="green">Work</span>, 2025</span>
</div>
<p title="Текущая версия">v. 3.1.1</p>
</div>
</div>
</div>
<?php
require_once($_SERVER['DOCUMENT_ROOT']."/templates/linking_client_req/linking_client_req.php");
?>
<script type="text/javascript" src="/js/funnel_vue.js?v=<?=filemtime($_SERVER['DOCUMENT_ROOT'].'/js/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($_SERVER['DOCUMENT_ROOT']."/templates/footer.php"); ?>