<?php
namespace App\Controller\Api;
use App\Service\BitrixFunctions;
use App\Service\Entity\BitrixService;
use App\Service\Entity\MessageSenderService;
use App\Service\Entity\RequestWorkerService;
use App\Service\System\EncryptionData;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use App\Entity\Bitrix;
use App\Service\Entity\LogService;
use App\Service\Entity\WhileListService;
/**
* @Route("/api/bitrix")
*/
class BitrixController extends AbstractController
{
public $entityManager;
public $logService;
public $whileListService;
public $messageService;
public $requestWorkerService;
public $bitrixFunctions;
public $bitrixService;
public $encryptionData;
public function __construct(
EntityManagerInterface $entityManager,
LogService $logService,
WhileListService $whileListService,
MessageSenderService $messageService,
RequestWorkerService $requestWorkerService,
BitrixFunctions $bitrixFunctions,
BitrixService $bitrixService,
EncryptionData $encryptionData
)
{
$this->entityManager = $entityManager;
$this->logService = $logService;
$this->whileListService = $whileListService;
$this->messageService = $messageService;
$this->requestWorkerService = $requestWorkerService;
$this->bitrixFunctions = $bitrixFunctions;
$this->bitrixService = $bitrixService;
$this->encryptionData = $encryptionData;
}
/**
* @Route(
* "/crm/lead-deal/check"
* )
* @return Response
*/
public function crmLeadDealCheck(Request $request): Response
{
if(!$this->whileListService->checkAccessApi())
return new Response(json_encode([
'status' => false,
'result' => null,
'error' => 'no valid ip'
]));
$em = $this->entityManager;
$lead_id = $request->request->get('lead_id');
$deal_id = $request->request->get('deal_id');
$api_token = $request->request->get('token');
$crm_id = $request->request->get('crm_id');
$admin_id = $request->request->get('admin_id');
$merchant_account_identifier = $request->request->get('merchant_account_identifier');
$merchant_account_email_hash = $request->request->get('merchant_account_email_hash');
$data = [
'lead_id' => $lead_id,
'deal_id' => $deal_id,
'api_token' => $api_token,
'crm_id' => $crm_id,
'admin_id' => $admin_id,
'merchant_account_identifier' => $merchant_account_identifier,
'merchant_account_email_hash' => $merchant_account_email_hash,
];
$this->logService->setSystemLog('/crm/lead-deal/check',json_encode($data));
if(
(!$lead_id and !$deal_id) or
!$api_token or
!$crm_id or
!$admin_id or
!$merchant_account_identifier or
!$merchant_account_email_hash
){
return new Response(json_encode([
'status' => false,
'result' => null,
'error' => 'invalid data'
]));
}
if($api_token !== 'ZsB782nU6Rp4X77v3ZAkZspGmga9M6')
return new Response(json_encode([
'status' => false,
'result' => null,
'error' => 'invalid token'
]));
$bitrix = $em->getRepository(Bitrix::class)->findOneBy([
'number_for_api'=>$crm_id
]);
if(!$bitrix)
return new Response(json_encode([
'status' => false,
'result' => null,
'error' => 'crm id no valid'
]));
$merchant_account_email_hash = trim($merchant_account_email_hash);
$params_message = [
'admin_id' => $admin_id,
'merchant_account_identifier' => $merchant_account_identifier
];
$result = $this->bitrixService->checkLeadDealEmail($bitrix,$merchant_account_email_hash,$lead_id,$deal_id,$params_message);
return new Response(json_encode($result));
}
/**
* @Route(
* "/crm/lead/info"
* )
* @return Response
*/
public function crmLeadInfo(Request $request): Response
{
if(!$this->whileListService->checkAccessApi())
return new Response(json_encode([
'status' => false,
'message' => 'no valid ip'
]));
$em = $this->entityManager;
$api_token = $request->request->get('token');
$bitrix_id = $request->request->get('bitrix_id');
$crm_lead_id = $request->request->get('crm_lead_id');
$data = [
'api_token' => $api_token,
'bitrix_id' => $bitrix_id,
'crm_lead_id' => $crm_lead_id,
];
$this->logService->setSystemLog('/crm/lead/info',json_encode($data));
if(
!$api_token or
!$bitrix_id or
!$crm_lead_id
){
return new Response(json_encode([
'status' => false,
'message' => 'invalid data'
]));
}
if($api_token !== 'ZsB782nU6Rp4X77v3ZAkZspGmga9M6')
return new Response(json_encode([
'status' => false,
'message' => 'invalid token'
]));
$bitrix = $em->getRepository(Bitrix::class)->findOneBy([
'number_for_api'=>$bitrix_id
]);
if(!$bitrix)
return new Response(json_encode([
'status' => false,
'message' => 'no bitrix in db'
]));
$web_hook_url = $bitrix->getUserInputWebhookUrl();
$lead_deal_data = $this->bitrixFunctions->getDealDataFromLead($web_hook_url,$crm_lead_id);
$deal_ids = [];
if($lead_deal_data['status']){
$deal_ids = $lead_deal_data['deal_ids'];
}
return new Response(json_encode([
'status' => true,
'message' => $deal_ids
]));
}
/**
* @Route(
* "/crm/item"
* )
* @return Response
*/
public function item(Request $request): Response
{
$em = $this->entityManager;
$request_log = json_decode(file_get_contents('php://input'), true);
$this->logService->setSystemLog('/crm/item',json_encode($request_log));
if(!$this->whileListService->checkAccessApi())
return new Response(json_encode([
'status' => false,
'message' => 'no valid ip'
]));
$token = $request->request->get('token');
$type = $request->request->get('type');
$bitrix_id = $request->request->get('bitrixId');
if($token !== 'ZsB782nU6Rp4X77v3ZAkZspGmga9M6')
return new Response(json_encode([
'status' => false,
'message' => 'invalid token'
]));
if(!$type or !$bitrix_id){
return new Response(json_encode([
'status' => false,
'message' => 'invalid data, type or bitrix_id is empty'
]));
}
if(!in_array($type,['Zelle','PayPal']))
return new Response(json_encode([
'status' => false,
'message' => "type in zelle,paypal,wire"
]));
$bitrix = $em->getRepository(Bitrix::class)->findOneBy([
'number_for_api'=>$bitrix_id
]);
if(!$bitrix)
return new Response(json_encode([
'status' => false,
'message' => 'no bitrix in db'
]));
$email = $request->request->get('email');
$value = $request->request->get('value');
$currency = $request->request->get('currency');
if($bitrix_id == 1) {
if($type == 'Zelle')
$categoryId = '13';
if($type == 'PayPal')
$categoryId = '4';
$params = [
'entityTypeId' => "143",
'fields' => [
'ufCrm4_1661202133' => $email,
'opportunity' => $value,
'currencyId' => $currency,
'categoryId' => $categoryId,
]
];
}
if($bitrix_id == 2) {
if ($type == 'Zelle')
$categoryId = '14';
if($type == 'PayPal')
$categoryId = '5';
$params = [
'entityTypeId' => "143",
'fields' => [
'ufCrm4_1661202133' => $email,
'opportunity' => $value,
'currencyId' => $currency,
'categoryId' => $categoryId,
]
];
}
if(!isset($params))
return new Response(json_encode([
'status' => false,
'message' => 'no params'
]));
$this->requestWorkerService->create($bitrix,'crm.item.add',$params);
return new Response(json_encode([
'status' => true
]));
}
/**
* @Route(
* "/crm/send/message"
* )
* @return Response
*/
public function sendMessage(Request $request): Response
{
if(!$this->whileListService->checkAccessApi())
return new Response(json_encode([
'status' => false,
'message' => 'no valid ip'
]));
$em = $this->entityManager;
$api_token = $request->request->get('token');
$message = $request->request->get('message');
$entity_type = $request->request->get('entity_type');
$entity_id = $request->request->get('entity_id');
$bitrix_id = $request->request->get('bitrixId');
$data = [
'api_token' => $api_token,
'message' => $message,
'entity_type' => $entity_type,
'entity_id' => $entity_id,
'bitrix_id' => $bitrix_id,
];
$this->logService->setSystemLog('/crm/send/message',json_encode($data));
if(
!$api_token or
!$message or
!$entity_type or
!$entity_id or
!$bitrix_id
){
return new Response(json_encode([
'status' => false,
'message' => 'invalid data'
]));
}
if($api_token !== 'ZsB782nU6Rp4X77v3ZAkZspGmga9M6')
return new Response(json_encode([
'status' => false,
'message' => 'invalid token'
]));
if(!in_array($entity_type,[1,2,3]))
return new Response(json_encode([
'status' => false,
'message' => "where in 1,2,3"
]));
$bitrix = $em->getRepository(Bitrix::class)->findOneBy([
'number_for_api'=>$bitrix_id
]);
if(!$bitrix)
return new Response(json_encode([
'status' => false,
'message' => 'no bitrix in db'
]));
// користувачу та його керівнику
if(1 == $entity_type){
$this->requestWorkerService->create(
$bitrix,
'sendMessageInBitrixUserAndHead',
[
'user_id' => $entity_id,
'message' => $message
]
);
}
// в лід
if(2 == $entity_type){
// $this->bitrixFunctions->addTimeline(true,$bitrix,$entity_id,'lead',$message);
$this->bitrixFunctions->addTimelineLogMessage(true,$bitrix,$entity_id,'lead',$message);
}
// в справу
if(3 == $entity_type){
// $this->bitrixFunctions->addTimeline(true,$bitrix,$entity_id,'deal',$message);
$this->bitrixFunctions->addTimelineLogMessage(true,$bitrix,$entity_id,'deal',$message);
}
return new Response(json_encode([
'status' => true
]));
}
/**
*
* @Route(
* "/crm/send/message/notification"
* )
* @return Response
*/
public function sendMessagedNotification(Request $request): Response
{
if(!$this->whileListService->checkAccessApi())
return new Response(json_encode([
'status' => false,
'message' => 'no valid ip'
]));
$em = $this->entityManager;
$api_token = $request->request->get('token');
$text = $request->request->get('text');
$bitrix_id = $request->request->get('bitrixId');
$leadId = $request->request->get('leadId');
$depositor = $request->request->get('depositor');
// щоб взяти справу прямо з crm
$ignore_lead_connection_deal = $request->request->get('ignoreLeadConnectionDeal');
$crm_deal_id = $request->request->get('crmDealId');
// лід полюбому приходить ліду але не приходить юзерам відповідальним
$always_send_notification_to_lead = $request->request->get('alwaysSendNotificationToLead');
$log_data = [
'api_token' => $api_token,
'text' => $text,
'bitrix_id' => $bitrix_id,
'crm_deal_id' => $crm_deal_id,
'leadId' => $leadId,
'depositor' => $depositor,
'ignore_lead_connection_deal' => $ignore_lead_connection_deal,
'always_send_notification_to_lead' => $always_send_notification_to_lead,
];
$this->logService->setSystemLog('/crm/send/message/notification',json_encode($log_data));
if($api_token !== 'ZsB782nU6Rp4X77v3ZAkZspGmga9M6')
return new Response(json_encode([
'status' => false,
'message' => 'invalid token'
]));
if(!$bitrix_id){
return new Response(json_encode([
'status' => false,
'message' => 'not filled crm id'
]));
}
if(
gettype($depositor) !== 'boolean' or
!$text
){
return new Response(json_encode([
'status' => false,
'message' => 'invalid data'
]));
}
if(!$ignore_lead_connection_deal)
$ignore_lead_connection_deal = false;
if(!$always_send_notification_to_lead)
$always_send_notification_to_lead = false;
$bitrix = $em->getRepository(Bitrix::class)->findOneBy(['number_for_api'=>$bitrix_id]);
if(!$bitrix)
return new Response(json_encode([
'status' => false,
'message' => 'crm id: no valid'
]));
$web_hook_url = $bitrix->getUserInputWebhookUrl();
// беремо справу з ліда
$user_input_webhook_url = $bitrix->getUserInputWebhookUrl();
$lead_deal_data = $this->bitrixFunctions->getDealDataFromLead($user_input_webhook_url,$leadId);
// end
if($depositor){
if($ignore_lead_connection_deal){
if(!$crm_deal_id)
return new Response(json_encode([
'status' => false,
'message' => 'no crm deal id',
'lead_deal_data' => $lead_deal_data,
]));
$filter = [
'ID' => $crm_deal_id,
];
}
else {
if(!$leadId){
return new Response(json_encode([
'status' => false,
'message' => 'not filled crm lead id',
'lead_deal_data' => $lead_deal_data,
]));
}
$filter = [
'LEAD_ID' => $leadId,
];
}
$select = ['ID', 'LEAD_ID','ASSIGNED_BY_ID'];
$result_deals = $this->bitrixFunctions->getDealList($web_hook_url,$filter,$select);
if(!$result_deals['status']) {
return new Response(json_encode([
'status' => false,
'message' => "bitrix get deal error",
'lead_deal_data' => $lead_deal_data,
]));
}
$result_deals = $result_deals['result'];
foreach ($result_deals as $deal) {
$deal_id = $deal['ID'];
$this->requestWorkerService->create(
$bitrix,
'sendMessageInBitrixUserAndHead',
[
'user_id' => $deal['ASSIGNED_BY_ID'],
'message' => $text
]
);
// $this->bitrixFunctions->addTimeline(true,$bitrix,$deal_id,'deal',$text);
$this->bitrixFunctions->addTimelineLogMessage(true,$bitrix,$deal_id,'deal',$text);
}
}
// депозит false або обовязково відправити в лід true
if(!$depositor or $always_send_notification_to_lead){
if(!$leadId){
return new Response(json_encode([
'status' => false,
'message' => 'not filled crm lead id',
'lead_deal_data' => $lead_deal_data,
]));
}
$result_lead = $this->bitrixFunctions->getLead($web_hook_url,$leadId);
if(!$result_lead['status']) {
return new Response(json_encode([
'status' => false,
'message' => "bitrix get lead error",
'lead_deal_data' => $lead_deal_data,
]));
}
$lead = $result_lead['result'];
// працьовує тільки при депозит false
if(!$depositor) {
$this->requestWorkerService->create(
$bitrix,
'sendMessageInBitrixUserAndHead',
[
'user_id' => $lead['ASSIGNED_BY_ID'],
'message' => $text
]
);
}
// $this->bitrixFunctions->addTimeline(true,$bitrix,$leadId,'lead',$text);
$this->bitrixFunctions->addTimelineLogMessage(true,$bitrix,$leadId,'lead',$text);
}
return new Response(json_encode([
'status' => true,
'lead_deal_data' => $lead_deal_data,
]));
}
}