Actual prod

This commit is contained in:
mac 2026-07-03 10:04:01 +03:00
parent 1c5027406b
commit b14570835a
2 changed files with 179 additions and 110 deletions

View File

@ -4836,6 +4836,36 @@
$sql = "SELECT * FROM `requisitions` WHERE id = $id"; $sql = "SELECT * FROM `requisitions` WHERE id = $id";
$requisistion = $this->db->fetch_assoc($this->db->query($sql)); $requisistion = $this->db->fetch_assoc($this->db->query($sql));
// Вычисляем последний этап воронки
$lastStage = 8; // значение по умолчанию
$funnelId = intval($requisistion['funnel_id']);
if ($funnelId > 0) {
$q_step = $this->db->query("SELECT MAX(order_number) as last_stage FROM funnel_steps WHERE funnel_id = $funnelId AND deleted = 0");
if ($q_step && $this->db->num_rows($q_step) > 0) {
$r_step = $this->db->fetch_assoc($q_step);
if ($r_step['last_stage'] !== null) {
$lastStage = intval($r_step['last_stage']);
}
}
} else {
// funnel_id = 0 — дефолтная воронка, берём по agency_id
$agencyId = $this->user->agencyId;
$q_default = $this->db->query("SELECT id FROM funnel_default WHERE agency_id = $agencyId LIMIT 1");
if ($q_default && $this->db->num_rows($q_default) > 0) {
$r_default = $this->db->fetch_assoc($q_default);
$defaultFunnelId = intval($r_default['id']);
if ($defaultFunnelId > 0) {
$q_step = $this->db->query("SELECT MAX(order_number) as last_stage FROM funnel_steps WHERE funnel_id = $defaultFunnelId AND deleted = 0");
if ($q_step && $this->db->num_rows($q_step) > 0) {
$r_step = $this->db->fetch_assoc($q_step);
if ($r_step['last_stage'] !== null) {
$lastStage = intval($r_step['last_stage']);
}
}
}
}
}
if ($requisistion['complex_status_id'] && $requisistion['complex_room_id']) if ($requisistion['complex_status_id'] && $requisistion['complex_room_id'])
{ {
$complexStatus = new ComplexStatus((int)$requisistion['complex_status_id']); $complexStatus = new ComplexStatus((int)$requisistion['complex_status_id']);
@ -4845,11 +4875,12 @@
], false, false); ], false, false);
} }
$sql = "UPDATE requisitions SET reason='".$select_text.". ".$post['reason']."', who_delete = '$user_id', deleted=1, stage=8, denial = $post[denial] WHERE id=$id"; $sql = "UPDATE requisitions SET reason='".$select_text.". ".$post['reason']."', who_delete = '$user_id', deleted=1, stage=$lastStage, denial = $post[denial] WHERE id=$id";
if(isset($post['summa']) && $post['luck']){ if(isset($post['summa']) && $post['luck']){
if($dop_text != '') $dop_text .= " "; if($dop_text != '') $dop_text .= " ";
$dop_text1 .= "Совершена сделка на ".$post['summa']." руб. ".$formatted_dateZajavki; $commission = isset($post['commission']) ? intval($post['commission']) : 0;
$sql = "UPDATE requisitions SET reason='$post[reason]', who_delete = '$user_id', deleted=1, summa='$post[summa]', confirm='$post[luck]' WHERE id=$id"; $dop_text1 = "Совершена сделка на ".$commission." руб. ".$formatted_dateZajavki;
$sql = "UPDATE requisitions SET reason='".$dop_text1."', who_delete = '$user_id', deleted=1, summa='$post[summa]', confirm='$post[luck]' WHERE id=$id";
} }
if ($this->db->query($sql)) { if ($this->db->query($sql)) {

View File

@ -1772,7 +1772,7 @@ function editEvent(id, type, client_id, req_id) {
return false; return false;
} }
function editEventObj(id, type) { function editEventObj(id, type, object_id) {
if (type != 'comment') { if (type != 'comment') {
$("#addTaskBgObj").show(); $("#addTaskBgObj").show();
@ -1828,7 +1828,10 @@ function editEventObj(id, type) {
} }
} else { } else {
$.post("/ajax/getEventForObjId.php", { event_id: id }, function(data) { // object_id (id найденного листинга) — чтобы getEventForObjId читал external_listing_events,
// а не чужую user_object_events при пересечении id; res.object_id вернётся id листинга и save (changeEventsObj)
// уйдёт в листинговую таблицу.
$.post("/ajax/getEventForObjId.php", { event_id: id, object_id: object_id }, function(data) {
var res = JSON.parse(data); var res = JSON.parse(data);
//console.log(type); //console.log(type);
@ -1918,8 +1921,8 @@ function editEventObj(id, type) {
} }
function editNoteObj(id) { function editNoteObj(id, object_id) {
$.post("/ajax/getNoteForObjId.php", { note_id: id }, function(data) { $.post("/ajax/getNoteForObjId.php", { note_id: id, object_id: object_id }, function(data) {
let res = JSON.parse(data); let res = JSON.parse(data);
//console.log(data); //console.log(data);
@ -2107,8 +2110,13 @@ function sendEventFilesWin(id, from) {
$("body").addClass("lock"); $("body").addClass("lock");
} }
function deleteEvent(id, from) { function deleteEvent(id, from, kind) {
if (confirm("Вы точно хотите удалить эту задачу?")) { var isFile = (kind === 'file');
jwConfirm({
title: isFile ? 'Удаление файлов' : 'Удаление задачи',
text: isFile ? 'Вы точно хотите удалить эти файлы?' : 'Вы точно хотите удалить эту задачу?',
btnText: 'Удалить',
onConfirm: function() {
$.post('/ajax/deleteEvent.php', { $.post('/ajax/deleteEvent.php', {
deleteId: id, deleteId: id,
from: from || null from: from || null
@ -2122,6 +2130,7 @@ function deleteEvent(id, from) {
getCalendar(); getCalendar();
}); });
} }
});
} }
function showEventSubComment(id, from, event, sub_id) { function showEventSubComment(id, from, event, sub_id) {
@ -2171,6 +2180,9 @@ function showEventSubComment(id, from, event, sub_id) {
} }
function addEventSubComment(id, from, id_object, req_id, type = null) { function addEventSubComment(id, from, id_object, req_id, type = null) {
// листинг: id_object приходит числовым el.id без маркера; помечаем EXT-{n}, иначе reload панелей
// (getObjectInfoForEvents/getLogForEvents) примет el.id за objects.id (коллизия) → пустые паны (белая модалка)
if (from === 'listing' && String(id_object).indexOf('EXT-') !== 0) id_object = 'EXT-' + id_object;
user_for = 0; user_for = 0;
if (!isEmpty(type) && type == 'moderation') { if (!isEmpty(type) && type == 'moderation') {
user_for = $('#sub_comment_who_work_' + id).val(); user_for = $('#sub_comment_who_work_' + id).val();
@ -2215,11 +2227,18 @@ function addEventSubComment(id, from, id_object, req_id, type = null) {
} }
function deleteEventSubComment(id, from, id_object, sub_id) { function deleteEventSubComment(id, from, id_object, sub_id) {
// листинг: id_object приходит числовым el.id без маркера; помечаем EXT-{n}, иначе reload панелей
// (getObjectInfoForEvents/getLogForEvents) примет el.id за objects.id (коллизия) → пустые паны (белая модалка)
if (from === 'listing' && String(id_object).indexOf('EXT-') !== 0) id_object = 'EXT-' + id_object;
var subId = 0; var subId = 0;
if (!isEmpty(sub_id)) { if (!isEmpty(sub_id)) {
subId = sub_id; subId = sub_id;
} }
if (confirm("Вы точно хотите удалить комментарий МОП?")) { jwConfirm({
title: 'Удаление комментария',
text: 'Вы точно хотите удалить комментарий?',
btnText: 'Удалить',
onConfirm: function() {
$.post('/ajax/deleteEventSubComment.php', { $.post('/ajax/deleteEventSubComment.php', {
eventId: id, eventId: id,
from: from || null, from: from || null,
@ -2246,12 +2265,19 @@ function deleteEventSubComment(id, from, id_object, sub_id) {
}); });
}); });
} }
});
} }
function deleteNoteObj(id) { function deleteNoteObj(id, from) {
if (confirm("Вы точно хотите удалить данное примечание?")) { jwConfirm({
title: 'Удаление примечания',
text: 'Вы точно хотите удалить данное примечание?',
btnText: 'Удалить',
onConfirm: function() {
// from='listing' → удаление в external_listing_notes, иначе object_notes (id-нумерации разные)
$.post('/ajax/deleteNote.php', { $.post('/ajax/deleteNote.php', {
deleteId: id deleteId: id,
from: from || 'objects'
}, function() { }, function() {
if ($('#chat_content_' + id).length > 0) { if ($('#chat_content_' + id).length > 0) {
@ -2267,11 +2293,16 @@ function deleteNoteObj(id) {
$("body").removeClass("lock"); $("body").removeClass("lock");
}); });
} }
});
} }
//Отменить задачу //Отменить задачу
function cancelEvent(id) { function cancelEvent(id) {
if (confirm("Вы точно хотите отменить эту задачу?")) { jwConfirm({
title: 'Отмена задачи',
text: 'Вы точно хотите отменить эту задачу?',
btnText: 'Отменить задачу',
onConfirm: function() {
$.post('/ajax/cancelEvent.php', { cancelId: id }, function() { $.post('/ajax/cancelEvent.php', { cancelId: id }, function() {
if ($('#chat_content_' + id).length > 0) { if ($('#chat_content_' + id).length > 0) {
$('#chat_content_' + id).closest('.chat-message').addClass('cancel'); $('#chat_content_' + id).closest('.chat-message').addClass('cancel');
@ -2284,6 +2315,7 @@ function cancelEvent(id) {
getCalendar(); getCalendar();
}); });
} }
});
} }
//Для фильтра клиентов в отправке презентаций //Для фильтра клиентов в отправке презентаций
@ -3418,6 +3450,9 @@ function get_select_who_work_task(selector, section, id){
id = $('#submitTextButton').attr('data-id'); id = $('#submitTextButton').attr('data-id');
} }
// offset-free: для найденного листинга (section=object) ответственного берём по иерархии видимости, а не по
// владельцу objects-строки (её нет, el.id коллизит). Маркер листинга — data-src="ext" окна задач (openEventsWindow).
var isExternal = (section == 'object') && ($('#submitTextButton').attr('data-src') === 'ext');
$(selector+" .check_who_work").html('<img src="../images/rocket-spinner.svg" width="45px">'); $(selector+" .check_who_work").html('<img src="../images/rocket-spinner.svg" width="45px">');
if(id > 0) { if(id > 0) {
@ -3425,7 +3460,8 @@ function get_select_who_work_task(selector, section, id){
axios.post('/ajax/select_form_who_work_tasks.php', axios.post('/ajax/select_form_who_work_tasks.php',
{ {
id: id, id: id,
section: section section: section,
is_external: isExternal ? 1 : 0
} }
).then((response) => { ).then((response) => {
@ -4423,6 +4459,8 @@ $(document).ready(function() {
$('body').on('click', '.complete-action-button-obj', function() { $('body').on('click', '.complete-action-button-obj', function() {
var event_id = $(this).attr('id').replace('groupAB__', ''); var event_id = $(this).attr('id').replace('groupAB__', '');
// событие найденного листинга парсера завершается в своей таблице (data-from='listing'), иначе user_object_events
var from = $(this).attr('data-from') || 'objects';
var done = 0; var done = 0;
$(this).toggleClass('active'); $(this).toggleClass('active');
@ -4430,7 +4468,7 @@ $(document).ready(function() {
done = 1; done = 1;
} }
//console.log(done); //console.log(done);
$.post('/ajax/addEditObject.php', { done_event: event_id, done: done }, function(data) { $.post('/ajax/addEditObject.php', { done_event: event_id, done: done, from: from }, function(data) {
//console.log(data); //console.log(data);
if (typeof type_calendar == 'object') { if (typeof type_calendar == 'object') {
@ -6249,11 +6287,12 @@ $(document).ready(function() {
if (window.dealCloseData && window.dealCloseData.id) { if (window.dealCloseData && window.dealCloseData.id) {
param.luck = 10; param.luck = 10;
var factPrice = $('#fact_contract_price').val(); var factPrice = $('#fact_contract_price').val();
var factCommission = $('#fact_agent_commission').val();
param.summa = (factPrice !== '' && !isNaN(parseInt(factPrice))) ? parseInt(factPrice) : (window.dealCloseData.contract_price || 0); param.summa = (factPrice !== '' && !isNaN(parseInt(factPrice))) ? parseInt(factPrice) : (window.dealCloseData.contract_price || 0);
param.commission = (factCommission !== '' && !isNaN(parseInt(factCommission))) ? parseInt(factCommission) : (window.dealCloseData.agent_commission || 0);
param.datazakl = Date.parse(dataZZ); param.datazakl = Date.parse(dataZZ);
var factPayload = {}; var factPayload = {};
var factCommission = $('#fact_agent_commission').val();
if (factPrice !== '' && !isNaN(parseInt(factPrice))) factPayload.contract_price = parseInt(factPrice) || 0; if (factPrice !== '' && !isNaN(parseInt(factPrice))) factPayload.contract_price = parseInt(factPrice) || 0;
if (factCommission !== '' && !isNaN(parseInt(factCommission))) factPayload.agent_commission = parseInt(factCommission) || 0; if (factCommission !== '' && !isNaN(parseInt(factCommission))) factPayload.agent_commission = parseInt(factCommission) || 0;
if (Object.keys(factPayload).length > 0) { if (Object.keys(factPayload).length > 0) {
@ -6264,7 +6303,7 @@ $(document).ready(function() {
data: JSON.stringify(factPayload) data: JSON.stringify(factPayload)
}); });
} }
} else {Про } else {
if (isNaN(parseInt($('#summa_sdelki').val()))) { if (isNaN(parseInt($('#summa_sdelki').val()))) {
alert("Введите сумму сделки"); alert("Введите сумму сделки");
return; return;
@ -6314,7 +6353,6 @@ $(document).ready(function() {
} }
$('#del_client #temp_id').val(0); $('#del_client #temp_id').val(0);
}); });
}
} else { } else {
param.denial = $('#denial_work').val(); param.denial = $('#denial_work').val();
//console.log(reason); //console.log(reason);
@ -11695,8 +11733,8 @@ function bindObjReq(clientId) {
} }
//Открыть модл объекта //Открыть модл объекта
function openObjectModal(object_id, zindex) { function openObjectModal(object_id, zindex, is_external) {
object_card.open(object_id, zindex); object_card.open(object_id, zindex, is_external);
} }
//Проверка на пустату //Проверка на пустату