/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package mx.edu.um.mateo.colportor.dao.hibernate;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import mx.edu.um.mateo.colportor.dao.*;
import java.util.*;
import mx.edu.um.mateo.colportor.model.InformeMensual;
import mx.edu.um.mateo.colportor.model.InformeMensualDetalle;
import mx.edu.um.mateo.general.dao.BaseDao;
import mx.edu.um.mateo.general.utils.Constantes;
import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.exception.ConstraintViolationException;
import org.hibernate.type.StandardBasicTypes;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author osoto
*/
@Repository
@Transactional
public class InformeMensualDetalleDaoHibernate extends BaseDao implements InformeMensualDetalleDao {
public Map<String, Object> lista(Map<String, Object> params) {
log.debug("Buscando lista de informeMensualDetalle con params {}", params);
if (params == null) {
params = new HashMap<>();
}
log.debug("paginado {}", params.containsKey(Constantes.CONTAINSKEY_MAX));
if (!params.containsKey(Constantes.CONTAINSKEY_MAX)) {
params.put(Constantes.CONTAINSKEY_MAX, 10);
} else {
params.put(Constantes.CONTAINSKEY_MAX, Math.min((Integer) params.get(Constantes.CONTAINSKEY_MAX), 100));
}
if (params.containsKey(Constantes.CONTAINSKEY_PAGINA)) {
Long pagina = (Long) params.get(Constantes.CONTAINSKEY_PAGINA);
Long offset = (pagina - 1) * (Integer) params.get(Constantes.CONTAINSKEY_MAX);
params.put(Constantes.CONTAINSKEY_OFFSET, offset.intValue());
}
if (!params.containsKey(Constantes.CONTAINSKEY_OFFSET)) {
params.put(Constantes.CONTAINSKEY_OFFSET, 0);
}
Criteria criteria = currentSession().createCriteria(InformeMensualDetalle.class);
Criteria countCriteria = currentSession().createCriteria(InformeMensualDetalle.class);
if(params.get("informe") != null){
criteria.createCriteria("informeMensual")
.add(Restrictions.idEq(params.get("informe")));
countCriteria.createCriteria("informeMensual")
.add(Restrictions.idEq(params.get("informe")));
}
if (params.containsKey(Constantes.CONTAINSKEY_FILTRO)) {
String filtro = (String) params.get(Constantes.CONTAINSKEY_FILTRO);
filtro = "%" + filtro + "%";
Disjunction propiedades = Restrictions.disjunction();
//propiedades.add(Restrictions.ilike("tipoDeInformeMensual", filtro));
//propiedades.add(Restrictions.ilike("folio", filtro));
criteria.add(propiedades);
countCriteria.add(propiedades);
}
if (params.containsKey(Constantes.CONTAINSKEY_ORDER)) {
String campo = (String) params.get(Constantes.CONTAINSKEY_ORDER);
if (params.get(Constantes.CONTAINSKEY_SORT).equals(Constantes.CONTAINSKEY_DESC)) {
criteria.addOrder(Order.desc(campo));
} else {
criteria.addOrder(Order.asc(campo));
}
}
params.put(Constantes.INFORMEMENSUAL_DETALLE_LIST, criteria.list());
//Es necesario completar en este listado el mes completo
List <InformeMensualDetalle> infs = (List<InformeMensualDetalle>)params.get(Constantes.INFORMEMENSUAL_DETALLE_LIST);
Calendar gcFecha = new GregorianCalendar(TimeZone.getTimeZone("America/Monterrey"), Locale.US);
if(infs.size() > 0){
gcFecha.setTime(infs.get(0).getFecha());
Map <Date, InformeMensualDetalle> informes = new TreeMap <>();
//Llenar el map con todos los dias del mes
Calendar tmpCalendar = new GregorianCalendar(TimeZone.getTimeZone("America/Monterrey"), Locale.US);
Boolean inicioSemana = false;
Integer diaSemana = 0;
InformeMensualDetalle tmp = null;
for(int i = gcFecha.getActualMinimum(Calendar.DATE); i <= gcFecha.getActualMaximum(Calendar.DATE ); i++){
gcFecha.set(Calendar.DATE, i);
//Si no se ha evaluado el inicio de semana
if(!inicioSemana){
tmpCalendar.setTime(gcFecha.getTime());
diaSemana = tmpCalendar.get(Calendar.DAY_OF_WEEK);
log.debug("Dia de la semana {}", diaSemana);
for(int j = 1; j < diaSemana; j++){
tmpCalendar.add(Calendar.DAY_OF_WEEK, j *-1);
log.debug("Fecha previa {}", tmpCalendar.getTime());
tmp = new InformeMensualDetalle();
if(tmpCalendar.get(Calendar.MONTH) != gcFecha.get(Calendar.MONTH)){
tmp.setInformeMensual(new InformeMensual("@@@"));//para identificar este tipo de registros
}
tmp.setFecha(tmpCalendar.getTime());
informes.put(tmp.getFecha(), tmp);
tmpCalendar.setTime(gcFecha.getTime()); //Asignar la fecha original
}
inicioSemana = true;
}
tmp = new InformeMensualDetalle();
tmp.setFecha(gcFecha.getTime());
informes.put(tmp.getFecha(), tmp);
}
log.debug("Fecha inicial {}",gcFecha.getActualMinimum(Calendar.DATE));
log.debug("Fecha final {}",gcFecha.getActualMaximum(Calendar.DATE));
//recorrer el listado y guardarlo en el map
tmp = null;
for(InformeMensualDetalle imd : infs){
gcFecha.setTime(imd.getFecha());
tmp = informes.get(gcFecha.getTime());
tmp.setBautizados(tmp.getBautizados() + imd.getBautizados());
tmp.setCasasVisitadas(tmp.getCasasVisitadas() + imd.getCasasVisitadas());
tmp.setContactosEstudiosBiblicos(tmp.getContactosEstudiosBiblicos() + imd.getContactosEstudiosBiblicos());
try {
tmp.setDiezmo(tmp.getDiezmo().add(imd.getDiezmo()));
} catch (NullPointerException e) {
;
}
tmp.setHrsTrabajadas(tmp.getHrsTrabajadas()+imd.getHrsTrabajadas());
tmp.setLiteraturaGratis(tmp.getLiteraturaGratis() + imd.getLiteraturaGratis());
tmp.setLiteraturaVendida(tmp.getLiteraturaVendida() + imd.getLiteraturaVendida());
tmp.setOracionesOfrecidas(tmp.getOracionesOfrecidas() + imd.getOracionesOfrecidas());
tmp.setTotalPedidos(tmp.getTotalPedidos().add(imd.getTotalPedidos()));
tmp.setTotalVentas(tmp.getTotalVentas().add(imd.getTotalVentas()));
tmp.setFecha(imd.getFecha());
tmp.setCapturo(imd.getCapturo());
tmp.setFechaCaptura(imd.getFechaCaptura());
tmp.setId(imd.getId());
tmp.setInformeMensual(imd.getInformeMensual());
tmp.setVersion(imd.getVersion());
}
params.put(Constantes.INFORMEMENSUAL_DETALLE_LIST, new ArrayList(informes.values()));
}
//Quitamos paginado de esta opcion para que se muestre el mes completo en el jsp
params.put(Constantes.CONTAINSKEY_CANTIDAD, 0L);
return params;
}
public InformeMensualDetalle obtiene(Long id) {
log.debug("Obtiene informeMensualDetalle con id = {}", id);
InformeMensualDetalle detalle = (InformeMensualDetalle) currentSession().get(InformeMensualDetalle.class, id);
return detalle;
}
public InformeMensualDetalle crea(InformeMensualDetalle detalle) {
log.debug("Creando informeMensualDetalle : {}", detalle);
try{
currentSession().saveOrUpdate(detalle);
}catch(Exception e){
currentSession().merge(detalle);
currentSession().flush();
}
log.debug("Creando informeMensualDetalle : {}", detalle);
return detalle;
}
public InformeMensualDetalle crear(InformeMensualDetalle detalle) throws ConstraintViolationException {
log.debug("Creando informeMensualDetalle : {}", detalle);
currentSession().save(detalle);
return detalle;
}
public String elimina(Long id){
log.debug("Eliminando informeMensualDetalle con id {}", id);
InformeMensualDetalle detalle = obtiene(id);
Date fecha = detalle.getFecha();
currentSession().delete(detalle);
currentSession().flush();
SimpleDateFormat sdf = new SimpleDateFormat ("MMM", local);
return "Detalle del mes "+sdf.format(fecha);
}
/**
* @see mx.edu.um.mateo.colportor.dao.InformeMensualDetalleDao#listaInformes(java.lang.Long)
*/
public Map<String, Object> listaInformes(Map<String, Object> params){
StringBuilder query = new StringBuilder();
query.append("select im.colportor_id, coalesce(sum(horas_trabajadas),0) as horasTrabajadas, coalesce(sum(total_pedidos),0.0) as pedidos, coalesce(sum(libros_ventas),0.0) as ventas, ");
query.append("coalesce(sum(literatura_gratis),0) as literaturaGratis, coalesce(sum(oraciones_ofrecidas),0) as oraciones, coalesce(sum(casas_visitadas),0) as casasVisitadas, ");
query.append("coalesce(sum(estudios_biblicos),0) as estudiosBiblicos, coalesce(sum(bautizados),0) as bautizados, coalesce(sum(diezmo),0.0) as diezmos, ");
query.append("coalesce(sum(libros_vendidos),0) as librosVendidos ");
query.append("from ");
query.append("( ");
query.append("select * ");
query.append("from informe_mensual_detalle ");
query.append(") imd, ");
query.append("( ");
query.append("select * ");
query.append("from informe_mensual ");
query.append("where mes_informe between :fechaInicio and :fechaFinal ");
query.append(") im ");
query.append("where imd.informemensual_id = im.id ");
query.append("and im.colportor_id in ");
query.append("( ");
query.append("select colportor_id ");
query.append("from temporada_colportor ");
query.append("where asociado_id = :asociadoId ");
query.append(") ");
query.append("group by im.colportor_id ");
SQLQuery sql = getSession().createSQLQuery(query.toString());
sql.setDate("fechaInicio", (Date)params.get("fechaInicio"));
sql.setDate("fechaFinal", (Date)params.get("fechaFinal"));
sql.setLong("asociadoId", (Long)params.get("asociado"));
sql.addScalar("colportor_id", StandardBasicTypes.LONG);
sql.addScalar("horasTrabajadas", StandardBasicTypes.DOUBLE);
sql.addScalar("pedidos", StandardBasicTypes.BIG_DECIMAL);
sql.addScalar("ventas", StandardBasicTypes.BIG_DECIMAL);
sql.addScalar("literaturaGratis", StandardBasicTypes.INTEGER);
sql.addScalar("oraciones", StandardBasicTypes.INTEGER);
sql.addScalar("casasVisitadas", StandardBasicTypes.INTEGER);
sql.addScalar("estudiosBiblicos", StandardBasicTypes.INTEGER);
sql.addScalar("bautizados", StandardBasicTypes.INTEGER);
sql.addScalar("diezmos", StandardBasicTypes.BIG_DECIMAL);
sql.addScalar("librosVendidos", StandardBasicTypes.INTEGER);
Object [] objs = null;
List <Object[]>lista = sql.list();
InformeMensualDetalle detalle = null;
List <InformeMensualDetalle> detalles = new ArrayList <> ();
Iterator <Object[]> it = lista.iterator();
while(it.hasNext()){
objs = it.next();
detalle = new InformeMensualDetalle();
detalle.setInformeMensual(new InformeMensual());
System.out.println(objs[0]);
detalle.getInformeMensual().getColportor().setId((Long)objs[0]);
System.out.println(objs[1]);
try{
detalle.setHrsTrabajadas((Double)objs[1]);
}catch(NullPointerException e){
detalle.setHrsTrabajadas(0.0);
}
System.out.println(objs[2]);
try{
detalle.setTotalPedidos((BigDecimal)objs[2]);
}catch(NullPointerException e){
detalle.setTotalPedidos(BigDecimal.ZERO);
}
System.out.println(objs[3]);
try{
detalle.setTotalVentas((BigDecimal)objs[3]);
}catch(NullPointerException e){
detalle.setTotalVentas(BigDecimal.ZERO);
}
System.out.println(objs[4]);
try{
detalle.setLiteraturaGratis((Integer)objs[4]);
}catch(NullPointerException e){
detalle.setLiteraturaGratis(0);
}
System.out.println(objs[5]);
try{
detalle.setOracionesOfrecidas((Integer)objs[5]);
}catch(NullPointerException e){
detalle.setOracionesOfrecidas(0);
}
System.out.println(objs[6]);
try{
detalle.setCasasVisitadas((Integer)objs[6]);
}catch(NullPointerException e){
detalle.setCasasVisitadas(0);
}
System.out.println(objs[7]);
try{
detalle.setContactosEstudiosBiblicos((Integer)objs[7]);
}catch(NullPointerException e){
detalle.setContactosEstudiosBiblicos(0);
}
System.out.println(objs[8]);
try{
detalle.setBautizados((Integer)objs[8]);
}catch(NullPointerException e){
detalle.setBautizados((Integer)objs[8]);
}
System.out.println(objs[9]);
try{
detalle.setDiezmo((BigDecimal)objs[9]);
}catch(NullPointerException e){
detalle.setDiezmo(BigDecimal.ZERO);
}
System.out.println(objs[10]);
try{
detalle.setLiteraturaVendida((Integer)objs[10]);
}catch(NullPointerException e){
detalle.setLiteraturaVendida(0);
}
detalles.add(detalle);
}
params.put(Constantes.INFORMEMENSUAL_DETALLE_LIST, detalles);
return params;
}
/**
* @see mx.edu.um.mateo.colportor.dao.InformeMensualDetalleDao#listaInformesConcentradoAsociadosAsociacion(java.lang.Long)
*/
public Map<String, Object> listaInformesConcentradoAsociadosAsociacion(Map<String, Object> params){
StringBuilder query = new StringBuilder();
query.append("select tc.asociado_id, coalesce(sum(horas_trabajadas),0) as horasTrabajadas, coalesce(sum(total_pedidos),0.0) as pedidos, coalesce(sum(libros_ventas),0.0) as ventas, ");
query.append("coalesce(sum(literatura_gratis),0) as literaturaGratis, coalesce(sum(oraciones_ofrecidas),0) as oraciones, coalesce(sum(casas_visitadas),0) as casasVisitadas, ");
query.append("coalesce(sum(estudios_biblicos),0) as estudiosBiblicos, coalesce(sum(bautizados),0) as bautizados, coalesce(sum(diezmo),0.0) as diezmos, ");
query.append("coalesce(sum(libros_vendidos),0) as librosVendidos ");
query.append("from ");
query.append("( ");
query.append("select * ");
query.append("from informe_mensual_detalle ");
query.append(") imd, ");
query.append("( ");
query.append("select * ");
query.append("from informe_mensual ");
query.append("where mes_informe between :fechaInicio and :fechaFinal ");
query.append(") im, ");
query.append("( ");
query.append("select asociado_id, colportor_id ");
query.append("from temporada_colportor ");
query.append("where asociado_id in ");
query.append("(select id from usuarios where empresa_id = :empresaId) ");
query.append(")tc ");
query.append("where imd.informemensual_id = im.id ");
query.append("and tc.colportor_id = im.colportor_id ");
query.append("group by tc.asociado_id ");
SQLQuery sql = getSession().createSQLQuery(query.toString());
sql.setDate("fechaInicio", (Date)params.get("fechaInicio"));
sql.setDate("fechaFinal", (Date)params.get("fechaFinal"));
sql.setLong("empresaId", (Long)params.get("empresa"));
sql.addScalar("asociado_id", StandardBasicTypes.LONG);
sql.addScalar("horasTrabajadas", StandardBasicTypes.DOUBLE);
sql.addScalar("pedidos", StandardBasicTypes.BIG_DECIMAL);
sql.addScalar("ventas", StandardBasicTypes.BIG_DECIMAL);
sql.addScalar("literaturaGratis", StandardBasicTypes.INTEGER);
sql.addScalar("oraciones", StandardBasicTypes.INTEGER);
sql.addScalar("casasVisitadas", StandardBasicTypes.INTEGER);
sql.addScalar("estudiosBiblicos", StandardBasicTypes.INTEGER);
sql.addScalar("bautizados", StandardBasicTypes.INTEGER);
sql.addScalar("diezmos", StandardBasicTypes.BIG_DECIMAL);
sql.addScalar("librosVendidos", StandardBasicTypes.INTEGER);
Object [] objs = null;
List <Object[]>lista = sql.list();
InformeMensualDetalle detalle = null;
List <InformeMensualDetalle> detalles = new ArrayList <> ();
Iterator <Object[]> it = lista.iterator();
while(it.hasNext()){
objs = it.next();
detalle = new InformeMensualDetalle();
detalle.setInformeMensual(new InformeMensual());
System.out.println(objs[0]);
detalle.getInformeMensual().getColportor().setId((Long)objs[0]);
System.out.println(objs[1]);
try{
detalle.setHrsTrabajadas((Double)objs[1]);
}catch(NullPointerException e){
detalle.setHrsTrabajadas(0.0);
}
System.out.println(objs[2]);
try{
detalle.setTotalPedidos((BigDecimal)objs[2]);
}catch(NullPointerException e){
detalle.setTotalPedidos(BigDecimal.ZERO);
}
System.out.println(objs[3]);
try{
detalle.setTotalVentas((BigDecimal)objs[3]);
}catch(NullPointerException e){
detalle.setTotalVentas(BigDecimal.ZERO);
}
System.out.println(objs[4]);
try{
detalle.setLiteraturaGratis((Integer)objs[4]);
}catch(NullPointerException e){
detalle.setLiteraturaGratis(0);
}
System.out.println(objs[5]);
try{
detalle.setOracionesOfrecidas((Integer)objs[5]);
}catch(NullPointerException e){
detalle.setOracionesOfrecidas(0);
}
System.out.println(objs[6]);
try{
detalle.setCasasVisitadas((Integer)objs[6]);
}catch(NullPointerException e){
detalle.setCasasVisitadas(0);
}
System.out.println(objs[7]);
try{
detalle.setContactosEstudiosBiblicos((Integer)objs[7]);
}catch(NullPointerException e){
detalle.setContactosEstudiosBiblicos(0);
}
System.out.println(objs[8]);
try{
detalle.setBautizados((Integer)objs[8]);
}catch(NullPointerException e){
detalle.setBautizados((Integer)objs[8]);
}
System.out.println(objs[9]);
try{
detalle.setDiezmo((BigDecimal)objs[9]);
}catch(NullPointerException e){
detalle.setDiezmo(BigDecimal.ZERO);
}
System.out.println(objs[10]);
try{
detalle.setLiteraturaVendida((Integer)objs[10]);
}catch(NullPointerException e){
detalle.setLiteraturaVendida(0);
}
detalles.add(detalle);
}
params.put(Constantes.INFORMEMENSUAL_DETALLE_LIST, detalles);
return params;
}
}