<?php
require_once(APPLICATION_PATH. "/../library/Agro/nusoap/nusoap.php");

/**
 * Classe que faz interface para acesso ao WebService da TAGH
 * @since 29/01/2016
 * @author Tonismar R. Bernardo tonismar.bernardo.at.agrobrasilseguros.com.br
 * @package AgroNet
 *
 */
class Agro_Tagh {

    private $username = null;
    private $password = null;
    private $client = null;
    private $result = null;
    private $errorMessage = 'Dados enviados nulos ou incorretos';

    public function __construct() {

        try {
            if (!defined('WSDL_TAGH')) {
                throw new Exception('Constante WSDL_TAGH não configurada no arquivo application.ini');
            } else {
                $this->client = new nusoap_client(WSDL_TAGH);
            }
        } catch ( Exception $e) {
            Agro_Util::setNotificacao('Problema de configuração', $e->getMessage(), 'tonismar.bernardo@agrobrasilseguros.com.br', false);
            die($e->getMessage());
        }

        $this->client->soap_defencoding = 'utf-8';
        $this->client->xml_encoding = 'utf-8';
        $this->client->decode_utf8 = false;

        $this->username = "wwTkG/uIQ+5WdWOYcu/IG2wwTakUr7xK";
        $this->password = "G7405ibF82gnlZ49wHu0ig==";
    }

    /**
     * Atualiza a senha do usuario na TAGH
     * @param $dados array de dados
    */
    public function changeUserPassword ($dados) {

        $xml = null;

        if ((is_array($dados)) && (!empty($dados))) {
            $xml = '<ChangeUserPassword xmlns="http://tempuri.org/">
                        <userName>'.$this->username.'</userName>
                        <userPassword>'.$this->password.'</userPassword>
                        <userNameToUpdate>'.base64_encode($dados['username_to_update']).'</userNameToUpdate>
                        <userPasswordToUpdate>'.base64_encode($dados['password_to_update']).'</userPasswordToUpdate>
                    </ChangeUserPassword>
            ';

        } else {
            return $this->errorMessage;
        }

        return $this->doRequest($xml, 'ChangeUserPassword');
    }

    /**
     * Desativa usuário na TAGH
     * @param $dados array de dados
    */
    public function disableOrEnableUser ($dados) {

        $xml = null;

        if ((is_array($dados)) && (!empty($dados))) {
            $xml = '<DisableOrEnableUser xmlns="http://tempuri.org/">
                        <userName>'.$this->username.'</userName>
                        <userPassword>'.$this->password.'</userPassword>
                        <userNameToDisableOrEnable>'.base64_encode($dados['username_to_disable_or_enable']).'</userNameToDisableOrEnable>
                        <enable>'.$dados['enable'].'</enable>
                    </DisableOrEnableUser>
            ';
        } else {
            return $this->errorMessage;
        }

        return $this->doRequest($xml, 'DisableOrEnableUser');
    }

    public function reassignInspector ($dados) {

        $xml = null;

        if ((is_array($dados)) && (!empty($dados))) {

            $xml = '<ReassignInspector xmlns="http://tempuri.org/">
                        <userName>'.$this->username.'</userName>
                        <userPassword>'.$this->password.'</userPassword>
                        <inspectionCompanyCode>'.$dados['inspectionCompanyCode'].'</inspectionCompanyCode>
                        <policyNumber>'.$dados['policyNumber'].'</policyNumber>
                        <inspectorId>';
                        foreach ($dados['inspectorId'] as $int) {
                            $xml .= "<int>".$int['int']."</int>";
                        }
            $xml .=     '</inspectorId>
                    </ReassignInspector>
            ';
        } else {
            return $this->errorMessage;
        }

        return $this->doRequest($xml, 'ReassignInspector');
    }

