Add legacy SQLAlchemy models mapped from docs/legacy-schema.md: ROLODEX, PHONE, FILES (+R/V), LEDGER, FILESTAT, FOOTERS, EMPLOYEE, STATES, GRUPLKUP, PRINTERS, SETUP, DEPOSITS, PAYMENTS (legacy), TRNSTYPE, TRNSLKUP, PLANINFO, QDROS, PENSIONS (+RESULTS/MARRIAGE/DEATH/SCHEDULE/SEPARATE). Add appropriate FKs and indexes; keep modern models intact.
This commit is contained in:
467
app/models.py
467
app/models.py
@@ -4,7 +4,7 @@ SQLAlchemy models for the Delphi database.
|
|||||||
All models inherit from Base which is configured in the database module.
|
All models inherit from Base which is configured in the database module.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Float, Text, Boolean
|
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Float, Text, Boolean, Date, Numeric, Index, UniqueConstraint, ForeignKeyConstraint
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
from sqlalchemy.sql import func
|
from sqlalchemy.sql import func
|
||||||
@@ -218,3 +218,468 @@ class ImportLog(Base):
|
|||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<ImportLog(id={self.id}, type='{self.import_type}', status='{self.status}')>"
|
return f"<ImportLog(id={self.id}, type='{self.import_type}', status='{self.status}')>"
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# Legacy schema models (read-only/migration support)
|
||||||
|
# Derived from docs/legacy-schema.md
|
||||||
|
# -----------------------------
|
||||||
|
|
||||||
|
|
||||||
|
class Rolodex(Base):
|
||||||
|
"""
|
||||||
|
Legacy ROLODEX master table.
|
||||||
|
|
||||||
|
Primary key is the human-readable `Id`.
|
||||||
|
"""
|
||||||
|
__tablename__ = "rolodex"
|
||||||
|
|
||||||
|
id = Column(String, primary_key=True, index=True) # Id (TEXT)
|
||||||
|
prefix = Column(String)
|
||||||
|
first = Column(String)
|
||||||
|
middle = Column(String)
|
||||||
|
last = Column(String, index=True)
|
||||||
|
suffix = Column(String)
|
||||||
|
title = Column(String)
|
||||||
|
a1 = Column(String)
|
||||||
|
a2 = Column(String)
|
||||||
|
a3 = Column(String)
|
||||||
|
city = Column(String)
|
||||||
|
abrev = Column(String(2)) # state abbreviation
|
||||||
|
st = Column(String) # state name
|
||||||
|
zip = Column(String(10))
|
||||||
|
email = Column(String)
|
||||||
|
dob = Column(Date)
|
||||||
|
ss = Column(String) # SS#
|
||||||
|
legal_status = Column(String)
|
||||||
|
group = Column(String)
|
||||||
|
memo = Column(Text)
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
Index("ix_rolodex_last_first", "last", "first"),
|
||||||
|
Index("ix_rolodex_group", "group"),
|
||||||
|
Index("ix_rolodex_email", "email"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class LegacyPhone(Base):
|
||||||
|
"""
|
||||||
|
Legacy PHONE table (phones by Rolodex Id).
|
||||||
|
|
||||||
|
Composite PK on (id, phone) to prevent duplicates per person.
|
||||||
|
"""
|
||||||
|
__tablename__ = "phone"
|
||||||
|
|
||||||
|
id = Column(String, ForeignKey("rolodex.id", ondelete="CASCADE"), primary_key=True, index=True)
|
||||||
|
phone = Column(String, primary_key=True)
|
||||||
|
location = Column(String)
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
Index("ix_phone_id", "id"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TrnsType(Base):
|
||||||
|
"""TRNSTYPE (transaction groups)."""
|
||||||
|
__tablename__ = "trnstype"
|
||||||
|
|
||||||
|
t_type = Column(String, primary_key=True)
|
||||||
|
t_type_l = Column(String)
|
||||||
|
header = Column(String)
|
||||||
|
footer = Column(String)
|
||||||
|
|
||||||
|
|
||||||
|
class TrnsLkup(Base):
|
||||||
|
"""TRNSLKUP (transaction codes)."""
|
||||||
|
__tablename__ = "trnslkup"
|
||||||
|
|
||||||
|
t_code = Column(String, primary_key=True)
|
||||||
|
t_type = Column(String, ForeignKey("trnstype.t_type"), index=True)
|
||||||
|
t_type_l = Column(String)
|
||||||
|
amount = Column(Numeric(12, 2))
|
||||||
|
description = Column(Text)
|
||||||
|
|
||||||
|
|
||||||
|
class Footers(Base):
|
||||||
|
"""FOOTERS table for footer codes and labels."""
|
||||||
|
__tablename__ = "footers"
|
||||||
|
|
||||||
|
f_code = Column(String, primary_key=True)
|
||||||
|
f_footer = Column(Text)
|
||||||
|
|
||||||
|
|
||||||
|
class FileStat(Base):
|
||||||
|
"""FILESTAT table for file statuses."""
|
||||||
|
__tablename__ = "filestat"
|
||||||
|
|
||||||
|
status = Column(String, primary_key=True)
|
||||||
|
definition = Column(Text)
|
||||||
|
send = Column(String)
|
||||||
|
footer_code = Column(String, ForeignKey("footers.f_code"), index=True)
|
||||||
|
|
||||||
|
|
||||||
|
class Employee(Base):
|
||||||
|
"""EMPLOYEE table linking employees to `Rolodex` and rate."""
|
||||||
|
__tablename__ = "employee"
|
||||||
|
|
||||||
|
empl_num = Column(String, primary_key=True)
|
||||||
|
empl_id = Column(String, ForeignKey("rolodex.id"), index=True)
|
||||||
|
rate_per_hour = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
|
||||||
|
class States(Base):
|
||||||
|
"""STATES reference table."""
|
||||||
|
__tablename__ = "states"
|
||||||
|
|
||||||
|
abrev = Column(String(2), primary_key=True)
|
||||||
|
st = Column(String)
|
||||||
|
|
||||||
|
|
||||||
|
class GroupLkup(Base):
|
||||||
|
"""GRUPLKUP reference table."""
|
||||||
|
__tablename__ = "gruplkup"
|
||||||
|
|
||||||
|
code = Column(String, primary_key=True)
|
||||||
|
description = Column(Text)
|
||||||
|
title = Column(String)
|
||||||
|
|
||||||
|
|
||||||
|
class Printers(Base):
|
||||||
|
"""PRINTERS configuration table."""
|
||||||
|
__tablename__ = "printers"
|
||||||
|
|
||||||
|
number = Column(Integer, primary_key=True)
|
||||||
|
name = Column(String)
|
||||||
|
port = Column(String)
|
||||||
|
page_break = Column(String)
|
||||||
|
setup_st = Column(String)
|
||||||
|
phone_book = Column(String)
|
||||||
|
rolodex_info = Column(String)
|
||||||
|
envelope = Column(String)
|
||||||
|
file_cabinet = Column(String)
|
||||||
|
accounts = Column(String)
|
||||||
|
statements = Column(String)
|
||||||
|
calendar = Column(String)
|
||||||
|
reset_st = Column(String)
|
||||||
|
b_underline = Column(String)
|
||||||
|
e_underline = Column(String)
|
||||||
|
b_bold = Column(String)
|
||||||
|
e_bold = Column(String)
|
||||||
|
|
||||||
|
|
||||||
|
class Setup(Base):
|
||||||
|
"""
|
||||||
|
SETUP application configuration. Not strictly keyed in legacy; introduce surrogate PK.
|
||||||
|
"""
|
||||||
|
__tablename__ = "setup"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
|
appl_title = Column(String)
|
||||||
|
l_head1 = Column(String)
|
||||||
|
l_head2 = Column(String)
|
||||||
|
l_head3 = Column(String)
|
||||||
|
l_head4 = Column(String)
|
||||||
|
l_head5 = Column(String)
|
||||||
|
l_head6 = Column(String)
|
||||||
|
l_head7 = Column(String)
|
||||||
|
l_head8 = Column(String)
|
||||||
|
l_head9 = Column(String)
|
||||||
|
l_head10 = Column(String)
|
||||||
|
default_printer = Column(Integer, ForeignKey("printers.number"), index=True)
|
||||||
|
|
||||||
|
|
||||||
|
class LegacyFile(Base):
|
||||||
|
"""
|
||||||
|
FILES (file cabinet) primary table.
|
||||||
|
"""
|
||||||
|
__tablename__ = "files"
|
||||||
|
|
||||||
|
file_no = Column(String, primary_key=True, index=True)
|
||||||
|
id = Column(String, ForeignKey("rolodex.id"), index=True)
|
||||||
|
file_type = Column(String, index=True)
|
||||||
|
regarding = Column(Text)
|
||||||
|
opened = Column(Date)
|
||||||
|
closed = Column(Date)
|
||||||
|
empl_num = Column(String, ForeignKey("employee.empl_num"), index=True)
|
||||||
|
rate_per_hour = Column(Numeric(12, 2))
|
||||||
|
status = Column(String, ForeignKey("filestat.status"), index=True)
|
||||||
|
footer_code = Column(String, ForeignKey("footers.f_code"), index=True)
|
||||||
|
opposing = Column(String, ForeignKey("rolodex.id"), index=True)
|
||||||
|
hours = Column(Numeric(12, 2))
|
||||||
|
hours_p = Column(Numeric(12, 2))
|
||||||
|
trust_bal = Column(Numeric(12, 2))
|
||||||
|
trust_bal_p = Column(Numeric(12, 2))
|
||||||
|
hourly_fees = Column(Numeric(12, 2))
|
||||||
|
hourly_fees_p = Column(Numeric(12, 2))
|
||||||
|
flat_fees = Column(Numeric(12, 2))
|
||||||
|
flat_fees_p = Column(Numeric(12, 2))
|
||||||
|
disbursements = Column(Numeric(12, 2))
|
||||||
|
disbursements_p = Column(Numeric(12, 2))
|
||||||
|
credit_bal = Column(Numeric(12, 2))
|
||||||
|
credit_bal_p = Column(Numeric(12, 2))
|
||||||
|
total_charges = Column(Numeric(12, 2))
|
||||||
|
total_charges_p = Column(Numeric(12, 2))
|
||||||
|
amount_owing = Column(Numeric(12, 2))
|
||||||
|
amount_owing_p = Column(Numeric(12, 2))
|
||||||
|
transferable = Column(Numeric(12, 2))
|
||||||
|
memo = Column(Text)
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
Index("ix_files_id", "id"),
|
||||||
|
Index("ix_files_opposing", "opposing"),
|
||||||
|
Index("ix_files_status", "status"),
|
||||||
|
Index("ix_files_type", "file_type"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class FilesR(Base):
|
||||||
|
"""FILES_R relationships per file."""
|
||||||
|
__tablename__ = "files_r"
|
||||||
|
|
||||||
|
file_no = Column(String, ForeignKey("files.file_no", ondelete="CASCADE"), primary_key=True)
|
||||||
|
relationship = Column(String, primary_key=True)
|
||||||
|
rolodex_id = Column(String, ForeignKey("rolodex.id", ondelete="CASCADE"), primary_key=True)
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
Index("ix_files_r_rolodex_id", "rolodex_id"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class FilesV(Base):
|
||||||
|
"""FILES_V variables per file."""
|
||||||
|
__tablename__ = "files_v"
|
||||||
|
|
||||||
|
file_no = Column(String, ForeignKey("files.file_no", ondelete="CASCADE"), primary_key=True)
|
||||||
|
identifier = Column(String, primary_key=True)
|
||||||
|
response = Column(Text)
|
||||||
|
|
||||||
|
|
||||||
|
class Ledger(Base):
|
||||||
|
"""LEDGER entries for time/charges per file."""
|
||||||
|
__tablename__ = "ledger"
|
||||||
|
|
||||||
|
file_no = Column(String, ForeignKey("files.file_no", ondelete="CASCADE"), primary_key=True)
|
||||||
|
date = Column(Date, index=True)
|
||||||
|
item_no = Column(Integer, primary_key=True)
|
||||||
|
empl_num = Column(String, ForeignKey("employee.empl_num"), index=True)
|
||||||
|
t_code = Column(String, ForeignKey("trnslkup.t_code"), index=True)
|
||||||
|
t_type = Column(String, ForeignKey("trnstype.t_type"), index=True)
|
||||||
|
t_type_l = Column(String)
|
||||||
|
quantity = Column(Numeric(12, 2))
|
||||||
|
rate = Column(Numeric(12, 2))
|
||||||
|
amount = Column(Numeric(12, 2))
|
||||||
|
billed = Column(String(1)) # 'Y' or 'N'
|
||||||
|
note = Column(Text)
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
Index("ix_ledger_file_date", "file_no", "date"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Deposits(Base):
|
||||||
|
"""DEPOSITS daily totals."""
|
||||||
|
__tablename__ = "deposits"
|
||||||
|
|
||||||
|
deposit_date = Column(Date, primary_key=True)
|
||||||
|
total = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
|
||||||
|
class LegacyPayment(Base):
|
||||||
|
"""PAYMENTS legacy payments (separate from modern `payments`)."""
|
||||||
|
__tablename__ = "payments_legacy"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
|
deposit_date = Column(Date, ForeignKey("deposits.deposit_date"), index=True)
|
||||||
|
file_no = Column(String, ForeignKey("files.file_no"), index=True)
|
||||||
|
rolodex_id = Column(String, ForeignKey("rolodex.id"), index=True)
|
||||||
|
regarding = Column(Text)
|
||||||
|
amount = Column(Numeric(12, 2))
|
||||||
|
note = Column(Text)
|
||||||
|
|
||||||
|
|
||||||
|
class PlanInfo(Base):
|
||||||
|
"""PLANINFO reference table."""
|
||||||
|
__tablename__ = "planinfo"
|
||||||
|
|
||||||
|
plan_id = Column(String, primary_key=True)
|
||||||
|
plan_name = Column(String)
|
||||||
|
plan_type = Column(String)
|
||||||
|
empl_id_no = Column(String)
|
||||||
|
plan_no = Column(String)
|
||||||
|
nra = Column(String)
|
||||||
|
era = Column(String)
|
||||||
|
errf = Column(String)
|
||||||
|
colas = Column(String)
|
||||||
|
divided_by = Column(String)
|
||||||
|
drafted = Column(String)
|
||||||
|
benefit_c = Column(String)
|
||||||
|
qdro_c = Column(String)
|
||||||
|
rev = Column(String) # ^REV
|
||||||
|
pa = Column(String) # ^PA
|
||||||
|
form_name = Column(String)
|
||||||
|
drafted_on = Column(Date)
|
||||||
|
memo = Column(Text)
|
||||||
|
|
||||||
|
|
||||||
|
class Qdros(Base):
|
||||||
|
"""QDROS table for QDRO case data."""
|
||||||
|
__tablename__ = "qdros"
|
||||||
|
|
||||||
|
file_no = Column(String, ForeignKey("files.file_no"), primary_key=True)
|
||||||
|
version = Column(String, primary_key=True)
|
||||||
|
plan_id = Column(String, ForeignKey("planinfo.plan_id"), index=True)
|
||||||
|
_1 = Column(String) # ^1
|
||||||
|
_2 = Column(String) # ^2
|
||||||
|
part = Column(String) # ^Part
|
||||||
|
altp = Column(String) # ^AltP
|
||||||
|
pet = Column(String) # ^Pet
|
||||||
|
res = Column(String) # ^Res
|
||||||
|
case_type = Column(String)
|
||||||
|
case_code = Column(String)
|
||||||
|
section = Column(String)
|
||||||
|
case_number = Column(String)
|
||||||
|
judgment_date = Column(Date)
|
||||||
|
valuation_date = Column(Date)
|
||||||
|
married_on = Column(Date)
|
||||||
|
percent_awarded = Column(Numeric(12, 2))
|
||||||
|
ven_city = Column(String)
|
||||||
|
ven_cnty = Column(String)
|
||||||
|
ven_st = Column(String(2))
|
||||||
|
draft_out = Column(Date)
|
||||||
|
draft_apr = Column(Date)
|
||||||
|
final_out = Column(Date)
|
||||||
|
judge = Column(String)
|
||||||
|
form_name = Column(String)
|
||||||
|
|
||||||
|
|
||||||
|
class Pensions(Base):
|
||||||
|
"""PENSIONS primary table; composite key (file_no, version)."""
|
||||||
|
__tablename__ = "pensions"
|
||||||
|
|
||||||
|
file_no = Column(String, ForeignKey("files.file_no"), primary_key=True)
|
||||||
|
version = Column(String, primary_key=True)
|
||||||
|
plan_id = Column(String, ForeignKey("planinfo.plan_id"), index=True)
|
||||||
|
plan_name = Column(String)
|
||||||
|
title = Column(String)
|
||||||
|
first = Column(String)
|
||||||
|
last = Column(String)
|
||||||
|
birth = Column(Date)
|
||||||
|
race = Column(String)
|
||||||
|
sex = Column(String)
|
||||||
|
info = Column(Date)
|
||||||
|
valu = Column(Date)
|
||||||
|
accrued = Column(Numeric(12, 2))
|
||||||
|
vested_per = Column(Numeric(12, 2))
|
||||||
|
start_age = Column(Numeric(12, 2))
|
||||||
|
cola = Column(Numeric(12, 2))
|
||||||
|
max_cola = Column(Numeric(12, 2))
|
||||||
|
withdrawal = Column(Numeric(12, 2))
|
||||||
|
pre_dr = Column(Numeric(12, 2))
|
||||||
|
post_dr = Column(Numeric(12, 2))
|
||||||
|
tax_rate = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
|
||||||
|
class PensionResults(Base):
|
||||||
|
"""RESULTS derived values per pension (by file_no, version)."""
|
||||||
|
__tablename__ = "pension_results"
|
||||||
|
|
||||||
|
file_no = Column(String, primary_key=True)
|
||||||
|
version = Column(String, primary_key=True)
|
||||||
|
|
||||||
|
accrued = Column(Numeric(12, 2))
|
||||||
|
start_age = Column(Numeric(12, 2))
|
||||||
|
cola = Column(Numeric(12, 2))
|
||||||
|
withdrawal = Column(Numeric(12, 2))
|
||||||
|
pre_dr = Column(Numeric(12, 2))
|
||||||
|
post_dr = Column(Numeric(12, 2))
|
||||||
|
tax_rate = Column(Numeric(12, 2))
|
||||||
|
age = Column(Numeric(12, 2))
|
||||||
|
years_from = Column(Numeric(12, 2))
|
||||||
|
life_exp = Column(Numeric(12, 2))
|
||||||
|
ev_monthly = Column(Numeric(12, 2))
|
||||||
|
payments = Column(Numeric(12, 2))
|
||||||
|
pay_out = Column(Numeric(12, 2))
|
||||||
|
fund_value = Column(Numeric(12, 2))
|
||||||
|
pv = Column(Numeric(12, 2))
|
||||||
|
mortality = Column(Numeric(12, 2))
|
||||||
|
pv_am = Column(Numeric(12, 2))
|
||||||
|
pv_amt = Column(Numeric(12, 2))
|
||||||
|
pv_pre_db = Column(Numeric(12, 2))
|
||||||
|
pv_annuity = Column(Numeric(12, 2))
|
||||||
|
wv_at = Column(Numeric(12, 2))
|
||||||
|
pv_plan = Column(Numeric(12, 2))
|
||||||
|
years_married = Column(Numeric(12, 2))
|
||||||
|
years_service = Column(Numeric(12, 2))
|
||||||
|
marr_per = Column(Numeric(12, 2))
|
||||||
|
marr_amt = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
ForeignKeyConstraint(["file_no", "version"], ["pensions.file_no", "pensions.version"], ondelete="CASCADE"),
|
||||||
|
Index("ix_pension_results_file_version", "file_no", "version"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class PensionMarriage(Base):
|
||||||
|
"""MARRIAGE periods related to pensions."""
|
||||||
|
__tablename__ = "pension_marriage"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
|
file_no = Column(String, nullable=False)
|
||||||
|
version = Column(String, nullable=False)
|
||||||
|
married_from = Column(Date)
|
||||||
|
married_to = Column(Date)
|
||||||
|
married_years = Column(Numeric(12, 2))
|
||||||
|
service_from = Column(Date)
|
||||||
|
service_to = Column(Date)
|
||||||
|
service_years = Column(Numeric(12, 2))
|
||||||
|
marital_pct = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
ForeignKeyConstraint(["file_no", "version"], ["pensions.file_no", "pensions.version"], ondelete="CASCADE"),
|
||||||
|
Index("ix_pension_marriage_file_version", "file_no", "version"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class PensionDeath(Base):
|
||||||
|
"""DEATH related amounts for pensions."""
|
||||||
|
__tablename__ = "pension_death"
|
||||||
|
|
||||||
|
file_no = Column(String, primary_key=True)
|
||||||
|
version = Column(String, primary_key=True)
|
||||||
|
lump1 = Column(Numeric(12, 2))
|
||||||
|
lump2 = Column(Numeric(12, 2))
|
||||||
|
growth1 = Column(Numeric(12, 2))
|
||||||
|
growth2 = Column(Numeric(12, 2))
|
||||||
|
disc1 = Column(Numeric(12, 2))
|
||||||
|
disc2 = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
ForeignKeyConstraint(["file_no", "version"], ["pensions.file_no", "pensions.version"], ondelete="CASCADE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class PensionSchedule(Base):
|
||||||
|
"""SCHEDULE vesting schedule for pensions."""
|
||||||
|
__tablename__ = "pension_schedule"
|
||||||
|
|
||||||
|
file_no = Column(String, primary_key=True)
|
||||||
|
version = Column(String, primary_key=True)
|
||||||
|
vests_on = Column(Date)
|
||||||
|
vests_at = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
ForeignKeyConstraint(["file_no", "version"], ["pensions.file_no", "pensions.version"], ondelete="CASCADE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class PensionSeparate(Base):
|
||||||
|
"""SEPARATE calculations for pensions."""
|
||||||
|
__tablename__ = "pension_separate"
|
||||||
|
|
||||||
|
file_no = Column(String, primary_key=True)
|
||||||
|
version = Column(String, primary_key=True)
|
||||||
|
separation_rate = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
ForeignKeyConstraint(["file_no", "version"], ["pensions.file_no", "pensions.version"], ondelete="CASCADE"),
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user