kintone
投稿日:

「家賃の入金確認、通帳と管理表を突き合わせていませんか?」─ kintoneで賃貸管理の入金消込を効率化する

皆さんこんにちは。kintoneアプリエンジニアのtomiokaです。

先日、不動産管理会社のお客様から「毎月の入金消込が地獄です」と相談がありました。

管理戸数300戸ほどの会社で、毎月の家賃入金を銀行の入出金明細とExcelの管理表を突き合わせて確認しているとのことです。月初の3日間は担当者がほぼこの作業に張り付いている状態で、他の業務が完全に止まってしまうと。さらに未入金の入居者への督促連絡は、消込が終わってからでないと始められず、対応が遅れがちでした。

今回は、契約アプリと入金記録アプリを連携させて、未入金者の自動抽出と督促タスクの自動生成を実現した事例を紹介します。管理戸数100〜500戸規模の不動産管理会社で、入金消込をExcelや紙ベースで行っている物件管理担当(PM)の方に参考になる内容です。

Excelでの入金消込で起きる問題

不動産管理の入金消込をExcelで行っていると、ほぼ必ずと言っていいほど以下の問題が発生します。

  • 入居者名と振込名義が一致しない(結婚で姓が変わった、法人名義で振り込まれた、など)
  • 家賃と振込額が一致しない(共益費が別振込、端数の差異、翌月分をまとめて振込、など)
  • 消込結果が担当者の頭の中にしかなく、引き継ぎできない
  • 未入金者への督促が月の中旬以降になり、滞納が長期化しやすい
  • オーナーへの月次報告を作成するために、消込結果を別のExcelに転記する作業が発生する

特に「振込名義の不一致」は厄介で、Excelの検索では見つからないケースが多い。担当者の記憶に頼っている部分が大きいです。

構築した2アプリの構成

今回は以下の2つのアプリを連携させました。

アプリ名役割主なフィールド
契約アプリ物件・入居者・家賃情報の管理物件名、部屋番号、入居者名、家賃額、共益費、契約開始日、契約終了日、振込名義(別名義の場合)
入金記録アプリ月ごとの入金状況を管理対象年月、入居者(ルックアップ)、請求額、入金額、入金日、消込ステータス、差額、備考

ポイントは、契約アプリに「振込名義」フィールドを用意したことです。入居者名と異なる名義で振り込まれるケースに対応するため、事前に登録しておきます。

契約アプリのフィールド構成

フィールド名フィールドタイプフィールドコード備考
物件名文字列(1行)property_name
部屋番号文字列(1行)room_number
入居者名文字列(1行)tenant_name
振込名義文字列(1行)transfer_name入居者名と異なる場合に登録
家賃数値rent_amount
共益費数値maintenance_fee
月額合計計算monthly_total家賃+共益費
契約開始日日付contract_start
契約終了日日付contract_end
契約ステータスドロップダウンcontract_status入居中/退去予定/退去済

入金記録アプリのフィールド構成

フィールド名フィールドタイプフィールドコード備考
対象年月文字列(1行)target_monthYYYY-MM形式
入居者名文字列(1行)tenant_nameルックアップでコピー
物件名文字列(1行)property_nameルックアップでコピー
部屋番号文字列(1行)room_numberルックアップでコピー
請求額数値billed_amountルックアップでコピー(月額合計)
入金額数値paid_amount手入力 or CSV取込
入金日日付payment_date
差額計算difference入金額−請求額
消込ステータスドロップダウンpayment_status未入金/入金済/一部入金/過入金
督促ステータスドロップダウンreminder_status未対応/連絡済/対応中/解決済
備考文字列(複数行)notes

月次入金レコードの一括生成

毎月初めに、契約アプリの「入居中」の全契約に対して、入金記録アプリにレコードを一括生成します。これにより、「今月入金を確認すべき入居者の一覧」が自動的にできあがります。

(function() {
  'use strict';

  var CONTRACT_APP_ID = 200;
  var PAYMENT_APP_ID = 201;

  // 一覧画面にボタンを追加
  kintone.events.on('app.record.index.show', function(event) {
    if (document.getElementById('btn-generate')) return event;

    var btn = document.createElement('button');
    btn.id = 'btn-generate';
    btn.textContent = '今月の入金レコードを生成';
    btn.style.cssText = 'padding:8px 16px;background:#3182ce;color:#fff;border:none;border-radius:4px;cursor:pointer;';

    btn.addEventListener('click', function() {
      var now = new Date();
      var targetMonth = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0');

      if (!confirm(targetMonth + ' の入金レコードを生成しますか?')) return;

      // 入居中の契約を全件取得
      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', {
        app: CONTRACT_APP_ID,
        query: 'contract_status in ("入居中") limit 500'
      }).then(function(resp) {
        var records = resp.records.map(function(contract) {
          return {
            target_month: { value: targetMonth },
            tenant_name: { value: contract.tenant_name.value },
            property_name: { value: contract.property_name.value },
            room_number: { value: contract.room_number.value },
            billed_amount: { value: contract.monthly_total.value },
            payment_status: { value: '未入金' },
            reminder_status: { value: '未対応' }
          };
        });

        return kintone.api(kintone.api.url('/k/v1/records.json', true), 'POST', {
          app: PAYMENT_APP_ID,
          records: records
        });
      }).then(function() {
        alert(targetMonth + ' の入金レコードを生成しました。');
        location.reload();
      }).catch(function(error) {
        alert('エラーが発生しました: ' + error.message);
      });
    });

    var headerSpace = kintone.app.getHeaderMenuSpaceElement();
    if (headerSpace) headerSpace.appendChild(btn);

    return event;
  });
})();

