-MOdificar Formato de PDF para informe
se saco el esatdo y porcentaje
This commit is contained in:
@@ -380,6 +380,8 @@ async def upload_logo(
|
|||||||
if current_user.role != "admin":
|
if current_user.role != "admin":
|
||||||
raise HTTPException(status_code=403, detail="Solo administradores pueden cambiar el logo")
|
raise HTTPException(status_code=403, detail="Solo administradores pueden cambiar el logo")
|
||||||
|
|
||||||
|
print(f"\n📝 SUBIENDO LOGO DE EMPRESA...")
|
||||||
|
|
||||||
# Subir imagen a MinIO
|
# Subir imagen a MinIO
|
||||||
file_extension = file.filename.split(".")[-1]
|
file_extension = file.filename.split(".")[-1]
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
@@ -388,24 +390,44 @@ async def upload_logo(
|
|||||||
s3_key = f"{folder}/{file_name}"
|
s3_key = f"{folder}/{file_name}"
|
||||||
s3_client.upload_fileobj(file.file, S3_IMAGE_BUCKET, s3_key, ExtraArgs={"ContentType": file.content_type})
|
s3_client.upload_fileobj(file.file, S3_IMAGE_BUCKET, s3_key, ExtraArgs={"ContentType": file.content_type})
|
||||||
logo_url = f"{S3_ENDPOINT}/{S3_IMAGE_BUCKET}/{s3_key}"
|
logo_url = f"{S3_ENDPOINT}/{S3_IMAGE_BUCKET}/{s3_key}"
|
||||||
|
print(f"✅ Logo subido a S3: {logo_url}")
|
||||||
|
|
||||||
# Guardar en configuración (puedes tener una tabla Config o usar AIConfiguration)
|
# Guardar en configuración (crear si no existe)
|
||||||
config = db.query(models.AIConfiguration).filter(models.AIConfiguration.is_active == True).first()
|
config = db.query(models.AIConfiguration).filter(models.AIConfiguration.is_active == True).first()
|
||||||
if config:
|
if config:
|
||||||
|
print(f"🔄 Actualizando logo en configuración existente (ID: {config.id})")
|
||||||
config.logo_url = logo_url
|
config.logo_url = logo_url
|
||||||
db.commit()
|
db.commit()
|
||||||
db.refresh(config)
|
db.refresh(config)
|
||||||
# Si no hay config, solo retorna la url
|
else:
|
||||||
|
# Crear configuración básica solo para guardar el logo
|
||||||
|
print("⚠️ No hay configuración de IA activa, creando una básica para guardar el logo")
|
||||||
|
new_config = models.AIConfiguration(
|
||||||
|
provider="openai",
|
||||||
|
api_key="pending", # Placeholder, se actualizará luego
|
||||||
|
model_name="gpt-4o",
|
||||||
|
logo_url=logo_url,
|
||||||
|
is_active=True
|
||||||
|
)
|
||||||
|
db.add(new_config)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(new_config)
|
||||||
|
print(f"✅ Configuración creada con ID: {new_config.id}")
|
||||||
|
|
||||||
|
print(f"✅ Logo guardado correctamente: {logo_url}\n")
|
||||||
return {"logo_url": logo_url}
|
return {"logo_url": logo_url}
|
||||||
|
|
||||||
@app.get("/api/config/logo", response_model=dict)
|
@app.get("/api/config/logo", response_model=dict)
|
||||||
def get_logo_url(
|
def get_logo_url(
|
||||||
db: Session = Depends(get_db)
|
db: Session = Depends(get_db)
|
||||||
):
|
):
|
||||||
|
print(f"\n🔍 OBTENIENDO LOGO DE EMPRESA...")
|
||||||
config = db.query(models.AIConfiguration).filter(models.AIConfiguration.is_active == True).first()
|
config = db.query(models.AIConfiguration).filter(models.AIConfiguration.is_active == True).first()
|
||||||
if config and getattr(config, "logo_url", None):
|
if config and getattr(config, "logo_url", None):
|
||||||
|
print(f"✅ Logo encontrado: {config.logo_url}\n")
|
||||||
return {"logo_url": config.logo_url}
|
return {"logo_url": config.logo_url}
|
||||||
# Default logo (puedes poner una url por defecto)
|
# Default logo (puedes poner una url por defecto)
|
||||||
|
print(f"⚠️ No hay logo configurado, retornando default\n")
|
||||||
return {"logo_url": f"{S3_ENDPOINT}/{S3_IMAGE_BUCKET}/logo/default_logo.png"}
|
return {"logo_url": f"{S3_ENDPOINT}/{S3_IMAGE_BUCKET}/logo/default_logo.png"}
|
||||||
|
|
||||||
|
|
||||||
@@ -1548,11 +1570,17 @@ def generate_inspection_pdf(inspection_id: int, db: Session) -> str:
|
|||||||
# Obtener logo principal de configuración (empresa)
|
# Obtener logo principal de configuración (empresa)
|
||||||
config = db.query(models.AIConfiguration).filter(models.AIConfiguration.is_active == True).first()
|
config = db.query(models.AIConfiguration).filter(models.AIConfiguration.is_active == True).first()
|
||||||
company_logo_url = None
|
company_logo_url = None
|
||||||
if config and getattr(config, "logo_url", None):
|
if config:
|
||||||
|
print(f"🔍 Configuración de IA encontrada (ID: {config.id})")
|
||||||
|
if getattr(config, "logo_url", None):
|
||||||
company_logo_url = config.logo_url
|
company_logo_url = config.logo_url
|
||||||
print(f"📸 Logo de la empresa: {company_logo_url}")
|
print(f"📸 Logo de la empresa: {company_logo_url}")
|
||||||
else:
|
else:
|
||||||
print("ℹ️ No hay logo de empresa configurado")
|
print("⚠️ Configuración de IA existe pero no tiene logo_url configurado")
|
||||||
|
print(" 💡 Ve a Settings y sube el logo de la empresa")
|
||||||
|
else:
|
||||||
|
print("⚠️ No hay configuración de IA activa en la base de datos")
|
||||||
|
print(" 💡 Ve a Settings, configura la IA y sube el logo de la empresa")
|
||||||
|
|
||||||
# Obtener logo del checklist (NO usar fallback)
|
# Obtener logo del checklist (NO usar fallback)
|
||||||
checklist_logo_url = None
|
checklist_logo_url = None
|
||||||
@@ -1783,16 +1811,14 @@ def generate_inspection_pdf(inspection_id: int, db: Session) -> str:
|
|||||||
metric_value = ParagraphStyle('metric_value', parent=info_style, fontSize=16, fontName='Helvetica-Bold', alignment=TA_CENTER)
|
metric_value = ParagraphStyle('metric_value', parent=info_style, fontSize=16, fontName='Helvetica-Bold', alignment=TA_CENTER)
|
||||||
|
|
||||||
metrics_data = [
|
metrics_data = [
|
||||||
[Paragraph("Puntuación", metric_label), Paragraph("Porcentaje", metric_label), Paragraph("Estado", metric_label), Paragraph("Ítems Críticos", metric_label)],
|
[Paragraph("Puntuación", metric_label), Paragraph("Ítems Críticos", metric_label)],
|
||||||
[
|
[
|
||||||
Paragraph(f"<b>{inspection.score}</b> / {inspection.max_score}", metric_value),
|
Paragraph(f"<b>{inspection.score}</b> / {inspection.max_score}", metric_value),
|
||||||
Paragraph(f"<b>{percentage:.1f}%</b>", metric_value),
|
|
||||||
Paragraph(f"<b>{score_label}</b>", ParagraphStyle('status_value', parent=metric_value, textColor=score_color)),
|
|
||||||
Paragraph(f"<b>{inspection.flagged_items_count}</b>", metric_value)
|
Paragraph(f"<b>{inspection.flagged_items_count}</b>", metric_value)
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
score_table = Table(metrics_data, colWidths=[45*mm, 45*mm, 45*mm, 45*mm])
|
score_table = Table(metrics_data, colWidths=[90*mm, 90*mm])
|
||||||
score_table.setStyle(TableStyle([
|
score_table.setStyle(TableStyle([
|
||||||
('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#f8fafc')),
|
('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#f8fafc')),
|
||||||
('BACKGROUND', (0, 1), (-1, -1), colors.white),
|
('BACKGROUND', (0, 1), (-1, -1), colors.white),
|
||||||
|
|||||||
@@ -271,6 +271,7 @@ class AIConfigurationBase(BaseModel):
|
|||||||
provider: str # openai, gemini
|
provider: str # openai, gemini
|
||||||
api_key: str
|
api_key: str
|
||||||
model_name: Optional[str] = None
|
model_name: Optional[str] = None
|
||||||
|
logo_url: Optional[str] = None
|
||||||
|
|
||||||
class AIConfigurationCreate(AIConfigurationBase):
|
class AIConfigurationCreate(AIConfigurationBase):
|
||||||
pass
|
pass
|
||||||
@@ -279,6 +280,7 @@ class AIConfigurationUpdate(BaseModel):
|
|||||||
provider: Optional[str] = None
|
provider: Optional[str] = None
|
||||||
api_key: Optional[str] = None
|
api_key: Optional[str] = None
|
||||||
model_name: Optional[str] = None
|
model_name: Optional[str] = None
|
||||||
|
logo_url: Optional[str] = None
|
||||||
is_active: Optional[bool] = None
|
is_active: Optional[bool] = None
|
||||||
|
|
||||||
class AIConfiguration(AIConfigurationBase):
|
class AIConfiguration(AIConfigurationBase):
|
||||||
|
|||||||
Reference in New Issue
Block a user