package nativa.view.reports;
import java.sql.Date;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import nativa.facade.AvaliacaoFCD;
import nativa.facade.ProdutoFCD;
import nativa.model.Avaliacao;
import nativa.model.Produto;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;
/**
*
* @author bolivar
*/
public class TableModelAvaliacoesProduto extends AbstractTableModel {
private Produto produto;
private List<Avaliacao> dados;
private String[] columnNames = {"Data", "Custo MO", "Custo MP", "Outros", "Total", "Unitário"};
// ==============================================================
// Construtores.
// ==============================================================
public TableModelAvaliacoesProduto() {
// no construtor, instanciamos o List
dados = new ArrayList<Avaliacao>();
}
public TableModelAvaliacoesProduto(List<Avaliacao> lista) {
this(); // chama construtor anterior
dados.addAll(lista);
}
public TableModelAvaliacoesProduto(Produto p) {
// start this lista dados
this();
/// carrega avaliacoes do produto na lista de dados
dados.addAll(new AvaliacaoFCD().selectAvaliacoesDoProduto(p));
// seta produto pra usar no getValueAt
produto = p;
}
// ==============================================================
// Métodos implementados.
// ==============================================================
@Override
public Class<?> getColumnClass(int coluna) {
return String.class;
}
@Override
public int getColumnCount() {
// esse método deve retornar o número de colunas.
return columnNames.length;
}
@Override
public String getColumnName(int coluna) {
// retorna o nome das colunas
return columnNames[coluna];
}
@Override
public int getRowCount() {
// retorna o número de linhas, ou seja, a quantidade de entradas na
// nossa lista.
return dados.size();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// permitir editar o conteudo das celulas
return true;
}
@Override
public Object getValueAt(int linha, int coluna) {
ProdutoFCD fcdP = new ProdutoFCD();
// get avaliacao
Avaliacao aval = dados.get(linha);
// formatador pra dinheiro brasil
DecimalFormat DINHEIRO_REAL = new DecimalFormat("¤ ###,###,##0.00",
new DecimalFormatSymbols(
new Locale("pt", "BR")));
// façamos um switch, como tem "return" nao precisa "break"
switch (coluna) {
case 0: // data
return new SimpleDateFormat("dd/MM/yyyy").format(aval.getAvaData());
case 1: // Custo Mao-de-obra
return DINHEIRO_REAL.format(fcdP.custoMaoDeObra(produto, aval));
case 2: // Custo da Materia-prima
return DINHEIRO_REAL.format(aval.getAvaCustoMp());
case 3: // Custos Indiretos - Gastos - Outros
return DINHEIRO_REAL.format(aval.getAvaGastos());
case 4: // Custo Total do Produto na Avaliacao
return DINHEIRO_REAL.format(fcdP.custoProdutoAvaliacao(produto, aval));
case 5: // Custo da Unidade Produzida = Qtde Saida Ultima Tarefa / Custo Total
return DINHEIRO_REAL.format(fcdP.custoUnitario(produto, aval));
default:
return ""; // isso nunca deve ocorrer
}
}
@Override
public void setValueAt(Object valor, int linha, int coluna) {
try {
// aqui devemos atualizar o valor de avaliacao
// vemos em qual linha ele está
Avaliacao objeto = dados.get(linha);
// e vemos o que será atualizado
switch (coluna) {
case 0: // data
objeto.setAvaData(Date.valueOf(valor.toString()));
break;
case 1: // Custo Mao-de-obra por hora
objeto.setAvaCustoMoph(Double.parseDouble(valor.toString()));
break;
case 2: // Custo da Materia-prima
objeto.setAvaCustoMp(Double.parseDouble(valor.toString()));
break;
case 3: // Custos Indiretos - Gastos - Outros
objeto.setAvaGastos(Double.parseDouble(valor.toString()));
break;
case 4: // Custo Total do Produto na Avaliacao
System.out.println("*** Tentou setar valor para custo total da producao AvaliacoesCustoTableModel");
break;
case 5:
// Custo Unitário do Produto FInal
System.out.println("*** Tentou setar valor para custo unitário produto AvaliacoesCustoTableModel");
break;
default:
System.out.println("Entrada invalida! Revisar setValueAt() em AvaliacoesCustoTableModel");
}
// é importante notificar os listeners a cada alteração
fireTableDataChanged();
} catch (Exception ex) {
System.out.println("### Exception - setValueAt: " + ex.getMessage());
}
}
/**
* retorna aval de uma linha
*/
public Avaliacao get(int linha) {
return dados.get(linha);
}
/**
* Esvazia a lista.
*/
public void limpaLista() {
int i = dados.size();
dados.clear();
fireTableRowsDeleted(0, i - 1);
}
// Criar uma nova Lista para os dados a serem impressos
// com objetos Print
public List<Print> carregaDadosPrint() {
List<Print> list = new ArrayList<Print>();
int rows = getRowCount();
try {
for (int row = 0; row < rows; row++) {
Print p = new Print();
p.setData(getValueAt(row, 0).toString());
p.setCustomo(getValueAt(row, 1).toString());
p.setCustomp(getValueAt(row, 2).toString());
p.setOutros(getValueAt(row, 3).toString());
p.setTotal(getValueAt(row, 4).toString());
p.setUnitario(getValueAt(row, 5).toString());
list.add(p);
}
} catch (Exception e) {
System.out.println("#--------------# erro: " + e.getMessage());
}
return list;
}
/**
* Imprimir dados com relatório Ireport
*/
public void imprimir() {
List<Print> printList = carregaDadosPrint();
try {
// Criar um Jasper Callection
JRBeanCollectionDataSource jrs = new JRBeanCollectionDataSource(printList);
// Criar um mapa de parametros, caso seja necessario
Map parametros = new HashMap();
parametros.put("NOME_PRODUTO", produto.getProNome());
parametros.put("CUSTO_MEDIO_PRODUTO", new ProdutoFCD().custoMedio(produto));
// Gerar o JasperPrint = Dados a serem impressos
JasperPrint jpr = JasperFillManager.fillReport("/home/bolivar/NetBeansProjects/Nativa/src/nativa/view/reports/CustoProduto2.jasper", parametros, jrs);
// Visualiza em Tela através do JasperViewer
JasperViewer.viewReport(jpr, false);
} catch (JRException je) {
je.printStackTrace();
JOptionPane.showMessageDialog(null, je.getMessage());
}
}
public class Print {
private String data;
private String customo;
private String customp;
private String outros;
private String total;
private String unitario;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getCustomo() {
return customo;
}
public void setCustomo(String customo) {
this.customo = customo;
}
public String getCustomp() {
return customp;
}
public void setCustomp(String customp) {
this.customp = customp;
}
public String getOutros() {
return outros;
}
public void setOutros(String outros) {
this.outros = outros;
}
public String getTotal() {
return total;
}
public void setTotal(String total) {
this.total = total;
}
public String getUnitario() {
return unitario;
}
public void setUnitario(String unitario) {
this.unitario = unitario;
}
}
}