rails_finance 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/README.md +20 -0
  4. data/Rakefile +32 -0
  5. data/app/controllers/finance/admin/assessments_controller.rb +55 -0
  6. data/app/controllers/finance/admin/base_controller.rb +4 -0
  7. data/app/controllers/finance/admin/budgets_controller.rb +83 -0
  8. data/app/controllers/finance/admin/expense_members_controller.rb +59 -0
  9. data/app/controllers/finance/admin/expenses_controller.rb +71 -0
  10. data/app/controllers/finance/admin/financial_taxons_controller.rb +67 -0
  11. data/app/controllers/finance/admin/fund_incomes_controller.rb +59 -0
  12. data/app/controllers/finance/admin/funds_controller.rb +58 -0
  13. data/app/controllers/finance/admin/home_controller.rb +8 -0
  14. data/app/controllers/finance/admin/stocks_controller.rb +60 -0
  15. data/app/controllers/finance/me/base_controller.rb +4 -0
  16. data/app/controllers/finance/me/budgets_controller.rb +111 -0
  17. data/app/controllers/finance/me/expense_members_controller.rb +73 -0
  18. data/app/controllers/finance/me/expenses_controller.rb +129 -0
  19. data/app/controllers/finance_controller/me.rb +14 -0
  20. data/app/models/budget/finance/fund_budget.rb +5 -0
  21. data/app/models/budget/finance/stock_budget.rb +5 -0
  22. data/app/models/expense/finance/payable_expense.rb +5 -0
  23. data/app/models/expense/finance/prepay_expense.rb +5 -0
  24. data/app/models/finance/application_record.rb +5 -0
  25. data/app/models/finance/assessment.rb +5 -0
  26. data/app/models/finance/budget.rb +7 -0
  27. data/app/models/finance/expense.rb +7 -0
  28. data/app/models/finance/expense_item.rb +5 -0
  29. data/app/models/finance/expense_member.rb +6 -0
  30. data/app/models/finance/ext/financial.rb +24 -0
  31. data/app/models/finance/ext/member.rb +13 -0
  32. data/app/models/finance/financial_taxon.rb +7 -0
  33. data/app/models/finance/fund.rb +6 -0
  34. data/app/models/finance/fund_income.rb +5 -0
  35. data/app/models/finance/model/assessment.rb +26 -0
  36. data/app/models/finance/model/budget/fund_budget.rb +5 -0
  37. data/app/models/finance/model/budget/stock_budget.rb +10 -0
  38. data/app/models/finance/model/budget.rb +152 -0
  39. data/app/models/finance/model/expense/payable_expense.rb +5 -0
  40. data/app/models/finance/model/expense/prepay_expense.rb +5 -0
  41. data/app/models/finance/model/expense.rb +168 -0
  42. data/app/models/finance/model/expense_item.rb +36 -0
  43. data/app/models/finance/model/expense_member.rb +130 -0
  44. data/app/models/finance/model/financial_taxon.rb +27 -0
  45. data/app/models/finance/model/fund.rb +36 -0
  46. data/app/models/finance/model/fund_income.rb +30 -0
  47. data/app/models/finance/model/stock.rb +33 -0
  48. data/app/models/finance/stock.rb +5 -0
  49. data/app/models/finance.rb +12 -0
  50. data/app/pdfs/borrow_expense_pdf.rb +70 -0
  51. data/app/pdfs/payout_expense_pdf.rb +70 -0
  52. data/app/pdfs/prepay_expense_pdf.rb +70 -0
  53. data/app/records/borrow_expense_record.rb +10 -0
  54. data/app/records/prepay_expense_record.rb +16 -0
  55. data/app/views/admin/_finance_nav.html.erb +14 -0
  56. data/app/views/admin/_nav_expense.html.erb +4 -0
  57. data/app/views/finance/admin/assessments/_edit_form.html.erb +4 -0
  58. data/app/views/finance/admin/assessments/_filter_form.html.erb +9 -0
  59. data/app/views/finance/admin/assessments/_form.html.erb +2 -0
  60. data/app/views/finance/admin/assessments/_index_tbody.html.erb +2 -0
  61. data/app/views/finance/admin/assessments/_index_thead.html.erb +3 -0
  62. data/app/views/finance/admin/assessments/_index_tr.html.erb +19 -0
  63. data/app/views/finance/admin/assessments/_new_form.html.erb +4 -0
  64. data/app/views/finance/admin/assessments/_show_table.html.erb +4 -0
  65. data/app/views/finance/admin/assessments/index.html.erb +5 -0
  66. data/app/views/finance/admin/base/_nav.html.erb +3 -0
  67. data/app/views/finance/admin/budgets/_breadcrumb.html.erb +9 -0
  68. data/app/views/finance/admin/budgets/_edit_form.html.erb +4 -0
  69. data/app/views/finance/admin/budgets/_filter_form.html.erb +10 -0
  70. data/app/views/finance/admin/budgets/_filter_table.html.erb +11 -0
  71. data/app/views/finance/admin/budgets/_form.html.erb +7 -0
  72. data/app/views/finance/admin/budgets/_index_tbody.html.erb +13 -0
  73. data/app/views/finance/admin/budgets/_index_thead.html.erb +6 -0
  74. data/app/views/finance/admin/budgets/_item_form.html.erb +17 -0
  75. data/app/views/finance/admin/budgets/_items.html.erb +16 -0
  76. data/app/views/finance/admin/budgets/_new_form.html.erb +4 -0
  77. data/app/views/finance/admin/budgets/_show/_breadcrumb.html.erb +6 -0
  78. data/app/views/finance/admin/budgets/_show_table.html.erb +62 -0
  79. data/app/views/finance/admin/budgets/index.html.erb +5 -0
  80. data/app/views/finance/admin/budgets/next.turbo_stream.erb +1 -0
  81. data/app/views/finance/admin/budgets/show.htmlx.erb +35 -0
  82. data/app/views/finance/admin/budgets/trigger.js.erb +1 -0
  83. data/app/views/finance/admin/expense_members/_edit_form.html.erb +3 -0
  84. data/app/views/finance/admin/expense_members/_form.html.erb +5 -0
  85. data/app/views/finance/admin/expense_members/_index_tbody.html.erb +53 -0
  86. data/app/views/finance/admin/expense_members/_index_thead.html.erb +12 -0
  87. data/app/views/finance/admin/expense_members/index.html.erb +8 -0
  88. data/app/views/finance/admin/expenses/_breadcrumb.html.erb +9 -0
  89. data/app/views/finance/admin/expenses/_edit_form.html.erb +4 -0
  90. data/app/views/finance/admin/expenses/_filter_form.html.erb +10 -0
  91. data/app/views/finance/admin/expenses/_filter_table.html.erb +11 -0
  92. data/app/views/finance/admin/expenses/_form.html.erb +12 -0
  93. data/app/views/finance/admin/expenses/_index_tbody.html.erb +13 -0
  94. data/app/views/finance/admin/expenses/_index_thead.html.erb +6 -0
  95. data/app/views/finance/admin/expenses/_item_form.html.erb +18 -0
  96. data/app/views/finance/admin/expenses/_items.html.erb +20 -0
  97. data/app/views/finance/admin/expenses/_member_form.html.erb +16 -0
  98. data/app/views/finance/admin/expenses/_new_form.html.erb +4 -0
  99. data/app/views/finance/admin/expenses/index.html.erb +5 -0
  100. data/app/views/finance/admin/expenses/next.turbo_stream.erb +1 -0
  101. data/app/views/finance/admin/expenses/show.html.erb +121 -0
  102. data/app/views/finance/admin/expenses/trigger.turbo_stream.erb +1 -0
  103. data/app/views/finance/admin/financial_taxons/_edit_form.html.erb +4 -0
  104. data/app/views/finance/admin/financial_taxons/_filter_form.html.erb +10 -0
  105. data/app/views/finance/admin/financial_taxons/_form.html.erb +5 -0
  106. data/app/views/finance/admin/financial_taxons/_index_tbody.html.erb +36 -0
  107. data/app/views/finance/admin/financial_taxons/_index_thead.html.erb +5 -0
  108. data/app/views/finance/admin/financial_taxons/_index_tr.html.erb +13 -0
  109. data/app/views/finance/admin/financial_taxons/_new_form.html.erb +4 -0
  110. data/app/views/finance/admin/financial_taxons/index.html.erb +6 -0
  111. data/app/views/finance/admin/fund_incomes/_breadcrumb.html.erb +7 -0
  112. data/app/views/finance/admin/fund_incomes/_edit_form.html.erb +4 -0
  113. data/app/views/finance/admin/fund_incomes/_filter_form.html.erb +9 -0
  114. data/app/views/finance/admin/fund_incomes/_form.html.erb +4 -0
  115. data/app/views/finance/admin/fund_incomes/_index_tbody.html.erb +5 -0
  116. data/app/views/finance/admin/fund_incomes/_index_thead.html.erb +4 -0
  117. data/app/views/finance/admin/fund_incomes/_new_form.html.erb +4 -0
  118. data/app/views/finance/admin/fund_incomes/_show_table.html.erb +12 -0
  119. data/app/views/finance/admin/fund_incomes/index.html.erb +5 -0
  120. data/app/views/finance/admin/funds/_edit_form.html.erb +3 -0
  121. data/app/views/finance/admin/funds/_filter_form.html.erb +9 -0
  122. data/app/views/finance/admin/funds/_form.html.erb +5 -0
  123. data/app/views/finance/admin/funds/_index_tbody.html.erb +14 -0
  124. data/app/views/finance/admin/funds/_index_thead.html.erb +8 -0
  125. data/app/views/finance/admin/funds/_new_form.html.erb +3 -0
  126. data/app/views/finance/admin/funds/_show_table.html.erb +16 -0
  127. data/app/views/finance/admin/funds/index.html.erb +5 -0
  128. data/app/views/finance/admin/home/index.html.erb +6 -0
  129. data/app/views/finance/admin/stocks/_breadcrumb.html.erb +7 -0
  130. data/app/views/finance/admin/stocks/_edit_form.html.erb +4 -0
  131. data/app/views/finance/admin/stocks/_filter_form.html.erb +9 -0
  132. data/app/views/finance/admin/stocks/_form.html.erb +4 -0
  133. data/app/views/finance/admin/stocks/_index_tbody.html.erb +6 -0
  134. data/app/views/finance/admin/stocks/_index_thead.html.erb +7 -0
  135. data/app/views/finance/admin/stocks/_new_form.html.erb +4 -0
  136. data/app/views/finance/admin/stocks/_show_table.html.erb +16 -0
  137. data/app/views/finance/admin/stocks/index.html.erb +5 -0
  138. data/app/views/finance/me/budgets/_breadcrumb.html.erb +6 -0
  139. data/app/views/finance/me/budgets/_filter_form.html.erb +8 -0
  140. data/app/views/finance/me/budgets/_filter_table.html.erb +11 -0
  141. data/app/views/finance/me/budgets/_index_tbody.html.erb +23 -0
  142. data/app/views/finance/me/budgets/_index_thead.html.erb +4 -0
  143. data/app/views/finance/me/budgets/_items.html.erb +22 -0
  144. data/app/views/finance/me/budgets/_show/_breadcrumb.html.erb +6 -0
  145. data/app/views/finance/me/budgets/admin.html.erb +5 -0
  146. data/app/views/finance/me/budgets/financial_taxons.js.erb +7 -0
  147. data/app/views/finance/me/budgets/index.html.erb +5 -0
  148. data/app/views/finance/me/budgets/index.js +45 -0
  149. data/app/views/finance/me/budgets/submit.turbo_stream.erb +1 -0
  150. data/app/views/finance/me/budgets/transfer.turbo_stream.erb +1 -0
  151. data/app/views/finance/me/expense_members/_breadcrumb.html.erb +6 -0
  152. data/app/views/finance/me/expense_members/_button.html.erb +0 -0
  153. data/app/views/finance/me/expense_members/_filter_form.html.erb +10 -0
  154. data/app/views/finance/me/expense_members/_form.html.erb +9 -0
  155. data/app/views/finance/me/expense_members/_index_tbody.html.erb +8 -0
  156. data/app/views/finance/me/expense_members/_index_thead.html.erb +7 -0
  157. data/app/views/finance/me/expense_members/_show_items.html.erb +1 -0
  158. data/app/views/finance/me/expense_members/admin.html.erb +3 -0
  159. data/app/views/finance/me/expense_members/index.html.erb +6 -0
  160. data/app/views/finance/me/expense_members/items.js.erb +1 -0
  161. data/app/views/finance/me/expense_members/show.html.erb +62 -0
  162. data/app/views/finance/me/expenses/_breadcrumb.html.erb +7 -0
  163. data/app/views/finance/me/expenses/_edit_form.html.erb +3 -0
  164. data/app/views/finance/me/expenses/_filter_form.html.erb +8 -0
  165. data/app/views/finance/me/expenses/_filter_table.html.erb +11 -0
  166. data/app/views/finance/me/expenses/_index_tbody.html.erb +16 -0
  167. data/app/views/finance/me/expenses/_index_thead.html.erb +6 -0
  168. data/app/views/finance/me/expenses/_index_tr.html.erb +14 -0
  169. data/app/views/finance/me/expenses/_new_form.html.erb +4 -0
  170. data/app/views/finance/me/expenses/_show/_breadcrumb.html.erb +6 -0
  171. data/app/views/finance/me/expenses/_show_table.html.erb +124 -0
  172. data/app/views/finance/me/expenses/admin.html.erb +5 -0
  173. data/app/views/finance/me/expenses/confirm.html.erb +27 -0
  174. data/app/views/finance/me/expenses/financial_taxons.js.erb +44 -0
  175. data/app/views/finance/me/expenses/index.html.erb +5 -0
  176. data/app/views/finance/me/expenses/index.js +42 -0
  177. data/app/views/finance/me/expenses/show.html.erb +3 -0
  178. data/app/views/me/_finance_nav.html.erb +11 -0
  179. data/config/locales/en.attributes.yml +6 -0
  180. data/config/locales/en.controller.yml +21 -0
  181. data/config/locales/en.enum.yml +18 -0
  182. data/config/locales/zh.attributes.yml +65 -0
  183. data/config/locales/zh.controller.yml +57 -0
  184. data/config/locales/zh.enum.yml +38 -0
  185. data/config/routes.rb +63 -0
  186. data/lib/rails_finance/config.rb +11 -0
  187. data/lib/rails_finance/engine.rb +26 -0
  188. data/lib/rails_finance/version.rb +3 -0
  189. data/lib/rails_finance.rb +2 -0
  190. metadata +259 -0
