월세 입금 확인을 자동화하면서, 미납이라고 단정하지는 않게 했다

법인 통장으로 월세가 들어오는 날은 물건마다 다르다. 25일도 있고 말일도 있다. 매달 그 며칠에 통장을 열어 들어온 줄과 계약을 눈으로 맞췄다. 물건이 하나면 30초면 끝난다. 서너 개가 되고 받는 통장이 둘로 나뉘면 그 30초가 매달 흩어진다. 한 번 건너뛰면 다음 달에 두 달치를 본다. 임차인이 월세를 안 내도 세금계산서는 발행한다에 썼듯이 미납은 늦게 알수록 손이 많이 간다.

그래서 통장 보는 일을 프로그램에 넘겼다. 넘기고 나서 제일 오래 붙잡은 건 기능이 아니라 한 가지 질문이었다. "안 들어왔다"를 누가 말하게 할 것인가.

문자를 원장으로

은행 입출금 알림 문자를 밤에 하루 한 번 읽어 거래 원장에 넣는다. 아침 잡에 얹지 않은 건 아침에 다른 알림이 몰려 묻히기 때문이다. 읽는 창은 전날 밤부터 그날 밤까지 24시간으로 잡았다. 창의 끝이 실행 시각과 같아야 밤 시간대가 매일 통째로 빠지지 않는다.

들어온 문자는 은행별 서식으로 파싱해 날짜, 금액, 적요, 잔액으로 만든다. 같은 거래가 나중에 내려받은 파일로 또 들어올 수 있어서, 날짜와 금액과 잔액이 같으면 중복으로 보고 버린다.

계정과목 분류는 규칙 표가 한다. 적요에 이 문자열이 있고 입금이면 임대수입, 이 금액이 정확히 빠져나가면 리스료, 이건 통장 사이 내부 이동이라 수입도 지출도 아님. 규칙이 코드가 아니라 표에 들어 있어서 고쳐도 다시 배포하지 않는다.

안 들어온 걸 어떻게 아는가

처음 설계는 이랬다. 계약마다 예정 입금일과 금액을 넣어두고, 예정일이 며칠 지나도록 맞는 입금이 없으면 미납으로 알린다. 물건 A, 매월 25일, 100만 원. 28일까지 안 보이면 폰으로 알림.

만들다 말았다. 이 구조는 두 가지를 구별하지 못한다. 하나는 임차인이 돈을 안 넣은 것. 다른 하나는 내가 그 입금을 못 본 것. 프로그램이 보는 건 문자고, 문자는 생각보다 자주 안 온다. 알림을 켠 지 얼마 안 된 계좌는 첫 문자가 아직 안 왔을 수 있다. 어떤 은행은 입출금 문자 수단 자체가 없어서 앱 푸시로만 알린다. 그 통장으로 받는 월세는 이 경로에 아예 나타나지 않는다.

미납이 아닌데 미납이라고 알리면 그 알림은 한 번에 죽는다. 두 번째부터는 안 본다. 알림은 틀리기 시작하면 없는 것보다 나쁘다.

알림의 뜻을 바꿨다

지금 이 프로그램이 보내는 알림은 세 가지뿐이고, 셋 다 돈이 아니라 경로에 대한 것이다.

  • 잔액 연속성이 깨진 계좌. 앞 줄 잔액에 이번 금액을 더한 값이 이번 줄 잔액과 다르면 그 사이에 못 읽은 거래가 있다는 뜻이다. 파일로 받아 메워야 한다.
  • 서식을 못 알아본 문자. 원문을 그대로 실어 보낸다. 은행이 문구를 바꿨다는 신호다.
  • 평소 문자가 오던 계좌가 일주일 넘게 조용한 경우. 최근 석 달에 거래가 몇 건은 있던 계좌만 본다. 한 통도 와 본 적 없는 계좌는 조용한 게 정상이라 세지 않는다.

셋 중 아무것도 없으면 알림은 오지 않는다. 대부분의 날은 아무것도 오지 않는다.

코드 주석에 이렇게 적어 뒀다. 월세가 안 보인다고 미납으로 단정하지 않는다. 이 알림의 뜻은 알림 설정과 동기화를 확인하라는 것뿐이다.

미납 판단은 여전히 내가 한다. 대신 통장을 열지 않고 원장에서 한다. 월 결산 때 임대수입으로 분류된 줄을 계약 수만큼 세면 끝난다. 매달 며칠에 흩어져 있던 일이 한 번으로 모였다.

정리

  • 은행 문자를 밤에 한 번 읽어 원장에 넣고, 규칙 표로 분류한다
  • 계약별 예정 입금과 대조해 미납을 단정하는 기능은 일부러 넣지 않았다
  • 프로그램이 못 보는 입금 경로가 있는 한 "안 들어왔다"와 "못 봤다"를 구별할 수 없다
  • 알림은 경로가 끊겼을 때만 온다. 돈에 대한 판단은 사람이 한다

분류 규칙을 어떻게 짰는지는 은행 거래내역 자동 분류에 따로 썼다.