このコードは契約アプリの一覧画面に「今月の入金レコードを生成」ボタンを追加します。ボタンを押すと、入居中の全契約に対して入金記録アプリにレコードが生成されます。

なお、500件を超える契約がある場合はoffsetによる繰り返し取得が必要です。また、POST APIも一度に100件までのため、100件ずつ分割して送信する処理が必要になります。今回のお客様は300戸なので、この簡易版で対応しました。

未入金者の自動抽出

入金記録アプリの一覧ビューで、以下の絞り込み条件を設定しました。

未入金ビュー:

  • 消込ステータス が 「未入金」
  • 対象年月 が 今月

滞納ビュー(督促対象):

  • 消込ステータス が 「未入金」または「一部入金」
  • 対象年月 が 先月以前

これにより、「今月まだ入金がない入居者」と「先月以前から未入金の滞納者」を即座に把握できます。

消込ステータスの自動判定

入金額を入力した際に、請求額と比較して消込ステータスを自動判定するカスタマイズです。

(function() {
  'use strict';

  kintone.events.on(['app.record.edit.submit', 'app.record.create.submit'], function(event) {
    var record = event.record;
    var billed = Number(record.billed_amount.value) || 0;
    var paid = Number(record.paid_amount.value) || 0;

    if (paid === 0) {
      record.payment_status.value = '未入金';
    } else if (paid < billed) {
      record.payment_status.value = '一部入金';
    } else if (paid === billed) {
      record.payment_status.value = '入金済';
    } else {
      record.payment_status.value = '過入金';
    }

    return event;
  });
})();

入金額を入力して保存するだけで、ステータスが自動的に判定されます。手動でステータスを選ぶ必要がなくなり、選び間違いも防げます。

ハマりどころ

計算フィールドの値が文字列

kintoneの計算フィールド(monthly_total)の値は文字列として返ってきます。一括生成のコードでcontract.monthly_total.valueをそのまま数値フィールドに入れると問題ないですが、JavaScriptで計算する場合はNumber()で変換が必要です、、、、これは毎回ハマるポイントです。

一括生成の重複防止

「今月の入金レコードを生成」ボタンを2回押すと、レコードが二重に生成されます。本番運用では、生成前に「対象年月が今月のレコードが既に存在するか」をチェックする処理を入れました。

500件制限

契約アプリのレコード取得にはkintone REST APIの500件制限があります。管理戸数が500を超える場合は、offsetによる繰り返し取得が必要です。なお、offsetには上限10,000件の制限があるため、それを超える場合はCursor APIの利用を検討してください。

導入結果

導入から2ヶ月後、お客様から以下のフィードバックをいただきました。

  • 月初の入金消込作業が3日間から半日に短縮された
  • 未入金者への督促連絡が月初3日目から月初1日目に前倒しできた
  • 「誰が未入金か」を担当者の記憶に頼る必要がなくなり、担当者が休んでも対応可能になった
  • オーナーへの月次報告用のデータが入金記録アプリから直接出力でき、転記作業がなくなった

お客様からは「3日が半日になっただけでも十分なのに、督促の前倒しまでできるとは思わなかった」と言っていただけました。

まとめ

今回は、不動産管理の入金消込をkintoneで効率化した事例を紹介しました。

  • 契約アプリと入金記録アプリの2アプリ連携で、月次の入金レコードを一括生成
  • 入金額の入力だけで消込ステータスを自動判定(未入金/一部入金/入金済/過入金)
  • 未入金・滞納のビューで督促対象を即座に把握

不動産管理の入金消込は、件数が増えるほどExcelでの管理に限界が出てきます。管理戸数が100戸を超えてきたら、仕組みで効率化する段階だと考えています。

株式会社ファストコーディングでは、kintoneのカスタマイズや業務アプリの構築を承っています。「入金管理を効率化したい」「不動産管理業務をkintoneで改善したい」という方は、お問い合わせフォームからお気軽にご連絡ください。