/**
* <p>Title: T2Ti ERP</p>
* <p>Description: PAF-ECF + TEF - Regras de negócio/persistência da Venda.</p>
*
* <p>The MIT License</p>
*
* <p>Copyright: Copyright (C) 2010 T2Ti.COM</p>
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* The author may be contacted at:
* t2ti.com@gmail.com</p>
*
* @author Albert Eije (T2Ti.COM)
* @version 1.0
*/
package com.t2tierp.pafecf.controller;
import com.t2tierp.pafecf.bd.AcessoBanco;
import com.t2tierp.pafecf.infra.Ecf;
import com.t2tierp.pafecf.vo.VendaCabecalhoVO;
import com.t2tierp.pafecf.vo.VendaDetalheVO;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class VendaController {
String consultaSQL;
Statement stm;
PreparedStatement pstm;
ResultSet rs;
AcessoBanco bd = new AcessoBanco();
public VendaCabecalhoVO iniciaVenda(VendaCabecalhoVO pVendaCabecalho) {
consultaSQL =
"insert into ECF_VENDA_CABECALHO ("
+ "STATUS_VENDA,"
+ "ID_ECF_MOVIMENTO,"
+ "ID_CFOP,"
+ "COO,"
+ "CCF,"
+ "ID_CLIENTE,"
+ "NOME_CLIENTE,"
+ "CPF_CNPJ_CLIENTE,"
+ "DATA_HORA_VENDA) values ("
+ "?,?,?,?,?,?,?,?,?)";
try {
pstm = bd.conectar().prepareStatement(consultaSQL);
pstm.setString(1, pVendaCabecalho.getStatusVenda());
pstm.setInt(2, pVendaCabecalho.getIdMovimento());
pstm.setInt(3, pVendaCabecalho.getIdCFOP());
pstm.setInt(4, pVendaCabecalho.getCOO());
pstm.setInt(5, pVendaCabecalho.getCCF());
if (pVendaCabecalho.getIdCliente() != null) {
pstm.setInt(6, pVendaCabecalho.getIdCliente());
} else {
pstm.setNull(6, java.sql.Types.INTEGER);
}
if (pVendaCabecalho.getNomeCliente() != null) {
pstm.setString(7, pVendaCabecalho.getNomeCliente());
} else {
pstm.setNull(7, java.sql.Types.VARCHAR);
}
if (pVendaCabecalho.getCPFouCNPJCliente() != null) {
pstm.setString(8, pVendaCabecalho.getCPFouCNPJCliente());
} else {
pstm.setNull(8, java.sql.Types.VARCHAR);
}
pstm.setTimestamp(9, pVendaCabecalho.getDataHoraVenda());
pstm.executeUpdate();
try {
stm = bd.conectar().createStatement();
rs = stm.executeQuery("select max(ID) as ID from ECF_VENDA_CABECALHO");
rs.first();
pVendaCabecalho.setId(rs.getInt("ID"));
return pVendaCabecalho;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
bd.desconectar();
}
}
public VendaDetalheVO inserirItem(VendaDetalheVO pVendaDetalhe) {
consultaSQL =
"insert into ECF_VENDA_DETALHE ("
+ "ID_CFOP,"
+ "ID_ECF_TRIBUTO_PRODUTO,"
+ "ID_ECF_PRODUTO,"
+ "ID_ECF_VENDA_CABECALHO,"
+ "ITEM,"
+ "QUANTIDADE,"
+ "VALOR_UNITARIO,"
+ "VALOR_TOTAL,"
+ "TOTALIZADOR_PARCIAL,"
+ "CST,"
+ "MOVIMENTA_ESTOQUE) values ("
+ "?,?,?,?,?,?,?,?,?,?,?)";
//TODO : Como se calcula a base e o valor do ICMS?
//TODO : Como é feito o calculo dos demais impostos?
//TODO : Devemos ratear o desconto para os itens? Como fazer isso?
try {
pstm = bd.conectar().prepareStatement(consultaSQL);
pstm.setInt(1, pVendaDetalhe.getIdCFOP());
pstm.setInt(2, pVendaDetalhe.getIdTributo());
pstm.setInt(3, pVendaDetalhe.getIdProduto());
pstm.setInt(4, pVendaDetalhe.getIdVendaCabecalho());
pstm.setInt(5, pVendaDetalhe.getItem());
pstm.setDouble(6, pVendaDetalhe.getQuantidade());
pstm.setDouble(7, pVendaDetalhe.getValorUnitario());
pstm.setDouble(8, pVendaDetalhe.getValorTotal());
pstm.setString(9, pVendaDetalhe.getTotalizadorParcial());
pstm.setString(10, pVendaDetalhe.getCST());
pstm.setString(11, pVendaDetalhe.getMovimentaEstoque());
pstm.executeUpdate();
return pVendaDetalhe;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
bd.desconectar();
}
}
public void encerraVenda(VendaCabecalhoVO pVendaCabecalho) {
//TODO : Como se calcula a base e o valor do ICMS?
consultaSQL =
"update ECF_VENDA_CABECALHO set "
+ "VALOR_VENDA=?, "
+ "TOTAL_PRODUTOS=?, "
+ "TOTAL_DOCUMENTO=?, "
+ "BASE_ICMS=?, "
+ "VALOR_FINAL=?, "
+ "VALOR_RECEBIDO=?, "
+ "TAXA_DESCONTO=?, "
+ "DESCONTO=?, "
+ "TAXA_ACRESCIMO=?, "
+ "ACRESCIMO=?, "
+ "TROCO=?, "
+ "ID_ECF_DAV=?, "
+ "ID_ECF_PRE_VENDA_CABECALHO=?, "
+ "STATUS_VENDA=?, "
+ "ID_ECF_FUNCIONARIO=? "
+ " where ID = ?";
//TODO : Como é feito o calculo dos demais impostos?
try {
pstm = bd.conectar().prepareStatement(consultaSQL);
pstm.setDouble(1, pVendaCabecalho.getValorVenda());
pstm.setDouble(2, pVendaCabecalho.getTotalProdutos());
pstm.setDouble(3, pVendaCabecalho.getTotalDocumento());
pstm.setDouble(4, pVendaCabecalho.getBaseICMS());
pstm.setDouble(5, pVendaCabecalho.getValorFinal());
pstm.setDouble(6, pVendaCabecalho.getValorRecebido());
pstm.setDouble(7, pVendaCabecalho.getTaxaDesconto());
pstm.setDouble(8, pVendaCabecalho.getDesconto());
pstm.setDouble(9, pVendaCabecalho.getTaxaAcrescimo());
pstm.setDouble(10, pVendaCabecalho.getAcrescimo());
pstm.setDouble(11, pVendaCabecalho.getTroco());
if (pVendaCabecalho.getIdDAV() != null) {
pstm.setInt(12, pVendaCabecalho.getIdDAV());
DAVController DAVControl = new DAVController();
DAVControl.fechaDAV(pVendaCabecalho.getIdDAV(), pVendaCabecalho.getCCF(), pVendaCabecalho.getCOO());
} else {
pstm.setNull(12, java.sql.Types.INTEGER);
}
if (pVendaCabecalho.getIdPreVenda() != null) {
pstm.setInt(13, pVendaCabecalho.getIdPreVenda());
PreVendaController preVendaControl = new PreVendaController();
preVendaControl.fechaPreVenda(pVendaCabecalho.getIdPreVenda(), pVendaCabecalho.getCCF());
} else {
pstm.setNull(13, java.sql.Types.INTEGER);
}
pstm.setString(14, "F");
if (pVendaCabecalho.getIdVendedor() != null) {
pstm.setInt(15, pVendaCabecalho.getIdVendedor());
} else {
pstm.setNull(15, java.sql.Types.INTEGER);
}
pstm.setInt(16, pVendaCabecalho.getId());
pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
bd.desconectar();
}
}
public List<VendaDetalheVO> vendaAberta() {
//verifica se existe alguma venda aberta
consultaSQL =
"select count(*) as TOTAL from ECF_VENDA_CABECALHO where STATUS_VENDA = 'A'";
try {
stm = bd.conectar().createStatement();
rs = stm.executeQuery(consultaSQL);
rs.first();
Integer totalRegistros = rs.getInt("TOTAL");
if (totalRegistros > 0) {
//verifica se existem itens para a venda aberta
consultaSQL =
"select C.ID as CID, D.ID as DID, C.STATUS_VENDA, D.ID_ECF_PRODUTO, "
+ "D.QUANTIDADE, D.VALOR_UNITARIO, C.CPF_CNPJ_CLIENTE, "
+ "D.VALOR_TOTAL, D.ID_ECF_TRIBUTO_PRODUTO, D.ID_CFOP, P.GTIN, P.ID "
+ "from ECF_VENDA_CABECALHO C LEFT JOIN ECF_VENDA_DETALHE D ON C.ID=D.ID_ECF_VENDA_CABECALHO, PRODUTO P "
+ "where C.STATUS_VENDA = 'A' and D.CANCELADO is null and D.ID_ECF_PRODUTO=P.ID";
List<VendaDetalheVO> listaVendaDetalhe = new ArrayList<VendaDetalheVO>();
stm = bd.conectar().createStatement();
rs = stm.executeQuery(consultaSQL);
rs.beforeFirst();
while (rs.next()) {
VendaDetalheVO vendaDetalhe = new VendaDetalheVO();
vendaDetalhe.setId(rs.getInt("DID"));
vendaDetalhe.setIdVendaCabecalho(rs.getInt("CID"));
vendaDetalhe.setIdCFOP(rs.getInt("ID_CFOP"));
vendaDetalhe.setIdProduto(rs.getInt("ID_ECF_PRODUTO"));
vendaDetalhe.setIdTributo(rs.getInt("ID_ECF_TRIBUTO_PRODUTO"));
vendaDetalhe.setQuantidade(rs.getDouble("QUANTIDADE"));
vendaDetalhe.setValorUnitario(rs.getDouble("VALOR_UNITARIO"));
vendaDetalhe.setValorTotal(rs.getDouble("VALOR_TOTAL"));
vendaDetalhe.setGTIN(rs.getString("GTIN"));
vendaDetalhe.setIdentificacaoCliente(rs.getString("CPF_CNPJ_CLIENTE"));
listaVendaDetalhe.add(vendaDetalhe);
}
//caso existam itens, continua com a recuperação da venda
if (listaVendaDetalhe.size() > 0) {
return listaVendaDetalhe;
} //caso tenha sido aberto um cupom, mas não tenha sido inserido nenhum item
//altera o status da venda para cancelado e chama o método para cancelamento do cupom
else {
consultaSQL =
"update ECF_VENDA_CABECALHO set STATUS_VENDA='C' "
+ " where STATUS_VENDA = 'A'";
try {
pstm = bd.conectar().prepareStatement(consultaSQL);
pstm.executeUpdate();
Ecf.cancelaCupom();
return null;
} catch (Exception e) {
//TODO : Pode ocorrer algum erro nessa ocasião?
return null;
}
}
//caso não exista uma venda aberta, retorna um ponteiro nulo
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
bd.desconectar();
}
}
public void cancelaVenda(VendaCabecalhoVO pVendaCabecalho) {
consultaSQL =
"update ECF_VENDA_CABECALHO set "
+ "STATUS_VENDA=?, "
+ "VALOR_VENDA=?, "
+ "VALOR_CANCELADO=? "
+ " where ID = ?";
try {
pstm = bd.conectar().prepareStatement(consultaSQL);
pstm.setString(1, "C");
pstm.setDouble(2, pVendaCabecalho.getValorVenda());
pstm.setDouble(3, pVendaCabecalho.getValorCancelado());
pstm.setInt(4, pVendaCabecalho.getId());
pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
bd.desconectar();
}
}
public void cancelaItem(VendaDetalheVO pVendaDetalhe) {
consultaSQL =
"update ECF_VENDA_DETALHE set "
+ "CANCELADO=? "
+ " where ID = ?";
try {
pstm = bd.conectar().prepareStatement(consultaSQL);
pstm.setString(1, pVendaDetalhe.getCancelado());
pstm.setInt(2, pVendaDetalhe.getId());
pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
bd.desconectar();
}
}
}