    public function cancelInspection ($dados) {

        $xml = null;

        if ((is_array($dados)) && (!empty($dados))) {

            $xml = '<CancelInspection xmlns="http://tempuri.org/">
                        <userName>'.$this->username.'</userName>
                        <userPassword>'.$this->password.'</userPassword>
                        <inspectionCompanyCode>'.$dados['inspectionCompanyCode'].'</inspectionCompanyCode>
                        <policyNumber>'.$dados['policyNumber'].'</policyNumber>
                   </CancelInspection>
            ';
        } else {
            return $this->errorMessage;
        }

        return $this->doRequest($xml, 'CancelInspection');
    }
    /**
     * Insere ou atualiza vistoriadores na TAGH
     * @param $dados array de dados
    */
    public function createOrUpdateInspector ($dados) {

        $xml = null;
        
        //turn around para senha
        $dados['userpassword'] = 'tagh1234';
        
        if ((is_array($dados)) && (!empty($dados))) {
            $xml = '<InspectorUser>
                        <InspectorId>'.$dados['inspectorid'].'</InspectorId>
                        <InspectorName>'.$dados['inspectorname'].'</InspectorName>
                        <UserName>'.$dados['username'].'</UserName>
                        <UserPassword>'.$dados['userpassword'].'</UserPassword>
                        <Identificator>'.$dados['identificador'].'</Identificator>
                        <Identificator2>'.$dados['identificador2'].'</Identificator2>
                        <MaxArea>'.$dados['maxarea'].'</MaxArea>
                        <MaxInspections>'.$dados['maxinspections'].'</MaxInspections>';
 //                       <HeadId>'.$dados['headid'].'</HeadId>

                     $xml .= '<DistrictId>'.$dados['districtid'].'</DistrictId>
                        <Addesss>'.$dados['addesss'].'</Addesss>
                        <TownId>'.$dados['townid'].'</TownId>
                        <ZipCode>'.$dados['zipcode'].'</ZipCode>
                        <Email>'.$dados['email'].'</Email>
                        <Email1>'.$dados['email1'].'</Email1>
                        <Fax>'.$dados['fax'].'</Fax>
                        <Mobile>'.$dados['mobile'].'</Mobile>
                        <Phone>'.$dados['phone'].'</Phone>
                        <Phone1>'.$dados['phone1'].'</Phone1>
                        <BankAccountBank>'.$dados['bankaccountbank'].'</BankAccountBank>
                        <BankAccountBranch>'.$dados['bankaccountbranch'].'</BankAccountBranch>
                        <BankAccountCode>'.$dados['bankaccountcode'].'</BankAccountCode>
                        <BankAccountName>'.$dados['bankaccountname'].'</BankAccountName>
                        <BankAccountNumber>'.$dados['bankaccountnumber'].'</BankAccountNumber>
                        <BankAccountType>'.$dados['bankaccounttype'].'</BankAccountType>
                        <FirmId>'.$dados['firmid'].'</FirmId>
                    </InspectorUser>
            ';

            $xml64 = base64_encode($xml);

            $xml = '<CreateOrUpdateInspector xmlns="http://tempuri.org/">
                        <userName>'.$this->username.'</userName>
                        <userPassword>'.$this->password.'</userPassword>
                        <inspector>'.$xml64.'</inspector>
                    </CreateOrUpdateInspector>
            ';
        } else {
            return $this->errorMessage;
        }

        return $this->doRequest($xml, 'CreateOrUpdateInspector');
    }
    /**
     * Insere ou atualiza empresa na TAGH
     * @param $dados array de dados
     */
    public function createOrUpdateFirm ($dados) {

        $xml = null;

        //turn around para senha
        $dados['userpassword'] = 'tagh1234';
        
        if ((is_array($dados)) && (!empty($dados))) {

            $xml = '<Firm>
                        <UserName>'.$dados['username'].'</UserName>
                        <UserPassword>'.$dados['userpassword'].'</UserPassword>
                        <FirmId>'.$dados['firmid'].'</FirmId>
                        <Identificator>'.$dados['identificador'].'</Identificator>
                        <Identificator2>'.$dados['identificador2'].'</Identificator2>
                        <FirmName>'.Agro_Util::removeAcentos($dados['firmname']).'</FirmName>
                        <Addesss>'.Agro_Util::removeAcentos($dados['addesss']).'</Addesss>
                        <ZipCode>'.$dados['zipcode'].'</ZipCode>
                        <Email>'.$dados['email'].'</Email>
                        <Email1>'.$dados['email1'].'</Email1>
                        <Fax>'.$dados['fax'].'</Fax>
                        <Mobile>'.$dados['mobile'].'</Mobile>
                        <Phone>'.$dados['phone'].'</Phone>
                        <Phone1>'.$dados['phone1'].'</Phone1>
                    </Firm>
            ';
            $xml64 = base64_encode($xml);

            $xml = '<CreateOrUpdateFirm xmlns="http://tempuri.org/">
                        <userName>'.$this->username.'</userName>
                        <userPassword>'.$this->password.'</userPassword>
                        <firm>'.$xml64.'</firm>
                    </CreateOrUpdateFirm>
            ';
        } else {
            return $this->errorMessage;
        }

        return $this->doRequest($xml, 'CreateOrUpdateFirm');
    }

