package com.rjconsultores.ventaboletos.dao.sqlbuilder.impl;

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

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.constantes.TipoSeguro;
import com.rjconsultores.ventaboletos.dao.sqlbuilder.SQLBuilder;
import com.rjconsultores.ventaboletos.dao.util.DBUtil;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.enums.TipoFormapago;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;

public class SQLBuilderOracle implements SQLBuilder {
	private static final Integer SELECAO_TODOS = -1;
	private static final Integer HORAS_NO_DIA = Integer.valueOf(24);
	private static final Integer RED_PAGO_FORMAPAGO_ID = Integer.valueOf(95);
	private static final String RED_PAGO_EMISSOR_TARJETA = "RDP";
	private static final String RED_PAGO_FORMA_PAGO = "CR";
	private static final Integer DER_PR = 2;

	@Override
	public String getSQLGerarTabelaZerada(final Integer codRuta, final Integer usuarioId, final Integer orgaoConcedenteId, final List<Integer> idsEmpresas, List<Integer> lsParadaId) {

		StringBuilder sb = new StringBuilder();
		sb.append("INSERT ");
		sb.append("INTO ");
		sb.append("    TARIFA_OFICIAL ");
		sb.append("    ( ");
		sb.append("        TARIFAOFICIAL_ID, ");
		sb.append("        PRECIO, ");
		sb.append("        PRECIOORIGINAL, ");
		sb.append("        TRAMO_ID, ");
		sb.append("        MARCA_ID, ");
		sb.append("        CLASESERVICIO_ID, ");
		sb.append("        PRECIOREDABIERTO, ");
		sb.append("        MONEDA_ID, ");
		sb.append("        VIGENCIATARIFA_ID, ");
		sb.append("        STATUSTARIFA, ");
		sb.append("        IMPORTETAXAEMBARQUE, ");
		sb.append("        IMPORTEPEDAGIO, ");
		sb.append("        IMPORTEOUTROS, ");
		sb.append("        IMPORTESEGURO, ");
		sb.append("        ORGAOCONCEDENTE_ID, ");
		sb.append("        RUTA_ID, ");
		sb.append("        ACTIVO, ");
		sb.append("        FECMODIF, ");
		sb.append("        USUARIO_ID, ");
		sb.append("        ORIGEN_ID, ");
		sb.append("        DESTINO_ID ");
		sb.append("    ) ");
		sb.append("    select  ");
		sb.append(" ");
		sb.append("    TARIFA_OFICIAL_SEQ.NEXTVAL, ");
		sb.append("    0, ");
		sb.append("    0, ");
		sb.append("    t.tramo_id, ");
		sb.append("    mc.marca_id, ");
		sb.append("    r.CLASESERVICIO_ID, ");
		sb.append("    null, ");
		sb.append("    m.moneda_id, ");
		sb.append("    null, ");
		sb.append("    'A', ");
		sb.append("    null, ");
		sb.append("    null, ");
		sb.append("    null, ");
		sb.append("    null, ");
		sb.append("    oc.orgaoconcedente_id, ");
		sb.append("    r.ruta_id, ");
		sb.append("    1, ");
		sb.append("    ").append(DBUtil.getInstance().dbSysdate()).append(", ");
		sb.append("    ").append(usuarioId).append(", ");
		sb.append("    po.parada_id, ");
		sb.append("    pd.parada_id ");
		sb.append(" ");
		sb.append("from ");
		sb.append("    ruta_combinacion rc ");
		sb.append("    inner join ruta r on r.ruta_id = rc.ruta_id ");
		sb.append("    inner join ruta_empresa re on r.ruta_id = re.ruta_id ");
		sb.append("    inner join marca ma on ma.empresa_id = re.empresa_id ");
		sb.append("    inner join orgao_concedente oc on oc.orgaoconcedente_id =r.orgaoconcedente_id ");
		sb.append("    inner join tramo t on t.tramo_id = rc.tramo_id ");
		sb.append("    inner join parada po on po.parada_id = t.origen_id ");
		sb.append("    inner join parada pd on pd.parada_id = t.destino_id ");
		sb.append("    inner join ciudad c on c.ciudad_id = po.ciudad_id ");
		sb.append("    inner join estado e on e.estado_id = c.estado_id ");
		sb.append("    inner join MARCA_CLASESERVICIO mc on ");
		sb.append("    mc.CLASESERVICIO_ID = r.CLASESERVICIO_ID and ma.marca_id = mc.marca_id, ");
		sb.append("    moneda m ");
		sb.append(" ");
		sb.append("where ");
		sb.append("    rc.activo = 1 ");
		if (codRuta != null) {
			sb.append("    and r.ruta_id = ").append(codRuta);
		}
		sb.append("    and r.activo = 1 ");
		sb.append("    and mc.marca_id <> -1 ");
		sb.append("    and mc.activo = 1  ");
		sb.append("    and re.activo = 1  ");
		if (idsEmpresas != null) {
			sb.append("    and re.empresa_id in ( ").append(idsEmpresas.toString().substring(1, idsEmpresas.toString().length() - 1)).append(" ) ");
		}
		sb.append("    and m.moneda_id = 1 ");
		if (orgaoConcedenteId != null) {
			sb.append("    and oc.orgaoconcedente_id = ").append(orgaoConcedenteId);
		}
		sb.append("    and  ");
		sb.append("        (t.tramo_id, ");
		sb.append("        mc.marca_id, ");
		sb.append("        r.CLASESERVICIO_ID, ");
		sb.append("        m.moneda_id, ");
		sb.append("        oc.orgaoconcedente_id, r.ruta_id) ");
		sb.append("        not in (select tao.tramo_id,tao.marca_id,tao.CLASESERVICIO_ID, ");
		sb.append("        tao.moneda_id,tao.orgaoconcedente_id, tao.ruta_id ");
		sb.append("        from tarifa_oficial tao where tao.activo = 1) ");
		if (null != lsParadaId) {
			sb.append("     and t.origen_id in (").append(lsParadaId.toString().substring(1, lsParadaId.toString().length() - 1)).append(" ) ");
		}

		return sb.toString();
	}

	@Override
	public String getSQLGerarTarifaOficialArtesp(final Integer codRuta, final Integer usuarioId,
			final Integer orgaoConcedenteId, final List<Integer> idsEmpresas) {
		StringBuilder sb = new StringBuilder();
		sb.append(" INSERT ");
		sb.append(" INTO ");
		sb.append("    TARIFA_OFICIAL ");
		sb.append("    ( ");
		sb.append("        TARIFAOFICIAL_ID, ");
		sb.append("        PRECIO, ");
		sb.append("        PRECIOORIGINAL, ");
		sb.append("        TRAMO_ID, ");
		sb.append("        MARCA_ID, ");
		sb.append("        CLASESERVICIO_ID, ");
		sb.append("        PRECIOREDABIERTO, ");
		sb.append("        MONEDA_ID, ");
		sb.append("        VIGENCIATARIFA_ID, ");
		sb.append("        STATUSTARIFA, ");
		sb.append("        IMPORTETAXAEMBARQUE, ");
		sb.append("        IMPORTEPEDAGIO, ");
		sb.append("        IMPORTEOUTROS, ");
		sb.append("        IMPORTESEGURO, ");
		sb.append("        ORGAOCONCEDENTE_ID, ");
		sb.append("        RUTA_ID, ");
		sb.append("        ACTIVO, ");
		sb.append("        FECMODIF, ");
		sb.append("        USUARIO_ID, ");
		sb.append("        ORIGEN_ID, ");
		sb.append("        DESTINO_ID ");
		sb.append("    ) ");
		sb.append("    select  ");
		sb.append(" ");
		sb.append("    TARIFA_OFICIAL_SEQ.NEXTVAL, ");

		sb.append("    ROUND( ");
		sb.append(" 	(");
		sb.append(" ");
		sb.append(" 		case ( coalesce((select min( tkm.valortaxa ) from Tarifa_km tkm where tkm.kmate >= t.cantkmreal and r.CLASESERVICIO_ID = tkm.CLASESERVICIO_ID and tkm.activo = 1) , 0  )) when 0 then");
		sb.append("  			(select max( tkm.valortaxa ) from Tarifa_km tkm where tkm.CLASESERVICIO_ID = r.CLASESERVICIO_ID and tkm.activo = 1)");
		sb.append(" 		else");
		sb.append(" 			(select min( tkm.valortaxa ) from Tarifa_km tkm where tkm.kmate >= t.cantkmreal and r.CLASESERVICIO_ID = tkm.CLASESERVICIO_ID and tkm.activo = 1) end");
		sb.append(" ) ");
		sb.append("  	,2), ");

		sb.append("    ROUND( ");
		sb.append(" 	(");
		sb.append(" ");
		sb.append(" 		case ( coalesce((select min( tkm.valortaxa ) from Tarifa_km tkm where tkm.kmate >= t.cantkmreal and r.CLASESERVICIO_ID = tkm.CLASESERVICIO_ID and tkm.activo = 1) , 0  )) when 0 then");
		sb.append("  			(select max( tkm.valortaxa ) from Tarifa_km tkm where tkm.CLASESERVICIO_ID = r.CLASESERVICIO_ID and tkm.activo = 1)");
		sb.append(" 		else");
		sb.append(" 			(select min( tkm.valortaxa ) from Tarifa_km tkm where tkm.kmate >= t.cantkmreal and r.CLASESERVICIO_ID = tkm.CLASESERVICIO_ID and tkm.activo = 1) end");
		sb.append(" ) ");
		sb.append("  	,2), ");

		sb.append("    t.tramo_id, ");
		sb.append("    mc.marca_id, ");
		sb.append("    r.CLASESERVICIO_ID, ");
		sb.append("    null, ");
		sb.append("    m.moneda_id, ");
		sb.append("    null, ");
		sb.append("    'A', ");
		sb.append("    null, ");
		sb.append("    null, ");
		sb.append("    null, ");
		sb.append("    null, ");
		sb.append("    oc.orgaoconcedente_id, ");
		sb.append("    r.ruta_id, ");
		sb.append("    1, ");
		sb.append("    ").append(DBUtil.getInstance().dbSysdate()).append(", ");
		sb.append("    ").append(usuarioId).append(", ");
		sb.append("    po.parada_id, ");
		sb.append("    pd.parada_id ");
		sb.append(" ");
		sb.append("from ");
		sb.append("    ruta_combinacion rc ");
		sb.append("    inner join ruta r on r.ruta_id = rc.ruta_id ");
		sb.append("    inner join ruta_empresa re on r.ruta_id = re.ruta_id ");
		sb.append("    inner join marca ma on ma.empresa_id = re.empresa_id ");
		sb.append("    inner join orgao_concedente oc on oc.orgaoconcedente_id =r.orgaoconcedente_id ");
		sb.append("    inner join tramo t on t.tramo_id = rc.tramo_id and t.activo =1");// adicionei isso t.activo =1");
		sb.append("    inner join parada po on po.parada_id = t.origen_id ");
		sb.append("    inner join parada pd on pd.parada_id = t.destino_id ");
		sb.append("    inner join ciudad c on c.ciudad_id = po.ciudad_id ");
		sb.append("    inner join estado e on e.estado_id = c.estado_id ");
		sb.append("    inner join MARCA_CLASESERVICIO mc on ");
		sb.append("    mc.CLASESERVICIO_ID = r.CLASESERVICIO_ID and ma.marca_id = mc.marca_id, ");
		sb.append("    moneda m ");
		sb.append(" ");
		sb.append("where ");

		sb.append("    rc.activo = 1 ");
		if (codRuta != null) {
			sb.append("    and r.ruta_id = ").append(codRuta);
		}
		sb.append("    and r.activo = 1 ");
		sb.append("    and mc.marca_id <> -1 ");
		sb.append("    and mc.activo = 1  ");
		sb.append("    and re.activo = 1  ");
		sb.append("    and r.orgaoconcedente_id = 21  ");
		if (idsEmpresas != null) {
			sb.append("    and re.empresa_id in ( ").append(idsEmpresas.toString().substring(1, idsEmpresas.toString().length() - 1)).append(" ) ");
		}
		sb.append("    and m.moneda_id = 1 ");
		if (orgaoConcedenteId != null) {
			sb.append("    and oc.orgaoconcedente_id = ").append(orgaoConcedenteId);
		}
		sb.append("    and  ");
		sb.append("        (t.tramo_id, ");
		sb.append("        mc.marca_id, ");
		sb.append("        r.CLASESERVICIO_ID, ");
		sb.append("        m.moneda_id, ");
		sb.append("        oc.orgaoconcedente_id, r.ruta_id) ");
		sb.append("        not in (select tao.tramo_id,tao.marca_id,tao.CLASESERVICIO_ID, ");
		sb.append("        tao.moneda_id,tao.orgaoconcedente_id, tao.ruta_id ");
		sb.append("        from tarifa_oficial tao where tao.activo = 1) ");

		return sb.toString();
	}

