<?php

class Produto_Model_Validacoescapacidade extends Agro_Db_Table_Abstract {
	protected $_schema = 'produto';
	protected $_name = 'validacoes_limites_capacidade';
	protected $_primary = 'id';
	public $_order = 'ds_nome_grupo';

	public function save($values, $subgrupo=false) {
		$this->getAdapter()->beginTransaction();

		$Row = $this->getRow($values['id']);
		$Row->vl_limite_capacidade = Agro_Util::formatCurrencyDb($values['vl_limite_capacidade']);
		$Row->ds_nome_grupo = $values['ds_nome_grupo'];
		$Row->fl_agrupar_municipios = $values['fl_agrupar_municipios'];
		$Row->fl_limite_corretor = true;
		$Row->fl_ativo = ($values['fl_ativo'] ? 1 : 0);

        if (array_key_exists('tipo_corretor_vinculo', $values)) {
            $Row->tipo_corretor_vinculo = $values['tipo_corretor_vinculo'];
        }

		if($values['id_parent'] > 0){
			$Row->id_parent = $values['id_parent'];
		}

        $Row->vl_reserva_tecnica = Agro_Util::formatCurrencyDb($values['vl_reserva_tecnica']);

		if ($Row->save()) {
			if (!$subgrupo) {
                $LimiteProdutos = new Produto_Model_Validacoescapacidadeproduto();
                $LimiteProdutos->deleteLimite($Row->id);

                if (is_array($values['id_produto'])) {
                    foreach ($values['id_produto'] as $idProduto) {
                        $LimiteProdutos->save($Row->id, $idProduto);
                    }
                }

                $rsSubgrupos = $this->fetchAll("id_parent = {$Row->id}")->toArray();

                foreach ($rsSubgrupos as $registroSubGrupo) {
                    $LimiteProdutos->deleteLimite($registroSubGrupo['id']);

                    if (is_array($values['id_produto'])) {
                        foreach ($values['id_produto'] as $idProduto) {
                            $LimiteProdutos->save($registroSubGrupo['id'], $idProduto);
                        }
                    }
                }
            }

            $id_grupo_limite_capacidade = $Row->id;

            //se for Subgrupo, salva todos os relacionamentos do grupo pai
			if($subgrupo && empty($values['id'])) {
				$this->getDefaultAdapter()->query("delete from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = $id_grupo_limite_capacidade");
				$this->getDefaultAdapter()->query("delete from produto.validacoes_limites_capacidade_produtos where id_grupo_limite_capacidade = $id_grupo_limite_capacidade");
				$this->getDefaultAdapter()->query("delete from produto.validacoes_limites_capacidade_estados where id_grupo_limite_capacidade = $id_grupo_limite_capacidade");
				$this->getDefaultAdapter()->query("delete from produto.validacoes_limites_capacidade_usuarios where id_grupo_limite_capacidade = $id_grupo_limite_capacidade");
				$this->getDefaultAdapter()->query("delete from produto.validacoes_limites_capacidade_produtos where id_grupo_limite_capacidade = $id_grupo_limite_capacidade");
				
				//salva relacionamento de Produtos
				$Model = new Produto_Model_Validacoescapacidadeproduto();
				if($Rs = $Model->fetchAll("id_grupo_limite_capacidade = ".$values['id_parent'])){
					if ($Rs->count()) {
						foreach ($Rs as $Row) {
							$Model->save($id_grupo_limite_capacidade, $Row->id_produto);
						}
					}
				}
				
				//salva relacionamento de Coberturas
				$Model = new Produto_Model_Validacoescapacidadelimitecobertura();
				if($Rs = $Model->fetchAll("id_grupo_limite_capacidade = ".$values['id_parent'])){
					if ($Rs->count()) {
						foreach ($Rs as $Row) {
							$Model->save($id_grupo_limite_capacidade, $Row->id_cobertura);
						}
					}
				}
				
				//salva relacionamento de Usuarios
				$Model = new Produto_Model_ValidacoesCapacidadeUsuarios();
				if($Rs = $Model->fetchAll("id_grupo_limite_capacidade = ".$values['id_parent'])){
					if ($Rs->count()) {
						foreach ($Rs as $Row) {
							$Model->save($id_grupo_limite_capacidade, $Row->id_usuario);
						}
					}
				}
				
				//salva relacionamento de Estados
				$Model = new Produto_Model_Validacoescapacidadelimiteestado();
				if($Rs = $Model->fetchAll("id_grupo_limite_capacidade = ".$values['id_parent'])){
					if ($Rs->count()) {
						foreach ($Rs as $Row) {
							$Model->save($id_grupo_limite_capacidade, $Row->id_estado);
						}
					}
				}
				
				//salva relacionamento de Municipios
				$Model = new Produto_Model_Validacoescapacidadelimitemunicipio();
				if($Rs = $Model->fetchAll("id_grupo_limite_capacidade = ".$values['id_parent'])){
					if ($Rs->count()) {
						foreach ($Rs as $Row) {
							$arMunicipios[] = $Row->id_municipio;
						}
						
						$Model->save($id_grupo_limite_capacidade, $arMunicipios, false);
					}
				}
				
			}
				
			$this->getAdapter()->commit();
			
			return $id_grupo_limite_capacidade;
		}

		$this->getAdapter()->rollBack();
		return false;
	}

