Clojure で減価償却費計算

181 views
76 views

Published on

2016/5/21 の京都 Clojure 集い 16.05 の資料です。

Published in: Software
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
181
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Clojure で減価償却費計算

  1. 1. CLOJURE で減価償却費計算 京都Clojureの集い 16.05 2016/5/21 @脳ジム @ultrakanji
  2. 2. 自己紹介 @ultrakanji 大阪の SIer 業務システムの設計、開発、保守 (管理会計、原価管理) 普段の使用言語 Java、Oracle (PL/SQL) Clojure 歴 1 年(実経験 3ヶ月)
  3. 3. 今日のお話 主に Clojure 初学者向け Sler での Clojure 事例のひとつにでも
  4. 4. 目次 動機 減価償却費計算を簡単に 実装 開発環境・ライブラリ よかったこと 課題
  5. 5. 動機
  6. 6. 関数型言語を調べていて Clojure を知る 簡潔でパワフルな言語に魅了される イミュータブル コードはデータ
  7. 7. そこに EXCEL VBA の小案件の話が!
  8. 8. CLOJURE でぜひ! 別の人に振ってもよかったが絶好のチャンスと見た 会社を説得して Clojure で実装して無事完了 jar ファイル + 起動バッチを納品
  9. 9. 続いて簡易減価償却費計算の話が!
  10. 10. CLOJURE でぜひ! 再び会社を説得して Clojure で開発するチャンスを得た 簡易版なので DB は使用しない 前回同様 jar + 起動バッチで納品すべく実装開始
  11. 11. 減価償却費計算を簡単に
  12. 12. 固定資産の取得にかかった費用を所定の期間に計上する会 計手続き 一時的にかかった経費を一定の期間でならして、正しく利益 計上するため 所定の期間が耐用年数 計算方法として定額法と定率法 ERP や会計パッケージに含まれることが多いが、新規資産な どの計画分の計算は少ない
  13. 13. 定額法 100万円のソフトウェアを耐用年数5年の定額法で償却 耐用年数と計算方法よりマスタから償却率を取得(0.5%) 年間償却額 = 取得価額 × 償却率 = 200,000 月間償却額 = 年間償却費 ÷ 12 ≒ 16,666
  14. 14. 定率法 200万円の機械装置を耐用年数8年の定率法で償却 耐用年数と計算方法よりマスタから償却率を取得(0.25%) (初年度)年間償却額 = 取得価額 × 償却率 = 500,000 (2年目)年間償却額 = 未償却残高 × 償却率 = 375,000 (3年目)年間償却額 = 未償却残高 × 償却率 = 281,250 現在の定率法の場合、保証率と改定償却率もマスタから取得す るが、ここでは割愛。
  15. 15. 減価償却費のイメージ 定額法と定率法ののイメージはこんな感じ
  16. 16. で、何をしたいか? 固定資産ごとに計算した結果を月別に Excel に出力したい(イメ ージ) 資産 2017/4 2017/5 2017/6 ... 2018/4 ... ソフトA 16,667 16,667 16,667 ... 16,667 ... 機械装置B 41,667 41,667 41,667 ... 31,250 ...
  17. 17. 実装
  18. 18. 全体構成 マスタファイル(Excel)読み込み → atom 固定資産ファイル(Excel)読み込み → atom 償却費計算起点 年間償却費計算 → リスト 月間償却費計算 → マップ 固定資産情報と計算結果をマージして → atom Excel 出力
  19. 19. マスタファイル読み込み マスタデータはあとで取得しやすいように k / v で atom に保持。 ※以降サンプルコードです。項目名や関数名も日本語にしてい ます。 (:require [dk.ative.docjure.spreadsheet :as ss])  (defn load­master [file sheet­name]    (­>> (ss/load­workbook file)         (ss/select­sheet sheet­name)         (ss/select­columns {:A :償却方法 :B :耐用年数                             :C :償却率 :D :改定償却率 :E :保証率})         (drop 1)         (group­by #(select­keys % [:償却方法 :耐用年数]))         (reset! 償却率マスタのatom)))  @償却率マスタatom  =>  {{:償却方法 "定率", :耐用年数 3} [{:償却方法 "定率", :耐用年数 3, :償却率 0.667, :改定償却  {:償却方法 "定額", :耐用年数 3} [{:償却方法 "定額", :耐用年数 3, :償却率 0.334}],  ...} 
  20. 20. マスタの atom から情報を取得するとき (let [key (into {} {:償却方法 償却方法 :耐用年数 耐用年数})]    (get @償却率マスタatom key)) 
  21. 21. 固定資産ファイル読み込み 固定資産データは複数ファイルを取り込むので swap! で atom を追加更新。 (:require [clojure.java.io :as io])  (defn 固定資産ファイル読み込み []    (doseq [file (file­seq (io/file "ファイル/パス"))]      (­>> (固定資産ファイル読み込み共通関数 file)           (filter #(identity (:キー項目 %))) ;; (1)            (map (fn [m]                  (into {} (map #(conj {:file­name (.getName file)} %) m))))           (swap! 固定資産atom assoc­in [@ファイルカウンタ])))) ;; (3) (1): キー項目を見て空行を読み飛ばしなども簡単に (2): 読み込んだ内容にファイル名を追加するなど(例外処理 用) (3): 複数レコード(nested associative structure)を保持する ため以下の構文 swap! atom assoc­in k v 
  22. 22. @固定資産atom  =>  [({:資産名称 "ソフトウェアA", :取得価額 1000000, :償却開始年月 42917.0, :償却方法  {:資産名称 "機械装置B", :取得価額 2000000, :償却開始年月 42917.0, :償却方法 "定率"   )] 
  23. 23. 年間償却費計算はリストで返す 定率法は長いので定額法のサンプル。 耐用年数分の再帰関数。 (defn 定額法年間償却費計算 [資産レコード]    (let [耐用年数 (:耐用年数 資産レコード)          取得価額 (:取得価額 資産レコード)          償却率   (:償却率 資産レコード)]      (loop [x []   ;; 年間償却費(ベクタ)             sum 0  ;; 償却累計             cnt 1]          (if (= cnt 耐用年数)            (flatten (conj x (­ 取得価額 sum 1)))            (recur             (conj x (Math/round (* 取得価額 償却率)))              (+ sum (Math/round(* 取得価額 償却率)))              (inc cnt))))))  (定額法年間償却費計算 "ソフトウェアのレコード")=>  (200000 200000 200000 200000 199999) 
  24. 24. 償却費計算の結果はマップで返す 月別償却額は、年別償却額リストを受け取り、12ヶ月の均等割 をして、償却月と償却費のマップを返すだけ(割愛)。 償却費計算関数はその月別償却額と固定資産情報を merge し たマップを返す。 (defn 償却費計算 [資産]    (let [資産統合データ (マスタ値取得関数 資産)          年別償却額 (年間償却費計算 資産統合データ)          月別償却額 (月間償却額計算 資産統合データ 年別償却額)]      (merge (into {} {:資産名称 (:資産名称 資産統合データ)                       :取得価額 (:資産名称 資産統合データ)})                       月別償却額))) 
  25. 25. 償却費計算の起点にてマップの結果を ATOM にセット =>  [{:資産名称 "ソフトウェアA", :2017­04 16667, :2017­05 16667, :2018­04 156250  {:資産名称 "機械装置B", :2017­04 41667, :2017­05 41667, :2018­04 31250... :
  26. 26. EXCEL 出力 docjure がネストしたベクタでワークブックを作ってくれる。 償却費計算結果 atom のマップをベクタに変換する。 [["資産名" "2017­04" "2017­05" "2017­06" ...]   ["ソフトA" 16667 16667 16667 ...]   ["機械装置B" 41667 41667 41667 ...]] 
  27. 27. 開発環境・使用したライブラリ
  28. 28. 開発環境 Windows 7 Intellij IDEA Community Edition with Cursive Plugin REPL も快適。
  29. 29. 使用したライブラリ 一部 POI 関数を直接使ったものの、Excel ファイルの読み書 きから、ブック・シート操作、セルの書式適用まで一通り活躍。 ロギング。 ファイルシステムユーティリティ。 Joda Time のラッパーライブラリ。Excel 上のシリアル値日付 の変換や日付計算に。 環境管理ライブラリ。本番環境と開発環境でログレベルを変 更するのに使用。 dk.ative/docjure com.taoensso/timbre me.raynes/fs clj-time environ
  30. 30. よかったこと Excel VBA での苦闘を回避 成果物も VBA でやるより堅牢で高速ないいものができた Excel からデータを抽出できればあとは Clojure の世界 関数型言語での実装の理解 データ構造の理解 Clojure 書いていて楽しい
  31. 31. 課題 テストを書けていないこと prismatic/schema でより強固に
  32. 32. 参考 減価償却費計算の組み立て方で大いに参考にした (deprecation.clj)。 Clojure で Excel を扱えることを知った最初の記事。 poi り方の参考に。 REPL をいまいち使いこなせていないとき参考に。 sebhoss/ nj Light TableでリアルタイムExcelパース (Light Tableの使い方 第2章) Clojure から POI ってみる REPLライフをもっと快適に
  33. 33. ありがとうございました。

×