	@Override
	public String getSQLGerarTarifaOficial(final Integer codRuta, final Integer usuarioId,
			final OrgaoConcedente orgaoConcedente, final List<Integer> idsEmpresas,Integer[] listCasetaPeaje) {

		StringBuilder sb = new StringBuilder();
		sb.append(" INSERT ");
		sb.append(" INTO ");
		sb.append("    TARIFA_OFICIAL ");
		sb.append("    ( ");
		sb.append("        TARIFAOFICIAL_ID, ");
		sb.append("        PRECIO, ");
		sb.append("        PRECIOORIGINAL, ");
		sb.append("        TRAMO_ID, ");
		sb.append("        MARCA_ID, ");
		sb.append("        CLASESERVICIO_ID, ");
		sb.append("        PRECIOREDABIERTO, ");
		sb.append("        MONEDA_ID, ");
		sb.append("        VIGENCIATARIFA_ID, ");
		sb.append("        STATUSTARIFA, ");
		sb.append("        IMPORTETAXAEMBARQUE, ");
		sb.append("        IMPORTEPEDAGIO, ");
		sb.append("        IMPORTEOUTROS, ");
		sb.append("        IMPORTESEGURO, ");
		sb.append("        ORGAOCONCEDENTE_ID, ");
		sb.append("        RUTA_ID, ");
		sb.append("        ACTIVO, ");
		sb.append("        FECMODIF, ");
		sb.append("        USUARIO_ID, ");
		sb.append("        ORIGEN_ID, ");
		sb.append("        DESTINO_ID ");
		sb.append("    ) ");
		
		sb.append(" WITH tarifacte AS ( ");
		
		sb.append("    select DISTINCT ");
		sb.append(" ");

		// >> SE ORGAO FOR DER-PR E SE O COEFICIENTE DA CLASSE NAO ESTA NULL
		sb.append(" CASE R.ORGAOCONCEDENTE_ID WHEN " + DER_PR + " THEN    CASE WHEN cl.COEFICIENTETARIFA IS NOT  NULL THEN  ");
		sb.append(" trunc(((coalesce(ct1.coeficiente,0) + oc.coeficientetarifa / ((POWER(COALESCE(tc.kmcoeficiente1,0) + 350,0.27)*16160 )) ) * COALESCE(tc.kmcoeficiente1,0)) * cl.COEFICIENTETARIFA ");
		sb.append(" + ((coalesce(ct2.coeficiente,0) + oc.coeficientetarifa / ((POWER(COALESCE(tc.kmcoeficiente2,0) + 350,0.27)*13470 )) ) * COALESCE(tc.kmcoeficiente2,0)) * cl.COEFICIENTETARIFA,2) ");
		sb.append(" ELSE  ");
		// < COEFICIENTE DA CLASSE ESTA NULL
		sb.append("		 ROUND( ");
		sb.append("		 (coalesce(ct1.coeficiente,0) * coalesce(tc.kmcoeficiente1,0) + ");
		sb.append("		 coalesce(ct2.coeficiente,0) * coalesce(tc.kmcoeficiente2,0) + ");
		sb.append("		 coalesce(ct3.coeficiente,0) * coalesce(tc.kmcoeficiente3,0))  * ");
		if (orgaoConcedente != null && orgaoConcedente.getIndUtilizaICMS() != null && orgaoConcedente.getIndUtilizaICMS()) {
			sb.append("		 case when e.icms is null then 1 else (1/(1-e.icms/100)) end  ,2) ");
		} else {
			sb.append(" 1, 2 ) ");
		}
		//
		sb.append(" end else  ");
		// < ORGAO NAO EH DER-PR
		sb.append("		 ROUND( ");
		sb.append("		 (coalesce(ct1.coeficiente,0) * coalesce(tc.kmcoeficiente1,0) + ");
		sb.append("		 coalesce(ct2.coeficiente,0) * coalesce(tc.kmcoeficiente2,0) + ");
		sb.append("		 coalesce(ct3.coeficiente,0) * coalesce(tc.kmcoeficiente3,0))  * ");
		if (orgaoConcedente != null && orgaoConcedente.getIndUtilizaICMS() != null && orgaoConcedente.getIndUtilizaICMS()) {
			sb.append("		 case when e.icms is null then 1 else (1/(1-e.icms/100)) end  ,2) ");
		} else {
			sb.append(" 1, 2 ) ");
		}
		sb.append(" end as precio, ");
		//
		// >> SE ORGAO FOR DER-PR E SE O COEFICIENTE DA CLASSE NAO ESTA NULL
		sb.append(" CASE R.ORGAOCONCEDENTE_ID WHEN " + DER_PR + " THEN    CASE WHEN cl.COEFICIENTETARIFA IS NOT  NULL THEN  ");
		sb.append(" trunc(((coalesce(ct1.coeficiente,0) +  oc.coeficientetarifa / ((POWER(COALESCE(tc.kmcoeficiente1,0) + 350,0.27)*16160 )) ) * COALESCE(tc.kmcoeficiente1,0)) * cl.COEFICIENTETARIFA ");
		sb.append(" + ((coalesce(ct2.coeficiente,0) +  oc.coeficientetarifa / ((POWER(COALESCE(tc.kmcoeficiente2,0) + 350,0.27)*13470 )) ) * COALESCE(tc.kmcoeficiente2,0)) * cl.COEFICIENTETARIFA,2) ");
		sb.append(" ELSE  ");
		// < COEFICIENTE DA CLASSE ESTA NULL
		sb.append("		 ROUND( ");
		sb.append("		 (coalesce(ct1.coeficiente,0) * coalesce(tc.kmcoeficiente1,0) + ");
		sb.append("		 coalesce(ct2.coeficiente,0) * coalesce(tc.kmcoeficiente2,0) + ");
		sb.append("		 coalesce(ct3.coeficiente,0) * coalesce(tc.kmcoeficiente3,0))  * ");
		if (orgaoConcedente != null && orgaoConcedente.getIndUtilizaICMS() != null && orgaoConcedente.getIndUtilizaICMS()) {
			sb.append("		 case when e.icms is null then 1 else (1/(1-e.icms/100)) end  ,2) ");
		} else {
			sb.append(" 1, 2 ) ");
		}
		//
		sb.append(" end else ");
		// < ORGAO NAO EH DER-PR
		sb.append("		 ROUND( ");
		sb.append("		 (coalesce(ct1.coeficiente,0) * coalesce(tc.kmcoeficiente1,0) + ");
		sb.append("		 coalesce(ct2.coeficiente,0) * coalesce(tc.kmcoeficiente2,0) + ");
		sb.append("		 coalesce(ct3.coeficiente,0) * coalesce(tc.kmcoeficiente3,0))  * ");
		if (orgaoConcedente != null && orgaoConcedente.getIndUtilizaICMS() != null && orgaoConcedente.getIndUtilizaICMS()) {
			sb.append("		 case when e.icms is null then 1 else (1/(1-e.icms/100)) end  ,2) ");
		} else {
			sb.append(" 1, 2 ) ");
		}
		sb.append(" end as preciooriginal , ");
		//
		sb.append("    t.tramo_id, ");
		sb.append("    mc.marca_id, ");
		sb.append("    r.CLASESERVICIO_ID, ");
		sb.append("    null as precioredabierto, ");
		sb.append("    m.moneda_id, ");
		sb.append("    null as vigenciatarifa_id, ");
		sb.append("    'A' as statustarifa, ");
		sb.append("    null as importetaxaembarque, ");
		sb.append("    null as importepedagio, ");
		sb.append("    null as importeoutros, ");
		sb.append("    null as importeseguro, ");
		sb.append("    oc.orgaoconcedente_id, ");
		sb.append("    r.ruta_id, ");
		sb.append("    1 as activo, ");
		sb.append("    ").append(DBUtil.getInstance().dbSysdate()).append(" as fecmodif, ");
		sb.append("    ").append(usuarioId).append(" as usuario_id, ");
		sb.append("    po.parada_id as origen_id, ");
		sb.append("    pd.parada_id as destino_id");
		sb.append(" ");
		sb.append("from ");
		sb.append("    ruta_combinacion rc ");
		sb.append("    inner join ruta r on r.ruta_id = rc.ruta_id ");
		sb.append("    inner join ruta_empresa re on r.ruta_id = re.ruta_id ");
		sb.append("    inner join marca ma on ma.empresa_id = re.empresa_id ");
		sb.append("    inner join orgao_tramo tc on tc.tramo_id = rc.tramo_id ");
		sb.append("    and tc.CLASESERVICIO_ID = r.CLASESERVICIO_ID and tc.activo =1 ");
		sb.append("    inner join orgao_concedente oc on ");
		sb.append("    oc.orgaoconcedente_id = tc.orgaoconcedente_id ");
		sb.append("    and oc.orgaoconcedente_id =r.orgaoconcedente_id ");
		sb.append("    inner join coeficiente_tarifa ct1 on ct1.coeficientetarifa_id = tc.coeficientetarifa1_id ");
		sb.append("    left join coeficiente_tarifa ct2 on ct2.coeficientetarifa_id = tc.coeficientetarifa2_id ");
		sb.append("    left join coeficiente_tarifa ct3 on ct3.coeficientetarifa_id = tc.coeficientetarifa3_id ");
		sb.append("    inner join tramo t on t.tramo_id = rc.tramo_id ");
		sb.append("    inner join parada po on po.parada_id = t.origen_id ");
		sb.append("    inner join parada pd on pd.parada_id = t.destino_id ");
		sb.append("    inner join ciudad c on c.ciudad_id = po.ciudad_id ");
		sb.append("    inner join estado e on e.estado_id = c.estado_id ");
		sb.append("    inner join MARCA_CLASESERVICIO mc on ");
		sb.append("    mc.CLASESERVICIO_ID = r.CLASESERVICIO_ID and ma.marca_id = mc.marca_id ");
		if(null !=listCasetaPeaje) {
		sb.append("  inner join peaje p on p.ruta_id=r.ruta_id and p.origen_id=po.parada_id and p.destino_id=pd.parada_id and p.orgaoconcedente_id =oc.orgaoconcedente_id  ");		
		}
		sb.append("    inner join CLASE_SERVICIO cl on cl.claseservicio_id = r.CLASESERVICIO_ID,  ");
		sb.append("    moneda m ");
	
		sb.append(" ");
		sb.append("where ");
		sb.append("    rc.activo = 1 ");
		if (codRuta != null) {
			sb.append("    and r.ruta_id = ").append(codRuta);
		}
		sb.append("    and r.activo = 1 ");
		sb.append("    and tc.activo = 1 ");
		sb.append("    and mc.marca_id <> -1 ");
		sb.append("    and mc.activo = 1  ");
		sb.append("    and re.activo = 1  ");
		sb.append("    and r.orgaoconcedente_id <> 21  ");
		if (ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.CRIAR_TARIFA_APENAS_TRECHO_VENDIDO.getDescricao())) {
			sb.append("    and rc.indventa = 1 ");
		}
		if (idsEmpresas != null) {
			sb.append("    and re.empresa_id in ( ").append(idsEmpresas.toString().substring(1, idsEmpresas.toString().length() - 1)).append(" ) ");
		}
		sb.append("    and m.moneda_id = 1 ");
		sb.append("    and ma.activo = 1 ");
		if (orgaoConcedente != null && orgaoConcedente.getOrgaoConcedenteId() != null && orgaoConcedente.getOrgaoConcedenteId() != SELECAO_TODOS) {
			sb.append("    and oc.orgaoconcedente_id = ").append(orgaoConcedente.getOrgaoConcedenteId());
		}
		sb.append("    and  ");
		sb.append("        (t.tramo_id, ");
		sb.append("        mc.marca_id, ");
		sb.append("        r.CLASESERVICIO_ID, ");
		sb.append("        m.moneda_id, ");
		sb.append("        oc.orgaoconcedente_id, r.ruta_id) ");
		sb.append("        not in (select tao.tramo_id,tao.marca_id,tao.CLASESERVICIO_ID, ");
		sb.append("        tao.moneda_id,tao.orgaoconcedente_id, tao.ruta_id ");
		sb.append("        from tarifa_oficial tao where tao.activo = 1) ");		
		if(null !=listCasetaPeaje) {
		sb.append(" and p.activo=1 ");
		sb.append(" and p.casetapeaje_id in ( " + StringUtils.join(listCasetaPeaje,",") + ") ");
		}

