feat: replace SVG icons with Lucide icons in reference data pages
- Updated the "Nueva Sección" button in customs_sections, customs_warehouses, incoterms, invoice_types, material_types, payment_methods, pedimento_codes, pedimento_regimens, sectors, states, transport_modes, and transport_types pages to use the Plus icon from Lucide. - Updated the "Actualizar" button in the same pages to use the RefreshCw icon from Lucide. - Added a new edit dialog component for customs brokers with a comprehensive form for editing broker details, including validation and loading states.
This commit is contained in:
@@ -61,13 +61,17 @@ class ClientProviderService:
|
||||
)
|
||||
if filters.get("status"):
|
||||
enabled = 1 if filters["status"] == "enabled" else 0
|
||||
query = query.filter(ClientProvider.enabled_disabled == enabled)
|
||||
query = query.filter(ClientProvider.is_active == enabled)
|
||||
|
||||
total = query.count()
|
||||
clients = query.options(
|
||||
joinedload(ClientProvider.address),
|
||||
joinedload(ClientProvider.programs)
|
||||
).offset(skip).limit(limit).all()
|
||||
clients = (
|
||||
query.options(
|
||||
joinedload(ClientProvider.address), joinedload(ClientProvider.programs)
|
||||
)
|
||||
.offset(skip)
|
||||
.limit(limit)
|
||||
.all()
|
||||
)
|
||||
|
||||
return clients, total
|
||||
|
||||
@@ -79,8 +83,7 @@ class ClientProviderService:
|
||||
return (
|
||||
db.query(ClientProvider)
|
||||
.options(
|
||||
joinedload(ClientProvider.address),
|
||||
joinedload(ClientProvider.programs)
|
||||
joinedload(ClientProvider.address), joinedload(ClientProvider.programs)
|
||||
)
|
||||
.filter(
|
||||
ClientProvider.id == client_id,
|
||||
@@ -102,9 +105,7 @@ class ClientProviderService:
|
||||
# Create main client/provider
|
||||
data_dict = client_data.model_dump(exclude={"address", "programs"})
|
||||
db_client = ClientProvider(
|
||||
**data_dict,
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id
|
||||
**data_dict, tenant_id=tenant_id, company_id=company_id
|
||||
)
|
||||
|
||||
db.add(db_client)
|
||||
@@ -112,8 +113,8 @@ class ClientProviderService:
|
||||
|
||||
# Create address if provided
|
||||
if client_data.address:
|
||||
db_address = ClientProviderAddress(
|
||||
tenant_id=tenant_id,
|
||||
db_address = ClientProviderAddress(
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
client_id=db_client.id,
|
||||
**client_data.address.model_dump(exclude_unset=True),
|
||||
@@ -122,7 +123,7 @@ class ClientProviderService:
|
||||
|
||||
# Create programs if provided
|
||||
if client_data.programs:
|
||||
db_programs = ClientProviderPrograms(
|
||||
db_programs = ClientProviderPrograms(
|
||||
tenant_id=tenant_id,
|
||||
company_id=company_id,
|
||||
client_id=db_client.id,
|
||||
@@ -210,9 +211,7 @@ class ClientProviderService:
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def delete(
|
||||
db: Session, client_id: int, tenant_id: int, company_id: int
|
||||
) -> bool:
|
||||
def delete(db: Session, client_id: int, tenant_id: int, company_id: int) -> bool:
|
||||
"""Delete a client/provider"""
|
||||
client = ClientProviderService.get_by_id(db, client_id, tenant_id, company_id)
|
||||
if not client:
|
||||
@@ -351,7 +350,7 @@ class ClientProviderService:
|
||||
)
|
||||
|
||||
if enabled_only:
|
||||
query = query.filter(ClientProvider.enabled_disabled == 1)
|
||||
query = query.filter(ClientProvider.is_active == 1)
|
||||
|
||||
# Contar total
|
||||
total = query.count()
|
||||
@@ -478,59 +477,4 @@ class ClientProviderService:
|
||||
logger.error(f"Error deleting client/provider {client_id}: {str(e)}")
|
||||
raise HTTPException(
|
||||
status_code=500, detail="Error deleting client/provider"
|
||||
)
|
||||
|
||||
def get_clients_only(
|
||||
self, skip: int = 0, limit: int = 100
|
||||
) -> List[ClientProviderBasicDTO]:
|
||||
"""Obtiene solo clientes (client)"""
|
||||
query = self.db.query(ClientProvider).filter(
|
||||
ClientProvider.client_or_provider == "client"
|
||||
)
|
||||
clients = query.offset(skip).limit(limit).all()
|
||||
return [ClientProviderBasicDTO.model_validate(client) for client in clients]
|
||||
|
||||
def get_providers_only(
|
||||
self, skip: int = 0, limit: int = 100
|
||||
) -> List[ClientProviderBasicDTO]:
|
||||
"""Obtiene solo proveedores (provider)"""
|
||||
query = self.db.query(ClientProvider).filter(
|
||||
ClientProvider.client_or_provider == "provider"
|
||||
)
|
||||
providers = query.offset(skip).limit(limit).all()
|
||||
return [
|
||||
ClientProviderBasicDTO.model_validate(provider) for provider in providers
|
||||
]
|
||||
|
||||
def search_by_rfc(self, rfc: str) -> List[ClientProviderBasicDTO]:
|
||||
"""Busca clientes/proveedores por RFC"""
|
||||
clients = (
|
||||
self.db.query(ClientProvider)
|
||||
.filter(ClientProvider.rfc.ilike(f"%{rfc}%"))
|
||||
.all()
|
||||
)
|
||||
return [ClientProviderBasicDTO.model_validate(client) for client in clients]
|
||||
|
||||
def toggle_status(self, client_id: str) -> Optional[ClientProviderResponseDTO]:
|
||||
"""Cambia el estado habilitado/deshabilitado"""
|
||||
client = (
|
||||
self.db.query(ClientProvider)
|
||||
.filter(ClientProvider.client_id == client_id)
|
||||
.first()
|
||||
)
|
||||
if not client:
|
||||
return None
|
||||
|
||||
# Toggle status (1 = habilitado, 0 = deshabilitado)
|
||||
client.enabled_disabled = 1 if client.enabled_disabled == 0 else 0
|
||||
|
||||
try:
|
||||
self.db.commit()
|
||||
logger.info(
|
||||
f"Client/Provider status toggled: {client_id} -> {client.enabled_disabled}"
|
||||
)
|
||||
return self._get_client_with_relations(client_id)
|
||||
except Exception as e:
|
||||
self.db.rollback()
|
||||
logger.error(f"Error toggling status for {client_id}: {str(e)}")
|
||||
raise HTTPException(status_code=500, detail="Error updating status")
|
||||
)
|
||||
Reference in New Issue
Block a user