    /**
     *
    */
    public function createNewInspection($name,$dados) {

        $xml = '<CreateNewInspection xmlns="http://tempuri.org/">
                    <userName>'.$this->username.'</userName>
                    <userPassword>'.$this->password.'</userPassword>
                    <newInspection>'.$this->$name($dados).'</newInspection>
                </CreateNewInspection>';

        return $this->doRequest($xml, 'CreateNewInspection');
    }

    /**
     * Envia vistoria de sinistro para a TAGH (lossInspection)
    */
    private function lossInspection($dados) {

        $xml = null;

        if ((is_array($dados)) && (!empty($dados))) {

            /* Monta XML com as imagens */
            if (is_array($dados['Imagens'])) {
                foreach ($dados['Imagens'] as $imagem) {
                    $xmlImagens .= '<Image>
                                <Description>'.$imagem['Description'].'</Description>
                                <Extension>'.$imagem['Extension'].'</Extension>
                                <URL>'.$imagem['URL'].'</URL>
                                <Name>'.$imagem['Name'].'</Name>
                                <TypeId>'.$imagem['TypeId'].'</TypeId>
                            </Image>';
                }
            }

            /* Monta XML com as policies */
            foreach ($dados['Policies'] as $policies) {
                $xmlPolicies = '<Policy>
                                    <Insured>
                                        <InsuredName>'.Agro_Util::removeAcentos($policies['InsuredName']).'</InsuredName>
                                        <InsuredTelephone>'.$policies['InsuredTelephone'].'</InsuredTelephone>
                                    </Insured>
                                    <InspectionCompanyCode>'.$policies['InspectionCompanyCode'].'</InspectionCompanyCode>
                                    <PolicyNumber>'.(string)$policies['PolicyNumber'].'</PolicyNumber>
                                    <EventDate>'.$policies['EventDate'].'</EventDate>
                                    <LossClaimDate>'.$policies['LossClaimDate'].'</LossClaimDate>
                                    <PolicyEffectiveDate>'.$policies['PolicyEffectiveDate'].'</PolicyEffectiveDate>
                                    <Events>';

                foreach ($policies['Events'] as $events) {
                    $xmlEvents .= '<PolicyEvent>
                                        <EventId>'.$events['EventId'].'</EventId>
                                        <PolicyId>'.$events['PolicyId'].'</PolicyId>
                                    </PolicyEvent>';
                }

                $xmlPolicies .=   $xmlEvents.'</Events>';
                $xmlPolicies .= '<OtherEventDescr>x</OtherEventDescr><PolicyCoverages>';

                foreach ($policies['PolicyCoverages'] as $policy_coverages) {
                    $xmlCoverages .= '<Coverage>
                                        <CoverageAffectedArea>'.(boolean)$policy_coverages['CoverageAffectedArea'].'</CoverageAffectedArea>
                                        <CoveragePercentage>'.(float)$policy_coverages['CoveragePercentage'].'</CoveragePercentage>
                                        <EventId>'.$policy_coverages['EventId'].'</EventId>
                                        <CoverageExcess>'.$policy_coverages['CoverageExcess'].'</CoverageExcess>
                                    </Coverage>';
                }

                $xmlPolicies .=   $xmlCoverages.'</PolicyCoverages></Policy>';

                /* Monta XML RequestShare */
                foreach ($dados['RequestedShares'] as $request_share) {
                    $xmlRequestShared .= '<RequestedShare xsi:type="LossRequestedShare">
                                    <ShareArea>'.$request_share['ShareArea'].'</ShareArea>
                                    <ShareAffectedArea>'.(string)$request_share['ShareAffectedArea'].'</ShareAffectedArea>
                                    <ShareName>'.$request_share['ShareName'].'</ShareName>
                                    <CropTypeId>'.$request_share['CropTypeId'].'</CropTypeId>';
                                    if ($request_share['SowedDate']) {
                                        $xmlRequestShared .= '<SowedDate>'.$request_share['SowedDate'].'</SowedDate>';
                                    }
                    $xmlRequestShared .= '<InsuredAmountPerUnitMetric>'.$request_share['InsuredAmountPerUnitMetric'].'</InsuredAmountPerUnitMetric>
                                    <InsuredAmountPerUnit>'.(string)$request_share['InsuredAmountPerUnit'].'</InsuredAmountPerUnit>
                                    <ShareIdReference>'.$request_share['ShareIdReference'].'</ShareIdReference>
                                </RequestedShare>';
                }

                $xmlInspectors = '<InspectorsToAssign>';

                foreach ($dados['InspectorsToAssign'] as $inspectors_assign) {
                    $xmlInspectors .= '<Inspectors>
                                           <InspectorId>'.$inspectors_assign['InspectorId'].'</InspectorId>
                                       </Inspectors>';
                }

                $xmlInspectors .= '</InspectorsToAssign>';
            }

            /** Monta XML para laudo PDF **/
            $xmlPDF = '<LaudoPdfData>
                        <Titulo>LAUDO DE VISTORIA FINAL DE DANOS</Titulo>
                        <Cultura>'.Agro_Util::removeAcentos($dados['ds_nome_cultura']).'</Cultura>
                        <Producto>'.Agro_Util::removeAcentos($dados['ds_nome_produto']).'</Producto>
                        <CoberturaPrincipal>'.$dados['ds_nome_cobertura'].'</CoberturaPrincipal>
                        <Proposta>'.$dados['id_proposta'].'</Proposta>
                        <Apolice>'.$dados['nro_apolice'].'</Apolice>
                        <Safra>'.$dados['ds_nome_safra'].'</Safra>
                        <VisitoriaAgronetNo>'.$dados['id_vistoria'].'</VisitoriaAgronetNo>
                        <EmpressaVisitoria>'.Agro_Util::removeAcentos($dados['ds_nome_empresa_vistoria']).'</EmpressaVisitoria>
                        <NomeDoSegurado>'.Agro_Util::removeAcentos($dados['ds_nome_segurado']).'</NomeDoSegurado>
                        <CpfCnpjSegurado>'.$dados['cpf_cnpj_segurado'].'</CpfCnpjSegurado>
                        <EnderPropriedade>'.Agro_Util::removeAcentos($dados['ds_endereco_propriedade']).'</EnderPropriedade>
                        <MunicipioPropriedade>'.Agro_Util::removeAcentos($dados['ds_nome_municipio']).'</MunicipioPropriedade>';

            $xmlPDFAvisos = '<Avisos>';

            foreach ($dados['avisos'] as $aviso) { 
                $xmlPDFAvisos .= '<AvisoSiniestroNo>'.$aviso.'</AvisoSiniestroNo>';
            }

            $xmlPDFAvisos .= '</Avisos>';

            $xmlPDFEventos = '<Eventos>';

            foreach ($dados['eventos'] as $evento) {
                $xmlPDFEventos .= '<Evento>
                                    <NomeEvento>'.$evento['ds_nome_evento'].'</NomeEvento>
                                    <DataEvento>'.$evento['dt_evento'].'</DataEvento>
                                </Evento>';
            }

            $xmlPDFEventos .= '</Eventos>';

            $xmlPDFPessoas = '<PessoasAutorizadas>';

            foreach ($dados['PessoasAutorizadas'] as $pessoa) {
                $xmlPDFPessoas .= '<PessoaAutorizada>
                                        <NomePessoa>'.Agro_Util::removeAcentos($pessoa['NomePessoa']).'</NomePessoa>
                                        <DocumentoPessoa>'.$pessoa['DocumentoPessoa'].'</DocumentoPessoa>
                                        <ParentescoPessoa>'.Agro_Util::removeAcentos($pessoa['ParentescoPessoa']).'</ParentescoPessoa>
                                        <TelefonePessoa>'.$pessoa['TelefonePessoa'].'</TelefonePessoa>
                                </PessoaAutorizada>';
            }

            $xmlPDFPessoas .= '</PessoasAutorizadas>';

            $xmlPDF .= $xmlPDFAvisos . $xmlPDFEventos . $xmlPDFPessoas . '</LaudoPdfData>';

            $xml = '<InspectionBR>
                        <Inspection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="LossInspection">
                            <InspectionObservations>'.$dados['InspectionObservation'].'</InspectionObservations>
                            <Establishment>
                                <EstablishmentName>'.Agro_Util::removeAcentos($dados['EstablishmentName']).'</EstablishmentName>
                                <TownId>'.$dados['TownId'].'</TownId>
                                <DistrictId>'.$dados['DistrictId'].'</DistrictId>
                                <EstablishmentGPSLatitude>'.$dados['EstablishmentGPSLatitude'].'</EstablishmentGPSLatitude>
                                <EstablishmentGPSLongitude>'.$dados['EstablishmentGPSLongitude'].'</EstablishmentGPSLongitude>
                                <EstablishmentObservations>'.$dados['EstablishmentObservations'].'</EstablishmentObservations>
                                <EstablishmentLocation>'.$dados['EstablishmentLocation'].'</EstablishmentLocation>
                            </Establishment>
                            <Contact>
                                <ContactMobile>'.$dados['ContactMobile'].'</ContactMobile>
                                <ContactName>'.Agro_Util::removeAcentos($dados['ContactName']).'</ContactName>
                                <ContactTelephone>'.$dados['ContactTelephone'].'</ContactTelephone>
                            </Contact>';

                            if ($xmlImagens) {
                                $xml .= '<Images>
                                            '.$xmlImagens.'
                                        </Images>';
                            } else {
                                $xml .= '<Images/>';
                            }
                            $xml .= '<Policies>
                                '.$xmlPolicies.'
                            </Policies>
                            <RequestedShares>
                                '.$xmlRequestShared.'
                            </RequestedShares>
                        </Inspection>';

                $xml .= $xmlInspectors.$xmlPDF.'</InspectionBR>';
        } else {
            return $this->errorMessage;
        }

        $this->debug($xml, 'lossInspection');
        return base64_encode(Agro_Util::removeAcentos($xml));
    }

