com.taurus.compratae.appservice.impl.GeneracionArchivoConciliacionServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.taurus.compratae.appservice.impl.GeneracionArchivoConciliacionServiceImpl.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.taurus.compratae.appservice.impl;

import com.taurus.compratae.appservice.ArchivoService;
import com.taurus.compratae.appservice.GeneracionArchivoConciliacionService;
import com.taurus.compratae.appservice.catalogos.ParametroArchivoService;
import com.taurus.compratae.appservice.exception.ErrorTAEException;
import com.taurus.compratae.appservice.util.FormatoFecha;
import com.taurus.compratae.db.dto.Archivo;
import com.taurus.compratae.db.dto.ParametroArchivo;
import com.taurus.compratae.db.dto.Proveedor;
import com.taurus.compratae.db.dto.Transaccion;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Desarrollador java
 */
@Service("generacionArchivoConciliacionService")
@Transactional
public class GeneracionArchivoConciliacionServiceImpl implements GeneracionArchivoConciliacionService {

    static final String NOMBRE_ARCHIVO = "NOMBRE_ARCHIVO";//Nombre del parametro que contiene el nombre del archivo
    static final String INDICADOR_HEADER = "HEADER";//Nombre del parametro que contiene el inicio del header
    static final String INDICADOR_REG = "REGISTRO";//Nombre del parametro que contiene el inicio del header
    static final List<String> INDICADORES_REG = Arrays.asList("CONTADOR", "FECHA", "HORA", "AUTO", "TELEFONO",
            "PROVEEDOR", "MONTO", "TERMINAL_ID");
    static final String CONTADOR = "CONTADOR";
    static final String AUTORIZACION = "AUTO";
    static final String PROVEEDOR = "PROVEEDOR";
    static final String MONTO = "MONTO";
    static final String TERMINAL_ID = "TERMINAL_ID";
    static final String CADENA = "CADENA";
    static final String TIENDA = "TIENDA";
    static final String TERMINAL = "TERMINAL";
    static final String FOLIO = "FOLIO";
    static final String PATH = "PATH";
    static final String INDICADOR_FOOTER = "FOOTER";
    static final String NUM_REG = "NUM_REG";
    static final String TOTAL_VENTA = "TOTAL_VENTA";

    @Autowired
    private ArchivoService archivoService;
    @Autowired
    private ParametroArchivoService parametroArchivoService;

    @Override
    public void generarArchivo(Transaccion transaccion) throws ErrorTAEException {
        //Primero se debe validar que exista archivo para ese da
        //transaccion = transaccionDbService.buscarPorId(19);/////////////////////esto es para pruebas
        Date fecha = transaccion.getFecha();

        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
        String fechaFormtat = formatoDelTexto.format(fecha);

        Date fecha1 = null;

        try {
            fecha1 = formatoDelTexto.parse(fechaFormtat);
        } catch (ParseException ex) {
            //throw new ErrorTAEException(ex.getMessage());
        }

        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fecha1.getTime());
        cal.add(Calendar.MINUTE, 1439);
        Date fecha2 = new java.sql.Date(cal.getTimeInMillis());
        Archivo archivo = archivoService.buscarEntreFechas(fecha1, fecha2);

