<?php

class Seguro_TransmissaoessorController extends Agro_Controller_Proposta {
	protected $_paginator = false;
	public $wsdl;
	public $propostas_erros = array();
	public $propostas_enviadas = array();

	public function getModel() {
		return new Seguro_Model_TransmissaoEssor();
	}

	public function init() {
	    ini_set('memory_limit','1024M');
		$this->view->title = 'Seguro » Transmissão';
		require_once(APPLICATION_PATH . "/../library/Agro/nusoap/nusoap.php");
	}

	/**
	 * Monta a tela de pesquisa de propostas
	 *
	 */
	public function indexAction() {
		$this->view->form = new Seguro_Form_TransmissaoEssorSearch();
	}

	public function listAction() {
		$this->getHelper('layout')->disableLayout();
		$where = $this->getFilter();
		$Model = $this->getModel();

		$this->view->request = $this->getRequest()->getParams();

		// Habilita ou Desabilita a paginacao pelo combo na tela
		$this->_paginator = $this->getRequest()->getParam('show_paginacao');
		$recordsPerPage = ($this->recordsPerPage ? $this->recordsPerPage :  RECORDS_PER_PAGE);

		if ($this->getRequest()->getParam("o")) {
			$Model->_order = trim($this->getRequest()->getParam("o") .' '. $this->getRequest()->getParam("s"));
		}

		$this->view->form = $this->getForm();
		$Rs = $Model->fetchAllPaginator($where, $this->getRequest()->getParam('page'), $recordsPerPage, $this->_paginator);

		$this->view->paginator = $Rs;
	}

	public function getFilter() {

		if ($this->getRequest()->getParam('pesquisar_por') && $this->getRequest()->getParam('vl_pesquisar_por') != '') {

			if($this->getRequest()->getParam('pesquisar_por') == 'spr.id'){
				$tmp = explode(" ", trim($this->getRequest()->getParam('vl_pesquisar_por')));
				$ids = implode(',', $tmp);

				if (count($tmp) > 1) {
					$where[] = "spe.id_endosso in (select id_endosso from seguro.propostas where id in ($ids))";
				} else {
					$where[] = "spe.id_endosso = (select id_endosso from seguro.propostas where id = ($ids))";
				}
			} else {
				$where[] = $this->getRequest()->getParam('pesquisar_por')." = ".trim($this->getRequest()->getParam('vl_pesquisar_por'));
			}
		}
		
		if ($this->getRequest()->getParam('fl_fisico_recebido') == '1') {
			$where[] = "pfb.id_proposta = spr.id";
		}
		
		if ($this->getRequest()->getParam('fl_pago_boleto') == '1') {
			$where[] = array(
					'field' => 'spb.fl_pago',
					'operator' => '=',
					'value' => $this->getRequest()->getParam('fl_pago_boleto')
			);
		}
		
		if ($this->getRequest()->getParam('fl_endosso') == '1') {
			$where[] = array(
					'field' => 'seguro.nr_endosso(spr.id, spr.id_endosso)',
					'operator' => '>',
					'value' => '0'
			);
		}		

		if ($this->getRequest()->getParam('id_safra') > 0) {
			$where[] = array(
					'field' => 'ppr.id_safra',
					'operator' => '=',
					'value' => $this->getRequest()->getParam('id_safra')
			);
		}

		if ($this->getRequest()->getParam('id_produto') > 0) {
			$where[] = array(
					'field' => 'ppr.id',
					'operator' => '=',
					'value' => $this->getRequest()->getParam('id_produto')
			);
		}

		if ($this->getRequest()->getParam('id_corretor') > 0) {
			$where[] = array(
					'field' => 'spc.id_usuario',
					'operator' => '=',
					'value' => $this->getRequest()->getParam('id_corretor')
			);
		}

		switch ($this->getRequest()->getParam('filtro_acao')){
		    case 'solicitarconsulta':
		        $where[] = " sst.ds_chave in ('AGUARDANDO_VISTORIA_PREVIA', 'AGUARDANDO_ENVIO_SEG') ";
		        //$where[] = " sst.ds_chave in ('AGUARDANDO_VISTORIA_PREVIA', 'AGUARDANDO_ENVIO_SEG', 'ENVIADA_AGUARDANDO_CONF', 'CONF_PENDENCIAS', 'APOLICE_EMITIDA', 'TRANSMITIDA_SEGURADORA') ";
		        $where[] = " pcc.fl_solicitacao_pendente = 't' ";
		        $where[] = " pv.fl_pendente_transmissao = 'f' ";
		        break;

	        case 'retornoconsulta':
	            $where[] = " sst.ds_chave in ('AGUARDANDO_VISTORIA_PREVIA', 'AGUARDANDO_ENVIO_SEG', 'ENVIADA_AGUARDANDO_CONF') ";
	            $where[] = " pcc.fl_solicitacao_pendente = 'f' ";
	            $where[] = " pcc.fl_retorno_pendente = 't' ";
	            $where[] = " pv.fl_pendente_transmissao = 'f' ";
	            break;

            case 'liberaremissao':
                $where[] = " sst.ds_chave in ('TRANSMITIDA_SEGURADORA','AGUARDANDO_ENVIO_SEG') ";
                //$where[] = " pcc.fl_solicitacao_pendente = 't' ";
                $where[] = " pv.fl_pendente_transmissao = 'f' ";

                break;
            default:
                $where[] = " sst.ds_chave in ('AGUARDANDO_VISTORIA_PREVIA', 'AGUARDANDO_ENVIO_SEG') ";
                $where[] = " pcc.fl_solicitacao_pendente = 't' ";
                $where[] = " pv.fl_pendente_transmissao = 'f' ";
		}
		return $where;
	}

