package br.com.ec.controller;
import java.io.Serializable;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.StreamedContent;
import org.springframework.context.annotation.Scope;
import br.com.ec.controller.consultademanda.NotaFiscalConsultaPorDemanda;
import br.com.ec.core.generic.GenericService;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.CompraProdutoDTO;
import br.com.ec.domain.dto.NotaFiscalDTO;
import br.com.ec.domain.dto.NotaFiscalProdutoDTO;
import br.com.ec.domain.dto.ProdutoDTO;
import br.com.ec.domain.dto.consulta.ParametrosConsultaNotaFiscal;
import br.com.ec.domain.model.NotaFiscal;
import br.com.ec.domain.model.Pessoa;
import br.com.ec.domain.model.Transporte;
import br.com.ec.domain.model.Venda;
import br.com.ec.domain.model.nfe.TipoModeloNotaFiscal;
import br.com.ec.domain.model.nfe.TipoNotaFiscal;
import br.com.ec.domain.model.nfe.TipoNotaFiscalConsumidorFinal;
import br.com.ec.domain.model.nfe.TipoNotaFiscalDestino;
import br.com.ec.domain.model.nfe.TipoNotaFiscalIntermediario;
import br.com.ec.domain.model.nfe.TipoNotaFiscalModalidadeFrete;
import br.com.ec.domain.model.nfe.TipoNotaFiscalPresencaComprador;
import br.com.ec.domain.service.CompraProdutoService;
import br.com.ec.domain.service.EmissorRelatorioService;
import br.com.ec.domain.service.NotaFiscalProdutoService;
import br.com.ec.domain.service.NotaFiscalService;
import br.com.ec.domain.service.ProdutoService;
import br.com.ec.web.exception.VerificadorLancamentoException;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandBean;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandRelatorioStreamedContent;
import br.com.ec.web.generic.AbstractBean;
import br.com.ec.web.message.LancadorMensagem;
import br.com.ec.web.util.TipoOperacao;
@Named
@Scope
("view")
public class NotaFiscalBean
extends AbstractBean
<NotaFiscal
> implements Serializable {
private static final long serialVersionUID = 1L
;
private String statusSefaz =
"";
private ParametrosConsultaNotaFiscal parametrosConsultaNotaFiscal
;
private NotaFiscalConsultaPorDemanda lazy
;
private Long sequencialVendaParaVinculo
;
private StreamedContent danfeNfePreVisualizacao
;
private StreamedContent danfeNfe
;
private String codigoProdutoParaVinculoNotaFiscal =
"";
private ProdutoDTO produtoDTOParaVinculoNotaFiscal
;
private CompraProdutoDTO compraProdutoDTOParaVinculoNotaFiscal
;
private List<CompraProdutoDTO
> listaCompraProdutoDTOParaVinculoNotaFiscal
;
private String chaveNotaFiscalParaReferenciaNotaFiscal =
"";
private NotaFiscalDTO notaFiscalDTOParaReferenciaNotaFiscal
;
private Transporte transporteSelecionado
;
private NotaFiscalService notaFiscalService
;
private NotaFiscalProdutoService notaFiscalProdutoService
;
private ProdutoService produtoService
;
private CompraProdutoService compraProdutoService
;
private EmissorRelatorioService emissorRelatorioService
;
@Inject
public NotaFiscalBean
(NotaFiscalConsultaPorDemanda lazy, NotaFiscalService notaFiscalService, NotaFiscalProdutoService notaFiscalProdutoService,
ProdutoService produtoService, CompraProdutoService compraProdutoService, EmissorRelatorioService emissorRelatorioService
) {
this.
lazy = lazy
;
this.
notaFiscalService = notaFiscalService
;
this.
notaFiscalProdutoService = notaFiscalProdutoService
;
this.
produtoService = produtoService
;
this.
compraProdutoService = compraProdutoService
;
this.
emissorRelatorioService = emissorRelatorioService
;
}
@
Override
public void preCarregamento
() {
parametrosConsultaNotaFiscal =
new ParametrosConsultaNotaFiscal
();
prepararConsultaDemanda
();
limparEntidade
();
}
@
Override
public void limparEntidade
() {
setEntidade
(new NotaFiscal
());
}
@
Override
public GenericService
<NotaFiscal
> getService
() {
return notaFiscalService
;
}
@
Override
public NotaFiscal getEntidade
() {
return entidade
;
}
@
Override
public void preConsultar
() {
setTipoOperacao
(TipoOperacao.
CONSULTAR);
}
@
Override
public void preCadastrar
() {
setTransporteSelecionado
(new Transporte
());
super.
preCadastrar();
}
@
Override
public void cadastrar
() {
getEntidade
().
setTransporte(getTransporteSelecionado
());
super.
cadastrar();
}
@
Override
public void preAlterar
(NotaFiscal notaFiscal
) {
if (VerificadorUtil.
estaNulo(notaFiscal.
getTransporte())) {
setTransporteSelecionado
(new Transporte
());
} else {
setTransporteSelecionado
(notaFiscal.
getTransporte());
}
super.
preAlterar(notaFiscal
);
}
@
Override
public void alterar
() {
getEntidade
().
setTransporte(getTransporteSelecionado
());
super.
alterar();
}
/*
@Override
public void preAlterar(NotaFiscal notaFiscal) {
NotaFiscal notaFiscalDetalhada = notaFiscalService.detalhar(notaFiscal.getSequencial());
super.preAlterar(notaFiscalDetalhada);
}
*/
@
Override
public NotaFiscal getId
() {
return getEntidade
();
}
public ParametrosConsultaNotaFiscal getParametrosConsultaNotaFiscal
() {
return parametrosConsultaNotaFiscal
;
}
public void setParametrosConsultaNotaFiscal
(ParametrosConsultaNotaFiscal parametrosConsultaNotaFiscal
) {
this.
parametrosConsultaNotaFiscal = parametrosConsultaNotaFiscal
;
}
public NotaFiscalConsultaPorDemanda getLazy
() {
return lazy
;
}
public void setLazy
(NotaFiscalConsultaPorDemanda lazy
) {
this.
lazy = lazy
;
}
public void prepararConsultaDemanda
() {
lazy.
setarParametrosConsulta(getParametrosConsultaNotaFiscal
());
}
public TipoNotaFiscalModalidadeFrete
[] getTiposModalidadeFrete
() {
return TipoNotaFiscalModalidadeFrete.
values();
}
public TipoNotaFiscal
[] getTiposNotaFiscal
() {
return TipoNotaFiscal.
values();
}
public TipoNotaFiscalConsumidorFinal
[] getTiposConsumidorFinal
() {
return TipoNotaFiscalConsumidorFinal.
values();
}
public TipoNotaFiscalPresencaComprador
[] getTiposPresencaComprador
() {
return TipoNotaFiscalPresencaComprador.
values();
}
public TipoNotaFiscalIntermediario
[] getTiposIntermediario
() {
return TipoNotaFiscalIntermediario.
values();
}
public TipoNotaFiscalDestino
[] getTiposDestino
() {
return TipoNotaFiscalDestino.
values();
}
public Long getSequencialVendaParaVinculo
() {
return sequencialVendaParaVinculo
;
}
public void setSequencialVendaParaVinculo
(Long sequencialVendaParaVinculo
) {
this.
sequencialVendaParaVinculo = sequencialVendaParaVinculo
;
}
public StreamedContent getDanfeNfePreVisualizacao
() {
return danfeNfePreVisualizacao
;
}
public void setDanfeNfePreVisualizacao
(StreamedContent danfeNfePreVisualizacao
) {
this.
danfeNfePreVisualizacao = danfeNfePreVisualizacao
;
}
public StreamedContent getDanfeNfe
() {
return danfeNfe
;
}
public void setDanfeNfe
(StreamedContent danfeNfe
) {
this.
danfeNfe = danfeNfe
;
}
public String getCodigoProdutoParaVinculoNotaFiscal
() {
return codigoProdutoParaVinculoNotaFiscal
;
}
public void setCodigoProdutoParaVinculoNotaFiscal
(String codigoProdutoParaVinculoNotaFiscal
) {
this.
codigoProdutoParaVinculoNotaFiscal = codigoProdutoParaVinculoNotaFiscal
;
}
public ProdutoDTO getProdutoDTOParaVinculoNotaFiscal
() {
return produtoDTOParaVinculoNotaFiscal
;
}
public void setProdutoDTOParaVinculoNotaFiscal
(ProdutoDTO produtoDTOParaVinculoNotaFiscal
) {
this.
produtoDTOParaVinculoNotaFiscal = produtoDTOParaVinculoNotaFiscal
;
}
public CompraProdutoDTO getCompraProdutoDTOParaVinculoNotaFiscal
() {
return compraProdutoDTOParaVinculoNotaFiscal
;
}
public void setCompraProdutoDTOParaVinculoNotaFiscal
(CompraProdutoDTO compraProdutoDTOParaVinculoNotaFiscal
) {
this.
compraProdutoDTOParaVinculoNotaFiscal = compraProdutoDTOParaVinculoNotaFiscal
;
}
public List<CompraProdutoDTO
> getListaCompraProdutoDTOParaVinculoNotaFiscal
() {
return listaCompraProdutoDTOParaVinculoNotaFiscal
;
}
public void setListaCompraProdutoDTOParaVinculoNotaFiscal
(List<CompraProdutoDTO
> listaCompraProdutoDTOParaVinculoNotaFiscal
) {
this.
listaCompraProdutoDTOParaVinculoNotaFiscal = listaCompraProdutoDTOParaVinculoNotaFiscal
;
}
public String getChaveNotaFiscalParaReferenciaNotaFiscal
() {
return chaveNotaFiscalParaReferenciaNotaFiscal
;
}
public void setChaveNotaFiscalParaReferenciaNotaFiscal
(String chaveNotaFiscalParaReferenciaNotaFiscal
) {
this.
chaveNotaFiscalParaReferenciaNotaFiscal = chaveNotaFiscalParaReferenciaNotaFiscal
;
}
public NotaFiscalDTO getNotaFiscalDTOParaReferenciaNotaFiscal
() {
return notaFiscalDTOParaReferenciaNotaFiscal
;
}
public void setNotaFiscalDTOParaReferenciaNotaFiscal
(NotaFiscalDTO notaFiscalDTOParaReferenciaNotaFiscal
) {
this.
notaFiscalDTOParaReferenciaNotaFiscal = notaFiscalDTOParaReferenciaNotaFiscal
;
}
public Transporte getTransporteSelecionado
() {
return transporteSelecionado
;
}
public void setTransporteSelecionado
(Transporte transporteSelecionado
) {
this.
transporteSelecionado = transporteSelecionado
;
}
public String getStatusSefaz
() {
return statusSefaz
;
}
public void setStatusSefaz
(String statusSefaz
) {
this.
statusSefaz = statusSefaz
;
}
/**************************************************/
public void atualizarStatusSefaz
() {
setStatusSefaz
(notaFiscalService.
retornarStatusSefaz());
}
public void desvincularVenda
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
notaFiscalService.
desvincularVenda(getEntidade
().
getSequencial());
getEntidade
().
setVenda(null);
LancadorMensagem.
lancarSucesso("VENDA DESVINCULADA COM SUCESSO");
}
});
}
public void vincularVenda
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
Venda vendaVinculada = notaFiscalService.
vincularVenda(getEntidade
().
getSequencial(), getSequencialVendaParaVinculo
());
getEntidade
().
setVenda(vendaVinculada
);
LancadorMensagem.
lancarSucesso("VENDA VINCULADA COM SUCESSO");
}
});
}
public void emitirDanfeNfe
(Long sequencialNotaFiscal
) {
setDanfeNfePreVisualizacao
(notaFiscalService.
gerarDanfeNfePreVisualizacao(sequencialNotaFiscal
));
setDanfeNfe
(notaFiscalService.
gerarDanfeNfe(sequencialNotaFiscal
));
}
public void emitirDanfeNfePreVisualizacao
(Long sequencialNotaFiscal
) {
setDanfeNfePreVisualizacao
(notaFiscalService.
gerarDanfeNfePreVisualizacao(sequencialNotaFiscal
));
setDanfeNfe
(notaFiscalService.
gerarDanfeNfe(sequencialNotaFiscal
));
/*
return new VerificadorLancamentoException().verificarLancamentoException(new CommandRelatorioStreamedContent() {
@Override
public StreamedContent execute() {
return notaFiscalService.gerarDanfeNfe(getEntidade().getSequencial());
}
});
*/
}
public StreamedContent downloadNotaFiscal
() {
return new VerificadorLancamentoException
().
verificarLancamentoException(new CommandRelatorioStreamedContent
() {
@
Override
public StreamedContent execute
() {
return getDanfeNfe
();
}
});
}
public void emitirDanfeNfeTeste
() {
Long sequencialNotaFiscal =
new Long(168722);
setDanfeNfePreVisualizacao
(notaFiscalService.
gerarDanfeNfePreVisualizacao(sequencialNotaFiscal
));
setDanfeNfe
(notaFiscalService.
gerarDanfeNfe(sequencialNotaFiscal
));
}
public void visualizarDanfe
() {
Long sequencialNotaFiscal = getEntidade
().
getSequencial();
setDanfeNfePreVisualizacao
(notaFiscalService.
gerarDanfeNfePreVisualizacao(sequencialNotaFiscal
));
}
public StreamedContent downloadNotaFiscalPreVisualizada
() {
return new VerificadorLancamentoException
().
verificarLancamentoException(new CommandRelatorioStreamedContent
() {
@
Override
public StreamedContent execute
() {
return getDanfeNfePreVisualizacao
();
}
});
}
public void selecionarEmitente
(final Pessoa pessoa
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getEntidade
().
setPessoaEmitente(pessoa
);
adicionandoParametroArgsConfirmandoAcao
(true);
}
});
}
public void retirarEmitente
() {
getEntidade
().
setPessoaEmitente(null);
}
public void selecionarDestinatario
(final Pessoa pessoa
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getEntidade
().
setPessoaDestinatario(pessoa
);
adicionandoParametroArgsConfirmandoAcao
(true);
}
});
}
public void retirarDestinatario
() {
getEntidade
().
setPessoaDestinatario(null);
}
/************************************/
/** REMESSA **/
/************************************/
public void prepararNotaFiscalRemessa
() {
preCadastrar
();
getEntidade
().
prepararNotaFiscalEletronicaRemessa();
}
public void emitirNotaFiscalRemessa
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
notaFiscalService.
emitirNotaFiscalEletronica(getEntidade
());
LancadorMensagem.
lancarSucesso("NOTA FISCAL DE REMESSA EMITIDA COM SUCESSO");
}
});
}
public void cancelarNotaFiscal
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
notaFiscalService.
cancelarNotaFiscalEletronica(getEntidade
());
LancadorMensagem.
lancarSucesso("NOTA FISCAL CANCELADA COM SUCESSO");
}
});
}
public void consultarProdutosVinculados
() {
getEntidade
().
setListaProdutosVinculadosDTO(notaFiscalService.
consultarProdutosVinculados(getEntidade
().
getSequencial()));
}
public void selecionarCompraProdutoParaVinculoNotaFiscal
(CompraProdutoDTO compraProdutoDTO
) {
compraProdutoDTO.
setValorProdutoParaVinculoNotaFiscal(compraProdutoDTO.
getValorCompra());
setCompraProdutoDTOParaVinculoNotaFiscal
(compraProdutoDTO
);
}
public void excluirVinculoNotaFiscalProduto
(NotaFiscalProdutoDTO notaFiscalProdutoDTO
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
notaFiscalProdutoService.
excluirNotaFiscalProduto(notaFiscalProdutoDTO
);
consultarProdutosVinculados
();
LancadorMensagem.
lancarSucesso("VÍNCULO EXCLUÍDO COM SUCESSO");
}
});
}
public void consultarProdutoParaVinculoNotaFiscal
() {
setProdutoDTOParaVinculoNotaFiscal
(produtoService.
consultarProdutoDTOPorCodigoOuCodigoEAN(getCodigoProdutoParaVinculoNotaFiscal
()));
setListaCompraProdutoDTOParaVinculoNotaFiscal
(produtoService.
consultarComprasDoProduto(getProdutoDTOParaVinculoNotaFiscal
().
getSequencial()));
}
public void vinculoProdutoNaNotaFiscal
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
notaFiscalProdutoService.
vinculoProdutoNaNotaFiscal(getEntidade
().
getSequencial(),
getProdutoDTOParaVinculoNotaFiscal
(),
getCompraProdutoDTOParaVinculoNotaFiscal
());
setCodigoProdutoParaVinculoNotaFiscal
("");
setProdutoDTOParaVinculoNotaFiscal
(null);
setCompraProdutoDTOParaVinculoNotaFiscal
(null);
consultarProdutosVinculados
();
LancadorMensagem.
lancarSucesso("PRODUTO VINCULADO COM SUCESSO");
}
});
}
public void consultarNotaFiscalParaReferenciarNotaFiscal
() {
setNotaFiscalDTOParaReferenciaNotaFiscal
(notaFiscalService.
consultarPorChave(getChaveNotaFiscalParaReferenciaNotaFiscal
()));
}
public void gerarDadosAdicionais
() {
consultarProdutosVinculados
();
StringBuilder dadosAdicionais =
new StringBuilder("");
if (getEntidade
().
ehNotaFiscalDeRemessa()) {
if (!VerificadorUtil.
isListaNulaOuVazia(getEntidade
().
getListaProdutosVinculadosDTO())) {
dadosAdicionais.
append("Devolução parcial das Notas Fiscais abaixo:\n");
for (NotaFiscalProdutoDTO notaFiscalProdutoDTO : getEntidade
().
getListaProdutosVinculadosDTO()) {
NotaFiscalDTO notaFiscalDTOCompra = notaFiscalProdutoDTO.
getCompraProdutoDTO().
getCompraDTO().
getNotaFiscalDTO();
if (!dadosAdicionais.
toString().
contains(notaFiscalDTOCompra.
getChave())) {
dadosAdicionais.
append(notaFiscalDTOCompra.
getNumero());
dadosAdicionais.
append(", Chave de acesso: ");
dadosAdicionais.
append(notaFiscalDTOCompra.
getChave());
dadosAdicionais.
append(", emitida em ");
dadosAdicionais.
append(notaFiscalDTOCompra.
getDataEmissaoFormatada());
dadosAdicionais.
append(" | ");
}
}
dadosAdicionais.
append("\n");
}
}
// EMAIL DO DESTINATÁRIO
dadosAdicionais.
append(getEntidade
().
getPessoaDestinatario().
getEmail());
dadosAdicionais.
append(". ");
getEntidade
().
setDescricaoComplementares(dadosAdicionais.
toString());
}
}