[IMPROVED] Mostrar tipo de programador usado para el cálculo de tarifas
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
20c645b06e
commit
08dfaef620
1 changed files with 10 additions and 4 deletions
|
@ -173,7 +173,7 @@ def count_lines_of_code(project_path, extensions=None, ignore_patterns=None):
|
||||||
logger.info(f"Conteo completo. Procesados {files_counted} archivos, ignorados {skipped_files}.")
|
logger.info(f"Conteo completo. Procesados {files_counted} archivos, ignorados {skipped_files}.")
|
||||||
return total_lines
|
return total_lines
|
||||||
|
|
||||||
def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000):
|
def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000, programmer_type='fullstack'):
|
||||||
"""
|
"""
|
||||||
Calcula las estimaciones COCOMO basadas en las líneas de código.
|
Calcula las estimaciones COCOMO basadas en las líneas de código.
|
||||||
|
|
||||||
|
@ -181,6 +181,7 @@ def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000):
|
||||||
loc: Líneas de código
|
loc: Líneas de código
|
||||||
model_type: Tipo de modelo COCOMO ('organic', 'semi-detached', 'embedded')
|
model_type: Tipo de modelo COCOMO ('organic', 'semi-detached', 'embedded')
|
||||||
cost_per_pm: Costo por persona-mes en USD
|
cost_per_pm: Costo por persona-mes en USD
|
||||||
|
programmer_type: Tipo de programador usado para el cálculo de costo
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Dictionary con los resultados del cálculo
|
Dictionary con los resultados del cálculo
|
||||||
|
@ -223,6 +224,7 @@ def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000):
|
||||||
'avg_staff': avg_staff,
|
'avg_staff': avg_staff,
|
||||||
'cost_per_pm': cost_per_pm,
|
'cost_per_pm': cost_per_pm,
|
||||||
'hourly_rate': hourly_rate,
|
'hourly_rate': hourly_rate,
|
||||||
|
'programmer_type': programmer_type,
|
||||||
'total_cost': total_cost
|
'total_cost': total_cost
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,6 +300,7 @@ def print_results(results):
|
||||||
print(f"Tiempo de desarrollo: {results['dev_time']} meses")
|
print(f"Tiempo de desarrollo: {results['dev_time']} meses")
|
||||||
print(f"Personal promedio: {results['avg_staff']} personas")
|
print(f"Personal promedio: {results['avg_staff']} personas")
|
||||||
print("\n--- Costos ---")
|
print("\n--- Costos ---")
|
||||||
|
print(f"Tipo de programador: {results['programmer_type']}")
|
||||||
print(f"Costo por hora: ${results['hourly_rate']}")
|
print(f"Costo por hora: ${results['hourly_rate']}")
|
||||||
print(f"Costo por persona-mes: ${results['cost_per_pm']} ({HOURS_PER_MONTH} horas)")
|
print(f"Costo por persona-mes: ${results['cost_per_pm']} ({HOURS_PER_MONTH} horas)")
|
||||||
print(f"Costo total estimado: ${results['total_cost']:,.2f}")
|
print(f"Costo total estimado: ${results['total_cost']:,.2f}")
|
||||||
|
@ -346,14 +349,17 @@ if __name__ == "__main__":
|
||||||
logger.error(f"Error al crear el directorio de tarifas: {e}")
|
logger.error(f"Error al crear el directorio de tarifas: {e}")
|
||||||
|
|
||||||
# Obtener costo por hora desde fullstack.rate y convertir a costo por persona-mes
|
# Obtener costo por hora desde fullstack.rate y convertir a costo por persona-mes
|
||||||
|
programmer_type = 'fullstack' # Por defecto usamos la tarifa de fullstack
|
||||||
if args.cost is None:
|
if args.cost is None:
|
||||||
# Obtener la tarifa por hora y multiplicar por las horas mensuales
|
# Obtener la tarifa por hora y multiplicar por las horas mensuales
|
||||||
hourly_rate = get_fullstack_rate()
|
hourly_rate = get_fullstack_rate()
|
||||||
cost_per_pm = hourly_rate * HOURS_PER_MONTH
|
cost_per_pm = hourly_rate * HOURS_PER_MONTH
|
||||||
logger.info(f"Costo por hora: ${hourly_rate:.2f} × {HOURS_PER_MONTH} horas = ${cost_per_pm:.2f} por persona-mes")
|
logger.info(f"Costo por hora ({programmer_type}): ${hourly_rate:.2f} × {HOURS_PER_MONTH} horas = ${cost_per_pm:.2f} por persona-mes")
|
||||||
else:
|
else:
|
||||||
cost_per_pm = args.cost
|
cost_per_pm = args.cost
|
||||||
logger.info(f"Usando costo por persona-mes especificado: ${cost_per_pm:.2f}")
|
programmer_type = 'personalizado' # Si se especifica manualmente
|
||||||
|
hourly_rate = cost_per_pm / HOURS_PER_MONTH
|
||||||
|
logger.info(f"Usando costo por persona-mes especificado: ${cost_per_pm:.2f} (${hourly_rate:.2f}/hora)")
|
||||||
|
|
||||||
# Preparar extensiones y patrones de ignorar
|
# Preparar extensiones y patrones de ignorar
|
||||||
extensions = DEFAULT_EXTENSIONS.copy()
|
extensions = DEFAULT_EXTENSIONS.copy()
|
||||||
|
@ -376,7 +382,7 @@ if __name__ == "__main__":
|
||||||
model_type = args.model
|
model_type = args.model
|
||||||
|
|
||||||
# Calcular estimaciones COCOMO
|
# Calcular estimaciones COCOMO
|
||||||
results = estimate_cocomo(loc, model_type, cost_per_pm)
|
results = estimate_cocomo(loc, model_type, cost_per_pm, programmer_type)
|
||||||
|
|
||||||
# Añadir ruta del proyecto para la presentación
|
# Añadir ruta del proyecto para la presentación
|
||||||
results['project_path'] = str(project_path)
|
results['project_path'] = str(project_path)
|
||||||
|
|
Loading…
Reference in a new issue