<?php

class Seguro_Model_ItensSegurados extends Agro_Db_Table_Abstract {
	protected $_rowClass = 'Seguro_Model_Row_ItensSegurados';
	protected $_name = 'itens_segurados';
	protected $_schema = 'seguro';
	protected $_primary = 'id';
	protected $_log = true;

	public function save($nro, $unidade, $proposta, bool $origemEndossoImportacaoItensLaudo = false) {
	    $Propostas = new Seguro_Model_Propostas();
	    $Proposta = $Propostas->find($proposta)->current();
	    
	    $atributos_is = $Proposta->atributos_rn('UNIDADE_SEGURADA', false, false);
	    
	    foreach ($atributos_is as $atributo_required){
	        if($atributo_required['fl_required'] == true){
	            $arRequired[$atributo_required['ds_chave_rn']] = true;
	        }
	    }

		if ($nro && $proposta) {
			$Row = $this->fetchRow("id_proposta = $proposta and nr_item_segurado = $nro");
			if (!$Row) $Row = $this->createRow();
			
			$Row->id_proposta = $proposta;
			$Row->nr_item_segurado = ($nro ? $nro : null);
		    $Row->vl_area = $unidade['IS_AREA'];
			$Row->vl_idade = $unidade['IS_IDADE'];
			$Row->vl_lmga = Agro_Util::formatCurrencyDb($unidade['IS_LMGA_PARCIAL']);
			$Row->nr_plantas = $unidade['IS_NRO_PLANTAS'];
			$Row->id_variedade = $unidade['IS_VARIEDADES'];
			$Row->ds_item_segurado = preg_replace('/\s+/', ' ', $unidade['IS_DESCRICAO_ITEM']);
			$Row->vl_valor_tonelada = $unidade['IS_VALOR_TONELADA'] ? Agro_Util::formatCurrencyDb($unidade['IS_VALOR_TONELADA']) : $Row->vl_valor_tonelada;
			$Row->vl_valor_custeio = ($unidade['IS_VALOR_CUSTEIO'] ? Agro_Util::formatCurrencyDb($unidade['IS_VALOR_CUSTEIO']) : '0.0');
			$Row->vl_producao_planta = Agro_Util::formatCurrencyDb($unidade['IS_PRODUCAO_PLANTA']);
			$Row->vl_rendimento_tonelada = $unidade['IS_PRODUTIVIDADE'] ? Agro_Util::formatCurrencyDb($unidade['IS_PRODUTIVIDADE']) : $Row->vl_rendimento_tonelada;

			if (array_key_exists('IS_ESPACAMENTO_COMPOSTO', $unidade)) {
				$Row->ds_espacamento = $unidade['IS_ESPACAMENTO_COMPOSTO']['n'].'x'.$unidade['IS_ESPACAMENTO_COMPOSTO']['m'];
			} elseif (array_key_exists('IS_ESPACAMENTO_SIMPLES', $unidade)) {
				$Row->ds_espacamento = $unidade['IS_ESPACAMENTO_SIMPLES'];
			}

            if (array_key_exists('fl_importado_previa', $unidade)) {
                $Row->fl_importado_previa = $unidade['fl_importado_previa'] ? 't' : 'f';
            }
			
			if ($Row->save()) {
				$ItensSeguradosComplementos = new Seguro_Model_ItensSeguradosComplementos();
				if(!$ItensSeguradosComplementos->save($unidade, $Row->id, $arRequired, $origemEndossoImportacaoItensLaudo)){
				    return false;
				}
			}

			$Propostas = new Seguro_Model_Propostas();
			$Proposta = $Propostas->find($proposta)->current();
			Agro_Db_Table_Abstract::getDefaultAdapter()->query("update seguro.propostas_endosso set dt_alteracao='now()',id_usuario_alteracao={$this->_user->id}, fl_coberturas_atualizadas = false where id_endosso = {$Proposta->id_endosso}");

			return true;
		}

		return false;
	}

	public function getIdProposta($idUnidade) {
		return $this->getAdapter()->fetchOne("select id_proposta from seguro.itens_segurados where id = $idUnidade");
	}

	public function saveIdPropostaAtributo() {
		$Session = new Zend_Session_Namespace('carrega_proposta');
		$Proposta = new Zend_Session_Namespace('proposta');
		$Model = new Seguro_Model_PropostasAtributosRn();

		if (is_array($Session->unidades['itens'])) {
			foreach ($Session->unidades['itens'] as $item) {
				$Model->save($Proposta->proposta['id_proposta'], $item['id']);
			}
		}
	}

