Created
July 31, 2018 23:59
-
-
Save eduardoschmidtsantos/5d619c9b723fe30dd6453e660c41ccf3 to your computer and use it in GitHub Desktop.
Contrato REST
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package br.com.openpdv.rest; | |
import br.com.phdss.Util; | |
import br.com.openpdv.modelo.core.EBusca; | |
import br.com.openpdv.modelo.core.OpenPdvException; | |
import br.com.openpdv.modelo.core.filtro.*; | |
import br.com.openpdv.modelo.ecf.EcfNotaEletronica; | |
import br.com.openpdv.modelo.ecf.EcfPagamentoTipo; | |
import br.com.openpdv.modelo.produto.ProdEmbalagem; | |
import br.com.openpdv.modelo.produto.ProdProduto; | |
import br.com.openpdv.modelo.sistema.SisCliente; | |
import br.com.openpdv.modelo.sistema.SisUsuario; | |
import java.util.Date; | |
import java.util.List; | |
import javax.ws.rs.GET; | |
import javax.ws.rs.Path; | |
import javax.ws.rs.Produces; | |
import javax.ws.rs.QueryParam; | |
import javax.ws.rs.core.MediaType; | |
import javax.ws.rs.ext.Provider; | |
import org.apache.log4j.Logger; | |
/** | |
* Classe que representa a comunicao do Servidor para o Cliente via Rest | |
* | |
* @author Pedro H. Lira | |
*/ | |
@Provider | |
@Path("/openpdv/host") | |
public class RestCliente extends ARest { | |
/** | |
* Construtor padrao. | |
*/ | |
public RestCliente() { | |
super(); | |
log = Logger.getLogger(RestCliente.class); | |
} | |
@GET | |
@Produces(MediaType.TEXT_HTML) | |
@Override | |
public String ajuda() throws RestException { | |
return super.ajuda(); | |
} | |
/** | |
* Metodo que retorna o proximo numero de NFe a ser usado. | |
* | |
* @return uma string com o nuemro da NFe. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/nfe") | |
@GET | |
@Produces(MediaType.TEXT_PLAIN) | |
public String getNfe() throws RestException { | |
autorizar(); | |
try { | |
Number nfe = (Number) service.buscar(new EcfNotaEletronica(), "ecfNotaEletronicaNumero", EBusca.MAXIMO, null); | |
Integer resp; | |
if (nfe != null && nfe.intValue() > 0) { | |
resp = nfe.intValue() + 1; | |
} else { | |
resp = Integer.valueOf(Util.getConfig().getProperty("nfe.numero")) + 1; | |
} | |
return resp.toString(); | |
} catch (OpenPdvException ex) { | |
log.error(ex); | |
throw new RestException(ex); | |
} | |
} | |
/** | |
* Metodo que retorna a lista de usuario permitidos ao acesso ao sistema. | |
* | |
* @return uma lista de objetos usuario em formato JSON. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/usuario") | |
@GET | |
@Produces(MediaType.APPLICATION_JSON) | |
public List<SisUsuario> getUsuario() throws RestException { | |
autorizar(); | |
try { | |
return service.selecionar(new SisUsuario(), 0, 0, null); | |
} catch (Exception ex) { | |
log.error(ex); | |
throw new RestException(ex); | |
} | |
} | |
/** | |
* Metodo que retorna a lista de tipos de pagamento cadastrados no sistema. | |
* | |
* @return uma lista de objetos tipos de pagamento em formato JSON. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/tipo_pagamento") | |
@GET | |
@Produces(MediaType.APPLICATION_JSON) | |
public List<EcfPagamentoTipo> getPagamentoTipo() throws RestException { | |
autorizar(); | |
try { | |
return service.selecionar(new EcfPagamentoTipo(), 0, 0, null); | |
} catch (Exception ex) { | |
log.error(ex); | |
throw new RestException(ex); | |
} | |
} | |
/** | |
* Metodo que retorna a lista de embalagens cadastradas no sistema. | |
* | |
* @return uma lista de objetos embalagem em formato JSON. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/embalagem") | |
@GET | |
@Produces(MediaType.APPLICATION_JSON) | |
public List<ProdEmbalagem> getEmbalagem() throws RestException { | |
autorizar(); | |
try { | |
return service.selecionar(new ProdEmbalagem(), 0, 0, null); | |
} catch (Exception ex) { | |
log.error(ex); | |
throw new RestException(ex); | |
} | |
} | |
/** | |
* Metodo que retorna a lista de novos produtos cadastrados no sistema. | |
* | |
* @param id o ultimo id cadastro no banco do pdv. | |
* @param pagina numero da pagina de retorno dos dados comecando pelo ZERO. | |
* @param limite limite de registros a serem retornados. | |
* @return uma lista de produtos novos cadastrados no sistema. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/produtoNovo") | |
@GET | |
@Produces(MediaType.APPLICATION_JSON) | |
public List<ProdProduto> getProdutoNovo(@QueryParam("id") int id, @QueryParam("pagina") int pagina, @QueryParam("limite") int limite) throws RestException { | |
autorizar(); | |
try { | |
FiltroNumero fn = new FiltroNumero("prodProdutoId", ECompara.MAIOR, id); | |
ProdProduto prod = new ProdProduto(); | |
prod.setCampoOrdem("prodProdutoId"); | |
return service.selecionar(prod, pagina * limite, limite, fn); | |
} catch (Exception ex) { | |
log.error(ex); | |
throw new RestException(ex); | |
} | |
} | |
/** | |
* Metodo que retorna a lista de novos produtos atualizados no sistema. | |
* | |
* @param data data usada como corte para considerar produto atualizado. | |
* @param pagina numero da pagina de retorno dos dados comecando pelo ZERO. | |
* @param limite limite de registros a serem retornados. | |
* @return uma lista de produtos novos cadastrados no sistema. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/produtoAtualizado") | |
@GET | |
@Produces(MediaType.APPLICATION_JSON) | |
public List<ProdProduto> getProdutoAtualizado(@QueryParam("data") String data, @QueryParam("pagina") int pagina, @QueryParam("limite") int limite) throws RestException { | |
autorizar(); | |
try { | |
Date alterado = Util.formataData(data, "dd/MM/yyyy"); | |
Filtro filtro = null; | |
if (alterado != null) { | |
FiltroData fd1 = new FiltroData("prodProdutoAlterado", ECompara.MAIOR, alterado); | |
FiltroData fd2 = new FiltroData("prodProdutoCadastrado", ECompara.MENOR, alterado); | |
filtro = new FiltroGrupo(Filtro.E, fd1, fd2); | |
} | |
ProdProduto prod = new ProdProduto(); | |
prod.setCampoOrdem("prodProdutoAlterado"); | |
return service.selecionar(prod, pagina * limite, limite, filtro); | |
} catch (Exception ex) { | |
log.error(ex); | |
throw new RestException(ex); | |
} | |
} | |
/** | |
* Metodo que retorna a lista de cliente do sistema. | |
* | |
* @param data data usada como corte para considerar novo cliente. | |
* @param pagina numero da pagina de retorno dos dados comecando pelo ZERO. | |
* @param limite limite de registros a serem retornados. | |
* @return uma lista de objetos cliente em formato JSON. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/cliente") | |
@GET | |
@Produces(MediaType.APPLICATION_JSON) | |
public List<SisCliente> getClientes(@QueryParam("data") String data, @QueryParam("pagina") int pagina, @QueryParam("limite") int limite) throws RestException { | |
autorizar(); | |
try { | |
Date dt = Util.formataData(data, "dd/MM/yyyy"); | |
FiltroData fd = null; | |
if (dt != null) { | |
fd = new FiltroData("sisClienteData", ECompara.MAIOR_IGUAL, dt); | |
} | |
return service.selecionar(new SisCliente(), pagina * limite, limite, fd); | |
} catch (Exception ex) { | |
log.error(ex); | |
throw new RestException(ex); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package br.com.openpdv.rest; | |
import br.com.openpdv.controlador.core.Conexao; | |
import br.com.openpdv.controlador.core.NFe; | |
import br.com.openpdv.modelo.core.EComandoSQL; | |
import br.com.openpdv.modelo.core.OpenPdvException; | |
import br.com.openpdv.modelo.core.Sql; | |
import br.com.openpdv.modelo.core.filtro.ECompara; | |
import br.com.openpdv.modelo.core.filtro.FiltroData; | |
import br.com.openpdv.modelo.core.filtro.FiltroNumero; | |
import br.com.openpdv.modelo.core.filtro.FiltroObjeto; | |
import br.com.openpdv.modelo.core.filtro.FiltroTexto; | |
import br.com.openpdv.modelo.core.filtro.FiltroGrupo; | |
import br.com.openpdv.modelo.core.filtro.Filtro; | |
import br.com.openpdv.modelo.core.parametro.ParametroFormula; | |
import br.com.openpdv.modelo.core.parametro.ParametroObjeto; | |
import br.com.openpdv.modelo.ecf.*; | |
import br.com.openpdv.modelo.produto.ProdEmbalagem; | |
import br.com.openpdv.modelo.produto.ProdGrade; | |
import br.com.openpdv.modelo.produto.ProdProduto; | |
import br.com.openpdv.modelo.sistema.SisCliente; | |
import br.inf.portalfiscal.nfe.schema.nfe.TNFe; | |
import br.inf.portalfiscal.nfe.schema.nfe.TNfeProc; | |
import java.io.File; | |
import java.io.FileOutputStream; | |
import java.io.FileWriter; | |
import java.io.IOException; | |
import java.util.ArrayList; | |
import java.util.Calendar; | |
import java.util.Date; | |
import java.util.List; | |
import javax.persistence.EntityManager; | |
import javax.persistence.EntityManagerFactory; | |
import javax.ws.rs.*; | |
import javax.ws.rs.core.MediaType; | |
import javax.ws.rs.ext.Provider; | |
import org.apache.log4j.Logger; | |
/** | |
* Classe que representa a comunicao do Cliente para o Servidor via Rest | |
* | |
* @author Pedro H. Lira | |
*/ | |
@Provider | |
@Path("/openpdv/server") | |
public class RestServidor extends ARest { | |
/** | |
* Construtor padrao. | |
*/ | |
public RestServidor() { | |
super(); | |
log = Logger.getLogger(RestServidor.class); | |
} | |
@GET | |
@Produces(MediaType.TEXT_HTML) | |
@Override | |
public String ajuda() throws RestException { | |
return super.ajuda(); | |
} | |
/** | |
* Metodo que cadastra na base do server as notas de consumidor emitidas | |
* pelos sistemas em modo client. | |
* | |
* @param ecfNota um objeto do tipo Nota. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/nota") | |
@PUT | |
@Consumes(MediaType.APPLICATION_JSON) | |
public void setNota(EcfNota ecfNota) throws RestException { | |
autorizar(); | |
EntityManagerFactory emf = null; | |
EntityManager em = null; | |
try { | |
// valida se ja existe | |
FiltroTexto ft = new FiltroTexto("ecfNotaSerie", ECompara.IGUAL, ecfNota.getEcfNotaSerie()); | |
FiltroTexto ft1 = new FiltroTexto("ecfNotaSubserie", ECompara.IGUAL, ecfNota.getEcfNotaSubserie()); | |
FiltroNumero fn = new FiltroNumero("ecfNotaNumero", ECompara.IGUAL, ecfNota.getEcfNotaNumero()); | |
FiltroGrupo gf = new FiltroGrupo(Filtro.E, ft, ft1, fn); | |
EcfNota aux = (EcfNota) service.selecionar(ecfNota, gf); | |
if (aux == null) { | |
emf = Conexao.getInstancia(); | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
// identifica o cliente | |
if (ecfNota.getSisCliente() != null) { | |
SisCliente cliente = getCliente(em, ecfNota.getSisCliente()); | |
ecfNota.setSisCliente(cliente); | |
} | |
// salva a nota | |
List<EcfNotaProduto> nps = ecfNota.getEcfNotaProdutos(); | |
ecfNota.setEcfNotaProdutos(null); | |
ecfNota.setId(0); | |
ecfNota = (EcfNota) service.salvar(em, ecfNota); | |
em.getTransaction().commit(); | |
// salva os produtos vendidos | |
List<Sql> sqls = new ArrayList<>(); | |
for (EcfNotaProduto np : nps) { | |
np.setId(0); | |
np.setEcfNota(ecfNota); | |
getEstoque(sqls, np.getEcfNotaProdutoQuantidade(), np.getProdEmbalagem(), np.getProdProduto(), np.getEcfNotaProdutoBarra()); | |
} | |
service.salvar(nps); | |
// atualiza o estoque se nao cancelada | |
if (ecfNota.isEcfNotaCancelada() == false) { | |
service.executar(sqls.toArray(new Sql[]{})); | |
} | |
} | |
} catch (Exception ex) { | |
if (em != null && em.getTransaction().isActive()) { | |
em.getTransaction().rollback(); | |
} | |
log.error("Erro ao salvar a nota.", ex); | |
throw new RestException(ex.getMessage()); | |
} finally { | |
if (em != null) { | |
em.close(); | |
emf.close(); | |
} | |
} | |
} | |
/** | |
* Metodo que cadastra na base do server as nfe emitidas pelos sistemas em | |
* modo client. | |
* | |
* @param ecfNfe um objeto do tipo NFe. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/nfe") | |
@PUT | |
@Consumes(MediaType.APPLICATION_JSON) | |
public void setNfe(EcfNotaEletronica ecfNfe) throws RestException { | |
autorizar(); | |
EntityManagerFactory emf = null; | |
EntityManager em = null; | |
try { | |
FiltroTexto ft1 = new FiltroTexto("ecfNotaEletronicaChave", ECompara.IGUAL, ecfNfe.getEcfNotaEletronicaChave()); | |
EcfNotaEletronica aux = (EcfNotaEletronica) service.selecionar(ecfNfe, ft1); | |
if (aux == null) { | |
emf = Conexao.getInstancia(); | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
// identifica o cliente | |
if (ecfNfe.getSisCliente() != null) { | |
SisCliente cliente = getCliente(em, ecfNfe.getSisCliente()); | |
ecfNfe.setSisCliente(cliente); | |
} | |
// salva a nfe | |
ecfNfe.setId(0); | |
ecfNfe = (EcfNotaEletronica) service.salvar(em, ecfNfe); | |
// atualiza o estoque | |
if (ecfNfe.getEcfNotaEletronicaStatus().equals(ENotaStatus.AUTORIZADO.toString())) { | |
TNfeProc produtos = NFe.xmlToObj(ecfNfe.getEcfNotaEletronicaXml(), TNfeProc.class); | |
List<Sql> sqls = new ArrayList<>(); | |
for (TNFe.InfNFe.Det det : produtos.getNFe().getInfNFe().getDet()) { | |
// achando o produto | |
Filtro filtro; | |
if (det.getProd().getCEAN() == null || det.getProd().getCEAN().equals("")) { | |
filtro = new FiltroNumero("prodProdutoId", ECompara.IGUAL, det.getProd().getCProd()); | |
} else { | |
filtro = new FiltroTexto("prodProdutoBarra", ECompara.IGUAL, det.getProd().getCEAN()); | |
} | |
ProdProduto prod = (ProdProduto) service.selecionar(new ProdProduto(), filtro); | |
// achando a embalagem usada na venda | |
FiltroTexto ft = new FiltroTexto("prodEmbalagemNome", ECompara.IGUAL, det.getProd().getUCom()); | |
ProdEmbalagem emb = (ProdEmbalagem) service.selecionar(new ProdEmbalagem(), ft); | |
double qtd = Double.valueOf(det.getProd().getQCom()); | |
// monta a atualizacao do estoque | |
getEstoque(sqls, qtd, emb, prod, ""); | |
} | |
em.getTransaction().commit(); | |
// remove do estoque | |
service.executar(sqls.toArray(new Sql[]{})); | |
// salva o xml no arquivo | |
File xml = new File("nfe/" + ecfNfe.getEcfNotaEletronicaChave() + "-procNFe.xml"); | |
try (FileWriter fw = new FileWriter(xml)) { | |
fw.write(ecfNfe.getEcfNotaEletronicaXml()); | |
} catch (IOException io) { | |
log.error("Erro ao salvar o arquivo xml.", io); | |
} | |
// salva o danfe no arquivo | |
File danfe = new File("nfe/" + ecfNfe.getEcfNotaEletronicaChave() + "-procNFe.pdf"); | |
try (FileOutputStream fos = new FileOutputStream(danfe)) { | |
byte[] pdf = NFe.getDanfe(ecfNfe.getEcfNotaEletronicaXml()); | |
fos.write(pdf); | |
fos.flush(); | |
} catch (IOException io) { | |
log.error("Erro ao salvar o arquivo danfe.", io); | |
} | |
} else if (ecfNfe.getEcfNotaEletronicaStatus().equals(ENotaStatus.CANCELADO.toString())) { | |
TNfeProc produtos = NFe.xmlToObj(ecfNfe.getEcfNotaEletronicaXml(), TNfeProc.class); | |
List<Sql> sqls = new ArrayList<>(); | |
for (TNFe.InfNFe.Det det : produtos.getNFe().getInfNFe().getDet()) { | |
// achando o produto | |
Filtro filtro; | |
if (det.getProd().getCEAN() == null || det.getProd().getCEAN().equals("")) { | |
filtro = new FiltroNumero("prodProdutoId", ECompara.IGUAL, det.getProd().getCProd()); | |
} else { | |
filtro = new FiltroTexto("prodProdutoBarra", ECompara.IGUAL, det.getProd().getCEAN()); | |
} | |
ProdProduto prod = (ProdProduto) service.selecionar(new ProdProduto(), filtro); | |
// achando a embalagem usada na venda | |
FiltroTexto ft = new FiltroTexto("prodEmbalagemNome", ECompara.IGUAL, det.getProd().getUCom()); | |
ProdEmbalagem emb = (ProdEmbalagem) service.selecionar(new ProdEmbalagem(), ft); | |
double qtd = Double.valueOf(det.getProd().getQCom()); | |
// devolve ao estoque | |
getEstoque(sqls, -1 * qtd, emb, prod, ""); | |
} | |
em.getTransaction().commit(); | |
// remove do estoque | |
service.executar(sqls.toArray(new Sql[]{})); | |
// salva o xml no arquivo | |
File xml = new File("nfe/" + ecfNfe.getEcfNotaEletronicaChave() + "-procCanNFe.xml"); | |
try (FileWriter fw = new FileWriter(xml)) { | |
fw.write(ecfNfe.getEcfNotaEletronicaXmlCancelado()); | |
} catch (IOException io) { | |
log.error("Erro ao salvar o arquivo xml de cancelamento.", io); | |
} | |
} else if (ecfNfe.getEcfNotaEletronicaStatus().equals(ENotaStatus.INUTILIZADO.toString())) { | |
em.getTransaction().commit(); | |
// salva o xml no arquivo | |
File xml = new File("nfe/" + ecfNfe.getEcfNotaEletronicaChave() + "-procInutNFe.xml"); | |
try (FileWriter fw = new FileWriter(xml)) { | |
fw.write(ecfNfe.getEcfNotaEletronicaXml()); | |
} catch (IOException io) { | |
log.error("Erro ao salvar o arquivo xml de inutilizacao.", io); | |
} | |
} | |
} | |
} catch (Exception ex) { | |
if (em != null && em.getTransaction().isActive()) { | |
em.getTransaction().rollback(); | |
} | |
log.error("Erro ao salvar a nfe.", ex); | |
throw new RestException(ex.getMessage()); | |
} finally { | |
if (em != null) { | |
em.close(); | |
emf.close(); | |
} | |
} | |
} | |
/** | |
* Metodo que cadastra na base do server os clientesclieados pelos sistemas | |
* em modo client. | |
* | |
* @param cliente um objeto do tipo SisCliente. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/cliente") | |
@PUT | |
@Consumes(MediaType.APPLICATION_JSON) | |
public void setCliente(SisCliente cliente) throws RestException { | |
autorizar(); | |
EntityManagerFactory emf = null; | |
EntityManager em = null; | |
try { | |
emf = Conexao.getInstancia(); | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
getCliente(em, cliente); | |
em.getTransaction().commit(); | |
} catch (Exception ex) { | |
if (em != null && em.getTransaction().isActive()) { | |
em.getTransaction().rollback(); | |
} | |
log.error("Erro ao salvar cliente.", ex); | |
throw new RestException(ex.getMessage()); | |
} finally { | |
if (em != null) { | |
em.close(); | |
emf.close(); | |
} | |
} | |
} | |
/** | |
* Metodo que cadastra na base do server as vendas, produtos vendidos, | |
* pagamentos emitidos pelos sistemas em modo client. | |
* | |
* @param venda um objeto do tipo Venda. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/venda") | |
@PUT | |
@Consumes(MediaType.APPLICATION_JSON) | |
public void setVenda(EcfVenda venda) throws RestException { | |
autorizar(); | |
EntityManagerFactory emf = null; | |
EntityManager em = null; | |
try { | |
emf = Conexao.getInstancia(); | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
// pega a impressora correta no sistema | |
EcfImpressora imp = getImp(venda.getEcfImpressora().getEcfImpressoraSerie()); | |
venda.setEcfImpressora(imp); | |
// identifica o cliente | |
if (venda.getSisCliente() != null) { | |
SisCliente cliente = getCliente(em, venda.getSisCliente()); | |
venda.setSisCliente(cliente); | |
} | |
// guarda os produtos vendidos , pagamentos e trocas | |
List<EcfVendaProduto> vps = venda.getEcfVendaProdutos(); | |
List<EcfPagamento> pags = venda.getEcfPagamentos(); | |
List<EcfTroca> trocas = venda.getEcfTrocas(); | |
List<Sql> sqls = new ArrayList<>(); | |
// caso a venda esteja cancelada e ja estava salva no servidor | |
if (venda.getEcfVendaCancelada()) { | |
// filtro pra deletar a venda ja salva antes | |
FiltroObjeto fo = new FiltroObjeto("ecfImpressora", ECompara.IGUAL, imp); | |
FiltroNumero fn = new FiltroNumero("ecfVendaCcf", ECompara.IGUAL, venda.getEcfVendaCcf()); | |
FiltroNumero fn1 = new FiltroNumero("ecfVendaCoo", ECompara.IGUAL, venda.getEcfVendaCoo()); | |
FiltroGrupo gf = new FiltroGrupo(Filtro.E, fo, fn, fn1); | |
// executa o comando | |
Sql sql = new Sql(venda, EComandoSQL.EXCLUIR, gf); | |
List<Integer> resp = service.executar(sql); | |
// caso ja exista e tenha deletado, remove do estoque | |
if (resp.get(0) == 1) { | |
for (EcfVendaProduto vp : vps) { | |
if (!vp.getEcfVendaProdutoCancelado()) { | |
getEstoque(sqls, vp.getEcfVendaProdutoQuantidade() * -1, vp.getProdEmbalagem(), vp.getProdProduto(), vp.getEcfVendaProdutoBarra()); | |
} | |
} | |
} | |
} | |
// salva a venda | |
venda.setId(0); | |
venda.setEcfVendaProdutos(null); | |
venda.setEcfPagamentos(null); | |
venda.setEcfTrocas(null); | |
venda = (EcfVenda) service.salvar(em, venda); | |
// salva os produtos e atualiza o estoque | |
for (EcfVendaProduto vp : vps) { | |
vp.setId(0); | |
vp.setEcfVenda(venda); | |
vp = (EcfVendaProduto) service.salvar(em, vp); | |
if (!venda.getEcfVendaCancelada() && !vp.getEcfVendaProdutoCancelado()) { | |
getEstoque(sqls, vp.getEcfVendaProdutoQuantidade(), vp.getProdEmbalagem(), vp.getProdProduto(), vp.getEcfVendaProdutoBarra()); | |
} | |
} | |
// atualiza com as instrucoes SQL. | |
for (Sql sql : sqls) { | |
service.executar(em, sql); | |
} | |
em.getTransaction().commit(); | |
em.getTransaction().begin(); | |
if (!venda.getEcfVendaCancelada()) { | |
// salva os pagamentos | |
for (EcfPagamento pag : pags) { | |
pag.setEcfVenda(venda); | |
salvarPagamento(em, pag); | |
} | |
// salva as trocas | |
if (trocas != null) { | |
for (EcfTroca troca : trocas) { | |
troca.setEcfVenda(venda); | |
salvarTroca(em, troca); | |
} | |
} | |
} | |
em.getTransaction().commit(); | |
} catch (Exception ex) { | |
if (em != null && em.getTransaction().isActive()) { | |
em.getTransaction().rollback(); | |
} | |
log.error("Erro ao salvar venda.", ex); | |
throw new RestException(ex.getMessage()); | |
} finally { | |
if (em != null) { | |
em.close(); | |
emf.close(); | |
} | |
} | |
} | |
/** | |
* Metodo que cadastra na base do server as reducoes Z, totais, documentos | |
* emitidos pelos sistemas em modo client. | |
* | |
* @param ecfZ um objeto do tipo ReducaoZ com a lista de documentos anexada. | |
* @throws RestException em caso de nao conseguir acessar a informacao. | |
*/ | |
@Path("/reducaoZ") | |
@PUT | |
@Consumes(MediaType.APPLICATION_JSON) | |
public void setReducaoZ(EcfZ ecfZ) throws RestException { | |
autorizar(); | |
EntityManagerFactory emf = null; | |
EntityManager em = null; | |
try { | |
// pega a impressora correta no sistema | |
EcfImpressora imp = getImp(ecfZ.getEcfImpressora().getEcfImpressoraSerie()); | |
// valida se ja existe | |
FiltroObjeto fo = new FiltroObjeto("ecfImpressora", ECompara.IGUAL, imp); | |
FiltroNumero fn = new FiltroNumero("ecfZCrz", ECompara.IGUAL, ecfZ.getEcfZCrz()); | |
FiltroGrupo gf = new FiltroGrupo(Filtro.E, fo, fn); | |
EcfZ aux = (EcfZ) service.selecionar(ecfZ, gf); | |
if (aux == null) { | |
emf = Conexao.getInstancia(); | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
// guarda os totais e vendas e docs | |
List<EcfZTotais> totais = ecfZ.getEcfZTotais(); | |
List<EcfDocumento> docs = ecfZ.getEcfDocumentos(); | |
// salva a reduzaoZ | |
ecfZ.setId(0); | |
ecfZ.setEcfImpressora(imp); | |
ecfZ.setEcfZTotais(null); | |
ecfZ.setEcfVendas(null); | |
ecfZ.setEcfDocumentos(null); | |
ecfZ = (EcfZ) service.salvar(em, ecfZ); | |
// salva os totais | |
for (EcfZTotais tot : totais) { | |
tot.setEcfZ(ecfZ); | |
tot.setId(0); | |
service.salvar(em, tot); | |
} | |
// salva os documentos | |
for (EcfDocumento doc : docs) { | |
doc.setEcfImpressora(imp); | |
doc.setEcfZ(ecfZ); | |
doc.setId(0); | |
service.salvar(em, doc); | |
} | |
// atualiza as vendas | |
Calendar cal = Calendar.getInstance(); | |
cal.setTime(ecfZ.getEcfZMovimento()); | |
cal.add(Calendar.DAY_OF_MONTH, 1); | |
Date fim = cal.getTime(); | |
FiltroData fd = new FiltroData("ecfVendaData", ECompara.MAIOR_IGUAL, ecfZ.getEcfZMovimento()); | |
FiltroData fd1 = new FiltroData("ecfVendaData", ECompara.MENOR, fim); | |
FiltroGrupo gf1 = new FiltroGrupo(Filtro.E, fo, fd, fd1); | |
ParametroObjeto po = new ParametroObjeto("ecfZ", ecfZ); | |
Sql sql = new Sql(new EcfVenda(), EComandoSQL.ATUALIZAR, gf1, po); | |
service.executar(em, sql); | |
em.getTransaction().commit(); | |
} | |
} catch (Exception ex) { | |
if (em != null && em.getTransaction().isActive()) { | |
em.getTransaction().rollback(); | |
} | |
log.error("Erro ao salvar reduzao Z.", ex); | |
throw new RestException(ex.getMessage()); | |
} finally { | |
if (em != null) { | |
em.close(); | |
emf.close(); | |
} | |
} | |
} | |
/** | |
* Metodo que salva a troca no sistema fazendo as validacoes. | |
* | |
* @param em um objeto de transacao. | |
* @param troca o objeto de troca. | |
* @throws OpenPdvException dispara em caso de erro ao salvar. | |
*/ | |
private void salvarTroca(EntityManager em, EcfTroca troca) throws OpenPdvException { | |
// guarda os produtos da troca | |
List<EcfTrocaProduto> tps = troca.getEcfTrocaProdutos(); | |
// salva a troca | |
troca.setId(0); | |
troca.setEcfTrocaProdutos(null); | |
troca = (EcfTroca) service.salvar(em, troca); | |
// salva os produtos da troca e atualiza o estoque | |
for (EcfTrocaProduto tp : tps) { | |
tp.setId(0); | |
tp.setEcfTroca(troca); | |
service.salvar(em, tp); | |
} | |
} | |
/** | |
* Metodo que salva os pagamentos no sistema fazendo as validacoes. | |
* | |
* @param em um objeto de transacao. | |
* @param pag o objeto de pagamento. | |
* @throws OpenPdvException dispara em caso de erro ao salvar. | |
*/ | |
private void salvarPagamento(EntityManager em, EcfPagamento pag) throws OpenPdvException { | |
// guarda as parcelas | |
List<EcfPagamentoParcela> parcelas = pag.getEcfPagamentoParcelas(); | |
// salva o pagamento | |
pag.setId(0); | |
pag.setEcfPagamentoParcelas(null); | |
pag = (EcfPagamento) service.salvar(em, pag); | |
// salva as parcelas | |
for (EcfPagamentoParcela parcela : parcelas) { | |
parcela.setEcfPagamento(pag); | |
parcela.setId(0); | |
service.salvar(em, parcela); | |
} | |
} | |
/** | |
* Metodo que encontra o cliente dentro do sistema usando os dados do | |
* cliente enviado, como o CNPJ. | |
* | |
* @param em um objeto de transacao. | |
* @param sisCliente o obejto de cliente. | |
* @return o cliente encontrado nesta base de dados. | |
* @throws OpenPdvException dispara em caso de erro ao selecionar. | |
*/ | |
private SisCliente getCliente(EntityManager em, SisCliente sisCliente) { | |
try { | |
FiltroTexto ft = new FiltroTexto("sisClienteDoc", ECompara.IGUAL, sisCliente.getSisClienteDoc().replaceAll("\\D", "")); | |
SisCliente aux = (SisCliente) service.selecionar(sisCliente, ft); | |
// se existir atualiza, senao cria um novo | |
sisCliente.setId(aux != null ? aux.getSisClienteId() : 0); | |
sisCliente.setSisClienteSinc(true); | |
return (SisCliente) service.salvar(em, sisCliente); | |
} catch (OpenPdvException ex) { | |
return null; | |
} | |
} | |
/** | |
* Metodo que gera o SQL de atualizacao do estoque para as vendas recebidas. | |
* | |
* @param qtd a quantidade de produtos vendidos. | |
* @param emb o tipo de embalagem usada na venda. | |
* @param prod o produto que foi vendido. | |
* @param barra o codigo escolhido na hora da venda. | |
* @return uma instrucao de SQL no formato de objeto para ser executada. | |
* @throws CoreException dispara caso nao consiga gerar o sql de | |
* atualizacao. | |
*/ | |
private void getEstoque(List<Sql> sqls, double qtd, ProdEmbalagem emb, ProdProduto prod, String barra) throws OpenPdvException { | |
// fatorando a quantida no estoque | |
if (emb.getProdEmbalagemId() != prod.getProdEmbalagem().getProdEmbalagemId()) { | |
qtd *= emb.getProdEmbalagemUnidade(); | |
qtd /= prod.getProdEmbalagem().getProdEmbalagemUnidade(); | |
} | |
// atualiza o estoque | |
ParametroFormula pf = new ParametroFormula("prodProdutoEstoque", -1 * qtd); | |
FiltroNumero fn1 = new FiltroNumero("prodProdutoId", ECompara.IGUAL, prod.getId()); | |
Sql sql = new Sql(new ProdProduto(), EComandoSQL.ATUALIZAR, fn1, pf); | |
sqls.add(sql); | |
// remove estoque da grade caso o produto tenha | |
if (prod.getProdGrades() != null) { | |
// formando os parametros e filtros | |
ParametroFormula pf2 = new ParametroFormula("prodGradeEstoque", -1 * qtd); | |
FiltroObjeto fo = new FiltroObjeto("prodProduto", ECompara.IGUAL, prod); | |
FiltroTexto ft = new FiltroTexto("prodGradeBarra", ECompara.IGUAL, barra); | |
FiltroGrupo gf1 = new FiltroGrupo(Filtro.E, fo, ft); | |
// busca o item | |
Sql sql1 = new Sql(new ProdGrade(), EComandoSQL.ATUALIZAR, gf1, pf2); | |
sqls.add(sql1); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment