[RFC-ADN-01] Normalizar nomenclatura de proyectos

- Directorios: PascalCase (p2601_dasuten → P2601_Dasuten)
- Planes: numeración pura (P2601_6.1.A → P2601.06.01)
- Sin caracteres especiales en nombres de archivo
- 07_proyectos.md: convención RFC-ADN-01 integrada, P2604/P2605 agregados
- evento:listar: nueva opción --detalle para descripciones completas
This commit is contained in:
Ricardo Monla
2026-03-16 15:15:53 -03:00
parent f608924c6a
commit ba5c65e2a4
33 changed files with 883 additions and 390 deletions
+79 -24
View File
@@ -57,6 +57,12 @@ module ADN
exit 1
end
# Obtener modo desde jornada actual si no se especifica
modo_resuelto = opts[:modo]
if modo_resuelto.nil?
puts "#{Color::DIM} Modo no especificado, buscando jornada actual...#{Color::RESET}"
end
puts "#{Color::CYAN}📝 Creando nueva entrada...#{Color::RESET}"
BitacorasDB::BitacoraDB.with_connection do |db|
@@ -84,13 +90,38 @@ module ADN
bitacora_id = bitacora['id']
# Obtener modo desde jornada actual si no se especificó
if modo_resuelto.nil?
entradas = db.list_entradas(bitacora_id: bitacora_id, limit: 10)
jornada = entradas.find { |e| e['descripcion']&.downcase&.include?('inicio de jornada') }
if jornada && jornada['modo']
modo_resuelto = jornada['modo']
puts " #{Color::DIM} Modo resuelto desde jornada: #{modo_resuelto == 'P' ? 'Presencial' : 'Remoto'}#{Color::RESET}"
else
modo_resuelto = 'P' # default
puts " #{Color::DIM} Sin jornada activa, usando default: Presencial#{Color::RESET}"
end
end
# Calcular estado automáticamente desde hora_fin
estado_resuelto = opts[:estado]
if estado_resuelto.nil?
if opts[:fin]
estado_resuelto = '✅'
puts " #{Color::DIM} Estado calculado: ✅ (tiene hora de fin)#{Color::RESET}"
else
estado_resuelto = '⏳'
puts " #{Color::DIM} Estado calculado: ⏳ (sin hora de fin)#{Color::RESET}"
end
end
# Crear la entrada
entrada = db.create_entrada(
inicio: opts[:inicio],
descripcion: opts[:descripcion],
fin: opts[:fin],
estado: opts[:estado],
modo: opts[:modo],
estado: estado_resuelto,
modo: modo_resuelto,
es_ia: opts[:es_ia],
bitacora_id: bitacora_id,
nodo_id: nodo_id,
@@ -98,15 +129,9 @@ module ADN
)
puts "#{Color::GREEN}✅ Entrada creada exitosamente#{Color::RESET}"
puts ""
puts " #{Color::BOLD}ID:#{Color::RESET} #{entrada['id']}"
puts " #{Color::BOLD}Inicio:#{Color::RESET} #{entrada['inicio']}"
puts " #{Color::BOLD}Fin:#{Color::RESET} #{entrada['fin'] || '(sin fin)'}"
puts " #{Color::BOLD}Descripción:#{Color::RESET} #{entrada['descripcion']}"
puts " #{Color::BOLD}Estado:#{Color::RESET} #{entrada['estado']}"
puts " #{Color::BOLD}Modo:#{Color::RESET} #{entrada['modo'] == 'P' ? 'Presencial' : 'Remoto'}"
puts " #{Color::BOLD}IA:#{Color::RESET} #{entrada['es_ia'] ? 'Sí' : 'No'}"
puts " #{Color::BOLD}Bitácora:#{Color::RESET} #{fecha_hoy} (ID: #{bitacora_id})"
puts " 📝 #{Color::BOLD}Descripción:#{Color::RESET} #{entrada['descripcion']}"
mostrar_pendientes(db)
end
@@ -129,6 +154,7 @@ module ADN
opt.on("--fin HH:MM", "Nueva hora de fin") { |f| opts[:fin] = f }
opt.on("--descripcion TEXTO", "Nueva descripción") { |d| opts[:descripcion] = d }
opt.on("--estado ESTADO", "Nuevo estado (⏳, ✅, ❌, ⚠️, ⏸️)") { |e| opts[:estado] = e }
opt.on("--modo MODO", "Modo (P=Presencial, R=Remoto)") { |m| opts[:modo] = m }
opt.on("--nodo NOMBRE", "Nuevo nodo") { |n| opts[:nodo_raw] = n }
opt.on("-h", "--help", "Mostrar ayuda") do
puts opt
@@ -144,13 +170,21 @@ module ADN
end
if opts.empty?
puts "#{Color::YELLOW}⚠ No se especificó nada para actualizar. Use --fin, --inicio, --descripcion, --estado o --nodo#{Color::RESET}"
puts "#{Color::YELLOW}⚠ No se especificó nada para actualizar. Use --fin, --inicio, --descripcion, --estado, --modo o --nodo#{Color::RESET}"
return
end
puts "#{Color::CYAN}🔄 Actualizando evento #{id_evento}...#{Color::RESET}"
BitacorasDB::BitacoraDB.with_connection do |db|
# Calcular estado automáticamente si se proporciona --fin (sin verificar entrada actual)
if opts.key?(:fin) && !opts.key?(:estado)
if opts[:fin] && !opts[:fin].empty?
opts[:estado] = '✅'
puts " #{Color::DIM} Estado calculado automáticamente: ✅ (hora de fin agregada)#{Color::RESET}"
end
end
if opts.key?(:nodo_raw)
if opts[:nodo_raw].nil? || opts[:nodo_raw].empty?
opts[:nodo_id] = nil
@@ -171,6 +205,7 @@ module ADN
puts "#{Color::GREEN}✅ Evento #{id_evento} actualizado exitosamente.#{Color::RESET}"
puts " #{Color::BOLD}Inicio:#{Color::RESET} #{res['inicio']}"
puts " #{Color::BOLD}Fin:#{Color::RESET} #{res['fin'] || '(sin fin)'}"
puts " 📝 #{Color::BOLD}Descripción:#{Color::RESET} #{res['descripcion']}"
else
puts "#{Color::YELLOW}⚠ No se pudo actualizar el evento. ¿Existe el ID #{id_evento}?#{Color::RESET}"
end
@@ -184,7 +219,7 @@ module ADN
# Comando: evento:listar [OPCIONES] - Listar entradas con filtros
def comando_evento_listar(args)
opts = { limit: 20, offset: 0, nodo: nil, estado: nil, buscar: nil, desde: nil, hasta: nil }
opts = { limit: 20, offset: 0, nodo: nil, estado: nil, buscar: nil, desde: nil, hasta: nil, detalle: false }
parser = OptionParser.new do |opt|
opt.banner = "Uso: adn db evento:listar [OPCIONES]"
@@ -209,6 +244,9 @@ module ADN
opt.on("--hasta FECHA", "Filtrar hasta fecha (YYYY-MM-DD)") do |h|
opts[:hasta] = h
end
opt.on("--detalle", "Mostrar descripciones completas (formato vertical)") do
opts[:detalle] = true
end
opt.on("-h", "--help", "Mostrar ayuda") do
puts opt
exit
@@ -253,21 +291,38 @@ module ADN
return
end
puts ""
puts "#{Color::BOLD}#{"ID".ljust(5)} #{"Inicio".ljust(8)} #{"Fin".ljust(8)} #{"Nodo".ljust(15)} #{"Estado".ljust(3)} #{"Descripción".ljust(40)}#{Color::RESET}"
puts "#{"" * 5} #{"" * 8} #{"" * 8} #{"" * 15} #{"" * 3} #{"" * 40}"
if opts[:detalle]
# Formato vertical con descripciones completas
entradas.each_with_index do |e, i|
puts "#{Color::DIM}#{"" * 60}#{Color::RESET}" if i > 0
id = e['id'].to_s
inicio = e['inicio'][0..7]
fin = e['fin'] ? e['fin'][0..7] : '--:--'
nodo = e['nodo_nombre'] || '(sin nodo)'
estado = e['estado']
desc = e['descripcion']
entradas.each do |e|
id = e['id'].to_s
inicio = e['inicio'][0..7] # HH:MM:SS -> HH:MM
fin = e['fin'] ? e['fin'][0..7] : '--:--'
nodo = e['nodo_nombre'] || '(sin nodo)'
nodo = nodo[0..13] + '...' if nodo.length > 15
estado = e['estado']
desc = e['descripcion']
desc = desc[0..37] + '...' if desc.length > 40
puts "#{estado} #{Color::BOLD}##{id}#{Color::RESET} | #{inicio}#{fin} | #{Color::CYAN}#{nodo}#{Color::RESET}"
puts " #{desc}"
end
else
# Formato tabla compacta (original)
puts ""
puts "#{Color::BOLD}#{"ID".ljust(5)} #{"Inicio".ljust(8)} #{"Fin".ljust(8)} #{"Nodo".ljust(15)} #{"Estado".ljust(3)} #{"Descripción".ljust(40)}#{Color::RESET}"
puts "#{"" * 5} #{"" * 8} #{"" * 8} #{"" * 15} #{"" * 3} #{"" * 40}"
puts "#{id.ljust(5)} #{inicio.ljust(8)} #{fin.ljust(8)} #{nodo.ljust(15)} #{estado.ljust(3)} #{desc.ljust(40)}"
entradas.each do |e|
id = e['id'].to_s
inicio = e['inicio'][0..7] # HH:MM:SS -> HH:MM
fin = e['fin'] ? e['fin'][0..7] : '--:--'
nodo = e['nodo_nombre'] || '(sin nodo)'
nodo = nodo[0..13] + '...' if nodo.length > 15
estado = e['estado']
desc = e['descripcion']
desc = desc[0..37] + '...' if desc.length > 40
puts "#{id.ljust(5)} #{inicio.ljust(8)} #{fin.ljust(8)} #{nodo.ljust(15)} #{estado.ljust(3)} #{desc.ljust(40)}"
end
end
puts ""
+1 -1
View File
@@ -1 +1 @@
1773604966
1773667642