package br.com.ec.controller.managedbean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.context.annotation.Scope;
import br.com.ec.core.generic.GenericService;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.DreDTO;
import br.com.ec.domain.dto.DreVigenciaDTO;
import br.com.ec.domain.dto.ParametrosConsultaLancamentosDTO;
import br.com.ec.domain.dto.ParametrosConsultaVendasDTO;
import br.com.ec.domain.model.IndicadorDRE;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.Vigencia;
import br.com.ec.domain.service.dre.IndicadorDREService;
import br.com.ec.domain.service.parcela.ParcelaService;
import br.com.ec.domain.service.venda.VendaService;
import br.com.ec.domain.shared.ConstantesSEC;
import br.com.ec.web.generic.AbstractBean;
@Named
@Scope
("view")
public class DreBean
extends AbstractBean
<DreDTO
> implements Serializable {
private static final long serialVersionUID = 1L
;
private List<Vigencia
> vigencias
;
private Vigencia vigencia
;
private List<DreVigenciaDTO
> dreVigencias
;
private Loja centroDeCustosSelecionado
;
private List<IndicadorDRE
> indicadoresDRE
;
private List<IndicadorDRE
> indicadores
;
private IndicadorDREService indicadorDREService
;
private ParcelaService parcelaService
;
private VendaService vendaService
;
@Inject
public DreBean
(IndicadorDREService indicadorDREService, ParcelaService parcelaService, VendaService vendaService
) {
this.
indicadorDREService = indicadorDREService
;
this.
parcelaService = parcelaService
;
this.
vendaService = vendaService
;
}
@
Override
public void preCarregamento
() {
setEntidade
(new DreDTO
(DataUtils.
getPrimeiroDiaDoAnoAtual(), DataUtils.
getUltimoDiaDoAnoAtual()));
}
@
Override
public void limparEntidade
() {
setEntidade
(new DreDTO
());
}
@
Override
public GenericService
<DreDTO
> getService
() {
return null;
}
@
Override
public DreDTO getEntidade
() {
return entidade
;
}
@
Override
public DreDTO getId
() {
return getEntidade
();
}
/********************************************************************/
public List<Vigencia
> getVigencias
() {
return vigencias
;
}
public void setVigencias
(List<Vigencia
> vigencias
) {
this.
vigencias = vigencias
;
}
public Vigencia getVigencia
() {
return vigencia
;
}
public void setVigencia
(Vigencia vigencia
) {
this.
vigencia = vigencia
;
}
public List<IndicadorDRE
> getIndicadoresDRE
() {
if (VerificadorUtil.
estaNulo(indicadoresDRE
)) {
setIndicadoresDRE
(indicadorDREService.
consultarIndicadores());
}
return indicadoresDRE
;
}
public void setIndicadoresDRE
(List<IndicadorDRE
> indicadoresDRE
) {
this.
indicadoresDRE = indicadoresDRE
;
}
public List<IndicadorDRE
> getIndicadores
() {
return indicadores
;
}
public void setIndicadores
(List<IndicadorDRE
> indicadores
) {
this.
indicadores = indicadores
;
}
public List<DreVigenciaDTO
> getDreVigencias
() {
return dreVigencias
;
}
public void setDreVigencias
(List<DreVigenciaDTO
> dreVigencias
) {
this.
dreVigencias = dreVigencias
;
}
public Loja getCentroDeCustosSelecionado
() {
return centroDeCustosSelecionado
;
}
public void setCentroDeCustosSelecionado
(Loja centroDeCustosSelecionado
) {
this.
centroDeCustosSelecionado = centroDeCustosSelecionado
;
}
public void consultarDRE
() {
List<DreVigenciaDTO
> dreVigencias =
new ArrayList<DreVigenciaDTO
>();
for (Vigencia vigenciaSelecionada : getVigencias
()) {
DreVigenciaDTO dre =
new DreVigenciaDTO
();
dre.
setVigencia(vigenciaSelecionada
);
List<IndicadorDRE
> indicadores =
new ArrayList<IndicadorDRE
>();
Double valorReceitaBruta =
0.0;
Double valorResultante =
0.0;
for (IndicadorDRE indicadorDRE : getIndicadoresDRE
()) {
IndicadorDRE indicador =
null;
try {
indicador = indicadorDRE.
clone();
} catch (CloneNotSupportedException e
) {e.
printStackTrace();}
ParametrosConsultaLancamentosDTO parametros =
new ParametrosConsultaLancamentosDTO
();
parametros.
setVigencia(vigenciaSelecionada
);
parametros.
setIndicadorDRE(indicador
);
parametros.
setCentroDeCustos(getCentroDeCustosSelecionado
());
Double valorTotal = parcelaService.
obterValorPassandoParametrosConsulta(parametros
);
if (VerificadorUtil.
estaNulo(valorTotal
)) {
valorTotal =
0.0;
}
ParametrosConsultaVendasDTO parametrosConsultaVendas =
new ParametrosConsultaVendasDTO
();
parametrosConsultaVendas.
setDataInicial(vigenciaSelecionada.
getDataInicio());
parametrosConsultaVendas.
setDataFinal(vigenciaSelecionada.
getDataFim());
parametrosConsultaVendas.
setLoja(getCentroDeCustosSelecionado
());
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
RECEITA_OPERACIONAL_BRUTA_1)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
RECEITA_OPERACIONAL_BRUTA_1_INFO);
valorTotal = valorTotal + vendaService.
obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas
);
valorResultante = valorResultante + valorTotal
;
valorReceitaBruta = valorTotal
;
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DEDUCOES_ABATIMENTOS_2)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
DEDUCOES_ABATIMENTOS_2_INFO);
Double valorBruto = vendaService.
obterValorTotalBrutoDeVendasPorLojaEePeriodo(parametrosConsultaVendas
);
valorTotal = valorTotal +
(valorBruto - vendaService.
obterValorTotalLiquidoDeVendasPorLojaEePeriodo(parametrosConsultaVendas
));
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
CUSTO_PRODUTOS_VENDIDOS_SERVICOS_PRESTADOS_3)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
CUSTO_PRODUTOS_VENDIDOS_SERVICOS_PRESTADOS_3_INFO);
valorTotal = valorTotal + vendaService.
obterValorProdutosUtilizadosEmVendasPorLojaEePeriodo(parametrosConsultaVendas
);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DESPESAS_OPERACIONAIS_VENDAS_VARIAVEIS_4)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
DESPESAS_OPERACIONAIS_VENDAS_VARIAVEIS_4_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DESPESAS_GERAIS_ADMINISTRATIVAS_5)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
DESPESAS_GERAIS_ADMINISTRATIVAS_5_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DESPESAS_FINANCEIRAS_6)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
DESPESAS_FINANCEIRAS_6_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DESPESAS_DEPRECIACAO_7)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
DESPESAS_DEPRECIACAO_7_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
IMPOSTO_RENDA_JURIDICA_8)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
IMPOSTO_RENDA_JURIDICA_8_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
CONTRIBUICAO_SOCIAL_LUCRO_CSLL_9)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
CONTRIBUICAO_SOCIAL_LUCRO_CSLL_9_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
PRO_LABORE_10)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
PRO_LABORE_10_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
PARTICIPACAO_NOS_LUCROS_11)) {
indicador.
setObservacao(ConstantesSEC.
DRE.
PARTICIPACAO_NOS_LUCROS_11_INFO);
}
indicador.
setValorTotal(valorTotal
);
indicador.
setMargem(indicador.
getValorTotal()/valorReceitaBruta
);
indicadores.
add(indicador
);
if (!indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
RECEITA_OPERACIONAL_BRUTA_1)) {
valorResultante = valorResultante - valorTotal
;
}
IndicadorDRE ind =
new IndicadorDRE
();
ind.
setValorTotal(valorResultante
);
ind.
setMargem(ind.
getValorTotal()/valorReceitaBruta
);
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DEDUCOES_ABATIMENTOS_2)) {
ind.
setDescricao(ConstantesSEC.
DRE.
RECEITA_OPERACIONAL_LIQUIDA);
ind.
setObservacao(ConstantesSEC.
DRE.
RECEITA_OPERACIONAL_LIQUIDA_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
CUSTO_PRODUTOS_VENDIDOS_SERVICOS_PRESTADOS_3)) {
ind.
setDescricao(ConstantesSEC.
DRE.
RESULTADO_OPERACIONAL_BRUTO_LUCRO_BRUTO);
ind.
setObservacao(ConstantesSEC.
DRE.
RESULTADO_OPERACIONAL_BRUTO_LUCRO_BRUTO_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DESPESAS_OPERACIONAIS_VENDAS_VARIAVEIS_4)) {
ind.
setDescricao(ConstantesSEC.
DRE.
MARGEM_CONTRIBUICAO);
ind.
setObservacao(ConstantesSEC.
DRE.
MARGEM_CONTRIBUICAO_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DESPESAS_GERAIS_ADMINISTRATIVAS_5)) {
ind.
setDescricao(ConstantesSEC.
DRE.
EBITDA);
ind.
setObservacao(ConstantesSEC.
DRE.
EBITDA_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DESPESAS_DEPRECIACAO_7)) {
ind.
setDescricao(ConstantesSEC.
DRE.
RESULTADO_OPERACIONAL_LIQUIDO_ANTES_IRPJ_CSLL);
ind.
setObservacao(ConstantesSEC.
DRE.
RESULTADO_OPERACIONAL_LIQUIDO_ANTES_IRPJ_CSLL_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
CONTRIBUICAO_SOCIAL_LUCRO_CSLL_9)) {
ind.
setDescricao(ConstantesSEC.
DRE.
LUCRO_LIQUIDO_ANTES_PARTICIPACOES);
ind.
setObservacao(ConstantesSEC.
DRE.
LUCRO_LIQUIDO_ANTES_PARTICIPACOES_INFO);
}
if (indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
PARTICIPACAO_NOS_LUCROS_11)) {
ind.
setDescricao(ConstantesSEC.
DRE.
RESULTADO_LIQUIDO_EXERCICIO);
ind.
setObservacao(ConstantesSEC.
DRE.
RESULTADO_LIQUIDO_EXERCICIO_INFO);
}
if (VerificadorUtil.
naoEstaNuloOuVazio(ind.
getDescricao()) &&
(!indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
DESPESAS_FINANCEIRAS_6) ||
!indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
IMPOSTO_RENDA_JURIDICA_8) ||
!indicador.
getCodigo().
equals(ConstantesSEC.
DRE.
PRO_LABORE_10))) {
indicadores.
add(ind
);
}
}
dre.
setIndicadores(indicadores
);
dreVigencias.
add(dre
);
setIndicadores
(indicadores
);
}
DreVigenciaDTO dreVigenciaTotal = montarTotal
(dreVigencias
);
DreVigenciaDTO dreVigenciaMedia = montarMedias
(dreVigenciaTotal, dreVigencias.
size());
dreVigencias.
add(dreVigenciaMedia
);
dreVigencias.
add(dreVigenciaTotal
);
setDreVigencias
(dreVigencias
);
}
private DreVigenciaDTO montarTotal
(List<DreVigenciaDTO
> dreVigencias
) {
DreVigenciaDTO dreVigenciaTotal =
new DreVigenciaDTO
();
dreVigenciaTotal.
setIndicadores(new ArrayList<IndicadorDRE
>());
Vigencia vigencia =
new Vigencia
();
vigencia.
setDescricao("TOTAL");
dreVigenciaTotal.
setVigencia(vigencia
);
for (DreVigenciaDTO dreVigencia : dreVigencias
) {
for (IndicadorDRE indicador : dreVigencia.
getIndicadores()) {
try {
dreVigenciaTotal.
acrescentarValorIndicador(indicador.
clone());
} catch (CloneNotSupportedException e
) {
e.
printStackTrace();
}
}
}
return dreVigenciaTotal
;
}
private DreVigenciaDTO montarMedias
(DreVigenciaDTO dreVigenciaTotal,
Integer quantidadeVigencias
) {
DreVigenciaDTO dreVigenciaMedias =
new DreVigenciaDTO
();
dreVigenciaMedias.
setIndicadores(new ArrayList<IndicadorDRE
>());
Vigencia vigencia =
new Vigencia
();
vigencia.
setDescricao("MÉDIA");
dreVigenciaMedias.
setVigencia(vigencia
);
Double valorReceitaBruta =
0.0;
for (IndicadorDRE indicador : dreVigenciaTotal.
getIndicadores()) {
try {
IndicadorDRE indicadorMedia = indicador.
clone();
indicadorMedia.
setValorTotal(indicadorMedia.
getValorTotal()/quantidadeVigencias
);
if (VerificadorUtil.
naoEstaNulo(indicador.
getCodigo())) {
if (indicadorMedia.
getCodigo().
equals(new Long(ConstantesSEC.
DRE.
RECEITA_OPERACIONAL_BRUTA_1))) {
valorReceitaBruta = indicadorMedia.
getValorTotal();
}
}
indicadorMedia.
setMargem(indicadorMedia.
getValorTotal()/valorReceitaBruta
);
dreVigenciaMedias.
getIndicadores().
add(indicadorMedia
);
} catch (CloneNotSupportedException e
) {
e.
printStackTrace();
}
}
return dreVigenciaMedias
;
}
}