    /*
    *  Usada para chamada de xml importado (teste)
    */
    public function testXML($xml, $service) { 
        return $this->doRequest($xml, $service);
    }

    /**
     * Efetua a requisição no serviço
    */
    private function doRequest($xml, $service) {

        try {

            $this->client->debug_flag = true;
            $msg = $this->client->serializeEnvelope($xml);
            $this->result = $this->client->send($msg, "http://tempuri.org/$service");
            
            return $this->getResult($service);

        } catch( Exception $e ) {

            die($e->getMessage());
        }
    }

    /**
     * Converte o XML de retorno em um Array para leitura dos dados
     * Caso ocorra erro, um e-mail é disparado para o desenvolvedor
     * @param service servido chamado
    */
    private function getResult($service) {

        try {
            switch ($service) {
                case 'CreateOrUpdateFirm':
                case 'CreateOrUpdateInspector':
                    $sxml = new SimpleXMLElement(base64_decode($this->result[$service.'Result']));
                    $retorno = (integer)$sxml->EntityId;
                    break;
                case 'CancelInspection':
                    $sxml = new SimpleXMLElement(base64_decode($this->result[$service.'Result']));
                    $retorno = $sxml->Status;
                    break;
                case 'ChangeUserPassword':
                case 'CreateNewInspection':
                    $sxml = new SimpleXMLElement(base64_decode($this->result[$service.'Result']));
                    $retorno = $sxml->EntityId;
                    break;
                case 'ReassignInspector':
                    $sxml = new SimpleXMLElement(base64_decode($this->result[$service.'Result']));
                    $retorno = $sxml->Status['Id'];
                    break;
            }
            
            $this->debugResult(base64_decode($this->result[$service.'Result']),$service);
            if ($sxml->Status->Id == 99) {
                throw new Exception((string) $sxml->Status->Description);
            }
          
            return $retorno;
        } catch (Exception $e) {
        	/**
        	 * Se houver algum erro, envia e-mail para o DEV e
        	 * não influencia no andamento do processo no AgroNet.
        	 */
           $Mail = new Agro_Mail();
           $Mail->addTo('tonismar.bernardo@agrobrasilseguros.com.br');
           $Mail->setSubject('Erro em sincronizar TAGH -> Agro');

           $content = 'Ao executar o serviço: <b>'.$service.'</b> houve o seguinte erro:<br><br>';
           $content .= '<pre>'.print_r($this->result,true).'</pre><br><br>';
           $content .= 'PHP houve o seguinte erro: <b>'.$e->getMessage().'</b><br><br>';
           $content .= '<h3>Request:</h3><pre>'.$this->client->request.'</pre>';
           $content .= '<h3>Response:</h3><pre>'.$this->client->response.'</pre><br><br>';
           $content .= 'usuário: <b>'.Zend_Auth::getInstance()->getIdentity()->ds_nome_usuario.'</b>';

           $Mail->setBody($content,'html');
           $Mail->send();
        }
    }

