fix CRM contacts

This commit is contained in:
root
2026-01-18 20:11:53 +03:00
parent 308c684aa2
commit 82acbd8c82
3 changed files with 193 additions and 6 deletions
@@ -494,6 +494,59 @@ class DealsController extends BaseController
return redirect()->to('/crm/deals/stages')->with('success', 'Этап удалён');
}
/**
* API: Изменить порядок этапов (drag-n-drop)
* POST /crm/deals/stages/reorder
*/
public function reorderStages()
{
$organizationId = $this->requireActiveOrg();
// Получаем массив stages[] из form-urlencoded
$stageOrders = $this->request->getPost('stages');
if (empty($stageOrders) || !is_array($stageOrders)) {
return $this->response
->setHeader('X-CSRF-TOKEN', csrf_hash())
->setHeader('X-CSRF-HASH', csrf_token())
->setJSON([
'success' => false,
'message' => 'Не передан список этапов',
])->setStatusCode(422);
}
// Приводим к int (приходят как строки из form-urlencoded)
$stageOrders = array_map('intval', $stageOrders);
// Проверяем что все этапы принадлежат организации
foreach ($stageOrders as $stageId) {
$stage = $this->stageService->getStage($stageId);
// Все поля из БД возвращаются как строки, поэтому сравниваем через intval
if (!$stage || intval($stage['organization_id'] ?? 0) !== intval($organizationId)) {
return $this->response
->setJSON([
'success' => false,
'message' => 'Этап не найден или принадлежит другой организации',
'debug' => [
'stageId' => $stageId,
'stage' => $stage,
'organizationId' => $organizationId,
],
])->setStatusCode(422);
}
}
$this->stageService->reorderStages($organizationId, $stageOrders);
return $this->response
->setJSON([
'success' => true,
'message' => 'Порядок этапов обновлён',
'csrf_token' => csrf_hash(),
'csrf_hash' => csrf_token(),
]);
}
/**
* API: получить контакты клиента
*/