vistassh-py/ext_patient.py

71 lines
3.6 KiB
Python
Raw Normal View History

2024-03-02 00:34:29 -05:00
#!/usr/bin/env python3
import re
import autoproc
async def cmd_lookup_patient(proc, query):
"""Lookup patient"""
async with proc.sendline, autoproc.expect_async(proc) as expect:
proc.sendline('^Patient Inquiry')
assert await expect.endswith('\r\nSelect PATIENT NAME: ')
proc.sendline(query)
assert await expect.startswith(query)
res = []
single = False
async for prompt, response in expect.promptmatches((
(re.compile(r'^CHOOSE 1-\d+: $'), None),
('Type <Enter> to continue or \'^\' to exit: ', '^'),
('Do you wish to view active patient record flag details? Yes// ', 'No'),
('Do you want to continue processing this patient record? No// ', None),
('Select PATIENT NAME: ', None),
('Select Patient Appointments/Inpatient Inquiry Option: ', None, True),
), throw=True):
proc.sendline(response)
if prompt.index <= 4:
res.append(prompt.before[:-24] if prompt.index == 0 and prompt.before.endswith('\r\nENTER \'^\' TO STOP, OR \r\n') else prompt.before)
if 0 < prompt.index < 4:
single = True
assert await expect.endswith('\r\nSelect Patient Information and OE/RR Option: ', '\r\nSelect Patient Information and OE/RR <TEST ACCOUNT> Option: ')
expect.clear()
if single:
return [re.search(r'[ ]{2}(?P<name>.+?)[ ]{2}(?:\((?P<alias>[^\)]*?)\))?[ ]{6}(?P<dob>\S+)[ ]{4}(?P<ssn>\S+(?:P \*\*Pseudo SSN\*\*)?)[ ]{5}(?P<yesno>\S+)[ ]{5}(?P<type>.+?)[ ]{6}(?P<no>[^\r\n]*)', res[0].replace('\r\n', '', 1)).groupdict()]
return [m.groupdict() for m in re.finditer(r'^[ ]{3}(?P<ordinal>\d+)[ ]{1,3}(?:(?P<last5>[A-Za-z][0-9]{4})[ ]{2})?(?P<name>.+?)[ ]{6,8}(?P<dob>\S+)[ ]{4}(?P<ssn>\S+(?:P \*\*Pseudo SSN\*\*)?)[ ]{5}(?P<yesno>\S+)[ ]{5}(?P<type>.+?)[ ]{6}(?P<no>[^\r\n]*)', re.sub(r'(.{80})\r\n(?! \d)', r'\1', '\r\n\r\n'.join(res)), re.MULTILINE)]
async def cmd_lookup_patient_ordinal(proc, query, ordinal, force=False):
"""Lookup patient"""
async with proc.sendline, autoproc.expect_async(proc) as expect:
proc.sendline('^Patient Inquiry')
assert await expect.endswith('\r\nSelect PATIENT NAME: ')
proc.sendline(query)
assert await expect.startswith(query)
res = []
ordinal = str(int(ordinal))
async for prompt, response in expect.promptmatches((
(re.compile(r'^CHOOSE 1-\d+: $'), None),
('Type <Enter> to continue or \'^\' to exit: ', None),
('Do you wish to view active patient record flag details? Yes// ', 'No'),
('Do you want to continue processing this patient record? No// ', 'Yes' if force else 'No'),
('Select PATIENT NAME: ', None),
('Select Patient Appointments/Inpatient Inquiry Option: ', None, True),
), timeout_settle=2, throw=True):
match prompt:
case autoproc.ExpectMatch(index=0, before=before):
if re.search(r'^[ ]{3}' + ordinal + r'[ ]+', before, re.MULTILINE):
proc.sendline(ordinal)
else:
proc.sendline()
case autoproc.ExpectMatch(index=(1|4), before=before):
res.append(before[13:] if before.startswith('\x1b[H\x1b[J\x1b[2J\x1b[H') else before)
proc.sendline()
case autoproc.ExpectMatch(index=2, before=before, match=match):
res.append(before + match)
proc.sendline(response)
case autoproc.ExpectMatch(index=3, before=before, match=match):
res.append(before + match)
proc.sendline(response)
case autoproc.ExpectMatch(index=5):
proc.sendline()
assert await expect.endswith('\r\nSelect Patient Information and OE/RR Option: ', '\r\nSelect Patient Information and OE/RR <TEST ACCOUNT> Option: ')
expect.clear()
return re.sub(r'\r\n\r\n(?:[^\r\n;]+);(?:\([^\)]*?\))? (?:\d+ )?(?:\d{3}-\d{2}-\d{4}P?) (?:[^\r\n]+?)[ ]*?(\r\n={10,}\r\n)\r\n', r'\1', '\r\n'.join(res))