<?PHP
/*
 * DIREITOS AUTORAIS RESERVADOS (C) 2007 UFRJ
 * 
 * ESTE PROGRAMA É SOFTWARE LIVRE; VOCÊ PODE REDISTRIBUÍ-LO E/OU MODIFICÁ-LO SOB OS
 * TERMOS DA LICENÇA PÚBLICA GERAL GNU CONFORME PUBLICADA PELA FREE SOFTWARE FOUNDATION;
 * TANTO A VERSÃO 2 DA LICENÇA, COMO (A SEU CRITÉRIO) QUALQUER VERSÃO POSTERIOR.

 * ESTE PROGRAMA É DISTRIBUÍDO NA EXPECTATIVA DE QUE SEJA ÚTIL, PORÉM, SEM NENHUMA GARANTIA;
 * NEM MESMO A GARANTIA IMPLÍCITA DE COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA.
 * CONSULTE A LICENÇA PÚBLICA GERAL DO GNU PARA MAIS DETALHES.
 * 
 * VOCÊ DEVE TER RECEBIDO UMA CÓPIA DA LICENÇA PÚBLICA GERAL DO GNU JUNTO COM ESTE PROGRAMA; 
 * SE NÃO, ACESSE <<HTTP://WWW.GNU.ORG/LICENSES/LICENSES.PT-BR.HTML>>
 */

<?

require_once '../common/begin.php';

function pega_pessoa_saude($key, $id)
{
	return Doctrine_Query::create()
		->from('Pessoa p')
		->leftJoin('p.telefones tel INDEXBY tel.idtipo')
		->leftJoin('p.enderecos end INDEXBY end.idtipo_endereco')
		->leftJoin('p.cpf cpf')
		->leftJoin('p.cns cns')
		->leftJoin('p.cnh cnh')
		->leftJoin('p.certidoes certidoes INDEXBY certidoes.idtipo')
		->leftJoin('p.pis pis')
		->leftJoin('p.nis nis')
		->leftJoin('p.titulo_eleitor titeleit')
		->leftJoin('p.ctps ctps')
		->leftJoin('p.rg rg INDEXBY rg.idorgao')
		->leftJoin('p.pessoa_cabcomum pc')
		->leftJoin('pc.documentos pcd INDEXBY pcd.idtipo_documento')
		->leftJoin('pc.enderecos pce INDEXBY pce.idtipo_endereco')
		->where("p.$key = ?",$id)
		->fetchOne();
}

