package com.ejie.ab63.service;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.ejie.ab63.model.Establecimiento;
import com.ejie.ab63.model.inicio.InitForm;
import com.ejie.ab63.model.procedimientos.CompareExpedienteSection;
import com.ejie.ab63.model.util.ResultAjaxOperation;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * Ab6301s00Service  
 * 
 *  
 */

public interface EstablecimientoService {

	/**
	 * Inserts a single row in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @return Ab6301s00
	 */
	Establecimiento add(Establecimiento ab6301s00);

	/**
	 * Updates a single row in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @return Ab6301s00
	 */
	Establecimiento update(Establecimiento ab6301s00);

	/**
	 * Finds a single row in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @return Ab6301s00
	 */
	Establecimiento find(Establecimiento ab6301s00);

	/**
	 * Deletes a single row in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 */
	void remove(Establecimiento ab6301s00);

	/**
	 * Finds a list of rows in the Ab6301s00 table.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<Ab6301s00>
	 */
	List<Establecimiento> findAll(Establecimiento ab6301s00, JQGridRequestDto jqGridRequestDto);

	/**
	 * Finds rows in the Ab6301s00 table using like.
	 *
	 * @param ab6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Ab6301s00>
	 */
	List<Establecimiento> findAllLike(Establecimiento ab6301s00, JQGridRequestDto jqGridRequestDto, Boolean startsWith);

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	void removeMultiple(Establecimiento filterAb6301s00, JQGridRequestDto jqGridRequestDto, Boolean startsWith);

	/**
	 * Filter method in the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<Ab6301s00>
	 */
	JQGridResponseDto<Establecimiento> filter(Establecimiento filterAb6301s00, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith);

	/**
	 * Searches rows in the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param searchAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Ab6301s00>>
	 */
	List<TableRowDto<Establecimiento>> search(Establecimiento filterAb6301s00, Establecimiento searchAb6301s00,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith);

	/**
	 * Reorder the selection made in Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	Object reorderSelection(Establecimiento filterAb6301s00, JQGridRequestDto jqGridRequestDto, Boolean startsWith);

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

	/**
	 * Finder method in the hierarchical the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<JerarquiaDto<Ab6301s00>>
	 */
	JQGridResponseDto<JerarquiaDto<Establecimiento>> jerarquia(Establecimiento filterAb6301s00,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith);

	/**
	 * Finder method for siblings rows in the hierarchical the Ab6301s00 table.
	 *
	 * @param filterAb6301s00
	 *            Ab6301s00
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return JQGridResponseDto<JerarquiaDto<Ab6301s00>>
	 */
	JQGridResponseDto<JerarquiaDto<Establecimiento>> jerarquiaChildren(Establecimiento filterAb6301s00,
			JQGridRequestDto jqGridRequestDto);

	/**
	 * 
	 * @param identificador
	 * @param usuario
	 * @return
	 */
	Boolean establecerFechaBaja(String identificador, Integer integer, boolean isExpedienteOficio);

	/**
	 * 
	 * @param tipoRegistro
	 * @param tipoEstablecimiento
	 * @param zona
	 * @return
	 */
	String getNewIntetificador(String tipoRegistro, String tipoEstablecimiento, InitForm init);

	/**
	 * 
	 * @param idExpediente
	 * @param tipoRegistro
	 * @param identificadorDefinitivo
	 * @return
	 * @throws Throwable
	 */
	Establecimiento registrarEstablecimientoCenso(Integer idExpediente, String tipoRegistro,
			String identificadorDefinitivo, Date fechaSugerida);

	Establecimiento findEstablecimientoByIdExpediente(Integer idExpediente);

	Establecimiento findByIdenticadorEstablecimiento(Establecimiento ab6301s00);

	Establecimiento findByIdenticadorEstablecimiento(String identificador);

	void relacionarDirecionExpedienteOficio(String identificador, Integer idExpediente);

	List<CompareExpedienteSection> findDiffExpdienteSections(InitForm initForm);

	/**
	 * Actualiza los campos que se visualizan en la subpestana caracteristicas
	 * del establecimiento de la pestana datos especificos
	 * 
	 * @param ab6301s00
	 * @return
	 * @throws Exception
	 */
	Establecimiento updateDatosEspecificos(Establecimiento establecimiento) throws Exception;

	void relacionarExpedienteOficio(InitForm form);

	/**
	 * Actualiza los campos del formulario de la pestaņa Datos Empresa
	 * 
	 * @param establecimiento
	 * @return
	 * @throws Exception
	 */
	Establecimiento updateDatosEmpresa(Establecimiento establecimiento) throws Exception;

	List<Establecimiento> findAllLikeExcelBusqREATE(Establecimiento filterAb6301s00, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith);

	Boolean updateChangesExpediente(InitForm form);

	ResultAjaxOperation updateChangesSection(InitForm form, Integer idElement, String sectionType);

	Boolean isEsencialChange(InitForm initForm);

	void reasingExpediente(InitForm initForm);

	Establecimiento update(Establecimiento establecimiento, String usuario);

	Long checkRefCatastral(Establecimiento establecimiento);

	void createDispensa(InitForm initForm, Map<String, String> data);

	Boolean canChangeIdentifiadorExp(Integer idExpediente, Integer idTerceroTitular);

	boolean existsDispensaForExp(String folderId);

	void updateDispensa(InitForm initForm, Map<String, String> data);

	Establecimiento updateEstablecimientoDescNombre(Establecimiento establecimiento);

	JQGridResponseDto<Establecimiento> findEstablecimientoByOfiPpal(Establecimiento ab6301s00,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith, Boolean notPrincipalesFilter);

	Long findEstablecimientoByOfiPpalCount(Establecimiento ab6301s00, Boolean startsWith, Boolean flagSucursalesPvBaja);

	List<Establecimiento> findEstablecimientoByOfiPpalInteresados(Establecimiento establecimiento);

	Date calcFechaInscricion(Integer idExpediente);

	Map<String, String> getDatosOficinaPpalAAVV(String numCie);

	Establecimiento add(String tipoEstablecimientoAnyadir, String zonaEstablecimientoAnyadir);

	Map<String, String> getDireccionExtranjeraOficinaPpalAAVV(Integer idTercero);

	Integer deleteDireccionExtranjeraOfiPpal(Integer idDireccionExt);

	List<Establecimiento> findSucursalesOficinaPrincipal(Integer idEstablecimiento);

	void updateCamposS41(Establecimiento establecimiento);
}
