- M3HiuDocumentRepository::persistFromDataFetch no longer includes the per-call request_id in the document dedup hash. request_id is unique every time data_fetch runs, so it was causing a brand-new duplicate row to be inserted on every re-fetch of the exact same ABDM document. Now dedup key is transaction_id + consent_ref + care_context_reference + bundle_id, which stays stable across repeated fetches -> re-fetches UPDATE the existing row instead of duplicating it. - Added Patient::abdm_content_fetch_only() + route billing/patient/abdm_content_fetch_only/(id): a lightweight action for when consent is already GRANTED/COMPLETED. It calls data_fetch directly using the saved consent reference, skipping consent_request + reconcile polling entirely, avoiding unnecessary bridge calls/noise. - Patient_Profile_Opd_V.php: added a 'Fetch Records' button that only appears once consent phase is GRANTED or COMPLETED, wired to the new endpoint; on success it refreshes the document list in place. The original 'Fetch ABDM Records' button still owns the full consent request -> reconcile -> fetch flow and already stops/re-enables correctly on DENIED/FAILED (verified, no change needed there). - One-time cleanup: deduped existing abdm_hiu_documents rows in dev DB (13 -> 3) and recomputed doc_hash with the new stable key.
53 lines
2.0 KiB
PHP
53 lines
2.0 KiB
PHP
<?php
|
|
$db = new mysqli('localhost', 'root', '', 'hms_data_ci4');
|
|
|
|
echo "=== Before cleanup: total rows ===\n";
|
|
print_r($db->query("SELECT COUNT(*) c FROM abdm_hiu_documents")->fetch_assoc());
|
|
|
|
// Group by the new dedup key (transaction_id, consent_ref, care_context_reference, bundle_id)
|
|
// and keep only the newest row (highest id) per group; delete the rest.
|
|
$res = $db->query("
|
|
SELECT transaction_id, consent_ref, care_context_reference, bundle_id, GROUP_CONCAT(id ORDER BY id DESC) ids
|
|
FROM abdm_hiu_documents
|
|
GROUP BY transaction_id, consent_ref, care_context_reference, bundle_id
|
|
HAVING COUNT(*) > 1
|
|
");
|
|
|
|
$totalDeleted = 0;
|
|
while ($row = $res->fetch_assoc()) {
|
|
$ids = explode(',', $row['ids']);
|
|
$keepId = array_shift($ids); // newest (first in DESC order)
|
|
if (empty($ids)) {
|
|
continue;
|
|
}
|
|
$idsList = implode(',', array_map('intval', $ids));
|
|
$db->query("DELETE FROM abdm_hiu_documents WHERE id IN ($idsList)");
|
|
$totalDeleted += $db->affected_rows;
|
|
echo "Kept id={$keepId}, deleted ids=[{$idsList}]\n";
|
|
}
|
|
|
|
echo "\nTotal deleted: {$totalDeleted}\n";
|
|
|
|
// Recompute doc_hash for all remaining rows using the new (request_id-free) formula,
|
|
// so future fetches correctly match and UPDATE instead of INSERT duplicates.
|
|
echo "\n=== Recomputing doc_hash for remaining rows ===\n";
|
|
$res2 = $db->query("SELECT id, transaction_id, consent_ref, care_context_reference, bundle_id FROM abdm_hiu_documents");
|
|
$updated = 0;
|
|
while ($row = $res2->fetch_assoc()) {
|
|
$hash = sha1(implode('|', [
|
|
(string) $row['transaction_id'],
|
|
(string) $row['consent_ref'],
|
|
(string) $row['care_context_reference'],
|
|
(string) $row['bundle_id'],
|
|
]));
|
|
$escapedHash = $db->real_escape_string($hash);
|
|
$db->query("UPDATE abdm_hiu_documents SET doc_hash = '{$escapedHash}' WHERE id = " . (int) $row['id']);
|
|
$updated++;
|
|
}
|
|
echo "Recomputed hash for {$updated} rows.\n";
|
|
|
|
echo "\n=== After cleanup: total rows ===\n";
|
|
print_r($db->query("SELECT COUNT(*) c FROM abdm_hiu_documents")->fetch_assoc());
|
|
|
|
$db->close();
|