<?php

class Sinistro2_Model_CobrancaRelatorio extends Agro_Db_Table_Abstract {
	protected $_schema = 'sinistro';
	protected $_name = 'cobranca_relatorio';
	protected $_primary = 'id';

	public function getNota($empresa, $nf) {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('e' => 'sistema.vistorias_empresas'));
		$Select->join(array('v' => 'sinistro.cobranca_relatorio_vistorias'), 'e.id_vistoria = v.id_vistoria');
		$Select->join(array('c' => 'sinistro.cobranca_relatorio'), 'c.id = v.id_cobranca_relatorio');
		$Select->join(array('vp' => 'sinistro.vistorias_processos'), 'vp.id_vistoria = v.id_vistoria', false);
		$Select->join(array('p' => 'sinistro.processos'), 'p.id = vp.id_processo', false);
		$Select->join(array('prop' => 'seguro.propostas'), 'prop.id = p.id_proposta', false);
		$Select->join(array('prod' => 'produto.produtos'), 'prod.id = prop.id_produto', false);
		$Select->join(array('s' => 'produto.safras'), 's.id = prod.id_safra', false);
		$Select->where('e.id_empresa = ?', $empresa);
		$Select->where('e.fl_ativo = true');
		$Select->where('c.nr_nota_fiscal = ?', $nf);

