AdmMono/src/com/rjconsultores/ventaboletos/service/impl/FiscalServiceImpl.java

1000 lines
41 KiB
Java
Raw Blame History

package com.rjconsultores.ventaboletos.service.impl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.dao.FiscalDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida;
import com.rjconsultores.ventaboletos.service.FiscalService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.StringHelper;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.utilerias.UtileriasFiscal;
import com.rjconsultores.ventaboletos.utilerias.archivointegracion.ArchivoIntegracionNaoFiscal;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionFiscalReducaoZVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionFiscalVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionManualFiscalVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionNaoFiscalVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ItemFiscalVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.SituacaoTributaria;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.SubItens;
@Service("fiscalService")
public class FiscalServiceImpl implements FiscalService {
private static Logger log = Logger.getLogger(FiscalServiceImpl.class);
public static final String DATE_FORMAT_FISCAL = "yyyyMMdd";
public static final BigDecimal CEM = BigDecimal.valueOf(100);
public static final String QUEBRA_LINHA = "\r\n";
@Autowired
private FiscalDAO fiscalDAO;
@Override
@Transactional
public int gerarRegistroP2_F2(List<EsquemaCorrida> lsEsquemaCorrida, Date dataDe, Date dataAte) {
return fiscalDAO.gerarRegistroP2_F2(lsEsquemaCorrida, dataDe, dataAte);
}
@Override
public File importacionFiscalECFManual(Date inicio, Date fim, Empresa empresa) {
try {
String nomeArquivo = UsuarioLogado.getUsuarioLogado().getNombusuario() + "_" + Calendar.getInstance().getTime().getTime() + "_" + "fiscal";
File arquivo = File.createTempFile(nomeArquivo, ".tmp");
PrintWriter gravarArq = new PrintWriter(new OutputStreamWriter(new FileOutputStream(arquivo), Constantes.UTF_8));
Integer seq = 1;
String cnpjFilial = empresa.getCnpj();
String brancos371 = StringHelper.preencherStringEspacoEsquerda(null, 371);
String dataAgora = DateUtil.getStringDate(Calendar.getInstance().getTime(), DATE_FORMAT_FISCAL);
String sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String abertura = aberturaDeArquivo("0", dataAgora, cnpjFilial, brancos371, sequencial);
gravarArq.print(abertura + QUEBRA_LINHA);
Integer qtdDoc = 0;
Integer qtdItens = 0;
List<ImportacionManualFiscalVO> list = agruparItensFiscaisManual(fiscalDAO.buscaDatosFiscaisECFManual(inicio, fim, empresa.getEmpresaId()));
for (ImportacionManualFiscalVO imf : list) {
qtdDoc++;
String data = imf.getDataEmissao();
String coo = StringHelper.preencherZeroEsquerda(imf.getCoo(), 9);
String serie = StringHelper.preencherStringEspacoEsquerda(imf.getSerie(), 3);
String especie = StringHelper.preencherStringEspacoDireita("RMD", 5);
String codigoCliente = StringHelper.preencherStringEsquerda(null, 6, "9");
String filialCliente = StringHelper.preencherStringEsquerda(null, 2, "9");
String condicaoPagamento = StringHelper.preencherStringEsquerda(null, 3, "9");
BigDecimal valorTotal = UtileriasFiscal.arredondar(calculaValorTotalECFManual(imf));
String valorTotalDocumanto = UtileriasFiscal.formataZeroDecimal(valorTotal, 14);
String valorItens = UtileriasFiscal.formataZeroDecimal(valorTotal, 14);
BigDecimal valorICMS = imf.getIcms() == null ? BigDecimal.ZERO : UtileriasFiscal.arredondar(imf.getIcms());
String baseCalICMS = UtileriasFiscal.formataZeroDecimal(valorICMS, 14);
BigDecimal aliquotaCalc = imf.getIcms() == null ? BigDecimal.ZERO : UtileriasFiscal.arredondar(imf.getIcms().divide(CEM));
BigDecimal baseCalculo = UtileriasFiscal.arredondar(imf.getValorTotal());
BigDecimal valorImposto = UtileriasFiscal.arredondar(baseCalculo.multiply(aliquotaCalc.divide(CEM)));
String valorTotalICMS = UtileriasFiscal.formataZeroDecimal(valorImposto, 14);
String valorPIS = StringHelper.preencherZeroEsquerda(null, 14);
String valorCofins = StringHelper.preencherZeroEsquerda(null, 14);
String valorCSLL = StringHelper.preencherZeroEsquerda(null, 14);
String totalICMSIsento = StringHelper.preencherZeroEsquerda(null, 14);
String totalICMSNaotributado = StringHelper.preencherZeroEsquerda(null, 14);
String origenUf = StringHelper.preencherStringEspacoEsquerda(imf.getOrigenUf(), 2);
String origen = imf.getOrigenId().toString();
if (origen.length() > 2) {
origen = origen.substring(2);
origen = StringHelper.preencherStringEspacoEsquerda(origen, 5);
} else {
origen = StringHelper.preencherStringEspacoEsquerda(origen, 5);
}
String destinoUf = StringHelper.preencherStringEspacoEsquerda(imf.getDestinoUf(), 2);
String destino = imf.getDestinoId().toString();
if (destino.length() > 2) {
destino = destino.substring(2);
destino = StringHelper.preencherStringEspacoEsquerda(destino, 5);
} else {
destino = StringHelper.preencherStringEspacoEsquerda(destino, 5);
}
String subSerie = StringHelper.preencherStringEspacoEsquerda(imf.getSubSerie(), 2);
String aidf = StringHelper.preencherStringEspacoEsquerda(imf.getAidf(), 30);
String status = StringHelper.preencherStringEspacoEsquerda(imf.getStatus(), 1);
String brancos170 = StringHelper.preencherStringEspacoEsquerda(null, 170);
seq++;
sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String header = headerDocumentoFiscal("1", data, cnpjFilial, coo, serie, especie, codigoCliente,
filialCliente, condicaoPagamento, valorTotalDocumanto, valorItens, baseCalICMS, valorTotalICMS,
valorPIS, valorCofins, valorCSLL, totalICMSIsento, totalICMSNaotributado, origenUf, origen,
destinoUf, destino, subSerie,
aidf, status, brancos170, sequencial);
gravarArq.print(header + QUEBRA_LINHA);
for (String itemDoc : montarItensFiscaisManual(imf, imf.getSubItens(), seq)) {
qtdItens++;
gravarArq.print(itemDoc + QUEBRA_LINHA);
seq++;
}
}
seq++;
String qtdeDocGerados = StringHelper.preencherZeroEsquerda(qtdDoc.toString(), 6);
String qtdeItensDocGerados = StringHelper.preencherZeroEsquerda(qtdItens.toString(), 6);
String brancos381 = StringHelper.preencherStringEspacoEsquerda(null, 381);
sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String fechamento = fechamentoDeArquivo("3", qtdeDocGerados, qtdeItensDocGerados, brancos381, sequencial);
gravarArq.print(fechamento + QUEBRA_LINHA);
gravarArq.close();
return arquivo;
} catch (IOException e) {
log.error("", e);
} catch (SQLException e) {
log.error("", e);
}
return null;
}
private BigDecimal calculaValorTotalECFManual(ImportacionManualFiscalVO imf) {
BigDecimal valorTotal = BigDecimal.ZERO;
valorTotal = valorTotal.add(imf.getValorTotal());
valorTotal = valorTotal.add(imf.getImporteoutros() == null ? BigDecimal.ZERO : imf.getImporteoutros());
valorTotal = valorTotal.add(imf.getImportepedagio() == null ? BigDecimal.ZERO : imf.getImportepedagio());
valorTotal = valorTotal.add(imf.getImporteseguro() == null ? BigDecimal.ZERO : imf.getImporteseguro());
valorTotal = valorTotal.add(imf.getImportetaxaembarque() == null ? BigDecimal.ZERO : imf.getImportetaxaembarque());
return valorTotal;
}
private List<String> montarItensFiscaisManual(ImportacionManualFiscalVO imf, List<SubItens> itensFiscais, Integer seq) {
List<String> itensDocs = new ArrayList<String>();
Integer num = 0;
for (SubItens item : itensFiscais) {
num++;
String numItem = StringHelper.preencherZeroEsquerda(num.toString(), 3);
String cfop = null;
if (imf.getEstadoIdOrigen() != imf.getEstadoIdDestino()) {
cfop = StringHelper.preencherStringEspacoDireita("6357", 5);
} else {
cfop = StringHelper.preencherStringEspacoDireita("5357", 5);
}
String codigoTES = StringHelper.preencherStringEsquerda(null, 3, "9");
String prod = imf.getCodProduto() == null ? item.getCodProduto() : imf.getCodProduto();
String codProduto = StringHelper.preencherStringEspacoEsquerda(prod, 15);
String unidade = "UN";
String quantidade = "001";
BigDecimal valorItem = UtileriasFiscal.arredondar(item.getValor());
String valorUnitario = UtileriasFiscal.formataZeroDecimal(valorItem, 15);
String valorTotal = UtileriasFiscal.formataZeroDecimal(valorItem, 15);
String aliquotaItem = UtileriasFiscal.formataZeroDecimal(null, 7);
BigDecimal aliquotaCalc = UtileriasFiscal.arredondar(imf.getIcms() == null ? BigDecimal.ZERO : imf.getIcms().divide(CEM));
BigDecimal baseCalculo = UtileriasFiscal.arredondar(imf.getValorTotal() == null ? BigDecimal.ZERO : imf.getValorTotal());
BigDecimal valorImposto = UtileriasFiscal.arredondar(baseCalculo.multiply(aliquotaCalc.divide(CEM)));
String impostoItem = UtileriasFiscal.formataZeroDecimal(valorImposto, 15);
String totalICMSIsentoItem = StringHelper.preencherZeroEsquerda(null, 15);
String totalICMSNaotributadoItem = StringHelper.preencherZeroEsquerda(null, 15);
String aliquotaPIS = StringHelper.preencherZeroEsquerda(null, 7);
String valorPIS = StringHelper.preencherZeroEsquerda(null, 15);
String aliquotaCofins = StringHelper.preencherZeroEsquerda(null, 7);
String valorCofins = StringHelper.preencherZeroEsquerda(null, 15);
String aliquotaCSLL = StringHelper.preencherZeroEsquerda(null, 7);
String valorCSLL = StringHelper.preencherZeroEsquerda(null, 15);
String aliquotaISS = StringHelper.preencherZeroEsquerda(null, 7);
String valorISS = StringHelper.preencherZeroEsquerda(null, 15);
String numeroPDV = StringHelper.preencherStringEspacoDireita(imf.getNumpdv(), 10);
String numeroSeriePDV = StringHelper.preencherStringEspacoDireita(imf.getNumImpressora(), 20);
String modeloImpressora = StringHelper.preencherStringEspacoDireita(imf.getModeloImpressora(), 40);
String numCaixa = StringHelper.preencherStringEspacoDireita(imf.getNumCaixa(), 10);
String status = StringHelper.preencherStringEspacoEsquerda(imf.getStatus(), 1);
seq++;
String sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String brancos111 = StringHelper.preencherStringEspacoDireita(null, 111);
String itemDoc = itensDocumentoFiscal("2", numItem, cfop, codigoTES, codProduto,
unidade, quantidade, valorUnitario, valorTotal, aliquotaItem, impostoItem,
aliquotaPIS, valorPIS, aliquotaCofins, valorCofins, aliquotaCSLL, valorCSLL,
aliquotaISS, valorISS, totalICMSIsentoItem, totalICMSNaotributadoItem,
numeroPDV, numeroSeriePDV, modeloImpressora, numCaixa, status,
brancos111, sequencial);
itensDocs.add(itemDoc);
}
return itensDocs;
}
private List<ImportacionManualFiscalVO> agruparItensFiscaisManual(List<ImportacionManualFiscalVO> list) {
List<ImportacionManualFiscalVO> aux = new ArrayList<ImportacionManualFiscalVO>();
for (ImportacionManualFiscalVO imf : list) {
List<SubItens> itens = new ArrayList<SubItens>();
// if (imf.getImporteoutros() != null) {
// itens.add(new SubItens(imf.getImporteoutros(), "00000000000-OT"));
// }
if (imf.getImportepedagio() != null) {
itens.add(new SubItens(imf.getImportepedagio(), "00000000000-PE"));
}
if (imf.getImporteseguro() != null) {
itens.add(new SubItens(imf.getImporteseguro(), "00000000000-SE"));
}
if (imf.getImportetaxaembarque() != null) {
itens.add(new SubItens(imf.getImportetaxaembarque(), "00000000000-TX"));
}
if (imf.getValorItem() != null) {
itens.add(new SubItens(imf.getValorTotal(), "00000000000-TA"));
}
imf.setSubItens(itens);
aux.add(imf);
}
return aux;
}
public File importacionFiscalReducaoZ(Date inicio, Date fim, Empresa empresa) {
try {
String nomeArquivo = UsuarioLogado.getUsuarioLogado().getNombusuario() + "_" + Calendar.getInstance().getTime().getTime() + "_" + "fiscal";
File arquivo = File.createTempFile(nomeArquivo, ".tmp");
PrintWriter gravarArq = new PrintWriter(new OutputStreamWriter(new FileOutputStream(arquivo), Constantes.UTF_8));
Integer seq = 1;
String cnpjFilial = StringHelper.retornaSomenteNumeros(empresa.getCnpj() == null ? StringHelper.preencherStringEspacoEsquerda(null, 14) : empresa.getCnpj());
String brancos371 = StringHelper.preencherStringEspacoEsquerda(null, 371);
String dataAgora = DateUtil.getStringDate(Calendar.getInstance().getTime(), DATE_FORMAT_FISCAL);
String sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String abertura = aberturaDeArquivo("0", dataAgora, cnpjFilial, brancos371, sequencial);
gravarArq.print(abertura + QUEBRA_LINHA);
List<ImportacionFiscalReducaoZVO> list = agruparReducaoZ(fiscalDAO.buscaDatosFiscaisReducaoZ(inicio, fim, empresa.getEmpresaId()));
for (ImportacionFiscalReducaoZVO ifrZ : list) {
String dataMovimento = ifrZ.getDatamov();
String cnpj = StringHelper.retornaSomenteNumeros(ifrZ.getCnpj() == null ? StringHelper.preencherStringEspacoEsquerda(null, 14) : ifrZ.getCnpj());
String impAliquota = ifrZ.getAliquota() == null ? "" : ifrZ.getAliquota().substring(0, 2);
String numRelatorio = StringHelper.preencherZeroEsquerda(impAliquota, 6);
String numPDV = StringHelper.preencherStringEspacoEsquerda(ifrZ.getNumpdv(), 10);
String numSeriePDV = StringHelper.preencherStringEspacoEsquerda(ifrZ.getNumserie20(), 20);
String numReducaoZ = StringHelper.preencherStringEspacoEsquerda(ifrZ.getCrz(), 5);
String gtInicial = StringHelper.preencherZeroEsquerda(ifrZ.getGtInicial().toString(), 18);
String gtFinal = StringHelper.preencherZeroEsquerda(ifrZ.getGtFinal().toString(), 18);
String docFiscalInic = StringHelper.preencherStringEspacoEsquerda(ifrZ.getCooinicial(), 9);
String docFiscalFinal = StringHelper.preencherStringEspacoEsquerda(ifrZ.getCoofinal(), 9);
String valorCancel = StringHelper.preencherZeroEsquerda(null, 8);
String valorContabil = StringHelper.preencherZeroEsquerda(ifrZ.getVendabrutadiaria().toString(), 14);
String subtributaria = StringHelper.preencherZeroEsquerda(null, 14);
String descontos = StringHelper.preencherZeroEsquerda(null, 14);
String isento = StringHelper.preencherZeroEsquerda(null, 14);
String valorNaoTributado = ifrZ.getValorNaoTributado() == null ? "" : ifrZ.getValorNaoTributado().toString();
String naoTributado = StringHelper.preencherZeroEsquerda(valorNaoTributado, 14);
String aliquota = StringHelper.preencherZeroEsquerda(null, 14);
if (ifrZ.getAliquota().length() == 7 && ifrZ.getAliquota().substring(2, 3).equals(SituacaoTributaria.TRIBUTADO.getValue())) {
aliquota = ifrZ.getAliquota().substring(3, 7);
aliquota = StringHelper.preencherZeroEsquerda(aliquota, 14);
}
String aliquota2 = StringHelper.preencherZeroEsquerda(null, 14);
String aliquota3 = StringHelper.preencherZeroEsquerda(null, 14);
String aliquota4 = StringHelper.preencherZeroEsquerda(null, 14);
String coo = StringHelper.preencherStringEspacoEsquerda(ifrZ.getCoo(), 6);
String outrosRecebimentos = StringHelper.preencherZeroEsquerda(null, 14);
BigDecimal aliquotaCalc = BigDecimal.valueOf(Double.valueOf(aliquota) / CEM.doubleValue());
aliquotaCalc = UtileriasFiscal.arredondar(aliquotaCalc);
BigDecimal baseCalculo = UtileriasFiscal.arredondar(ifrZ.getImposto().divide(CEM));
baseCalculo = UtileriasFiscal.arredondar(baseCalculo);
BigDecimal valorImposto = baseCalculo.multiply(aliquotaCalc.divide(CEM));
valorImposto = UtileriasFiscal.arredondar(valorImposto);
String impostoDebitado = UtileriasFiscal.formataZeroDecimal(valorImposto, 13);
String dataReducaoZ = ifrZ.getDatareducao();
String horaReducaoZ = ifrZ.getHorareducao();
String valorDocFiscal = StringHelper.preencherZeroEsquerda(ifrZ.getImposto().toString(), 13);
String brancos82 = StringHelper.preencherStringEspacoEsquerda(null, 82);
seq++;
sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String redZ = reducaoZ("1", dataMovimento, cnpj, numRelatorio, numPDV, numSeriePDV, numReducaoZ,
gtInicial, gtFinal, docFiscalInic, docFiscalFinal, valorCancel, valorContabil, subtributaria,
descontos, isento, naoTributado, aliquota, aliquota2, aliquota3, aliquota4, coo, outrosRecebimentos,
impostoDebitado, dataReducaoZ, horaReducaoZ, valorDocFiscal, brancos82, sequencial);
gravarArq.print(redZ + QUEBRA_LINHA);
}
Integer qtdeDoc = seq - 1;
seq++;
String qtdeDocGerados = StringHelper.preencherZeroEsquerda(qtdeDoc.toString(), 6);
String brancos387 = StringHelper.preencherStringEspacoEsquerda(null, 387);
sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String fechamento = fechamentoDeArquivo("3", qtdeDocGerados, null, brancos387, sequencial);
gravarArq.print(fechamento + QUEBRA_LINHA);
gravarArq.close();
return arquivo;
} catch (IOException e) {
log.error("", e);
} catch (SQLException e) {
log.error("", e);
}
return null;
}
private List<ImportacionFiscalReducaoZVO> agruparReducaoZ(List<ImportacionFiscalReducaoZVO> list) {
List<ImportacionFiscalReducaoZVO> aux = new ArrayList<ImportacionFiscalReducaoZVO>();
BigDecimal valorNaoTributado = null;
for (ImportacionFiscalReducaoZVO ifr : list) {
if (ifr.getAliquota().equals(SituacaoTributaria.NAO_TRIBUTADO.getValue())) {
valorNaoTributado = ifr.getImposto();
} else {
ifr.setValorNaoTributado(valorNaoTributado);
aux.add(ifr);
}
}
return aux;
}
@Override
public File importacionFiscalECF(Date inicio, Date fim, Empresa empresa, Connection conn) {
try {
String nomeArquivo = UsuarioLogado.getUsuarioLogado().getNombusuario() + "_" + Calendar.getInstance().getTime().getTime() + "_" + "fiscal";
File arquivo = File.createTempFile(nomeArquivo, ".tmp");
PrintWriter gravarArq = new PrintWriter(new OutputStreamWriter(new FileOutputStream(arquivo), Constantes.UTF_8));
Integer seq = 1;
String cnpjFilial = empresa.getCnpj();
String brancos371 = StringHelper.preencherStringEspacoEsquerda(null, 371);
String dataAgora = DateUtil.getStringDate(Calendar.getInstance().getTime(), DATE_FORMAT_FISCAL);
String seqAbertura = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String abertura = aberturaDeArquivo("0", dataAgora, cnpjFilial, brancos371, seqAbertura);
gravarArq.print(abertura + QUEBRA_LINHA);
String sql = fiscalDAO.sqlFiscaisECF(inicio, fim, empresa.getEmpresaId());
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setFetchSize(100);
stmt.setString(1, DateUtil.getStringDate(inicio, DATE_FORMAT_FISCAL));
stmt.setString(2, DateUtil.getStringDate(fim, DATE_FORMAT_FISCAL));
if (empresa != null) {
stmt.setInt(3, empresa.getEmpresaId());
}
Integer qtdDoc = 0;
Integer qtdItens = 0;
List<ImportacionFiscalVO> list = new ArrayList<ImportacionFiscalVO>();
String header = null;
List<String> itensDocs = new ArrayList<String>();
ImportacionFiscalVO fiscal = null;
ResultSet rset = stmt.executeQuery();
while (rset.next()) {
ItemFiscalVO item = new ItemFiscalVO();
item.setNumImpressora(rset.getString("numImpressora"));
item.setCoo(rset.getString("coo"));
item.setBoletoId(rset.getLong("boletoId"));
item.setEmpresaId(rset.getInt("empresaId"));
item.setDataEmissao(rset.getString("dataEmissao"));
item.setCnpjCliente(rset.getString("cnpjCliente"));
item.setCnpjImpressora(rset.getString("cnpjImpressora"));
item.setOrigenId(rset.getInt("origenId"));
item.setOrigenUf(rset.getString("origenUf"));
item.setDestinoId(rset.getInt("destinoId"));
item.setDestinoUf(rset.getString("destinoUf"));
item.setNumpdv(rset.getString("numpdv"));
item.setValorTotal(rset.getBigDecimal("valorTotal"));
item.setNumItem(rset.getString("numItem"));
item.setCodProduto(rset.getString("codProduto"));
item.setRepTributado(rset.getString("repTributado"));
item.setTipoPassagem(rset.getString("tipoPassagem"));
item.setValorItem(rset.getBigDecimal("valorItem"));
item.setModeloImpressora(rset.getString("modeloImpressora"));
item.setNumCaixa(rset.getString("numCaixa"));
item.setStatus(rset.getString("status"));
// TODO: Estes atributos foram criados para corrigir o valorItem que esta sendo gravado errado na tabela FISCAL_R5
// estes dados sao extraidos da tabela FISCAL_ML2, que esta registrando corretamento o valor da tarifa paga
// e nao o valor do preco base da tarifa, como esta sendo feita na FISCAL_R5
item.setValorTarifa(rset.getBigDecimal("valorTarifa"));
item.setValorPedagio(rset.getBigDecimal("valorPedagio"));
item.setValorEmbarque(rset.getBigDecimal("valorEmbarque"));
ImportacionFiscalVO novoFiscal = item;
if (!novoFiscal.equals(fiscal) && fiscal != null) {
grabarHeaderItens(gravarArq, header, itensDocs);
header = null;
itensDocs = new ArrayList<String>();
fiscal = null;
}
boolean jaCadastrado = verificarItensFiscais(list, item);
if (!jaCadastrado) {
fiscal = item;
list.add(fiscal);
}
/*
* Header da importacion Fiscal ECF
*/
if (!jaCadastrado) {
qtdDoc++;
}
fiscal.getItensFiscais().add(item);
String data = fiscal.getDataEmissao();
String brancos202 = StringHelper.preencherStringEspacoEsquerda(null, 202);
String serie = item.getNumImpressora();
if (serie.length() >= 20) {
serie = serie.substring(17);
serie = StringHelper.preencherStringEspacoEsquerda(serie, 3);
} else {
serie = StringHelper.preencherStringEspacoEsquerda(null, 3);
}
String especie = StringHelper.preencherStringEspacoDireita("CF", 5);
String codigoCliente = StringHelper.preencherStringEsquerda(null, 6, "9");
String filialCliente = StringHelper.preencherStringEsquerda(null, 2, "9");
String condicaoPagamento = StringHelper.preencherStringEsquerda(null, 3, "9");
String valorPIS = StringHelper.preencherZeroEsquerda(null, 14);
String valorCofins = StringHelper.preencherZeroEsquerda(null, 14);
String valorCSLL = StringHelper.preencherZeroEsquerda(null, 14);
String coo = StringHelper.preencherStringEspacoDireita(fiscal.getCoo(), 9);
BigDecimal valorTotal = valorTotalItensECF(item);
String valorTotalDocumanto = StringHelper.preencherStringEspacoDireita(valorTotal.toString(), 14);
String valorItens = StringHelper.preencherStringEspacoDireita(valorTotal.toString(), 14);
HashMap<String, String> aliquotaBaseCalculo = getAliquotaBaseCalculo(fiscal);
String aliquota = aliquotaBaseCalculo.get("aliquota");
String imposto = aliquotaBaseCalculo.get("imposto");
String totalICMSIsento = aliquotaBaseCalculo.get("totalICMSIsento");
String totalICMSNaotributado = aliquotaBaseCalculo.get("totalICMSNaotributado");
String origenUf = StringHelper.preencherStringEspacoEsquerda(fiscal.getOrigenUf(), 2);
String origen = fiscal.getOrigenId().toString();
if (origen.length() > 2) {
origen = origen.substring(2);
origen = StringHelper.preencherStringEspacoEsquerda(origen, 5);
} else {
origen = StringHelper.preencherStringEspacoEsquerda(origen, 5);
}
String destinoUf = StringHelper.preencherStringEspacoEsquerda(fiscal.getDestinoUf(), 2);
String destino = fiscal.getDestinoId().toString();
if (destino.length() > 2) {
destino = destino.substring(2);
destino = StringHelper.preencherStringEspacoEsquerda(destino, 5);
} else {
destino = StringHelper.preencherStringEspacoEsquerda(destino, 5);
}
String status = StringHelper.preencherStringEspacoEsquerda(fiscal.getStatus(), 1);
String seqHeader = null;
if (!jaCadastrado) {
seq++;
seqHeader = StringHelper.preencherZeroEsquerda(Integer.valueOf(seq).toString(), 6);
} else {
seqHeader = StringHelper.preencherZeroEsquerda(Integer.valueOf(seq - itensDocs.size()).toString(), 6);
}
header = headerDocumentoFiscal("1", data, cnpjFilial, coo, serie, especie, codigoCliente,
filialCliente, condicaoPagamento, valorTotalDocumanto, valorItens, aliquota, imposto,
valorPIS, valorCofins, valorCSLL, totalICMSIsento, totalICMSNaotributado, origenUf, origen,
destinoUf, destino, null, null, status, brancos202, seqHeader);
/*
* Item da importacion Fiscal ECF
*/
String itemDoc = montarItensFiscais(item, seq);
itensDocs.add(itemDoc);
qtdItens++;
seq++;
}
grabarHeaderItens(gravarArq, header, itensDocs);
seq++;
String qtdeDocGerados = StringHelper.preencherZeroEsquerda(qtdDoc.toString(), 6);
String qtdeItensDocGerados = StringHelper.preencherZeroEsquerda(qtdItens.toString(), 6);
String brancos381 = StringHelper.preencherStringEspacoEsquerda(null, 381);
String seqFechamento = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String fechamento = fechamentoDeArquivo("3", qtdeDocGerados, qtdeItensDocGerados, brancos381, seqFechamento);
gravarArq.print(fechamento + QUEBRA_LINHA);
gravarArq.close();
if (!conn.isClosed())
conn.close();
return arquivo;
} catch (IOException e) {
log.error("", e);
} catch (SQLException e) {
log.error("", e);
}
return null;
}
private BigDecimal valorTotalItensECF(ItemFiscalVO item) {
BigDecimal valorTotal = item.getValorTotal() == null ? BigDecimal.ZERO : item.getValorTotal();
if (valorTotal.equals(BigDecimal.ZERO)) {
BigDecimal valorTarifa = item.getValorTarifa() == null ? BigDecimal.ZERO : item.getValorTarifa();
BigDecimal valorPedagio = item.getValorPedagio() == null ? BigDecimal.ZERO : item.getValorPedagio();
BigDecimal valorEmbarque = item.getValorEmbarque() == null ? BigDecimal.ZERO : item.getValorEmbarque();
valorTotal = valorTotal.add(valorTarifa).add(valorPedagio).add(valorEmbarque);
}
return valorTotal;
}
private void grabarHeaderItens(PrintWriter gravarArq, String header, List<String> itensDocs) {
gravarArq.print(header + QUEBRA_LINHA);
for (String doc : itensDocs) {
gravarArq.print(doc + QUEBRA_LINHA);
}
}
private String montarItensFiscais(ItemFiscalVO item, Integer seq) {
String tipoPassagem = null;
if (item.getRepTributado().length() == 7 && item.getRepTributado().substring(2, 3).equals(SituacaoTributaria.TRIBUTADO.getValue())) {
tipoPassagem = item.getTipoPassagem();
if (tipoPassagem == null)
tipoPassagem = "E";
} else {
tipoPassagem = "E";
}
String numItem = item.getNumItem();
String cfop = null;
if (tipoPassagem.equals("E")) {
cfop = StringHelper.preencherStringEspacoDireita("6357", 5);
} else if (tipoPassagem.equals("M")) {
cfop = StringHelper.preencherStringEspacoDireita("5357", 5);
}
String codigoTES = StringHelper.preencherStringEsquerda(null, 3, "9");
String codProduto = StringHelper.preencherStringEspacoEsquerda(item.getCodProduto(), 15);
String unidade = "UN";
String quantidade = "001";
// TODO: A forma de enviar o valor do item <20> baseada no codProduto, pelo fato da FISCAL_R5
// estar gravando os registros de tarifa errado
BigDecimal valorItem = item.getValorItem() == null ? BigDecimal.ZERO : item.getValorItem();
// VALIDA TARIFA
if (codProduto.indexOf("TA") >= 0) {
valorItem = item.getValorTarifa() == null ? valorItem : item.getValorTarifa();
// TAXA DE EMBARQUE
} else if (codProduto.indexOf("TX") >= 0) {
valorItem = item.getValorEmbarque() == null ? valorItem : item.getValorEmbarque();
// PEDAGIO
} else if (codProduto.indexOf("PE") >= 0) {
valorItem = item.getValorPedagio() == null ? valorItem : item.getValorPedagio();
}
String valorUnitario = StringHelper.preencherZeroEsquerda(valorItem.toString(), 15);
String valorTotal = StringHelper.preencherZeroEsquerda(valorItem.toString(), 15);
String aliquotaItem = StringHelper.preencherZeroEsquerda(null, 7);
String impostoItem = StringHelper.preencherZeroEsquerda(null, 15);
String totalICMSIsentoItem = StringHelper.preencherZeroEsquerda(null, 15);
String totalICMSNaotributadoItem = StringHelper.preencherZeroEsquerda(null, 15);
HashMap<String, BigDecimal> aliquotaItens = new HashMap<String, BigDecimal>(0);
// Verificando se <20> um produto tribut<75>vel. Formato: XXTYYYY (XX - Posicao / YYYY - Aliquota)
if (item.getRepTributado().length() == 7 && item.getRepTributado().substring(2, 3).equals(SituacaoTributaria.TRIBUTADO.getValue())) {
String key = tipoPassagem + item.getRepTributado().substring(3, 7);
if (!aliquotaItens.containsKey(key)) {
aliquotaItens.put(key, BigDecimal.ZERO);
}
BigDecimal soma = item.getValorItem().divide(BigDecimal.TEN.multiply(BigDecimal.TEN));
aliquotaItens.put(key, soma.add(aliquotaItens.get(key)));
} else if (item.getRepTributado().equals(SituacaoTributaria.NAO_TRIBUTADO.getValue())) {
BigDecimal soma = item.getValorItem();
totalICMSNaotributadoItem = StringHelper.preencherZeroEsquerda(soma.toString(), 15);
}
for (String key : aliquotaItens.keySet()) {
aliquotaItem = key.substring(1, 5);
BigDecimal aliquotaCalc = BigDecimal.valueOf(Double.valueOf(aliquotaItem) / CEM.doubleValue());
aliquotaCalc = UtileriasFiscal.arredondar(aliquotaCalc);
BigDecimal baseCalculo = aliquotaItens.get(key);
baseCalculo = UtileriasFiscal.arredondar(baseCalculo);
BigDecimal valorImposto = baseCalculo.multiply(aliquotaCalc.divide(CEM));
valorImposto = UtileriasFiscal.arredondar(valorImposto);
impostoItem = UtileriasFiscal.formataZeroDecimal(valorImposto, 15);
aliquotaItem = UtileriasFiscal.formataZeroDecimal(null, 7);
}
String aliquotaPIS = StringHelper.preencherZeroEsquerda(null, 7);
String valorPIS = StringHelper.preencherZeroEsquerda(null, 15);
String aliquotaCofins = StringHelper.preencherZeroEsquerda(null, 7);
String valorCofins = StringHelper.preencherZeroEsquerda(null, 15);
String aliquotaCSLL = StringHelper.preencherZeroEsquerda(null, 7);
String valorCSLL = StringHelper.preencherZeroEsquerda(null, 15);
String aliquotaISS = StringHelper.preencherZeroEsquerda(null, 7);
String valorISS = StringHelper.preencherZeroEsquerda(null, 15);
String numeroPDV = StringHelper.preencherStringEspacoDireita(item.getNumpdv(), 10);
String numeroSeriePDV = StringHelper.preencherStringEspacoDireita(item.getNumImpressora(), 20);
String modeloImpressora = StringHelper.preencherStringEspacoDireita(item.getModeloImpressora(), 40);
String numCaixa = StringHelper.preencherStringEspacoDireita(item.getNumCaixa(), 10);
String status = StringHelper.preencherStringEspacoEsquerda(item.getStatus(), 1);
seq++;
String sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
String brancos111 = StringHelper.preencherStringEspacoEsquerda(null, 111);
String itemDoc = itensDocumentoFiscal("2", numItem, cfop, codigoTES, codProduto,
unidade, quantidade, valorUnitario, valorTotal, aliquotaItem, impostoItem,
aliquotaPIS, valorPIS, aliquotaCofins, valorCofins, aliquotaCSLL, valorCSLL,
aliquotaISS, valorISS, totalICMSIsentoItem, totalICMSNaotributadoItem,
numeroPDV, numeroSeriePDV, modeloImpressora, numCaixa, status, brancos111, sequencial);
return itemDoc;
}
private boolean verificarItensFiscais(List<ImportacionFiscalVO> list, ImportacionFiscalVO novoItem) {
if (list.contains(novoItem)) {
return true;
} else {
return false;
}
}
// private HashMap<String, String> getAliquotaBaseCalculo(ItemFiscalVO item) {
private HashMap<String, String> getAliquotaBaseCalculo(ImportacionFiscalVO fiscal) {
HashMap<String, String> resp = new HashMap<String, String>();
String aliquota = null;
String imposto = null;
String totalICMSIsento = null;
String totalICMSNaotributado = null;
for (ItemFiscalVO item : fiscal.getItensFiscais()) {
HashMap<String, BigDecimal> aliquotaBaseCalculo = new HashMap<String, BigDecimal>(0);
// Verificando se <20> um produto tribut<75>vel. Formato: XXTYYYY (XX - Posicao / YYYY - Aliquota)
if (item.getRepTributado().length() == 7 && item.getRepTributado().substring(2, 3).equals(SituacaoTributaria.TRIBUTADO.getValue())) {
String tipoPassagem = item.getTipoPassagem();
if (tipoPassagem == null) {
tipoPassagem = "E";
}
String key = tipoPassagem + item.getRepTributado().substring(3, 7);
if (!aliquotaBaseCalculo.containsKey(key)) {
aliquotaBaseCalculo.put(key, BigDecimal.ZERO);
}
BigDecimal soma = item.getValorItem().divide(BigDecimal.TEN.multiply(BigDecimal.TEN));
aliquotaBaseCalculo.put(key, soma.add(aliquotaBaseCalculo.get(key)));
} else if (item.getRepTributado().equals(SituacaoTributaria.NAO_TRIBUTADO.getValue())) {
BigDecimal soma = item.getValorItem();
totalICMSNaotributado = soma.toString();
if (totalICMSNaotributado.length() < 14) {
totalICMSNaotributado = StringHelper.preencherZeroEsquerda(totalICMSNaotributado, 14);
}
}
for (String key : aliquotaBaseCalculo.keySet()) {
aliquota = key.substring(1, 5);
BigDecimal aliquotaCalc = BigDecimal.valueOf(Double.valueOf(aliquota) / CEM.doubleValue());
aliquotaCalc = UtileriasFiscal.arredondar(aliquotaCalc);
BigDecimal baseCalculo = aliquotaBaseCalculo.get(key);
baseCalculo = UtileriasFiscal.arredondar(baseCalculo);
BigDecimal valorImposto = baseCalculo.multiply(aliquotaCalc.divide(CEM));
valorImposto = UtileriasFiscal.arredondar(valorImposto);
imposto = UtileriasFiscal.formataZeroDecimal(valorImposto, 14);
aliquota = UtileriasFiscal.formataZeroDecimal(aliquotaCalc, 14);
}
}
if (StringUtils.isBlank(aliquota))
aliquota = StringHelper.preencherZeroEsquerda(null, 14);
if (StringUtils.isBlank(imposto))
imposto = StringHelper.preencherZeroEsquerda(null, 14);
if (StringUtils.isBlank(totalICMSIsento))
totalICMSIsento = StringHelper.preencherZeroEsquerda(null, 14);
if (StringUtils.isBlank(totalICMSNaotributado))
totalICMSNaotributado = StringHelper.preencherZeroEsquerda(null, 14);
resp.put("aliquota", aliquota);
resp.put("imposto", imposto);
resp.put("totalICMSIsento", totalICMSIsento);
resp.put("totalICMSNaotributado", totalICMSNaotributado);
return resp;
}
private String reducaoZ(String identificador, String dataMovimento, String cnpj, String numRelatorio, String numPDV,
String numSeriePDV, String numReducaoZ, String gtInicial, String gtFinal, String docFiscalInic,
String docFiscalFinal, String valorCancel, String valorContabil, String subtributaria, String descontos,
String isento, String naoTributado, String aliquota, String aliquota2, String aliquota3, String aliquota4,
String coo, String outrosRecebimentos, String impostoDebitado, String dataReducaoZ, String horaReducaoZ,
String valorDocFiscal, String brancos, String sequencial) {
StringBuilder reducaoZ = new StringBuilder();
reducaoZ.append(identificador);
reducaoZ.append(dataMovimento);
reducaoZ.append(cnpj);
reducaoZ.append(numRelatorio);
reducaoZ.append(numPDV);
reducaoZ.append(numSeriePDV);
reducaoZ.append(numReducaoZ);
reducaoZ.append(gtInicial);
reducaoZ.append(gtFinal);
reducaoZ.append(docFiscalInic);
reducaoZ.append(docFiscalFinal);
reducaoZ.append(valorCancel);
reducaoZ.append(valorContabil);
reducaoZ.append(subtributaria);
reducaoZ.append(descontos);
reducaoZ.append(isento);
reducaoZ.append(naoTributado);
reducaoZ.append(aliquota);
reducaoZ.append(aliquota2);
reducaoZ.append(aliquota3);
reducaoZ.append(aliquota4);
reducaoZ.append(coo);
reducaoZ.append(outrosRecebimentos);
reducaoZ.append(impostoDebitado);
reducaoZ.append(dataReducaoZ);
reducaoZ.append(horaReducaoZ);
reducaoZ.append(valorDocFiscal);
reducaoZ.append(brancos);
reducaoZ.append(sequencial);
return reducaoZ.toString();
}
private String aberturaDeArquivo(String identificador, String data, String cnpjFilial, String brancos372,
String sequencial) {
StringBuilder abertura = new StringBuilder();
abertura.append(identificador);
abertura.append(data);
abertura.append(cnpjFilial);
abertura.append(brancos372);
abertura.append(sequencial);
return abertura.toString();
}
private String headerDocumentoFiscal(String identificador, String data, String cnpjImpressora, String coo,
String serie, String especie, String codigoCliente, String filialCliente, String condicaoPagamento,
String valorTotalDocumanto, String valorItens, String aliquota, String imposto, String valorPIS,
String valorCofins, String valorCSLL, String totalICMSIsento, String totalICMSNaotributado, String origenUf,
String origen, String destinoUf, String destino, String subSerie, String aidf, String status,
String brancos, String sequencial) {
StringBuilder header = new StringBuilder();
header.append(identificador);
header.append(data);
header.append(cnpjImpressora);
header.append(coo);
header.append(serie);
header.append(especie);
header.append(codigoCliente);
header.append(filialCliente);
header.append(condicaoPagamento);
header.append(valorTotalDocumanto);
header.append(valorItens);
header.append(aliquota);
header.append(imposto);
header.append(valorPIS);
header.append(valorCofins);
header.append(valorCSLL);
header.append(totalICMSIsento);
header.append(totalICMSNaotributado);
header.append(origenUf);
header.append(origen);
header.append(destinoUf);
header.append(destino);
header.append(subSerie == null ? "" : subSerie);
header.append(aidf == null ? "" : aidf);
header.append(status);
header.append(brancos);
header.append(sequencial);
return header.toString();
}
private String itensDocumentoFiscal(String identificador, String numItem, String cfop, String codigoTES,
String codProduto, String unidade, String quantidade, String valorUnitario, String valorTotal,
String aliquotaItem, String impostoItem, String valorPIS, String aliquotaPIS, String aliquotaCofins,
String valorCofins, String aliquotaCSLL, String valorCSLL, String aliquotaISS, String valorISS,
String totalICMSIsentoItem, String totalICMSNaotributadoItem, String numeroPDV, String numeroSeriePDV,
String modeloImpressora, String numCaixa, String status, String brancos, String sequencial) {
StringBuilder item = new StringBuilder();
item.append(identificador);
item.append(numItem);
item.append(cfop);
item.append(codigoTES);
item.append(codProduto);
item.append(unidade);
item.append(quantidade);
item.append(valorUnitario);
item.append(valorTotal);
item.append(aliquotaItem);
item.append(impostoItem);
item.append(aliquotaPIS);
item.append(valorPIS);
item.append(aliquotaCofins);
item.append(valorCofins);
item.append(aliquotaCSLL);
item.append(valorCSLL);
item.append(aliquotaISS);
item.append(valorISS);
item.append(totalICMSIsentoItem);
item.append(totalICMSNaotributadoItem);
item.append(numeroPDV == null ? "" : numeroPDV);
item.append(numeroSeriePDV == null ? "" : numeroSeriePDV);
item.append(modeloImpressora);
item.append(numCaixa);
item.append(status);
item.append(brancos);
item.append(sequencial);
return item.toString();
}
private String fechamentoDeArquivo(String identificador, String qtdeDocGerados, String qtdeItensDocGerados,
String brancos, String sequencial) {
StringBuilder fechamento = new StringBuilder();
fechamento.append(identificador);
fechamento.append(qtdeDocGerados == null ? "" : qtdeDocGerados);
fechamento.append(qtdeItensDocGerados == null ? "" : qtdeItensDocGerados);
fechamento.append(brancos);
fechamento.append(sequencial);
return fechamento.toString();
}
@Override
public File importacionNaoFiscal(Date inicio, Date fim, Empresa empresa) {
try {
List<ImportacionNaoFiscalVO> importacionNaoFiscalVOs = fiscalDAO.buscaDatosNaoFiscais(inicio, fim, empresa.getEmpresaId());
return new ArchivoIntegracionNaoFiscal().gerarArquivo(empresa.getCnpj(), importacionNaoFiscalVOs);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
}