	public function solicitarconsultaAction(){
	    $this->isAjax();

	    $Propostas = new Seguro_Model_Propostas();
	    $Transmissao = $this->getModel();

	    $result = array("status"=>true, "dados"=>"", "message"=>"");
	    $arquivo_OK   = time()."_SOLICITAR_CONSULTA_SISSER_OK.txt";
	    $arquivo_ERRO = time()."_SOLICITAR_CONSULTA_SISSER_ERRO.txt";

	    $propostas = $this->getRequest()->getParam("id_proposta");

	    if ($this->getRequest()->getParam("id_proposta")){
	        foreach($propostas as $chave => $proposta){

	            $ModelProposta = new Seguro_Model_Propostas();
	            $Proposta      = $ModelProposta->find($proposta)->current();

	            if (APPLICATION_ENV != 'production') {
	            	$client = new nusoap_client(WSDL_DEV, true, false, false, false, false, 3600, 3600);
	            } else {
	            	$client = new nusoap_client(WSDL_PROD, true, false, false, false, false, 3600, 3600);
	            }

                $mysoapmsg  = "<i4proerp><autoriza_consula_mapa id_endosso='".$Proposta->ds_identificador_seguradora."'></autoriza_consula_mapa></i4proerp>";
                $params     = array('Servico' => 'AutorizaConsultaMapaEndosso', 'conteudoXML' => $mysoapmsg);

				$dtEnvio = date('Y-m-d H:i:s');
                $result     = $client->call('Executar', array($params));
				$dtRetorno = date('Y-m-d H:i:s');

                if ($client->getError()) {
                    $return['status'] = false;
                    $return['message'] = "Erro ao enviar solicitação. (conexão)";

                    $this->geraSalvaXml($proposta, $arquivo_ERRO, $proposta." - ".$dados['ds_identificador']." - ".$dados['status'].chr(13).chr(10));

                    $Propostas->gravaLogTransmissao(
                            array(
                                    'id_proposta'        => $proposta,
                                    'ds_retorno'         => $client->getError(),
                                    'fl_sucesso'         => 'f',
                                    'ds_tipo_transmissao' => 'AutorizaConsultaMapaEndosso',
                                    'ds_xml_transmissao' => $mysoapmsg,
									'dt_envio'           => $dtEnvio,
									'dt_retorno'         => $dtRetorno,
                            )
                    );
                    $this->geraSalvaXml($proposta, $arquivo_ERRO, $proposta." - ".$result_xml->erro->attributes()->nm_retorno.chr(13).chr(10));
                    $result['arquivo_erro'] = $arquivo_ERRO;

                } else {
                    $result_xml = simplexml_load_string(utf8_encode($result['ExecutarResult']), 'SimpleXMLElement', LIBXML_NOCDATA);
                    if($result_xml->erro){

                        $Propostas->gravaLogTransmissao(
                                array(
                                        'id_proposta'        => $proposta,
                                        'ds_retorno'         => $result_xml->erro->attributes()->nm_retorno,
                                        'fl_sucesso'         => 'f',
                                        'ds_tipo_transmissao' => 'AutorizaConsultaMapaEndosso',
                                        'ds_xml_transmissao' => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno,
                                )
                        );
                        $this->geraSalvaXml($proposta, $arquivo_ERRO, $proposta." - ".$result_xml->erro->attributes()->nm_retorno.chr(13).chr(10));
                        $result['arquivo_erro'] = $arquivo_ERRO;

                    } else {
                        $Propostas->atualizaConsultaCadin(array('id_proposta' => $proposta));

                        $Propostas->gravaLogTransmissao(
                                array(
                                        'id_proposta'        => $proposta,
                                        'ds_retorno'         => 'Solicitação de consulta efetuada com sucesso.',
                                        'fl_sucesso'         => 't',
                                        'ds_tipo_transmissao' => 'AutorizaConsultaMapaEndosso',
                                        'ds_xml_transmissao' => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno,
                                )
                        );

                        $this->geraSalvaXml($proposta, $arquivo_OK, $proposta." - OK".chr(13).chr(10));
                        $result['arquivo_ok'] = $arquivo_OK;
                    }
                }
	        }
	        $result['status'] = true;
	        $result['message'] = "Processamento concluído com sucesso.";
	    } else {
	        $result['status'] = false;
	        $result['message'] = "Marque ao menos uma proposta";
	    }
	    $this->getResponse()->setBody(Zend_Json::encode($result));
	}