    /**
     * Envia vistoria de sinistro para a TAGH (lossInspection)
    */
    private function harvestInspection($dados) {

        $xml = null;

        if ((is_array($dados)) && (!empty($dados))) {

            /* Monta XML com as imagens */
            if (is_array($dados['Imagens'])) {
                foreach ($dados['Imagens'] as $imagem) {
                    $xmlImagens .= '<Image>
                                <Description>'.$imagem['Description'].'</Description>
                                <Extension>'.$imagem['Extension'].'</Extension>
                                <URL>'.$imagem['URL'].'</URL>
                                <Name>'.$imagem['Name'].'</Name>
                                <TypeId>'.$imagem['TypeId'].'</TypeId>
                            </Image>';
                }
            }

            /* Monta XML com as policies */
            foreach ($dados['Policies'] as $policies) {
                $xmlPolicies = '<Policy>
                                    <Insured>
                                        <InsuredName>'.Agro_Util::removeAcentos($policies['InsuredName']).'</InsuredName>
                                        <InsuredTelephone>'.$policies['InsuredTelephone'].'</InsuredTelephone>
                                    </Insured>
                                    <InspectionCompanyCode>'.$policies['InspectionCompanyCode'].'</InspectionCompanyCode>
                                    <PolicyNumber>'.(string)$policies['PolicyNumber'].'</PolicyNumber>';

                                    if ($policies['EventDate']) {
                                        $xmlPolicies .= '<EventDate>'.$policies['EventDate'].'</EventDate>';
                                    }

                                    if ($policies['LossClaimDate']) {
                                        $xmlPolicies .= '<LossClaimDate>'.$policies['LossClaimDate'].'</LossClaimDate>';
                                    }

                                    if ($policies['PolicyEffectiveDate']) {
                                        $xmlPolicies .= '<PolicyEffectiveDate>'.$policies['PolicyEffectiveDate'].'</PolicyEffectiveDate>';
                                    }

                                    $xmlPolicies .= '<Events>';

                foreach ($policies['Events'] as $events) {
                    $xmlEvents .= '<PolicyEvent>
                                        <EventId>'.$events['EventId'].'</EventId>
                                        <PolicyId>'.$events['PolicyId'].'</PolicyId>
                                    </PolicyEvent>';
                }

                $xmlPolicies .=   $xmlEvents.'</Events>';
                $xmlPolicies .= '<OtherEventDescr>x</OtherEventDescr><PolicyCoverages>';

                foreach ($policies['PolicyCoverages'] as $policy_coverages) {
                    $xmlCoverages .= '<Coverage>';

                                        if ($policy_coverages['CoverageAffectedArea']) {
                                            $xmlCoverages .= '<CoverageAffectedArea>'.(boolean)$policy_coverages['CoverageAffectedArea'].'</CoverageAffectedArea>';
                                        }

                                        if ($policy_coverages['CoverageInsuredArea']) {
                                            $xmlCoverages .= '<CoverageInsuredArea>'.(boolean)$policy_coverages['CoverageInsuredArea'].'</CoverageInsuredArea>';
                                        }

                                        if ($policy_coverages['CoveragePercentage']) {
                                            $xmlCoverages .= '<CoveragePercentage>'.(float)$policy_coverages['CoveragePercentage'].'</CoveragePercentage>';
                                        }

                                        $xmlCoverages .= '<EventId>'.$policy_coverages['EventId'].'</EventId>';

                                        if ($policy_coverages['CoverageExcess']) {
                                            $xmlCoverages .= '<CoverageExcess>'.$policy_coverages['CoverageExcess'].'</CoverageExcess>';
                                        }
                                    $xmlCoverages .= '</Coverage>';
                }

                $xmlPolicies .=   $xmlCoverages.'</PolicyCoverages></Policy>';

                /* Monta XML RequestShare */
                foreach ($dados['RequestedShares'] as $request_share) {
                    $xmlRequestShared .= '<RequestedShare xsi:type="HarvestRequestedShare">';

                                    if ($request_share['ShareArea']) {
                                        $xmlRequestShared .= '<ShareArea>'.$request_share['ShareArea'].'</ShareArea>';
                                    }

                                    $xmlRequestShared .= '<EstimatedYield>'.(string)$request_share['EstimatedYield'].'</EstimatedYield>
                                    <ShareName>'.$request_share['ShareName'].'</ShareName>';

                                    if ($request_share['CropTypeId']) {
                                        $xmlRequestShared .= '<CropTypeId>'.$request_share['CropTypeId'].'</CropTypeId>';
                                    }

                                    $xmlRequestShared .= '<SharePotentialYield>'.$request_share['SharePotentialYield'].'</SharePotentialYield>';

                                    if (1==2) { //forçado para não entrar no bloque, por hora
                                        $xmlRequestShared .= '<HarvestMonthFractionId>'.$request_share['HarvestMonthFractionId'].'</HarvestMonthFractionId>
                                        <HarvestMonthId>'.$request_share['HarvestMonthId'].'</HarvestMonthId>
                                        <ShareReducedYield>'.$request_share['ShareReducedYield'].'</ShareReducedYield>
                                        <SowedMonthFractionId>'.$request_share['SowedMonthFractionId'].'</SowedMonthFractionId>
                                        <SowedMonthId>'.$request_share['SowedMonthId'].'</SowedMonthId>';
                                    }

                                    if ($request_share['ShareInsuredYield']) {
                                        $xmlRequestShared .= '<ShareInsuredYield>'.$request_share['ShareInsuredYield'].'</ShareInsuredYield>';
                                    }

                                    $xmlRequestShared .= '<ShareIdReference>'.$request_share['ShareIdReference'].'</ShareIdReference>';
                                    
                                $xmlRequestShared .= '</RequestedShare>';
                }

                $xmlInspectors = '<InspectorsToAssign>';

                foreach ($dados['InspectorsToAssign'] as $inspectors_assign) {
                    $xmlInspectors .= '<Inspectors>
                                           <InspectorId>'.$inspectors_assign['InspectorId'].'</InspectorId>
                                       </Inspectors>';
                }

                $xmlInspectors .= '</InspectorsToAssign>';
            }

            /** Monta XML para laudo PDF **/
            $xmlPDF = '<LaudoPdfData>
                        <Titulo>LAUDO DE VISTORIA FINAL DE DANOS</Titulo>
                        <Cultura>'.Agro_Util::removeAcentos($dados['ds_nome_cultura']).'</Cultura>
                        <Producto>'.Agro_Util::removeAcentos($dados['ds_nome_produto']).'</Producto>
                        <CoberturaPrincipal>'.$dados['ds_nome_cobertura'].'</CoberturaPrincipal>
                        <Proposta>'.$dados['id_proposta'].'</Proposta>
                        <Apolice>'.$dados['nro_apolice'].'</Apolice>
                        <Safra>'.$dados['ds_nome_safra'].'</Safra>
                        <VisitoriaAgronetNo>'.$dados['id_vistoria'].'</VisitoriaAgronetNo>
                        <EmpressaVisitoria>'.Agro_Util::removeAcentos($dados['ds_nome_empresa_vistoria']).'</EmpressaVisitoria>
                        <NomeDoSegurado>'.Agro_Util::removeAcentos($dados['ds_nome_segurado']).'</NomeDoSegurado>
                        <CpfCnpjSegurado>'.$dados['cpf_cnpj_segurado'].'</CpfCnpjSegurado>
                        <EnderPropriedade>'.Agro_Util::removeAcentos($dados['ds_endereco_propriedade']).'</EnderPropriedade>
                        <MunicipioPropriedade>'.Agro_Util::removeAcentos($dados['ds_nome_municipio']).'</MunicipioPropriedade>';

            $xmlPDFAvisos = '<Avisos>';

            foreach ($dados['avisos'] as $aviso) { 
                $xmlPDFAvisos .= '<AvisoSiniestroNo>'.$aviso.'</AvisoSiniestroNo>';
            }

            $xmlPDFAvisos .= '</Avisos>';

            $xmlPDFEventos = '<Eventos>';

            foreach ($dados['eventos'] as $evento) {
                $xmlPDFEventos .= '<Evento>
                                    <NomeEvento>'.$evento['ds_nome_evento'].'</NomeEvento>
                                    <DataEvento>'.$evento['dt_evento'].'</DataEvento>
                                </Evento>';
            }

            $xmlPDFEventos .= '</Eventos>';


            $xmlPDFPessoas = '<PessoasAutorizadas>';

            foreach ($dados['PessoasAutorizadas'] as $pessoa) {
                $xmlPDFPessoas .= '<PessoaAutorizada>
                                        <NomePessoa>'.Agro_Util::removeAcentos($pessoa['NomePessoa']).'</NomePessoa>
                                        <DocumentoPessoa>'.$pessoa['DocumentoPessoa'].'</DocumentoPessoa>
                                        <ParentescoPessoa>'.Agro_Util::removeAcentos($pessoa['ParentescoPessoa']).'</ParentescoPessoa>
                                        <TelefonePessoa>'.$pessoa['TelefonePessoa'].'</TelefonePessoa>
                                </PessoaAutorizada>';
            }

            $xmlPDFPessoas .= '</PessoasAutorizadas>';

            $xmlPDF .= $xmlPDFAvisos . $xmlPDFEventos . $xmlPDFPessoas . '</LaudoPdfData>';

            $xml = '<InspectionBR>
                        <Inspection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="HarvestInspection">
                            <InspectionObservations>'.$dados['InspectionObservation'].'</InspectionObservations>
                            <Establishment>
                                <EstablishmentName>'.Agro_Util::removeAcentos($dados['EstablishmentName']).'</EstablishmentName>
                                <TownId>'.$dados['TownId'].'</TownId>
                                <DistrictId>'.$dados['DistrictId'].'</DistrictId>
                                <EstablishmentGPSLatitude>'.$dados['EstablishmentGPSLatitude'].'</EstablishmentGPSLatitude>
                                <EstablishmentGPSLongitude>'.$dados['EstablishmentGPSLongitude'].'</EstablishmentGPSLongitude>
                                <EstablishmentObservation>'.Agro_Util::removeAcentos($dados['EstablishmentObservations']).'</EstablishmentObservation>
                                <EstablishmentLocation>'.Agro_Util::removeAcentos($dados['EstablishmentLocation']).'</EstablishmentLocation>
                            </Establishment>
                            <Contact>
                                <ContactMobile>'.$dados['ContactMobile'].'</ContactMobile>
                                <ContactName>'.Agro_Util::removeAcentos($dados['ContactName']).'</ContactName>
                                <ContactTelephone>'.$dados['ContactTelephone'].'</ContactTelephone>
                            </Contact>';

                            if ($xmlImagens) {
                                $xml .= '<Images>
                                            '.$xmlImagens.'
                                        </Images>';
                            } else {
                                $xml .= '<Images/>';
                            }
                            $xml .= '<Policies>
                                '.$xmlPolicies.'
                            </Policies>
                            <RequestedShares>
                                '.$xmlRequestShared.'
                            </RequestedShares>
                        </Inspection>';

                $xml .= $xmlInspectors.$xmlPDF.'</InspectionBR>';

        } else {
            return $this->errorMessage;
        } 

        $this->debug($xml, 'harvestInspection');
        return base64_encode(Agro_Util::removeAcentos($xml));
    }

