diff --git a/src/com/rjconsultores/ventaboletos/dao/hibernate/FiscalHibernateDAO.java b/src/com/rjconsultores/ventaboletos/dao/hibernate/FiscalHibernateDAO.java index a54fa6e17..53248956f 100644 --- a/src/com/rjconsultores/ventaboletos/dao/hibernate/FiscalHibernateDAO.java +++ b/src/com/rjconsultores/ventaboletos/dao/hibernate/FiscalHibernateDAO.java @@ -29,6 +29,7 @@ import com.rjconsultores.ventaboletos.dao.FiscalDAO; import com.rjconsultores.ventaboletos.entidad.Aidf; import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida; import com.rjconsultores.ventaboletos.utilerias.DateUtil; +import com.rjconsultores.ventaboletos.utilerias.MoneyHelper; import com.rjconsultores.ventaboletos.utilerias.StringHelper; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; import com.rjconsultores.ventaboletos.utilerias.exportacaofiscal.vo.ExportacaoECFTipoCCF; @@ -50,7 +51,7 @@ import com.rjconsultores.ventaboletos.vo.impressaofiscal.SituacaoTributaria; @Repository("fiscalDAO") public class FiscalHibernateDAO extends HibernateDaoSupport implements FiscalDAO { - public static final String DATE_FORMAT_FISCAL = "yyyyMMdd"; + private static final String DATE_FORMAT_FISCAL = "yyyyMMdd"; private static Logger log = Logger.getLogger(FiscalHibernateDAO.class); @@ -1524,33 +1525,46 @@ public class FiscalHibernateDAO extends HibernateDaoSupport implements FiscalDAO Map group = new HashMap(); while (rs.next()) { - BigDecimal valorTotal = BigDecimal.valueOf(Double.valueOf(rs.getString("valortotal")) / 100); + BigDecimal valorTotal = MoneyHelper.dividir(MoneyHelper.instanciar(rs.getString("valortotal")), BigDecimal.valueOf(100d)); - BigDecimal red_base_calc_icms = rs.getBigDecimal("red_base_calc_icms"); - BigDecimal porc_red_municipal = rs.getBigDecimal("porc_red_municipal"); - BigDecimal porc_red_estadual = rs.getBigDecimal("porc_red_estadual"); - BigDecimal tributacao_importacao = rs.getBigDecimal("tributacao_importacao"); + BigDecimal red_base_calc_icms = MoneyHelper.instanciar(rs.getBigDecimal("red_base_calc_icms")); + BigDecimal porc_red_municipal = MoneyHelper.instanciar(rs.getBigDecimal("porc_red_municipal")); + BigDecimal porc_red_estadual = MoneyHelper.instanciar(rs.getBigDecimal("porc_red_estadual")); + BigDecimal tributacao_importacao = MoneyHelper.instanciar(rs.getBigDecimal("tributacao_importacao")); BigDecimal valorBaseCalculoICMS = BigDecimal.ZERO; if (red_base_calc_icms != null) { - valorBaseCalculoICMS = valorTotal.subtract(valorTotal.multiply(red_base_calc_icms.divide(BigDecimal.valueOf(100d)))); + BigDecimal aRed_base_calc_icms = MoneyHelper.dividir(red_base_calc_icms, BigDecimal.valueOf(100d)); + valorBaseCalculoICMS = MoneyHelper.subtrair(valorTotal, MoneyHelper.multiplicar(valorTotal, aRed_base_calc_icms)); } else { if (tributacao_importacao != null) { if (rs.getString("estado_origem").equals(rs.getString("estado_destino"))) { if (porc_red_municipal != null) { - BigDecimal porc = tributacao_importacao.subtract(tributacao_importacao.multiply(porc_red_municipal.divide(BigDecimal.valueOf(100d)))); - valorBaseCalculoICMS = valorTotal.multiply(porc.divide(BigDecimal.valueOf(100d))); + BigDecimal aPorc_red_municipal = MoneyHelper.dividir(porc_red_municipal, BigDecimal.valueOf(100d)); + BigDecimal porc = MoneyHelper.subtrair(tributacao_importacao, MoneyHelper.multiplicar(tributacao_importacao, aPorc_red_municipal)); + BigDecimal aPorc = MoneyHelper.dividir(porc, BigDecimal.valueOf(100d)); + + valorBaseCalculoICMS = MoneyHelper.multiplicar(valorTotal, aPorc); } } else { if (porc_red_estadual != null) { - BigDecimal porc = tributacao_importacao.subtract(tributacao_importacao.multiply(porc_red_estadual.divide(BigDecimal.valueOf(100d)))); - valorBaseCalculoICMS = valorTotal.multiply(porc.divide(BigDecimal.valueOf(100d))); + BigDecimal aPorc_red_estadual = MoneyHelper.dividir(porc_red_estadual, BigDecimal.valueOf(100d)); + BigDecimal porc = MoneyHelper.subtrair(tributacao_importacao, MoneyHelper.multiplicar(tributacao_importacao, aPorc_red_estadual)); + BigDecimal aPorc = MoneyHelper.dividir(porc, BigDecimal.valueOf(100d)); + + valorBaseCalculoICMS = MoneyHelper.multiplicar(valorTotal, aPorc); } } } } - BigDecimal valorICMSDebitado = (tributacao_importacao == null ? BigDecimal.ZERO : valorBaseCalculoICMS.multiply(tributacao_importacao.divide(BigDecimal.valueOf(100d)))); + BigDecimal valorICMSDebitado = BigDecimal.ZERO; + + if (tributacao_importacao != null) { + BigDecimal aTributacao_importacao = MoneyHelper.dividir(tributacao_importacao, BigDecimal.valueOf(100d)); + valorICMSDebitado = MoneyHelper.multiplicar(valorBaseCalculoICMS, aTributacao_importacao); + } + BigDecimal valorICMSIsento = valorTotal.subtract(valorBaseCalculoICMS); BigDecimal valorICMSOutros = BigDecimal.ZERO; @@ -1693,37 +1707,48 @@ public class FiscalHibernateDAO extends HibernateDaoSupport implements FiscalDAO Map group = new HashMap(); while (rs.next()) { - BigDecimal valorTotal = BigDecimal.valueOf(Double.valueOf(rs.getString("valortotal")) / 100); + BigDecimal valorTotal = MoneyHelper.dividir(MoneyHelper.instanciar(rs.getString("valortotal")), BigDecimal.valueOf(100d)); - BigDecimal red_base_calc_icms = rs.getBigDecimal("red_base_calc_icms"); - BigDecimal porc_red_municipal = rs.getBigDecimal("porc_red_municipal"); - BigDecimal porc_red_estadual = rs.getBigDecimal("porc_red_estadual"); - BigDecimal tributacao_importacao = rs.getBigDecimal("tributacao_importacao"); + BigDecimal red_base_calc_icms = MoneyHelper.instanciar(rs.getBigDecimal("red_base_calc_icms")); + BigDecimal porc_red_municipal = MoneyHelper.instanciar(rs.getBigDecimal("porc_red_municipal")); + BigDecimal porc_red_estadual = MoneyHelper.instanciar(rs.getBigDecimal("porc_red_estadual")); + BigDecimal tributacao_importacao = MoneyHelper.instanciar(rs.getBigDecimal("tributacao_importacao")); BigDecimal valorBaseCalculoICMS = BigDecimal.ZERO; if (tributacao_importacao != null) { - tributacao_importacao = tributacao_importacao.divide(BigDecimal.valueOf(100d)); + tributacao_importacao = MoneyHelper.dividir(tributacao_importacao, BigDecimal.valueOf(100d)); } if (red_base_calc_icms != null) { - valorBaseCalculoICMS = valorTotal.subtract(valorTotal.multiply(red_base_calc_icms.divide(BigDecimal.valueOf(100d)))); + BigDecimal aRed_base_calc_icms = MoneyHelper.dividir(red_base_calc_icms, BigDecimal.valueOf(100d)); + valorBaseCalculoICMS = MoneyHelper.subtrair(valorTotal, MoneyHelper.multiplicar(valorTotal, aRed_base_calc_icms)); } else { if (tributacao_importacao != null) { if (rs.getString("estado_origem").equals(rs.getString("estado_destino"))) { if (porc_red_municipal != null) { - BigDecimal porc = tributacao_importacao.subtract(tributacao_importacao.multiply(porc_red_municipal.divide(BigDecimal.valueOf(100d)))); - valorBaseCalculoICMS = valorTotal.multiply(porc.divide(BigDecimal.valueOf(100d))); + BigDecimal aPorc_red_municipal = MoneyHelper.dividir(porc_red_municipal, BigDecimal.valueOf(100d)); + BigDecimal porc = MoneyHelper.subtrair(tributacao_importacao, MoneyHelper.multiplicar(tributacao_importacao, aPorc_red_municipal)); + + BigDecimal aPorc = MoneyHelper.dividir(porc, BigDecimal.valueOf(100d)); + valorBaseCalculoICMS = MoneyHelper.multiplicar(valorTotal, aPorc); } } else { if (porc_red_estadual != null) { - BigDecimal porc = tributacao_importacao.subtract(tributacao_importacao.multiply(porc_red_estadual.divide(BigDecimal.valueOf(100d)))); - valorBaseCalculoICMS = valorTotal.multiply(porc.divide(BigDecimal.valueOf(100d))); + BigDecimal aPorc_red_estadual = MoneyHelper.dividir(porc_red_estadual, BigDecimal.valueOf(100d)); + BigDecimal porc = MoneyHelper.subtrair(tributacao_importacao, MoneyHelper.multiplicar(tributacao_importacao, aPorc_red_estadual)); + + BigDecimal aPorc = MoneyHelper.dividir(porc, BigDecimal.valueOf(100d)); + valorBaseCalculoICMS = MoneyHelper.multiplicar(valorTotal, aPorc); } } } } - BigDecimal valorICMS = (tributacao_importacao == null ? BigDecimal.ZERO : valorBaseCalculoICMS.multiply(tributacao_importacao)); + BigDecimal valorICMS = BigDecimal.ZERO; + + if (tributacao_importacao != null) { + valorICMS = MoneyHelper.multiplicar(valorBaseCalculoICMS, tributacao_importacao); + } String key = rs.getString("ecf") + "|" + rs.getString("datamov") + "|" + rs.getString("estado_origem") + "|" + rs.getString("municipio_origem"); @@ -1767,7 +1792,7 @@ public class FiscalHibernateDAO extends HibernateDaoSupport implements FiscalDAO return retorno; } - + @Override public List buscarRegistroRMDTipoPAR(Connection connection, Date inicio, Date fim, Integer empresaId, String cveestado) { List retorno = new ArrayList(); diff --git a/src/com/rjconsultores/ventaboletos/utilerias/MoneyHelper.java b/src/com/rjconsultores/ventaboletos/utilerias/MoneyHelper.java new file mode 100644 index 000000000..3a77f0ecc --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/utilerias/MoneyHelper.java @@ -0,0 +1,178 @@ +package com.rjconsultores.ventaboletos.utilerias; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Clase MoneyHelper + * + * Referência: http://www.javapractices.com/topic/TopicAction.do?Id=13 + * + * @author RJ Consultores + */ +public class MoneyHelper { + private static Logger log = LoggerFactory.getLogger(MoneyHelper.class); + + private static int DECIMALS = 4; + private static int ROUNDING_MODE = BigDecimal.ROUND_HALF_EVEN; + private static BigDecimal HUNDRED = new BigDecimal("100"); + private static int MATH_CONTEXT = 4; + + public MoneyHelper() { + + } + + public static BigDecimal instanciar(String aValor) { + return arredondar(BigDecimal.valueOf(Float.valueOf(aValor))); + } + + public static BigDecimal instanciar(BigDecimal aValor) { + return arredondar(aValor); + } + + public static BigDecimal somar(BigDecimal ... aAmount) { + BigDecimal total = BigDecimal.ZERO; + for(BigDecimal value : aAmount){ + BigDecimal fAmountOne = value == null ? BigDecimal.ZERO:arredondar(value); + total = total.add(fAmountOne); + } + return total; + } + public static BigDecimal somar(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + BigDecimal fAmountOne = aAmountOne == null ? BigDecimal.ZERO:arredondar(aAmountOne); + BigDecimal fAmountTwo =aAmountTwo == null ? BigDecimal.ZERO: arredondar(aAmountTwo); + + return fAmountOne.add(fAmountTwo); + } + + public static BigDecimal subtrair(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + BigDecimal fAmountOne = arredondar(aAmountOne); + BigDecimal fAmountTwo = arredondar(aAmountTwo); + + return fAmountOne.subtract(fAmountTwo); + } + + public static BigDecimal dividir(BigDecimal aAmount, BigDecimal aDivisor) { + BigDecimal fAmount = arredondar(aAmount); + BigDecimal fDivisor = arredondar(aDivisor); + + return fAmount.divide(fDivisor, DECIMALS, ROUNDING_MODE); + } + + public static BigDecimal multiplicar(BigDecimal aAmount, BigDecimal aMultiplicand) { + BigDecimal fAmount = arredondar(aAmount); + BigDecimal fMultiplicand = arredondar(aMultiplicand); + + return fAmount.multiply(fMultiplicand, new MathContext(ROUNDING_MODE)); + } + + public static BigDecimal arredondar(BigDecimal aNumber) { + if (aNumber != null) { + return aNumber.setScale(DECIMALS, ROUNDING_MODE); + } else { + return null; + } + } + + public static BigDecimal arredondar(BigDecimal aNumber, int decimals, int rounding_mode) { + if (aNumber != null) { + return aNumber.setScale(decimals, rounding_mode); + } else { + return null; + } + } + + public static BigDecimal arredondar(Float aNumber) { + return BigDecimal.valueOf(aNumber).setScale(DECIMALS, ROUNDING_MODE); + } + + public static boolean isMaior(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + BigDecimal fAmountOne = arredondar(aAmountOne); + BigDecimal fAmountTwo = arredondar(aAmountTwo); + + return fAmountOne.compareTo(fAmountTwo) > 0; + } + + public static boolean isMaiorIgual(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + BigDecimal fAmountOne = arredondar(aAmountOne); + BigDecimal fAmountTwo = arredondar(aAmountTwo); + + return fAmountOne.compareTo(fAmountTwo) >= 0; + } + + public static boolean isMenor(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + BigDecimal fAmountOne = arredondar(aAmountOne); + BigDecimal fAmountTwo = arredondar(aAmountTwo); + + return fAmountOne.compareTo(fAmountTwo) < 0; + } + + public static boolean isMenorIgual(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + BigDecimal fAmountOne = arredondar(aAmountOne); + BigDecimal fAmountTwo = arredondar(aAmountTwo); + + return fAmountOne.compareTo(fAmountTwo) <= 0; + } + + public static boolean isIgual(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + BigDecimal fAmountOne = arredondar(aAmountOne); + BigDecimal fAmountTwo = arredondar(aAmountTwo); + + return fAmountOne.compareTo(fAmountTwo) == 0; + } + + public static BigDecimal getDiferenca(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + return aAmountTwo.subtract(aAmountOne); + } + + public static BigDecimal getPercentual(BigDecimal aAmountOne, BigDecimal aAmountTwo) { + + BigDecimal diferenca = getDiferenca(aAmountOne, aAmountTwo); + BigDecimal fractionalChange = BigDecimal.ZERO; + + if ( diferenca!=null && ( diferenca.compareTo(BigDecimal.ZERO) != 0) && (aAmountOne.compareTo(BigDecimal.ZERO) != 0) ){ + fractionalChange = diferenca.divide(aAmountOne, new MathContext(MATH_CONTEXT)); + } + return arredondar(fractionalChange.multiply(HUNDRED)).abs(); + } + + public static BigDecimal getValorDescontadoPercentual(BigDecimal valor, BigDecimal percdesconto) { + BigDecimal valorDescontado = multiplicar(valor, percdesconto).divide(HUNDRED); + return arredondar(subtrair(valor, valorDescontado)); + } + + public static BigDecimal getPercentualValor(BigDecimal valorTotal, BigDecimal valorPercentual) { + if(valorTotal != null && valorPercentual != null) { + return dividir(dividir(multiplicar(valorTotal, valorPercentual), HUNDRED), HUNDRED); + } + return BigDecimal.ZERO; + } + + /** + * Converte uma string no formato de moeda em um {@link BigDecimal} + * @param valor + * @return + */ + public static BigDecimal getValor(String valor) { + try { + if(StringUtils.isNotBlank(valor)) { + NumberFormat nf = DecimalFormat.getCurrencyInstance(Locale.getDefault()); + nf.setMinimumFractionDigits(DECIMALS); + nf.setMaximumFractionDigits(DECIMALS); + return arredondar(nf.parse(valor).floatValue()); + } + } catch (ParseException e) { + log.error(e.getMessage(), e); + } + return null; + } + +} diff --git a/src/com/rjconsultores/ventaboletos/utilerias/exportacaofiscal/ExportacaoFiscal.java b/src/com/rjconsultores/ventaboletos/utilerias/exportacaofiscal/ExportacaoFiscal.java index 678b4e746..4f7148407 100644 --- a/src/com/rjconsultores/ventaboletos/utilerias/exportacaofiscal/ExportacaoFiscal.java +++ b/src/com/rjconsultores/ventaboletos/utilerias/exportacaofiscal/ExportacaoFiscal.java @@ -88,33 +88,33 @@ public class ExportacaoFiscal { writer.print(sb.toString() + UtiliteriasFiscal.QUEBRA_LINHA); } - @SuppressWarnings("unused") - private void adicionarRegistroECFTipoCFC(PrintWriter writer, final List listaRegistroECFTipoCFC) { - for (ExportacaoECFTipoCFC registro : listaRegistroECFTipoCFC) { - adicionarLinhaCFC(writer, registro); - } - } - - @SuppressWarnings("unused") - private void adicionarRegistroECFTipoCCF(PrintWriter writer, final List listaRegistroECFTipoCCF) { - for (ExportacaoECFTipoCCF registro : listaRegistroECFTipoCCF) { - adicionarLinhaCCF(writer, registro); - } - } - - @SuppressWarnings("unused") - private void adicionarRegistroECFTipoICF(PrintWriter writer, final List listaRegistroECFTipoICF) { - for (ExportacaoECFTipoICF registro : listaRegistroECFTipoICF) { - adicionarLinhaICF(writer, registro); - } - } - - @SuppressWarnings("unused") - private void adicionarRegistroECFTipoPRC(PrintWriter writer, final List listaRegistroECFTipoPRC) { - for (ExportacaoECFTipoPRC registro : listaRegistroECFTipoPRC) { - adicionarLinhaPRC(writer, registro); - } - } +// @SuppressWarnings("unused") +// private void adicionarRegistroECFTipoCFC(PrintWriter writer, final List listaRegistroECFTipoCFC) { +// for (ExportacaoECFTipoCFC registro : listaRegistroECFTipoCFC) { +// adicionarLinhaCFC(writer, registro); +// } +// } +// +// @SuppressWarnings("unused") +// private void adicionarRegistroECFTipoCCF(PrintWriter writer, final List listaRegistroECFTipoCCF) { +// for (ExportacaoECFTipoCCF registro : listaRegistroECFTipoCCF) { +// adicionarLinhaCCF(writer, registro); +// } +// } +// +// @SuppressWarnings("unused") +// private void adicionarRegistroECFTipoICF(PrintWriter writer, final List listaRegistroECFTipoICF) { +// for (ExportacaoECFTipoICF registro : listaRegistroECFTipoICF) { +// adicionarLinhaICF(writer, registro); +// } +// } +// +// @SuppressWarnings("unused") +// private void adicionarRegistroECFTipoPRC(PrintWriter writer, final List listaRegistroECFTipoPRC) { +// for (ExportacaoECFTipoPRC registro : listaRegistroECFTipoPRC) { +// adicionarLinhaPRC(writer, registro); +// } +// } private void adicionarRegistroECF(PrintWriter writer, final List listaRegistroECFTipoCFC, final List listaRegistroECFTipoCCF, List listaRegistroECFTipoICF, List listaRegistroECFTipoPRC) { @@ -162,6 +162,8 @@ public class ExportacaoFiscal { groupPRC.put(registro.getEcf() + "|" + registro.getDataEmissao(), itensPRC); } + int linhas = listaRegistroECFTipoCFC.size() + listaRegistroECFTipoCCF.size() + listaRegistroECFTipoICF.size() + listaRegistroECFTipoPRC.size() + 1 + 1; + for (ExportacaoECFTipoCFC registro : listaRegistroECFTipoCFC) { adicionarLinhaCFC(writer, registro); @@ -173,10 +175,14 @@ public class ExportacaoFiscal { } } + BigDecimal total = BigDecimal.ZERO; + itensICF = groupICF.get(registro.getEcf() + "|" + registro.getDataEmissao()); if (itensICF != null) { for (ExportacaoECFTipoICF itemICF : itensICF) { + total = total.add(itemICF.getValorICMSDebitado().setScale(2, BigDecimal.ROUND_HALF_EVEN)); + adicionarLinhaICF(writer, itemICF); } } @@ -185,10 +191,12 @@ public class ExportacaoFiscal { if (itensPRC != null) { for (ExportacaoECFTipoPRC itemPRC : itensPRC) { - adicionarLinhaPRC(writer, itemPRC); + adicionarLinhaPRC(writer, itemPRC, total); } } } + + writer.print("TRA|" + linhas + UtiliteriasFiscal.QUEBRA_LINHA); } private void adicionarLinhaCFC(PrintWriter writer, ExportacaoECFTipoCFC registro) { @@ -343,7 +351,7 @@ public class ExportacaoFiscal { writer.print(sb.toString() + UtiliteriasFiscal.QUEBRA_LINHA); } - private void adicionarLinhaPRC(PrintWriter writer, ExportacaoECFTipoPRC item) { + private void adicionarLinhaPRC(PrintWriter writer, ExportacaoECFTipoPRC item, BigDecimal total) { String ufOrigem = item.getUfOrigem(); String municipioOrigem = item.getMunicipioOrigem() == null ? null : item.getMunicipioOrigem().toString(); BigDecimal valorTotal = item.getValorTotal(); @@ -360,7 +368,7 @@ public class ExportacaoFiscal { sb.append(formataNumerico(municipioOrigem, true, 5)).append(SEPARADOR); sb.append(formataValor(valorTotal, 15)).append(SEPARADOR); sb.append(formataValor(valorBaseCalculoICMS, 15)).append(SEPARADOR); - sb.append(formataValor(valorICMS, 15)); + sb.append(formataValor(total, 15)); // sb.append(formataValor(valorICMS, 15)); writer.print(sb.toString() + UtiliteriasFiscal.QUEBRA_LINHA); }