	public function getData($where=false) {
		$select = $this->select()->distinct(true);
		$select->setIntegrityCheck(false);
		$select->from(array("vlc" => "produto.v_limite_capacidade_utilizado_resumido"), array('vlc.*'));
	
		if ($this->_order) {
			$select->order($this->_order);
		}

		if (is_array($where)) {
            $listagemSubGrupo = array_key_exists('listsubgrupo', $where);

            if (array_key_exists('id', $where)) {
                $condicao = "     (vlc.id_parent is null AND vlc.id = {$where['id']['value']}) ";
                $condicao .= " OR vlc.id in(SELECT id_parent ";
                $condicao .= "                FROM produto.v_limite_capacidade_utilizado_resumido vlc_sub ";
                $condicao .= "               WHERE vlc_sub.id = {$where['id']['value']})";

                if ($listagemSubGrupo) {
                    $condicao = " vlc.id = {$where['id']['value']} ";
                }

                $select->where($condicao);

                unset($where['id']);
            }

            if (array_key_exists('ds_nome_subgrupo', $where)) {
                $condicao = " vlc.id in(SELECT id_parent ";
                $condicao .= "            FROM produto.v_limite_capacidade_utilizado_resumido vlc_sub ";
                $condicao .= "           WHERE vlc_sub.ds_nome_grupo ilike '{$where['ds_nome_subgrupo']['value']}')";

                if ($listagemSubGrupo) {
                    $condicao = " vlc.ds_nome_grupo ilike '{$where['ds_nome_subgrupo']['value']}' ";
                }

                $select->where($condicao);

                unset($where['ds_nome_subgrupo']);
            }

            if (array_key_exists('ds_nome_usuario', $where)) {
                $valueNomeUsuario = $where['ds_nome_usuario']['value'];

                $select->join(['pvlcu' => 'produto.validacoes_limites_capacidade_usuarios'], 'pvlcu.id_grupo_limite_capacidade = vlc.id', false);
                $select->join(['su' => 'sistema.usuarios'], 'su.id = pvlcu.id_usuario', false);

                $condicao = "     (vlc.id_parent is null AND su.ds_nome_usuario ilike '{$valueNomeUsuario}') ";
                $condicao .= " OR vlc.id in(SELECT distinct id_parent ";
                $condicao .= "                FROM produto.v_limite_capacidade_utilizado_resumido vlc_sub ";
                $condicao .= "                     INNER JOIN produto.validacoes_limites_capacidade_usuarios pvlcu_sub ON pvlcu_sub.id_grupo_limite_capacidade = vlc_sub.id ";
                $condicao .= "                     INNER JOIN sistema.usuarios su_sub ON su_sub.id = pvlcu_sub.id_usuario ";
                $condicao .= "               WHERE su_sub.ds_nome_usuario ilike '{$valueNomeUsuario}')";

                if ($listagemSubGrupo) {
                    $condicao = " vlc.id_parent is not null AND su.ds_nome_usuario ilike '{$valueNomeUsuario}' ";
                }

                $select->where($condicao);

                unset($where['ds_nome_usuario']);
            }

            unset($where['listsubgrupo']);

			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];
	
					$select->where("$field $operator ?", $value);
				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}

