Handle insurance callbacks, add support for non-JO related FCM notifications #761

This commit is contained in:
Ramon Gutierrez 2023-10-09 01:15:12 +08:00
parent dd9c9dd0ec
commit 9b616cf398
5 changed files with 168 additions and 28 deletions

View file

@ -158,7 +158,6 @@ class InsuranceController extends ApiController
$gt->setStatus(TransactionStatus::PENDING);
$gt->setGateway('paymongo'); // TODO: define values elsewhere
$gt->setType('insurance_premium'); // TODO: define values elsewhere
$gt->setExtTransactionId($result['response']['id']);
$this->em->persist($gt);
$this->em->flush();
@ -179,9 +178,9 @@ class InsuranceController extends ApiController
$checkout_url = $checkout['response']['data']['attributes']['checkout_url'];
// add checkout url and id to transaction metadata
$gt->setExtTransactionId($checkout['response']['data']['id']);
$gt->setMetadata([
'checkout_url' => $checkout_url,
'checkout_id' => $checkout['response']['data']['id'],
]);
// store application in db
@ -191,8 +190,11 @@ class InsuranceController extends ApiController
$app->setCustomerVehicle($cv);
$app->setGatewayTransaction($gt);
$app->setStatus(InsuranceApplicationStatus::CREATED);
$app->setExtTransactionId($result['response']['id']);
$app->setMetadata($input);
$this->em->persist($app);
// save everything
$this->em->flush();
// return

View file

@ -2,22 +2,116 @@
namespace App\Controller;
use App\Ramcar\InsuranceApplicationStatus;
use App\Service\FCMSender;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use DateTime;
class InsuranceController extends Controller
{
public function listen(Request $req, EntityManagerInterface $em)
protected $em;
protected $fcmclient;
public function __construct(EntityManagerInterface $em, FCMSender $fcmclient)
{
$this->em = $em;
$this->fcmclient = $fcmclient;
}
public function listen(Request $req)
{
$payload = $req->request->all();
// DEBUG
@file_put_contents(__DIR__ . '/../../var/log/insurance.log', print_r($payload, true) . "\r\n----------------------------------------\r\n\r\n", FILE_APPEND);
error_log(print_r($payload, true));
/*
return $this->json([
'success' => true,
]);
*/
// END DEBUG
// get event type and process accordingly
$event_name = $payload['transaction_code'];
switch ($event_name) {
case 'GR002':
return $this->handleAuthenticated($payload);
break;
case 'GR003':
return $this->handleUpdateMade($payload);
break;
default:
break;
}
return $this->json([
'success' => true,
'payload' => $payload,
]);
}
protected function handleAuthenticated($payload)
{
$obj = $this->getApplication($payload['id']);
if (!empty($obj)) {
// mark as completed
$obj->setStatus(InsuranceApplicationStatus::COMPLETED);
$obj->setCOC($payload['coc_url']);
$this->em->flush();
// send notification
$this->fcmclient->sendEvent($obj->getCustomer(), "insurance_fcm_title_completed", "insurance_fcm_body_completed");
}
return $this->json([
'success' => true,
]);
}
protected function handleUpdateMade($payload)
{
$obj = $this->getApplication($payload['id']);
if (!empty($obj)) {
$metadata = $obj->getMetadata();
// initialize change list if not present
if (empty($metadata['changes'])) {
$metadata['changes'] = [];
}
$now = new DateTime;
$metadata['changes'][$now->format('Y-m-d H:i:s')] = $payload['data'];
// update metadata to record change
$obj->setMetadata($metadata);
$this->em->flush();
// send notification
$this->fcmclient->sendEvent($obj->getCustomer(), "insurance_fcm_title_updated", "insurance_fcm_body_updated");
}
return $this->json([
'success' => true,
]);
}
protected function getApplication($transaction_id)
{
$result = $this->em->getRepository(InsuranceApplication::class)->findBy([
'ext_transaction_id' => $transaction_id,
], [], 1);
return !empty($result) ? $result[0] : false;
}
}

View file