	public function fetchItensProposta($idProposta, $lmgaZerado = false) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('i' => 'seguro.v_unidades_seguradas'));
		$Select->where('id_proposta = ?', $idProposta);
		if($lmgaZerado == true){
			$Select->where('is_lmga_parcial > 0');
		}
		$Rs = $this->fetchAll($Select);

		if ($Rs->count()) {
			$r = array();
			$t = array();
			foreach ($Rs as $Row) {
				foreach ($Row->toArray() as $idx => $value) {
					$t[strtoupper($idx)] = $value;

					if ($idx == 'is_espacamento_simples') {
						$tmp = explode('X', strtoupper($value));

						$t['IS_ESPACAMENTO_COMPOSTO']['n'] = $tmp[0];
						$t['IS_ESPACAMENTO_COMPOSTO']['m'] = $tmp[1];
					}

					if ($idx == 'is_valor_tonelada') {
						$t['IS_VALOR_TONELADA'] = Agro_Util::formatDbCurrency($value);
					}
				}

				$r[$Row->is_item] = $t;
			}

			return $r;
		}

		return false;
	}

	public function getItensSegurados($idItemSegurado,$field=null){
		$data = array();

		if ($idItemSegurado) {
			if (is_array($idItemSegurado)) {
				if (count($idItemSegurado) > 0) {

					$where = 'id IN (' . implode(',',$idItemSegurado) . ')';
					$res = $this->fetchAll($where)->toArray();

					if ($field) {
						for ($i = 0; $i < count($res); $i++) {
							if (array_key_exists($field, $res[$i])) {
								$data[] = $res[$i][$field];
							}
						}
					} else {
						$data = $res;
					}
				}
			} else {
				$where = $this->getAdapter()->quoteInto('id = ?',$idItemSegurado);
				$res = $this->fetchRow($where)->toArray();

				if ($field && array_key_exists($field, $res)) {
					$data = $res[$field];
				} else {
					$data = $res;
				}
			}

		}

		return $data;
	}

	public function getItensSeguradosByLaudoPreliminar($laudoPreliminar, $idProposta) {
		$data = array();

		if ($laudoPreliminar) {
			$Safra = new Produto_Model_Safras();
			$schema = $Safra->getSafraModel($idProposta);

			$select = $this->select();
			$select->setIntegrityCheck(false);

			$fields = array (
				'id',
				'id_proposta',
				'vl_area',
				'nr_item_segurado',
				'ds_item_segurado',
				'vl_idade',
				'ds_espacamento',
				'nr_plantas',
				'vl_producao_planta',
				'vl_valor_tonelada',
				'vl_rendimento_tonelada',
				'vl_lmga',
				'id_variedade'
			);

			$select->from(array('it'=>'seguro.itens_segurados'),$fields);
			$select->join(array('li'=> $schema . '.laudos_preliminares_itens_segurados'),'li.id_item_segurado = it.id','id_laudo_preliminar');

			if (is_array($laudoPreliminar)) {
				if (count($laudoPreliminar) > 0) {
					$where = 'li.id_laudo_preliminar IN (' . implode(',',$laudoPreliminar) . ')';
					$select->where($where);
					$data = $this->fetchAll($select);
				}
			} else {
				$select->where($this->getAdapter()->quoteInto('li.id_laudo_preliminar = ?',$laudoPreliminar));
				$data = $this->fetchAll($select);
			}
		}

		return $data;
	}

	public function atualizaProdutividadeEstimada(int $idProposta, float $produtividadeEstimada): int
	{
		return $this->update(
			['vl_rendimento_tonelada' => $produtividadeEstimada],
			"id_proposta = {$idProposta}"
		);
	}

	public function getItensDisponiveisByProposta($idProposta, bool $orderbyNrItem = false) {
		$data = array();
		if ($idProposta) {
			$fields = array (
				'id',
				'id_proposta',
				'vl_area',
				'nr_item_segurado',
				'ds_item_segurado',
				'vl_idade',
				'ds_espacamento',
				'nr_plantas',
				'vl_producao_planta',
				'vl_valor_tonelada',
				'vl_rendimento_tonelada',
				'vl_lmga',
				'id_variedade'
			);

			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(['it'=>'seguro.itens_segurados'], $fields);
			$select->join(['pv' => 'produto.variedades'], 'pv.id = it.id_variedade', 'ds_nome_variedade');
			$select->joinLeft(['vi'=>'sistema.vistorias_itens_segurados'], 'it.id = vi.id_item_segurado', false);
			$select->where($this->getAdapter()->quoteInto('it.id_proposta = ?',$idProposta));
			$select->where('vi.id_item_segurado is null');

			if ($orderbyNrItem) {
				$select->order('nr_item_segurado ASC');
			}

			$data = $this->fetchAll($select)->toArray();
		}

		return $data;
	}

	/* Retorna quais s�o os �tens que est�o dispon�veis para
	agendamento de vist. final a partir dos �tens recebidos*/
	public function getItensDisponiveisAgendamento(array $idsItens, $idCobertura){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('vc'=>'sistema.vistorias_coberturas'), false);
		$select->join(array('vi' => 'sistema.vistorias_itens_segurados'),'vi.id_vistoria = vc.id_vistoria', 'vi.id_item_segurado');
		$select->where($this->getAdapter()->quoteInto('vc.id_cobertura = ?',$idCobertura));
		$res = $this->_db->fetchCol($select);

		$data = array();
		foreach ($idsItens as $item) {
			if (!in_array($item,$res)) {
				$data[] = $item;
			}
		}

		return $data;
	}

	public function getItemSeguradoByProposta($idProposta) {
		$data = array();

		if($idProposta){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('it' => 'seguro.itens_segurados'));
			$select->join(array('v' => 'produto.variedades'),'v.id = it.id_variedade', 'ds_nome_variedade');
			$select->where('it.id_proposta = ?', $idProposta);
			$select->where('it.fl_ativo = true');
			$select->order('it.id');

			$data = $this->fetchAll($select)->toArray();
		}

		return $data;
	}

	public function getComboItens(int $idProposta): array {
		$options = array();

		if($idProposta) {
			$select = $this->select()
				->setIntegrityCheck(false)
				->from(array('it' => 'seguro.itens_segurados'))
				->where('it.id_proposta = ?', $idProposta)
				->where('it.fl_ativo = true')
				->order('it.id');
			
			$Rs = $this->fetchAll($select);

			if (is_object($Rs)) {
				foreach ($Rs as $row) {
					$options[$row->id] = $row->nr_item_segurado . ' - ' . $row->ds_item_segurado;
				}
			}
		}

		return $options;
	}

	public function getItemSeguradoSemDtEncerramentoByProposta($idProposta) {
		$data = array();

		if($idProposta){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('it' => 'seguro.itens_segurados'));
			$select->join(array('v' => 'produto.variedades'),'v.id = it.id_variedade', 'ds_nome_variedade');
			$select->joinLeft(array('ae' => 'sinistro.avisos_encerramento'),'ae.id_proposta = it.id_proposta', false);
			$select->joinLeft(array('aeis' => 'sinistro.avisos_encerramento_itens_segurados'),'aeis.id_aviso_encerramento = ae.id and aeis.id_item_segurado = it.id', false);
			$select->where('it.id_proposta = ?', $idProposta);
			$select->where('it.fl_ativo = true');
			$select->where('aeis.id_item_segurado is null');
			$select->order('it.id');

			$data = $this->fetchAll($select)->toArray();
		}

		return $data;
	}

	public function getItemSeguradoById($id) {
		$data = array();

		if ($id) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('it' => 'seguro.itens_segurados'), "*");
			$select->join(array('v' => 'produto.variedades'),'v.id = it.id_variedade', 'ds_nome_variedade');
			$select->joinLeft(array('aeis' => 'sinistro.avisos_encerramento_itens_segurados'), 'aeis.id_item_segurado = it.id', null);
			$select->joinLeft(array('lfis' => 'sinistro.laudos_finais_itens_segurados'), 'lfis.id_item_segurado = it.id', 'vl_percent_area_afetada');
			$select->joinLeft(array('ae' => 'sinistro.avisos_encerramento'), 'ae.id = aeis.id_aviso_encerramento', "to_char(ae.dt_encerramento_colheita,'DD/MM/YYYY') as dt_encerramento_colheita");
			$select->where('it.id = ?', $id);

			$data = $this->fetchRow($select)->toArray();
		}

		return $data;
	}

	public function getItemSegurado($id) {
		if ($id) {
			$select = $this->select()->setIntegrityCheck(false);
			$select->from(array('lfis' => 'sinistro.laudos_finais_itens_segurados'));
			$select->where('id = ?', $id);

			return $this->fetchRow($select);
		}
	}

	public function getAreaTotal($id_proposta,$filtrar_lmga=false){
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from("seguro.itens_segurados", "sum(vl_area) as count");
		$Select->where("id_proposta = ".$id_proposta);
		if($filtrar_lmga){
		    $Select->where("vl_lmga > 0");
		}
		$Row = $this->fetchRow($Select);

		return ($Row ? $Row->count : 0);
	}

    public function getValorTonelada($idItemSegurado){
	    $Row = null;
	    if ($idItemSegurado) {
            $Select = $this->select()->setIntegrityCheck(false);
            $Select->from("seguro.itens_segurados", "vl_valor_tonelada");
            $Select->where("id = " . $idItemSegurado);
            $Row = $this->fetchRow($Select);
        }

        return ($Row ? $Row->vl_valor_tonelada : 0);
    }

	public function deleteunidade($idProposta, $nro, $flDesvincularTalhao = false) {
		$Rs = $this->fetchAll("id_proposta = $idProposta and nr_item_segurado = $nro");
		$modelPropostasCroquisTalhoes = new Seguro_Model_PropostasCroquisTalhoes();

		foreach ($Rs as $Row) {
			
			if ($flDesvincularTalhao) {
				$croquisTalhoes = $this->getAdapter()->query("
					SELECT
						spct.id,
						spct.ds_item_segurado
					FROM
						seguro.propostas_croquis spc
					INNER JOIN seguro.propostas_croquis_talhoes spct
						ON spct.id_croqui = spc.id
					WHERE
						spc.id_proposta = {$idProposta}
						AND fl_vigente is true
						AND spct.ds_item_segurado ILIKE '%{$Row->id}%'
				")->fetchAll();

				
				foreach ($croquisTalhoes as $croquiTalhao) {
					$idsItem = explode(',', $croquiTalhao['ds_item_segurado']);

					if (count($idsItem) > 1) {
						if (($key = array_search($Row->id, $idsItem)) !== false) {
							unset($idsItem[$key]);
						}
						
						$idsItensCocatenados = implode(',', $idsItem);
						$rsNomesItensSegurados = $this->getAdapter()->query("
							SELECT ds_item_segurado
							  FROM seguro.itens_segurados
							 WHERE id_proposta = {$idProposta}
							   AND id IN ($idsItensCocatenados)
							 ORDER BY id
						")->fetchAll();
						
						$nomesItens = [];
						foreach ($rsNomesItensSegurados as $nomeItem) {
							$nomesItens[] = $nomeItem['ds_item_segurado'];
						}
						$nomesItensConcatenados = implode('; ', $nomesItens);

						$this->getAdapter()->query("
							update seguro.propostas_croquis_talhoes 
								set ds_item_segurado = '{$idsItensCocatenados}',
									ds_nome = '{$nomesItensConcatenados}'
								where id = {$croquiTalhao['id']}
						");

						continue;
					}

					$this->getAdapter()->query("delete from seguro.propostas_croquis_talhoes where id = {$croquiTalhao['id']}");
				}

			}
			
			$this->getAdapter()->query("delete from seguro.itens_segurados_car where id_item_segurado = {$Row->id}");
			$this->getAdapter()->query("delete from seguro.itens_segurados where id = {$Row->id}");
		}
	}

	public function getIdByPropostaNroItemSegurado(int $idProposta, string $nro_item) : ?string {
		$select = $this->select()->setIntegrityCheck(false)
			->from('seguro.itens_segurados', "string_agg(id::varchar, ',') as ds_item_segurado")
			->where('id_proposta = ?', $idProposta)
			->where('nr_item_segurado in ('.$nro_item.')');
			
		return $this->getAdapter()->fetchOne($select);
	}

	public function getItemByPropostaNroItemSegurado(int $idProposta, string $nro_item) : array {
		$select = $this->select()->setIntegrityCheck(false)
			->from('seguro.itens_segurados')
			->where('id_proposta = ?', $idProposta)
			->where('nr_item_segurado in ('.$nro_item.')');
			
		$return = $this->getAdapter()->fetchRow($select);

        return is_array($return) ? $return : [];
	}

	public function mapNumeroItemToItemSegurado(int $idProposta): array
	{
		$select = $this->select()->setIntegrityCheck(false)
			->from('seguro.itens_segurados')
			->where('id_proposta = ?', $idProposta);
			
		$rs = $this->getAdapter()->fetchAll($select);

		$map = [];
		foreach ($rs as $row) {
			$map[$row['nr_item_segurado']] = $row;
		}

        return $map;
	}

	public function deleteProposta($idProposta) {
		if ($idProposta) {
			$this->getAdapter()->query("delete from seguro.itens_segurados where id_proposta = $idProposta");
		}
	}

	public function somaColuna($coluna, $idProposta) {
		$coluna = strtolower($coluna);

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from('seguro.v_unidades_seguradas', "sum($coluna)");
		$Select->where('id_proposta = ?', $idProposta);

		return $this->getAdapter()->fetchOne($Select);
	}

	public function getByProposta($idProposta) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('i' => 'seguro.itens_segurados'), array('id', 'id_proposta', 'vl_area'));
		$Select->join(array('ic' => 'seguro.itens_segurados_complemento'), 'i.id = ic.id_item_segurado', array('dt_plantio', 'dt_semeadura'));
		$Select->where('i.id_proposta = ?', $idProposta);

		return $this->getAdapter()->fetchRow($Select);
	}

	public function getItemSeguradoSemDataSemeaduraByProposta($idProposta) {
	    $Select = $this->select()->setIntegrityCheck(false);
	    $Select->from(array('i' => 'seguro.itens_segurados'), array('id', 'id_proposta', 'vl_area'));
	    $Select->join(array('ic' => 'seguro.itens_segurados_complemento'), 'i.id = ic.id_item_segurado', array('dt_plantio', 'dt_semeadura'));
	    $Select->where('i.id_proposta = ?', $idProposta);
	    $Select->where('ic.dt_semeadura is null');
	    
	    return $this->fetchAll($Select)->count();
	}
	
	public function getMaxDatesByProposta($idProposta) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('i' => 'seguro.itens_segurados'), array('id_proposta'));
		$Select->join(array('ic' => 'seguro.itens_segurados_complemento'), 'i.id = ic.id_item_segurado', array('MAX(dt_plantio) AS dt_plantio', 'MAX(dt_semeadura) AS dt_semeadura'));
		$Select->where('i.id_proposta = ?', $idProposta);
		$Select->group('i.id_proposta');

		return $this->getAdapter()->fetchRow($Select);
	}

	public function getAllByProposta($idProposta) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('i' => 'seguro.itens_segurados'), array('id', 'id_proposta', 'vl_area', 'ds_item_segurado', 'vl_lmga', 'nr_item_segurado'));
		$Select->joinLeft(array('ic' => 'seguro.itens_segurados_complemento'), 'i.id = ic.id_item_segurado', array('dt_plantio', 'dt_semeadura', 'ds_coordenadas_geograficas'));
		$Select->where('i.id_proposta = ?', $idProposta);

		return $this->getAdapter()->fetchAll($Select);
	}

	/**
	 * ordena os itens segurado pelo total de unidades seguradas
	 * @param integer $idProposta
	 */
	public function reOrdena($idProposta) {
		if ($idProposta) {
			$Rs = $this->fetchAll("id_proposta = $idProposta", "nr_item_segurado");

			if ($Rs->count()) {
				$i = 1;
				foreach ($Rs as $Row) {
					$Row->nr_item_segurado = $i;
					$Row->save();
					$i++;
				}
			}
		}
	}

	public function getUnidadesProcesso($id, $unidades=false){
		return array();
	}

	public function getArea($id_item_segurado){
		$Row = $this->fetchRow("id=$id_item_segurado");
		return $Row->vl_area;
	}

    public function getItensByPropostaDsItem(int $idProposta, string $dsItemSegurado) {
        $campos = [
            'sis.id as id_item_segurado', 'sis.id_proposta', 'sis.ds_item_segurado', 'sis.id_variedade', 'sisc.ds_coordenadas_geograficas',
            'sisc.dt_semeadura', 'sisc.ds_primeiro_ano_plantio', 'sisc.id_sistema_plantio', 'sisc.id_tipo_solo', 'sis.vl_area',
        ];
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sis' => 'seguro.itens_segurados'], $campos);
        $select->join(['sisc' => 'seguro.itens_segurados_complemento'], 'sisc.id_item_segurado = sis.id', false);
        $select->where('sis.id_proposta = ?', $idProposta);
        $select->where('trim(sis.ds_item_segurado) = ?', trim($dsItemSegurado));

        return $this->getAdapter()->fetchRow($select);
    }

	public function getItensTaxaCarByIdPropostaAndValorFranquia(int $idProposta, float $valorFranquia): Zend_Db_Table_Rowset
	{
		return $this->fetchAll(
			$this
				->select()
				->setIntegrityCheck(false)
				->from(['sis' => 'seguro.itens_segurados'], ['id as id_item', 'vl_lmga'])
				->join(['sisc' => 'seguro.itens_segurados_car'], 'sisc.id_item_segurado = sis.id', ['ds_car'])
				->join(['sp' => 'seguro.propostas'], 'sp.id = sis.id_proposta', false)
				->joinLeft(['ctac' => 'comercializacao.taxas_agrupamento_car'], 'ctac.ds_car = sisc.ds_car', false)
				->joinLeft(
					['cta' => 'comercializacao.taxas_agrupamento'],
					'cta.id = ctac.id_taxa_agrupamento AND cta.id_produto = sp.id_produto',
					false)
				->joinLeft(
					['ctv' => 'comercializacao.taxas_valores'],
					'ctv.id_taxa_agrupamento = cta.id',
					['vl_taxa_inadimplente', 'vl_taxa', 'id as id_taxa_valor', 'vl_franquia', 'vl_percentual_subvencao_federal']
				)
				->where('sp.id = ?', $idProposta)
				->where('ctv.vl_franquia = ?', $valorFranquia)
		);
	}

    public function buscarDadosItensSeguradosTalhoes(
        array $campos = ['*'],
        array $where = [],
        array $orderBy = ['sis.nr_item_segurado']
    ): Zend_Db_Table_Rowset
    {
        $select = $this->select()
            ->setIntegrityCheck(false)
            ->from(['sis' => "{$this->_schema}.{$this->_name}"], $campos)
            ->join(['spc' => 'seguro.propostas_croquis'], 'spc.id_proposta = sis.id_proposta', false)
			->join(['sp' => 'seguro.propostas'], 'sp.id = spc.id_proposta', false)
            ->join(
                ['spct' => 'seguro.propostas_croquis_talhoes'],
                "spct.id_croqui = spc.id AND sis.id::varchar = any(string_to_array(spct.ds_item_segurado, ','))",
                'ds_coordenadas_centroide'
            )
            ->joinLeft(
				['sisc' => 'seguro.itens_segurados_car'],
				'sisc.id_item_segurado = sis.id',
				[
					'ds_car',
					'fl_manual',
					'fl_selecionado',
					'sisc.id_usuario_criacao as id_usuario_criacao_car',
					'sisc.id_usuario_alteracao as id_usuario_alteracao_car'
				]
			)
        ;
		
        foreach ($where as $condicao) {
            $select->where($condicao);
        }

        foreach ($orderBy as $order) {
            $select->order($order);
        }
		
        return $this->fetchAll($select);
    }

	// Permite itens sem CAR com LMGA zerado
	public function possuiItemSemIdentificacaoCar(int $idProposta): bool
    {
        $select = $this->select()
            ->setIntegrityCheck(false)
            ->from(['sis'=> "{$this->_schema}.{$this->_name}"])
			->where('sis.id_proposta = ?', $idProposta)
			->where('sis.vl_lmga <> 0')
			->where('NOT EXISTS (
				SELECT
					id
				FROM seguro.itens_segurados_car siscsub
				WHERE siscsub.fl_selecionado = TRUE
					AND siscsub.id_item_segurado = sis.id
			)');

		return $this->fetchAll($select)->count() > 0;
    }

	public function getCarsManuaisSelecionadosPorProposta(int $idProposta)
    {
        $select = $this->select()
            ->setIntegrityCheck(false)
            ->from(['sis'=> "{$this->_schema}.{$this->_name}"], ['nr_item_segurado', 'ds_item_segurado'])
			->join(['sisc' => 'seguro.itens_segurados_car'], 'sisc.id_item_segurado = sis.id', 'sisc.ds_car')
            ->where('id_proposta = ?', $idProposta)
			->where('fl_manual IS TRUE AND fl_selecionado IS TRUE')
			->order('nr_item_segurado ASC');
		
		return $this->fetchAll($select);
    }
}