<?php
//----------------------------------------------------------------------
// src/Services/Platform/ExternalMessageTools.php
//----------------------------------------------------------------------
namespace App\Services\Platform;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\Common\RefGenerator;
use App\Entity\Communication\Sms\Sms;
use App\Entity\Platform\ExternalMessage\ExternalMessage;
use App\Entity\Platform\ExternalMessage\ExternalMessageStatus;
use App\Entity\Platform\ExternalMessage\ExternalMessageType;
use App\Services\Common\RefGeneratorTools;
class ExternalMessageTools
{
public function __construct(ManagerRegistry $doctrine, RefGeneratorTools $refGeneratorTools)
{
$this->em = $doctrine->getManager();
$this->refGeneratorTools = $refGeneratorTools;
}
/**
* createExternalMessageForSmsChild
*
* Creates an ExternalMessage for a Sms response
* ie. an Sms with a not null parent
* ie. a Child Sms
* This is used by SmsProviderTools :: craftObjectsFromTwilioData
*
* @param Sms $sms
* @return null|ExternalMessage
*/
public function createExternalMessageForSmsChild(Sms $sms)
{
if ($sms->getParent() === null)
{
return null;
}
if (in_array(null, [$sms->getClient(), $sms->getClient()->getIndividual(), $sms->getSociety(), $sms->getSocietyGroup()]))
{
return null;
}
$client = $sms->getClient();
$individual = $sms->getClient()->getIndividual();
$society = $sms->getSociety();
$societyGroup = $sms->getSocietyGroup();
// Handle ExternalMessageStatus and ExternalMessageType
$status = $this->em
->getRepository(ExternalMessageStatus::class)
->findOneBy(array(
"societyGroup" => $societyGroup,
"defaultValue" => 1,
));
$type = $this->em
->getRepository(ExternalMessageType::class)
->findOneBy(array("sms" => 1));
if ($status === null)
{
$msg = "Default ExternalMessageStatus not found for societyGroup ".$societyGroup->displayForLog();
$this->logTools->errorlog($msg, $sms->getProvider());
$this->logTools->smsLogDebug($msg, $sms->getProvider());
return null;
}
if ($type === null)
{
$msg = "Default ExternalMessageType not found for societyGroup ".$societyGroup->displayForLog();
$this->logTools->errorlog($msg, $sms->getProvider());
$this->logTools->smsLogDebug($msg, $sms->getProvider());
return null;
}
// At this point nothing can go wrong any more, start creating data
$externalMessage = new ExternalMessage();
$externalMessage->setSubject($sms->getSubject());
$externalMessage->setBody($sms->getBody());
$externalMessage->setClient($client);
$externalMessage->setMission($sms->getMission());
$externalMessage->setLastname($individual->getLastname());
$externalMessage->setFirstname($individual->getFirstname());
$externalMessage->setEmail($individual->getEmail());
$externalMessage->setPhoneNumber($sms->getEmitter());
$externalMessage->setCompany($individual->getCompany());
$externalMessage->setSociety($society);
$address = $individual->getAddress();
if ($address !== null)
{
$externalMessage->setAddress($address->displayAddressComplement());
$externalMessage->setPostalCode($address->getPostalCode());
$externalMessage->setTown($address->getTown());
}
$externalMessage->setStatus($status);
$externalMessage->setType($type);
// Create Reference
$this->refGeneratorTools->craftRef($externalMessage, RefGenerator::CODE_EXTERNAL_MESSAGE);
// Link Sms
$externalMessage->setSms($sms);
$externalMessage->setParentSms($sms->getParent());
// Link SmsMode : Not needed for now, we are not handling client responses via the SmsMode api for now
// Link SmsTwilio : done in SmsProviderTools
$this->em->persist($externalMessage);
return $externalMessage;
}
/**
* createExternalMessageResponseForSms
*
* Creates an ExternalMessage as a Client Response for a Sms
* This is used by ExternalMessageController :: handleSmsResponseFromClient
*
* @param Sms $sms
* @return null|ExternalMessage
*/
public function createExternalMessageResponseForSms(Sms $sms)
{
$client = $sms->getClient();
$society = $sms->getSociety();
$societyGroup = $sms->getSocietyGroup();
if ($client === null || $society === null || $societyGroup === null)
{
return null;
}
$individual = $sms->getClient()->getIndividual();
if ($individual === null)
{
return null;
}
// Handle ExternalMessageStatus and ExternalMessageType
$status = $this->em
->getRepository(ExternalMessageStatus::class)
->findOneBy(array(
"societyGroup" => $societyGroup,
"defaultValue" => 1,
));
$type = $this->em
->getRepository(ExternalMessageType::class)
->findOneBy(array("sms" => 1));
if ($status === null)
{
$msg = "Default ExternalMessageStatus not found for societyGroup ".$societyGroup->displayForLog();
$this->logTools->errorlog($msg, $sms->getProvider());
$this->logTools->smsLogDebug($msg, $sms->getProvider());
return null;
}
if ($type === null)
{
$msg = "Default ExternalMessageType not found for societyGroup ".$societyGroup->displayForLog();
$this->logTools->errorlog($msg, $sms->getProvider());
$this->logTools->smsLogDebug($msg, $sms->getProvider());
return null;
}
// At this point nothing can go wrong any more, start creating data
$externalMessage = new ExternalMessage();
$externalMessage->setClient($client);
$externalMessage->setMission($sms->getMission());
$externalMessage->setLastname($individual->getLastname());
$externalMessage->setFirstname($individual->getFirstname());
$externalMessage->setEmail($individual->getEmail());
$externalMessage->setPhoneNumber($sms->getRecipient());
$externalMessage->setCompany($individual->getCompany());
$externalMessage->setSociety($society);
$address = $individual->getAddress();
if ($address !== null)
{
$externalMessage->setAddress($address->displayAddressComplement());
$externalMessage->setPostalCode($address->getPostalCode());
$externalMessage->setTown($address->getTown());
}
$externalMessage->setStatus($status);
$externalMessage->setType($type);
// Create Reference
$this->refGeneratorTools->craftRef($externalMessage, RefGenerator::CODE_EXTERNAL_MESSAGE);
// Link Sms
$externalMessage->setParentSms($sms);
// Plan.io Task #3922
$externalMessage->setLoggingData([
"special_author" => "sms_client_response",
]);
// Do not persit here, body is not yet set and I want to log it :)
// $this->em->persist($externalMessage);
return $externalMessage;
}
}