feat(py): M5.4 fix #2 — add vs and sync_id to payments tx projection
All checks were successful
Deploy to K8s / deploy (push) Successful in 7s
All checks were successful
Deploy to K8s / deploy (push) Successful in 7s
Python's fetch_sheet_data read 9 sheet columns but skipped VS and Sync ID, causing make parity to report extra fields on every raw payment row emitted by the Go backend. Both columns are already on the sheet; add idx_vs / idx_sync_id lookups and the matching keys to the tx dict so the Python /api/* wire shape matches Go's RawTransaction. Update /api/* test fixtures to include vs/sync_id keys for realism. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -236,6 +236,8 @@ def fetch_sheet_data(spreadsheet_id: str, credentials_path: str) -> list[dict]:
|
|||||||
idx_sender = get_col_index("Sender")
|
idx_sender = get_col_index("Sender")
|
||||||
idx_message = get_col_index("Message")
|
idx_message = get_col_index("Message")
|
||||||
idx_bank_id = get_col_index("Bank ID")
|
idx_bank_id = get_col_index("Bank ID")
|
||||||
|
idx_vs = get_col_index("VS")
|
||||||
|
idx_sync_id = get_col_index("Sync ID")
|
||||||
|
|
||||||
required = {"Date": idx_date, "Amount": idx_amount, "Person": idx_person, "Purpose": idx_purpose}
|
required = {"Date": idx_date, "Amount": idx_amount, "Person": idx_person, "Purpose": idx_purpose}
|
||||||
missing = [name for name, idx in required.items() if idx == -1]
|
missing = [name for name, idx in required.items() if idx == -1]
|
||||||
@@ -255,8 +257,10 @@ def fetch_sheet_data(spreadsheet_id: str, credentials_path: str) -> list[dict]:
|
|||||||
"purpose": get_val(idx_purpose),
|
"purpose": get_val(idx_purpose),
|
||||||
"inferred_amount": get_val(idx_inferred_amount),
|
"inferred_amount": get_val(idx_inferred_amount),
|
||||||
"sender": get_val(idx_sender),
|
"sender": get_val(idx_sender),
|
||||||
|
"vs": get_val(idx_vs),
|
||||||
"message": get_val(idx_message),
|
"message": get_val(idx_message),
|
||||||
"bank_id": get_val(idx_bank_id),
|
"bank_id": get_val(idx_bank_id),
|
||||||
|
"sync_id": get_val(idx_sync_id),
|
||||||
}
|
}
|
||||||
transactions.append(tx)
|
transactions.append(tx)
|
||||||
|
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ class TestWebApp(unittest.TestCase):
|
|||||||
'date': '2026-01-01', 'amount': 750, 'person': 'Test Member',
|
'date': '2026-01-01', 'amount': 750, 'person': 'Test Member',
|
||||||
'purpose': '2026-01', 'message': 'test payment',
|
'purpose': '2026-01', 'message': 'test payment',
|
||||||
'sender': 'External Bank User', 'inferred_amount': 750,
|
'sender': 'External Bank User', 'inferred_amount': 750,
|
||||||
|
'vs': '', 'sync_id': 'abc123',
|
||||||
}]
|
}]
|
||||||
response = self.client.get('/api/adults')
|
response = self.client.get('/api/adults')
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
@@ -155,6 +156,7 @@ class TestWebApp(unittest.TestCase):
|
|||||||
mock_fetch_sheet.return_value = [{
|
mock_fetch_sheet.return_value = [{
|
||||||
'date': '2026-01-15', 'amount': 500, 'person': 'Junior One',
|
'date': '2026-01-15', 'amount': 500, 'person': 'Junior One',
|
||||||
'purpose': '2026-01', 'message': '', 'sender': 'Parent', 'inferred_amount': 500,
|
'purpose': '2026-01', 'message': '', 'sender': 'Parent', 'inferred_amount': 500,
|
||||||
|
'vs': '', 'sync_id': 'def456',
|
||||||
}]
|
}]
|
||||||
response = self.client.get('/api/juniors')
|
response = self.client.get('/api/juniors')
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
@@ -172,6 +174,7 @@ class TestWebApp(unittest.TestCase):
|
|||||||
mock_fetch_sheet.return_value = [{
|
mock_fetch_sheet.return_value = [{
|
||||||
'date': '2026-01-01', 'amount': 750, 'person': 'Test Member',
|
'date': '2026-01-01', 'amount': 750, 'person': 'Test Member',
|
||||||
'purpose': '2026-01', 'message': 'test', 'sender': 'Someone',
|
'purpose': '2026-01', 'message': 'test', 'sender': 'Someone',
|
||||||
|
'vs': '', 'sync_id': 'ghi789',
|
||||||
}]
|
}]
|
||||||
response = self.client.get('/api/payments')
|
response = self.client.get('/api/payments')
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|||||||
Reference in New Issue
Block a user