        //Si no existe, crear tanto registro en bd como el archivo en directorio y abrir el archivo
        if (archivo == null) {
            archivo = generarNuevo(fecha);//guardar nuevo registro en bd
            String cabecera = generarCabecera(archivo);
            guardarArchivo(archivo, cabecera, false);
        }
        //Generar String que contendr lnea a escribir en el archivo
        String linea = generarLineaRegistro(transaccion, archivo);
        //Ya existe (o exista), abrir archivo y escribir lnea
        guardarArchivo(archivo, linea, true);
        //Actualizar registro de archivo, con numRegistos++ y archivo.montoTotal += transaccion.getMonto (hacerlo bien)
        int numRegistros = archivo.getNumregistros();
        numRegistros++;
        archivo.setNumregistros(numRegistros);
        int monto = transaccion.getIdMonto().getMonto();
        int total = archivo.getTotal();
        int totalActualizado = total + monto;
        archivo.setTotal(totalActualizado);
        archivoService.guardarNuevoArchivo(archivo);
        transaccion.setIdArchivo(archivo);
    }

    /*
    Este mtodo genera un nuevo registro de archivo en la bd    
     */
    public Archivo generarNuevo(Date fecha) {
        Archivo nuevoArchivo = new Archivo();
        nuevoArchivo.setFecha(fecha);
        nuevoArchivo.setNumregistros(0);
        nuevoArchivo.setTotal(0);
        nuevoArchivo.setNombre(generarNombreArchivo(fecha));//Se genera el nombre que tendr el archivo
        return archivoService.guardarNuevoArchivo(nuevoArchivo);
    }

    /*
    Generamos el nombre que tendr el archivo
    */
    public String generarNombreArchivo(Date fecha) {
        String fechaParaNombre = FormatoFecha.formatearFechaArchivo(fecha);
        ParametroArchivo parametroArchivo = obtenerParametrosArchivo(PATH);
        //Aqu debera buscarse el path, para que se guarde en la tabla con todo y path 
        //y los dems mtodos que buscan el nombre no tengan que buscar tambin el path.
        StringBuilder sbNombre = new StringBuilder(parametroArchivo.getValor());
        parametroArchivo = obtenerParametrosArchivo(NOMBRE_ARCHIVO);
        return (sbNombre.append(parametroArchivo.getValor()).append(fechaParaNombre).append(".txt")).toString();//+ fechaParaNombre + ".txt"
    }

    /*
    Guardamos el archivo en disco
    */
    public void guardarArchivo(Archivo archivo, String linea, boolean append) {
        FileWriter fw = null;
        PrintWriter pw = null;
        try {
            ParametroArchivo pathParam = obtenerParametrosArchivo(PATH);
            String path = pathParam.getValor();
            File directorio = new File(path);
            if (!directorio.exists()) {
                directorio.mkdir();
            }
            String file = archivo.getNombre();
            File miArchivo = new File(file);

            fw = new FileWriter(file, append);//debo revisar la ruta en que se crea
            pw = new PrintWriter(fw);
            pw.println(linea);
        } catch (IOException ex) {
            Logger.getLogger(GeneracionArchivoConciliacionServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                fw.close();
            } catch (IOException ex) {
                Logger.getLogger(GeneracionArchivoConciliacionServiceImpl.class.getName()).log(Level.SEVERE, null,
                        ex);
            }
        }
    }

    /*
    Genera el String el cual contiene la cabecera del archivo
    */
    public String generarCabecera(Archivo archivo) {
        ParametroArchivo parametroArchivo = obtenerParametrosArchivo(INDICADOR_HEADER);
        String fechaHeader = FormatoFecha.formatearFechaArchivoHeader(archivo.getFecha());
        return parametroArchivo.getValor() + fechaHeader;
    }

    /*
    Genera un String que contiene una lnea de registro del archivo
    */
    public String generarLineaRegistro(Transaccion transaccion, Archivo archivo) {
        StringBuilder sb = new StringBuilder();
        ///////////Agregamos inicio de linea
        ParametroArchivo parArch = obtenerParametrosArchivo(INDICADOR_REG);
        sb.append(parArch.getValor());
        //Agregamos el resto de la linea, revisando si tienen que agregarse 0s o espacios
        //Contador
        parArch = obtenerParametrosArchivo(CONTADOR);
        int numReg = archivo.getNumregistros();
        numReg++;
        sb.append(validarRelleno(String.valueOf(numReg), parArch));
        ///Fecha y hora
        sb.append(FormatoFecha.formatearFechaArchivoRegistro(transaccion.getFecha()));
        ///Autorizacion
        parArch = obtenerParametrosArchivo(AUTORIZACION);
        sb.append(validarRelleno(transaccion.getAutorizacion(), parArch));
        //telefono
        sb.append(transaccion.getTelefono());
        //proveedor
        parArch = obtenerParametrosArchivo(PROVEEDOR);
        sb.append(validarRelleno(transaccion.getIdProveedor().getNombre(), parArch));
        //monto
        parArch = obtenerParametrosArchivo(MONTO);
        sb.append(validarRelleno(String.valueOf(transaccion.getIdMonto().getMonto()), parArch));
        //Terminal_ID (cadena, tienda, terminal, folio)
        parArch = obtenerParametrosArchivo(CADENA);
        sb.append(validarRelleno(transaccion.getIdCadena().getCodigo(), parArch));
        parArch = obtenerParametrosArchivo(TIENDA);
        sb.append(validarRelleno(transaccion.getIdTienda().getCodigo(), parArch));
        parArch = obtenerParametrosArchivo(TERMINAL);
        sb.append(validarRelleno(transaccion.getIdTerminal().getCodigo(), parArch));
        parArch = obtenerParametrosArchivo(FOLIO);
        sb.append(validarRelleno(transaccion.getIdFolio().getFolio(), parArch));

        return sb.toString();
    }

    /*
    Validamos si el campo a anexar requiere ser rellenada o completado
    */
    public String validarRelleno(String valor, ParametroArchivo parArch) {
        if (parArch.isRellenarconceros()) {
            return rellenarConCeros(parArch.getLongitudtotal(), valor, parArch.getDecimales());
        } else if (parArch.isRellenarconespacios()) {
            return rellenarConEspacios(parArch.getLongitudtotal(), valor);
        }
        return valor;
    }

    /*
    Mtodo que rellena con ceros a la izquierda y agrega decimales si es necesario
    */
    public String rellenarConCeros(int longitud, String valor, int decimales) {
        int size = valor.length();
        int totalCeros = longitud - size - decimales;//se saca el nmero de ceros a agregar a la izquierda
        StringBuilder ceros = new StringBuilder();

        for (int i = 0; i < totalCeros; i++) {
            ceros.append("0");
        }
        StringBuilder tmp = new StringBuilder();
        tmp.append(ceros).append(valor);
        for (int i = 0; i < decimales; i++) {
            tmp.append("0");
        }
        return tmp.toString();
    }

    /*
    Mtodo que rellena con espacios a la derecha
    */
    public String rellenarConEspacios(int longitud, String valor) {
        int size = valor.length();

        if (size > longitud) {
            valor = valor.substring(0, longitud);
            return valor;
        }
        int totalSpc = longitud - size;
        StringBuilder returnString = new StringBuilder(valor);

        for (int i = 0; i < totalSpc; i++) {
            returnString.append(" ");
        }
        return returnString.toString();
    }

    /*
    Obtiene un objeto de tipo ParametroArchivo de acuerdo al nombre
    */
    public ParametroArchivo obtenerParametrosArchivo(String parametro) {
        return parametroArchivoService.buscarPorNombre(parametro);
    }

    /*
    Genera el footer del archivo. Este mtodo se ejecuta con el job, justo antes
    de colocar el archivo en el FTP
    */
    @Override
    public Archivo generarFooter() {
        //obtener fecha actual
        Date fecha = new Date();

        SimpleDateFormat format = new SimpleDateFormat("HH");
        String horaS = format.format(fecha);
        int hora = Integer.valueOf(horaS);
        String fechaNombre;

        ////LA SIGUIENTE CONDICION DEPENDE DE LA HORA EN QUE SE CORRA EL JOB//
        if (hora >= 0 && hora <= 20) {
            //buscar el de ayer
            Calendar cal = new GregorianCalendar();
            cal.setTimeInMillis(fecha.getTime());
            cal.add(Calendar.DATE, -1);
            Date fecha2 = new java.sql.Date(cal.getTimeInMillis());
            format = new SimpleDateFormat("ddMMyyyy");
            fechaNombre = format.format(fecha2);
        } else {
            //buscar el de hoy
            format = new SimpleDateFormat("ddMMyyyy");
            fechaNombre = format.format(fecha);
        }
        //////////////Esto es de prueba, quitar!!!!!!//////////

        format = new SimpleDateFormat("ddMMyyyy");
        fechaNombre = format.format(fecha);

        /////////////////////////////////////////////////////////
        ParametroArchivo paramArchivoNombre = obtenerParametrosArchivo(PATH);
        StringBuilder sb = new StringBuilder(paramArchivoNombre.getValor());
        paramArchivoNombre = obtenerParametrosArchivo(NOMBRE_ARCHIVO);
        sb.append(paramArchivoNombre.getValor());
        String nombreArchivo = (sb.append(fechaNombre).append(".txt")).toString();
        Archivo archivo = archivoService.buscarPorNombre(nombreArchivo);
        if (archivo != null) {
            String footer = generarLineaFooter(archivo);
            guardarArchivo(archivo, footer, true);
        }
        return archivo;
    }

    /*
    Generar un String que contiene la lnea correspondiente al footer del archivo
    */
    public String generarLineaFooter(Archivo archivo) {
        ParametroArchivo parArch = obtenerParametrosArchivo(INDICADOR_FOOTER);
        StringBuilder sb = new StringBuilder(parArch.getValor());
        //---------------
        parArch = obtenerParametrosArchivo(NUM_REG);
        sb.append(validarRelleno(String.valueOf(archivo.getNumregistros()), parArch));
        //---------------
        parArch = obtenerParametrosArchivo(TOTAL_VENTA);
        sb.append(validarRelleno(String.valueOf(archivo.getTotal()), parArch));
        return sb.toString();
    }
}