@@ -0,0 +1,9 @@
1
+ <%= form_with model: @expense_member, url: my_expense_member_path(@expense_member), method: :patch do |f| %>
2
+ <%= render 'error_messages', target: @expense_member %>
3
+ <%= f.number_field :advance %>
4
+ <div class="inline fields">
5
+ <%= f.collection_select :payment_method_id, @payment_methods, :id, :account_info, {on: {wrapper_all: false}} %>
6
+ <%= link_to 'Add', new_my_payment_method_path, class: 'ui button' %>
7
+ </div>
8
+ <%= f.submit %>
9
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <td><%= link_to expense_member.expense.subject, me_expense_member_path(expense_member.id) %></td>
2
+ <td><%= expense_member.advance %></td>
3
+ <td><%= expense_member.amount %></td>
4
+ <td><%= expense_member.payment_method&.account_info %></td>
5
+ <td><time><%= expense_member.created_at.to_s(:rfc822) %></time></td>
6
+ <td class="tags">
7
+ <span class="tag"><%= expense_member.state_i18n %></span>
8
+ </td>
@@ -0,0 +1,7 @@
1
+ <th><%= Finance::Expense.human_attribute_name(:subject) %></th>
2
+ <th><%= Finance::ExpenseMember.human_attribute_name(:advance) %></th>
3
+ <th><%= Finance::ExpenseMember.human_attribute_name(:amount) %></th>
4
+ <th><%= Finance::ExpenseMember.human_attribute_name(:payment_method_id) %></th>
5
+ <th><%= Finance::ExpenseMember.human_attribute_name(:created_at) %></th>
6
+ <th><%= Finance::ExpenseMember.human_attribute_name(:state) %></th>
7
+ <th></th>
@@ -0,0 +1 @@
1
+ <%= render partial: 'items', locals: { expense_items: @expense_member.expense_items } %>
@@ -0,0 +1,3 @@
1
+ <%= render 'nav_expense' %>
2
+
3
+ <%= render 'index_table' %>
@@ -0,0 +1,6 @@
1
+
2
+ <%= render layout: 'index_table', locals: { cache_key: Finance::ExpenseMember.column_names.hash } do %>
3
+ <%= render partial: 'index_tbody', collection: @expense_members, as: :model %>
4
+ <% end %>
5
+
6
+ <%= paginate @expense_members %>
@@ -0,0 +1 @@
1
+ document.getElementById('modal').innerHTML = '<%= j(render 'show_items') %>'
@@ -0,0 +1,62 @@
1
+ <div class="ui segment breadcrumb">
2
+ <%= link_to 'Back', my_expense_members_path, class: 'section' %>
3
+ <div class="divider"> / </div>
4
+ <div class="active section">Show</div>
5
+ </div>
6
+
7
+ <table class="table is-hoverable is-fullwidth">
8
+ <thead>
9
+ <tr>
10
+ <th class="three wide"></th>
11
+ <th>
12
+ <%= link_to t('.edit'), edit_my_expense_member_path(@expense_member), class: 'ui mini blue right floated button' %>
13
+ </th>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <tr>
18
+ <td class="has-text-right"><%= Expense.human_attribute_name(:type) %></td>
19
+ <td><%= @expense_member.expense.type_i18n %></td>
20
+ </tr>
21
+ <tr>
22
+ <td class="has-text-right"><%= Expense.human_attribute_name(:subject) %></td>
23
+ <td>
24
+ <%= @expense_member.expense.subject %>
25
+ <%= link_to 'more', my_expense_path(@expense_member.expense_id) %>
26
+ </td>
27
+ </tr>
28
+ <tr>
29
+ <td class="has-text-right"><%= Expense.human_attribute_name(:expense_items) %></td>
30
+ <td class="positive">
31
+ <%= render partial: 'items', locals: { expense_items: @expense_member.expense_items } %>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <td class="has-text-right"><%= ExpenseMember.human_attribute_name(:amount) %></td>
36
+ <td>
37
+ <%= @expense_member.amount %>
38
+ </td>
39
+ </tr>
40
+ <tr>
41
+ <td class="has-text-right"><%= Expense.human_attribute_name(:note) %></td>
42
+ <td>
43
+ <%= @expense_member.note %>
44
+ </td>
45
+ </tr>
46
+ <tr>
47
+ <td class="has-text-right"><%= ExpenseMember.human_attribute_name(:invoices) %></td>
48
+ <td>
49
+ <% if @expense_member.advance.to_d > 0 %>
50
+ <p><%= link_to 'Borrow', bill_my_expense_member_path(@expense_member, type: 'borrow', format: 'pdf') %></p>
51
+ <% end %>
52
+ <p><%= link_to 'Reimburse', bill_my_expense_member_path(@expense_member, type: 'reimburse', format: 'pdf') %></p>
53
+ </td>
54
+ </tr>
55
+ <tr>
56
+ <td class="has-text-right"><%= ExpenseMember.human_attribute_name(:items) %></td>
57
+ <td>
58
+ <%= link_to 'items', direct_data_list_table_lists_path('ExpenseItemExport', expense_member_id: @expense_member.id, format: 'xlsx') %>
59
+ </td>
60
+ </tr>
61
+ </tbody>
62
+ </table>
@@ -0,0 +1,7 @@
1
+ <div class="tabs">
2
+ <ul>
3
+ <li class="<%= active_helper('finance/me/expenses': ['index'], active: 'is-active') %>"><%= link_to t('finance.me.expenses.index.title'), me_expenses_path %></li>
4
+ <li class="<%= active_helper('finance/me/expenses': ['admin'], active: 'is-active') %>"><%= link_to t('finance.me.expenses.admin.title'), admin_me_expenses_path %></li>
5
+ <li class="<%= active_helper('finance/me/expense_members': ['admin'], active: 'is-active') %>"><%= link_to t('finance.me.expense_members.admin.title'), admin_me_expense_members_path %></li>
6
+ </ul>
7
+ </div>
@@ -0,0 +1,3 @@
1
+ <%= form_with model: @expense, scope: 'expense', url: { action: 'update' } do |f| %>
2
+ <%= render partial: 'form', locals: { f: f } %>
3
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%= form_with theme: 'search', model: Finance::Expense.new do |f| %>
2
+ <div class="field-body">
3
+ <%= f.text_field 'subject-like' %>
4
+ <div class="field is-narrow">
5
+ <%= f.submit %>
6
+ </div>
7
+ </div>
8
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <table class="as-search">
2
+ <tr>
3
+ <th><%= Finance::Expense.human_attribute_name(:state) %></th>
4
+ <td>
5
+ <%= link_to t('.all'), filter_params(except: [:state]), class: active_params(state: '', active: 'button is-info', item: 'button is-light') %>
6
+ <% Finance::Expense.states.keys.each do |state| %>
7
+ <%= link_to Finance::Expense.enum_i18n(:state, state), filter_params(state: state), class: active_params(state: state, active: 'button is-info', item: 'button is-light') %>
8
+ <% end %>
9
+ </td>
10
+ </tr>
11
+ </table>
@@ -0,0 +1,16 @@
1
+ <td><%= model.type_i18n %></td>
2
+ <td><%= link_to model.subject, me_expense_path(model) %></td>
3
+ <td><%= model.amount %></td>
4
+ <td>
5
+ <%= link_to model.proof.filename, rails_blob_path(model.proof, disposition: 'attachment') if model.proof.attached? %>
6
+ </td>
7
+ <td>
8
+ <span class="tag"><%= model.state_i18n %></span>
9
+ <% model.all_verifications.each do |verification| %>
10
+ <p>
11
+ <%= verification.job_title&.name %>
12
+ <%= verification.member&.name %>
13
+ <span class="tag"><%= verification.confirmed_i18n %></span>
14
+ </p>
15
+ <% end %>
16
+ </td>
@@ -0,0 +1,6 @@
1
+ <th><%= Finance::Expense.human_attribute_name(:type) %></th>
2
+ <th><%= Finance::Expense.human_attribute_name(:subject) %></th>
3
+ <th><%= Finance::Expense.human_attribute_name(:amount) %></th>
4
+ <th><%= Finance::Expense.human_attribute_name(:proof) %></th>
5
+ <th><%= Finance::Expense.human_attribute_name(:state) %></th>
6
+ <th></th>
@@ -0,0 +1,14 @@
1
+ <tr id="tr_<%= model.id %>" data-controller="show" data-action="mouseenter->show#show mouseleave->show#hide">
2
+ <%= yield %>
3
+ <td>
4
+ <span data-show-target="item" style="visibility: hidden">
5
+ <%= link_to 'History', audits_path(model.class.base_class.name, model.id), class: 'button is-small is-rounded is-light' %>
6
+ <%= link_to({ action: 'edit', id: model.id }, data: { turbo_frame: 'modal' }, aria: { label: t('.edit') }, class: 'button is-small is-rounded is-light') do %>
7
+ <i class="fas fa-pencil-alt"></i>
8
+ <% end if ['init', 'rejected'].include? model.state %>
9
+ <%= button_to({ action: 'destroy', id: model.id }, method: :delete, data: { confirm: t('.confirm') }, aria: { label: t('.destroy') }, class: 'button is-small is-rounded is-light') do %>
10
+ <i class="fas fa-trash-alt"></i>
11
+ <% end if ['init', 'rejected'].include? model.state %>
12
+ </span>
13
+ </td>
14
+ </tr>
@@ -0,0 +1,4 @@
1
+ <%= form_with model: @expense, url: { action: 'create' } do |f| %>
2
+ <%= render partial: 'form', locals: { f: f } %>
3
+ <%= f.submit %>
4
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <div class="breadcrumb has-succeeds-separator">
2
+ <ul>
3
+ <li><%= link_to t('finance.me.expenses.index.title'), { action: 'index' } %></li>
4
+ <li class="is-active"><%= t('.title') %></li>
5
+ </ul>
6
+ </div>
@@ -0,0 +1,124 @@
1
+ <table class="table is-hoverable is-fullwidth">
2
+ <thead>
3
+ <tr>
4
+ <th></th>
5
+ <th>
6
+ <%= link_to t('.confirm'), confirm_me_expense_path(@expense), class: 'ui mini green right floated button' %>
7
+ <%= link_to t('.edit'), edit_me_expense_path(@expense), class: 'ui mini blue right floated button' %>
8
+ </th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <tr>
13
+ <td class="has-text-right"><%= Expense.human_attribute_name(:type) %></td>
14
+ <td><%= @expense.type_i18n %></td>
15
+ </tr>
16
+ <tr>
17
+ <td class="has-text-right"><%= Expense.human_attribute_name(:subject) %></td>
18
+ <td>
19
+ <%= @expense.subject %>
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <td class="has-text-right"><%= Expense.human_attribute_name(:state) %></td>
24
+ <td>
25
+ <span class="ui label"><%= @expense.state_i18n %></span>
26
+ </td>
27
+ </tr>
28
+ <tr>
29
+ <td class="has-text-right"><%= Expense.human_attribute_name(:expense_items) %></td>
30
+ <td class="positive">
31
+ <%= render partial: 'finance/me/expense_members/items', locals: { expense_items: @expense.expense_items } %>
32
+ </td>
33
+ </tr>
34
+ <% if @expense.financial_taxon&.individual %>
35
+ <tr>
36
+ <td class="has-text-right"><%= Expense.human_attribute_name(:expense_members) %></td>
37
+ <td class="negative">
38
+ <table class="table">
39
+ <tr>
40
+ <th><%= ExpenseMember.human_attribute_name(:member) %></th>
41
+ <th><%= ExpenseMember.human_attribute_name(:advance) %></th>
42
+ <th><%= ExpenseMember.human_attribute_name(:amount) %></th>
43
+ <th><%= ExpenseMember.human_attribute_name(:payout_amount) %></th>
44
+ <th></th>
45
+ </tr>
46
+ <% @expense.expense_members.each do |member| %>
47
+ <tr>
48
+ <td><%= member.member.name %></td>
49
+ <td><%= member.advance %></td>
50
+ <td><%= member.amount %></td>
51
+ <td><%= member.payout_amount %></td>
52
+ <td></td>
53
+ </tr>
54
+ <% end %>
55
+ </table>
56
+ </td>
57
+ </tr>
58
+ <% end %>
59
+ <tr>
60
+ <td class="has-text-right"><%= Expense.human_attribute_name(:amount) %></td>
61
+ <td>
62
+ <%= @expense.amount %>
63
+ </td>
64
+ </tr>
65
+ <tr>
66
+ <td class="has-text-right"><%= Expense.human_attribute_name(:note) %></td>
67
+ <td>
68
+ <%= @expense.note %>
69
+ </td>
70
+ </tr>
71
+ <tr>
72
+ <td class="has-text-right"><%= Expense.human_attribute_name(:checks) %></td>
73
+ <td>
74
+ <table class="ui very basic table">
75
+ <% @expense.all_verifications.each do |verification| %>
76
+ <tr>
77
+ <td><%= Expense.enum_i18n(:state, verification.state) %></td>
78
+ <td><%= verification.note %></td>
79
+ <td><%= verification.member&.name %></td>
80
+ </tr>
81
+ <% end %>
82
+ </table>
83
+ </td>
84
+ </tr>
85
+ <% if @expense.payment_method %>
86
+ <tr>
87
+ <td class="has-text-right"><%= Expense.human_attribute_name(:payment_method) %></td>
88
+ <td>
89
+ <p><%= @expense.payment_method.account_name %></p>
90
+ <p><%= @expense.payment_method.account_num %></p>
91
+ <p><%= @expense.payment_method.bank %></p>
92
+ </td>
93
+ </tr>
94
+ <% end %>
95
+ <% if @expense.type == 'PayableExpense' %>
96
+ <tr>
97
+ <td class="has-text-right"><%= Expense.human_attribute_name(:invoices) %></td>
98
+ <td>
99
+ <%= link_to 'pdf', bill_me_expense_path(@expense, format: 'pdf') %>
100
+ </td>
101
+ </tr>
102
+ <% end %>
103
+ <tr>
104
+ <td class="has-text-right"><%= Expense.human_attribute_name(:items) %></td>
105
+ <td>
106
+ <%= link_to 'items', direct_data_list_table_lists_path('ExpenseItemExport', expense_id: @expense.id, format: 'xlsx') %>
107
+ </td>
108
+ </tr>
109
+ </tbody>
110
+ <tfoot>
111
+ <tr>
112
+ <td>
113
+ </td>
114
+ <td>
115
+ <% if @expense.init? %>
116
+ <%= link_to 'Request', requested_me_expense_path(@expense), method: :patch, data: { confirm: 'Confirm!' }, class: 'ui pink label' %>
117
+ <% end %>
118
+ <% @expense.next_states(:type).each do |type| %>
119
+ <%= link_to "Transfer to #{Expense.enum_i18n(:type, type)}", transfer_me_expense_path(@expense, type: type), method: :patch, class: 'ui mini blue right floated button' %>
120
+ <% end %>
121
+ </td>
122
+ </tr>
123
+ </tfoot>
124
+ </table>
@@ -0,0 +1,5 @@
1
+ <%= render layout: 'index_table', locals: { cache_key: Finance::Expense.column_names.hash } do %>
2
+ <%= render partial: 'index_tbody', layout: 'index_tr', collection: @expenses, as: :model %>
3
+ <% end %>
4
+
5
+ <%= paginate @expenses %>
@@ -0,0 +1,27 @@
1
+ <div class="ui segment breadcrumb">
2
+ <%= link_to 'My Expenses', my_expenses_path, class: 'section' %>
3
+ <div class="divider"> / </div>
4
+ <%= link_to @expense.subject, my_expense_path(@expense), class: 'section' %>
5
+ <div class="divider"> / </div>
6
+ <div class="active section">Confirm</div>
7
+ </div>
8
+
9
+ <%= render 'table' %>
10
+
11
+ <div class="ui attached segment">
12
+ <%= form_with model: @expense, scope: 'expense', url: my_expense_path(@expense) do |f| %>
13
+ <%= render 'error_messages', target: @expense %>
14
+ <% if @expense.type == 'PrepayExpense' %>
15
+ <%= f.fields :expense_members, on: { wrap_all: false, label: false, placeholder: true }, css: { wrapper_input: 'two wide field' } do |ef| %>
16
+ <%= render partial: 'member_form', locals: { ef: ef } %>
17
+ <% end %>
18
+ <% end %>
19
+ <% if @expense.type == 'PayableExpense' %>
20
+ <div class="inline fields">
21
+ <%= f.collection_select :payment_method_id, @payment_methods, :id, :account_info, { on: { wrap_all: false } } %>
22
+ <%= link_to 'Add', new_admin_payment_method_path, class: 'ui button' %>
23
+ </div>
24
+ <% end %>
25
+ <%= f.submit %>
26
+ <% end %>
27
+ </div>
@@ -0,0 +1,44 @@
1
+ <% form_object = form_object(@expense, css: { label: 'three wide field' }) %>
2
+
3
+
4
+ var template = '<%= j(render partial: 'item_field', locals: { f: form_object, index: nil }) %>'
5
+
6
+ $('#expense_financial_taxon_id_wrapper').nextAll('[id^="expense_expense_items_"]').remove()
7
+ $('#expense_financial_taxon_id_wrapper').after(template)
8
+
9
+ $('[data-title="expense_item_member"]').dropdown({
10
+ apiSettings: {
11
+ url: '/my/member/search?q={query}'
12
+ },
13
+ fields: {
14
+ name: 'name',
15
+ value: 'id'
16
+ }
17
+ });
18
+ $('[data-title="expense_item_financial_taxon"]').dropdown({
19
+ placeholder: true
20
+ });
21
+
22
+ $('[data-title="add_item"]').each(function(){
23
+ var add_item_link = new URL(this.href);
24
+ add_item_link.searchParams.set('financial_taxon_id', '<%= params[:financial_taxon_id] %>');
25
+ this.setAttribute('href', add_item_link)
26
+ });
27
+
28
+ $('[name*="expense[expense_items_attributes]["]').filter('[name$="][price]"]').on('change', function() {
29
+ var names = this.id.split('_');
30
+ names.pop();
31
+ var _quantity = names.concat('quantity').join('_');
32
+ var _budget = names.concat('budget').join('_');
33
+ var quantity = document.getElementById(_quantity);
34
+ document.getElementById(_budget).value = (this.value * quantity.value).toFixed(2);
35
+ });
36
+
37
+ $('[name*="expense[expense_items_attributes]["]').filter('[name$="][quantity]"]').on('change', function() {
38
+ var names = this.id.split('_');
39
+ names.pop();
40
+ var _price = names.concat('price').join('_');
41
+ var _budget = names.concat('budget').join('_');
42
+ var price = document.getElementById(_price);
43
+ document.getElementById(_budget).value = (this.value * price.value).toFixed(2);
44
+ });
@@ -0,0 +1,5 @@
1
+ <%= render layout: 'index_table', locals: { cache_key: Finance::Expense.column_names.hash } do %>
2
+ <%= render partial: 'index_tbody', layout: 'index_tr', collection: @expenses, as: :model %>
3
+ <% end %>
4
+
5
+ <%= paginate @expenses %>
@@ -0,0 +1,42 @@
1
+ import { Controller } from 'stimulus'
2
+
3
+ class ExpenseController extends Controller {
4
+ static targets = ['quantity', 'budget_amount', 'price']
5
+
6
+ connect() {
7
+ console.debug(this.identifier, 'connected!')
8
+ }
9
+
10
+ updatePrice(event) {
11
+ let price = event.currentTarget
12
+ let quantity = document.getElementById(price.id.replace('price', 'quantity'))
13
+ let result = (price.value * quantity.value).toFixed(2)
14
+
15
+ let budget = document.getElementById(price.id.replace('price', 'budget_amount'))
16
+ if (budget) {
17
+ budget.value = result
18
+ }
19
+ let amount = document.getElementById(price.id.replace('price', 'amount'))
20
+ if (amount) {
21
+ amount.value = result
22
+ }
23
+ }
24
+
25
+ updateQuantity(event) {
26
+ let quantity = event.currentTarget
27
+ let price = document.getElementById(quantity.id.replace('quantity', 'price'))
28
+ let result = (price.value * quantity.value).toFixed(2)
29
+
30
+ let budget = document.getElementById(quantity.id.replace('quantity', 'budget_amount'))
31
+ if (budget) {
32
+ budget.value = result
33
+ }
34
+ let amount = document.getElementById(quantity.id.replace('quantity', 'amount'))
35
+ if (amount) {
36
+ amount.value = result
37
+ }
38
+ }
39
+
40
+ }
41
+
42
+ application.register('expense', ExpenseController)