		sb.append(" ) ");
		
		sb.append(" SELECT ");
		
		sb.append("    TARIFA_OFICIAL_SEQ.NEXTVAL, ");
		sb.append("        PRECIO, ");
		sb.append("        PRECIOORIGINAL, ");
		sb.append("        TRAMO_ID, ");
		sb.append("        MARCA_ID, ");
		sb.append("        CLASESERVICIO_ID, ");
		sb.append("        PRECIOREDABIERTO, ");
		sb.append("        MONEDA_ID, ");
		sb.append("        VIGENCIATARIFA_ID, ");
		sb.append("        STATUSTARIFA, ");
		sb.append("        IMPORTETAXAEMBARQUE, ");
		sb.append("        IMPORTEPEDAGIO, ");
		sb.append("        IMPORTEOUTROS, ");
		sb.append("        IMPORTESEGURO, ");
		sb.append("        ORGAOCONCEDENTE_ID, ");
		sb.append("        RUTA_ID, ");
		sb.append("        ACTIVO, ");
		sb.append("        FECMODIF, ");
		sb.append("        USUARIO_ID, ");
		sb.append("        ORIGEN_ID, ");
		sb.append("        DESTINO_ID ");
		
		sb.append("    FROM tarifacte ");
		
		return sb.toString();
	}

	@Override
	public String getSQLAtualizarTarifaOficial(final Integer rutaId, final Integer usuarioId,
			final OrgaoConcedente orgaoConcedente) {
		StringBuilder sb = new StringBuilder("");

		sb.append("UPDATE TARIFA_OFICIAL SET PRECIO =  ");
		sb.append("( ");
		sb.append("select  ");
		sb.append("     ");
		sb.append("    ROUND( ");
		sb.append("    (coalesce(ct1.coeficiente,0) * coalesce(tc.kmcoeficiente1,0) + ");
		sb.append("    coalesce(ct2.coeficiente,0) * coalesce(tc.kmcoeficiente2,0) + ");
		sb.append("    coalesce(ct3.coeficiente,0) * coalesce(tc.kmcoeficiente3,0)) * ");
		sb.append("    case when e.icms is null then 1 else (1/(1-e.icms/100)) end ,2)");
		sb.append("     ");
		sb.append("from ");
		sb.append("    ruta_combinacion rc ");
		sb.append("    inner join ruta r on r.ruta_id = rc.ruta_id ");
		sb.append("    inner join orgao_tramo tc on  ");
		sb.append("    tc.tramo_id = rc.tramo_id and tc.CLASESERVICIO_ID = r.CLASESERVICIO_ID and tc.activo =1 ");
		sb.append("    inner join orgao_concedente oc on ");
		sb.append("    oc.orgaoconcedente_id = tc.orgaoconcedente_id ");
		sb.append("    and oc.orgaoconcedente_id =r.orgaoconcedente_id ");
		sb.append("    inner join coeficiente_tarifa ct1 on ct1.coeficientetarifa_id = tc.coeficientetarifa1_id ");
		sb.append("    left join coeficiente_tarifa ct2 on ct2.coeficientetarifa_id = tc.coeficientetarifa2_id ");
		sb.append("    left join coeficiente_tarifa ct3 on ct3.coeficientetarifa_id = tc.coeficientetarifa3_id ");
		sb.append("    inner join tramo t on t.tramo_id = rc.tramo_id ");
		sb.append("    inner join parada po on po.parada_id = t.origen_id ");
		sb.append("    inner join parada pd on pd.parada_id = t.destino_id ");
		sb.append("    inner join ciudad c on c.ciudad_id = po.ciudad_id ");
		sb.append("    inner join estado e on e.estado_id = c.estado_id ");
		sb.append("    inner join MARCA_CLASESERVICIO mc on mc.CLASESERVICIO_ID = r.CLASESERVICIO_ID, ");
		sb.append("    moneda m ");
		sb.append(" ");
		sb.append("where ");
		sb.append("    rc.activo = 1 ");
		sb.append("    and r.activo = 1 ");
		sb.append("    and mc.marca_id <> -1 ");
		sb.append("    and tc.activo = 1 ");
		sb.append("    and m.moneda_id = 1 ");
		if (orgaoConcedente != null && orgaoConcedente.getOrgaoConcedenteId() != null) {
			sb.append("    and oc.orgaoconcedente_id = ").append(orgaoConcedente.getOrgaoConcedenteId());
		}
		sb.append("    and t.tramo_id = TARIFA_OFICIAL.tramo_id ");
		sb.append("    and mc.marca_id = TARIFA_OFICIAL.marca_id ");
		sb.append("    and r.CLASESERVICIO_ID = TARIFA_OFICIAL.CLASESERVICIO_ID ");
		sb.append("    and m.moneda_id = TARIFA_OFICIAL.moneda_id ");
		sb.append("    and oc.orgaoconcedente_id = TARIFA_OFICIAL.orgaoconcedente_id ");
		sb.append("    and r.ruta_id = TARIFA_OFICIAL.ruta_id ");
		sb.append(") ");
		sb.append(" ");
		sb.append(", usuario_id = ").append(usuarioId).append(",fecmodif = ").append(DBUtil.getInstance().dbSysdate()).append(" ");
		sb.append(" ");
		sb.append("where  ");
		sb.append("    activo = 1 ");
		if (rutaId != null) {
			sb.append(" and ruta_id = ").append(rutaId);
		}
		if (orgaoConcedente != null && orgaoConcedente.getOrgaoConcedenteId() != null) {
			sb.append("    and orgaoconcedente_id = ").append(orgaoConcedente.getOrgaoConcedenteId());
		}

		return sb.toString();
	}

	@Override
	public String getAtualizarTaxaEmbarquePorKmParada(final Integer rutaId, final Integer usuarioId, final Integer orgaoConcedenteId, List<Integer> idsEmpresas, List<Integer> lsParadaIds) {
		StringBuilder sb = new StringBuilder("");
		sb.append("update tarifa_oficial set IMPORTETAXAEMBARQUE =  ");
		sb.append("( ");
		sb.append("select  ");
		sb.append("    tepKm.valorTaxa ");
		sb.append("   ");
		sb.append(" ");
		sb.append("from ");
		sb.append("    tarifa_oficial tao ");
		sb.append("    inner join tramo t on t.tramo_id = tao.tramo_id ");
		sb.append("    inner join TAXA_EMBARQUE_PARADA tepKm on ");
		sb.append("    tepKm.parada_id = t.origen_id and tepKm.KMATE >=  ");
		sb.append("    t.CANTKMREAL and tepKm.activo = 1 and tepKm.indtipo = 'K' and tepKm.empresa_id in (-1, ").append(idsEmpresas.toString().substring(1, idsEmpresas.toString().length() - 1)).append(" ) ");
		if (null != lsParadaIds) {
			sb.append("     and t.origen_id in (").append(lsParadaIds.toString().substring(1, lsParadaIds.toString().length() - 1)).append(" ) ");
		}

		sb.append("    inner join marca m on m.marca_id = tao.marca_id ");
		sb.append("where ");
		sb.append("    tepKm.kmate= ");
		sb.append("     (select min(tepKm1.KMATE) ");
		sb.append("    from ");
		sb.append("        TAXA_EMBARQUE_PARADA tepKm1 ");
		sb.append("    where  ");
		sb.append("        tepKm1.parada_id = t.origen_id and tepKm1.KMATE >= t.CANTKMREAL and tepKm1.activo = 1 and tepKm1.orgaoconcedente_id = tao.orgaoconcedente_id  and tepKm1.empresa_id in (-1, ").append(idsEmpresas.toString().substring(1, idsEmpresas.toString().length() - 1)).append(" ) ");
		sb.append("    ) ");
		sb.append("    and tao.marca_id = tarifa_oficial.marca_id ");
		sb.append("    and tao.orgaoconcedente_id = tarifa_oficial.orgaoconcedente_id ");
		sb.append("    and tao.orgaoconcedente_id = tepKm.orgaoconcedente_id ");
		sb.append("    and tao.claseservicio_id=tarifa_oficial.claseservicio_id ");
		sb.append("    and tao.moneda_id = tarifa_oficial.moneda_id ");
		sb.append("    and tao.ruta_id = tarifa_oficial.ruta_id ");
		sb.append("    and tao.tramo_id = tarifa_oficial.tramo_id ");
		sb.append("    and tepKm.orgaoconcedente_id = tarifa_oficial.orgaoconcedente_id ");
		if (idsEmpresas != null) {
			sb.append("    and m.empresa_id in  (-1,").append(idsEmpresas.toString().substring(1, idsEmpresas.toString().length() - 1)).append(" ) ");
		}
		sb.append(") ");
		sb.append(", usuario_id = ").append(usuarioId).append(",fecmodif = ").append(DBUtil.getInstance().dbSysdate()).append(" ");
		sb.append(" ");
		sb.append("where ");
		sb.append("    tarifa_oficial.activo = 1 ");
		if (rutaId != null) {
			sb.append("    and tarifa_oficial.ruta_id = ").append(rutaId);
		}
		if (orgaoConcedenteId != null) {
			sb.append("    and tarifa_oficial.orgaoconcedente_id = ").append(orgaoConcedenteId);
		}
		if (null != lsParadaIds) {
			sb.append("     and tarifa_oficial.origen_id in (").append(lsParadaIds.toString().substring(1, lsParadaIds.toString().length() - 1)).append(" ) ");
		}
		return sb.toString();
	}

	@Override
	public String getSQLAtualizarTaxaEmbarquePorKmOrgao(final Integer rutaId, final Integer usuarioId, final Integer orgaoConcedenteId, List<Integer> idsEmpresas,List<Integer> lsParadaIds) {
		StringBuilder sb = new StringBuilder("");
		sb.append("update tarifa_oficial set IMPORTETAXAEMBARQUE =  ");
		sb.append("coalesce( ");
		sb.append("( ");
		sb.append("select  ");
		sb.append("    tek.valorTaxa ");
		sb.append("   ");
		sb.append("from ");
		sb.append("    tarifa_oficial tao ");
		sb.append("    inner join tramo t on t.tramo_id = tao.tramo_id ");
		sb.append("    inner join taxa_embarque_km tek on ");
		sb.append("    tek.orgaoconcedente_id = tao.ORGAOCONCEDENTE_ID ");
		sb.append("    and tek.activo = 1 and t.CANTKMREAL <= tek.kmate ");
		sb.append("    inner join marca m on tao.marca_id = m.marca_id ");
		sb.append("where ");
		sb.append("    tek.kmate= ");
		sb.append("     (select min(tek1.KMATE) ");
		sb.append("    from ");
		sb.append("        taxa_embarque_km tek1 ");
		sb.append("    where  ");
		sb.append("        tek1.orgaoconcedente_id = tao.ORGAOCONCEDENTE_ID ");
		sb.append("        and t.CANTKMREAL <= tek1.kmate and tek1.activo = 1 ");
		sb.append("    ) ");
		sb.append(" ");
		sb.append("    and tao.marca_id = tarifa_oficial.marca_id ");
		sb.append("    and tao.orgaoconcedente_id = tarifa_oficial.orgaoconcedente_id ");
		sb.append("    and tao.orgaoconcedente_id = tek.orgaoconcedente_id ");
		sb.append("    and tao.claseservicio_id=tarifa_oficial.claseservicio_id ");
		sb.append("    and tao.moneda_id = tarifa_oficial.moneda_id ");
		sb.append("    and tao.ruta_id = tarifa_oficial.ruta_id ");
		sb.append("    and tao.tramo_id = tarifa_oficial.tramo_id ");

		if (idsEmpresas != null) {
			sb.append("    and m.empresa_id in ( ").append(idsEmpresas.toString().substring(1, idsEmpresas.toString().length() - 1)).append(" ) ");
		}
		
		if (null != lsParadaIds) {
			sb.append("     and t.origen_id in (").append(lsParadaIds.toString().substring(1, lsParadaIds.toString().length() - 1)).append(" ) ");
		}
		
		

		sb.append("),IMPORTETAXAEMBARQUE) ");
		sb.append(", usuario_id = ").append(usuarioId).append(",fecmodif = ").append(DBUtil.getInstance().dbSysdate()).append(" ");
		sb.append(" ");
		sb.append("where ");
		sb.append("    tarifa_oficial.activo = 1 ");

		if (rutaId != null) {
			sb.append("    and tarifa_oficial.ruta_id = ").append(rutaId);
		}

		if (orgaoConcedenteId != null) {
			sb.append("    and tarifa_oficial.orgaoconcedente_id = ").append(orgaoConcedenteId);
		}
		
		if (null != lsParadaIds) {
			sb.append("     and tarifa_oficial.origen_id in (").append(lsParadaIds.toString().substring(1, lsParadaIds.toString().length() - 1)).append(" ) ");
		}
		return sb.toString();
	}

	@Override
	public String getSQLAtualizarTaxaEmbarquePorParadaFixo(final Integer rutaId, final Integer usuarioId, final Integer orgaoConcedenteId, List<Integer> idsEmpresas,List<Integer> lsParadaIds) {
		StringBuilder sb = new StringBuilder("");

		sb.append("update tarifa_oficial set IMPORTETAXAEMBARQUE =  ");
		sb.append("coalesce( ");
		sb.append("( ");
		sb.append("select distinct  ");
		sb.append("  tepFixo.valorTaxa ");
		sb.append(" ");
		sb.append("from ");
		sb.append("    tarifa_oficial tao ");
		sb.append("    inner join tramo t on t.tramo_id = tao.tramo_id ");
		sb.append("    inner join TAXA_EMBARQUE_PARADA tepFixo on ");
		sb.append("    tepFixo.parada_id = t.origen_id and tepFixo.empresa_id in (" + obtemEmpresas(idsEmpresas) + " ) ");
		sb.append("    and tepFixo.indtipo = 'F' and tepFixo.activo = 1 ");
		sb.append("    inner join marca m on m.marca_id = tao.marca_id ");
		sb.append("where ");
		sb.append("    tao.marca_id = tarifa_oficial.marca_id ");
		sb.append("    and (tao.orgaoconcedente_id = tepFixo.orgaoconcedente_id  or tepFixo.orgaoconcedente_id in (-1,  ").append(orgaoConcedenteId).append(")) ");
		sb.append("    and tao.orgaoconcedente_id = tarifa_oficial.orgaoconcedente_id ");
		sb.append("    and tao.claseservicio_id=tarifa_oficial.claseservicio_id ");
		sb.append("    and tao.moneda_id = tarifa_oficial.moneda_id ");
		sb.append("    and tao.ruta_id = tarifa_oficial.ruta_id ");
		sb.append("    and tao.tramo_id = tarifa_oficial.tramo_id ");
		sb.append("    and m.empresa_id in (" + obtemEmpresas(idsEmpresas) + " ) and tao.activo = 1 ");
		if (null != lsParadaIds) {
			sb.append("     and t.origen_id in (").append(lsParadaIds.toString().substring(1, lsParadaIds.toString().length() - 1)).append(" ) ");
		}
		
		sb.append("),IMPORTETAXAEMBARQUE) ");
		sb.append(", usuario_id = ").append(usuarioId).append(",fecmodif = ").append(DBUtil.getInstance().dbSysdate()).append(" ");
		sb.append(" ");
		sb.append("where ");
		sb.append("    tarifa_oficial.activo = 1 ");
		if (rutaId != null) {
			sb.append("    and tarifa_oficial.ruta_id = ").append(rutaId);
		}
		if (orgaoConcedenteId != null) {
			sb.append("    and tarifa_oficial.orgaoconcedente_id = ").append(orgaoConcedenteId);
		}
		sb.append("  and tarifa_oficial.MARCA_ID in (select m2.marca_id from marca m2 where m2.activo = 1 and m2.empresa_id in (" + obtemEmpresas(idsEmpresas) + " ) ) ");

		if (null != lsParadaIds) {
			sb.append("     and tarifa_oficial.origen_id in (").append(lsParadaIds.toString().substring(1, lsParadaIds.toString().length() - 1)).append(" ) ");
		}
		return sb.toString();
	}

	private String obtemEmpresas(List<Integer> idsEmpresas) {
		if (idsEmpresas == null || idsEmpresas.contains(SELECAO_TODOS)) {
			return Integer.toString(SELECAO_TODOS);
		}
		return idsEmpresas.toString().substring(1, idsEmpresas.toString().length() - 1);
	}

	@Override
	public String getSQLAtualizarSeguroPorKm(final Integer rutaId, final Integer usuarioId,
			final Integer orgaoConcedenteId, TipoSeguro tipoSeguro) {
		StringBuilder sb = new StringBuilder("");
		if (tipoSeguro.equals(TipoSeguro.SEGURO)) {
			sb.append("update tarifa_oficial set IMPORTESEGURO =  ");
		} else {
			sb.append("update tarifa_oficial set IMPORTETPP =  ");
		}
		sb.append("( ");
		sb.append("select  ");
		sb.append("    sk.VALORTAXA ");
		sb.append("from ");
		sb.append("    tarifa_oficial tao ");
		sb.append("    inner join tramo t on t.tramo_id = tao.tramo_id ");
		sb.append("    inner join seguro_km sk on ");
		sb.append("    sk.KMATE >= t.CANTKMREAL and sk.activo = 1 ");
		sb.append("    and tao.ORGAOCONCEDENTE_ID = sk.ORGAOCONCEDENTE_ID ");
		sb.append("where ");
		sb.append("    sk.tipo_seguro = '").append(tipoSeguro).append("' and ");
		sb.append("    sk.kmate= ");
		sb.append("     (select min(sk1.KMATE) ");
		sb.append("    from ");
		sb.append("        seguro_km sk1 ");
		sb.append("    where  ");
		sb.append("        sk1.KMATE >= t.CANTKMREAL and sk1.activo = 1 ");
		sb.append("        and sk1.tipo_seguro = '").append(tipoSeguro).append("' ");
		sb.append("        and tao.ORGAOCONCEDENTE_ID = sk1.ORGAOCONCEDENTE_ID ");
		sb.append("    ) ");
		sb.append("    and tao.marca_id = tarifa_oficial.marca_id ");
		sb.append("    and tao.orgaoconcedente_id = tarifa_oficial.orgaoconcedente_id ");
		sb.append("    and tao.claseservicio_id=tarifa_oficial.claseservicio_id ");
		sb.append("    and tao.moneda_id = tarifa_oficial.moneda_id ");
		sb.append("    and tao.ruta_id = tarifa_oficial.ruta_id ");
		sb.append("    and tao.tramo_id = tarifa_oficial.tramo_id ");
		sb.append(") ");
		sb.append(", usuario_id = ").append(usuarioId).append(",fecmodif = ").append(DBUtil.getInstance().dbSysdate()).append(" ");
		sb.append(" ");
		sb.append("where ");
		sb.append("    tarifa_oficial.activo = 1 ");
		if (rutaId != null) {
			sb.append("    and tarifa_oficial.ruta_id = ").append(rutaId);
		}
		if (orgaoConcedenteId != null) {
			sb.append("    and tarifa_oficial.orgaoconcedente_id = ").append(orgaoConcedenteId);
		}

		return sb.toString();
	}

	@Override
	public String getSQLAtualizarPrecioPorTPP(final Integer rutaId, final Integer usuarioId,
			final Integer orgaoConcedenteId, TipoSeguro tipoSeguro) {
		StringBuilder sb = new StringBuilder("");
		sb.append("update tarifa_oficial set PRECIO = PRECIO + nvl(IMPORTETPP,0) ");
		sb.append(" where ");
		sb.append("    tarifa_oficial.activo = 1 ");
		if (rutaId != null) {
			sb.append("    and tarifa_oficial.ruta_id = ").append(rutaId);
		}
		if (orgaoConcedenteId != null) {
			sb.append("    and tarifa_oficial.orgaoconcedente_id = ").append(orgaoConcedenteId);
		}

		return sb.toString();
	}

	@Override
	public String getSQLAtualizarSeguroPorTarifa(final Integer rutaId, final Integer usuarioId,
			final Integer orgaoConcedenteId) {
		StringBuilder sb = new StringBuilder("");
		sb.append("update tarifa_oficial set IMPORTESEGURO =  ");
		sb.append("( ");
		sb.append("select  ");
		sb.append("    st.VALORTAXA ");
		sb.append("from ");
		sb.append("    tarifa_oficial tao ");
		sb.append("    inner join seguro_tarifa st on ");
		sb.append("    st.VALORTARIFAATE >= tao.precio and st.activo = 1 ");
		sb.append("    and tao.ORGAOCONCEDENTE_ID = st.ORGAOCONCEDENTE_ID ");
		sb.append("where ");
		sb.append("    st.VALORTARIFAATE= ");
		sb.append("     (select min(st1.VALORTARIFAATE) ");
		sb.append("    from ");
		sb.append("        seguro_tarifa st1 ");
		sb.append("    where  ");
		sb.append("        st1.VALORTARIFAATE >= tao.precio  and st1.activo = 1 ");
		sb.append("        and tao.ORGAOCONCEDENTE_ID = st1.ORGAOCONCEDENTE_ID ");
		sb.append("    ) ");
		sb.append("    and tao.marca_id = tarifa_oficial.marca_id ");
		sb.append("    and tao.orgaoconcedente_id = tarifa_oficial.orgaoconcedente_id ");
		sb.append("    and tao.claseservicio_id=tarifa_oficial.claseservicio_id ");
		sb.append("    and tao.moneda_id = tarifa_oficial.moneda_id ");
		sb.append("    and tao.ruta_id = tarifa_oficial.ruta_id ");
		sb.append("    and tao.tramo_id = tarifa_oficial.tramo_id ");
		sb.append(") ");
		sb.append(", usuario_id = ").append(usuarioId).append(",fecmodif = ").append(DBUtil.getInstance().dbSysdate()).append(" ");
		sb.append(" ");
		sb.append("where ");
		sb.append("    tarifa_oficial.activo = 1 ");

		if (rutaId != null) {
			sb.append("    and tarifa_oficial.ruta_id = ").append(rutaId);
		}
		if (orgaoConcedenteId != null) {
			sb.append("    and tarifa_oficial.orgaoconcedente_id = ").append(orgaoConcedenteId);
		}

		return sb.toString();
	}

	@Override
	public String getSQLSelecionarTarifaPorTarifaOficalParaAtualizar(final Integer vigenciaTarifaId, Empresa empresa, OrgaoConcedente orgao) {
		StringBuilder sb = new StringBuilder("");

		sb.append("SELECT tao.IMPORTEPEDAGIO      AS \"taoimportepedagio\", ");
		sb.append("       tao.COMPOSICAO_DO_PEAJE      AS \"taocomposicaodopeaje\", ");
		sb.append("       tao.PRECIO              AS \"taoprecio\", ");
		sb.append("       tao.PRECIOORIGINAL      AS \"taopreciooriginal\", ");
		sb.append("       tao.IMPORTETAXAEMBARQUE AS \"taoimportetaxaembarque\", ");
		sb.append("       tao.IMPORTESEGURO       AS \"taoimporteseguro\", ");
		sb.append("       tao.IMPORTETPP          AS \"taoimportetpp\", ");
		sb.append("       tao.IMPORTEOUTROS       AS \"taoimporteoutros\", ");
		sb.append("       ta.TARIFA_ID            AS \"tarifaId\" ");

		sb.append("FROM TARIFA_OFICIAL tao  ");
		sb.append("INNER JOIN TARIFA ta ON (tao.MARCA_ID   = ta.MARCA_ID ");
		sb.append("			    AND tao.CLASESERVICIO_ID   = ta.CLASESERVICIO_ID ");
		sb.append("				AND tao.TRAMO_ID           = ta.TRAMO_ID ");
		sb.append("				AND tao.MONEDA_ID          = ta.MONEDA_ID ");
		sb.append("				AND tao.RUTA_ID            = ta.RUTA_ID ");
		sb.append("				AND tao.ORGAOCONCEDENTE_ID = ta.ORGAOCONCEDENTE_ID ");
		sb.append("						   )");
		sb.append("INNER JOIN MARCA mTa ON  tao.MARCA_ID   = mTa.MARCA_ID ");
		sb.append("INNER JOIN MARCA mTao ON ta.MARCA_ID    = mTao.MARCA_ID ");

		sb.append("WHERE ta.VIGENCIATARIFA_ID = ").append(vigenciaTarifaId);

		if (orgao != null) {
			sb.append(" AND tao.ORGAOCONCEDENTE_ID = ").append(orgao.getOrgaoConcedenteId());
		}
		if (empresa != null) {
			sb.append(" AND mTa.EMPRESA_ID = ").append(empresa.getEmpresaId());
			sb.append(" AND mTao.EMPRESA_ID = ").append(empresa.getEmpresaId());
		}

		return sb.toString();
	}

	@Override
	public String getSQLAtualizarTarifaPorTarifaOfical(Map<String, Object> dados, Integer usuarioId, Boolean calculaPegagio,
			Boolean calculaTarifa, Boolean calculaTaxaEmbarque, Boolean calculaSeguro, Boolean calculaTPP) {

		StringBuilder sb = new StringBuilder("");
		sb.append("UPDATE TARIFA SET ");

		if (calculaPegagio) {
			sb.append("IMPORTEPEDAGIO=").append(dados.get("taoimportepedagio")).append(",");
			sb.append(" COMPOSICAO_DO_PEAJE='").append(dados.get("taocomposicaodopeaje")).append("',");
		}
		if (calculaTarifa) {
			sb.append("PRECIO=").append(dados.get("taoprecio")).append(",PRECIOORIGINAL=").append(dados.get("taopreciooriginal")).append(",");
		}
		if (calculaTaxaEmbarque) {
			sb.append("IMPORTETAXAEMBARQUE=").append(dados.get("taoimportetaxaembarque")).append(",");
		}
		if (calculaSeguro) {
			sb.append("IMPORTESEGURO=").append(dados.get("taoimporteseguro")).append(",");
		}
		if (calculaTPP) {
			sb.append("IMPORTETPP=").append(dados.get("taoimportetpp")).append(",");
		}
		sb.append("IMPORTEOUTROS=").append(dados.get("taoimporteoutros")).append(",");
		sb.append("FECMODIF= current_timestamp, USUARIO_ID=").append(usuarioId);
		sb.append(" WHERE TARIFA_ID = ").append(dados.get("tarifaId"));

		return sb.toString();
	}

	@Override
	public String getSQLInserirTarifaPelaTarifaOficial(final Integer vigenciaTarifaId, final Integer usuarioId, Empresa empresa, OrgaoConcedente orgao) {
		StringBuilder sb = new StringBuilder("");
		sb.append(" insert  ");
		sb.append(" into ");
		sb.append("     TARIFA ");
		sb.append("     ( TARIFA_ID, PRECIO, PRECIOREDABIERTO, TRAMO_ID, ");
		sb.append("       MARCA_ID, CLASESERVICIO_ID, PRECIOORIGINAL, MONEDA_ID, ");
		sb.append("       VIGENCIATARIFA_ID, STATUSTARIFA, ACTIVO, FECMODIF,  ");
		sb.append("       USUARIO_ID, IMPORTETAXAEMBARQUE, IMPORTEPEDAGIO, IMPORTEOUTROS, ");
		sb.append("       IMPORTESEGURO, IMPORTETPP, ORGAOCONCEDENTE_ID, RUTA_ID, ORIGEN_ID, DESTINO_ID, COMPOSICAO_DO_PEAJE ) ");
		sb.append(" select ");
		sb.append("         TARIFA_SEQ.nextval, ");
		sb.append("         tao.PRECIO , ");
		sb.append("         tao.PRECIOREDABIERTO , ");
		sb.append("         tao.TRAMO_ID , ");
		sb.append("         tao.MARCA_ID , ");
		sb.append("         tao.CLASESERVICIO_ID , ");
		sb.append("         tao.PRECIOORIGINAL , ");
		sb.append("         tao.MONEDA_ID , ");
		sb.append("         v.VIGENCIATARIFA_ID , ");
		sb.append("         tao.STATUSTARIFA , ");
		sb.append("         tao.ACTIVO , ");
		sb.append("         current_timestamp , ");
		sb.append("         ").append(usuarioId).append(", ");
		sb.append("         tao.IMPORTETAXAEMBARQUE , ");
		sb.append("         tao.IMPORTEPEDAGIO , ");
		sb.append("         tao.IMPORTEOUTROS , ");
		sb.append("         tao.IMPORTESEGURO , ");
		sb.append("         tao.IMPORTETPP , ");
		sb.append("         tao.ORGAOCONCEDENTE_ID , ");
		sb.append("         tao.RUTA_ID , ");
		sb.append("         tao.ORIGEN_ID , ");
		sb.append("         tao.DESTINO_ID, ");
		sb.append("         tao.COMPOSICAO_DO_PEAJE ");
		sb.append("     from ");
		sb.append("         TARIFA_OFICIAL tao, ");
		sb.append("         VIGENCIA_TARIFA v,   ");
		sb.append("         MARCA m   ");
		sb.append("     where ");
		sb.append("         m.MARCA_ID=tao.MARCA_ID  ");
		sb.append("         and tao.ACTIVO=1  ");
		sb.append("         and v.VIGENCIATARIFA_ID=").append(vigenciaTarifaId).append("  ");

		if (orgao != null) {
			sb.append("         and tao.ORGAOCONCEDENTE_ID=").append(orgao.getOrgaoConcedenteId()).append("  ");
		}
		if (empresa != null) {
			sb.append("         and m.EMPRESA_ID=").append(empresa.getEmpresaId()).append("  ");
		}

		sb.append("         and  not (exists (select ");
		sb.append("             tar.TARIFA_ID  ");
		sb.append("         from ");
		sb.append("             TARIFA tar ");
		sb.append("         where ");
		sb.append("             tar.ACTIVO=1  ");
		sb.append("             and tar.TRAMO_ID=tao.TRAMO_ID  ");
		sb.append("             and tar.MARCA_ID=tao.MARCA_ID  ");
		sb.append("             and tar.CLASESERVICIO_ID=tao.CLASESERVICIO_ID  ");
		sb.append("             and tar.MONEDA_ID=tao.MONEDA_ID  ");
		sb.append("             and tar.ORGAOCONCEDENTE_ID=tao.ORGAOCONCEDENTE_ID  ");
		sb.append("             and tar.RUTA_ID=tao.RUTA_ID  ");
		sb.append("             and tar.VIGENCIATARIFA_ID=").append(vigenciaTarifaId).append("))");

		return sb.toString();
	}

	@Override
	public String getSQLActualizarCorridaFecHusoFecVerano() {

		StringBuilder sb = new StringBuilder();

		sb.append(" update Corrida cq ");
		sb.append(" set    cq.fechorSalidaOriginalH = ");
		sb.append("  (  ");
		sb.append("  select  ");
		sb.append("       c.fechorSalidaOriginal ");
		sb.append("           + nvl((c.origem.ciudad.estado.tiempoHorHuso/").append(HORAS_NO_DIA).append("), 0) ");
		sb.append("           + nvl( case when ");
		sb.append("               c.fechorSalidaOriginal between  ");
		sb.append("               c.origem.ciudad.estado.fecInicioHorVerano ");
		sb.append("               and c.origem.ciudad.estado.fecFinoHorVerano ");
		sb.append("               then (c.origem.ciudad.estado.tiempoHorVerano/").append(HORAS_NO_DIA).append(") ");
		sb.append("               else 0 end, 0)   ");
		sb.append("  from   Corrida c  ");
		sb.append("  where  c.id.corridaId in ( :corridaId ) ");
		sb.append("         and  c.id.feccorrida in ( :feccorrida ) ");
		sb.append("         and  c.id.corridaId = cq.id.corridaId ");
		sb.append("         and  c.id.feccorrida = cq.id.feccorrida ");
		sb.append(" ) ");
		sb.append("  where  cq.id.corridaId in ( :corridaId ) ");
		sb.append("         and  cq.id.feccorrida in ( :feccorrida ) ");

		return sb.toString();
	}

	@Override
	public String getSQLActualizarCorridaTramoFecHusoFecVerano() {
		StringBuilder sb = new StringBuilder();

		sb.append(" update CorridaTramo ctq ");
		sb.append(" set    ctq.fechorSalidaOriginalH = :fechorSalidaOriginalH, ctq.fechorsalidaH = :fechorsalidaH, ctq.fechorllegadaH = :fechorllegadaH");
		sb.append(" where  ctq.corridatramoId = :corridatramoId ");

		return sb.toString();
	}

	@Override
	public String getSQLBuscarCajaFecha(boolean yaCerrado, Date fechaDesde, Date fechaHasta) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

		StringBuilder sb = new StringBuilder("");
		sb.append(" select   ");
		sb.append("   ");
		sb.append(" c.CAJA_ID as \"cajaId\",  ");
		sb.append(" c.NUMASIENTO as \"numAsiento\",  ");
		sb.append(" c.CATEGORIA_ID as \"categoriaId\",  ");
		sb.append(" c.NUMFOLIOSISTEMA as \"numFolioSistema\",  ");
		sb.append(" c.CLASESERVICIO_ID as \"claseServicioId\",  ");
		sb.append(" c.MARCA_ID as \"marcaId\",  ");
		sb.append(" c.ORIGEN_ID as \"origenId\",  ");
		sb.append(" c.DESTINO_ID as \"destinoId\",  ");
		sb.append(" c.CORRIDA_ID as \"corridaId\",  ");
		sb.append(" c.FECCORRIDA as \"fecCorrida\",  ");
		sb.append(" c.NOMBPASAJERO as \"nombPasajero\",  ");
		sb.append(" c.PRECIOBASE as \"precioBase\",  ");
		sb.append(" c.PRECIOPAGADO as \"precioPagado\",  ");
		sb.append(" c.TIPOVENTA_ID as \"tipoVentaId\",  ");
		sb.append(" c.NUMSERIEPREIMPRESA as \"numSeriePreimpresa\",  ");
		sb.append(" c.NUMFOLIOPREIMPRESO as \"numFolioPreImpreso\",  ");
		sb.append(" c.FECHORVIAJE as \"fecHorViaje\",  ");
		sb.append(" c.FECHORVENTA as \"fecHorVenta\",  ");
		sb.append(" c.PUNTOVENTA_ID as \"puntoVentaId\",  ");
		sb.append(" pv.numpuntoventa as \"numPuntoVenta\",  ");
		sb.append(" c.NUMKMVIAJE as \"numKmViaje\",  ");
		sb.append(" c.NUMOPERACION as \"numOperacion\",  ");
		sb.append(" c.MOTIVOCANCELACION_ID as \"motivoCancelacionId\",  ");
		sb.append(" c.EMPRESAPUNTOVENTA_ID as \"empresaPuntoVentaId\",  ");
		sb.append(" c.EMPRESACORRIDA_ID as \"empresaCorridaId\",  ");
		sb.append(" c.TURNO_ID as \"turnoId\",  ");
		sb.append(" c.IMPORTETAXAEMBARQUE as \"importeTaxaEmbarque\",  ");
		sb.append(" c.IMPORTEPEDAGIO as \"importePedagio\",  ");
		sb.append(" c.IMPORTEOUTROS as \"importeOutros\",  ");
		sb.append(" c.IMPORTESEGURO as \"importeSeguro\",  ");
		sb.append(" co.ruta_id as \"rutaId\",  ");
		sb.append(" c.usuario_id as \"usuarioId\",  ");
		sb.append(" ct.numautorizacion as \"numAutorizacion\",  ");
		sb.append(" (case when cfp.formapago_id = 11 then cdp.numdocumento else null end) as \"ordenSevicio\" ");
		sb.append("   ");
		sb.append(" from   ");
		sb.append("     caja c  ");
		sb.append("     left join corrida co on co.corrida_id = c.corrida_id and co.feccorrida = c.feccorrida  ");
		sb.append("     left join caja_formapago cfp on cfp.caja_id = c.caja_id  ");
		sb.append("     left join caja_det_pago cdp on cdp.cajaformapago_id = cfp.cajaformapago_id  ");
		sb.append("     left join caja_tarjeta ct on ct.cajadetpago_id = cdp.cajadetpago_id  ");
		sb.append("     left join punto_venta pv on pv.puntoventa_id = c.puntoventa_id ");
		sb.append("   ");
		sb.append(" where   ");
		sb.append("     trunc(fechorventa) between to_date('").append(sdf.format(fechaDesde)).append("','yyyy-MM-dd') and ").append(" to_date('").append(sdf.format(fechaHasta)).append("','yyyy-MM-dd')");
		sb.append("     and c.feccorte ").append(yaCerrado ? " is not null" : " is null ");
		sb.append("      ");
		sb.append(" order by c.fechorventa,c.usuario_id,c.caja_id asc ");

		return sb.toString();
	}

	@Override
	public String getSQLBuscarDatosCaja(Date fechaDesde, Date fechaHasta, Boolean sembilhetesPacote) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

		StringBuilder sb = new StringBuilder("");

		sb.append("     select                                                                                                                        ");
		sb.append("		                                                                                                                              ");
		sb.append("		 c.CAJA_ID as \"cajaId\",                                                                                                         ");
		sb.append("		 c.NUMASIENTO as \"numAsiento\",                                                                                                  ");
		sb.append("		 c.CATEGORIA_ID as \"categoriaId\",                                                                                               ");
		sb.append("		 c.NUMFOLIOSISTEMA as \"numFolioSistema\",                                                                                        ");
		sb.append("		 c.CLASESERVICIO_ID as \"claseServicioId\",                                                                                       ");
		sb.append("		 c.MARCA_ID as \"marcaId\",                                                                                                       ");
		sb.append("		 c.ORIGEN_ID as \"origenId\",                                                                                                     ");
		sb.append("		 c.DESTINO_ID as \"destinoId\",                                                                                                   ");
		sb.append("		 c.CORRIDA_ID as \"corridaId\",                                                                                                   ");
		sb.append("		 c.FECCORRIDA as \"fecCorrida\",                                                                                                  ");
		sb.append("		 c.NOMBPASAJERO as \"nombPasajero\",                                                                                              ");
		sb.append("		 c.PRECIOBASE as \"precioBase\",                                                                                                  ");
		sb.append("		 c.PRECIOPAGADO as \"precioPagado\",                                                                                              ");
		sb.append("		 c.TIPOVENTA_ID as \"tipoVentaId\",                                                                                               ");
		sb.append("		 c.NUMSERIEPREIMPRESA as \"numSeriePreimpresa\",                                                                                  ");
		sb.append("		 c.NUMFOLIOPREIMPRESO as \"numFolioPreImpreso\",                                                                                  ");
		sb.append("		 c.FECHORVIAJE as \"fecHorViaje\",                                                                                                ");
		sb.append("		 c.FECHORVENTA as \"fecHorVenta\",                                                                                                ");
		sb.append("		 c.PUNTOVENTA_ID as \"puntoVentaId\",                                                                                             ");
		sb.append("		 pv.numpuntoventa as \"numPuntoVenta\",                                                                                           ");
		sb.append("		 c.NUMKMVIAJE as \"numKmViaje\",                                                                                                  ");
		sb.append("		 c.NUMOPERACION as \"numOperacion\",                                                                                              ");
		sb.append("		 c.MOTIVOCANCELACION_ID as \"motivoCancelacionId\",                                                                               ");
		sb.append("		 c.EMPRESAPUNTOVENTA_ID as \"empresaPuntoVentaId\",                                                                               ");
		sb.append("		 c.EMPRESACORRIDA_ID as \"empresaCorridaId\",                                                                                     ");
		sb.append("		 c.TURNO_ID as \"turnoId\",                                                                                                       ");
		sb.append("		 c.IMPORTETAXAEMBARQUE as \"importeTaxaEmbarque\",                                                                                ");
		sb.append("		 c.IMPORTEPEDAGIO as \"importePedagio\",                                                                                          ");
		sb.append("		 c.IMPORTEOUTROS as \"importeOutros\",                                                                                            ");
		sb.append("		 c.IMPORTESEGURO as \"importeSeguro\",                                                                                            ");
		sb.append("		 co.ruta_id as \"rutaId\",                                                                                                        ");
		sb.append("		 c.usuario_id as \"usuarioId\",                                                                                                   ");
		sb.append("		 ct.numautorizacion as \"numAutorizacion\",                                                                                       ");
		sb.append("		 ct.tipotarjeta as \"tipotarjeta\", 																							  ");
		sb.append("		 ct.cantparcelas as \"cantparcelas\",                                                                                       	  ");
		sb.append("		 ct.numtarjeta as \"numtarjeta\",                                                                                       		  ");
		sb.append("		 ct.fecoperacion as \"fecoperacion\",                                                                                       	  ");
		sb.append("		 ct.nombtitular as \"nombtitular\",                                                                                       		  ");
		sb.append("		 fp.DESCPAGO as \"descPago\",                                                                                                 ");
		sb.append("		 fp.formapago_id as \"formaPagoId\",                                                                                          ");
		sb.append("		 cfp.importe as \"vlrFormaPago\",                                                                                             ");
		sb.append("		 ca.CVECATEGORIA as \"cveCategoria\",                                                                                         ");
		sb.append("		 mc.DESCMOTIVO as \"descMotivo\",                                                                                             ");
		sb.append("		 (case when cfp.formapago_id = 11 then cdp.numdocumento else null end) as \"ordenSevicio\",                                   ");
		sb.append("		 C.TRANSACAO_ID as \"transacaoId\", C.TRANSACAOORIGINAL_ID as \"transacaooriginalId\",										  ");
		sb.append("		 C.DESCNUMDOC as \"descnumdoc\", C.DESCNUMDOC2 as \"descnumdoc2\", C.DESCTIPODOC as \"desctipodoc\", 						  ");
		sb.append("		 C.DESCTIPODOC2 as \"desctipodoc2\", C.DESCTELEFONO as \"desctelefono\",                                                      ");
		sb.append("		 ocd.ocd_id as \"ocdId\", ocd.numoperacion as \"numoperacionOcd\",                                                        	  ");
		sb.append("		 cdp.notacreditovendapacote_id as \"notacreditovendapacoteId\",	                                                       	  	  ");
		sb.append("		 ct.descoperadoracartao as \"operadoracartao\",	                                                       	  	  				  ");
		sb.append("		 sec.cvesecretaria as \"cvesecretaria\",	                                                       	  	  				  	  ");
		sb.append("		 fp.tipo_pago as \"tipoPago\",	                                                       	  	  				  		  		  ");
		sb.append("		 NVL(c.INDENCARGOVENTA,0) as \"indEncargoVenta\",                                                   	  	  				  ");
		sb.append("		 con.cveconvenio as \"cveconvenio\",                                                   	  	  				  		  		  ");
		sb.append("		 con.descconvenio as \"descconvenio\",                                                  	  	  				  		  	  ");
		sb.append("		 sec.descsecretaria as \"descsecretaria\"                                          	  	  				  		  	  ");
		sb.append("	from                                                                                                                              ");
		sb.append("		     caja c                                                                                                                   ");
		sb.append("		     left join corrida co on co.corrida_id = c.corrida_id and co.feccorrida = c.feccorrida                                    ");
		sb.append("		     left join caja_formapago cfp on cfp.caja_id = c.caja_id                                                                  ");
		sb.append("		     left join caja_det_pago cdp on cdp.cajaformapago_id = cfp.cajaformapago_id                                               ");
		sb.append("		     left join caja_tarjeta ct on ct.cajadetpago_id = cdp.cajadetpago_id                                                      ");
		sb.append("		     left join punto_venta pv on pv.puntoventa_id = c.puntoventa_id                                                           ");
		sb.append("			 inner join forma_pago fp on fp.formapago_id = cfp.FORMAPAGO_ID                                                           ");
		sb.append("			 inner join categoria ca on ca.categoria_id = c.categoria_id                                                              ");
		sb.append("			 left join motivo_cancelacion mc on mc.motivocancelacion_id = c.motivocancelacion_id                                      ");
		sb.append("			 left join ocd ocd on ocd.ocd_id = cdp.ocd_id																			  ");
		sb.append("			 left join secretaria sec on sec.secretaria_id = cdp.opcional1															  ");
		sb.append("			 left join convenio_det cDet on cDet.conveniodet_id = c.conveniodet_id													  ");
		sb.append("			 left join convenio con on con.convenio_id = cDet.convenio_id													  	  ");
		sb.append("		                                                                                                                              ");
		sb.append("	where                                                                                                                             ");
		sb.append("     trunc(fechorventa) between to_date('").append(sdf.format(fechaDesde)).append("','yyyy-MM-dd') and ").append(" to_date('").append(sdf.format(fechaHasta)).append("','yyyy-MM-dd')");

		if (sembilhetesPacote != null && sembilhetesPacote) {
			sb.append("and fp.tipo_pago != ")
					.append(TipoFormapago.PACOTE.getValor())
					.append("and (c.motivocancelacion_id is null or c.motivocancelacion_id != ")
					.append(Constantes.MVO_CANCEL_VENDA_PACOTE.intValue())
					.append(" ) ");
		}

		sb.append("	order by c.fechorventa,c.usuario_id,c.caja_id asc                                                                                ");

		return sb.toString();
	}

	@Override
	public String getSQLBuscarUsuariosCajaCerrado(Date fecha, String cveusuario, String turnoid) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

		StringBuilder sb = new StringBuilder("");
		sb.append(" select  distinct ");
		sb.append("   ");
		sb.append(" u.usuario_id as \"usuarioId\",  ");
		sb.append(" u.cveusuario as \"cveusuario\",  ");
		sb.append(" c.PUNTOVENTA_ID as \"puntoVentaId\",  ");
		sb.append(" pv.numpuntoventa as \"numPuntoVenta\",  ");
		sb.append(" c.FECCORTE as \"fecCorte\",  ");
		sb.append(" c.TURNO_ID as \"turnoId\",  ");
		sb.append(" (select sum(importe) from conta_corrente_ptovta ccpv where ccpv.puntoventa_id = c.puntoventa_id and ccpv.usuario_id = c.usuario_id and ccpv.feccorte = c.feccorte and ccpv.turno_id = c.turno_id)  as \"importeTotal\"");
		sb.append("   ");
		sb.append(" from   ");
		sb.append("     caja c  ");
		sb.append("     left join usuario u on c.usuario_id = u.usuario_id  ");
		sb.append("     left join punto_venta pv on pv.puntoventa_id = c.puntoventa_id ");
		sb.append("   ");
		sb.append(" where   ");
		sb.append("     trunc(c.feccorte) = to_date('").append(sdf.format(fecha)).append("','yyyy-MM-dd')");

		if (!cveusuario.equals("*")) {
			sb.append("     and u.cveusuario like '" + cveusuario + "'");
		}

		if (!turnoid.equals("*")) {
			sb.append("     and c.turno_id in(" + turnoid + ")");
		} else {
			sb.append("     and c.turno_id is not null");
		}

		return sb.toString();
	}

	@Override
	public String getSQLBuscarCajaCerrado(Integer usuarioId, Date fecha, String turnoid) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

		StringBuilder sb = new StringBuilder("");
		sb.append(" select   ");
		sb.append(" c.CAJA_ID as \"cajaId\",  ");
		sb.append(" c.NUMFOLIOSISTEMA as \"numFolioSistema\",  ");
		sb.append(" ori.descparada as \"origen\",  ");
		sb.append(" des.descparada as \"destino\",  ");
		sb.append(" c.CORRIDA_ID as \"corridaId\",  ");
		sb.append(" (case when c.motivocancelacion_id is null then cfp.importe else cfp.importe * -1 end) as \"precioPagado\",  ");
		sb.append(" c.FECHORVENTA as \"fecHorVenta\",  ");
		sb.append(" (case when c.motivocancelacion_id is null then c.IMPORTETAXAEMBARQUE else c.IMPORTETAXAEMBARQUE * -1 end) as \"importeTaxaEmbarque\",  ");
		sb.append(" ru.descruta as \"ruta\",  ");
		sb.append(" nvl(ct.numautorizacion, c.numoperacion) as \"numAutorizacion\", ");
		sb.append(" (case when cfp.formapago_id = 11 then cdp.numdocumento else null end) as \"ordenSevicio\",  ");
		sb.append(" s.descsecretaria as \"secretaria\",  ");
		sb.append(" s.CVESECRETARIA  as \"cvesecretaria\",  ");
		sb.append(" (case when fp.formapago_id = " + RED_PAGO_FORMAPAGO_ID).append(" then '" + RED_PAGO_EMISSOR_TARJETA + "' else ct.tipotarjeta end) as \"emissorTarjeta\",  ");
		sb.append(" cat.DESCCATEGORIA as \"tipoPasaje\",  ");
		sb.append(" (case when fp.formapago_id = " + RED_PAGO_FORMAPAGO_ID).append(" then '" + RED_PAGO_FORMA_PAGO + "' else fp.cvepago end) as \"formaPago\"  ");
		sb.append(" from   ");
		sb.append("     caja c  ");
		sb.append("     left join caja_formapago cfp on cfp.caja_id = c.caja_id  ");
		sb.append("     left outer join forma_pago fp on fp.formapago_id = cfp.formapago_id  ");
		sb.append("     left join caja_det_pago cdp on cdp.cajaformapago_id = cfp.cajaformapago_id  ");
		sb.append("     left join caja_tarjeta ct on ct.cajadetpago_id = cdp.cajadetpago_id  ");
		sb.append("     left join categoria cat on cat.categoria_id = c.categoria_id  ");
		sb.append("     left join secretaria s on s.secretaria_id = cdp.opcional1  ");
		sb.append("     left join ruta ru on ru.ruta_id = c.ruta_id  ");
		sb.append("     left join parada ori on ori.parada_id = c.origen_id  ");
		sb.append("     left join parada des on des.parada_id = c.destino_id  ");
		sb.append(" where   ");
		sb.append("     trunc(c.feccorte) = to_date('").append(sdf.format(fecha)).append("','yyyy-MM-dd')");
		sb.append("     and c.usuario_id = ").append(usuarioId);
		if (!turnoid.equals("*")) {
			sb.append("     and c.turno_id in(" + turnoid + ")");
		} else {
			sb.append("     and c.turno_id is not null");
		}
		sb.append("     and c.indreimpresion = 0");
		sb.append("     order by c.CAJA_ID");

		return sb.toString();
	}

	@Override
	public String getSQLBuscarReceitasDespesasCaja(Integer usuarioId, Date fec) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		StringBuilder sb = new StringBuilder("");
		sb.append(" select   ");
		sb.append("   ");
		sb.append(" c.precio as \"precio\",  ");
		sb.append(" t.desctipoevento as \"tipoEvento\"  ");
		sb.append("   ");
		sb.append(" from   ");
		sb.append("     caja_diversos c  ");
		sb.append("     left join evento_extra e on c.eventoextra_id = e.eventoextra_id  ");
		sb.append("     left join tipo_evento_extra t on t.tipoeventoextra_id = e.tipoeventoextra_id  ");
		sb.append("   ");
		sb.append(" where   ");
		sb.append("     c.feccorte = to_date('").append(sdf.format(fec)).append("','yyyy-MM-dd')");
		sb.append("     and c.turno_id is not null and c.usuario_id = ").append(usuarioId);

		return sb.toString();
	}

	@Override
	public String getSQLBuscarUsuariosActivo() {
		StringBuilder sb = new StringBuilder("");

		sb.append(" select distinct");
		sb.append("   u.usuario_id as \"usuarioId\",");
		sb.append("   u.cveusuario as \"cveusuario\",");
		sb.append("   u.NOMBUSUARIO||' '||u.NOMBPATERNO||' '||u.NOMBMATERNO as \"nombusuario\"");
		sb.append(" from");
		sb.append("   usuario u");
		sb.append(" where");
		sb.append("   u.activo = 1");
		sb.append(" order by");
		sb.append("   u.usuario_id");

		return sb.toString();
	}

	@Override
	public String getSQLInserirCajaVendaEmbarcada() {
		StringBuilder sb = new StringBuilder();

		sb.append("insert into caja ");
		sb.append("(caja_id, numasiento, categoria_id,numfoliosistema,claseservicio_id, marca_id, origen_id, destino_id, corrida_id, feccorrida,nombpasajero, preciobase, ");
		sb.append("preciopagado,descuentoamparado, tipoventa_id, numseriepreimpresa, numfoliopreimpreso, fechorviaje, fechorventa, puntoventa_id,numkmviaje, numoperacion,");
		sb.append("indstatusoperacion,motivocancelacion_id, motivoreimpresion_id, cantpuntos, empresapuntoventa_id, empresacorrida_id, numreservacion, turno_id,");
		sb.append("indstatusboleto,indcancelacion, indreimpresion,indviajeredondo, feccorte, indextraviado, paridad, feccreacion, conveniodet_id, moneda_id, estacion_id,");
		sb.append("indreplica, usuarioautorizacion_id, tipoidentificacion_id, numidentificacion,clientefidelidad_id, opcional1, opcional2, opcional3, preciocargoextra,");
		sb.append("preciopricing, cajaoriginal_id, usuarioremoto_id, puntoventaremoto_id, numdocdescuento, canttransferencia,activo, fecmodif, usuario_id, nodo_id,");
		sb.append("porccategoria,importecategoria, cliente_id, pagorecaudacion_id, pagorecaudacion2_id, importetaxaembarque, importepedagio, importeoutros,");
		sb.append("importeseguro, indconexion, levante_id, ruta_id, serieimpfiscal, fecintegracion, ptovtaventa_id, indremotoinverso, fecnacimiento)");
		sb.append("values (");
		sb.append(":cajaId,:numAsiento,:categoriaId,null,:claseServicioId,:marcaId,:origemId,:destinoId,:corridaId,:fecCorrida,null,:precioBase,");
		sb.append(":precioPagado,null, :tipoVentaId, null, :numFolioPreimpresso, :fechorViaje, :fechorVenta, :puntoVentaId,null, :numOperacion,");
		sb.append("'F',null, null, null, :empresaPuntoVentaId, :empresaCorridaId, null, null,");
		sb.append("'V', 0, 0, 0, null, 0, null, :fecCreacion, null, null, :estacionId,");
		sb.append("0, null, null, null,null, null, null, null, null,");
		sb.append("null, null, null, null, null, null, 1, :fecModIf, :usuarioId, 1,");
		sb.append("null, null, null, null, null, :importeTaxaEmbarque, :importePedagio, :importeOutros,");
		sb.append(":importeSeguro, 0, null, :rutaId, :serieImpFiscal, null, null, 0, null)");

		return sb.toString();
	}

	@Override
	public String getSQLInserirCajaFormaPagoVendaEmbarcada() {
		StringBuilder sb = new StringBuilder();

		sb.append("insert into caja_formapago ");
		sb.append("(formapago_id, caja_id, importe, activo, fecmodif, usuario_id, indreplica, nodo_id, cajaformapago_id) values ");
		sb.append("(:formaPagoId, :cajaId, :importe, 1, :fecModIf, :usuarioId, null, 1, :cajaFormaPagoId)");

		return sb.toString();
	}

	@Override
	public String getSQLInserirBoletoVendaEmbarcada() {
		StringBuilder sb = new StringBuilder();

		sb.append("insert into boleto ");
		sb.append("(empresacorrida_id, destino_id, tipoventa_id, categoria_id,  motivoreimpresion_id, claseservicio_id, corrida_id, feccorrida, puntoventa_id,");
		sb.append("empresapuntoventa_id, turno_id, motivocancelacion_id, origen_id, marca_id, conveniodet_id, cliente_id, numasiento, numfoliosistema,");
		sb.append("nombpasajero,fecnacimiento,preciopagado,paridad, numseriepreimpresa, numfoliopreimpreso, fechorviaje, fechorventa, numkmviaje,  numoperacion,");
		sb.append("indstatusoperacion, cantpuntos, numreservacion, indstatusboleto, indcancelacion, indreimpresion, indviajeredondo, feccreacion, activo,");
		sb.append("indconexion, fecmodif, usuario_id, usuarioautorizacion_id, tipoidentificacion_id, numidentificacion, indextraviado, preciobase, entregaboleto_id,");
		sb.append("opcional1,opcional2, opcional3, descuentoamparado, moneda_id, estacion_id, usuarioremoto_id, puntoventaremoto_id, preciocargoextra, nodo_id,");
		sb.append("indreplica, numdocdescuento, canttransferencia, porccategoria, preciopricing, importecategoria, boletooriginal_id, importetaxaembarque,");
		sb.append("importepedagio, importeoutros, importeseguro, desctipodoc, desctipodoc2, descnumdoc, descnumdoc2, tipoidentificaciondoc_id, descorgaodoc,");
		sb.append("NUMFIDELIDAD, INFOPASAJERO, LEVANTE_ID, ESTADOFOLIO_ID, RUTA_ID, DESCCORREO, DESCTELEFONO, SERIEIMPFISCAL,NUMASIENTOVINCULADO, BOLETO_ID) values ");

		sb.append("(:empresaCorridaId, :destinoId, :tipoVentaId, :categoriaId, null, :claseServicioId, :corridaId, :fecCorrida, :puntoVentaId, ");
		sb.append(":empresaPuntoVentaId, null, null, :origemId, :marcaId, null, null, :numAsiento, null,");
		sb.append("null,null,:precioPagado,null,null, :numFolioPreimpresso, :fechorViaje, :fechorVenta, null, :numOperacion,");
		sb.append("'F', null, null, 'V', 0, 0, 0, null, 1,");
		sb.append("0, :fecModIf, :usuarioId,null, null, null, 0, :precioBase, null,");
		sb.append("null,null, null, null, null, :estacionId, null, null, null,1,");
		sb.append("0, null, null, null, :precioPricing, null, null, :importeTaxaEmbarque,");
		sb.append(":importePedagio, :importeOutros, :importeSeguro, null, null, null, null, null, null,");
		sb.append("null, null, null, null, :rutaId, null, null, :serieImpFiscal, null, :boletoId)");

		return sb.toString();
	}

	@Override
	public String getSQLInserirBoletoFormaPagoVendaEmbarcada() {
		StringBuilder sb = new StringBuilder();

		sb.append("insert into boleto_formapago ");
		sb.append("(formapago_id, boleto_id, importe, fecmodif, usuario_id, activo, indreplica, nodo_id, boletoformapago_id) values ");
		sb.append("(:formaPagoId, :boletoId, :importe, :fecModIf, :usuarioId, 1, 0, 1,:boletoFormaPagoId)");

		return sb.toString();
	}

	@Override
	public String getSQLObterSequenceBoletoFormaPago() {
		return "select boleto_formapago_seq.nextval from dual";
	}

	@Override
	public String getSQLObterSequenceCajaFormaPago() {
		return "select caja_formapago_seq.nextval from dual";
	}

	@Override
	public String getSQLObterSequenceBoleto() {
		return "select boleto_seq.nextval from dual";
	}

	@Override
	public String getSQLObterSequenceCaja() {
		return "select caja_seq.nextval from dual";
	}

	@Override
	public String getSQLObterSequenciaNumOperacion() {
		return "select numeoperacion_seq.nextval from dual";
	}

	@Override
	public String getSQLInserirTarifaEmbarcadaPelaTarifaOficial(final Integer vigenciaTarifaId, final Integer usuarioId, Empresa empresa, OrgaoConcedente orgao) {
		StringBuilder sb = new StringBuilder("");
		sb.append(" insert  ");
		sb.append(" into ");
		sb.append("     TARIFA_EMBARCADA ");
		sb.append("     ( TARIFAEMBARCADA_ID, PRECIO, PRECIOREDABIERTO, TRAMO_ID, ");
		sb.append("       MARCA_ID, CLASESERVICIO_ID, PRECIOORIGINAL, MONEDA_ID, ");
		sb.append("       VIGENCIATARIFA_ID, STATUSTARIFA, ACTIVO, FECMODIF,  ");
		sb.append("       USUARIO_ID, IMPORTETAXAEMBARQUE, IMPORTEPEDAGIO, IMPORTEOUTROS, ");
		sb.append("       IMPORTESEGURO, IMPORTETPP, ORGAOCONCEDENTE_ID, RUTA_ID, ORIGEN_ID, DESTINO_ID ) ");
		sb.append(" select ");
		sb.append("         TARIFA_EMBARCADA_SEQ.nextval, ");
		sb.append("         tao.PRECIO , ");
		sb.append("         tao.PRECIOREDABIERTO , ");
		sb.append("         tao.TRAMO_ID , ");
		sb.append("         tao.MARCA_ID , ");
		sb.append("         tao.CLASESERVICIO_ID , ");
		sb.append("         tao.PRECIOORIGINAL , ");
		sb.append("         tao.MONEDA_ID , ");
		sb.append("         v.VIGENCIATARIFA_ID , ");
		sb.append("         tao.STATUSTARIFA , ");
		sb.append("         tao.ACTIVO , ");
		sb.append("         current_timestamp , ");
		sb.append("         ").append(usuarioId).append(", ");
		sb.append("         tao.IMPORTETAXAEMBARQUE , ");
		sb.append("         tao.IMPORTEPEDAGIO , ");
		sb.append("         tao.IMPORTEOUTROS , ");
		sb.append("         tao.IMPORTESEGURO , ");
		sb.append("         tao.IMPORTETPP , ");
		sb.append("         tao.ORGAOCONCEDENTE_ID , ");
		sb.append("         tao.RUTA_ID , ");
		sb.append("         tao.ORIGEN_ID , ");
		sb.append("         tao.DESTINO_ID ");
		sb.append("     from ");
		sb.append("         TARIFA_OFICIAL tao, ");
		sb.append("         VIGENCIA_TARIFA v,   ");
		sb.append("         MARCA m   ");
		sb.append("     where ");
		sb.append("         m.MARCA_ID=tao.MARCA_ID  ");
		sb.append("         and tao.ACTIVO=1  ");
		sb.append("         and v.VIGENCIATARIFA_ID=").append(vigenciaTarifaId).append("  ");

		if (orgao != null) {
			sb.append("         and tao.ORGAOCONCEDENTE_ID=").append(orgao.getOrgaoConcedenteId()).append("  ");
		}
		if (empresa != null) {
			sb.append("         and m.EMPRESA_ID=").append(empresa.getEmpresaId()).append("  ");
		}

		sb.append("         and  not (exists (select ");
		sb.append("             tar.TARIFAEMBARCADA_ID  ");
		sb.append("         from ");
		sb.append("             TARIFA_EMBARCADA tar ");
		sb.append("         where ");
		sb.append("             tar.ACTIVO=1  ");
		sb.append("             and tar.TRAMO_ID=tao.TRAMO_ID  ");
		sb.append("             and tar.MARCA_ID=tao.MARCA_ID  ");
		sb.append("             and tar.CLASESERVICIO_ID=tao.CLASESERVICIO_ID  ");
		sb.append("             and tar.MONEDA_ID=tao.MONEDA_ID  ");
		sb.append("             and tar.ORGAOCONCEDENTE_ID=tao.ORGAOCONCEDENTE_ID  ");
		sb.append("             and tar.RUTA_ID=tao.RUTA_ID  ");
		sb.append("             and tar.VIGENCIATARIFA_ID=").append(vigenciaTarifaId).append("))");

		return sb.toString();
	}

	@Override
	public String getSQLSelecionarTarifaEmbarcadaPorTarifaOficalParaAtualizar(final Integer vigenciaTarifaId, Empresa empresa, OrgaoConcedente orgao) {
		StringBuilder sb = new StringBuilder("");

		sb.append("SELECT tao.IMPORTEPEDAGIO      AS \"taoimportepedagio\", ");
		sb.append("       tao.PRECIO              AS \"taoprecio\", ");
		sb.append("       tao.PRECIOORIGINAL      AS \"taopreciooriginal\", ");
		sb.append("       tao.IMPORTETAXAEMBARQUE AS \"taoimportetaxaembarque\", ");
		sb.append("       tao.IMPORTESEGURO       AS \"taoimporteseguro\", ");
		sb.append("       tao.IMPORTETPP          AS \"taoimportetpp\", ");
		sb.append("       tao.IMPORTEOUTROS       AS \"taoimporteoutros\", ");
		sb.append("       ta.TARIFAEMBARCADA_ID            AS \"tarifaId\" ");

		sb.append("FROM TARIFA_OFICIAL tao  ");
		sb.append("INNER JOIN TARIFA_EMBARCADA ta ON (tao.MARCA_ID   = ta.MARCA_ID ");
		sb.append("			    AND tao.CLASESERVICIO_ID   = ta.CLASESERVICIO_ID ");
		sb.append("				AND tao.TRAMO_ID           = ta.TRAMO_ID ");
		sb.append("				AND tao.MONEDA_ID          = ta.MONEDA_ID ");
		sb.append("				AND tao.RUTA_ID            = ta.RUTA_ID ");
		sb.append("				AND tao.ORGAOCONCEDENTE_ID = ta.ORGAOCONCEDENTE_ID ");
		sb.append("						   )");
		sb.append("INNER JOIN MARCA mTa ON  tao.MARCA_ID   = mTa.MARCA_ID ");
		sb.append("INNER JOIN MARCA mTao ON ta.MARCA_ID    = mTao.MARCA_ID ");

		sb.append("WHERE ta.VIGENCIATARIFA_ID = ").append(vigenciaTarifaId);

		if (orgao != null) {
			sb.append(" AND tao.ORGAOCONCEDENTE_ID = ").append(orgao.getOrgaoConcedenteId());
		}
		if (empresa != null) {
			sb.append(" AND mTa.EMPRESA_ID = ").append(empresa.getEmpresaId());
			sb.append(" AND mTao.EMPRESA_ID = ").append(empresa.getEmpresaId());
		}

		return sb.toString();
	}

	@Override
	public String getSQLAtualizarTarifaEmbarcadaPorTarifaOfical(Map<String, Object> dados, Integer usuarioId, Boolean calculaPegagio,
			Boolean calculaTarifa, Boolean calculaTaxaEmbarque, Boolean calculaSeguro, Boolean calculaTPP) {

		StringBuilder sb = new StringBuilder("");
		sb.append("UPDATE TARIFA_EMBARCADA SET ");

		if (calculaPegagio) {
			sb.append("IMPORTEPEDAGIO=").append(dados.get("taoimportepedagio")).append(",");
		}
		if (calculaTarifa) {
			sb.append("PRECIO=").append(dados.get("taoprecio")).append(",PRECIOORIGINAL=").append(dados.get("taopreciooriginal")).append(",");
		}
		if (calculaTaxaEmbarque) {
			sb.append("IMPORTETAXAEMBARQUE=").append(dados.get("taoimportetaxaembarque")).append(",");
		}
		if (calculaSeguro) {
			sb.append("IMPORTESEGURO=").append(dados.get("taoimporteseguro")).append(",");
		}
		if (calculaTPP) {
			sb.append("IMPORTETPP=").append(dados.get("taoimportetpp")).append(",");
		}
		sb.append("IMPORTEOUTROS=").append(dados.get("taoimporteoutros")).append(",");
		sb.append("FECMODIF= current_timestamp, USUARIO_ID=").append(usuarioId);
		sb.append(" WHERE TARIFAEMBARCADA_ID = ").append(dados.get("tarifaId"));

		return sb.toString();
	}

	@Override
	public String getSqlRemoverDuplicidadeNaTarifaOficial() {
		// TODO Auto-generated method stub
		StringBuilder sb = new StringBuilder("DELETE FROM tarifa_oficial ");
		sb.append("WHERE ROWID IN ( ");
		sb.append("SELECT rid FROM( ");
		sb.append("SELECT ROWID rid, ROW_NUMBER() ");
		sb.append("OVER(PARTITION BY orgaoconcedente_id, ruta_id, tramo_id, claseservicio_id, marca_id ORDER BY ROWID) rn ");
		sb.append("FROM tarifa_oficial) ");
		sb.append("WHERE rn <> 1 )");
		
		return sb.toString();
	}
	
	
	
}