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.
- checksums.yaml +7 -0
- data/LICENSE +20 -0
- data/README.md +20 -0
- data/Rakefile +32 -0
- data/app/controllers/finance/admin/assessments_controller.rb +55 -0
- data/app/controllers/finance/admin/base_controller.rb +4 -0
- data/app/controllers/finance/admin/budgets_controller.rb +83 -0
- data/app/controllers/finance/admin/expense_members_controller.rb +59 -0
- data/app/controllers/finance/admin/expenses_controller.rb +71 -0
- data/app/controllers/finance/admin/financial_taxons_controller.rb +67 -0
- data/app/controllers/finance/admin/fund_incomes_controller.rb +59 -0
- data/app/controllers/finance/admin/funds_controller.rb +58 -0
- data/app/controllers/finance/admin/home_controller.rb +8 -0
- data/app/controllers/finance/admin/stocks_controller.rb +60 -0
- data/app/controllers/finance/me/base_controller.rb +4 -0
- data/app/controllers/finance/me/budgets_controller.rb +111 -0
- data/app/controllers/finance/me/expense_members_controller.rb +73 -0
- data/app/controllers/finance/me/expenses_controller.rb +129 -0
- data/app/controllers/finance_controller/me.rb +14 -0
- data/app/models/budget/finance/fund_budget.rb +5 -0
- data/app/models/budget/finance/stock_budget.rb +5 -0
- data/app/models/expense/finance/payable_expense.rb +5 -0
- data/app/models/expense/finance/prepay_expense.rb +5 -0
- data/app/models/finance/application_record.rb +5 -0
- data/app/models/finance/assessment.rb +5 -0
- data/app/models/finance/budget.rb +7 -0
- data/app/models/finance/expense.rb +7 -0
- data/app/models/finance/expense_item.rb +5 -0
- data/app/models/finance/expense_member.rb +6 -0
- data/app/models/finance/ext/financial.rb +24 -0
- data/app/models/finance/ext/member.rb +13 -0
- data/app/models/finance/financial_taxon.rb +7 -0
- data/app/models/finance/fund.rb +6 -0
- data/app/models/finance/fund_income.rb +5 -0
- data/app/models/finance/model/assessment.rb +26 -0
- data/app/models/finance/model/budget/fund_budget.rb +5 -0
- data/app/models/finance/model/budget/stock_budget.rb +10 -0
- data/app/models/finance/model/budget.rb +152 -0
- data/app/models/finance/model/expense/payable_expense.rb +5 -0
- data/app/models/finance/model/expense/prepay_expense.rb +5 -0
- data/app/models/finance/model/expense.rb +168 -0
- data/app/models/finance/model/expense_item.rb +36 -0
- data/app/models/finance/model/expense_member.rb +130 -0
- data/app/models/finance/model/financial_taxon.rb +27 -0
- data/app/models/finance/model/fund.rb +36 -0
- data/app/models/finance/model/fund_income.rb +30 -0
- data/app/models/finance/model/stock.rb +33 -0
- data/app/models/finance/stock.rb +5 -0
- data/app/models/finance.rb +12 -0
- data/app/pdfs/borrow_expense_pdf.rb +70 -0
- data/app/pdfs/payout_expense_pdf.rb +70 -0
- data/app/pdfs/prepay_expense_pdf.rb +70 -0
- data/app/records/borrow_expense_record.rb +10 -0
- data/app/records/prepay_expense_record.rb +16 -0
- data/app/views/admin/_finance_nav.html.erb +14 -0
- data/app/views/admin/_nav_expense.html.erb +4 -0
- data/app/views/finance/admin/assessments/_edit_form.html.erb +4 -0
- data/app/views/finance/admin/assessments/_filter_form.html.erb +9 -0
- data/app/views/finance/admin/assessments/_form.html.erb +2 -0
- data/app/views/finance/admin/assessments/_index_tbody.html.erb +2 -0
- data/app/views/finance/admin/assessments/_index_thead.html.erb +3 -0
- data/app/views/finance/admin/assessments/_index_tr.html.erb +19 -0
- data/app/views/finance/admin/assessments/_new_form.html.erb +4 -0
- data/app/views/finance/admin/assessments/_show_table.html.erb +4 -0
- data/app/views/finance/admin/assessments/index.html.erb +5 -0
- data/app/views/finance/admin/base/_nav.html.erb +3 -0
- data/app/views/finance/admin/budgets/_breadcrumb.html.erb +9 -0
- data/app/views/finance/admin/budgets/_edit_form.html.erb +4 -0
- data/app/views/finance/admin/budgets/_filter_form.html.erb +10 -0
- data/app/views/finance/admin/budgets/_filter_table.html.erb +11 -0
- data/app/views/finance/admin/budgets/_form.html.erb +7 -0
- data/app/views/finance/admin/budgets/_index_tbody.html.erb +13 -0
- data/app/views/finance/admin/budgets/_index_thead.html.erb +6 -0
- data/app/views/finance/admin/budgets/_item_form.html.erb +17 -0
- data/app/views/finance/admin/budgets/_items.html.erb +16 -0
- data/app/views/finance/admin/budgets/_new_form.html.erb +4 -0
- data/app/views/finance/admin/budgets/_show/_breadcrumb.html.erb +6 -0
- data/app/views/finance/admin/budgets/_show_table.html.erb +62 -0
- data/app/views/finance/admin/budgets/index.html.erb +5 -0
- data/app/views/finance/admin/budgets/next.turbo_stream.erb +1 -0
- data/app/views/finance/admin/budgets/show.htmlx.erb +35 -0
- data/app/views/finance/admin/budgets/trigger.js.erb +1 -0
- data/app/views/finance/admin/expense_members/_edit_form.html.erb +3 -0
- data/app/views/finance/admin/expense_members/_form.html.erb +5 -0
- data/app/views/finance/admin/expense_members/_index_tbody.html.erb +53 -0
- data/app/views/finance/admin/expense_members/_index_thead.html.erb +12 -0
- data/app/views/finance/admin/expense_members/index.html.erb +8 -0
- data/app/views/finance/admin/expenses/_breadcrumb.html.erb +9 -0
- data/app/views/finance/admin/expenses/_edit_form.html.erb +4 -0
- data/app/views/finance/admin/expenses/_filter_form.html.erb +10 -0
- data/app/views/finance/admin/expenses/_filter_table.html.erb +11 -0
- data/app/views/finance/admin/expenses/_form.html.erb +12 -0
- data/app/views/finance/admin/expenses/_index_tbody.html.erb +13 -0
- data/app/views/finance/admin/expenses/_index_thead.html.erb +6 -0
- data/app/views/finance/admin/expenses/_item_form.html.erb +18 -0
- data/app/views/finance/admin/expenses/_items.html.erb +20 -0
- data/app/views/finance/admin/expenses/_member_form.html.erb +16 -0
- data/app/views/finance/admin/expenses/_new_form.html.erb +4 -0
- data/app/views/finance/admin/expenses/index.html.erb +5 -0
- data/app/views/finance/admin/expenses/next.turbo_stream.erb +1 -0
- data/app/views/finance/admin/expenses/show.html.erb +121 -0
- data/app/views/finance/admin/expenses/trigger.turbo_stream.erb +1 -0
- data/app/views/finance/admin/financial_taxons/_edit_form.html.erb +4 -0
- data/app/views/finance/admin/financial_taxons/_filter_form.html.erb +10 -0
- data/app/views/finance/admin/financial_taxons/_form.html.erb +5 -0
- data/app/views/finance/admin/financial_taxons/_index_tbody.html.erb +36 -0
- data/app/views/finance/admin/financial_taxons/_index_thead.html.erb +5 -0
- data/app/views/finance/admin/financial_taxons/_index_tr.html.erb +13 -0
- data/app/views/finance/admin/financial_taxons/_new_form.html.erb +4 -0
- data/app/views/finance/admin/financial_taxons/index.html.erb +6 -0
- data/app/views/finance/admin/fund_incomes/_breadcrumb.html.erb +7 -0
- data/app/views/finance/admin/fund_incomes/_edit_form.html.erb +4 -0
- data/app/views/finance/admin/fund_incomes/_filter_form.html.erb +9 -0
- data/app/views/finance/admin/fund_incomes/_form.html.erb +4 -0
- data/app/views/finance/admin/fund_incomes/_index_tbody.html.erb +5 -0
- data/app/views/finance/admin/fund_incomes/_index_thead.html.erb +4 -0
- data/app/views/finance/admin/fund_incomes/_new_form.html.erb +4 -0
- data/app/views/finance/admin/fund_incomes/_show_table.html.erb +12 -0
- data/app/views/finance/admin/fund_incomes/index.html.erb +5 -0
- data/app/views/finance/admin/funds/_edit_form.html.erb +3 -0
- data/app/views/finance/admin/funds/_filter_form.html.erb +9 -0
- data/app/views/finance/admin/funds/_form.html.erb +5 -0
- data/app/views/finance/admin/funds/_index_tbody.html.erb +14 -0
- data/app/views/finance/admin/funds/_index_thead.html.erb +8 -0
- data/app/views/finance/admin/funds/_new_form.html.erb +3 -0
- data/app/views/finance/admin/funds/_show_table.html.erb +16 -0
- data/app/views/finance/admin/funds/index.html.erb +5 -0
- data/app/views/finance/admin/home/index.html.erb +6 -0
- data/app/views/finance/admin/stocks/_breadcrumb.html.erb +7 -0
- data/app/views/finance/admin/stocks/_edit_form.html.erb +4 -0
- data/app/views/finance/admin/stocks/_filter_form.html.erb +9 -0
- data/app/views/finance/admin/stocks/_form.html.erb +4 -0
- data/app/views/finance/admin/stocks/_index_tbody.html.erb +6 -0
- data/app/views/finance/admin/stocks/_index_thead.html.erb +7 -0
- data/app/views/finance/admin/stocks/_new_form.html.erb +4 -0
- data/app/views/finance/admin/stocks/_show_table.html.erb +16 -0
- data/app/views/finance/admin/stocks/index.html.erb +5 -0
- data/app/views/finance/me/budgets/_breadcrumb.html.erb +6 -0
- data/app/views/finance/me/budgets/_filter_form.html.erb +8 -0
- data/app/views/finance/me/budgets/_filter_table.html.erb +11 -0
- data/app/views/finance/me/budgets/_index_tbody.html.erb +23 -0
- data/app/views/finance/me/budgets/_index_thead.html.erb +4 -0
- data/app/views/finance/me/budgets/_items.html.erb +22 -0
- data/app/views/finance/me/budgets/_show/_breadcrumb.html.erb +6 -0
- data/app/views/finance/me/budgets/admin.html.erb +5 -0
- data/app/views/finance/me/budgets/financial_taxons.js.erb +7 -0
- data/app/views/finance/me/budgets/index.html.erb +5 -0
- data/app/views/finance/me/budgets/index.js +45 -0
- data/app/views/finance/me/budgets/submit.turbo_stream.erb +1 -0
- data/app/views/finance/me/budgets/transfer.turbo_stream.erb +1 -0
- data/app/views/finance/me/expense_members/_breadcrumb.html.erb +6 -0
- data/app/views/finance/me/expense_members/_button.html.erb +0 -0
- data/app/views/finance/me/expense_members/_filter_form.html.erb +10 -0
- data/app/views/finance/me/expense_members/_form.html.erb +9 -0
- data/app/views/finance/me/expense_members/_index_tbody.html.erb +8 -0
- data/app/views/finance/me/expense_members/_index_thead.html.erb +7 -0
- data/app/views/finance/me/expense_members/_show_items.html.erb +1 -0
- data/app/views/finance/me/expense_members/admin.html.erb +3 -0
- data/app/views/finance/me/expense_members/index.html.erb +6 -0
- data/app/views/finance/me/expense_members/items.js.erb +1 -0
- data/app/views/finance/me/expense_members/show.html.erb +62 -0
- data/app/views/finance/me/expenses/_breadcrumb.html.erb +7 -0
- data/app/views/finance/me/expenses/_edit_form.html.erb +3 -0
- data/app/views/finance/me/expenses/_filter_form.html.erb +8 -0
- data/app/views/finance/me/expenses/_filter_table.html.erb +11 -0
- data/app/views/finance/me/expenses/_index_tbody.html.erb +16 -0
- data/app/views/finance/me/expenses/_index_thead.html.erb +6 -0
- data/app/views/finance/me/expenses/_index_tr.html.erb +14 -0
- data/app/views/finance/me/expenses/_new_form.html.erb +4 -0
- data/app/views/finance/me/expenses/_show/_breadcrumb.html.erb +6 -0
- data/app/views/finance/me/expenses/_show_table.html.erb +124 -0
- data/app/views/finance/me/expenses/admin.html.erb +5 -0
- data/app/views/finance/me/expenses/confirm.html.erb +27 -0
- data/app/views/finance/me/expenses/financial_taxons.js.erb +44 -0
- data/app/views/finance/me/expenses/index.html.erb +5 -0
- data/app/views/finance/me/expenses/index.js +42 -0
- data/app/views/finance/me/expenses/show.html.erb +3 -0
- data/app/views/me/_finance_nav.html.erb +11 -0
- data/config/locales/en.attributes.yml +6 -0
- data/config/locales/en.controller.yml +21 -0
- data/config/locales/en.enum.yml +18 -0
- data/config/locales/zh.attributes.yml +65 -0
- data/config/locales/zh.controller.yml +57 -0
- data/config/locales/zh.enum.yml +38 -0
- data/config/routes.rb +63 -0
- data/lib/rails_finance/config.rb +11 -0
- data/lib/rails_finance/engine.rb +26 -0
- data/lib/rails_finance/version.rb +3 -0
- data/lib/rails_finance.rb +2 -0
- 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 @@
|
|
|
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,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,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,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,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)
|