/*
 * MarcacoesMedicinaHandler.java
 *
 * Created on 28 de Abril de 2006, 9:56
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package siprp.medicina;

import java.util.Date;

import siprp.data.Marcacao;
import siprp.data.outer.MarcacoesTrabalhadorData;
import siprp.data.outer.TrabalhadoresData;

import com.evolute.entity.ProviderInterface;
import com.evolute.utils.Singleton;

/**
 * Classe auxiliar para tratamento de marca&ccedil;&otilde;es de Medicina.
 *
 * @author Frederico
 */
public class MarcacoesMedicinaHandler
{
	/** Creates a new instance of MarcacoesMedicinaHandler */
	public MarcacoesMedicinaHandler()
	{
	}

	/**
	 * Ajusta os estado das mara&ccedil;&otilde;es corrente e seguinte para uma trabalhador.
	 * Este m&eacute;todo &eacute; usado pelo sistema de marca&ccedil;&atild;o de fichas de aptida&atilde;o para ajustar 
	 * as marca&ccedil;&otilde;es existentes &agrave;s escolhidas na ficha.
	 *
	 * @param trabalhadorID um inteiro que representa o trabalhador em quest&atilde;o
	 * @param motivoCorrente um inteiro que representa o motivo da marca&ccedil;&atilde;o corrente (admiss&atilde;o/peri&oacute;dico/ocasional)
	 * @param dataCorrente a data que se pretende para a marca&ccedil;&atilde;o corrente
	 * @param motivoSeguinte um inteiro que representa o motivo da marca&ccedil;&atilde;o seguinte (admiss&atilde;o/peri&oacute;dico/ocasional)
	 * @param dataSeguinte a data que se pretende para a marca&ccedil;&atilde;o seguinte
	 * @throws Exception se houver um erro na comunica&ccedil;&atilde;o com a Base de Dados
	 */
	public void ajustarMarcacoes( Integer trabalhadorID, Integer motivoCorrente, Date dataCorrente, 
									Integer motivoSeguinte, Date dataSeguinte )
		throws Exception
	{
		Integer idCorrente;
		Integer idSeguinte;
		MedicinaDataProvider provider = ( MedicinaDataProvider ) MedicinaDataProvider.getProvider();
		ProviderInterface JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
		TrabalhadoresData trabalhador = (TrabalhadoresData)JDO.load( TrabalhadoresData.class, trabalhadorID );
		
		idCorrente = provider.getConsultaIDByTrabalhadorMotivoAndDate( trabalhadorID, motivoCorrente, dataCorrente );
		MarcacoesTrabalhadorData consultaCorrente;
		if( idCorrente == null )
		{
			consultaCorrente = new MarcacoesTrabalhadorData();
			consultaCorrente.setToTrabalhador_id( trabalhador );
			consultaCorrente.set( MarcacoesTrabalhadorData.TIPO, new Integer( MarcacoesTrabalhadorData.TIPO_CONSULTA ) );
			consultaCorrente.set( Marcacao.DATA, dataCorrente );
			consultaCorrente.set( MarcacoesTrabalhadorData.MOTIVO, motivoCorrente );
		}
		else
		{
			consultaCorrente = ( MarcacoesTrabalhadorData ) JDO.load( MarcacoesTrabalhadorData.class, idCorrente );
		}
		consultaCorrente.set( Marcacao.REALIZADA, "y" );
		consultaCorrente.set( MarcacoesTrabalhadorData.ESTADO, new Integer( siprp.medicina.MedicinaDataProvider.ESTADO_REALIZADO ) );
		consultaCorrente.save();
		
		idSeguinte = provider.getConsultaIDByTrabalhadorMotivoAndDate( trabalhadorID, motivoSeguinte, dataSeguinte );
		if( idSeguinte == null )
		{
			idSeguinte = provider.getProximaConsultaIDByTrabalhadorMotivoAndDate( trabalhadorID, motivoSeguinte, dataCorrente );
			MarcacoesTrabalhadorData consultaSeguinte;
			if( idSeguinte == null )
			{
				consultaSeguinte = new MarcacoesTrabalhadorData();
				consultaSeguinte.setToTrabalhador_id( trabalhador );
				consultaSeguinte.set( MarcacoesTrabalhadorData.TIPO, new Integer( MarcacoesTrabalhadorData.TIPO_CONSULTA ) );
				consultaSeguinte.set( MarcacoesTrabalhadorData.MOTIVO, motivoSeguinte );
				consultaSeguinte.set( Marcacao.REALIZADA, "y" );
				consultaSeguinte.set( MarcacoesTrabalhadorData.ESTADO, new Integer( siprp.medicina.MedicinaDataProvider.ESTADO_POR_REALIZAR ) );
			}
			else
			{
				consultaSeguinte = ( MarcacoesTrabalhadorData ) JDO.load( MarcacoesTrabalhadorData.class, idSeguinte );
			}
			consultaSeguinte.set( Marcacao.DATA, dataSeguinte );
			consultaSeguinte.save();
		}
	}
}
