<?php
namespace App\Api;
use App\Middleware\AdminUsersMiddleware;
use App\Middleware\BackgroundProcessingMiddleware;
use App\Middleware\CompanyMiddleware;
use App\Middleware\EmailAckMiddleware;
use App\Middleware\MailgunAckMiddleware;
use App\Middleware\SaleMiddleware;
use App\Middleware\ServerProcessingMiddleware;
use App\Middleware\SessionMiddleware;
use App\Middleware\WebPaySettingsMiddleware;
use App\Util\Format;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use App\Service\MailgunService;
class EmailApi extends AbstractController
{
private $session;
private $format;
private $client;
private $backgroundProcessingMiddleware;
private $companyMiddleware;
private $mailgun;
public function __construct(
Format $format,
SessionInterface $session,
HttpClientInterface $client,
BackgroundProcessingMiddleware $backgroundProcessingMiddleware,
CompanyMiddleware $companyMiddleware,
MailgunService $mailgun
) {
$this->session = $session;
$this->format = $format;
$this->client = $client;
$this->backgroundProcessingMiddleware = $backgroundProcessingMiddleware;
$this->companyMiddleware = $companyMiddleware;
$this->mailgun = $mailgun;
}
/**
* @Route("/api/email/ack/list", name="api_email_ack_list", methods={"GET"})
*/
public function getList(Request $request, EmailAckMiddleware $emailAckMiddleware): JsonResponse
{
if ($this->getParameter('TEST')) {
$this->session->set('company_id', constant("App\\Constant\\Tests::COMPANY_ID"));
}
$parameter = array(
'companyId' => $this->session->get('company_id'),
'contactId' => $request->get('id'),
'search' => $request->get('search'),
'contactType' => $request->get('type'),
'startDate' => $this->format->date($request->get('start_date'), 'Y-m-d'),
'endDate' => $this->format->date($request->get('end_date'), 'Y-m-d'),
'deliveryStatus' => $request->get('delivery_status') ? $request->get('delivery_status') : null,
'field' => $request->get('sort_field') ? $request->get('sort_field') : 'created_date',
'order' => $request->get('sort_order') ? $request->get('sort_order') : 'DESC',
'start' => $request->get('start') ? $request->get('start') : constant("App\\Constant\\Globals::LIMIT_START"),
'end' => $request->get('limit') ? $request->get('limit') : null
);
return new JsonResponse(['email_data' => $emailAckMiddleware->getList($parameter)]);
}
/**
* @Route("/api/email/ack/count", name="api_email_ack_count", methods={"GET"})
*/
public function getCount(Request $request, EmailAckMiddleware $emailAckMiddleware): JsonResponse
{
if ($this->getParameter('TEST')) {
$this->session->set('company_id', constant("App\\Constant\\Tests::COMPANY_ID"));
}
$parameter = array(
'companyId' => $this->session->get('company_id'),
'contactId' => $request->get('id'),
'contactType' => $request->get('type'),
'search' => $request->get('search'),
'startDate' => $this->format->date($request->get('start_date'), 'Y-m-d'),
'endDate' => $this->format->date($request->get('end_date'), 'Y-m-d'),
'deliveryStatus' => $request->get('delivery_status') ? $request->get('delivery_status') : null,
'field' => $request->get('field') ? $request->get('field') : 'created_date'
);
return new JsonResponse($emailAckMiddleware->getCount($parameter));
}
/**
* @Route("/api/email/ack/save", name="api_email_ack_save", methods={"GET"})
*/
public function save(Request $request, EmailAckMiddleware $emailAckMiddleware): JsonResponse
{
$post = json_decode($request->getContent(), true);
$parameter = array(
'companyId' => $this->session->get('company_id'),
'response' => $post['response'],
'messageId' => $post['message_id'],
'webhookResponse' => $post['webhook_response'],
'recipient' => $post['recipient'],
'adminEmail' => $post['admin_email'],
'timestamp' => $post['timestamp'],
'token' => $post['token'],
'deliveryStatus' => $post['delivery_status'],
'deliveryDescription' => $post['delivery_description'],
'emailOpened' => $post['email_opened'],
'status' => $post['status'],
'createdDate' => new \DateTime(),
'updatedDate' => new \DateTime(),
'subject' => $post['subject'],
'contactId' => $post['contact_id'],
'contactRecordId' => $post['contact_record_id'],
'contactType' => $post['contact_type'],
'transactionType' => $post['transaction_type'],
'transactionId' => $post['transaction_id'],
'transactionRecordId' => $post['transaction_record_id'],
'transactionThirdpartyId' => $post['transaction_thirdparty_id']
);
return new JsonResponse(['email_data' => $emailAckMiddleware->getList($parameter)]);
}
/**
* @Route("/api/email/bulk/sale/session", name="api_email_bulk_sale_session_add", methods={"POST"})
*/
public function bulkSaleAddSession(Request $request, SessionMiddleware $sessionMiddleware): JsonResponse
{
if (!$this->session->get('company_id')) {
return new JsonResponse();
}
$post = json_decode($request->getContent(), true);
// $post['sale_id'] = 184;
// $post['receivable_id'] = 3658;
//$post['all'] = true;
if (!isset($post['all']) && !isset($post['sale_id']) && !isset($post['receivable_id'])) {
return new JsonResponse();
}
$parameter = array(
'companyId' => $this->session->get('company_id'),
'adminUser' => $this->session->get('admin_user'),
// '0',
'transactionVisibility' => $this->session->get('transaction_visibility'),
// '0',
'companyUserId' => $this->session->get('company_user_id'),
//'1351',
'status' => '1',
'search' => addslashes($request->get('search')),
'isMulticurrencies' => 0,
'field' => 'selected_date',
'order' => 'ASC',
'start' => null,
'contactTypeFilter' => $request->get('contact_type'),
'contactIdFilter' => $request->get('contact_id'),
'contactRecordIdFilter' => $request->get('contact_record_id'),
'startDateFilter' => $this->format->date($request->get('start_date'), 'Y-m-d'),
'endDateFilter' => $this->format->date($request->get('end_date'), 'Y-m-d'),
'colorFilter' => $request->get('color'),
'typeFilter' => $request->get('type'),
'paymentStatusFilter' => $request->get('status'),
'tileFilter' => $request->get('tile'),
'all' => isset($post['all']) ? $post['all'] : false,
'sale_id' => isset($post['sale_id']) ? $post['sale_id'] : false,
'receivable_id' => isset($post['receivable_id']) ? $post['receivable_id'] : false
);
return new JsonResponse($sessionMiddleware->setBulkEmailSale($parameter));
}
/**
* @Route("/api/email/bulk/sale/session/data", name="api_email_bulk_sale_session_get", methods={"GET"})
*/
public function bulkSaleGetSession(Request $request): JsonResponse
{
if (!$this->session->get('company_id')) {
return new JsonResponse();
}
$count = 0;
if ($this->session->get('bulk_email_selected_sale')) {
if (isset($this->session->get('bulk_email_selected_sale')['sale_id'])) {
$count += count($this->session->get('bulk_email_selected_sale')['sale_id']);
}
if (isset($this->session->get('bulk_email_selected_sale')['receivable_id'])) {
$count += count($this->session->get('bulk_email_selected_sale')['receivable_id']);
}
}
return new JsonResponse(['count' => $count]);
}
/**
* @Route("/api/email/bulk/sale/session/d", name="api_email_bulk_sale_session_delete", methods={"POST"})
*/
public function bulkSaleDeleteSession(Request $request, SessionMiddleware $sessionMiddleware): JsonResponse
{
if (!$this->session->get('company_id')) {
return new JsonResponse();
}
$post = json_decode($request->getContent(), true);
//$post['receivable_id'] = 11212112;
$parameter = array(
'all' => isset($post['all']) ? $post['all'] : true,
'sale_id' => isset($post['sale_id']) ? $post['sale_id'] : false,
'receivable_id' => isset($post['receivable_id']) ? $post['receivable_id'] : false
);
return new JsonResponse($sessionMiddleware->unSetBulkEmailSale($parameter));
}
/**
* @Route("/api/email/bulk/sale/email/initiate", name="api_email_bulk_sale_email_initiate", methods={"POST"})
*/
public function bulkEmailRequestInitiate(Request $request, SessionMiddleware $sessionMiddleware): Response
{
$parameter = array(
'companyId' => $this->session->get('company_id'),
'adminEmail' => $this->session->get('admin_email'),
'selectedId' => $this->session->get('bulk_email_selected_sale'),
'localCurrencySymbol' => $this->session->get('currency_symbol'),
'subdomainUsername' => $this->session->get('subdomain_username'),
'constantMessageFile' => $this->session->get('CONSTANT_MSG_FILE'),
'country' => $this->session->get('country'),
'companyAddress' => $this->session->get('company_address'),
'companyPhone' => $this->session->get('company_phone'),
'companyEmail' => $this->session->get('company_email'),
'federalTaxIdentifier' => $this->session->get('federal_tax_identifier'),
'stateTaxIdentifier' => $this->session->get('state_tax_identifier'),
'imageHostUrl' => $this->getParameter('IMAGE_HOST_PATH'),
'hostUrl' => isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : $request->getSchemeAndHttpHost()
);
$batchSize = 10;
$batches = $this->format->createBatches($this->session->get('bulk_email_selected_sale'), $batchSize);
foreach ($batches['sale_id'] as $chunk) {
$parameter['selectedId']['sale_id'] = $chunk;
$parameter['selectedId']['receivable_id'] = array();
$requestUrl = $parameter['hostUrl'] . '/api/email/bulk/sale/send';
$response = $this->client->request(
'POST',
$requestUrl,
[
'verify_peer' => false,
'timeout' => 600,
'headers' => [
'Accept' => 'application/json',
],
'json' => $parameter,
]
);
$content = $response->getContent();
}
foreach ($batches['receivable_id'] as $chunk) {
$parameter['selectedId']['receivable_id'] = $chunk;
$parameter['selectedId']['sale_id'] = array();
$requestUrl = $parameter['hostUrl'] . '/api/email/bulk/sale/send';
$response = $this->client->request(
'POST',
$requestUrl,
[
'verify_peer' => false,
'timeout' => 600,
'headers' => [
'Accept' => 'application/json',
],
'json' => $parameter,
]
);
$content = $response->getContent();
}
// remove all ids from session
$sessionMiddleware->unSetBulkEmailSale(array('all' => true));
return new Response($content);
}
/**
* @Route("/api/email/bulk/sale/send", name="api_email_bulk_sale_session", methods={"POST"})
*/
public function bulkSaleEmailSend(Request $request): JsonResponse
{
return new JsonResponse(true);
}
/**
* @Route("/api/email/receivable/statement/initiate", name="api_email_receivable_statement_initiate", methods={"POST"})
*/
public function sendEmailStatementSale(Request $request): Response
{
$post = json_decode($request->getContent(), true);
$parameter = array(
'customerIdArr' => $post['customer_ids'],
'companyId' => $this->session->get('company_id'),
'adminEmail' => $this->session->get('admin_email'),
'localCurrencySymbol' => $this->session->get('currency_symbol'),
'constantMessageFile' => $this->session->get('CONSTANT_MSG_FILE'),
'country' => $this->session->get('country'),
'companyAddress' => $this->session->get('company_address'),
'companyPhone' => $this->session->get('company_phone'),
'companyEmail' => $this->session->get('company_email'),
'federalTaxIdentifier' => $this->session->get('federal_tax_identifier'),
'stateTaxIdentifier' => $this->session->get('state_tax_identifier'),
'imageHostUrl' => $this->getParameter('IMAGE_HOST_PATH'),
'hostUrl' => isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : $request->getSchemeAndHttpHost(),
'subdomainUsername' => $this->session->get('subdomain_username')
);
$requestUrl = $parameter['hostUrl'] . '/api/email/receivable/statement';
$response = $this->client->request(
'POST',
$requestUrl,
[
'verify_peer' => false,
'headers' => [
'Accept' => 'application/json',
],
'json' => $parameter
]
);
$content = $response->getContent();
return new Response($content);
}
/**
* @Route("/api/email/receivable/statement", name="api_email_receivable_statement", methods={"POST"})
*/
public function receivableStatementSend(Request $request): JsonResponse
{
return new JsonResponse(true);
}
/**
* @Route("/api/bulk/sale/email/resend", name="api_email_bulk_resend", methods={"GET"})
*/
public function bulkEmailResendInitiate(Request $request, AdminUsersMiddleware $adminUsersMiddleware, WebPaySettingsMiddleware $webPaySettingsMiddleware, ServerProcessingMiddleware $serverProcessingMiddleware): Response
{
$authHeader = "";
// Try using apache_request_headers (works in Apache)
if (function_exists('apache_request_headers')) {
$headers = apache_request_headers();
if (isset($headers['Authorization'])) {
$authHeader = $headers['Authorization'];
} elseif (isset($headers['authorization'])) {
$authHeader = $headers['authorization']; // lowercase fallback
}
}
if ($authHeader !== "Ty7JQsyqMhc1gCItvmGp54JmPu75lq6MIblpQK7UWcXKV2dpABpTkpXxVM3M97I3") {
$errorParameter = array(
'log' => '/log/Notification/InvoiceNotification.log',
'message' => 'Auth Failed'
);
$this->backgroundProcessingMiddleware->enterLog($errorParameter);
return new Response('Auth Failed');
}
$bgDataWithCompany = $this->backgroundProcessingMiddleware->getCronData(array('withCompany' => true));
$companyId = '';
if (isset($bgDataWithCompany[0]['company_id']) && !empty($bgDataWithCompany[0]['company_id'])) {
$companyId = $bgDataWithCompany[0]['company_id'];
$serverProcessingData = $serverProcessingMiddleware->getData(array('companyId' => $companyId));
if (isset($serverProcessingData['id']) && !empty($serverProcessingData['id'])) {
$errorParameter = array(
'log' => '/log/Notification/InvoiceNotification.log',
'message' => 'Processing Ongoing for - ' . $companyId
);
$this->backgroundProcessingMiddleware->enterLog($errorParameter);
return new Response('Processing Ongoing');
}
$serverProcessingMiddleware->save(array('companyId' => $companyId, 'serverIp' => $_SERVER['REMOTE_ADDR'], 'updatedDate' => new \DateTime()));
$params = array();
$params['to'] = 'himanshu@priority-software.com,rahul@priority-software.com';
$params['subject'] = "Email cron for Company Id - " . $companyId;
$params['html'] = "<html><head><style>a{background: #1991EB !important;border:1px solid #1585D8 !important;padding: 6px 20px 6px 20px;color: #fff !important;text-decoration: none;font-size: 14px;}</style></head></html>
Hello Admin
<br/><br/>
A cron for resending an email has triggered for Company Id: " . $companyId . "
<br/><br/>
Sincerely
<br/>
AccountEdge Connect Team";
$params['body'] = "Hello Admin
A cron for resending an email has triggered for Company Id: " . $companyId . "
Sincerely
AccountEdge Connect Team";
$this->mailgun->sendEmail($params);
$companyData = $this->companyMiddleware->get(array('companyId' => $companyId));
if (isset($companyData) && !empty($companyData)) {
$companyData = json_decode($companyData, true);
$adminUserData = $adminUsersMiddleware->get(array('companyId' => $companyId));
$webPayData = $webPaySettingsMiddleware->get(array('companyId' => $companyId));
$webPayData = json_decode($webPayData, true);
$companyAddress = '';
if (isset($companyData['fileCompanyName'])) {
$companyAddress .= $companyData['fileCompanyName'] . ', ';
}
if (isset($companyData['address'])) {
$companyAddress .= $companyData['address'] . PHP_EOL;
}
if (isset($companyData['address2'])) {
$companyAddress .= $companyData['address2'] . PHP_EOL;
}
if (isset($companyData['city'])) {
$companyAddress .= $companyData['city'] . ' ';
}
if (isset($companyData['state'])) {
$companyAddress .= $companyData['state'] . ' ';
}
if (isset($companyData['zipcode'])) {
$companyAddress .= $companyData['zipcode'] . ' ';
}
$messageFile = 'EnglishUS';
switch ($companyData['country']) {
case 2:
$messageFile = 'EnglishUK';
break;
case 4:
$messageFile = 'EnglishCA';
break;
}
$parameter = array(
'companyId' => $companyId,
'adminEmail' => $adminUserData['email'],
// 'selectedId' => $initiatedData,
'localCurrencySymbol' => $companyData['currencySymbol'],
'subdomainUsername' => $webPayData['subdomainUsername'],
'constantMessageFile' => $messageFile,
'country' => $companyData['country'],
'companyAddress' => $companyAddress,
'companyPhone' => $companyData['phone'],
'companyEmail' => $companyData['companyEmail'],
'federalTaxIdentifier' => $companyData['federalTaxIdentifier'],
'stateTaxIdentifier' => $companyData['stateTaxIdentifier'],
'imageHostUrl' => $this->getParameter('IMAGE_HOST_PATH'),
'hostUrl' => isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : $request->getSchemeAndHttpHost()
);
$bgData = $this->backgroundProcessingMiddleware->getCronData(array('companyId' => $companyId));
foreach ($bgData as $key => $data) {
if (isset($data['initiated_data']) && !empty($data['initiated_data'])) {
$initiatedData = json_decode($data['initiated_data'], true);
if ((isset($initiatedData['sale_id']) && !empty($initiatedData['sale_id'])) || (isset($initiatedData['receivable_id']) && !empty($initiatedData['receivable_id']))) {
$this->backgroundProcessingMiddleware->updateMultiple(array('companyId' => $companyId, 'uniqueKey' => $data['unique_key'], 'emailRequestInitiated' => '1'));
$parameter['selectedId'] = $initiatedData;
$requestUrl = $parameter['hostUrl'] . '/api/email/bulk/sale/send';
$response = $this->client->request(
'POST',
$requestUrl,
[
'verify_peer' => false,
'timeout' => 600,
'headers' => [
'Accept' => 'application/json',
],
'json' => $parameter,
]
);
$content = $response->getContent();
}
}
}
$serverProcessingMiddleware->delete(array('companyId' => $companyId, 'serverIp' => $_SERVER['REMOTE_ADDR']));
}
}
return new Response('Processing Completed');
}
}