package labsis.logistica.dao;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import labsis.DataBase;
import labsis.logistica.model.Cotacao;
import labsis.logistica.model.PedidoCompra;
import labsis.logistica.model.Produto;
public class DaoPedidoCompra {
private Connection conn;
public DaoPedidoCompra() throws SQLException {
DataBase db = DataBase.getDb();
conn = db.getConnection();
}
private String getStatusName(int id) throws SQLException {
PreparedStatement ps = conn.prepareStatement("select nome from statuspedido where id = ?");
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if(rs.next()) return rs.getString(1);
return null;
}
public String nomeFornecedor(String cnpj) throws SQLException {
PreparedStatement ps = conn.prepareStatement("select nome from Fornecedor where cnpj = ?");
ps.setString(1, cnpj);
ResultSet rs = ps.executeQuery();
if(rs.next()) return rs.getString(1);
return null;
}
private void updateValorTotal(int id, float vt) throws SQLException {
PreparedStatement ps = conn.prepareStatement("update PedidoCompra set valorTotal = ? where id = ?");
ps.setFloat(1, vt);
ps.setInt(2, id);
ps.executeUpdate();
}
public void salvarPedidoDeCompra(PedidoCompra pedidoCompra) {
try{
CallableStatement salvaPedidoCompra = conn.prepareCall("exec inserirPedidoCompra ?,?,?,?,?");
CallableStatement salvaProdutosDoPedido = conn.prepareCall("exec inserirPedidoCompraItem ?,?,?");
salvaPedidoCompra.registerOutParameter(1, java.sql.Types.INTEGER);
salvaPedidoCompra.setString(2, pedidoCompra.getFornecedorCnpj());
salvaPedidoCompra.setDate(3, pedidoCompra.getDataCompra());
salvaPedidoCompra.setFloat(4, pedidoCompra.getValorTotal());
salvaPedidoCompra.setInt(5, pedidoCompra.getStatusPedido());
salvaPedidoCompra.executeUpdate();
int pedidoCompraId = salvaPedidoCompra.getInt(1);
float precoTotal = Float.parseFloat("0");
Iterator<Entry<Produto, Integer>> it = pedidoCompra.getProdutos().entrySet().iterator();
while (it.hasNext()){
Entry<Produto, Integer> e = it.next();
int qtd = e.getValue();
Produto p = e.getKey();
DaoCotacao daoC = new DaoCotacao();
ArrayList<Cotacao> listCotacao = new ArrayList<Cotacao>();
listCotacao = daoC.listaCotacao(pedidoCompra.getFornecedorCnpj(), p.getId());
float precoDeCompra = listCotacao.get(0).getPreco();
salvaProdutosDoPedido.setInt(1, pedidoCompraId);
salvaProdutosDoPedido.setInt(2, e.getKey().getId());
salvaProdutosDoPedido.setInt(3, qtd);
precoTotal += precoDeCompra * qtd;
salvaProdutosDoPedido.executeUpdate();
}
updateValorTotal(pedidoCompraId, precoTotal);
salvaPedidoCompra.close();
salvaProdutosDoPedido.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
public HashMap<Produto, Integer> listaProdutosCompra(int idCompra) throws SQLException {
CallableStatement ct= conn.prepareCall("exec listarProdutosCompra ?");
ct.setInt(1, idCompra);
ResultSet rs = ct.executeQuery();
HashMap<Produto, Integer> listaProdutosCompra = new HashMap<Produto, Integer>();
while(rs.next()) {
DaoProduto daoProduto = new DaoProduto();
Produto p = daoProduto.getProduto(rs.getInt("produtoId"));
listaProdutosCompra.put(p, rs.getInt("quantidadeProduto"));
}
return listaProdutosCompra;
}
public ArrayList<PedidoCompra> listaPedidosCompra(int statusId) throws SQLException {
CallableStatement ct = conn.prepareCall("exec listarPedidosCompra @statusid=?");
ct.setInt(1, statusId);
ResultSet rs = ct.executeQuery();
ArrayList<PedidoCompra> listaPedidoCompra = new ArrayList<PedidoCompra>();
while(rs.next()) {
PedidoCompra pc = new PedidoCompra();
pc.setDataCompra(Date.valueOf(rs.getString("dataDaCompra").substring(0, 10)));
pc.setValorTotal(rs.getFloat("valorTotal"));
pc.setFornecedorCnpj(rs.getString("fornecedorCnpj"));
pc.setNomeFornecedor(nomeFornecedor(rs.getString("fornecedorCnpj")));
pc.setId(rs.getInt("id"));
pc.setStatusIdName(getStatusName(rs.getInt("statusid")));
pc.setProdutos(this.listaProdutosCompra(rs.getInt("id")));
pc.setStatusPedido(rs.getInt("statusid"));
listaPedidoCompra.add(pc);
}
return listaPedidoCompra;
}
}