/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package mx.edu.um.mateo.colportor.service.impl;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.NavigableMap;
import mx.edu.um.mateo.colportor.dao.ColportorDao;
import mx.edu.um.mateo.colportor.dao.DocumentoDao;
import mx.edu.um.mateo.colportor.dao.InformeMensualDao;
import mx.edu.um.mateo.colportor.dao.InformeMensualDetalleDao;
import mx.edu.um.mateo.colportor.dao.TemporadaColportorDao;
import mx.edu.um.mateo.colportor.model.Colportor;
import mx.edu.um.mateo.colportor.model.Documento;
import mx.edu.um.mateo.colportor.model.InformeMensual;
import mx.edu.um.mateo.colportor.model.InformeMensualDetalle;
import mx.edu.um.mateo.colportor.service.ImportarDatosManager;
import mx.edu.um.mateo.general.model.Usuario;
import mx.edu.um.mateo.general.service.BaseManager;
import mx.edu.um.mateo.general.utils.Constantes;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* @author osoto
*/
@Service
public class ImportarDatosManagerImpl extends BaseManager implements ImportarDatosManager{
@Autowired
private TemporadaColportorDao tmpClpDao;
@Autowired
private ColportorDao clpDao;
@Autowired
private DocumentoDao docDao;
@Autowired
private InformeMensualDao infDao;
@Autowired
private InformeMensualDetalleDao infDetDao;
public void importaInformeDeGema(File file, Usuario user) throws NullPointerException, IOException, Exception{
log.debug("importaInformeDeGema");
try{
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(file));
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row;
XSSFCell cell;
int rows; // No of rows
rows = sheet.getPhysicalNumberOfRows();
//log.debug("Rows "+rows);
int cols = 0; // No of columns
int tmp = 0;
//This trick ensures that we get the data properly even if it doesn't start from first few rows
for (int i = 0; i < 10 || i < rows; i++) {
row = sheet.getRow(i);
if (row != null) {
tmp = sheet.getRow(i).getPhysicalNumberOfCells();
if (tmp > cols) {
cols = tmp;
}
}
}
//log.debug("Cols "+cols);
String clave = null;
String nombre = null;
BigDecimal boletin = null;
BigDecimal boDcto = BigDecimal.ZERO;
BigDecimal boNeto = BigDecimal.ZERO;
BigDecimal premio = BigDecimal.ZERO;
BigDecimal prDcto = BigDecimal.ZERO;
BigDecimal prNeto = BigDecimal.ZERO;
BigDecimal otros = BigDecimal.ZERO;
BigDecimal otDcto = BigDecimal.ZERO;
BigDecimal otNeto = BigDecimal.ZERO;
BigDecimal total = BigDecimal.ZERO;
BigDecimal ttDcto = BigDecimal.ZERO;
BigDecimal ttNeto = BigDecimal.ZERO;
Documento doc = null;
Colportor clp = null;
Boolean sw = false;
//Obtener descripcion
row = sheet.getRow(0);
gcFecha.setTime(sdf.parse(row.getCell(0).getStringCellValue()));
log.debug("Fecha {}", gcFecha.getTime());
row = sheet.getRow(1);
String descripcion = row.getCell(0).getStringCellValue();
log.debug("Descripcion {}", descripcion);
rowLoop:
for (int r = 3; r < rows; r++) {
row = sheet.getRow(r);
if (row != null) {
sw =false; //Si no se leyo colportor alguno, entonces no se leen las demas celdas
for (int c = 0; c < cols; c++) {
cell = row.getCell(c);
if (cell != null) {
switch(c){
case 0:{
if(cell.getCellType() == 0){
log.debug("Numerico {}",cell.getNumericCellValue());
clave = String.valueOf(cell.getNumericCellValue()).split("\\.")[0];
}else{
log.debug("String {}",cell.getStringCellValue());
clave = cell.getStringCellValue();
}
log.debug("Clave clp {}", clave);
try{
Long.parseLong(clave);
}catch(NumberFormatException e){
//clave invalida
break rowLoop;
}
break;
}
case 1:{
log.debug("Nombre {}",cell.getStringCellValue());
break;
}
case 2:{
try {
log.debug("boletin {}",cell.getNumericCellValue());
boletin = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
boletin = new BigDecimal("0");
}
break;
}
case 3:{
try {
log.debug("boDcto {}",cell.getNumericCellValue());
boDcto = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
boDcto = new BigDecimal("0");
}
break;
}
case 4:{
try {
log.debug("boNeto {}",cell.getNumericCellValue());
boNeto = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
boNeto = new BigDecimal("0");
}
break;
}
case 5:{
try {
log.debug("premio {}",cell.getNumericCellValue());
premio = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
premio = new BigDecimal("0");
}
break;
}
case 6:{
try {
log.debug("prDcto {}",cell.getNumericCellValue());
prDcto = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
prDcto = new BigDecimal("0");
}
break;
}
case 7:{
try {
log.debug("prNeto {}",cell.getNumericCellValue());
prNeto = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
prNeto = new BigDecimal("0");
}
break;
}
case 8:{
try {
log.debug("otros {}",cell.getNumericCellValue());
otros = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
otros = new BigDecimal("0");
}
break;
}
case 9:{
try {
log.debug("otDcto {}",cell.getNumericCellValue());
otDcto = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
otDcto = new BigDecimal("0");
}
break;
}
case 10:{
try {
log.debug("otNeto {}",cell.getNumericCellValue());
otNeto = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (Exception e) {
otNeto = new BigDecimal("0");
}
break;
}
} //switch end
}
} //Finalizo de leer todas las celdas de una fila
//Insertar boletin
doc = new Documento();
doc.setFecha(gcFecha.getTime());
doc.setFolio(clave);
doc.setImporte(boletin);
doc.setObservaciones(descripcion);
doc.setTipoDeDocumento("Boletin");
clp = clpDao.obtiene(clave);
log.debug("Obtuvo colportor {}", clp);
doc.setTemporadaColportor(tmpClpDao.obtiene(clp));
log.debug("Obtuvo temporadaClp {}", doc.getTemporadaColportor());
docDao.crea(doc);
}
}
} catch (IOException ioe) {
log.error("Error al intentar abrir el archivo");
throw ioe;
} catch (Exception e){
e.printStackTrace();
log.error("Error al intentar generar los registros de colportores");
throw e;
}
}
public void importaDiezmos(File file, Usuario user) throws NullPointerException, IOException, Exception{
log.debug("importaDiezmos");
try{
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(file));
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row;
XSSFCell cell;
int rows; // No of rows
rows = sheet.getPhysicalNumberOfRows();
//log.debug("Rows "+rows);
int cols = 0; // No of columns
int tmp = 0;
//This trick ensures that we get the data properly even if it doesn't start from first few rows
for (int i = 0; i < 10 || i < rows; i++) {
row = sheet.getRow(i);
if (row != null) {
tmp = sheet.getRow(i).getPhysicalNumberOfCells();
if (tmp > cols) {
cols = tmp;
}
}
}
//log.debug("Cols "+cols);
String fecha = null;
String nombre = null;
String clave = null;
String folio = null;
BigDecimal diezmo = null;
Documento doc = null;
Colportor clp = null;
Boolean sw = false;
sdf = new SimpleDateFormat("dd-MMM-yy");
Map <String, Object> params = new HashMap<>();
params.put("empresa", user.getEmpresa().getId());
NavigableMap <String, Colportor> mapa = clpDao.obtieneMapColportores(params);
NavigableMap <String, Colportor> smapa = null;
rowLoop:
for (int r = 2; r < rows; r++) {
row = sheet.getRow(r);
if (row != null) {
sw =false; //Si no se leyo colportor alguno, entonces no se leen las demas celdas
for (int c = 0; c < cols; c++) {
cell = row.getCell(c);
if (cell != null) {
switch(c){
case 0:{
try {
gcFecha.setTime(sdf.parse(cell.getStringCellValue()));
} catch (ParseException parseException) {
continue rowLoop;
}
log.debug("fecha {}",gcFecha.getTime());
break;
}
case 1:{
log.debug("folio {}",cell.getStringCellValue());
folio = cell.getStringCellValue();
break;
}
case 7:{
try {
diezmo = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
} catch (IllegalStateException e) {
diezmo = new BigDecimal(String.valueOf(cell.getStringCellValue()));
}
log.debug("diezmo {}",diezmo);
break;
}
case 8:{
try{
clave = cell.getStringCellValue();
}catch(IllegalStateException e){
clave = String.valueOf(cell.getNumericCellValue()).split("\\.")[0];
}
log.debug("clave clp {}",clave);
clp = clpDao.obtiene(clave);
if(clp != null){
sw = true;
}
break;
}
} //switch end
}
} //Finalizo de leer todas las celdas de una fila
//Insertar boletin
if(sw){
doc = new Documento();
doc.setFecha(gcFecha.getTime());
doc.setFolio(folio);
doc.setImporte(diezmo);
doc.setObservaciones("");
doc.setTipoDeDocumento("Diezmo");
log.debug("Obtuvo colportor {}", clp);
doc.setTemporadaColportor(tmpClpDao.obtiene(clp));
log.debug("Obtuvo temporadaClp {}", doc.getTemporadaColportor());
docDao.crea(doc);
}
}
}
} catch (IOException ioe) {
log.error("Error al intentar abrir el archivo");
throw ioe;
} catch (Exception e){
e.printStackTrace();
log.error("Error al intentar generar los registros de colportores");
throw e;
}
}
public void importaInformes(File file, Usuario user) throws NullPointerException, IOException, Exception{
log.debug("importarInformes");
// try{
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(file));
XSSFSheet sheet = wb.getSheetAt(0);
XSSFRow row;
XSSFCell cell;
int rows; // No of rows
rows = sheet.getPhysicalNumberOfRows();
//log.debug("Rows "+rows);
int cols = 0; // No of columns
int tmp = 0;
//This trick ensures that we get the data properly even if it doesn't start from first few rows
for (int i = 0; i < 10 || i < rows; i++) {
row = sheet.getRow(i);
if (row != null) {
tmp = sheet.getRow(i).getPhysicalNumberOfCells();
if (tmp > cols) {
cols = tmp;
}
}
}
log.debug("Cols {}"+cols);
log.debug("Rows {}"+rows);
String clave = null;
String fecha = null;
String numLibros = null;
String descripcion = null;
BigDecimal compras = null;
BigDecimal boletin = null;
BigDecimal ventas = null;
BigDecimal pedidos = null;
Integer gratis = null;
Colportor clp = null;
Boolean sw = false;
Boolean nuevo = false;
String tmpClave = "-";
String tmpMes = "-";
InformeMensual informe = null;
InformeMensualDetalle detalle = null;
sdf = new SimpleDateFormat("dd-MMM-yy");
Map <String, Object> params = new HashMap<>();
params.put("empresa", user.getEmpresa().getId());
NavigableMap <String, Colportor> mapa = clpDao.obtieneMapColportores(params);
NavigableMap <String, Colportor> smapa = null;
rowLoop:
for (int r = 3; r < rows; r++) {
row = sheet.getRow(r);
if (row != null) {
sw =false; //Si no se leyo colportor alguno, entonces no se leen las demas celdas
nuevo = false; //Para saber cuando crear un nuevo encabezado de informe
gratis = 0;
pedidos = BigDecimal.ZERO;
for (int c = 0; c < cols; c++) {
cell = row.getCell(c);
if (cell != null) {
switch(c){
case 0:{
try{
clave = cell.getStringCellValue();
}catch(IllegalStateException e){
clave = String.valueOf(cell.getNumericCellValue()).split("\\.")[0];
}
log.debug("clave clp {}",clave);
clp = clpDao.obtiene(clave);
if(clp != null){
sw = true;
}
if(!tmpClave.equals(clave)){
tmpClave = clave;
}
break;
}
case 4:{
try{
gcFecha.setTime(cell.getDateCellValue());
log.debug("Se asigno la fecha {}", gcFecha.getTime());
}catch(Exception e){
log.debug("Leyendo Fecha {}", String.valueOf(cell.getNumericCellValue()));
try{
fecha = String.valueOf(cell.getNumericCellValue());
fecha = fecha.split("\\.")[0]; //Quitamos el .0
gcFecha.setTime(sdf.parse(fecha));
}catch(Exception ex){
log.debug("Fecha {}",cell.getStringCellValue());
fecha = cell.getStringCellValue();
gcFecha.setTime(sdf.parse(fecha));
}
}
break;
}
case 6:{
log.debug("Descripcion {}",cell.getStringCellValue());
descripcion = cell.getStringCellValue();
break;
}
case 8:{
try{
log.debug("Libros {}",cell.getStringCellValue());
numLibros = cell.getStringCellValue();
}catch(Exception e){
log.debug("Leyendo libros {}", String.valueOf(cell.getNumericCellValue()));
numLibros = String.valueOf(cell.getNumericCellValue());
numLibros = numLibros.split("\\.")[0]; //Quitamos el .0
}
if(Integer.parseInt(numLibros) < 0){
numLibros = String.valueOf(Integer.parseInt(numLibros) * -1);
}
break;
}
case 9:{
try{
log.debug("compras {}",cell.getStringCellValue());
compras = new BigDecimal(cell.getStringCellValue());
}catch(Exception e){
log.debug("Leyendo compras {}", String.valueOf(cell.getNumericCellValue()));
compras = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
}
if(compras.compareTo(BigDecimal.ZERO) == 0){
gratis += Integer.parseInt(numLibros);
}
compras = compras.abs();
break;
}
case 11:{
try{
log.debug("boletin {}",cell.getStringCellValue());
boletin = new BigDecimal(cell.getStringCellValue());
}catch(Exception e){
log.debug("Leyendo boletin {}", String.valueOf(cell.getNumericCellValue()));
boletin = new BigDecimal(String.valueOf(cell.getNumericCellValue()));
}
ventas = boletin.multiply(BigDecimal.valueOf(2.0)); //Las ventas son el doble del boletin
ventas = ventas.abs();
//Si es una revista y tiene un costo,
if(descripcion.startsWith("REVISTA") && ventas.compareTo(BigDecimal.ZERO) > 0){
//entonces se acumula en pedidos
pedidos = pedidos.add(ventas);
}
break;
}
} //switch end
}
} //Finalizo de leer todas las celdas de una fila
//Insertar boletin
if(sw){
//Si boletin vale 0, y precio es mayor que 0, no tomamos en cuenta este libro
if(boletin.compareTo(BigDecimal.ZERO) == 0 && compras.compareTo(BigDecimal.ZERO) > 0){
continue; //No hacemos nada
}
//Obtener el informe
informe = infDao.obtiene(clp,gcFecha.getTime());
if(informe != null){
detalle = new InformeMensualDetalle();
detalle.setInformeMensual(informe);
detalle.setFecha(gcFecha.getTime());
detalle.setLiteraturaVendida(Integer.parseInt(numLibros)-gratis);
detalle.setTotalPedidos(pedidos);
detalle.setTotalVentas(ventas);
detalle.setLiteraturaGratis((gratis != null)?gratis:0);
detalle.setCapturo(user);
detalle.setFechaCaptura(new Date());
infDetDao.crear(detalle);
}
else {
informe = new InformeMensual();
informe.setColportor(clp);
informe.setFecha(null);
informe.setCapturo(user);
informe.setFechaCaptura(new Date());
informe.setFecha(gcFecha.getTime());
informe.setStatus(Constantes.STATUS_ACTIVO);
infDao.crea(informe);
detalle = new InformeMensualDetalle();
detalle.setInformeMensual(informe);
detalle.setFecha(gcFecha.getTime());
detalle.setLiteraturaVendida(Integer.parseInt(numLibros)-gratis);
detalle.setTotalPedidos(pedidos);
detalle.setTotalVentas(ventas);
detalle.setLiteraturaGratis((gratis != null)?gratis:0);
detalle.setCapturo(user);
detalle.setFechaCaptura(new Date());
infDetDao.crear(detalle);
}
}
}
}
// } catch (IOException ioe) {
// log.error("Error al intentar abrir el archivo");
// throw ioe;
// } catch (Exception e){
// e.printStackTrace();
// log.error("Error al intentar generar los registros de colportores");
// throw e;
// }
}
}