• R/O
  • SSH
  • HTTPS

aoiro: Commit


Commit MetaInfo

Revisión111 (tree)
Tiempo2022-06-08 15:18:50
Autorhirukawa_ryo

Log Message

* aoiro 1.0.8
貸借対照表のレイアウトで表示科目「事業主貸」または「事業主借」に含まれる勘定科目は期末に「事業主貸」または「事業主借」に自動で振り替えるようにしました。
これは「事業主貸」の別名として「源泉徴収税額」を追加するような場合に役立ちます。

依存ライブラリ pdfbox 2.0.25 -> 2.0.26
ProfitAndLossLayout で表示科目「仕入高」を月別売上に集計するようになっていたバグを修正しました。(月別売上に集計するのは「仕入高」ではなく「売上高」です!)
なお、個人事業主では表示科目として「仕入高」「売上高」いずれも使っていなかったため、このバグによる影響はありませんでした。

Cambiar Resumen

Diferencia incremental

--- aoiro/trunk/src/main/java/net/osdn/aoiro/AccountSettlement.java (revision 110)
+++ aoiro/trunk/src/main/java/net/osdn/aoiro/AccountSettlement.java (revision 111)
@@ -18,6 +18,7 @@
1818 import net.osdn.aoiro.model.Debtor;
1919 import net.osdn.aoiro.model.JournalEntry;
2020 import net.osdn.aoiro.model.ProportionalDivision;
21+import net.osdn.aoiro.report.layout.BalanceSheetLayout;
2122
2223 /** 決算
2324 *
@@ -50,7 +51,7 @@
5051 * @param journalEntries 仕訳リスト
5152 * @param proportionalDivisions 家事按分リスト
5253 */
53- public void addClosingEntries(List<JournalEntry> journalEntries, List<ProportionalDivision> proportionalDivisions) {
54+ public void addClosingEntries(List<JournalEntry> journalEntries, BalanceSheetLayout bsLayout, List<ProportionalDivision> proportionalDivisions) {
5455 if(date == null) {
5556 date = getClosingDate(journalEntries, isSoloProprietorship);
5657 }
@@ -171,6 +172,84 @@
171172 }
172173 }
173174
175+ //事業主貸への振替
176+ for(AccountTitle accountTitle : bsLayout.getAccountTitlesByNode(bsLayout.getNode("事業主貸"))) {
177+ if (accountTitle.getDisplayName().equals("事業主貸")) {
178+ continue;
179+ }
180+ long total = 0;
181+ List<JournalEntry> entries = getJournalEntriesByAccount(journalEntries, accountTitle);
182+ for (JournalEntry entry : entries) {
183+ for (Debtor debtor : entry.getDebtors()) {
184+ if (debtor.getAccountTitle().equals(accountTitle)) {
185+ total += debtor.getAmount();
186+ }
187+ }
188+ for (Creditor creditor : entry.getCreditors()) {
189+ if (creditor.getAccountTitle().equals(accountTitle)) {
190+ total -= creditor.getAmount();
191+ }
192+ }
193+ }
194+ if (total == 0) {
195+ // 何もしない
196+ } else if (total > 0) {
197+ AccountTitle withdrawalsByOwner = AccountTitle.getByDisplayName(accountTitles, "事業主貸");
198+ if (withdrawalsByOwner != null) {
199+ Debtor debtor = new Debtor(withdrawalsByOwner, total);
200+ Creditor creditor = new Creditor(accountTitle, total);
201+ JournalEntry entry = new JournalEntry(date, "事業主貸への振替", Arrays.asList(debtor), Arrays.asList(creditor));
202+ journalEntries.add(entry);
203+ }
204+ } else if (total < 0) {
205+ AccountTitle investmentsByOwner = AccountTitle.getByDisplayName(accountTitles, "事業主借");
206+ if (investmentsByOwner != null) {
207+ Debtor debtor = new Debtor(accountTitle, -total);
208+ Creditor creditor = new Creditor(investmentsByOwner, -total);
209+ JournalEntry entry = new JournalEntry(date, "事業主借への振替", Arrays.asList(debtor), Arrays.asList(creditor));
210+ }
211+ }
212+ }
213+
214+ //事業主借への振替
215+ for(AccountTitle accountTitle : bsLayout.getAccountTitlesByNode(bsLayout.getNode("事業主借"))) {
216+ if (accountTitle.getDisplayName().equals("事業主借")) {
217+ continue;
218+ }
219+ long total = 0;
220+ List<JournalEntry> entries = getJournalEntriesByAccount(journalEntries, accountTitle);
221+ for (JournalEntry entry : entries) {
222+ for (Debtor debtor : entry.getDebtors()) {
223+ if (debtor.getAccountTitle().equals(accountTitle)) {
224+ total -= debtor.getAmount();
225+ }
226+ }
227+ for (Creditor creditor : entry.getCreditors()) {
228+ if (creditor.getAccountTitle().equals(accountTitle)) {
229+ total += creditor.getAmount();
230+ }
231+ }
232+ }
233+ if (total == 0) {
234+ // 何もしない
235+ } else if (total > 0) {
236+ AccountTitle investmentsByOwner = AccountTitle.getByDisplayName(accountTitles, "事業主借");
237+ if (investmentsByOwner != null) {
238+ Debtor debtor = new Debtor(accountTitle, total);
239+ Creditor creditor = new Creditor(investmentsByOwner, total);
240+ JournalEntry entry = new JournalEntry(date, "事業主借への振替", Arrays.asList(debtor), Arrays.asList(creditor));
241+ journalEntries.add(entry);
242+ }
243+ } else if (total < 0) {
244+ AccountTitle withdrawalsByOwner = AccountTitle.getByDisplayName(accountTitles, "事業主貸");
245+ if (withdrawalsByOwner != null) {
246+ Debtor debtor = new Debtor(withdrawalsByOwner, -total);
247+ Creditor creditor = new Creditor(accountTitle, -total);
248+ JournalEntry entry = new JournalEntry(date, "事業主貸への振替", Arrays.asList(debtor), Arrays.asList(creditor));
249+ }
250+ }
251+ }
252+
174253 //収益勘定科目
175254 Set<AccountTitle> revenueAccountTitles = new LinkedHashSet<>();
176255
--- aoiro/trunk/src/main/java/net/osdn/aoiro/cui/Main.java (revision 110)
+++ aoiro/trunk/src/main/java/net/osdn/aoiro/cui/Main.java (revision 111)
@@ -139,9 +139,10 @@
139139 if (!skipSettlement) {
140140 //決算
141141 System.out.println("決算処理を実行しています . . .");
142+ BalanceSheetLayout bsLayout = accountTitlesLoader.getBalanceSheetLayout();
142143 AccountSettlement accountSettlement = new AccountSettlement(accountTitles, isSoloProprietorship);
143144 accountSettlement.setPrintStream(System.out);
144- accountSettlement.addClosingEntries(journalEntries, proportionalDivisions);
145+ accountSettlement.addClosingEntries(journalEntries, bsLayout, proportionalDivisions);
145146 System.out.println("");
146147 }
147148
--- aoiro/trunk/src/main/java/net/osdn/aoiro/report/layout/BalanceSheetLayout.java (revision 110)
+++ aoiro/trunk/src/main/java/net/osdn/aoiro/report/layout/BalanceSheetLayout.java (revision 111)
@@ -6,11 +6,10 @@
66 import net.osdn.aoiro.model.Node;
77
88 import java.util.ArrayList;
9-import java.util.HashSet;
9+import java.util.Collections;
1010 import java.util.Iterator;
1111 import java.util.LinkedHashSet;
1212 import java.util.List;
13-import java.util.Map;
1413 import java.util.Map.Entry;
1514 import java.util.Set;
1615
@@ -60,6 +59,47 @@
6059 return hiddenNamesIfZero;
6160 }
6261
62+ /** 指定した名前のノードを返します。
63+ * レベル1のノードは「資産」・「負債」・「資本」(または「純資産」)です。
64+ * レベル2のノードには貸借対照表の表示科目「現金」「普通預金」などがあります。
65+ *
66+ * @param name ノードの名前
67+ * @return ノード。存在しない場合は null が返されます。
68+ */
69+ public Node<Entry<List<AccountTitle>, Amount[]>> getNode(String name) {
70+ List<Node<Entry<List<AccountTitle>, Amount[]>>> list = flatten(getRoot());
71+ for(Node<Entry<List<AccountTitle>, Amount[]>> node : list) {
72+ if(name.equals(node.getName())) {
73+ return node;
74+ }
75+ }
76+ return null;
77+ }
78+
79+ /** 指定したノードに含まれる勘定科目のリストを返します。
80+ *
81+ * @param node ノード
82+ * @return 勘定科目のリスト。ノードが存在しない場合は空のリストが返されます。
83+ */
84+ public List<AccountTitle> getAccountTitlesByNode(Node<Entry<List<AccountTitle>, Amount[]>> node) {
85+ List<Node<Entry<List<AccountTitle>, Amount[]>>> list = flatten(getRoot());
86+ for(Node<Entry<List<AccountTitle>, Amount[]>> n : list) {
87+ if(n.equals(node)) {
88+ return List.copyOf(n.getValue().getKey());
89+ }
90+ }
91+ return Collections.emptyList();
92+ }
93+
94+ private List<Node<Entry<List<AccountTitle>, Amount[]>>> flatten(Node<Entry<List<AccountTitle>, Amount[]>> node) {
95+ List<Node<Entry<List<AccountTitle>, Amount[]>>> list = new ArrayList<>();
96+ list.add(node);
97+ for(Node<Entry<List<AccountTitle>, Amount[]>> child : node.getChildren()) {
98+ list.addAll(flatten(child));
99+ }
100+ return list;
101+ }
102+
63103 public boolean isSignReversed(String name) {
64104 return signReversedNames.contains(name);
65105 }
@@ -72,6 +112,8 @@
72112 return hiddenNamesIfZero.contains(name);
73113 }
74114
115+
116+
75117 public String getYaml() {
76118 return getYaml(null);
77119 }
--- aoiro/trunk/src/main/java/net/osdn/aoiro/report/layout/ProfitAndLossLayout.java (revision 110)
+++ aoiro/trunk/src/main/java/net/osdn/aoiro/report/layout/ProfitAndLossLayout.java (revision 111)
@@ -140,7 +140,7 @@
140140 for(AccountTitle accountTitle : accountTitles) {
141141 accountTitleDisplayNames.add(accountTitle.getDisplayName());
142142 }
143- if(name.equals("売上") || name.equals("売上金額") || name.equals("仕入高") || accountTitleDisplayNames.contains("売上")) {
143+ if(name.equals("売上") || name.equals("売上金額") || name.equals("売上高") || accountTitleDisplayNames.contains("売上")) {
144144 salesAccountTitles.addAll(accountTitles);
145145 } else if(name.equals("家事消費等") || accountTitleDisplayNames.contains("家事消費等")) {
146146 houseworkSalesAccountTitles.addAll(accountTitles);
@@ -152,6 +152,36 @@
152152 }
153153 }
154154
155+ /** 指定した名前のノードを返します。
156+ *
157+ * @param name ノードの名前
158+ * @return ノード。存在しない場合は null が返されます。
159+ */
160+ public Node<Entry<List<AccountTitle>, Amount>> getNode(String name) {
161+ List<Node<Entry<List<AccountTitle>, Amount>>> list = flatten(getRoot());
162+ for(Node<Entry<List<AccountTitle>, Amount>> node : list) {
163+ if(name.equals(node.getName())) {
164+ return node;
165+ }
166+ }
167+ return null;
168+ }
169+
170+ /** 指定したノードに含まれる勘定科目のリストを返します。
171+ *
172+ * @param node ノード
173+ * @return 勘定科目のリスト。ノードが存在しない場合は null が返されます。
174+ */
175+ public List<AccountTitle> getAccountTitlesByNode(Node<Entry<List<AccountTitle>, Amount>> node) {
176+ List<Node<Entry<List<AccountTitle>, Amount>>> list = flatten(getRoot());
177+ for(Node<Entry<List<AccountTitle>, Amount>> n : list) {
178+ if(node.equals(n)) {
179+ return List.copyOf(n.getValue().getKey());
180+ }
181+ }
182+ return null;
183+ }
184+
155185 private List<Node<Entry<List<AccountTitle>, Amount>>> flatten(Node<Entry<List<AccountTitle>, Amount>> node) {
156186 List<Node<Entry<List<AccountTitle>, Amount>>> list = new ArrayList<>();
157187 list.add(node);
Show on old repository browser