    public function downloadInspection ($dados) {
        $xml = null;

        if ((is_array($dados)) && (!empty($dados))) {

            $xml = '<DownloadInspection xmlns="http://tempuri.org/">
                        <userName>'.$this->username.'</userName>
                        <userPassword>'.$this->password.'</userPassword>
                        <inspectionCompanyCode>'.$dados['inspectionCompanyCode'].'</inspectionCompanyCode>
                        <policyNumber>'.$dados['policyNumber'].'</policyNumber>
                   </DownloadInspection>';
        } else {
            return $this->errorMessage;
        }

        return $this->doRequest($xml, 'DownloadInspection');        
    }
    
    /* salva um arquivo XML com o conteúdo da variável POST_DATA para analise */
    private function debug($msg, $name='') {
        $filename = APPLICATION_PATH.'/upload_files/xml_envio_tagh/'.date('YmdHi').'_'. ($name == '' ? 'post_data' : $name) .'.xml';
        try {
            $f = fopen($filename, 'w');
            fwrite($f, html_entity_decode($msg));
            fclose($f);
            return true;
            
        } catch (Exception $e) {
            
            die($e->getMessage());    
            
        }
    }
    
    /* salva o retorno XML da chamada ao webservice TAGH */
    private function debugResult($msg,$service) {
        $filename = APPLICATION_PATH.'/upload_files/xml_recepcao_tagh/'.date('YmdHi').'_'.$service.'_post_data.xml';    
        try {
            $f = fopen($filename, 'w');
            fwrite($f, $msg);
            fclose($f);
            return true;
            
        } catch (Exception $e) {
            
            die($e->getMessage());
            
        }
    }
}
