codigo
codigo
*;
import java.awt.*;
import java.sql.*;
import javax.swing.table.DefaultTableModel;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.io.File; // Agrega esta línea con los otros imports
// Identificadores de paneles
private static final String INICIO_PANEL = "INICIO";
private static final String CLIENTES_PANEL = "CLIENTES";
private static final String TRABAJOS_PANEL = "TRABAJOS";
private static final String REPORTES_PANEL = "REPORTES";
// Modelos de tabla
private DefaultTableModel clientesTableModel;
private DefaultTableModel trabajosTableModel;
private DefaultTableModel reportesTableModel;
private DefaultTableModel tecnicosTableModel;
private DefaultTableModel categoriasTableModel;
public SistemaServicioTecnico() {
try {
// Cargar el driver de MySQL
Class.forName("com.mysql.cj.jdbc.Driver");
// Establecer conexión con la base de datos
connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
System.out.println("Conexión establecida con MySQL");
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(this, "Driver JDBC no encontrado: " +
e.getMessage(),
"Error de conexión", JOptionPane.ERROR_MESSAGE);
System.exit(1);
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Error al conectar con la base de
datos: " + e.getMessage(),
"Error de conexión", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
inicializarInterfaz();
crearMenuPrincipal();
configurarPanelesContenido();
setVisible(true);
}
try {
ImageIcon icon = new ImageIcon("icon.png");
setIconImage(icon.getImage());
} catch (Exception e) {
System.err.println("Error cargando icono: " + e.getMessage());
}
}
getContentPane().add(menuPanel, BorderLayout.WEST);
}
getContentPane().add(contentPanel, BorderLayout.CENTER);
mostrarPanel(INICIO_PANEL);
}
boton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
boton.setBackground(new Color(70, 70, 130));
}
statsPanel.add(crearStatCard("Clientes Registrados",
contarRegistros("clientes")));
statsPanel.add(crearStatCard("Trabajos Pendientes",
contarTrabajosPorEstado("Pendiente")));
statsPanel.add(crearStatCard("Trabajos en Proceso",
contarTrabajosPorEstado("Terminado")));
statsPanel.add(crearStatCard("Trabajos Entregados",
contarTrabajosPorEstado("Entregado")));
statsPanel.add(crearStatCard("Técnicos Activos", contarRegistros("tecnicos
WHERE activo = TRUE")));
statsPanel.add(crearStatCard("Categorías de Equipos",
contarRegistros("categorias_equipos")));
panel.add(centerPanel, BorderLayout.CENTER);
return panel;
}
card.add(tituloLabel, BorderLayout.NORTH);
card.add(valorLabel, BorderLayout.CENTER);
return card;
}
// Panel de búsqueda
JPanel busquedaPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
busquedaPanel.setBackground(Color.WHITE);
busquedaPanel.setBorder(BorderFactory.createTitledBorder("Búsqueda"));
// Tabla de clientes
String[] columnasClientes = {"DNI", "Nombres", "Apellidos", "Teléfono",
"Email", "Dirección", "Fecha Registro"};
clientesTableModel = new DefaultTableModel(columnasClientes, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
JTable tablaClientes = new JTable(clientesTableModel);
tablaClientes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollClientes = new JScrollPane(tablaClientes);
// Panel de botones
JPanel botonesPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10,
10));
botonesPanel.setBackground(Color.WHITE);
botonesPanel.add(btnAgregar);
botonesPanel.add(btnEditar);
botonesPanel.add(btnEliminar);
botonesPanel.add(btnActualizar);
// Organizar componentes
JPanel centerPanel = new JPanel(new BorderLayout());
centerPanel.setBackground(Color.WHITE);
centerPanel.add(busquedaPanel, BorderLayout.NORTH);
centerPanel.add(scrollClientes, BorderLayout.CENTER);
centerPanel.add(botonesPanel, BorderLayout.SOUTH);
panel.add(centerPanel, BorderLayout.CENTER);
return panel;
}
private void buscarClientes(String criterio) {
try {
clientesTableModel.setRowCount(0);
String sql = "SELECT dni, nombres, apellidos, telefono, email,
direccion, fecha_registro " +
"FROM clientes WHERE dni LIKE ? OR nombres LIKE ? OR apellidos
LIKE ? " +
"ORDER BY apellidos, nombres";
try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
pstmt.setString(1, "%" + criterio + "%");
pstmt.setString(2, "%" + criterio + "%");
pstmt.setString(3, "%" + criterio + "%");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
clientesTableModel.addRow(new Object[]{
rs.getString("dni"),
rs.getString("nombres"),
rs.getString("apellidos"),
rs.getString("telefono"),
rs.getString("email"),
rs.getString("direccion"),
rs.getTimestamp("fecha_registro")
});
}
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Error al buscar clientes: " +
e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
if (dni != null) {
// Cargar datos del cliente existente
try {
String sql = "SELECT * FROM clientes WHERE dni = ?";
try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
pstmt.setString(1, dni);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
txtDNI.setText(rs.getString("dni"));
txtNombres.setText(rs.getString("nombres"));
txtApellidos.setText(rs.getString("apellidos"));
txtTelefono.setText(rs.getString("telefono"));
txtEmail.setText(rs.getString("email"));
txtDireccion.setText(rs.getString("direccion"));
}
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(dialog, "Error al cargar cliente: " +
e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
panelFormulario.add(new JLabel("DNI:"));
panelFormulario.add(txtDNI);
panelFormulario.add(new JLabel("Nombres:"));
panelFormulario.add(txtNombres);
panelFormulario.add(new JLabel("Apellidos:"));
panelFormulario.add(txtApellidos);
panelFormulario.add(new JLabel("Teléfono:"));
panelFormulario.add(txtTelefono);
panelFormulario.add(new JLabel("Email:"));
panelFormulario.add(txtEmail);
panelFormulario.add(new JLabel("Dirección:"));
panelFormulario.add(txtDireccion);
panelBotones.add(btnGuardar);
panelBotones.add(btnCancelar);
dialog.add(panelFormulario, BorderLayout.CENTER);
dialog.add(panelBotones, BorderLayout.SOUTH);
dialog.setVisible(true);
}
private boolean validarCamposCliente(JTextField dni, JTextField nombres,
JTextField apellidos) {
if (dni.getText().trim().isEmpty()) {
JOptionPane.showMessageDialog(this, "El DNI es obligatorio", "Error",
JOptionPane.ERROR_MESSAGE);
return false;
}
if (nombres.getText().trim().isEmpty()) {
JOptionPane.showMessageDialog(this, "Los nombres son obligatorios",
"Error", JOptionPane.ERROR_MESSAGE);
return false;
}
if (apellidos.getText().trim().isEmpty()) {
JOptionPane.showMessageDialog(this, "Los apellidos son obligatorios",
"Error", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
if (confirmacion == JOptionPane.YES_OPTION) {
try {
// Verificar si el cliente tiene trabajos asociados
String sqlCheck = "SELECT COUNT(*) FROM trabajos WHERE dni_cliente
= ?";
try (PreparedStatement pstmt =
connection.prepareStatement(sqlCheck)) {
pstmt.setString(1, dni);
ResultSet rs = pstmt.executeQuery();
if (rs.next() && rs.getInt(1) > 0) {
JOptionPane.showMessageDialog(this,
"No se puede eliminar el cliente porque tiene
trabajos asociados",
"Error", JOptionPane.ERROR_MESSAGE);
return;
}
}
// Eliminar cliente
String sqlDelete = "DELETE FROM clientes WHERE dni = ?";
try (PreparedStatement pstmt =
connection.prepareStatement(sqlDelete)) {
pstmt.setString(1, dni);
pstmt.executeUpdate();
}
// Panel de botones
JPanel botonesPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10,
10));
botonesPanel.setBackground(Color.WHITE);
botonesPanel.add(btnAgregar);
botonesPanel.add(btnEditar);
botonesPanel.add(btnCambiarEstado);
botonesPanel.add(btnEliminar);
botonesPanel.add(btnActualizar);
// Organizar componentes
JPanel centerPanel = new JPanel(new BorderLayout());
centerPanel.setBackground(Color.WHITE);
centerPanel.add(filtrosPanel, BorderLayout.NORTH);
centerPanel.add(scrollTrabajos, BorderLayout.CENTER);
centerPanel.add(botonesPanel, BorderLayout.SOUTH);
panel.add(centerPanel, BorderLayout.CENTER);
return panel;
}
if (!dni.isEmpty()) {
sql.append("AND t.dni_cliente LIKE ? ");
}
if (!estado.isEmpty()) {
sql.append("AND t.estado = ? ");
}
if (!idTecnico.isEmpty()) {
sql.append("AND t.id_tecnico_asignado = ? ");
}
sql.append("ORDER BY t.estado, t.fecha_recepcion DESC");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
trabajosTableModel.addRow(new Object[]{
rs.getInt("id"),
rs.getString("equipo"),
rs.getString("categoria"),
rs.getString("marca"),
rs.getString("modelo"),
rs.getString("estado"),
rs.getString("cliente"),
rs.getString("tecnico"),
rs.getTimestamp("fecha_recepcion")
});
}
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Error al buscar trabajos: " +
e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
if (id != null) {
// Cargar datos del trabajo existente
try {
String sql = "SELECT * FROM trabajos WHERE id = ?";
try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
cmbClientes.setSelectedItem(rs.getString("dni_cliente"));
txtEquipo.setText(rs.getString("equipo"));
cmbCategorias.setSelectedItem(rs.getInt("id_categoria"));
txtMarca.setText(rs.getString("marca"));
txtModelo.setText(rs.getString("modelo"));
txtSerie.setText(rs.getString("numero_serie"));
txtProblema.setText(rs.getString("descripcion_problema"));
txtDiagnostico.setText(rs.getString("diagnostico"));
txtSolucion.setText(rs.getString("solucion_implementada"));
txtObservaciones.setText(rs.getString("observaciones"));
cmbTecnicos.setSelectedItem(rs.getInt("id_tecnico_asignado"));
txtCostoEstimado.setText(rs.getBigDecimal("costo_estimado")
!= null ? rs.getBigDecimal("costo_estimado").toString() : "");
txtCostoFinal.setText(rs.getBigDecimal("costo_final") !=
null ? rs.getBigDecimal("costo_final").toString() : "");
spnGarantia.setValue(rs.getInt("garantia_meses"));
}
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(dialog, "Error al cargar trabajo: " +
e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
// Configurar GridBagLayout
gbc.gridx = 0;
gbc.gridy = 0;
panelFormulario.add(new JLabel("Cliente:"), gbc);
gbc.gridx = 1;
panelFormulario.add(cmbClientes, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Equipo:"), gbc);
gbc.gridx = 1;
panelFormulario.add(txtEquipo, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Categoría:"), gbc);
gbc.gridx = 1;
panelFormulario.add(cmbCategorias, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Marca:"), gbc);
gbc.gridx = 1;
panelFormulario.add(txtMarca, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Modelo:"), gbc);
gbc.gridx = 1;
panelFormulario.add(txtModelo, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Número de Serie:"), gbc);
gbc.gridx = 1;
panelFormulario.add(txtSerie, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Descripción del Problema:"), gbc);
gbc.gridx = 1;
panelFormulario.add(new JScrollPane(txtProblema), gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Diagnóstico:"), gbc);
gbc.gridx = 1;
panelFormulario.add(new JScrollPane(txtDiagnostico), gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Solución Implementada:"), gbc);
gbc.gridx = 1;
panelFormulario.add(new JScrollPane(txtSolucion), gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Observaciones:"), gbc);
gbc.gridx = 1;
panelFormulario.add(new JScrollPane(txtObservaciones), gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Técnico Asignado:"), gbc);
gbc.gridx = 1;
panelFormulario.add(cmbTecnicos, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Costo Estimado:"), gbc);
gbc.gridx = 1;
panelFormulario.add(txtCostoEstimado, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Costo Final:"), gbc);
gbc.gridx = 1;
panelFormulario.add(txtCostoFinal, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Garantía (meses):"), gbc);
gbc.gridx = 1;
panelFormulario.add(spnGarantia, gbc);
panelBotones.add(btnGuardar);
panelBotones.add(btnCancelar);
dialog.add(panelFormulario, BorderLayout.CENTER);
dialog.add(panelBotones, BorderLayout.SOUTH);
dialog.setVisible(true);
}
if (!esNuevo) {
pstmt.setInt(15, id);
}
pstmt.executeUpdate();
if (esNuevo) {
try (ResultSet generatedKeys = pstmt.getGeneratedKeys()) {
if (generatedKeys.next()) {
id = generatedKeys.getInt(1);
}
}
}
}
gbc.gridy++;
panelFormulario.add(new JLabel("Estado Actual: " + estadoActual), gbc);
gbc.gridy++;
panelFormulario.add(new JLabel("Nuevo Estado:"), gbc);
gbc.gridx = 1;
JComboBox<String> cmbEstado = new JComboBox<>();
panelFormulario.add(cmbEstado, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Técnico:"), gbc);
gbc.gridx = 1;
JComboBox<String> cmbTecnicos = new JComboBox<>();
cargarComboTecnicos(cmbTecnicos);
panelFormulario.add(cmbTecnicos, gbc);
gbc.gridx = 0;
gbc.gridy++;
panelFormulario.add(new JLabel("Observaciones:"), gbc);
gbc.gridx = 1;
JTextArea txtObservaciones = new JTextArea(3, 20);
txtObservaciones.setLineWrap(true);
panelFormulario.add(new JScrollPane(txtObservaciones), gbc);
panelBotones.add(btnGuardar);
panelBotones.add(btnCancelar);
dialog.add(panelFormulario, BorderLayout.CENTER);
dialog.add(panelBotones, BorderLayout.SOUTH);
dialog.setVisible(true);
}
if (confirmacion == JOptionPane.YES_OPTION) {
try {
// Eliminar repuestos asociados primero
String sqlDeleteRepuestos = "DELETE FROM repuestos_utilizados WHERE
id_trabajo = ?";
try (PreparedStatement pstmt =
connection.prepareStatement(sqlDeleteRepuestos)) {
pstmt.setInt(1, id);
pstmt.executeUpdate();
}
// Panel de filtros
JPanel filtrosPanel = new JPanel(new GridLayout(2, 4, 5, 5));
filtrosPanel.setBackground(Color.WHITE);
filtrosPanel.setBorder(BorderFactory.createTitledBorder("Filtros"));
filtrosPanel.add(new JLabel("Estado:"));
filtrosPanel.add(new JLabel("Técnico:"));
filtrosPanel.add(new JLabel("Categoría:"));
filtrosPanel.add(new JLabel("Fechas:"));
filtrosPanel.add(cmbEstado);
filtrosPanel.add(cmbTecnico);
filtrosPanel.add(cmbCategoria);
JPanel panelFechas = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
panelFechas.add(new JLabel("Desde:"));
panelFechas.add(txtFechaInicio);
panelFechas.add(new JLabel("Hasta:"));
panelFechas.add(txtFechaFin);
filtrosPanel.add(panelFechas);
// Tabla de reportes
String[] columnasReportes = {"ID", "Equipo", "Categoría", "Estado",
"Cliente", "Técnico",
"Fecha Recepción", "Fecha Término", "Fecha Entrega", "Costo
Final"};
reportesTableModel = new DefaultTableModel(columnasReportes, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
JTable tablaReportes = new JTable(reportesTableModel);
JScrollPane scrollReportes = new JScrollPane(tablaReportes);
// Panel de botones
JPanel botonesPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
botonesPanel.setBackground(Color.WHITE);
botonesPanel.add(btnGenerar);
// Organizar componentes
JPanel centerPanel = new JPanel(new BorderLayout());
centerPanel.setBackground(Color.WHITE);
centerPanel.add(filtrosPanel, BorderLayout.NORTH);
centerPanel.add(scrollReportes, BorderLayout.CENTER);
centerPanel.add(botonesPanel, BorderLayout.SOUTH);
panel.add(centerPanel, BorderLayout.CENTER);
return panel;
}
if (!estado.isEmpty()) {
sql.append("AND t.estado = ? ");
}
if (!idTecnico.isEmpty()) {
sql.append("AND t.id_tecnico_asignado = ? ");
}
if (!idCategoria.isEmpty()) {
sql.append("AND t.id_categoria = ? ");
}
if (!fechaInicio.isEmpty() && !fechaFin.isEmpty()) {
sql.append("AND DATE(t.fecha_recepcion) BETWEEN ? AND ? ");
} else if (!fechaInicio.isEmpty()) {
sql.append("AND DATE(t.fecha_recepcion) >= ? ");
} else if (!fechaFin.isEmpty()) {
sql.append("AND DATE(t.fecha_recepcion) <= ? ");
}
sql.append("ORDER BY t.estado, t.fecha_recepcion DESC");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
reportesTableModel.addRow(new Object[]{
rs.getInt("id"),
rs.getString("equipo"),
rs.getString("categoria"),
rs.getString("estado"),
rs.getString("cliente"),
rs.getString("tecnico"),
rs.getTimestamp("fecha_recepcion"),
rs.getTimestamp("fecha_termino_reparacion"),
rs.getTimestamp("fecha_entrega"),
rs.getBigDecimal("costo_final") != null ? "S/ " +
rs.getBigDecimal("costo_final") : ""
});
}
}
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Error al generar reporte: " +
e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
// Escribir datos
for (int row = 0; row < reportesTableModel.getRowCount(); row++) {
for (int col = 0; col < reportesTableModel.getColumnCount();
col++) {
Object value = reportesTableModel.getValueAt(row, col);
if (value != null) {
pw.print(value.toString().replace(",", "")); //
Eliminar comas para evitar problemas en CSV
}
if (col < reportesTableModel.getColumnCount() - 1) {
pw.print(",");
}
}
pw.println();
}
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new SistemaServicioTecnico();
} catch (Exception e) {
e.printStackTrace();
}
});
}
}