src/Controller/ApiMultivendeController.php line 47

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Clases\MultivendeClass;
  4. use App\Entity\Empresa;
  5. use App\Entity\MultivendeAssoc;
  6. use App\Entity\WebhookMultivende;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use FOS\RestBundle\Controller\AbstractFOSRestController;
  10. use FOS\RestBundle\Controller\Annotations as Rest;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Psr\Log\LoggerInterface;
  15. /**
  16. * API Multivende Controller.
  17. * @Route("/api/multivende", name="api_multivendeController_")
  18. */
  19. class ApiMultivendeController extends AbstractFOSRestController
  20. {
  21.     const CONTROLLER_NAME 'ApiMultivendeController';
  22.     /**
  23.      * @var LoggerInterface
  24.      */
  25.     private $logger;
  26.     private $em;
  27.     private $logController;
  28.     public function __construct(LoggerInterface $logger,EntityManagerInterface $emLogController $logController)
  29.     {
  30.         $this->logger $logger;
  31.         $this->em $em;
  32.         $this->logController $logController;
  33.     }
  34.     /**
  35.     * Captura los webhooks de Multivende
  36.     * @Rest\Post("/callback")
  37.     *
  38.     * @return Response
  39.     */
  40.     public function callbackMultivende(Request $request){
  41.         $em $this->getDoctrine()->getManager();
  42.         $jsonContent $request->getContent();
  43.         $jsonArr json_decode($jsonContenttrue);
  44.         $response = new JsonResponse();
  45.         $responseMessage = [];
  46.         
  47.         try{
  48.             $ruta $this->logController->getFolder('1-9'null'webhook');
  49.             $webhookResource $jsonArr['resource'];
  50.             $webhookFileName $webhookResource '_' date('Ymd_His');
  51.             file_put_contents($ruta .'/'$webhookFileName ".json"$jsonContent);
  52.             $responseMessage['messages'][] = 'Recepcion del webhook  ' .  $webhookResource ' - OK';
  53.         }
  54.         catch(\Exception $e){
  55.             $lineNumber $e->getLine();
  56.             $response->setStatusCode(400);
  57.             $responseMessage['status'] = 'ERR';
  58.             $responseMessage['message'] = $e->getMessage()   . ' En la linea: ' $lineNumber ' - '  __FUNCTION__ ' - ' .  self::CONTROLLER_NAME;
  59.             $this->logger->error($e->getMessage() . ' En la linea: ' $lineNumber ' - '  __FUNCTION__ ' - ' .  self::CONTROLLER_NAME);
  60.         }
  61.         
  62.         $response->setJson(json_encode($responseMessage));
  63.         return $response;
  64.     }
  65.     /**
  66.     * Esta funcion recibe la empresaId y verifica si existe creada previamente en el sistema
  67.     * en caso de no existir, se procede a la instalacion de la app en multivende
  68.     * en caso de existir, se debe realizar el status del code (expiration_time)
  69.     * @Rest\Get("/verifyMultivendeInstall/{empresaId}")
  70.     *
  71.     * @return Response
  72.     */
  73.     public function verifyMultivendeInstall(Request $request$empresaId){
  74.         $em $this->getDoctrine()->getManager();
  75.         $response = new JsonResponse();
  76.         $responseMessage = array();
  77.         // $multivendeClass = new MultivendeClass();
  78.         // $jsonArr = json_decode($request->getContent(), true);
  79.         // $empresaId = $jsonArr['empresaId'] ?? '';
  80.         if($empresaId){
  81.             $empresaEntity $em->getRepository(Empresa::class)->findOneBy(array('webfactura_id' => $empresaId));
  82.             if($empresaEntity){
  83.                 //Empresa con app instalada
  84.                 $responseMessage['install'] = false;
  85.                 $responseMessage['updateCode'] = false;
  86.                 //Verificar status Code
  87.                 $multivendeEntity $em->getRepository(MultivendeAssoc::class)->findOneBy(array('empresa_id' => $empresaId));
  88.                 $accessToken MultivendeClass::verifyToken($em$multivendeEntity);
  89.                 if($accessToken){
  90.                     // Token obtenido correctamente
  91.                     $responseMessage['status'] = 'OK';
  92.                     $responseMessage['expiration'] = $multivendeEntity->getExpiresAt()->format('Y-m-d H:i:s');
  93.                 }
  94.                 else{
  95.                     // El token ha expirado, se requiere actualizar code
  96.                     $responseMessage['status'] = 'ERR';
  97.                     $responseMessage['updateCode'] = true;
  98.                 }
  99.             }
  100.             else{
  101.                 //Empresa Nueva retornar Url multivende
  102.                 $scopes 'read:stocks,write:stocks,read:checkouts,read:products,write:products,read:clients';
  103.                 $url MultivendeClass::getPermisionUrl($request$scopes);
  104.                 $responseMessage['install'] = true;
  105.                 $responseMessage['returnMultivendeUrl'] = $url;
  106.             }
  107.         }
  108.         else{
  109.             $response->setStatusCode(400);
  110.             $responseMessage['status'] = 'ERR';
  111.             $responseMessage['message'] = 'Debe  incluir empresaId';
  112.         }
  113.         $response->setJson(json_encode($responseMessage));
  114.         return $response;
  115.     }
  116.     /**
  117.     * Esta funcion recibe la empresaId y el nuevo code a actualizar
  118.     * JSON {"empresaId": 1, "code": "XXX"}
  119.     * @Rest\POST("/updateCode")
  120.     *
  121.     * @return Response
  122.     */
  123.     public function updateCode(Request $request){
  124.         $em $this->getDoctrine()->getManager();
  125.         $response = new JsonResponse();
  126.         $responseMessage = array();
  127.         $jsonArr json_decode($request->getContent(), true);
  128.         $empresaId $jsonArr['empresaId'] ?? '';
  129.         $code $jsonArr['code'] ?? '';
  130.         if($empresaId && $code){
  131.             $multivendeEntity $em->getRepository(MultivendeAssoc::class)->findOneBy(array('empresa_id' => $empresaId));
  132.             if($multivendeEntity){
  133.                 $multivendeEntity->setCode($code);
  134.                 $em->persist($multivendeEntity);
  135.                 $em->flush();
  136.                 $responseMessage['code'] = 'Codigo actualizado correctamente';
  137.                 //Obtener nuevo Access Token con el nuevo Code
  138.                 $accessToken MultivendeClass::getAccessToken($em$multivendeEntity);
  139.                 if($accessToken){
  140.                     $responseMessage['status'] = 'OK';
  141.                     $responseMessage['message'] = 'Token de acceso: ' $accessToken;
  142.                 }
  143.                 else{
  144.                     $responseMessage['message'] = 'No se pudo obtener el token, actualize access token.';
  145.                     $responseMessage['updateCode'] = true;
  146.                 }
  147.             }
  148.             else{
  149.                 $response->setStatusCode(400);
  150.                 $responseMessage['message'] = 'No se encontro la instalacion de la empresa';
  151.             }
  152.                 
  153.         }
  154.         else{
  155.             $response->setStatusCode(400);
  156.             $responseMessage['status'] = 'ERR';
  157.             $responseMessage['message'] = 'Debe  incluir empresaId y codigo';
  158.         }
  159.         $response->setJson(json_encode($responseMessage));
  160.         return $response;
  161.     }
  162.     /**
  163.     * Funcion que recibe un json con los datos de la empresa y crea la conexion
  164.     * JSON {"empresaId": 1, "empresaRut": "XXX", "empresaRazonSocial": "XXX", "wfClientId": "1_XXX", "wfClientSecret":  "***" }
  165.     * @Rest\POST("/createMultivendeConection")
  166.     *
  167.     * @return Response
  168.     */
  169.     public function createMultivendeConection(Request $request){
  170.         $em $this->getDoctrine()->getManager();
  171.         $response = new JsonResponse();
  172.         $responseMessage = array();
  173.         $jsonArr json_decode($request->getContent(), true);
  174.         $empresaId $jsonArr['empresaId'] ?? '';
  175.         try{
  176.             if($empresaId){
  177.                 $empresaRut $jsonArr['empresaRut'] ?? '';
  178.                 $empresaRazonSocial $jsonArr['empresaRazonSocial'] ?? '';
  179.                 $wfClientId $jsonArr['wfClientId'] ?? '';
  180.                 $wfClientSecret $jsonArr['wfClientSecret'] ?? '';
  181.                 $empresaGiro $jsonArr['empresaGiro'] ?? '';
  182.                 $empresaDireccion $jsonArr['empresaDireccion'] ?? '';
  183.                 $empresaComuna $jsonArr['empresaComuna'] ?? '';
  184.                 $empresaCiudad $jsonArr['empresaCiudad'] ?? '';
  185.                 $empresaTelefono $jsonArr['empresaTelefono'] ?? '';
  186.                 $empresaCorreo $jsonArr['empresaCorreo'] ?? '';
  187.                 $empresaPrecioBruto $jsonArr['empresaPrecioBruto'] ?? '';
  188.                 $empresaPrecioNeto $jsonArr['empresaPrecioNeto'] ?? '';
  189.                 $empresaActividadEconomica $jsonArr['empresaActividadEconomica'] ?? '';
  190.     
  191.                 $empresaEntity $em->getRepository(Empresa::class)->findOneBy(array('webfactura_id' => $empresaId));
  192.                 if(!$empresaEntity){
  193.                     $empresaEntity = new Empresa;
  194.                 }
  195.     
  196.                 $empresaEntity->setEmpresaRut($empresaRut);
  197.                 $empresaEntity->setEmpresaRazonSocial($empresaRazonSocial);
  198.                 $empresaEntity->setWebfacturaId($empresaId);
  199.                 $empresaEntity->setWebfacturaClientId($wfClientId);
  200.                 $empresaEntity->setWebfacturaClientSecret($wfClientSecret);
  201.                 $empresaEntity->setEmpresaGiro($empresaGiro);
  202.                 $empresaEntity->setEmpresaDireccion($empresaDireccion);
  203.                 $empresaEntity->setEmpresaComuna($empresaComuna);
  204.                 $empresaEntity->setEmpresaCiudad($empresaCiudad);
  205.                 $empresaEntity->setEmpresaTelefono($empresaTelefono);
  206.                 $empresaEntity->setEmpresaCorreo($empresaCorreo);
  207.                 $empresaEntity->setPrecioBruto($empresaPrecioBruto);
  208.                 $empresaEntity->setPrecioNeto($empresaPrecioNeto);
  209.                 $empresaEntity->setEmpresaActividadEconomica($empresaActividadEconomica);
  210.                 $em->persist($empresaEntity);
  211.                 $em->flush();
  212.     
  213.                 $multivendeEntity $em->getRepository(MultivendeAssoc::class)->findOneBy(array('empresa_id' => $empresaId));
  214.                 if(!$multivendeEntity){
  215.                     $multivendeEntity = new MultivendeAssoc;
  216.                 }
  217.                 $multivendeEntity->setEmpresaId($empresaId);
  218.                 $multivendeEntity->setActive(1);
  219.                 $multivendeEntity->setClientId(MultivendeClass::CLIENT_ID);
  220.                 $multivendeEntity->setClientSecret(MultivendeClass::CLIENT_SECRET);
  221.                 $em->persist($multivendeEntity);
  222.                 $em->flush();
  223.                 $responseMessage['status'] = 'OK';
  224.                 $responseMessage['message'] = 'Conexion Creada correctamente';
  225.             }
  226.             else{
  227.                 $response->setStatusCode(400);
  228.                 $responseMessage['status'] = 'ERR';
  229.                 $responseMessage['message'] = 'Debe  incluir empresaId y codigo';
  230.             }
  231.         }
  232.         catch(\Exception $e){
  233.             $lineNumber $e->getLine();
  234.             $response->setStatusCode(400);
  235.             $responseMessage['status'] = 'ERR';
  236.             $responseMessage['message'] = $e->getMessage()   . ' En la linea: ' $lineNumber ' - '  __FUNCTION__ ' - ' .  self::CONTROLLER_NAME;
  237.             $this->logger->error($e->getMessage() . ' En la linea: ' $lineNumber ' - '  __FUNCTION__ ' - ' .  self::CONTROLLER_NAME);
  238.         }
  239.         $response->setJson(json_encode($responseMessage));
  240.         return $response;
  241.     }
  242.     /**
  243.     * procesa estructura de refreshToken
  244.     * @Rest\POST("/refreshTokenJson")
  245.     *
  246.     * @return Response
  247.     */
  248.     public function refreshTokenJson(Request $request){
  249.         $em $this->getDoctrine()->getManager();
  250.         $response = new JsonResponse();
  251.         $responseMessage = array();
  252.         $jsonArr json_decode($request->getContent(), true);
  253.         $merchantId $jsonArr['MerchantId'] ?? '';
  254.         if($merchantId){
  255.             $multivendeEntity $em->getRepository(MultivendeAssoc::class)->findOneBy(array('merchant_id' => $merchantId));
  256.             $accessToken $jsonArr['token'] ?? '';
  257.             $refreshToken $jsonArr['refreshToken'] ?? '';
  258.             $expiresAt $jsonArr['expiresAt'] ?? '';
  259.             $refreshTokenExpiresAt $jsonArr['refreshTokenExpiresAt'] ?? '';
  260.     
  261.             if($accessToken){
  262.                 $multivendeEntity->setAccessToken($accessToken);
  263.             }
  264.             else{
  265.                 $responseMessage['message'][] = 'No incluye el AccessToken';
  266.             }
  267.             
  268.             
  269.     
  270.             if($refreshToken){
  271.                 $multivendeEntity->setRefreshToken($refreshToken);
  272.             }
  273.             else{
  274.                 $responseMessage['message'][] = 'No incluye el refreshToken';
  275.             }
  276.     
  277.     
  278.             if($expiresAt){
  279.                 $utcDateTime = new \DateTime($expiresAt, new \DateTimeZone("UTC"));
  280.                 $chileTimeZone = new \DateTimeZone("America/Santiago");
  281.                 $chileDateTime $utcDateTime->setTimezone($chileTimeZone);
  282.     
  283.                 $multivendeEntity->setExpiresAt($chileDateTime);
  284.             }
  285.             else{
  286.                 $responseMessage['message'][] = 'No incluye el expiresAt';
  287.             }
  288.             
  289.             if($refreshTokenExpiresAt){
  290.                 $utcRefreshDateTime = new \DateTime($refreshTokenExpiresAt, new \DateTimeZone("UTC"));
  291.                 $chileRefreshTimeZone = new \DateTimeZone("America/Santiago");
  292.                 $chileRefreshTimeZone $utcRefreshDateTime->setTimezone($chileRefreshTimeZone);
  293.     
  294.                 $multivendeEntity->setRefreshTokenExpiresAt($chileRefreshTimeZone);
  295.             }
  296.             else{
  297.                 $responseMessage['message'][] = 'No incluye el refreshTokenExpiresAt';
  298.             }
  299.     
  300.             $em->persist($multivendeEntity);
  301.             $em->flush();
  302.             $responseMessage['message'][] = 'Se modifica multivendeEntity con los datos proporcionados';
  303.             $responseMessage['contenido'] = $jsonArr;
  304.             
  305.         }
  306.         else{
  307.             $response->setStatusCode(400);
  308.             $responseMessage['message'] = 'Debe incluir el merchantId en el json';
  309.             $responseMessage['status'] = 'ERR';
  310.         }
  311.         $response->setJson(json_encode($responseMessage));
  312.         return $response;
  313.     }
  314.     /**
  315.     * Verifica Obtencion AccessToken de una empresa
  316.     * @Rest\GET("/getAccessToken/{empresaId}")
  317.     *
  318.     * @return Response
  319.     */
  320.     public function getAccessToken(Request $request$empresaId){
  321.         $em $this->em;
  322.         $response = new JsonResponse();
  323.         $responseMessage = array();
  324.         $multivendeEntity $em->getRepository(MultivendeAssoc::class)->findOneBy(array('empresa_id' => $empresaId));
  325.         try{
  326.             if($multivendeEntity){
  327.                 $accessToken MultivendeClass::verifyToken($em$multivendeEntity);
  328.                 if($accessToken){
  329.                     $responseMessage['Message'] = 'Access Token obtenido correctamente';
  330.                     $responseMessage['status'] = 'OK';
  331.                     $responseMessage['accessToken'] = $accessToken;
  332.                 }
  333.                 else{
  334.                     $response->setStatusCode(400);
  335.                     $responseMessage['Message'] = 'Error al obtener el token, actualice el code para la empresa ID: ' $empresaId;
  336.                     $responseMessage['status'] = 'ERR';
  337.                 }
  338.             }
  339.             else{
  340.                 $response->setStatusCode(400);
  341.                 $responseMessage['Message'] = 'No se pudo encontrar la instalacion con Multivende para la empresa ID: ' $empresaId;
  342.                 $responseMessage['status'] = 'ERR';
  343.             }
  344.         }
  345.         catch(\Exception $e){
  346.             $lineNumber $e->getLine();
  347.             $response->setStatusCode(400);
  348.             $responseMessage['Message'] = 'Error: '$e->getMessage() . ' En la linea: ' $lineNumber ' - '  __FUNCTION__ ' - ' .  self::CONTROLLER_NAME;
  349.             $responseMessage['status'] = 'ERR';
  350.             $this->logger->error($e->getMessage() . ' En la linea: ' $lineNumber ' - '  __FUNCTION__ ' - ' .  self::CONTROLLER_NAME);
  351.         }
  352.         $response->setJson(json_encode($responseMessage));
  353.         return $response;
  354.     }
  355. }