<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use FOS\RestBundle\Controller\AbstractFOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use App\Clases\Validations\DocumentoValidaClass;
use App\Clases\Doc\BoletaAfecta;
use App\Clases\Doc\FacturaAfectaClass;
use App\Clases\Doc\NotaCreditoClass;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Lock\Store\SemaphoreStore;
/* Entities */
use App\Entity\Empresa;
use App\Entity\Magento;
use Symfony\Component\HttpClient\HttpClient;
/* Clases */
use App\Clases\MagentoClass;
use App\Clases\WebfacturaClass;
use App\Entity\MagentoOrder;
/* Oauth */
// use OAuth\Common\Consumer\Credentials;
// use OAuth\Common\Http\Exception\TokenResponseException;
// use OAuth\Common\Storage\Memory;
// use OAuth\OAuth1\Signature\Signature;
// use OAuth\OAuth1\Service\Magento as MagentoService;;
/**
* API Controller.
* @Route("/api/v3/pos", name="api_controller_")
*/
class ApiController extends AbstractFOSRestController
{
const CURRENT_FILE_NAME = 'ApiController';
/**
* @var LoggerInterface
*/
private $logger;
private $em;
private $logController;
public function __construct(LoggerInterface $logger,EntityManagerInterface $em, LogController $logController)
{
$this->logger = $logger;
$this->em = $em;
$this->logController = $logController;
}
/**
* Genera la Conexion con la integracion Magento
* @Rest\Get("/getDocumentsFiltered/data.json/")
*
* @return Response
*/
public function return80mmUrl(Request $request){
$em = $this->getDoctrine()->getManager();
$empresaId = 809;
$responseMessage = [];
$magentoEntity = $em->getRepository(Magento::class)->findOneBy(['empresa_id' => $empresaId]);
$empresaEntity = $em->getRepository(Empresa::class)->findOneBy(array('webfactura_id' => $empresaId));
try {
$resource = $request->query->get('resource', '80MM');
$nOrden = $request->query->get('nro_orden', '');
$store = new SemaphoreStore();
$factory = new LockFactory($store);
$lock = $factory->createLock($nOrden);
if ($lock->acquire()) {
$searchCriteria['filterGroups'][] = [
'filters' => [
[
'field' => 'increment_id',
'value' => $nOrden,
'conditionType' => 'eq'
]
]
];
$orderRequest = MagentoClass::getOrdersFiltered($em, $empresaEntity, $magentoEntity, $searchCriteria);
if(array_key_exists('status', $orderRequest) && $orderRequest['status'] == 'OK'){
$orders = $orderRequest['content']['items'] ?? [];
$order = $orders[0] ?? [];
if($order){
// foreach($orders as $order){
// $orderId = $order['entity_id'] ?? '';
// $order_increment_id = $order['increment_id'] ?? '';
// }
$orderId = $order['entity_id'] ?? '';
$order_status = $order['status'] ?? '';
// Validaciones para generar el documento
$generaDoc = false;
$docTipoId = '';
DocumentoValidaClass::validaGeneraDocumento($em, $empresaId, $order, 0, $responseMessage, $generaDoc, $docTipoId);
if($generaDoc){
switch($docTipoId){
case 39:
$class = new BoletaAfecta($em, $order, $empresaEntity);
break;
case 33:
$class = new FacturaAfectaClass($em, $order, $empresaEntity);
break;
case 61:
$class = new NotaCreditoClass($em, $order, $empresaEntity);
break;
default:
$responseMessage['message'] = 'Ocurrio un error al asignar el docTipo';
return new JsonResponse($responseMessage);
break;
}
$arrDoc = $class->generateArrayOrder();
$tokenWFRequest = WebfacturaClass::getTokenWF($em, $empresaId, $empresaEntity);
if(array_key_exists('status', $tokenWFRequest) && $tokenWFRequest['status'] == 'OK'){
$tokenWF = $tokenWFRequest['token'];
$sendDocRequest = WebfacturaClass::postDoc($em, $empresaId, $tokenWF, $arrDoc);
if(array_key_exists('status', $sendDocRequest) && $sendDocRequest['status'] == 'OK'){
$sendDocContent = $sendDocRequest['content'];
$pdfUrl = $sendDocContent['DocumentoDTE']['PDFUrl'] ?? '';
$folio = $sendDocContent['DocumentoDTE']['Folio'] ?? 0;
// Generamos un comentario en Magento con el link del pdf
if($pdfUrl){
$commentOrderText = '\n\nPuedes descargar el documento PDF desde el siguiente enlace: ' . $pdfUrl;
$postCommentRequest = MagentoClass::uploadOrderComment($em, $empresaEntity, $magentoEntity, $orderId, $commentOrderText, $order_status);
$responseMessage['upload-comment-response'] = $postCommentRequest;
}
$magentoOrderEntity = $em->getRepository(MagentoOrder::class)->createAndPersistMagentoOrder(
$empresaId, $order, $folio, $docTipoId, $pdfUrl
);
return new jsonResponse(['docUrl' => $pdfUrl . '/3']);
}
}
}
elseif(array_key_exists('orderEntityId', $responseMessage[0])){
$magentoOrderRepository = $em->getRepository(MagentoOrder::class);
$magentoOrderEntity = $magentoOrderRepository->findOneById($responseMessage[0]['orderEntityId']);
$pdfUrl = $magentoOrderEntity->getPdfUrl();
return new jsonResponse(['docUrl' => $pdfUrl . '/3']);
}
}
else{
$responseMessage['status'] = 'ERR';
$responseMessage['message'] = 'No se encuentra orden en magento';
$this->logController->saveJson($empresaId, 'jsonNotFound', $orderRequest, $nOrden);
}
}
else{
$responseMessage['status'] = 'ERR';
$responseMessage['message'] = 'Error al obtener las ordenes de Magento.';
$responseMessage['content'] = $orderRequest['content'];
}
}
}
catch (\Exception $e) {
$lineNumber = $e->getLine();
$file = $e->getFile();
$responseMessage['message'] = 'Error: ' . $e->getMessage() . ' En la linea: ' . $lineNumber . ' - ' . __FUNCTION__ . ' Archivo: ' . $file;
$responseMessage['status'] = 'ERR';
$this->logger->error($responseMessage['message']);
return new jsonResponse($responseMessage);
}
finally {
// LiberaciĆ³n del bloqueo al finalizar
$lock->release();
}
}
}