svod2-filter-fix2: если заполнен только всп не берем в свод 2
This commit is contained in:
parent
f92c0e8d32
commit
8d6e7ba51b
@ -1,4 +1,4 @@
|
|||||||
-- Keep source lines with a related data record. For plan and quarter data,
|
-- Keep source lines with a related data record. For plan, quarter and rent data,
|
||||||
-- require a nonzero number, a date, or text containing a non-whitespace character.
|
-- require a nonzero number, a date, or text containing a non-whitespace character.
|
||||||
-- Other data sections qualify by record presence, even if their fields are empty.
|
-- Other data sections qualify by record presence, even if their fields are empty.
|
||||||
-- DISTINCT prevents one-to-many joins from duplicating lines before pagination.
|
-- DISTINCT prevents one-to-many joins from duplicating lines before pagination.
|
||||||
@ -123,7 +123,27 @@ WITH empty_sections AS MATERIALIZED (
|
|||||||
OR presence_budget_line_quarter.plan_revision_sequester <> 0
|
OR presence_budget_line_quarter.plan_revision_sequester <> 0
|
||||||
OR presence_budget_line_quarter.plan_revision_comment ~ '[^[:space:]]'
|
OR presence_budget_line_quarter.plan_revision_comment ~ '[^[:space:]]'
|
||||||
)
|
)
|
||||||
OR presence_rent_detail.line_id IS NOT NULL
|
OR (
|
||||||
|
presence_rent_detail.contract_number ~ '[^[:space:]]'
|
||||||
|
OR presence_rent_detail.contract_end_date IS NOT NULL
|
||||||
|
OR presence_rent_detail.plan_q1 <> 0
|
||||||
|
OR presence_rent_detail.plan_q2 <> 0
|
||||||
|
OR presence_rent_detail.plan_q3 <> 0
|
||||||
|
OR presence_rent_detail.plan_q4 <> 0
|
||||||
|
OR presence_rent_detail.actual_jan <> 0
|
||||||
|
OR presence_rent_detail.actual_feb <> 0
|
||||||
|
OR presence_rent_detail.actual_mar <> 0
|
||||||
|
OR presence_rent_detail.actual_apr <> 0
|
||||||
|
OR presence_rent_detail.actual_may <> 0
|
||||||
|
OR presence_rent_detail.actual_jun <> 0
|
||||||
|
OR presence_rent_detail.actual_jul <> 0
|
||||||
|
OR presence_rent_detail.actual_aug <> 0
|
||||||
|
OR presence_rent_detail.actual_sep <> 0
|
||||||
|
OR presence_rent_detail.actual_oct <> 0
|
||||||
|
OR presence_rent_detail.actual_nov <> 0
|
||||||
|
OR presence_rent_detail.actual_dec <> 0
|
||||||
|
OR presence_rent_detail.comment ~ '[^[:space:]]'
|
||||||
|
)
|
||||||
OR presence_security_detail.line_id IS NOT NULL
|
OR presence_security_detail.line_id IS NOT NULL
|
||||||
OR presence_utility_detail.line_id IS NOT NULL
|
OR presence_utility_detail.line_id IS NOT NULL
|
||||||
)
|
)
|
||||||
@ -401,7 +421,27 @@ WITH empty_sections AS MATERIALIZED (
|
|||||||
OR presence_budget_line_quarter.plan_revision_sequester <> 0
|
OR presence_budget_line_quarter.plan_revision_sequester <> 0
|
||||||
OR presence_budget_line_quarter.plan_revision_comment ~ '[^[:space:]]'
|
OR presence_budget_line_quarter.plan_revision_comment ~ '[^[:space:]]'
|
||||||
)
|
)
|
||||||
OR presence_rent_detail.line_id IS NOT NULL
|
OR (
|
||||||
|
presence_rent_detail.contract_number ~ '[^[:space:]]'
|
||||||
|
OR presence_rent_detail.contract_end_date IS NOT NULL
|
||||||
|
OR presence_rent_detail.plan_q1 <> 0
|
||||||
|
OR presence_rent_detail.plan_q2 <> 0
|
||||||
|
OR presence_rent_detail.plan_q3 <> 0
|
||||||
|
OR presence_rent_detail.plan_q4 <> 0
|
||||||
|
OR presence_rent_detail.actual_jan <> 0
|
||||||
|
OR presence_rent_detail.actual_feb <> 0
|
||||||
|
OR presence_rent_detail.actual_mar <> 0
|
||||||
|
OR presence_rent_detail.actual_apr <> 0
|
||||||
|
OR presence_rent_detail.actual_may <> 0
|
||||||
|
OR presence_rent_detail.actual_jun <> 0
|
||||||
|
OR presence_rent_detail.actual_jul <> 0
|
||||||
|
OR presence_rent_detail.actual_aug <> 0
|
||||||
|
OR presence_rent_detail.actual_sep <> 0
|
||||||
|
OR presence_rent_detail.actual_oct <> 0
|
||||||
|
OR presence_rent_detail.actual_nov <> 0
|
||||||
|
OR presence_rent_detail.actual_dec <> 0
|
||||||
|
OR presence_rent_detail.comment ~ '[^[:space:]]'
|
||||||
|
)
|
||||||
OR presence_security_detail.line_id IS NOT NULL
|
OR presence_security_detail.line_id IS NOT NULL
|
||||||
OR presence_utility_detail.line_id IS NOT NULL
|
OR presence_utility_detail.line_id IS NOT NULL
|
||||||
)
|
)
|
||||||
@ -674,7 +714,27 @@ WITH eligible_lines AS (
|
|||||||
OR presence_budget_line_quarter.plan_revision_sequester <> 0
|
OR presence_budget_line_quarter.plan_revision_sequester <> 0
|
||||||
OR presence_budget_line_quarter.plan_revision_comment ~ '[^[:space:]]'
|
OR presence_budget_line_quarter.plan_revision_comment ~ '[^[:space:]]'
|
||||||
)
|
)
|
||||||
OR presence_rent_detail.line_id IS NOT NULL
|
OR (
|
||||||
|
presence_rent_detail.contract_number ~ '[^[:space:]]'
|
||||||
|
OR presence_rent_detail.contract_end_date IS NOT NULL
|
||||||
|
OR presence_rent_detail.plan_q1 <> 0
|
||||||
|
OR presence_rent_detail.plan_q2 <> 0
|
||||||
|
OR presence_rent_detail.plan_q3 <> 0
|
||||||
|
OR presence_rent_detail.plan_q4 <> 0
|
||||||
|
OR presence_rent_detail.actual_jan <> 0
|
||||||
|
OR presence_rent_detail.actual_feb <> 0
|
||||||
|
OR presence_rent_detail.actual_mar <> 0
|
||||||
|
OR presence_rent_detail.actual_apr <> 0
|
||||||
|
OR presence_rent_detail.actual_may <> 0
|
||||||
|
OR presence_rent_detail.actual_jun <> 0
|
||||||
|
OR presence_rent_detail.actual_jul <> 0
|
||||||
|
OR presence_rent_detail.actual_aug <> 0
|
||||||
|
OR presence_rent_detail.actual_sep <> 0
|
||||||
|
OR presence_rent_detail.actual_oct <> 0
|
||||||
|
OR presence_rent_detail.actual_nov <> 0
|
||||||
|
OR presence_rent_detail.actual_dec <> 0
|
||||||
|
OR presence_rent_detail.comment ~ '[^[:space:]]'
|
||||||
|
)
|
||||||
OR presence_security_detail.line_id IS NOT NULL
|
OR presence_security_detail.line_id IS NOT NULL
|
||||||
OR presence_utility_detail.line_id IS NOT NULL
|
OR presence_utility_detail.line_id IS NOT NULL
|
||||||
)
|
)
|
||||||
|
|||||||
@ -22,7 +22,7 @@ def data_columns(table):
|
|||||||
for node in ast.walk(ast.parse(path.read_text()))
|
for node in ast.walk(ast.parse(path.read_text()))
|
||||||
if isinstance(node, ast.AnnAssign)
|
if isinstance(node, ast.AnnAssign)
|
||||||
and isinstance(node.target, ast.Name)
|
and isinstance(node.target, ast.Name)
|
||||||
and node.target.id not in ("line_id", "quarter")
|
and node.target.id not in ("id", "line_id", "vsp_id", "quarter")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -46,9 +46,11 @@ class Summary2RelatedRecordsSQLTest(unittest.TestCase):
|
|||||||
""")
|
""")
|
||||||
for table in TABLES:
|
for table in TABLES:
|
||||||
columns = "line_id"
|
columns = "line_id"
|
||||||
if table in ("plan", "budget_line_quarter"):
|
if table in ("plan", "budget_line_quarter", "rent_detail"):
|
||||||
columns += "".join(f", {field} {'NUMERIC' if kind == 'Numeric' else 'TEXT'}"
|
columns += "".join(f", {field} {'NUMERIC' if kind == 'Numeric' else 'TEXT'}"
|
||||||
for field, kind in data_columns(table).items())
|
for field, kind in data_columns(table).items())
|
||||||
|
if table == "rent_detail":
|
||||||
|
columns += ", id, vsp_id"
|
||||||
if table == "budget_line_quarter":
|
if table == "budget_line_quarter":
|
||||||
columns += ", quarter"
|
columns += ", quarter"
|
||||||
if table == "contract_detail":
|
if table == "contract_detail":
|
||||||
@ -81,7 +83,7 @@ class Summary2RelatedRecordsSQLTest(unittest.TestCase):
|
|||||||
self.db.execute(f"INSERT INTO v3.{table}(line_id) VALUES (999)")
|
self.db.execute(f"INSERT INTO v3.{table}(line_id) VALUES (999)")
|
||||||
self.assertEqual(self.rows(index), [])
|
self.assertEqual(self.rows(index), [])
|
||||||
self.db.execute(f"INSERT INTO v3.{table}(line_id) VALUES (1)")
|
self.db.execute(f"INSERT INTO v3.{table}(line_id) VALUES (1)")
|
||||||
self.assertEqual(len(self.rows(index)), 0 if table in ("plan", "budget_line_quarter") else 1)
|
self.assertEqual(len(self.rows(index)), 0 if table in ("plan", "budget_line_quarter", "rent_detail") else 1)
|
||||||
self.db.execute(f"DELETE FROM v3.{table}")
|
self.db.execute(f"DELETE FROM v3.{table}")
|
||||||
|
|
||||||
def test_multiple_related_records_do_not_duplicate_lines(self):
|
def test_multiple_related_records_do_not_duplicate_lines(self):
|
||||||
@ -92,15 +94,16 @@ class Summary2RelatedRecordsSQLTest(unittest.TestCase):
|
|||||||
("FORM_2" if index == 1 else "FORM_4",))
|
("FORM_2" if index == 1 else "FORM_4",))
|
||||||
self.assertEqual(len(self.rows(index)), 1)
|
self.assertEqual(len(self.rows(index)), 1)
|
||||||
|
|
||||||
def test_default_plan_and_quarters_do_not_qualify(self):
|
def test_default_plan_quarter_and_rent_data_do_not_qualify(self):
|
||||||
for table in ("plan", "budget_line_quarter"):
|
for table in ("plan", "budget_line_quarter", "rent_detail"):
|
||||||
fields = data_columns(table)
|
fields = data_columns(table)
|
||||||
names = ", ".join(fields)
|
names = ", ".join(fields)
|
||||||
values = [0 if kind == "Numeric" else " \t\n\r" if kind == "String" else None
|
values = [0 if kind == "Numeric" else " \t\n\r" if kind == "String" else None
|
||||||
for kind in fields.values()]
|
for kind in fields.values()]
|
||||||
placeholders = ", ".join("?" for _ in fields)
|
placeholders = ", ".join("?" for _ in fields)
|
||||||
self.db.execute(f"INSERT INTO v3.{table}(line_id, {names}) VALUES (1, {placeholders})", values)
|
self.db.execute(f"INSERT INTO v3.{table}(line_id, {names}) VALUES (1, {placeholders})", values)
|
||||||
# Service quarter numbers must not qualify as meaningful data.
|
# Service IDs and quarter numbers must not qualify as meaningful data.
|
||||||
|
self.db.execute("UPDATE v3.rent_detail SET id = 42, vsp_id = 123")
|
||||||
self.db.execute("UPDATE v3.budget_line_quarter SET quarter = 1")
|
self.db.execute("UPDATE v3.budget_line_quarter SET quarter = 1")
|
||||||
for quarter in (2, 3, 4):
|
for quarter in (2, 3, 4):
|
||||||
self.db.execute("INSERT INTO v3.budget_line_quarter(line_id, quarter, actual_m1) VALUES (1, ?, 0)",
|
self.db.execute("INSERT INTO v3.budget_line_quarter(line_id, quarter, actual_m1) VALUES (1, ?, 0)",
|
||||||
@ -114,11 +117,11 @@ class Summary2RelatedRecordsSQLTest(unittest.TestCase):
|
|||||||
self.assertEqual(len(self.rows(index)), 1)
|
self.assertEqual(len(self.rows(index)), 1)
|
||||||
self.db.execute("DELETE FROM v3.reserve")
|
self.db.execute("DELETE FROM v3.reserve")
|
||||||
|
|
||||||
def test_each_meaningful_plan_or_quarter_field_qualifies(self):
|
def test_each_meaningful_plan_quarter_or_rent_field_qualifies(self):
|
||||||
for index in range(3):
|
for index in range(3):
|
||||||
self.db.execute("UPDATE v3.budget_form SET form_type_code = ?",
|
self.db.execute("UPDATE v3.budget_form SET form_type_code = ?",
|
||||||
("FORM_2" if index == 1 else "FORM_1",))
|
("FORM_2" if index == 1 else "FORM_1",))
|
||||||
for table in ("plan", "budget_line_quarter"):
|
for table in ("plan", "budget_line_quarter", "rent_detail"):
|
||||||
for field, kind in data_columns(table).items():
|
for field, kind in data_columns(table).items():
|
||||||
values = (12, -12) if kind == "Numeric" else ("2026-10-21",) if kind == "Date" else (" text ",)
|
values = (12, -12) if kind == "Numeric" else ("2026-10-21",) if kind == "Date" else (" text ",)
|
||||||
for value in values:
|
for value in values:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user