From ff1ff30e23f133adef86d1a95ab648e96457ee1d Mon Sep 17 00:00:00 2001 From: hreyes Date: Wed, 22 Apr 2026 07:44:07 -0600 Subject: [PATCH] fix/conceptos-catalogo-general --- ...aa35_add_description_to_classification_.py | 27 ++++++++++++++ .../classification_concepts/dto.py | 2 ++ .../classification_concepts/models.py | 3 ++ .../classification_concepts/routes.py | 1 + .../classification_concepts/service.py | 6 ++++ .../classification-concepts.ts | 2 ++ .../classification/create-edit-dialog.svelte | 35 +++++++++++++------ 7 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 backend/alembic/versions/1f4ba75eaa35_add_description_to_classification_.py diff --git a/backend/alembic/versions/1f4ba75eaa35_add_description_to_classification_.py b/backend/alembic/versions/1f4ba75eaa35_add_description_to_classification_.py new file mode 100644 index 00000000..ddd52a29 --- /dev/null +++ b/backend/alembic/versions/1f4ba75eaa35_add_description_to_classification_.py @@ -0,0 +1,27 @@ +"""add description to classification concept + +Revision ID: 1f4ba75eaa35 +Revises: f1a2b3c4d5e6 +Create Date: 2026-04-21 20:55:04.259655 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision: str = '1f4ba75eaa35' +down_revision: Union[str, Sequence[str], None] = 'f1a2b3c4d5e6' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + op.add_column('classification_concepts', sa.Column('description', sa.String(length=255), nullable=True), schema='a76') + + +def downgrade() -> None: + """Downgrade schema.""" + op.drop_column('classification_concepts', 'description', schema='a76') diff --git a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/dto.py b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/dto.py index 3aec09a8..1e166e2f 100644 --- a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/dto.py +++ b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/dto.py @@ -5,6 +5,7 @@ from pydantic import BaseModel, Field, ConfigDict class ClassificationConceptBase(BaseModel): classification: str = Field(..., max_length=30, description="Classification") + description: Optional[str] = Field(None, max_length=255, description="Description") class ClassificationConceptCreate(ClassificationConceptBase): @@ -13,6 +14,7 @@ class ClassificationConceptCreate(ClassificationConceptBase): class ClassificationConceptUpdate(BaseModel): classification: Optional[str] = Field(None, max_length=30) + description: Optional[str] = Field(None, max_length=255) class ClassificationConceptResponse(ClassificationConceptBase): diff --git a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/models.py b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/models.py index 129d05fc..32c6c621 100644 --- a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/models.py +++ b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/models.py @@ -17,3 +17,6 @@ class ClassificationConcept(Base, TenantScopedMixin, TimestampMixin): classification: Mapped[str] = mapped_column( String(30), nullable=False) # CLASIFICACION + + description: Mapped[Optional[str]] = mapped_column( + String(255), nullable=True) # DESCRIPCION diff --git a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/routes.py b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/routes.py index 9f9ba069..2401c4c6 100644 --- a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/routes.py +++ b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/routes.py @@ -11,4 +11,5 @@ router = TenantCRUDRoutes( tags=["a76.general_catalogs.classification_concepts"], resource_name="Classification Concept", enable_list=True, + enable_filters=True, ).router diff --git a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/service.py b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/service.py index 785403d7..ea19216f 100644 --- a/backend/api/v1/modules/a76/general_catalogs/classification_concepts/service.py +++ b/backend/api/v1/modules/a76/general_catalogs/classification_concepts/service.py @@ -26,6 +26,12 @@ class ClassificationConceptService: ClassificationConcept.company_id == company_id ) + if filters: + if filters.get("classification"): + query = query.filter(ClassificationConcept.classification.ilike(f"%{filters['classification']}%")) + if filters.get("description"): + query = query.filter(ClassificationConcept.description.ilike(f"%{filters['description']}%")) + total = query.count() items = query.offset(skip).limit(limit).all() diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts index f87a5871..77f0f8b8 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/classification-concepts.ts @@ -4,6 +4,7 @@ import type { ApiResponse } from '$lib/api'; export interface ClassificationConcept { id: number; classification: string; + description?: string; tenant_id: number; company_id: number; created_at: string; @@ -12,6 +13,7 @@ export interface ClassificationConcept { export interface ClassificationConceptCreate { classification: string; + description?: string; } export interface ClassificationConceptUpdate extends Partial {} diff --git a/frontend/src/lib/components/dashboard/general_catalogs/classification/create-edit-dialog.svelte b/frontend/src/lib/components/dashboard/general_catalogs/classification/create-edit-dialog.svelte index 087d7b5b..615a0e8d 100644 --- a/frontend/src/lib/components/dashboard/general_catalogs/classification/create-edit-dialog.svelte +++ b/frontend/src/lib/components/dashboard/general_catalogs/classification/create-edit-dialog.svelte @@ -30,7 +30,8 @@ // šŸ‘‡ 3. Estado limpio: Solo lo que existe en la BD let formData = $state({ - classification: '' + classification: '', + description: '' }); let loading = $state(false); @@ -38,14 +39,18 @@ // Cargar datos al abrir $effect(() => { - if (item) { - formData = { - classification: item.classification || '' - }; - } else { - formData = { - classification: '' - }; + if (open) { + if (item) { + formData = { + classification: item.classification || '', + description: item.description || '' + }; + } else { + formData = { + classification: '', + description: '' + }; + } } }); @@ -63,7 +68,8 @@ throw new Error('El nombre de la clasificación es requerido'); const dataToSend = { - classification: formData.classification.trim() + classification: formData.classification.trim(), + description: formData.description ? formData.description.trim() : null }; // šŸ‘‡ 5. Llamar a la API pasando el companyId @@ -112,6 +118,15 @@ maxlength={30} /> +
+ + +