package br.com.ec.controller.managedbean;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.context.RequestContext;
import org.springframework.context.annotation.Scope;
import br.com.ec.controller.managedbean.consultademanda.NotaFiscalConsultaPorDemanda;
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.ParametrosConsultaNotaFiscalDTO;
import br.com.ec.domain.dto.ParametrosConsultaProdutoDTO;
import br.com.ec.domain.dto.nfce.NotaFiscalRemessaDTO;
import br.com.ec.domain.model.Fornecedor;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.NotaFiscal;
import br.com.ec.domain.model.NotaFiscalProduto;
import br.com.ec.domain.model.Pessoa;
import br.com.ec.domain.model.Produto;
import br.com.ec.domain.model.ProdutoLoja;
import br.com.ec.domain.model.tipos.TipoRelatorio;
import br.com.ec.domain.model.tipos.nfe.TipoModeloNotaFiscal;
import br.com.ec.domain.model.tipos.nfe.TipoNotaFiscal;
import br.com.ec.domain.service.emissor.notafiscal.EmissorDiretoNotaFiscalService;
import br.com.ec.domain.service.emissor.notafiscal.EmissorNotaFiscalEletronicaService;
import br.com.ec.domain.service.notafiscal.NotaFiscalProdutoService;
import br.com.ec.domain.service.notafiscal.NotaFiscalService;
import br.com.ec.domain.service.pessoa.PessoaService;
import br.com.ec.domain.service.produto.ProdutoService;
import br.com.ec.domain.service.produtodaloja.ProdutoLojaService;
import br.com.ec.web.exception.VerificadorLancamentoException;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandBean;
import br.com.ec.web.generic.AbstractBean;
import br.com.ec.web.message.LancadorMensagem;
import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum;
@Named
@Scope
("view")
public class NotaFiscalBean
extends AbstractBean
<NotaFiscal
> implements Serializable {
private static final long serialVersionUID = 1L
;
private NotaFiscalService notaFiscalService
;
private ProdutoService produtoService
;
private NotaFiscalProdutoService notaFiscalProdutoService
;
private EmissorNotaFiscalEletronicaService emissorNotaFiscalEletronicaService
;
private EmissorDiretoNotaFiscalService emissorDiretoNotaFiscalService
;
private PessoaService pessoaService
;
private ProdutoLojaService produtoLojaService
;
private String codigoProdutoRemessa
;
private Produto produtoSelecionado
;
private Integer quantidadeProdutoSelecionado
;
private NotaFiscalRemessaDTO notaFiscalRemessa
;
private Fornecedor fornecedorParaRemessa
;
private Loja lojaParaRemessa
;
private NotaFiscalConsultaPorDemanda lazy
;
@Inject
public NotaFiscalBean
(NotaFiscalService notaFiscalService, ProdutoService produtoService, NotaFiscalProdutoService notaFiscalProdutoService,
EmissorNotaFiscalEletronicaService emissorNotaFiscalEletronicaService, EmissorDiretoNotaFiscalService emissorDiretoNotaFiscalService,
PessoaService pessoaService, NotaFiscalConsultaPorDemanda lazy,
ProdutoLojaService produtoLojaService
) {
this.
notaFiscalService = notaFiscalService
;
this.
produtoService = produtoService
;
this.
notaFiscalProdutoService = notaFiscalProdutoService
;
this.
emissorNotaFiscalEletronicaService = emissorNotaFiscalEletronicaService
;
this.
emissorDiretoNotaFiscalService = emissorDiretoNotaFiscalService
;
this.
pessoaService = pessoaService
;
this.
lazy = lazy
;
this.
produtoLojaService = produtoLojaService
;
}
@
Override
public void preCarregamento
() {
entidade =
new NotaFiscal
();
parametrosConsulta =
new ParametrosConsultaNotaFiscalDTO
();
parametrosConsulta.
setEntidade(entidade
);
}
@
Override
public void limparEntidade
() {
setEntidade
(new NotaFiscal
());
}
@
Override
public GenericService
<NotaFiscal
> getService
() {
return notaFiscalService
;
}
@
Override
public NotaFiscal getEntidade
() {
return entidade
;
}
@
Override
public NotaFiscal getId
() {
return getEntidade
();
}
public String getCodigoProdutoRemessa
() {
return codigoProdutoRemessa
;
}
public void setCodigoProdutoRemessa
(String codigoProdutoRemessa
) {
this.
codigoProdutoRemessa = codigoProdutoRemessa
;
}
public Produto getProdutoSelecionado
() {
return produtoSelecionado
;
}
public void setProdutoSelecionado
(Produto produtoSelecionado
) {
this.
produtoSelecionado = produtoSelecionado
;
}
public Integer getQuantidadeProdutoSelecionado
() {
return quantidadeProdutoSelecionado
;
}
public void setQuantidadeProdutoSelecionado
(Integer quantidadeProdutoSelecionado
) {
this.
quantidadeProdutoSelecionado = quantidadeProdutoSelecionado
;
}
public NotaFiscalRemessaDTO getNotaFiscalRemessa
() {
return notaFiscalRemessa
;
}
public void setNotaFiscalRemessa
(NotaFiscalRemessaDTO notaFiscalRemessa
) {
this.
notaFiscalRemessa = notaFiscalRemessa
;
}
public Fornecedor getFornecedorParaRemessa
() {
return fornecedorParaRemessa
;
}
public void setFornecedorParaRemessa
(Fornecedor fornecedorParaRemessa
) {
this.
fornecedorParaRemessa = fornecedorParaRemessa
;
}
public Loja getLojaParaRemessa
() {
return lojaParaRemessa
;
}
public void setLojaParaRemessa
(Loja lojaParaRemessa
) {
this.
lojaParaRemessa = lojaParaRemessa
;
}
public NotaFiscalConsultaPorDemanda getLazy
() {
prepararConsultaDemanda
();
return lazy
;
}
public void setLazy
(NotaFiscalConsultaPorDemanda lazy
) {
this.
lazy = lazy
;
}
public void prepararConsultaDemanda
() {
lazy.
setarParametrosConsulta(getParametrosConsulta
());
}
public TipoNotaFiscal
[] getTiposNotaFiscal
() {
return TipoNotaFiscal.
values();
}
public void prepararParaCadastrarNFeRemessa
() {
setNotaFiscalRemessa
(new NotaFiscalRemessaDTO
());
preRealizar
();
}
/***************************************************************/
@
Override
public void cadastrar
(final NotaFiscal notaFiscal
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
notaFiscal.
setDataHoraEmissao(DataUtils.
getDataAtual());
notaFiscal.
setTipoNotaFiscal(TipoNotaFiscal.
NFCE_SAIDA.
getValor());
notaFiscal.
setTipoModeloNotaFiscal(TipoModeloNotaFiscal.
MODELO_NFCE_65.
getValor());
getService
().
cadastrar(notaFiscal
);
limparEntidade
();
LancadorMensagem.
lancarSucesso(getMensagens
().
get(IDENTIFICADOR_MENSAGEM_CADASTRADO_COM_SUCESSO
));
}
});
}
@
Override
public void excluir
(final NotaFiscal notaFiscal
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getService
().
excluir(notaFiscal
);
limparEntidade
();
LancadorMensagem.
lancarSucesso(getMensagens
().
get(IDENTIFICADOR_MENSAGEM_EXCLUIDO_COM_SUCESSO
));
}
});
}
public void cancelarNotaFiscal
(final NotaFiscal notaFiscal
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
LancadorMensagem.
lancarSucesso("OPERAÇÃO NÃO IMPLEMENTADA");
// notaFiscalService.cancelarNFCe(notaFiscal);
// LancadorMensagem.lancarSucesso("NOTA FISCAL CANCELADA COM SUCESSO");
}
});
}
public void detalharNotaFiscal
(NotaFiscal notaFiscal
) {
setEntidade
(notaFiscalService.
detalhar(notaFiscal
));
getEntidade
().
setListaNFRemessaProdutos(notaFiscalProdutoService.
consultarProdutosDaNotaFiscal(getEntidade
()));
}
public void iniciarNfeRemessa
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
NotaFiscal notaFiscal =
new NotaFiscal
();
notaFiscal.
setTipoModeloNotaFiscal(TipoModeloNotaFiscal.
MODELO_NFE_55.
getValor());
notaFiscal.
setTipoNotaFiscal(TipoNotaFiscal.
NFE_REMESSA.
getValor());
notaFiscal.
setSerie(TipoNotaFiscal.
NFE_REMESSA.
getSerie());
notaFiscal.
setDataHoraEmissao(DataUtils.
getDataAtual());
notaFiscal.
setPessoaEmitente(getNotaFiscalRemessa
().
getLojaEmitente().
getPessoaJuridica());
notaFiscal.
setPessoaDestinatario(getNotaFiscalRemessa
().
getLojaDestino().
getPessoaJuridica());
notaFiscalService.
alterar(notaFiscal
);
getNotaFiscalRemessa
().
preencherDadosNotaFiscal(notaFiscal
);
getNotaFiscalRemessa
().
setPessoaEmitente(getNotaFiscalRemessa
().
getLojaEmitente().
getPessoaJuridica());
getNotaFiscalRemessa
().
setPessoaDestinatario(getNotaFiscalRemessa
().
getLojaDestino().
getPessoaJuridica());
setCodigoProdutoRemessa
(null);
LancadorMensagem.
lancarSucesso("REMESSA INICIADA COM SUCESSO");
}
});
}
public void consultarNfeRemessa
(final NotaFiscal nf
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
preRealizar
();
setEntidade
(notaFiscalService.
detalhar(nf
));
getEntidade
().
setListaNFRemessaProdutos(notaFiscalProdutoService.
consultarProdutosDaNotaFiscal(getEntidade
()));
setNotaFiscalRemessa
(new NotaFiscalRemessaDTO
());
getNotaFiscalRemessa
().
preencherDadosNotaFiscal(getEntidade
());
}
});
}
public void escolherProduto
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
Produto produtoConsultado = produtoService.
consultarProdutoPorCodigoOuCodigoEAN(getCodigoProdutoRemessa
());
if (VerificadorUtil.
estaNulo(produtoConsultado
)) {
LancadorMensagem.
lancarErro("Produto não encontrado!");
} else {
setProdutoSelecionado
(produtoConsultado
);
setQuantidadeProdutoSelecionado
(1);
RequestContext.
getCurrentInstance().
addCallbackParam("confirmado",
true);
}
}
});
}
public void escolherProduto
(Produto produto
) {
setProdutoSelecionado
(produto
);
setQuantidadeProdutoSelecionado
(1);
}
public void adicionarProduto
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
NotaFiscalProduto notaFiscalRemessaProduto =
new NotaFiscalProduto
();
notaFiscalRemessaProduto.
setProduto(getProdutoSelecionado
());
notaFiscalRemessaProduto.
setQuantidade(getQuantidadeProdutoSelecionado
());
notaFiscalRemessaProduto.
setNotaFiscal(notaFiscalService.
consultarPorId(getNotaFiscalRemessa
().
getNotaFiscal()));
notaFiscalProdutoService.
cadastrar(notaFiscalRemessaProduto
);
// verificarParametros(notaFiscalRemessaProduto);
consultarNfeRemessa
(getNotaFiscalRemessa
().
getNotaFiscal());
setCodigoProdutoRemessa
(null);
LancadorMensagem.
lancarSucesso("Produto adicionado, código: " + getProdutoSelecionado
().
getCodigoProdutoPadrao());
}
});
}
public void removerProduto
(final NotaFiscalProduto notaFiscalProduto
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
notaFiscalProdutoService.
excluir(notaFiscalProduto
);
consultarNfeRemessa
(notaFiscalProduto.
getNotaFiscal());
LancadorMensagem.
lancarSucesso("Produto removido com sucesso");
}
});
}
public void emitirNfeRemessa
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
NotaFiscal notaFiscal = notaFiscalService.
detalhar(getEntidade
());
notaFiscal.
setPessoaEmitente(pessoaService.
detalharPessoa(notaFiscal.
getPessoaEmitente()));
notaFiscal.
setPessoaDestinatario(pessoaService.
detalharPessoa(notaFiscal.
getPessoaDestinatario()));
notaFiscal.
setListaNFRemessaProdutos(notaFiscalProdutoService.
consultarProdutosDaNotaFiscal(getEntidade
()));
emissorNotaFiscalEletronicaService.
enviarNotaFiscalEletronicaRemessa(notaFiscal
);
LancadorMensagem.
lancarSucesso("NOTA FISCAL DE REMESSA: EMITIDA COM SUCESSO");
}
});
}
// TODO: MÉTODO PROVISÓRIO
public void emitirNfeDevolucao
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
emissorDiretoNotaFiscalService.
emitirNotaFiscalDireto(TipoModeloNotaFiscal.
MODELO_NFE_55.
getValor(), DocumentoEnum.
NFE);
LancadorMensagem.
lancarSucesso("NOTA FISCAL: EMITIDA COM SUCESSO");
}
});
}
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);
}
/*
private void verificarParametros(TransferenciaProduto transferenciaProduto) {
if (VerificadorUtil.estaNulo(transferenciaProduto.getQuantidadeTransferir()) || transferenciaProduto.getQuantidadeTransferir().equals(0)) {
throw new NegocioException("Obrigatório informar a quantidade para transferência.");
}
verificarSeProdutoJaFoiAdicionado(transferenciaProduto.getSequencialDoProduto());
}
protected void verificarSeProdutoJaFoiAdicionado(Long sequencialProduto) {
if (getEntidade().verificarSeProdutoJaConstaNaLista(sequencialProduto)) {
throw new NegocioException("Produto já foi adicionando anteriormente!");
}
}
*/
// MÉTODO PARCIAL
public void adicionarEstoqueProdutos
() {
// FORNECEDORES: "MULTILASER" 29, "VIVONA25" 25, "JBL HARMAN" 38, "HUSKY" 40, "BHX ENERGY" 37, "KINGO" 30, "GBMAX" 70,
// "GIFFY" 32, "RCELL" 34, "TTNT" 60, "YASIN" 68, "DL COMERCIO" 71
/*1;"LOJA POÇO"
2;"QUIOSQUE EXTRA"
3;"QUIOSQUE HIPER"
4;"LOJA VIVO"
5;"QUIOSQUE PÁTIO"
6;"LOJA MATRIZ"
7;"FARMÁCIA"
8;"LOJA MACEIÓ"
9;"ESTOQUE"
13;"QUIOSQUE ANTARES"*/
// FORNECEDORES APTOS
// List<Integer> sequenciaisFornecedor = new ArrayList<>(Arrays.asList(29, 25, 38, 40, 37, 30, 70, 32, 34, 60, 68, 71));
// List<Integer> sequenciaisFornecedor = new ArrayList<>(Arrays.asList(38));
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
ParametrosConsultaProdutoDTO parametrosConsultaProduto =
new ParametrosConsultaProdutoDTO
();
parametrosConsultaProduto.
setTipoRelatorioProduto(TipoRelatorio.
PRODUTOS_COM_ESTOQUE.
getValor());
if (VerificadorUtil.
naoEstaNulo(getLojaParaRemessa
())) {
parametrosConsultaProduto.
setLojaSelecionada(getLojaParaRemessa
().
getSequencial());
} else {
LancadorMensagem.
lancarErro("Selecione a loja do estoque");
}
if (VerificadorUtil.
naoEstaNulo(getFornecedorParaRemessa
())) {
parametrosConsultaProduto.
setFornecedor(getFornecedorParaRemessa
());
} else {
LancadorMensagem.
lancarErro("Selecione o fornecedor");
}
List<Produto
> produtosAptos = produtoService.
consultarProdutoPorParametros(parametrosConsultaProduto
);
for (Produto produto : produtosAptos
) {
ProdutoLoja produtoLoja =
null;
if (VerificadorUtil.
naoEstaNulo(getLojaParaRemessa
())) {
produtoLoja = produtoLojaService.
consultarProdutoLoja(produto, getLojaParaRemessa
());
}
NotaFiscalProduto notaFiscalProduto =
new NotaFiscalProduto
();
notaFiscalProduto.
setProduto(produto
);
notaFiscalProduto.
setQuantidade(produtoLoja.
getQuantidadeEstoque());
notaFiscalProduto.
setNotaFiscal(getEntidade
());
notaFiscalProdutoService.
cadastrar(notaFiscalProduto
);
}
consultarNfeRemessa
(getEntidade
());
}
});
}
public void retirarEstoqueProdutos
() {
for (NotaFiscalProduto notaFiscalProduto : getEntidade
().
getListaNFRemessaProdutos()) {
notaFiscalProdutoService.
excluir(notaFiscalProduto
);
}
consultarNfeRemessa
(getEntidade
());
}
public void abrirLinkCaminhoQrcode
() {
try {
FacesContext.
getCurrentInstance().
getExternalContext().
redirect(getEntidade
().
getCaminhoQrcode());
} catch (IOException e
) {
e.
printStackTrace();
}
}
public static void main
(String[] args
) {
List<Integer> sequenciaisFornecedor =
new ArrayList<>(Arrays.
asList(29,
25,
38,
40,
37,
30,
70,
32,
34,
60,
68,
71));
for (Integer sequencialFornecedor : sequenciaisFornecedor
) {
System.
out.
println(sequencialFornecedor
);
}
}
}