Especificación Técnica: cat_monedas¶
Esquema: core.identidad
Base de Datos: core
Servicio: svc-identidad
Tabla Legacy Origen: core_sigfa.cat_monedas
Propósito: Catálogo global de monedas para transacciones y operaciones del núcleo.
1. Justificación y Mejoras de Arquitectura¶
- Adaptado de core_sigfa a catálogo global: sin columna empresa_id.
- PK UUID con gen_random_uuid() y unique sobre codigo (ISO 4217).
- Conserva simbolo para representación en UI y reportes.
2. Definiciones de Implementación¶
Table core.identidad.cat_monedas {
id uuid [pk, default: `gen_random_uuid()`]
codigo varchar(10) [not null]
nombre varchar(100) [not null]
simbolo varchar(5)
// Auditoría General
is_activo boolean [not null, default: `true`, note: 'Estado lógico del registro']
created_at timestamptz [not null, default: `now()`, note: 'Fecha de creación']
updated_at timestamptz [not null, default: `now()`, note: 'Fecha de última actualización']
deleted_at timestamptz [note: 'Fecha de eliminación lógica']
created_by uuid [note: 'Usuario creador']
updated_by uuid [note: 'Usuario modificador']
Indexes {
(codigo) [unique, name: 'uq_cat_monedas_codigo']
}
}
CREATE TABLE IF NOT EXISTS core.identidad.cat_monedas (
id UUID NOT NULL DEFAULT gen_random_uuid() PRIMARY KEY,
codigo VARCHAR(10) NOT NULL,
nombre VARCHAR(100) NOT NULL,
simbolo VARCHAR(5),
-- Auditoría General
is_activo BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
deleted_at TIMESTAMPTZ,
created_by UUID,
updated_by UUID,
CONSTRAINT uq_cat_monedas_codigo UNIQUE (codigo)
);
-- Comentarios
COMMENT ON COLUMN core.identidad.cat_monedas.codigo IS 'Código de moneda (ISO 4217)';
COMMENT ON COLUMN core.identidad.cat_monedas.nombre IS 'Nombre de la moneda';
COMMENT ON COLUMN core.identidad.cat_monedas.simbolo IS 'Símbolo de la moneda';
from datetime import datetime, date
from typing import Optional
import uuid
from sqlalchemy import (
BigInteger,
Boolean,
CheckConstraint,
Date,
DateTime,
ForeignKey,
Identity,
Index,
Integer,
SmallInteger,
String,
Text,
UniqueConstraint,
text,
)
from sqlalchemy.dialects import postgresql
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class CatMonedas(Base):
__tablename__ = 'cat_monedas'
__table_args__ = (
UniqueConstraint('codigo', name='uq_cat_monedas_codigo'),
{"schema": 'core.identidad'},
)
id: Mapped[uuid.UUID] = mapped_column(
UUID(as_uuid=True),
primary_key=True,
server_default=text("gen_random_uuid()"),
)
codigo: Mapped[str] = mapped_column(
String(10),
nullable=False,
comment='Código de moneda (ISO 4217)',
)
nombre: Mapped[str] = mapped_column(
String(100),
nullable=False,
comment='Nombre de la moneda',
)
simbolo: Mapped[str | None] = mapped_column(
String(5),
comment='Símbolo de la moneda',
)
# Auditoría General
is_activo: Mapped[bool] = mapped_column(
Boolean,
nullable=False,
server_default=text("true"),
comment='Estado lógico del registro',
)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
nullable=False,
server_default=text("now()"),
comment='Fecha de creación',
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
nullable=False,
server_default=text("now()"),
comment='Fecha de última actualización',
)
deleted_at: Mapped[datetime | None] = mapped_column(
DateTime(timezone=True),
comment='Fecha de eliminación lógica',
)
created_by: Mapped[uuid.UUID | None] = mapped_column(
UUID(as_uuid=True),
comment='Usuario creador',
)
updated_by: Mapped[uuid.UUID | None] = mapped_column(
UUID(as_uuid=True),
comment='Usuario modificador',
)
"""revision: core_id_0005
create table core.identidad.cat_monedas
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
revision: str = 'core_id_0005'
down_revision: str | None = 'core_id_0004'
branch_labels: str | None = None
depends_on: str | None = None
def upgrade() -> None:
op.create_table(
'cat_monedas',
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, server_default=sa.text("gen_random_uuid()")),
sa.Column("codigo", sa.String(length=10), nullable=False),
sa.Column("nombre", sa.String(length=100), nullable=False),
sa.Column("simbolo", sa.String(length=5)),
sa.Column("is_activo", sa.Boolean(), nullable=False, server_default=sa.text("true")),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("now()")),
sa.Column("deleted_at", sa.DateTime(timezone=True)),
sa.Column("created_by", postgresql.UUID(as_uuid=True)),
sa.Column("updated_by", postgresql.UUID(as_uuid=True)),
sa.UniqueConstraint('codigo', name='uq_cat_monedas_codigo'),
schema='core.identidad',
)
def downgrade() -> None:
op.drop_table('cat_monedas', schema='core.identidad')