Sistema de Gestión Técnico en Java
Sistema de Gestión Técnico en Java
*;
import [Link].*;
import [Link].*;
import [Link];
import [Link];
import [Link];
import [Link]; // 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
[Link]("[Link]");
// Establecer conexión con la base de datos
connection = [Link](DB_URL, DB_USER, DB_PASSWORD);
[Link]("Conexión establecida con MySQL");
} catch (ClassNotFoundException e) {
[Link](this, "Driver JDBC no encontrado: " +
[Link](),
"Error de conexión", JOptionPane.ERROR_MESSAGE);
[Link](1);
} catch (SQLException e) {
[Link](this, "Error al conectar con la base de
datos: " + [Link](),
"Error de conexión", JOptionPane.ERROR_MESSAGE);
[Link](1);
}
inicializarInterfaz();
crearMenuPrincipal();
configurarPanelesContenido();
setVisible(true);
}
try {
ImageIcon icon = new ImageIcon("[Link]");
setIconImage([Link]());
} catch (Exception e) {
[Link]("Error cargando icono: " + [Link]());
}
}
getContentPane().add(menuPanel, [Link]);
}
getContentPane().add(contentPanel, [Link]);
mostrarPanel(INICIO_PANEL);
}
[Link](new [Link]() {
public void mouseEntered([Link] evt) {
[Link](new Color(70, 70, 130));
}
[Link](crearStatCard("Clientes Registrados",
contarRegistros("clientes")));
[Link](crearStatCard("Trabajos Pendientes",
contarTrabajosPorEstado("Pendiente")));
[Link](crearStatCard("Trabajos en Proceso",
contarTrabajosPorEstado("Terminado")));
[Link](crearStatCard("Trabajos Entregados",
contarTrabajosPorEstado("Entregado")));
[Link](crearStatCard("Técnicos Activos", contarRegistros("tecnicos
WHERE activo = TRUE")));
[Link](crearStatCard("Categorías de Equipos",
contarRegistros("categorias_equipos")));
[Link](centerPanel, [Link]);
return panel;
}
[Link](tituloLabel, [Link]);
[Link](valorLabel, [Link]);
return card;
}
// Panel de búsqueda
JPanel busquedaPanel = new JPanel(new FlowLayout([Link]));
[Link]([Link]);
[Link]([Link]("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);
[Link](ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollClientes = new JScrollPane(tablaClientes);
// Panel de botones
JPanel botonesPanel = new JPanel(new FlowLayout([Link], 10,
10));
[Link]([Link]);
[Link](btnAgregar);
[Link](btnEditar);
[Link](btnEliminar);
[Link](btnActualizar);
// Organizar componentes
JPanel centerPanel = new JPanel(new BorderLayout());
[Link]([Link]);
[Link](busquedaPanel, [Link]);
[Link](scrollClientes, [Link]);
[Link](botonesPanel, [Link]);
[Link](centerPanel, [Link]);
return panel;
}
private void buscarClientes(String criterio) {
try {
[Link](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 = [Link](sql)) {
[Link](1, "%" + criterio + "%");
[Link](2, "%" + criterio + "%");
[Link](3, "%" + criterio + "%");
ResultSet rs = [Link]();
while ([Link]()) {
[Link](new Object[]{
[Link]("dni"),
[Link]("nombres"),
[Link]("apellidos"),
[Link]("telefono"),
[Link]("email"),
[Link]("direccion"),
[Link]("fecha_registro")
});
}
}
} catch (SQLException e) {
[Link](this, "Error al buscar clientes: " +
[Link](),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
if (dni != null) {
// Cargar datos del cliente existente
try {
String sql = "SELECT * FROM clientes WHERE dni = ?";
try (PreparedStatement pstmt = [Link](sql)) {
[Link](1, dni);
ResultSet rs = [Link]();
if ([Link]()) {
[Link]([Link]("dni"));
[Link]([Link]("nombres"));
[Link]([Link]("apellidos"));
[Link]([Link]("telefono"));
[Link]([Link]("email"));
[Link]([Link]("direccion"));
}
}
} catch (SQLException e) {
[Link](dialog, "Error al cargar cliente: " +
[Link](),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
[Link](new JLabel("DNI:"));
[Link](txtDNI);
[Link](new JLabel("Nombres:"));
[Link](txtNombres);
[Link](new JLabel("Apellidos:"));
[Link](txtApellidos);
[Link](new JLabel("Teléfono:"));
[Link](txtTelefono);
[Link](new JLabel("Email:"));
[Link](txtEmail);
[Link](new JLabel("Dirección:"));
[Link](txtDireccion);
[Link](btnGuardar);
[Link](btnCancelar);
[Link](panelFormulario, [Link]);
[Link](panelBotones, [Link]);
[Link](true);
}
private boolean validarCamposCliente(JTextField dni, JTextField nombres,
JTextField apellidos) {
if ([Link]().trim().isEmpty()) {
[Link](this, "El DNI es obligatorio", "Error",
JOptionPane.ERROR_MESSAGE);
return false;
}
if ([Link]().trim().isEmpty()) {
[Link](this, "Los nombres son obligatorios",
"Error", JOptionPane.ERROR_MESSAGE);
return false;
}
if ([Link]().trim().isEmpty()) {
[Link](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 =
[Link](sqlCheck)) {
[Link](1, dni);
ResultSet rs = [Link]();
if ([Link]() && [Link](1) > 0) {
[Link](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 =
[Link](sqlDelete)) {
[Link](1, dni);
[Link]();
}
// Panel de botones
JPanel botonesPanel = new JPanel(new FlowLayout([Link], 10,
10));
[Link]([Link]);
[Link](btnAgregar);
[Link](btnEditar);
[Link](btnCambiarEstado);
[Link](btnEliminar);
[Link](btnActualizar);
// Organizar componentes
JPanel centerPanel = new JPanel(new BorderLayout());
[Link]([Link]);
[Link](filtrosPanel, [Link]);
[Link](scrollTrabajos, [Link]);
[Link](botonesPanel, [Link]);
[Link](centerPanel, [Link]);
return panel;
}
if (![Link]()) {
[Link]("AND t.dni_cliente LIKE ? ");
}
if (![Link]()) {
[Link]("AND [Link] = ? ");
}
if (![Link]()) {
[Link]("AND t.id_tecnico_asignado = ? ");
}
[Link]("ORDER BY [Link], t.fecha_recepcion DESC");
ResultSet rs = [Link]();
while ([Link]()) {
[Link](new Object[]{
[Link]("id"),
[Link]("equipo"),
[Link]("categoria"),
[Link]("marca"),
[Link]("modelo"),
[Link]("estado"),
[Link]("cliente"),
[Link]("tecnico"),
[Link]("fecha_recepcion")
});
}
}
} catch (SQLException e) {
[Link](this, "Error al buscar trabajos: " +
[Link](),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
if (id != null) {
// Cargar datos del trabajo existente
try {
String sql = "SELECT * FROM trabajos WHERE id = ?";
try (PreparedStatement pstmt = [Link](sql)) {
[Link](1, id);
ResultSet rs = [Link]();
if ([Link]()) {
[Link]([Link]("dni_cliente"));
[Link]([Link]("equipo"));
[Link]([Link]("id_categoria"));
[Link]([Link]("marca"));
[Link]([Link]("modelo"));
[Link]([Link]("numero_serie"));
[Link]([Link]("descripcion_problema"));
[Link]([Link]("diagnostico"));
[Link]([Link]("solucion_implementada"));
[Link]([Link]("observaciones"));
[Link]([Link]("id_tecnico_asignado"));
[Link]([Link]("costo_estimado")
!= null ? [Link]("costo_estimado").toString() : "");
[Link]([Link]("costo_final") !=
null ? [Link]("costo_final").toString() : "");
[Link]([Link]("garantia_meses"));
}
}
} catch (SQLException e) {
[Link](dialog, "Error al cargar trabajo: " +
[Link](),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
// Configurar GridBagLayout
[Link] = 0;
[Link] = 0;
[Link](new JLabel("Cliente:"), gbc);
[Link] = 1;
[Link](cmbClientes, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Equipo:"), gbc);
[Link] = 1;
[Link](txtEquipo, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Categoría:"), gbc);
[Link] = 1;
[Link](cmbCategorias, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Marca:"), gbc);
[Link] = 1;
[Link](txtMarca, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Modelo:"), gbc);
[Link] = 1;
[Link](txtModelo, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Número de Serie:"), gbc);
[Link] = 1;
[Link](txtSerie, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Descripción del Problema:"), gbc);
[Link] = 1;
[Link](new JScrollPane(txtProblema), gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Diagnóstico:"), gbc);
[Link] = 1;
[Link](new JScrollPane(txtDiagnostico), gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Solución Implementada:"), gbc);
[Link] = 1;
[Link](new JScrollPane(txtSolucion), gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Observaciones:"), gbc);
[Link] = 1;
[Link](new JScrollPane(txtObservaciones), gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Técnico Asignado:"), gbc);
[Link] = 1;
[Link](cmbTecnicos, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Costo Estimado:"), gbc);
[Link] = 1;
[Link](txtCostoEstimado, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Costo Final:"), gbc);
[Link] = 1;
[Link](txtCostoFinal, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Garantía (meses):"), gbc);
[Link] = 1;
[Link](spnGarantia, gbc);
[Link](btnGuardar);
[Link](btnCancelar);
[Link](panelFormulario, [Link]);
[Link](panelBotones, [Link]);
[Link](true);
}
if (!esNuevo) {
[Link](15, id);
}
[Link]();
if (esNuevo) {
try (ResultSet generatedKeys = [Link]()) {
if ([Link]()) {
id = [Link](1);
}
}
}
}
[Link]++;
[Link](new JLabel("Estado Actual: " + estadoActual), gbc);
[Link]++;
[Link](new JLabel("Nuevo Estado:"), gbc);
[Link] = 1;
JComboBox<String> cmbEstado = new JComboBox<>();
[Link](cmbEstado, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Técnico:"), gbc);
[Link] = 1;
JComboBox<String> cmbTecnicos = new JComboBox<>();
cargarComboTecnicos(cmbTecnicos);
[Link](cmbTecnicos, gbc);
[Link] = 0;
[Link]++;
[Link](new JLabel("Observaciones:"), gbc);
[Link] = 1;
JTextArea txtObservaciones = new JTextArea(3, 20);
[Link](true);
[Link](new JScrollPane(txtObservaciones), gbc);
[Link](btnGuardar);
[Link](btnCancelar);
[Link](panelFormulario, [Link]);
[Link](panelBotones, [Link]);
[Link](true);
}
if (confirmacion == JOptionPane.YES_OPTION) {
try {
// Eliminar repuestos asociados primero
String sqlDeleteRepuestos = "DELETE FROM repuestos_utilizados WHERE
id_trabajo = ?";
try (PreparedStatement pstmt =
[Link](sqlDeleteRepuestos)) {
[Link](1, id);
[Link]();
}
// Panel de filtros
JPanel filtrosPanel = new JPanel(new GridLayout(2, 4, 5, 5));
[Link]([Link]);
[Link]([Link]("Filtros"));
[Link](new JLabel("Estado:"));
[Link](new JLabel("Técnico:"));
[Link](new JLabel("Categoría:"));
[Link](new JLabel("Fechas:"));
[Link](cmbEstado);
[Link](cmbTecnico);
[Link](cmbCategoria);
JPanel panelFechas = new JPanel(new FlowLayout([Link], 5, 0));
[Link](new JLabel("Desde:"));
[Link](txtFechaInicio);
[Link](new JLabel("Hasta:"));
[Link](txtFechaFin);
[Link](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([Link]));
[Link]([Link]);
[Link](btnGenerar);
// Organizar componentes
JPanel centerPanel = new JPanel(new BorderLayout());
[Link]([Link]);
[Link](filtrosPanel, [Link]);
[Link](scrollReportes, [Link]);
[Link](botonesPanel, [Link]);
[Link](centerPanel, [Link]);
return panel;
}
if (![Link]()) {
[Link]("AND [Link] = ? ");
}
if (![Link]()) {
[Link]("AND t.id_tecnico_asignado = ? ");
}
if (![Link]()) {
[Link]("AND t.id_categoria = ? ");
}
if (![Link]() && ![Link]()) {
[Link]("AND DATE(t.fecha_recepcion) BETWEEN ? AND ? ");
} else if (![Link]()) {
[Link]("AND DATE(t.fecha_recepcion) >= ? ");
} else if (![Link]()) {
[Link]("AND DATE(t.fecha_recepcion) <= ? ");
}
[Link]("ORDER BY [Link], t.fecha_recepcion DESC");
ResultSet rs = [Link]();
while ([Link]()) {
[Link](new Object[]{
[Link]("id"),
[Link]("equipo"),
[Link]("categoria"),
[Link]("estado"),
[Link]("cliente"),
[Link]("tecnico"),
[Link]("fecha_recepcion"),
[Link]("fecha_termino_reparacion"),
[Link]("fecha_entrega"),
[Link]("costo_final") != null ? "S/ " +
[Link]("costo_final") : ""
});
}
}
} catch (SQLException e) {
[Link](this, "Error al generar reporte: " +
[Link](),
"Error", JOptionPane.ERROR_MESSAGE);
}
}
// Escribir datos
for (int row = 0; row < [Link](); row++) {
for (int col = 0; col < [Link]();
col++) {
Object value = [Link](row, col);
if (value != null) {
[Link]([Link]().replace(",", "")); //
Eliminar comas para evitar problemas en CSV
}
if (col < [Link]() - 1) {
[Link](",");
}
}
[Link]();
}
[Link]([Link]());
new SistemaServicioTecnico();
} catch (Exception e) {
[Link]();
}
});
}
}