@ -74,6 +74,12 @@ class InsuranceApplication
*/
protected $date_complete;
// external transaction id
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $ext_transaction_id;
// form data when submitting the application
/**
* @ORM\Column(type="json")
@ -179,6 +185,17 @@ class InsuranceApplication
return $this->date_complete;
}
public function setExtTransactionId($transaction_id)
{
$this->ext_transaction_id = $transaction_id;
return $this;
}
public function getExtTransactionId()
{
return $this->ext_transaction_id;
}
public function setMetadata($metadata)
{
return $this->metadata = $metadata;

View file

@ -2,6 +2,7 @@
namespace App\Service;
use App\Entity\Customer;
use Symfony\Contracts\Translation\TranslatorInterface;
use Fcm\FcmClient;
use Fcm\Push\Notification;
@ -53,42 +54,62 @@ class FCMSender
public function sendJoEvent(JobOrder $job_order, $title, $body, $data = [])
{
// get all v2 sessions
// get customer object
$cust = $job_order->getCustomer();
// attach jo info
$data['jo_id'] = $job_order->getID();
$data['jo_status'] = $job_order->getStatus();
// send the event
return $this->sendEvent($cust, $title, $body, $data);
}
public function sendEvent(Customer $cust, $title, $body, $data = [])
{
// get all v2 devices
$devices = $this->getDevices($cust);
if (empty($devices)) {
return false;
}
// send fcm notification
$result = $this->send(array_keys($devices), $this->translator->trans($title), $this->translator->trans($body), $data);
return $result;
}
protected function getDevices(Customer $cust)
{
$sessions = [];
$cust_user = $job_order->getCustomer()->getCustomerUser();
$device_ids = [];
$cust_user = $cust->getCustomerUser();
if (!empty($cust_user)) {
$sessions = $cust_user->getMobileSessions();
}
if (empty($sessions)) {
error_log("no sessions to send fcm notification to");
return;
return false;
}
$device_ids = [];
// send to every customer session
foreach ($sessions as $sess) {
$device_id = $sess->getDevicePushID();
if (!empty($device_id) && !isset($device_ids[$device_id])) {
// send fcm notification
// send to this device
$device_ids[$device_id] = true;
}
}
if (empty($device_ids)) {
error_log("no devices to send fcm notification to");
return;
return false;
}
// attach jo info
$data['jo_id'] = $job_order->getID();
$data['jo_status'] = $job_order->getStatus();
// send fcm notification
$result = $this->send(array_keys($device_ids), $this->translator->trans($title), $this->translator->trans($body), $data);
return $result;
return $device_ids;
}
}

View file

@ -160,13 +160,19 @@ menu.database.ownershiptypes: 'Ownership Types'
menu.database.serviceofferings: 'Service Offerings'
# fcm jo status updates
jo_fcm_title_outlet_assign: Looking for riders
jo_fcm_title_driver_assigned: Rider found
jo_fcm_title_driver_arrived: Rider nearby
jo_fcm_title_cancelled: Order cancelled
jo_fcm_title_fulfilled: Thank you!
jo_fcm_body_outlet_assign: We're assigning a rider for your order, please wait.
jo_fcm_body_driver_assigned: A rider is on their way.
jo_fcm_body_driver_arrived: Your order is almost there!
jo_fcm_body_cancelled: Your order has been cancelled.
jo_fcm_body_fulfilled: Order complete! Your receipt is ready.
jo_fcm_title_outlet_assign: 'Looking for riders'
jo_fcm_title_driver_assigned: 'Rider found'
jo_fcm_title_driver_arrived: 'Rider nearby'
jo_fcm_title_cancelled: 'Order cancelled'
jo_fcm_title_fulfilled: 'Thank you!'
jo_fcm_body_outlet_assign: 'We`re assigning a rider for your order, please wait.'
jo_fcm_body_driver_assigned: 'A rider is on their way.'
jo_fcm_body_driver_arrived: 'Your order is almost there!'
jo_fcm_body_cancelled: 'Your order has been cancelled.'
jo_fcm_body_fulfilled: 'Order complete! Your receipt is ready.'
# fcm insurance
insurance_fcm_title_updated: 'Application updated'
insurance_fcm_title_completed: 'Application completed'
insurance_fcm_body_updated: 'Some details on your insurance application have been updated.'
insurance_fcm_body_completed: 'Your insurance application has been processed!'