	public function retornoconsultaAction(){
	    $this->isAjax();

	    $Propostas = new Seguro_Model_Propostas();
	    $Transmissao = $this->getModel();

	    $arResult     = array("status"=>true, "dados"=>"", "message"=>"");
	    $arquivo_OK   = time()."_RETORNO_CONSULTA_SISSER_OK.txt";
	    $arquivo_ERRO = time()."_RETORNO_CONSULTA_SISSER_ERRO.txt";

	    $propostas = $this->getRequest()->getParam("id_proposta");

	    if ($this->getRequest()->getParam("id_proposta")){

	        foreach($propostas as $chave => $proposta){

	        	$msg_erro = "";

	            $ModelProposta = new Seguro_Model_Propostas();
	            $Proposta      = $ModelProposta->find($proposta)->current();

				if (APPLICATION_ENV != 'production') {
					$client = new nusoap_client(WSDL_DEV, true, false, false, false, false, 3600, 3600);
				} else {
					$client = new nusoap_client(WSDL_PROD, true, false, false, false, false, 3600, 3600);
				}

	            $mysoapmsg  = "<i4proerp><consulta_mapa id_endosso='".$Proposta->ds_identificador_seguradora."'></consulta_mapa></i4proerp>";
	            $params     = array('Servico' => 'ConsultaMapa', 'conteudoXML' => $mysoapmsg);

				$dtEnvio = date('Y-m-d H:i:s');
	            $result     = $client->call('Executar', array($params));
				$dtRetorno = date('Y-m-d H:i:s');

	            if ($client->getError()) {

	                $arResult['status'] = false;
	                $arResult['message'] = "Erro ao enviar solicitação. (conexão)";

	                $Propostas->gravaLogTransmissao(
	                        array(
	                                'id_proposta'        => $proposta,
	                                'ds_retorno'         => $client->getError(),
	                                'fl_sucesso'         => 'f',
	                                'ds_tipo_transmissao' => 'ConsultaMapa',
	                                'ds_xml_transmissao' => $mysoapmsg,
									'dt_envio'           => $dtEnvio,
									'dt_retorno'         => $dtRetorno,
	                        )
	                );
	                $this->geraSalvaXml($proposta, $arquivo_ERRO, $proposta." - ".$result_xml->erro->attributes()->nm_retorno.chr(13).chr(10));
	                $arResult['arquivo_erro'] = $arquivo_ERRO;

	            } else {

	                $result_xml = simplexml_load_string(utf8_encode($result['ExecutarResult']), 'SimpleXMLElement', LIBXML_NOCDATA);

	                if($result_xml->erro->attributes()->cd_retorno > 0){

	                    //$Propostas->atualizaRetornoConsultaCadin(array('id_proposta' => $proposta, 'fl_sucesso' => 'f', 'ds_retorno' => $result_xml->erro->attributes()->nm_retorno, 'ds_xml_transmissao' => $mysoapmsg));
	                    $Propostas->gravaLogTransmissao(
	                            array(
	                                    'id_proposta'          => $proposta,
	                                    'ds_retorno'           => $result_xml->erro->attributes()->nm_retorno,
	                                    'fl_sucesso'           => 'f',
	                                    'ds_tipo_transmissao'  => 'ConsultaMapa',
	                                    'ds_xml_transmissao'   => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno,
	                            )
	                    );
	                    $this->geraSalvaXml($proposta, $arquivo_ERRO, $proposta." - ".$result_xml->erro->attributes()->nm_retorno.chr(13).chr(10));
	                    $arResult['arquivo_erro'] = $arquivo_ERRO;
	                }

                    //SE O RETORNO DA CONSULTA FOR OK, LIBERA A PROPOTSA PARA SER EMITIDA
                    if($result_xml->cd_status == 1){
                        $Propostas->changeStatus(array('id_proposta' => $proposta), 'TRANSMITIDA_SEGURADORA');
                        $Propostas->atualizaRetornoConsultaCadin(array('id_proposta' => $proposta, 'fl_sucesso' => 't', 'ds_retorno' => 'Subvenção concedida', 'ds_xml_transmissao' => $mysoapmsg));

                        $Propostas->gravaLogTransmissao(
                                array(
                                        'id_proposta'        => $proposta,
                                        'ds_retorno'         => $result_xml->erro->nm_erro,
                                        'fl_sucesso'         => 't',
                                        'ds_tipo_transmissao' => 'ConsultaMapa',
                                        'ds_xml_transmissao' => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno,
                                )
                        );

                        $this->geraSalvaXml($proposta, $arquivo_OK, $proposta." - OK".chr(13).chr(10));
                        $arResult['arquivo_ok'] = $arquivo_OK;
                    }

                    //SE O RETORNO FOI IGUAL A 3 A SUBVENÇÃO FOI NEGADA E OS ERROS SÃO TRATADOS E LOGADOS
                    if($result_xml->cd_status == 3){

                        if(count($result_xml->erro) > 0){
                            for($i=0; $i < count($result_xml->erro); $i++){
                                $msg_erro .= $result_xml->erro[$i]->cd_erro.": ".$result_xml->erro[$i]->nm_erro." || ";
                            }
                        } else {
                            $msg_erro = $result_xml->erro->cd_erro.": ".$result_xml->erro->nm_erro;
                        }

                        $Propostas->gravaLogTransmissao(
                                array(
                                        'id_proposta'         => $proposta,
                                        'ds_retorno'          => $msg_erro,
                                        'fl_sucesso'          => 'f',
                                        'ds_tipo_transmissao' => 'ConsultaMapa',
                                        'ds_xml_transmissao'  => $mysoapmsg,
										'dt_envio'           => $dtEnvio,
										'dt_retorno'         => $dtRetorno,
                                )
                        );

                        $Propostas->atualizaRetornoConsultaCadin(array('id_proposta' => $proposta, 'fl_sucesso' => 'f', 'ds_retorno' => $msg_erro, 'ds_xml_transmissao' => $mysoapmsg));

                        $this->geraSalvaXml($proposta, $arquivo_ERRO, $proposta." - ".$msg_erro.chr(13).chr(10));
                        $arResult['arquivo_erro'] = $arquivo_ERRO;
                    }

	            }
	        }
	        $arResult['status'] = true;
	        $arResult['message'] = "Processamento concluído com sucesso.";
	    } else {
	        $arResult['status'] = false;
	        $arResult['message'] = "Marque ao menos uma proposta";
	    }
	    $this->getResponse()->setBody(Zend_Json::encode($arResult));
	}

