feat: implementar CRUD completo para exchange_rate, packages y seal

Backend:
- Corregir tipos datetime en exchange_rate (dto.py, models.py)
- Agregar datetime import en packages dto.py
- Corregir orden de parámetros en seal services.py
- Actualizar router.py con nuevas rutas

Frontend:
- Crear API clients para exchange-rate, packages y seal
- Implementar componentes de tabla con renderComponent
- Crear diálogos de crear/editar para cada módulo
- Implementar data-table-actions con manejo interno de diálogos
- Agregar páginas completas con filtros e infinite scroll
- Actualizar sidebar con nuevos módulos

Características:
- Acciones inline (editar/eliminar) totalmente funcionales
- Filtros de búsqueda específicos por módulo
- Paginación con infinite scroll
- Sincronización con companyStore
- Manejo de errores robusto
This commit is contained in:
KevinMrkz3221
2025-12-02 20:46:41 -06:00
parent baf76cf414
commit 64b6f3e5c9
27 changed files with 2439 additions and 14 deletions

View File

@@ -1,10 +1,11 @@
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field
class ExchangeRateBaseDTO(BaseModel):
date: int = Field(..., description="Exchange rate date")
date: datetime = Field(..., description="Exchange rate date")
value: Optional[float] = Field(None, description="Exchange rate value")
local_currency: Optional[str] = Field(None, max_length=7, description="Local currency code")
foreign_currency: Optional[str] = Field(None, max_length=7, description="Foreign currency code")
@@ -17,7 +18,7 @@ class ExchangeRateCreateDTO(ExchangeRateBaseDTO):
class ExchangeRateUpdateDTO(ExchangeRateBaseDTO):
"""Schema for updating an exchange rate"""
date: Optional[int] = Field(None, description="Exchange rate date")
date: Optional[datetime] = Field(None, description="Exchange rate date")
class ExchangeRateResponseDTO(ExchangeRateBaseDTO):

View File

@@ -1,3 +1,4 @@
from datetime import datetime
from decimal import Decimal
from typing import Optional
@@ -33,7 +34,7 @@ class ExchangeRate(Base, TenantScopedMixin):
id: Mapped[int] = mapped_column(Integer, primary_key=True)
date: Mapped[int] = mapped_column(DateTime)
date: Mapped[datetime] = mapped_column(DateTime)
value: Mapped[Optional[Decimal]] = mapped_column(DECIMAL(13, 6))
local_currency: Mapped[Optional[str]] = mapped_column(String(7))
foreign_currency: Mapped[Optional[str]] = mapped_column(String(7))

View File

@@ -2,6 +2,7 @@
DTOs for Packages (GBultos).
"""
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field
@@ -33,8 +34,8 @@ class PackageResponseDTO(PackageBaseDTO):
id: int
company_id: int
tenant_id: int
created_at: Optional[str] = None
updated_at: Optional[str] = None
created_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
class Config:
from_attributes = True

View File

@@ -13,11 +13,11 @@ router = TenantCRUDRoutes(
create_schema=PackageCreateDTO,
update_schema=PackageUpdateDTO,
response_schema=PackageResponseDTO,
prefix="/package",
tags=[],
prefix="/packages",
tags=["a76 / packages"],
resource_name="Package",
id_name="id", # Using numeric ID
enable_list=True, # Enable GET /package with pagination
id_name="package_id",
enable_list=True, # Enable GET /packages with pagination
enable_filters=True, # Enable filtering by key and description_es
default_page_size=50,
max_page_size=100,

View File

@@ -75,8 +75,8 @@ class SealService:
db: Session,
seal_id: int,
tenant_id: int,
company_id: int,
seal_data: dto.SealUpdateDTO,
company_id: int,
) -> Optional[models.Seal]:
"""Update a seal"""
seal = SealService.get_by_id(db, seal_id, tenant_id, company_id)

View File

@@ -46,7 +46,7 @@ router.include_router(parts_router, prefix="/a76", tags=["a76 / parts"])
router.include_router(
permission_rule_oct_router, prefix="/a76", tags=["a76 / permission_rule_oct"]
)
router.include_router(package_router, prefix="/a76", tags=["a76 / package"])
router.include_router(package_router, prefix="/a76")
router.include_router(seal_router, prefix="/a76", tags=["a76 / seal"])
router.include_router(
fraction_rule_octave_router, prefix="/a76", tags=["a76 / fraction_rule_octave"]