try
{
	$houve_modificacao = false;
	$now = strftime('%Y-%m-%d %H:%M:%S');

	// Recupera a pessoa informada na URL
	if(!empty($_POST['id']))
	{
		$pessoa = pega_pessoa_saude('idpessoa_cabcomum',$_POST['id']);
		if(!$pessoa)
		{
			$pessoa_cabcomum = Doctrine_Query::create()
				->from('CabcomumPessoa p')
				->leftJoin('p.documentos d INDEXBY d.idtipo_documento')
				->leftJoin('p.enderecos e INDEXBY e.idtipo_endereco')
				->where('p.id = ?',$_POST['id'])
				->fetchOne();

			if($pessoa_cabcomum && $pessoa_cabcomum->idref_sistema == ID_SISTEMA_SAUDE)
				$pessoa = pega_pessoa_saude('id',$pessoa_cabcomum->idpessoa_sistema);

			if(!$pessoa)
				$pessoa = new Pessoa();

			if(!$pessoa_cabcomum)
				$pessoa_cabcomum = new CabcomumPessoa();
		}
		else
			$pessoa_cabcomum = $pessoa->pessoa_cabcomum;
	}
	else
	{
		$pessoa = new Pessoa();
		$pessoa_cabcomum = new CabcomumPessoa();
	}


	$doc->beginTransaction();

	foreach($_POST as $campo => &$valor)
	{
		if(!empty($_POST[$campo.'_ignorada']) || trim($valor) === '')
			$valor = NULL;
	}

	$pessoa->nome = $_POST['nome'];
	if($_POST['sem_nome_mae'])
		$pessoa->nome_mae = "";
	else
		$pessoa->nome_mae = $_POST['nome_mae'];
	$pessoa->idsexo = $_POST['idsexo'];
	$pessoa->idraca = $_POST['idraca'];
	$pessoa->idescolaridade = $_POST['idescolaridade'];

	$pessoa->data_nascimento = input_date($_POST['data_nascimento']);

	$pessoa->idmunicipio_nascimento = $_POST['idmunicipio_nascimento'];
	$pessoa->idpais_nascimento = $_POST['idpais_nascimento'];

	$pessoa->brasileiro = !empty($_POST['nacionalidade']);
	$pessoa->data_naturalizacao = input_date($_POST['data_naturalizacao']);
	
	foreach(array('nis'=>'NIS','cpf'=>'CPF','ctps'=>'CTPS',
				  'titulo_eleitor'=>'TituloEleitor','pis'=>'PIS',
				  'cnh'=>'CNH','cns'=>'CNS') as $d => $class)
	{
		// O paciente possui o documento?
		if(!empty($_POST["tem_$d"]))
		{
			if(empty($pessoa[$d]))
				$pessoa[$d] = new $class;

			switch($d)
			{
			case 'cns':
				$pessoa[$d]->numero = input_cns($_POST[$d]);
				break;
			case 'cpf':
				$pessoa[$d]->numero = input_cpf($_POST[$d]);
				break;
			default:
				$pessoa[$d]->numero = $_POST[$d];
				break;
			}

			$pessoa[$d]->apresentado = $_POST[$d.'_apresentado'];
			$pessoa[$d]->digitalizado = $_POST[$d.'_digitalizado'];
		}
		else if(!empty($pessoa[$d]))
		{
			$pessoa[$d]->delete();
			$pessoa[$d] = NULL;
		}
	}

	if(!empty($_POST["tem_rg"]))
	{
		if(empty($_POST['rg_idorgao_emissor']))
			throw new Exception('&eacute; necess&aacute;rio informar o &oacute;rg&atilde;o emissor do RG');

		$rg = $pessoa->rg[$_POST['rg_idorgao_emissor']];

		$rg->idorgao = $_POST['rg_idorgao_emissor'];
		$rg->numero = $_POST['rg'];
		$rg->data_emissao = input_date($_POST['rg_data_emissao']);
		$rg->idestado = $_POST['rg_idestado_emissor'];
		$rg->apresentado = $_POST['rg_apresentado'];
		$rg->digitalizado = $_POST['rg_digitalizado'];
	}
	else if($pessoa->rg->count() > 0)
	{
		$pessoa->rg->clear();
		$pessoa->state(Doctrine_Record::STATE_DIRTY);
	}

	if(!empty($_POST["tem_ctps"]))
	{
		$pessoa->ctps->data_emissao = input_date($_POST['ctps_data_emissao']);
		$pessoa->ctps->serie = $_POST['ctps_serie'];
		$pessoa->ctps->idestado = $_POST['ctps_idestado'];
	}

	if(!empty($_POST["tem_titulo_eleitor"]))
	{
		$pessoa->titulo_eleitor->zona = $_POST['titulo_eleitor_zona'];
		$pessoa->titulo_eleitor->secao = $_POST['titulo_eleitor_secao'];
	}

	if(!empty($_POST["tem_certidao"]))
	{
		if(empty($_POST['idtipo_certidao']))
			throw new Exception('É necessário informar o tipo de certidão civil');
		$cert = $pessoa->certidoes[$_POST['idtipo_certidao']];

		$cert->data_emissao = input_date($_POST['certidao_data_emissao']);
		$cert->folha = $_POST['certidao_folha'];
		$cert->termo = $_POST['certidao_termo'];
		$cert->livro = $_POST['certidao_livro'];
		$cert->cartorio = $_POST['certidao_cartorio'];
		$cert->apresentado = $_POST['certidao_apresentado'];
		$cert->digitalizado = $_POST['certidao_digitalizado'];
		$cert->idtipo = $_POST['idtipo_certidao'];
	}
	else if($pessoa->certidoes->count() > 0)
	{
		$pessoa->certidoes->clear();
		$pessoa->state(Doctrine_Record::STATE_DIRTY);
	}

	// Tem endereço fixo?
	if(empty($_POST['idtipo_endereco_variavel']))
	{
		// Logradouro está cadastrado no geoiguacu?
		if(empty($_POST['logradouro_nao_cadastrado']))
		{
			// Temos que ter o código geoiguacu
			if(empty($_POST['logradouro_geoiguacu']))
				throw new Exception('Se o endereço está cadastrado no Geoiguacu, seu número deve ser informado');

			$endres = Doctrine::getTable('Endereco')
				->findOneByGeoiguacu($_POST['logradouro_geoiguacu']);
		}
		else
			$endres = NULL;

		// Se temos um endereço informado...
		if(empty($_POST['logradouro_nao_cadastrado']) || 
			$_POST['logradouro_nao_cad_justificativa'] != '2')
		{
			if(empty($endres) && !empty($pessoa->enderecos[TipoEndereco::RESIDENCIAL]))
				$endres = $pessoa->enderecos[TipoEndereco::RESIDENCIAL]->endereco;

			if(!$_POST['logradouro_numero'])
				$_POST['logradouro_numero'] = '';
			if(!$_POST['logradouro_complemento'])
				$_POST['logradouro_complemento'] = '';

			if(empty($endres))
			{
				$endres = Doctrine_Query::create()
					->from('Endereco e')
					->where('e.idtipo_logradouro = ? and e.logradouro = ? and'
							.' e.numero = ? and e.complemento = ? and'
							.' e.idmunicipio = ?',
							array($_POST['idtipo_logradouro'],
								  $_POST['logradouro_nome'],
								  $_POST['logradouro_numero'],
								  $_POST['logradouro_complemento'],
								  $_POST['logradouro_idcidade']))
					->fetchOne();

				if(!$endres)
					$endres = new Endereco;
			}

			$pessoa->enderecos[TipoEndereco::RESIDENCIAL]->idtipo_endereco
				= TipoEndereco::RESIDENCIAL;

			$endres->geoiguacu = $_POST['logradouro_geoiguacu'];
			$endres->idtipo_logradouro = $_POST['idtipo_logradouro'];
			$endres->logradouro = $_POST['logradouro_nome'];
			$endres->numero = $_POST['logradouro_numero'];
			$endres->complemento = $_POST['logradouro_complemento'];
			$endres->bairro = $_POST['logradouro_bairro'];
			$endres->idmunicipio = $_POST['logradouro_idcidade'];
			$endres->cep = input_cep($_POST['logradouro_cep']);

			if($_POST['logradouro_nao_cad_justificativa'] == '1')
			{
				if(empty($_POST['logradouro_nao_cad_outra_justificativa']))
					throw new Exception('É necessário justificar o fato de o logradouro não estar cadastrado no Geoiguacu');
				$endres->justificativa_sem_geoiguacu = $_POST['logradouro_nao_cad_outra_justificativa'];
			}
			else
				$endres->justificativa_sem_geoiguacu = NULL;

			$endres->referencia = $_POST['logradouro_referencia'];

			if($endres->isModified(true))
			{
				$endres->save();
				$houve_modificacao = true;
			}

			$pessoa->enderecos[TipoEndereco::RESIDENCIAL]->endereco = $endres;
		}
	}
	else
	{
		if(isset($pessoa->enderecos[TipoEndereco::RESIDENCIAL]))
		{
			unset($pessoa->enderecos[TipoEndereco::RESIDENCIAL]);
			$pessoa->state(Doctrine_Record::STATE_DIRTY);
		}

		$pessoa->idtipo_endereco_variavel = $_POST['idtipo_endereco_variavel'];
	}

	foreach(array(TipoTelefone::RESIDENCIAL => 'fixo',
				  TipoTelefone::CELULAR => 'celular',
				  TipoTelefone::RECADO => 'recado') as $tipo => $nome)
	{
		// Possui o telefone?
		if(empty($_POST["nao_possui_telefone_$nome"]))
		{
			$tel = $pessoa->telefones[$tipo];
			$tel->idtipo = $tipo;
			list($tel->ddd,$tel->numero) = input_telefone($_POST["telefone_$nome"]);
		}
		else if(isset($pessoa->telefones[$tipo]))
		{
			unset($pessoa->telefones[$tipo]);
			$pessoa->state(Doctrine_Record::STATE_DIRTY);
		}
	}

	// Tem email?
	if(empty($_POST["nao_possui_email"]))
	{
		if(empty($_POST['email']))
			throw new Exception("É necessário informar o email");
		$pessoa->email = $_POST['email'];
	}

	// Logradouro de correspondencia eh diferente do logradouro residencial?
	if(!isset($_POST['mesmo_logradouro_corresp']))
	{
		if(isset($pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]))
		{
		   	unset($pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]);
			$pessoa->state(Doctrine_Record::STATE_DIRTY);
		}
	}
	else if(!$_POST['mesmo_logradouro_corresp'])
	{
		$endcor = $pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]->endereco;

		if(!$_POST['logradouro_corresp_numero'])
			$_POST['logradouro_corresp_numero'] = '';
		if(!$_POST['logradouro_corresp_complemento'])
			$_POST['logradouro_corresp_complemento'] = '';

		if($endres && $endcor->id == $endres->id)
		{
			$endcor = Doctrine_Query::create()
				->from('Endereco e')
				->where('e.idtipo_logradouro = ? and e.logradouro = ? and'
						.' e.numero = ? and e.complemento = ? and'
						.' e.idmunicipio = ?',
						array($_POST['idtipo_logradouro_corresp'],
							  $_POST['logradouro_corresp_nome'],
						      $_POST['logradouro_corresp_numero'],
							  $_POST['logradouro_corresp_complemento'],
							  $_POST['logradouro_corresp_idcidade']))
				->fetchOne();
			if(!$endcor)
				$endcor = new Endereco;
		}

		$pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]->idtipo_endereco
			= TipoEndereco::CORRESPONDENCIA;

		$endcor->idtipo_logradouro = $_POST['idtipo_logradouro_corresp'];
		$endcor->logradouro = $_POST['logradouro_corresp_nome'];
		$endcor->numero = $_POST['logradouro_corresp_numero'];
		$endcor->complemento = $_POST['logradouro_corresp_complemento'];
		$endcor->bairro = $_POST['logradouro_corresp_bairro'];
		$endcor->idmunicipio = $_POST['logradouro_corresp_idcidade'];
		$endcor->cep = input_cep($_POST['logradouro_corresp_cep']);

		if($endcor->isModified(true))
		{
			$endcor->save();
			$houve_modificacao = true;
		}

		$pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]->endereco = $endcor;
	}
	else
	{
		if($endres)
		{
			$pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]->idendereco
				= $endres->id;

			$pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]->idtipo_endereco 
				= TipoEndereco::CORRESPONDENCIA;
		}
		else if(isset($pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]))
		{
			unset($pessoa->enderecos[TipoEndereco::CORRESPONDENCIA]);
			$pessoa->state(Doctrine_Record::STATE_DIRTY);
		}
	}

	$pessoa->beneficiario_bolsa_familia = $_POST['beneficiario_bolsa_familia'];
	$pessoa->membro_psf = $_POST['membro_psf'];
	$pessoa->membro_pacs = $_POST['membro_pacs'];
	$pessoa->residencia_terapeutica = $_POST['residencia_terapeutica'];

	if($pessoa->isModified(true))
	{
		if($pessoa->isValid(true) || !$pessoa->getErrorStackAsString())
		{
			$pc = $pessoa_cabcomum;
			$pc->nome = $pessoa->nome;
			$pc->nome_mae = $pessoa->nome_mae;
			$pc->idsexo = $pessoa->idsexo;
			$pc->data_nascimento = $pessoa->data_nascimento;
			$pc->idmunicipio_nascimento = dv_municipio_ibge($pessoa->idmunicipio_nascimento);
			$pc->idpais_nascimento = $pessoa->idpais_nascimento;

			if($pessoa->brasileiro)
			{
				if($pessoa->idpais_nascimento != ID_BRASIL)
					$pc->idnacionalidade = ID_NACIONALIDADE_NATURALIZADO;
				else
					$pc->idnacionalidade = ID_NACIONALIDADE_BRASILEIRA;
			}
			else
				$pc->idnacionalidade = ID_NACIONALIDADE_ESTRANGEIRA;

			$pc->idraca = $pessoa->idraca;
			$pc->idescolaridade = $pessoa->idescolaridade;
			$pc->email = $pessoa->email;

			foreach(array(ID_DOC_CPF=>'cpf',
				          ID_DOC_NIS=>'nis',
						  ID_DOC_CNH=>'cnh',
						  ID_DOC_RG=>'rg',
						  ID_DOC_CNS=>'cns',
						  ID_DOC_PIS=>'pis',
					      ID_DOC_CERTIDAO=>'certidao') as $k => $nomedoc)
			{
				if(!empty($_POST["tem_$nomedoc"]))
				{
					if(isset($pc->documentos[$k]))
						$d = $pc->documentos[$k];
					else
						$d = new CabcomumPessoaDocumento();
					$d->idtipo_documento = $k;

					if($k == ID_DOC_CERTIDAO)
					{
						$cert = $pessoa->certidoes[$_POST['idtipo_certidao']];

						$d->idtipo_certidao = $cert->idtipo;
						$d->folha = $cert->folha;
						$d->termo = $cert->termo;
						$d->livro = $cert->livro;
						$d->cartorio = $cert->cartorio;
						$d->data_emissao = $cert->data_emissao;
						if(!empty($_POST['certidao_matricula']))
							$d->matricula_certidao = $_POST['certidao_matricula'];
						else
							$d->matricula_certidao = null;
					}
					else if($k == ID_DOC_RG)
					{
						$idorgao = $_POST['rg_idorgao_emissor'];
						assert($idorgao == $pessoa->rg[$idorgao]->idorgao);

						$d->numero = $pessoa->rg[$idorgao]->numero;
						$d->idestado = $pessoa->rg[$idorgao]->idestado;
						$d->idorgao = $pessoa->rg[$idorgao]->idorgao;
						$d->data_emissao = $pessoa->rg[$idorgao]->data_emissao;
					}
					else
						$d->numero = $pessoa[$nomedoc]->numero;

					if($k == ID_DOC_CTPS)
					{
						$d->serie = $pessoa->ctps->serie;
						$d->idestado = $pessoa->ctps->idestado;
						$d->data_emissao = $pessoa->ctps->data_emissao;
					}
					else if($k == ID_DOC_TITELEITOR)
					{
						$d->zona = $pessoa->titulo_eleitor->zona;
						$d->secao = $pessoa->titulo_eleitor->secao;
					}

					$pc->documentos[$k] = $d;
				}
				else
					unset($pc->documentos[$k]);
			}

			foreach(array(TipoTelefone::RESIDENCIAL=>'residencial',
				      TipoTelefone::CELULAR=>'celular',
					  TipoTelefone::RECADO=>'recado') as $k => $nome)
			{
				if(!empty($pessoa->telefones[$k]))
				{
					$pc["fone_$nome"] 
					= $pessoa->telefones[$k]->ddd.$pessoa->telefones[$k]->numero;
				}
				else
					$pc["fone_$nome"] = null;
			}

			if($pessoa->idmunicipio_nascimento)
				$pc->idestado_nascimento = $pessoa->municipio_nascimento->idestado;
			else
				$pc->idestado_nascimento = null;

			$pc->beneficiario_bolsa_familia = $pessoa->beneficiario_bolsa_familia;

			foreach(array(TipoEndereco::RESIDENCIAL, 
						  TipoEndereco::CORRESPONDENCIA,
				          TipoEndereco::TRABALHO) as $i)
			{
				if(!empty($pessoa->enderecos[$i]))
				{
					$orig = $pessoa->enderecos[$i]->endereco;
					$dest = $pc->enderecos[$i];

					$dest->idtipo_endereco = $i;
					$dest->idtipo_logradouro = $orig->idtipo_logradouro;
					$dest->logradouro = $orig->logradouro;
					$dest->numero = $orig->numero;
					$dest->complemento = $orig->complemento;
					$dest->bairro = $orig->bairro;
					$dest->idmunicipio = dv_municipio_ibge($orig->idmunicipio);
					$dest->cep = $orig->cep;
					$dest->referencia = $orig->referencia;
					$dest->geoiguacu = $orig->geoiguacu;
					$dest->justificativa_sem_geoiguacu = $orig->justificativa_sem_geoiguacu;
					if($orig->idmunicipio)
						$dest->idestado = $orig->municipio->idestado;
					else
						$dest->idestado = null;

					$pc->enderecos[$i] = $dest; // preciso disso?
				}
				else
					unset($pc->enderecos[$i]);
			}

			if(!$pc->idref_sistema)
			{
				$pc->idref_sistema = ID_SISTEMA_SAUDE;
				if($pessoa->id != 0)
					$pc->idpessoa_sistema = $pessoa->id;
				else
					$pc->idpessoa_sistema = "temp_".strval(rand());
			}

			$pessoa->pessoa_cabcomum = $pc;

			$pessoa->save();

			if(substr($pc->idpessoa_sistema,0,5) == "temp_")
			{
				$pc->idpessoa_sistema = $pessoa->id;
				$pc->save();
			}

			$houve_modificacao = true;
		}
		else
		{
			throw new Exception("Erro de preenchimento: ".$pessoa->getErrorStackAsString());
		}
	}

	if(tem_permissao(TipoUsuario::OPERADOR) && $_POST['sem_comparecimento']!=1)
	{
		$houve_modificacao = true;

		$comp = new Comparecimento();
		$comp->idunidade = $current_user->idunidade;
		$comp->idpessoa = $pessoa->id;
		$comp->data = $now;
		$comp->save();

		$hist = new CabcomumPessoaHistorico();
		$hist->data_comparecimento = $now;
		$hist->idpessoa = $pessoa->pessoa_cabcomum->id;
		$hist->idsistema = ID_SISTEMA_SAUDE;
		$hist->save();

		if(!empty($_POST['comparecimento_prontuario']))
		{
			$numero = $_POST['comparecimento_prontuario'];

			$prontuario = Doctrine_Query::create()
				->from('Prontuario p')
				->where('p.idpessoa = ? and p.idunidade = ? and p.numero = ?',
					array($comp->idpessoa, $comp->idunidade, $numero))
				->fetchOne();
			if(!$prontuario)
			{
				$prontuario = new Prontuario;
				$prontuario->idunidade = $current_user->idunidade;
				$prontuario->idpessoa = $pessoa->id;
				$prontuario->numero = $numero;
				$prontuario->data = $now;
				$prontuario->save();
			}
		}

		$pelo_menos_um = false;

		if(!empty($_POST['motivo_24_a_27']))
		{
			if($_POST['motivo_24_a_27'] < 24
				|| $_POST['motivo_24_a_27'] > 27)
			{
				throw new Exception('É necessário especificar um motivo de internação válido');
			}

			if(!isset($_POST['motivo']))
				$_POST['motivo'] = array($_POST['motivo_24_a_27'] => 1);
			else
				$_POST['motivo'][$_POST['motivo_24_a_27']] = 1;
		}

		if(isset($_POST['motivo']))
		{
			foreach($_POST['motivo'] as $idmotivo => $val)
			{
				if(!$val)
					continue;
				$motcomp = new MotivoComparecimento;
				$motcomp->idcomparecimento = $comp->id;
				$motcomp->idmotivo = $idmotivo;

				switch($idmotivo)
				{
				case 5: // consulta médica
					if($_POST['motivo_idocupacao_medico'])
						$motcomp->idocupacao = $_POST['motivo_idocupacao_medico'];
					break;
				case 6: // enfermeiro
					if($_POST['motivo_idocupacao_enfermeiro'])
						$motcomp->idocupacao = $_POST['motivo_idocupacao_enfermeiro'];
					break;
				case 7: // outras especialidades
					if($_POST['motivo_idocupacao_outros'])
						$motcomp->idocupacao = $_POST['motivo_idocupacao_outros'];
					break;
				}

				if($motcomp->idocupacao)
				{
					$rows = Doctrine_Query::create()
						->update('OcupacaoUnidade')
						->set('count', 'count + 1')
						->where('idocupacao = ? and idunidade = ?',
							array($motcomp->idocupacao,
								 $current_user->idunidade))
						->execute();
					if($rows == 0)
					{
						$uso = new OcupacaoUnidade;
						$uso->idocupacao = $motcomp->idocupacao;
						$uso->idunidade = $current_user->idunidade;
						$uso->count = 1;
						$uso->save();
					}
				}

				$motcomp->save();

				$pelo_menos_um = true;
				$houve_modificacao = true;
			}
		}
		if(!$pelo_menos_um)
		{
			throw new Exception('É necessário especificar pelo menos'
								.' um motivo de comparecimento');
		}
	}

	foreach($_POST['acao_programa'] as $idprograma => $acao)
	{
		$inscricao = Doctrine_Query::create()
						->from('InscricaoPrograma in')
						->where('in.idpessoa = ? and in.idprograma = ?',
							array($pessoa->id,$idprograma))
						->orderBy('in.data DESC')
							->fetchOne();

		// Paciente nao inscrito? Vamos inscreve-lo
		if((!$inscricao || $inscricao->data_desligamento) && ($acao==1 || $acao==2))
		{
			$inscricao = new InscricaoPrograma();
			$inscricao->idpessoa = $pessoa->id;
			$inscricao->idprograma = $idprograma;
			$inscricao->data = $now;
			$inscricao->save();
			$houve_modificacao = true;
		}

		if($acao == 2) // comparecimento
		{
			$compprog = new ComparecimentoPrograma();
			$compprog->idinscricao_programa = $inscricao->id;

			if(empty($comp))
			{
				$comp = new Comparecimento();
				$comp->idunidade = $current_user->idunidade;
				$comp->idpessoa = $pessoa->id;
				$comp->data = $now;
				$comp->save();
			}

			$compprog->idcomparecimento = $comp->id;
			$compprog->save();
			$houve_modificacao = true;
		}
		else if($inscricao && $acao == 3) // desligamento
		{
			$inscricao->data_desligamento = $now;
			$inscricao->save();
			$houve_modificacao = true;
		}
	}

	switch($_POST['codigo_situacao'])
	{
	case SituacaoFormulario::NAO_VALIDADO:
		if(empty($_POST['obs_validacao']))
			throw new Exception('É necessário entrar a razão do porquê o formulário não foi validado');
		$pessoa->situacao->correcao = $_POST['obs_validacao'];
		$pessoa->situacao->data_verificacao = $now;
		break;
	case SituacaoFormulario::VALIDADO:
		$pessoa->situacao->data_verificacao = $now;
		$pessoa->situacao->correcao = NULL;
		break;
	}


	if($pessoa->situacao->isModified(true) || $houve_modificacao)
	{
		$pessoa->situacao->data_atualizacao = $now;
		$pessoa->situacao->save();
	}

	$doc->commit();
	echo json_encode(array('sucesso' => 'Registro atualizado com sucesso'));
}
catch(Exception $e)
{
	$doc->rollback();

	$msg = nl2br($e->getMessage());

	// Unique violation?
	if(strpos($msg, 'SQLSTATE[23505]') !== false)
	{
		$checks = array(
			'unique_pessoa_mae' => 'Paciente já encontra-se cadastrado no sistema',
			'cnh_numero_key' => "A CNH de número ".$_POST['cnh']." já está associada a outra pessoa",
			'sus_numero_key' => "O número SUS ".$_POST['sus']." já está associado a outra pessoa",
			'nis_numero_key' => "O NIS de número ".$_POST['nis']." já está associado a outra pessoa",
			'pis_numero_key' => "O PIS de número ".$_POST['pis']." já está associado a outra pessoa",
			'titulo_eleitor_numero_key' => "O título de eleitor de número ".$_POST['titulo_eleitor']." já está associado a outra pessoa",
			'unique_certidao' => 'A certidão informada já está associada a outra pessoa',
			'unique_ctps' => 'A carteira de trabalho informada já está associada a outra pessoa',
			'unique_rg' => 'O RG informado já está associado a outra pessoa',
			'unique_pessoa_cnh' => 'Esta pessoa já possui uma carteira de motorista cadastrada no sistema',
			'unique_pessoa_cns' => 'Esta pessoa já possui um número SUS cadastrado no sistema',
			'unique_pessoa_cpf' => 'Esta pessoa já possui um CPF cadastrado no sistema',
			'unique_pessoa_ctps' => 'Esta pessoa já possui uma carteira de trabalho cadastrado no sistema',
			'unique_pessoa_nis' => 'Esta pessoa já possui um número NIS cadastrado no sistema',
			'unique_pessoa_pis' => 'Esta pessoa já possui um número PIS cadastrado no sistema',
			'unique_pessoa_rg' => 'Esta pessoa já possui um RG cadastrado no sistema, expedido pelo órgão informado',
			'unique_pessoa_tipo_certidao' => 'Esta pessoa já possui uma certidão do tipo informado cadastrada no sistema',
			'unique_pessoa_titulo_eleitor' => 'Esta pessoa já possui um título de eleitor cadastrado no sistema',
			'unique_prontuario' => 'Esta pessoa já possui um prontuário com este código nesta unidade'
		);

		foreach($checks as $cod => $text)
		{
			if(strpos($msg, $cod) !== false)
			{
				$msg = $text;
				break;
			}
		}
	}

	echo json_encode(array('error' => $msg));
}

?>