	public function enviarlistaemissaoAction(){

		$this->isAjax();

		$Propostas = new Seguro_Model_Propostas();
		$arResult  = array("status"=>true, "dados"=>"", "message"=>"");
		$propostas = $this->getRequest()->getParam("id_proposta");

		if ($this->getRequest()->getParam("id_proposta")){
			foreach($propostas as $chave => $proposta){
				$Propostas->changeStatusId($proposta, '63', 'Encaminhada para lista de Emissão.');
			}
			$arResult['status'] = true;
			$arResult['message'] = "Propostas enviadas para lista de Emissão.";
		} else {
			$arResult['status'] = false;
			$arResult['message'] = "Marque ao menos uma proposta";
		}

		$this->getResponse()->setBody(Zend_Json::encode($arResult));
	}

	public function enviarlistasolicitacaoAction(){

		$this->isAjax();

		$ModelPropostas = new Seguro_Model_Propostas();
		$arResult  = array("status"=>true, "dados"=>"", "message"=>"");
		$propostas = $this->getRequest()->getParam("id_proposta");

		if ($this->getRequest()->getParam("id_proposta")){
			foreach($propostas as $chave => $proposta){
				$ModelPropostas->novaConsultaCadin($proposta);
			}
			$arResult['status'] = true;
			$arResult['message'] = "Propostas enviadas para lista de Solicitação.";
		} else {
			$arResult['status'] = false;
			$arResult['message'] = "Marque ao menos uma proposta";
		}

		$this->getResponse()->setBody(Zend_Json::encode($arResult));
	}