		return $this->fetchAll($Select);
	}

	public function findByIdsCobrancaRelatorio(array $ids): Zend_Db_Table_Rowset
	{
		return $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(array('scr' => "{$this->_schema}.{$this->_name}"))
				->join(array('scrv' => 'sinistro.cobranca_relatorio_vistorias'), 'scrv.id_cobranca_relatorio = scr.id', false)
				->join(array('v'=>'sistema.vistorias'), 'v.id = scrv.id_vistoria', false)
				->join(array('ve'=>'sistema.vistorias_empresas'), 've.id_vistoria = scrv.id_vistoria', 'id_empresa')
				->where('scr.id IN (?)', $ids)
				->group('scr.id, ve.id_empresa')
		);
	}

	public function findByNumeroNotaFiscal(string $numeroNotaFiscal)
	{
		return $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->where('id IN (?)', $ids)
		);
	}

	public function geraObservacao($params,$view=false) {
		$Rs = $this->getNota($params['id_empresa'], $params['numero']);
		$Vistorias = new Sistema_Model_Vistorias();
		$return = array();

		if ($Rs->count()) {
			foreach ($Rs as $i => $Row) {

				$Vistoria = $Vistorias->find($Row->id_vistoria)->current();
				if($Vistoria){
				
					$quadras = $Vistoria->quadras_observacoes();
	
					if($view == true){
					    $return[$Row->id_vistoria]  = "<input type='checkbox' checked name='vistoria[]' value='".$Row->id_vistoria."'>\n";
					    $return[$Row->id_vistoria] .= "Processo: {$quadras['processo']}\nCobertura: {$quadras['cobertura']}\n";
					}
					
					$return[$Row->id_vistoria] .= "Recebido em: {$params['data']}\nNota Fiscal Nº.: {$params['numero']}\nQuadras: {$quadras['quadras']}\nVariedade: {$quadras['variedades']}\nData da Vistoria: ".Agro_Util::formatDate($quadras['dt_vistoria'])."\nTipo: {$quadras['tipo']} Vistoria: {$Vistoria->id}.";
					
				}
			}
		}

		return $return;
	}

	public function getProcessos($vistoria) {
		return Zend_Db_Table_Abstract::getDefaultAdapter()->fetchAll("select id_processo from sinistro.vistorias_processos where id_vistoria = $vistoria");
	}

	public function addObservacao($processo, $obs) {

		return Zend_Db_Table_Abstract::getDefaultAdapter()->query("insert into sinistro.processos_observacoes
		(id_usuario_criacao, id_processo, ds_observacao)
		values
		(".$this->_user->id.", $processo, '".$obs."');
		");
	}

	public function updateByIds(array $ids, string $numeroNotaFiscal, bool $isNotaFicticia = false)
	{
		$modelLog = new Sinistro2_Model_CobrancaRelatorioLogAlteracaoNotas();
		$modelCobrancaRelatorioStatus = new Sinistro2_Model_CobrancaRelatorioStatus();

		$strIds = implode(',', $ids);
		
		$chaveStatus = 'CONFERIDO';
		if ($isNotaFicticia) {
			$chaveStatus = 'CONFERIDO_NOTA_FICTICIA';
			$numeroNotaFiscal = '';
		}
		
		$idStatus = (new Sistema_Model_Status())->getId($chaveStatus, 'RELATORIO_COBRANCA');
		
		(new Sinistro2_Model_CobrancaRelatorioStatus())->update([
			'fl_ativo' => 'false',
		], "id_cobranca_relatorio IN ({$strIds})");
		
		foreach ($ids as $id) {
			$modelLog->insert([
				'id_cobranca_relatorio' => $id,
				'nr_nota_antiga' => '',
				'nr_nota_nova' => $numeroNotaFiscal
			]);

			$modelCobrancaRelatorioStatus->insert([
				'id_cobranca_relatorio' => $id,
				'id_status' => $idStatus
			]);
		}
		
		return $this->update(['nr_nota_fiscal' => $numeroNotaFiscal, 'id_status' => $idStatus], "id IN ({$strIds})");
	}

	public function updateNumeroNotaFiscalAntiga(
		int $idEmpresa,
		string $numeroNotaFiscalAntiga,
		string $numeroNotaFiscalNova,
		bool $isNotaFicticia = false
	): int {
		$modelLog = new Sinistro2_Model_CobrancaRelatorioLogAlteracaoNotas();
		$modelCobrancaRelatorioStatus = new Sinistro2_Model_CobrancaRelatorioStatus();

		$chaveStatus = 'CONFERIDO';
		if ($isNotaFicticia) {
			$chaveStatus = 'CONFERIDO_NOTA_FICTICIA';
			$numeroNotaFiscalNova = '';
		}

		$idStatus = (new Sistema_Model_Status())->getId($chaveStatus, 'RELATORIO_COBRANCA');

		$relatoriosCobranca = $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(array('scr' => 'sinistro.cobranca_relatorio'), 'id')
				->join(array('scrv' => 'sinistro.cobranca_relatorio_vistorias'), 'scrv.id_cobranca_relatorio = scr.id', false)
				->join(array('sv' => 'sistema.vistorias'), 'sv.id = scrv.id_vistoria', false)
				->join(array('sve' => 'sistema.vistorias_empresas'), 'sve.id_vistoria = sv.id', false)
				->where('id_empresa = ?', $idEmpresa)
				->where('nr_nota_fiscal = ?', $numeroNotaFiscalAntiga)
				->group('scr.id')
		);

		$idsCobrancaRelatorio = '';

		foreach ($relatoriosCobranca as $rc) {
			$idsCobrancaRelatorio .= !empty($idsCobrancaRelatorio) ? ", {$rc['id']}" : $rc['id'];
			$modelLog->insert([
				'id_cobranca_relatorio' => $rc['id'],
				'nr_nota_antiga' => $numeroNotaFiscalAntiga,
			 	'nr_nota_nova' => $numeroNotaFiscalNova
			]);
		}
		
		$modelCobrancaRelatorioStatus->update([
			'fl_ativo' => 'false',
		], "id_cobranca_relatorio IN ({$idsCobrancaRelatorio})");

		foreach ($relatoriosCobranca as $rc) {
			$modelCobrancaRelatorioStatus->insert([
				'id_cobranca_relatorio' => $rc['id'],
				'id_status' => $idStatus
			]);
		}
		
		return $this->update(
			['nr_nota_fiscal' => $numeroNotaFiscalNova, 'id_status' => $idStatus],
			"id IN ({$idsCobrancaRelatorio})"
		);
	}
	
	public function alterarNota($values){
		try {
			$Log = new Sinistro2_Model_CobrancaRelatorioLogAlteracaoNotas();
			
			$Row = $this->getRow($values["id"]);
			
			$nr_nota_antiga = $Row->nr_nota_fiscal;
			
			$Row->nr_nota_fiscal = $values["nr_nota_fiscal"];
			
			$Row->save();
			
			$log = array(
				"id_cobranca_relatorio" => $values["id"],
				"nr_nota_antiga"		=> $nr_nota_antiga,
			 	"nr_nota_nova" => $values["nr_nota_fiscal"]
			);
			
			if ($Log->save($log)){
				return true;
				
			} else {
				$this->setMessage($Log->getMessages());
				return false;
			}
			
		} catch (Exception $e) {
			$this->setMessage($e->getMessage());
			return false;
		}
	}

	public function getDadosRelatorioGerado(int $idCobrancaRelatorio, bool $isPrevia): array
	{
		$idSafra = 17;

		if (!$isPrevia) {
			$subqueryFuncionarioFinal = $this->select()
				->setIntegrityCheck(false)
				->from(['slff' => 'sinistro.laudos_finais_funcionarios'], 'id_laudo_final')
				->join(
					['sf' => 'sistema.funcionarios'],
					'sf.id = slff.id_funcionario', 
					"STRING_AGG(CAST(ds_nome_funcionario AS VARCHAR), ', ') AS perito"
				)
				->group('slff.id_laudo_final');

			$subqueryFuncionarioPreliminar = $this->select()
				->setIntegrityCheck(false)
				->from(['svlp' => 'sistema.vistorias_laudos_preliminares'], 'id_laudo_preliminar')
				->join(['svf' => 'sistema.vistorias_funcionarios'], 'svf.id_vistoria = svlp.id_vistoria', false)
				->join(
					['sf' => 'sistema.funcionarios'],
					'sf.id = svf.id_funcionario', 
					"STRING_AGG(CAST(ds_nome_funcionario AS VARCHAR), ', ') AS perito"
				)
				->group('svlp.id_laudo_preliminar');

			$selectFinal = $this->select()
				->setIntegrityCheck(false)
				->from(
					['scr' => 'sinistro.cobranca_relatorio'],
					'nr_nota_fiscal, vl_total_despesas, vl_total_honorarios, vl_total_quilometragem, scr.id as id_cobranca_relatorio'
				)
				->join(
					['scrv' => 'sinistro.cobranca_relatorio_vistorias'],
					'scrv.id_cobranca_relatorio = scr.id',
					'vl_honorarios, vl_alimentacao, vl_hotel, vl_pedagio, vl_quilometragem, vl_custo_quilometragem, vl_despesas, scrv.id'
				)
				->join(['sv' => 'sistema.vistorias'], 'sv.id = scrv.id_vistoria', "sv.id as id_vistoria, 'Final' as tp_vistoria")
				->join(['svlf' => 'sistema.vistorias_laudos_finais'], 'svlf.id_vistoria = sv.id', false)
				->join(
					['slf' => 'sinistro.laudos_finais'],
					'slf.id = svlf.id_laudo_final',
					'dt_vistoria, ds_variedades, ds_itens_segurados, vl_area_vistoriada, id_cobertura'
				)
				->join(['sf' => $subqueryFuncionarioFinal], 'sf.id_laudo_final = slf.id', 'perito')
				->join(['sproc' => 'sinistro.processos'], 'sproc.id = slf.id_processo', 'id as id_processo')
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = sproc.id_proposta', 'id as id_proposta, id_proposta_mae')
				->join(['send' => 'seguro.propostas_endosso'], 'send.id_proposta = sprop.id', false)
				->join(['spp' => 'seguro.propostas_proponentes'], 'spp.id_proposta = sprop.id', 'ds_nome_proponente')
				->join(['sve' => 'sistema.vistorias_empresas'], 'sve.id_vistoria = sv.id', false)
				->join(['se' => 'sistema.empresas'], 'se.id = sve.id_empresa', 'ds_nome_fantasia')
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sprop.id', false)
				->join(['sm' => 'sistema.municipios'], 'sm.id = spprop.id_municipio', 'ds_nome_municipio')
				->join(['suf' => 'sistema.estados'], 'suf.id = sm.id_estado', 'ds_sigla, id_estado')
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', 'id_produto_geral')
				->join(['prodg' => 'produto.produtos_geral'], 'prodg.id = prod.id_produto_geral', 'id_tipo_produto')
				->join(['pc' => 'produto.culturas'], 'pc.id = prodg.id_cultura', 'ds_nome_cultura, pc.id as id_cultura')
				->where('scrv.id_cobranca_relatorio = ?', $idCobrancaRelatorio)
				->where('prod.id_safra >= ?', $idSafra)
				->where('sproc.id_status <> 5')
				->where('slf.id_status = 110 OR slf.id_status = 205 OR slf.id_status = 300')
				->where('send.fl_proposta_vigente IS TRUE');
			
			$selectPreliminar = $this->select()
				->setIntegrityCheck(false)
				->from(
					['scr' => 'sinistro.cobranca_relatorio'],
					'nr_nota_fiscal, vl_total_despesas, vl_total_honorarios, vl_total_quilometragem, scr.id as id_cobranca_relatorio'
				)
				->join(
					['scrv' => 'sinistro.cobranca_relatorio_vistorias'],
					'scrv.id_cobranca_relatorio = scr.id', 
					'vl_honorarios, vl_alimentacao, vl_hotel, vl_pedagio, vl_quilometragem, vl_custo_quilometragem, vl_despesas, scrv.id'
				)
				->join(['sv' => 'sistema.vistorias'], 'sv.id = scrv.id_vistoria', "sv.id as id_vistoria, 'Preliminar' as tp_vistoria")
				->join(['svlp' => 'sistema.vistorias_laudos_preliminares'], 'svlp.id_vistoria = sv.id', false)
				->join(
					['slp' => 'sinistro.laudos_preliminares'],
					'slp.id = svlp.id_laudo_preliminar',
					'dt_vistoria, ds_variedades, ds_itens_segurados, vl_area_vistoriada, id_cobertura'
				)
				->join(['sf' => $subqueryFuncionarioPreliminar], 'sf.id_laudo_preliminar = slp.id', 'perito')
				->join(['sproc' => 'sinistro.processos'], 'sproc.id = slp.id_processo', 'id as id_processo')
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = sproc.id_proposta', 'id as id_proposta, id_proposta_mae')
				->join(['send' => 'seguro.propostas_endosso'], 'send.id_proposta = sprop.id', false)
				->join(['spp' => 'seguro.propostas_proponentes'], 'spp.id_proposta = sprop.id', 'ds_nome_proponente')
				->join(['sve' => 'sistema.vistorias_empresas'], 'sve.id_vistoria = sv.id', false)
				->join(['se' => 'sistema.empresas'], 'se.id = sve.id_empresa', 'ds_nome_fantasia')
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sprop.id', false)
				->join(['sm' => 'sistema.municipios'], 'sm.id = spprop.id_municipio', 'ds_nome_municipio')
				->join(['suf' => 'sistema.estados'], 'suf.id = sm.id_estado', 'ds_sigla, id_estado')
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', 'id_produto_geral')
				->join(['prodg' => 'produto.produtos_geral'], 'prodg.id = prod.id_produto_geral', 'id_tipo_produto')
				->join(['pc' => 'produto.culturas'], 'pc.id = prodg.id_cultura', 'ds_nome_cultura, pc.id as id_cultura')
				->where('scr.id = ?', $idCobrancaRelatorio)
				->where('prod.id_safra >= ?', $idSafra)
				->where('sproc.id_status <> 5')
				->where('slp.id_status = 76 OR slp.id_status = 204 OR slp.id_status = 226')
				->where('send.fl_proposta_vigente IS TRUE');
			
			$select = $this->select()->union([$selectFinal, $selectPreliminar]);
			$select->order('dt_vistoria ASC, perito');
		} else {
			$select = $this->select()
				->setIntegrityCheck(false)
				->from(
					['scr' => 'sinistro.cobranca_relatorio'],
					'nr_nota_fiscal, vl_total_despesas, vl_total_honorarios, vl_total_quilometragem, scr.id as id_cobranca_relatorio'
				)
				->join(
					['scrv' => 'sinistro.cobranca_relatorio_vistorias'],
					'scrv.id_cobranca_relatorio = scr.id', 
					'vl_honorarios, vl_alimentacao, vl_hotel, vl_pedagio, vl_quilometragem, vl_custo_quilometragem, vl_despesas, scrv.id'
				)
				->join(['sv' => 'sistema.vistorias'], 'sv.id = scrv.id_vistoria', "sv.id as id_vistoria, 'Prévia' as tp_vistoria")
				->join(['spvp' => 'seguro.propostas_vistorias_previas'],'spvp.id_vistoria = sv.id','id_proposta, dt_laudo as dt_vistoria')
				->join(
					['spc' => 'seguro.propostas_coberturas'],
					'spc.id_proposta = spvp.id_proposta AND spc.fl_principal IS TRUE',
					'id_cobertura'
				)
				->join(['pcob' => 'produto.coberturas'], 'pcob.id = spc.id_cobertura', false)
				->joinLeft(['sva' => 'sistema.vistorias_agendamentos'], 'sva.id_vistoria = sv.id', false)
				->joinLeft(['saf' => 'sistema.agendamentos_funcionarios'], 'saf.id_agendamento = sva.id_agendamento', false)
				->joinLeft(['sf' => 'sistema.funcionarios'], 'sf.id = saf.id_funcionario', 'sf.ds_nome_funcionario as perito')
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = spvp.id_proposta', 'id_proposta_mae')
				->joinLeft(['sproc' => 'sinistro.processos'], 'sproc.id_proposta = sprop.id', 'id as id_processo')
				->join(['spp' => 'seguro.propostas_proponentes'], 'spp.id_proposta = sprop.id', 'ds_nome_proponente')
				->join(['sve' => 'sistema.vistorias_empresas'], 'sve.id_vistoria = sv.id', false)
				->join(['se' => 'sistema.empresas'], 'se.id = sve.id_empresa', 'ds_nome_fantasia')
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sprop.id', false)
				->joinLeft(['sm' => 'sistema.municipios'], 'sm.id = spprop.id_municipio', 'ds_nome_municipio')
				->joinLeft(['suf' => 'sistema.estados'], 'suf.id = sm.id_estado', 'ds_sigla, id_estado')
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', 'id_produto_geral')
				->join(['ps' => 'produto.safras'], 'ps.id = prod.id_safra', 'ds_chave as ds_safra')
				->join(['prodg' => 'produto.produtos_geral'], 'prodg.id = prod.id_produto_geral', 'id_tipo_produto')
				->join(['pc' => 'produto.culturas'], 'pc.id = prodg.id_cultura', 'ds_nome_cultura, pc.id as id_cultura')
				->where('scr.id = ?', $idCobrancaRelatorio)
				->where('prod.id_safra >= ?', $idSafra)
				->where('spvp.fl_transmitido IS TRUE AND spvp.fl_nova_vistoria_custo_perito IS FALSE')
				->order('dt_vistoria ASC, perito, sv.id DESC');
		}
		
		return $this->fetchAll($select)->toArray();
	}
}