		return $select;
	}

	public function beforeDelete($params, $field='') {
		$this->getDefaultAdapter()->query("delete from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = $params");
		$this->getDefaultAdapter()->query("delete from produto.validacoes_limites_capacidade_produtos where id_grupo_limite_capacidade = $params");
		$this->getDefaultAdapter()->query("delete from produto.validacoes_limites_capacidade_estados where id_grupo_limite_capacidade = $params");
	}

	public function getProdutosNaoRelacionados() {
		$Select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$Select->from(array('p' => 'produto.produtos'), array('id', 'ds_nome_produto'));
		$Rs = $this->fetchAll($Select);

		$ret = array();
		if ($Rs->count()) {
			foreach ($Rs as $Row) {
				$ret[$Row->id] = $Row->ds_nome_produto;
			}
		}

		return $ret;
	}

	public function getProdutosRelacionados(int $id)
    {
        $select = $this->select()->setIntegrityCheck(false)->distinct(true);
        $select->from(array('p' => 'produto.produtos'), array('id', 'ds_nome_produto'));
        $select->join(array('v' => 'produto.validacoes_limites_capacidade_produtos'), 'p.id = v.id_produto', null);
        $select->where('id_grupo_limite_capacidade = ?', $id);
        $select->order('ds_nome_produto');
        $rs = $this->fetchAll($select);

        $ret = array();
        if ($rs->count()) {
            foreach ($rs as $Row) {
                $ret[$Row->id] = $Row->ds_nome_produto;
            }
        }

        return $ret;
    }
	
	public function getSomaSubgrupos(int $idParent, int $id = null)
    {
        $select = $this->select()->setIntegrityCheck(false)->distinct();
        $select->from(
            array('v' => 'produto.validacoes_limites_capacidade'),
            array('sum(vl_limite_capacidade) as vl_soma_subgrupos')
        );
        $select->where('id_parent = ?', $idParent);
        $select->where('fl_ativo = true');

        if (!empty($id)) {
            $select->where('id <> ?', $id);
        }

        return $this->_db->fetchOne($select);
    }
	
	public function copiar($idSafra) {
	      
	    if(!$idSafra){
	        $idSafra = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne('select id from produto.safras where fl_vigente=true');
	    }
	    
        $Rs = $this->fetchAll("id in (
                                    select 
                                        id_grupo_limite_capacidade 
                                    from 
                                        produto.validacoes_limites_capacidade_produtos 
                                    where id_produto in 
                                	   ( select id from produto.produtos where id_safra = $idSafra )
                                    group by 
                                        id_grupo_limite_capacidade
                                    )"
        );
        
        foreach ($Rs as $Old) {
            if ($Old) {
           
                $New = $this->createRow();
                $New->ds_nome_grupo         = $Old->ds_nome_grupo;
                $New->vl_limite_capacidade	= $Old->vl_limite_capacidade;
                $New->fl_agrupar_municipios = $Old->fl_agrupar_municipios ? $Old->fl_agrupar_municipios : 'f';
                $New->fl_limite_corretor 	= $Old->fl_limite_corretor ? $Old->fl_limite_corretor : 'f';
                $New->tipo_corretor_vinculo = $Old->tipo_corretor_vinculo;
                $New->id_parent 			= $Old->id_parent;
                
                if ($New->save()) {
                   $this->_copiarEstado($Old, $New);
                   $this->_copiarMunicipio($Old, $New);
                   $this->_copiarUsuarios($Old, $New);
                   $this->_copiarCoberturas($Old, $New);
                   $this->_copiarProdutos($Old, $New);
                }
            }
        }
	    
	    return true;
	}
	
	private function _copiarEstado($Old, $New) {
	    $Estados = $this->getDefaultAdapter()->fetchAll("SELECT * FROM produto.validacoes_limites_capacidade_estados WHERE id_grupo_limite_capacidade = {$Old->id}");
	    
	    if (count($Estados)) {
	        foreach ($Estados as $Estado) {
	            $this->getDefaultAdapter()->insert('produto.validacoes_limites_capacidade_estados', array(
	                'id_estado' => $Estado['id_estado'],
	                'id_grupo_limite_capacidade' => $New->id,
	                'id_usuario_criacao' => Zend_Auth::getInstance()->getIdentity()->id
	            ));
	        }
	    }
	}
	
	private function _copiarMunicipio($Old, $New) {
	    $Municipios = $this->getDefaultAdapter()->fetchAll("SELECT * FROM produto.validacoes_limites_capacidade_municipios WHERE id_grupo_limite_capacidade = {$Old->id}");
	    
	    if (count($Municipios)) {
	        foreach ($Municipios as $Municipio) {
	            $this->getDefaultAdapter()->insert('produto.validacoes_limites_capacidade_municipios', array(
	                'id_municipio' => $Municipio['id_municipio'],
	                'id_grupo_limite_capacidade' => $New->id,
	                'id_usuario_criacao' => Zend_Auth::getInstance()->getIdentity()->id
	            ));
	        }
	    }
	}
	
	private function _copiarUsuarios($Old, $New) {
	    $Usuarios = $this->getDefaultAdapter()->fetchAll("SELECT * FROM produto.validacoes_limites_capacidade_usuarios WHERE id_grupo_limite_capacidade = {$Old->id}");
	    
	    if (count($Usuarios)) {
	        foreach ($Usuarios as $Usuario) {
	            $this->getDefaultAdapter()->insert('produto.validacoes_limites_capacidade_usuarios', array(
	                'id_usuario' => $Usuario['id_usuario'],
	                'id_grupo_limite_capacidade' => $New->id,
	                'id_usuario_criacao' => Zend_Auth::getInstance()->getIdentity()->id
	            ));
	        }
	    }
	}
	
	private function _copiarCoberturas($Old, $New) {
	    $Coberturas = $this->getDefaultAdapter()->fetchAll("SELECT * FROM produto.validacoes_limites_capacidade_coberturas WHERE id_grupo_limite_capacidade = {$Old->id}");
	    
	    if (count($Coberturas)) {
	        foreach ($Coberturas as $Cobertura) {
	            $this->getDefaultAdapter()->insert('produto.validacoes_limites_capacidade_coberturas', array(
	                'id_cobertura' => $Cobertura['id_cobertura'],
	                'id_grupo_limite_capacidade' => $New->id,
	                'id_usuario_criacao' => Zend_Auth::getInstance()->getIdentity()->id
	            ));
	        }
	    }
	}
	
	private function _copiarProdutos($Old, $New) {
	    $Produtos = $this->getDefaultAdapter()->fetchAll("SELECT * FROM produto.validacoes_limites_capacidade_produtos WHERE id_grupo_limite_capacidade = {$Old->id}");
	    
	    if (count($Produtos)) {
	        foreach ($Produtos as $Produto) {
	            
	            $ProdutosLegacy = $this->getDefaultAdapter()->fetchAll("SELECT id FROM produto.produtos WHERE id_legacy = {$Produto['id_produto']}");

	            foreach ($ProdutosLegacy as $ProdutoLegacy) {
    	            $this->getDefaultAdapter()->insert('produto.validacoes_limites_capacidade_produtos', array(
    	                'id_produto' => $ProdutoLegacy['id'],
    	                'id_grupo_limite_capacidade' => $New->id,
    	                'id_usuario_criacao' => Zend_Auth::getInstance()->getIdentity()->id
    	            ));
	            }
	        }
	    }
	}

    public function getValorUsadoLimiteCapacidade($idValidacao)
    {
        Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll("SELECT seguro.valor_retido(0);");
        Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll("CREATE temp TABLE validacoes_limites_capacidade_tmp AS (SELECT * FROM produto.validacoes_limites_capacidade where id = {$idValidacao});");

        $subQuery = "(
				        SELECT
				            sum(vl_lmga_capacidade)
				        FROM
				        seguro.propostas_endosso pe
						INNER JOIN seguro.propostas AS p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
					    INNER JOIN sistema.status AS st ON p.id_status = st.id
					    INNER JOIN seguro.propostas_propriedades AS pr ON p.id = pr.id_proposta
					    INNER JOIN sistema.municipios AS m ON m.id = pr.id_municipio
					    INNER JOIN sistema.estados AS e ON e.id = m.id_estado
					    INNER JOIN sumario.itens_segurados AS pp ON p.id = pp.id_proposta
						INNER JOIN seguro.propostas_corretores spc ON spc.id_proposta = p.id
					WHERE
						spc.id_usuario not in (487, 488) AND
					    (p.id_produto in ((SELECT p.id_produto FROM produto.validacoes_limites_capacidade_produtos AS p WHERE (id_grupo_limite_capacidade = vlc.id)))) AND
					    (m.id_estado in ((SELECT p.id_estado FROM produto.validacoes_limites_capacidade_estados AS p WHERE (id_grupo_limite_capacidade = vlc.id)))) AND
					    (st.ds_chave not in ('PROPOSTA_INCOMPLETA','NAO_ENVIADA','DEVOLVIDA','PROPOSTA_CANCELADA', 'ENDOSSO_INCOMPLETO', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')) AND
						(
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 1 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 2 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id)
				)
				    ) as vl_utilizado";

        $camposQuery = [
            'vlc.id',
            'vlc.ds_nome_grupo',
            'vlc.vl_limite_capacidade',
            $subQuery,
            'vlc.vl_reserva_tecnica',
        ];

        $select = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
        $select->from(['vlc' => 'validacoes_limites_capacidade_tmp'], $camposQuery);
        $select->where('vlc.id = ?', $idValidacao);
        $select->where('vlc.fl_ativo = true');
        $select->where('vlc.fl_agrupar_municipios = false');
        $select->where('vlc.id not in (SELECT id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_municipios)');

        $subQuery = "(
				        SELECT
				            sum(vl_lmga_capacidade)
				        FROM
				        seguro.propostas_endosso pe
						INNER JOIN seguro.propostas AS p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
					    INNER JOIN sistema.status AS st ON p.id_status = st.id
					    INNER JOIN seguro.propostas_propriedades AS pr ON p.id = pr.id_proposta
					    INNER JOIN sistema.municipios AS m ON m.id = pr.id_municipio
					    INNER JOIN sistema.estados AS e ON e.id = m.id_estado
					    INNER JOIN sumario.itens_segurados AS pp ON p.id = pp.id_proposta
						INNER JOIN seguro.propostas_corretores spc ON spc.id_proposta = p.id
					WHERE
						spc.id_usuario not in (487, 488) AND
					    (p.id_usuario_criacao in ((SELECT u.id_usuario FROM produto.validacoes_limites_capacidade_usuarios AS u WHERE (u.id_grupo_limite_capacidade = vlc.id)))) AND
						(pr.id_municipio in ((SELECT m.id_municipio FROM produto.validacoes_limites_capacidade_municipios AS m WHERE (m.id_grupo_limite_capacidade = vlc.id)))) AND
					    (p.id_produto in ((SELECT p.id_produto FROM produto.validacoes_limites_capacidade_produtos AS p WHERE (id_grupo_limite_capacidade = vlc.id)))) AND
					    (st.ds_chave not in ('PROPOSTA_INCOMPLETA','NAO_ENVIADA','DEVOLVIDA','PROPOSTA_CANCELADA', 'ENDOSSO_INCOMPLETO', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')) AND
						(
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 1 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 2 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id)
				)
				    ) as vl_utilizado";

        $camposQuery = [
            'vlc.id',
            'vlc.ds_nome_grupo',
            'vlc.vl_limite_capacidade',
            $subQuery,
            'vlc.vl_reserva_tecnica',
        ];

        $select2 = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
        $select2->from(['vlc' => 'validacoes_limites_capacidade_tmp'], $camposQuery);
        $select2->where('vlc.id = ?', $idValidacao);
        $select2->where('vlc.fl_ativo = true');
        $select2->where('vlc.fl_agrupar_municipios = true');

        $subQuery = "(
				        SELECT
				            sum(vl_lmga_capacidade)
				        FROM
				        seguro.propostas_endosso pe
						INNER JOIN seguro.propostas AS p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
					    INNER JOIN sistema.status AS st ON p.id_status = st.id
					    INNER JOIN seguro.propostas_propriedades AS pr ON p.id = pr.id_proposta
					    INNER JOIN sistema.municipios AS m ON m.id = pr.id_municipio
					    INNER JOIN sistema.estados AS e ON e.id = m.id_estado
					    INNER JOIN sumario.itens_segurados AS pp ON p.id = pp.id_proposta
						INNER JOIN seguro.propostas_corretores spc ON spc.id_proposta = p.id
					WHERE
						spc.id_usuario not in (487, 488) AND
					    (p.id_usuario_criacao in ((SELECT u.id_usuario FROM produto.validacoes_limites_capacidade_usuarios AS u WHERE (u.id_grupo_limite_capacidade = vlc.id)))) AND
					    (p.id_produto in ((SELECT p.id_produto FROM produto.validacoes_limites_capacidade_produtos AS p WHERE (id_grupo_limite_capacidade = vlc.id)))) AND
                        (
                	        (m.id_estado in ((SELECT p.id_estado FROM produto.validacoes_limites_capacidade_estados AS p WHERE (id_grupo_limite_capacidade = vlc.id))))
                	        OR
                	        (m.id in ((SELECT p.id_municipio FROM produto.validacoes_limites_capacidade_municipios AS p WHERE (id_grupo_limite_capacidade = vlc.id))))
                	    ) AND
					    (st.ds_chave not in ('PROPOSTA_INCOMPLETA','NAO_ENVIADA','DEVOLVIDA','PROPOSTA_CANCELADA', 'ENDOSSO_INCOMPLETO', 'ORCAMENTO_ENDOSSO', 'ENDOSSO_ANULADO', 'SOLICITACAO_CANCELADA')) AND
						(
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 1 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id) or
							(select id_cobertura from produto.validacoes_limites_capacidade_coberturas where id_grupo_limite_capacidade = vlc.id order by id_cobertura offset 2 limit 1) in (select id_cobertura from seguro.propostas_coberturas where id_proposta = p.id)
				)
				    ) as vl_utilizado";

        $camposQuery = [
            'vlc.id',
            'vlc.ds_nome_grupo',
            'vlc.vl_limite_capacidade',
            $subQuery,
            'vlc.vl_reserva_tecnica',
        ];

        $select3 = Agro_Db_Table_Abstract::getDefaultAdapter()->select();
        $select3->from(['vlc' => 'validacoes_limites_capacidade_tmp'], $camposQuery);
        $select3->where('vlc.id = ?', $idValidacao);
        $select3->where('vlc.fl_ativo = true');
        $select3->where('vlc.fl_agrupar_municipios = false');
        $select3->where('vlc.id not in (SELECT id_grupo_limite_capacidade from produto.validacoes_limites_capacidade_municipios)');

        $selectTotal = $this->select()->setIntegrityCheck(false);
        $selectTotal->union(array($select, $select2, $select3));

        return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($selectTotal);
    }
}