	public function liberaremissaoAction()
    {
        $this->isAjax();

        $return = array("status" => true, "dados" => "", "message" => "");
        $arquivo_OK = time() . "_LIBERAR_EMISSAO_OK.txt";
        $arquivo_ERRO = time() . "_LIBERAR_EMISSAO_ERRO.txt";
        $controlePropostas = [];
        $propostas = $this->getRequest()->getParam("id_proposta");

        // coloca proposta em bloqueio para não haver alteração de status enquanto está na fila de emissão
        (new Log_Model_BloqueioPropostaStatus())->insertAtomico($propostas);

        if ($this->getRequest()->getParam("id_proposta")) {
            $modelPropostas = new Seguro_Model_Propostas();
            $modelTransmissao = new Sinistro2_Model_TransmissaoAvisosEssor();
            $propostasEndossos = new Endosso_Model_Propostas();

            $options = [];
            $wsdl = WSDL_PROD;

            if (APPLICATION_ENV != 'production') {
                $wsdl = WSDL_DEV;
                $options = [
                    'stream_context' => stream_context_create([
                        'ssl' => [
                            'verify_peer' => false,
                            'verify_peer_name' => false,
                            'allow_self_signed' => true
                        ]
                    ]),
                    'trace' => true,
                    'exceptions' => true
                ];
            }

            foreach ($propostas as $idProposta) {
                if (in_array($idProposta, $controlePropostas)) {
                    continue;
                }

                $controlePropostas[] = $idProposta;
                $proposta = $modelPropostas->find($idProposta)->current();
                $produto = $proposta->produto();

                $mysoapmsg = "<i4proerp><gera_apolice id_endosso='{$proposta->ds_identificador_seguradora}'></gera_apolice></i4proerp>";
                $ds_metodo = 'GerarApolice';

                $endossoZero = !($proposta->versao_endosso(false) > 0);
                //qndo for para emitir endosso de cobrança, deve chamar o metodo GerarEndosso
                if (!$endossoZero) {
                    $mysoapmsg = "<i4proerp><gera_endosso id_endosso='{$proposta->ds_identificador_seguradora}'></gera_endosso></i4proerp>";
                    $ds_metodo = 'GerarEndosso';

                    //verifica avisos pendentes de transmissao
                    $avisos = $modelTransmissao->getAvisosPendenteTransmissao($idProposta);
                }

                $params = array(
                    'Executar' =>
                        array(
                            'Servico' => $ds_metodo,
                            'conteudoXML' => $mysoapmsg
                        )
                );
                $dtos = [];
                try {
                    $dtEnvio = date('Y-m-d H:i:s');
                    $client = new SoapClient($wsdl, $options);
                    $result = $client->__soapCall('Executar', $params, array('location' => explode('?', $wsdl)[0]));
                    $dtRetorno = date('Y-m-d H:i:s');
                    $result_xml = simplexml_load_string($result->ExecutarResult, 'SimpleXMLElement', LIBXML_NOCDATA);

                    if ($result_xml->erro || $result_xml->cd_retorno == -1) {
                        $modelPropostas->gravaLogTransmissao(
                            array(
                                'id_proposta' => $idProposta,
                                'ds_retorno' => $result_xml->erro->attributes()->nm_retorno,
                                'fl_sucesso' => 'f',
                                'ds_tipo_transmissao' => 'GerarApolice',
                                'ds_xml_transmissao' => $mysoapmsg,
                                'dt_envio' => $dtEnvio,
                                'dt_retorno' => $dtRetorno,
                            )
                        );
                        $this->geraSalvaXml($idProposta, $arquivo_ERRO, $idProposta . " - " . $result_xml->erro->attributes()->nm_retorno . chr(13) . chr(10));
                        $return['arquivo_erro'] = $arquivo_ERRO;
                    } else {
                        //SE O RETORNO DA CONSULTA FOR OK, LIBERA A PROPOTSA PARA SER EMITIDA
                        if ($result_xml->cd_apolice) {
                            $modelPropostas->changeStatus(array('id_proposta' => $idProposta), 'APOLICE_EMITIDA');
                            $row = $modelPropostas->getRow($idProposta);
                            $row->nr_apolice = $result_xml->cd_apolice;
                            $row->save();

                            if (!$endossoZero) {
                                $sinistro = $propostasEndossos->find($propostasEndossos->getPropostaVigente($proposta->id))->current();

                                if (!$propostasEndossos->endossarSinistro($sinistro->id, $proposta->id)) {
                                    $modelPropostas->gravaLogTransmissao(
                                        array(
                                            'id_proposta' => $idProposta,
                                            'ds_retorno' => "ERRO AO ENDOSSAR SINISTRO",
                                            'fl_sucesso' => 'f',
                                            'ds_tipo_transmissao' => 'ENDOSSAR_SINISTRO',
                                            'ds_xml_transmissao' => '',
                                            'dt_envio' => $dtEnvio,
                                            'dt_retorno' => $dtRetorno,
                                        )
                                    );
                                }

                                $proposta->setEndossoVigente();
                            }

                            $modelPropostas->gravaLogTransmissao(
                                array(
                                    'id_proposta' => $idProposta,
                                    'ds_retorno' => $result_xml->nm_retorno,
                                    'fl_sucesso' => 't',
                                    'ds_tipo_transmissao' => $ds_metodo,
                                    'ds_xml_transmissao' => $mysoapmsg,
                                    'dt_envio' => $dtEnvio,
                                    'dt_retorno' => $dtRetorno,
                                )
                            );

                            $this->geraSalvaXml($idProposta, $arquivo_OK, $idProposta . " - Apólice Gerada: " . $result_xml->cd_apolice . chr(13) . chr(10));
                            $return['arquivo_ok'] = $arquivo_OK;

                            //transmite avisos de sinistro pendente para Seguradora
                            if (count($avisos) > 0) {
                                foreach ($avisos as $aviso) {
                                    $transmissaoAviso = $modelTransmissao->getAvisoTransmissao($aviso->id_aviso);
                                    Agro_Webservice::transmitirSinistroEssor($aviso->id_aviso, $transmissaoAviso->cobertura);
                                }
                            }

                            if ($produto["ds_nome_cultura"] == "Pastagem") {
                                try {
                                    (new Agro_AgritaskCotacao())->atualizarApolice($idProposta, $result_xml->cd_apolice);
                                } catch (\Throwable $th) {
                                    $propostasAgritaskErro[] = $idProposta;
                                    $modelPropostas->gravaLogTransmissao(
                                        array(
                                            'id_proposta' => $idProposta,
                                            'ds_retorno' => $th->getMessage(),
                                            'fl_sucesso' => 'f',
                                            'ds_tipo_transmissao' => 'AGRITASK_ATUALIZAR_STATUS',
                                            'dt_envio' => $dtEnvio,
                                            'dt_retorno' => $dtRetorno,
                                        )
                                    );
                                }
                            }
                            
                            list($pdfBinary) = (new Seguro_Service_Apolice($idProposta))->gerarPdf();

                            $dtos[] = new Seguro_Dto_FormularioFilaEcmPlugEssor(
                                $idProposta,
                                Seguro_Service_EnviarFormularioEcmPlugEssor::PDF_APOLICE,
                                base64_encode($pdfBinary)
                            );
                        } else {
                            $modelPropostas->gravaLogTransmissao(
                                array(
                                    'id_proposta' => $idProposta,
                                    'ds_retorno' => $result_xml->nm_retorno,
                                    'fl_sucesso' => 'f',
                                    'ds_tipo_transmissao' => $ds_metodo,
                                    'ds_xml_transmissao' => $mysoapmsg,
                                    'dt_envio' => $dtEnvio,
                                    'dt_retorno' => $dtRetorno,
                                )
                            );

                            $this->geraSalvaXml($idProposta, $arquivo_ERRO, $idProposta . " - Retorno inválido da Seguradora." . chr(13) . chr(10));
                            $return['arquivo_erro'] = $arquivo_ERRO;

                        }
                    }

                    (new Seguro_Service_EnviarFormularioFilaEcmPlugEssor())->executar($dtos);
                } catch (SoapFault $erro) {
                    $return['status'] = false;
                    $return['message'] = "Erro ao emitir a apólice.";

                    $modelPropostas->gravaLogTransmissao(
                        array(
                            'id_proposta' => $idProposta,
                            'ds_retorno' => $erro->getMessage(),
                            'fl_sucesso' => 'f',
                            'ds_tipo_transmissao' => 'GerarApolice',
                            'ds_xml_transmissao' => $mysoapmsg,
                            'dt_envio' => $dtEnvio,
                            'dt_retorno' => date('Y-m-d H:i:s'),
                        )
                    );

                    $this->geraSalvaXml(
                        $idProposta,
                        $arquivo_ERRO,
                        $idProposta . " - " . $return['message'] . chr(13) . chr(10)
                    );
                    $return['arquivo_erro'] = $arquivo_ERRO;
                }
            }

            if ($return['status']) {
                $mensagem = "Processamento concluído com sucesso.";
                $return['status'] = true;
                $return['message'] = $mensagem;
            }
                
            // remove proposta da lista de bloqueio após todo processamento
            (new Log_Model_BloqueioPropostaStatus())->deleteAtomico($propostas);
        } else {
            $return['status'] = false;
            $return['message'] = "Marque ao menos uma proposta";
        }
        $this->getResponse()->setBody(Zend_Json::encode($return));
    }

	public function geraSalvaXml($idProposta, $nomeArquivo, $msg) {
		$file = fopen(APPLICATION_PATH."/upload_files/xml_transmissao_error/{$nomeArquivo}", "a+");
	    fwrite($file, $msg);
	    fclose($file);
	}

	public function marcapropostasAction() {
		$this->isAjax();

		$Adapter = new Zend_File_Transfer_Adapter_Http();
		$Adapter->setDestination(APPLICATION_PATH.'/upload_files/temp/');

		$file = $Adapter->getFileInfo();
		if(!$Adapter->receive($file['propostas']['name'])){
			$result['status'] = false;
		} else {
			$dados = file_get_contents(APPLICATION_PATH.'/upload_files/temp/' . $file['propostas']['name']);
			$dados = str_replace("\r\n", ",", $dados);
			$result['propostas'] = $dados;
			$result['status'] = true;
		}
		$this->getResponse()->setBody(Zend_Json::encode($result));
	}
}
