package gcom.gui.cobranca.spcserasa;
import gcom.cobranca.Negativador;
import gcom.cobranca.NegativadorMovimento;
import gcom.fachada.Fachada;
import gcom.faturamento.ControladorFaturamento;
import gcom.gui.ActionServletException;
import gcom.gui.GcomAction;
import gcom.seguranca.acesso.usuario.Usuario;
import gcom.spcserasa.FiltroNegativador;
import gcom.util.Util;
import gcom.util.filtro.ParametroSimples;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.jboss.logging.Logger;
public class RegistrarNegativadorMovimentoRetornoAction extends GcomAction {
private static Logger logger = Logger.getLogger(ControladorFaturamento.class);
@SuppressWarnings("unchecked")
public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
/*
* Passos do Processo
*
* 1 - Chama m�todo para Validar Arquivo
* 2 - Retorna Tela de Informa��es do Arquivo para o usu�rio
* 3 - Insere Processo Batch
* 4 - Chama Registrar Movimento Retorno
* 5 - Busca o Arquivo na pasta bin do servidor
* 6 - Chama Registrar Movimento Retorno e SubFluxos
*/
ActionForward retorno = actionMapping.findForward("registrarNegativadorMovimentoRetornoResumo");
HttpSession sessao = httpServletRequest.getSession(false);
Fachada fachada = Fachada.getInstancia();
Negativador negativador = null;
String numeroSequencialArquivo = "";
int contadorRegistro = 0;
try {
String nomeItem = "";
String idNegativador = null;
DiskFileUpload upload = new DiskFileUpload();
List itens = upload.parseRequest(httpServletRequest);
FileItem item = null;
StringBuilder stringBuilderTxt = new StringBuilder();
int quantidadeRegistros = 0;
for (int i = 0; i < itens.size(); i++) {
item = (FileItem) itens.get(i);
if (item.getFieldName().equals("idNegativador")) {
idNegativador = item.getString();
negativador = this.pesquisarNegativador(fachada, idNegativador);
}
if (!item.isFormField()) {
nomeItem = "REG_SPC_SERASA_" + Util.formatarDataAAAAMMDD(new Date());
if (idNegativador != null) {
quantidadeRegistros = this.escreverArquivo(negativador, nomeItem, item, stringBuilderTxt, quantidadeRegistros);
}
}
}
if (nomeItem.equals("")) {
throw new ActionServletException("atencao.arquivo_negativador_movimento_retorno_inexistente");
}
if (quantidadeRegistros != 0) {
Object[] retornoValidadacao = fachada.validarArquivoMovimentoRetorno(stringBuilderTxt, negativador);
NegativadorMovimento negativadorMovimento = (NegativadorMovimento) retornoValidadacao[1];
logger.info("Movimento de Retorno do Negativador: " + negativadorMovimento.getId());
Collection colecaoRegistrosLidos = (Collection) retornoValidadacao[0];
Iterator iteratorColecaoRegistroLidos = colecaoRegistrosLidos.iterator();
while (iteratorColecaoRegistroLidos.hasNext()) {
String registro = (String) iteratorColecaoRegistroLidos.next();
contadorRegistro = contadorRegistro + 1;
if (contadorRegistro == 1) {
if (Negativador.NEGATIVADOR_SPC.intValue() == negativador.getId().intValue()) {
numeroSequencialArquivo = registro.substring(18, 25);
} else if (Negativador.NEGATIVADOR_SERASA.intValue() == negativador.getId().intValue()) {
numeroSequencialArquivo = registro.substring(120, 125);
}
}
}
} else {
throw new ActionServletException("atencao.arquivo_sem_dados", null, nomeItem);
}
} catch (IOException ex) {
throw new ActionServletException("erro.importacao.nao_concluida");
} catch (NumberFormatException ex) {
throw new ActionServletException("erro.importacao.nao_concluida");
} catch (FileUploadException e) {
throw new ActionServletException("erro.sistema", e);
}
this.setarInformacoesRetorno(sessao, negativador, numeroSequencialArquivo, contadorRegistro);
Usuario usuario = this.getUsuarioLogado(httpServletRequest);
fachada.inserirProcessoRegistrarNegativadorMovimentoRetorno(usuario);
return retorno;
}
private int escreverArquivo(Negativador negativador, String nomeItem, FileItem item, StringBuilder stringBuilderTxt, int quantidadeRegistros)
throws IOException, FileNotFoundException {
InputStreamReader reader = new InputStreamReader(item.getInputStream());
BufferedReader buffer = new BufferedReader(reader);
File arquivo = new File(nomeItem);
FileOutputStream out = new FileOutputStream(arquivo);
PrintWriter writer = new PrintWriter(out);
boolean eof = false;
while (!eof) {
String linha = buffer.readLine();
if (linha != null) {
writer.println(linha);
}
this.verificarErroHeaderTrailler(negativador, linha);
if (linha != null && linha.length() > 0) {
stringBuilderTxt.append(linha);
stringBuilderTxt.append("\n");
quantidadeRegistros = quantidadeRegistros + 1;
} else {
break;
}
}
buffer.close();
reader.close();
item.getInputStream().close();
writer.flush();
writer.close();
return quantidadeRegistros;
}
private void setarInformacoesRetorno(HttpSession sessao, Negativador negativador, String numeroSequencialArquivo, int contadorRegistro) {
sessao.setAttribute("nomeNegativador", negativador.getCliente().getNome());
sessao.setAttribute("dataProcessamento", Util.formatarData(new Date()));
sessao.setAttribute("horaProcessamento", Util.formatarHoraSemData(new Date()));
sessao.setAttribute("numeroSequencialArquivo", numeroSequencialArquivo);
sessao.setAttribute("numeroRegistros", contadorRegistro);
}
private void verificarErroHeaderTrailler(Negativador negativador, String linha) {
if (negativador.getId().equals(Negativador.NEGATIVADOR_SPC)) {
if (linha != null && linha.length() >= 334
&& (linha.substring(0, 2).equals("00")
|| linha.substring(0, 2).equals("99"))) {
String codigoRetorno = linha.substring(324, 334);
if (codigoRetorno != null && !codigoRetorno.equals("0000000000")) {
throw new ActionServletException("atencao.header_trailler_com_erro");
}
}
} else if (negativador.getId().equals(Negativador.NEGATIVADOR_SERASA)) {
if (linha != null && linha.length() >= 593
&& (linha.substring(0, 1).equals("0")
|| linha.substring(0, 1).equals("9"))) {
String codigoRetorno = linha.substring(533, 593);
if (codigoRetorno != null && !codigoRetorno.trim().equals("")) {
throw new ActionServletException("atencao.header_trailler_com_erro");
}
}
}
}
private Negativador pesquisarNegativador(Fachada fachada, String idNegativador) {
Negativador negativador;
FiltroNegativador filtroNegativador = new FiltroNegativador();
filtroNegativador.adicionarParametro(new ParametroSimples(FiltroNegativador.ID, idNegativador));
filtroNegativador.adicionarCaminhoParaCarregamentoEntidade("cliente");
Collection colecaoNegativador = fachada.pesquisar(filtroNegativador, Negativador.class.getName());
negativador = (Negativador) Util.retonarObjetoDeColecao(colecaoNegativador);
return negativador;
}
}