Skip to content

Commit

Permalink
Fix IIN search issue if 8th digit is 0 (issue #3)
Browse files Browse the repository at this point in the history
  • Loading branch information
mvgolubev committed Jul 16, 2024
1 parent ea88cc3 commit e2577b4
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 39 deletions.
33 changes: 15 additions & 18 deletions app/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,7 @@ async def date_handler(message: Message, state: FSMContext) -> None:
else:
await message.react([ReactionTypeEmoji(emoji="✍")])
await message.chat.do(action="typing")
iins_possible = utils.generate_iins(
birth_date, start_suffix=5001, quantity=300
)
await message.chat.do(action="typing")
iins_postkz = await utils.mass_upd_iins_postkz(iins_possible)
await state.update_data(iins=iins_postkz)
await state.update_data(birth_date=birth_date)
await message.answer(
text="Отправьте имя и первую букву фамилии.\nНапример: <i>Александр Б</i>"
)
Expand All @@ -66,25 +61,27 @@ async def name_handler(message: Message, state: FSMContext) -> None:
if message.content_type == "text":
await message.react([ReactionTypeEmoji(emoji="✍")])
await message.chat.do(action="typing")
input_name = message.text.strip(" .").casefold()
iins_postkz = (await state.get_data())["iins"]
iins_matched_postkz = utils.match_name_postkz(input_name, iins_postkz)
iins_empty_postkz = utils.empty_name_postkz(iins_postkz)
iins_possible_postkz = iins_matched_postkz + iins_empty_postkz
iins_nca = await utils.mass_upd_iins_nca(iins_possible_postkz)
iins_matched_nca = utils.match_name_nca(input_name, iins_nca)
if len(iins_matched_nca) == 0:
name = message.text.strip(" .").casefold()
await state.update_data(name=name)
data = await state.get_data()
await message.answer(text="🤖🔎 Начал искать. Ждите...")
await message.chat.do(action="typing")
iins_found = await utils.find_iin(
birth_date=data["birth_date"], name=data["name"]
)

if len(iins_found) == 0:
text = (
"❌ <b>Подходящий ИИН не найден!</b>\n\n"
"Убедитесь, что вы верно ввели данные для поиска. "
"Если данные указаны верно, тогда повторите поиск позже."
)
else:
text = f"✅ <b>Найдено: {len(iins_matched_nca)} ИИН</b>\n"
if len(iins_matched_nca) > 1:
text = f"✅ <b>Найдено: {len(iins_found)} ИИН</b>\n"
if len(iins_found) > 1:
text += "Ваш ИИН только один из них (который с вашими ФИО).\n"
text += "\n"
for iin in iins_matched_nca:
for iin in iins_found:
text += f"<b>ИИН:</b> <code>{iin['iin']}</code>\n"
if not iin["middle_name"]:
iin["middle_name"] = ""
Expand Down Expand Up @@ -158,7 +155,7 @@ async def callback_info(callback: CallbackQuery) -> None:
f"имя и первая буква фамилии, значит ИИН есть в налоговой базе).\n\n"
f"Если после присвоения ИИН прошло более недели, а ИИН так и не появился в налоговой базе, "
f"значит автоматическая синхронизация ИИН в налоговую базу по каким-то причинам не произошла "
f"(такое иногда случается). В этом случае, чтобы ИИН всё же появился в налоговой базе, "
f"(такое иногда случается). В этом случае, чтобы ИИН всё же появился в налоговой базе, "
f"вам нужно обратиться в налоговое управление КГД МФ РК, сообщить об этой проблеме "
f"и попросить обновить ваш ИИН в налоговой базе."
)
Expand Down
59 changes: 38 additions & 21 deletions app/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
from app import constants, captcha


def generate_iins(birth_date: date, start_suffix: int, quantity: int) -> list[str]:
def generate_iins(birth_date: date, digit_8th: int, quantity: int) -> list[str]:
iins_possible = []
for suffix in range(start_suffix, start_suffix + quantity):
iin_11 = birth_date.strftime("%y%m%d") + "0" + str(suffix)
for suffix in range(1, quantity):
iin_11 = f"{birth_date:%y%m%d}0{digit_8th}{str(suffix).zfill(3)}"
if checksum(iin_11) < 10:
iins_possible.append(iin_11 + str(checksum(iin_11)))
return iins_possible
Expand All @@ -27,13 +27,14 @@ def checksum(iin_11: str) -> int:
return check_digit


async def mass_upd_iins_postkz(iins: list[str]) -> list[dict]:
async with aiohttp.ClientSession() as session:
tasks = []
for iin in iins:
task = asyncio.create_task(update_iin_postkz(session, iin))
tasks.append(task)
return await asyncio.gather(*tasks)
async def mass_upd_iins_postkz(
session: aiohttp.ClientSession, iins: list[str]
) -> list[dict]:
tasks = []
for iin in iins:
task = asyncio.create_task(update_iin_postkz(session, iin))
tasks.append(task)
return await asyncio.gather(*tasks)


async def update_iin_postkz(session: aiohttp.ClientSession, iin: str) -> dict:
Expand Down Expand Up @@ -84,17 +85,18 @@ def empty_name_postkz(iins_postkz: list[dict]) -> list[dict]:
return iins_empty_postkz


async def mass_upd_iins_nca(iins: list[dict]) -> list[dict]:
async with aiohttp.ClientSession() as session:
tasks = []
for iin in iins:
img_data, viewstate = await get_captcha(session, constants.NCA_URL)
captcha_answer = captcha.resolve_captcha(img_data)
task = asyncio.create_task(
update_iin_nca(session, iin, captcha_answer, viewstate)
)
tasks.append(task)
return await asyncio.gather(*tasks)
async def mass_upd_iins_nca(
session: aiohttp.ClientSession, iins: list[dict]
) -> list[dict]:
tasks = []
for iin in iins:
img_data, viewstate = await get_captcha(session, constants.NCA_URL)
captcha_answer = captcha.resolve_captcha(img_data)
task = asyncio.create_task(
update_iin_nca(session, iin, captcha_answer, viewstate)
)
tasks.append(task)
return await asyncio.gather(*tasks)


async def get_captcha(session: aiohttp.ClientSession, url: str) -> tuple[str, str]:
Expand Down Expand Up @@ -164,3 +166,18 @@ def match_name_nca(input_name: str, nca_updated_iins: list[dict]) -> list[dict]:
if iin_name == input_name:
iins_matched_nca.append(iin)
return iins_matched_nca


async def find_iin(birth_date: date, name: str) -> list[dict]:
iins_found = []
async with aiohttp.ClientSession() as session:
for digit_8th in (0, 5):
iins_possible = generate_iins(birth_date, digit_8th=digit_8th, quantity=300)
iins_postkz = await mass_upd_iins_postkz(session, iins_possible)
iins_matched_postkz = match_name_postkz(name, iins_postkz)
iins_empty_postkz = empty_name_postkz(iins_postkz)
iins_possible_postkz = iins_matched_postkz + iins_empty_postkz
iins_nca = await mass_upd_iins_nca(session, iins_possible_postkz)
iins_matched_nca = match_name_nca(name, iins_nca)
iins_found.extend(iins_matched_nca)
return iins_found

0 comments on commit e2577b4

Please sign in to comment.