Binding interface for bank statements

This commit is contained in:
Martin Lensment 2015-04-15 11:32:51 +03:00
parent 2dfa65645b
commit 851e5368eb
15 changed files with 113 additions and 26 deletions

View file

@ -1,7 +1,7 @@
class Admin::BankStatementsController < AdminController
load_and_authorize_resource
before_action :set_bank_statement, only: [:show, :download_import_file]
before_action :set_bank_statement, only: [:show, :download_import_file, :bind_invoices]
def index
@q = BankStatement.search(params[:q])
@ -10,7 +10,8 @@ class Admin::BankStatementsController < AdminController
end
def show
@q = @bank_statement.bank_transactions.search(params[:q])
@q = @bank_statement.bank_transactions.includes(:account_activity).search(params[:q])
@q.sorts = 'account_activity_id desc' if @q.sorts.empty?
@bank_transactions = @q.result.page(params[:page])
end
@ -30,6 +31,16 @@ class Admin::BankStatementsController < AdminController
end
end
def bind_invoices
@bank_statement.bind_invoices
flash[:notice] = t('invoices_were_fully_binded') if @bank_statement.fully_binded?
flash[:warning] = t('invoices_were_partially_binded') if @bank_statement.partially_binded?
flash[:alert] = t('no_invoices_were_binded') if @bank_statement.not_binded?
redirect_to [:admin, @bank_statement]
end
def download_import_file
filename = @bank_statement.import_file_path.split('/').last
send_data File.open(@bank_statement.import_file_path, 'r').read, filename: filename

View file

@ -5,6 +5,10 @@ class BankStatement < ActiveRecord::Base
validates :bank_code, :iban, :queried_at, presence: true
FULLY_BINDED = 'fully_binded'
PARTIALLY_BINDED = 'partially_binded'
NOT_BINDED = 'not_binded'
def import
import_th6_file && save
end
@ -50,7 +54,30 @@ class BankStatement < ActiveRecord::Base
nil
end
def bind_with_invoices
bank_transactions.unbinded.each(&:bind_with_invoice)
# TODO: Cache this to database so it can be used for searching
def status
if bank_transactions.unbinded.count == bank_transactions.count
NOT_BINDED
elsif bank_transactions.unbinded.count == 0
FULLY_BINDED
else
PARTIALLY_BINDED
end
end
def not_binded?
status == NOT_BINDED
end
def partially_binded?
status == PARTIALLY_BINDED
end
def fully_binded?
status == FULLY_BINDED
end
def bind_invoices
bank_transactions.unbinded.each(&:bind_invoice)
end
end

View file

@ -8,10 +8,15 @@ class BankTransaction < ActiveRecord::Base
account_activity.present?
end
def binded_invoice
return unless binded?
account_activity.invoice
end
# For successful binding, reference number, invoice id and sum must match with the invoice
# rubocop: disable Metrics/PerceivedComplexity
# rubocop: disable Metrics/CyclomaticComplexity
def bind_with_invoice
def bind_invoice
return if binded?
registrar = Registrar.find_by(reference_no: reference_no)
return unless registrar

View file

@ -7,6 +7,10 @@ class Invoice < ActiveRecord::Base
validates :invoice_type, :due_date, :currency, :seller_name,
:seller_iban, :buyer_name, :invoice_items, :vat_prc, presence: true
def to_s
I18n.t('invoice_no', no: id)
end
def seller_address
[seller_street, seller_city, seller_state, seller_zip].reject(&:blank?).compact.join(', ')
end

View file

@ -11,18 +11,25 @@
%table.table.table-hover.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-2'}
%th{class: 'col-xs-3'}
= sort_link(@q, 'created_at', t('imported_at'))
%th{class: 'col-xs-2'}
%th{class: 'col-xs-3'}
= sort_link(@q, 'bank_code')
%th{class: 'col-xs-2'}
%th{class: 'col-xs-3'}
= sort_link(@q, 'iban', t('iban').upcase)
/ TODO: Make this searchable by caching the status to the database
%th{class: 'col-xs-3'}
= t('status')
%tbody
- @bank_statements.each do |x|
%tr
%td= link_to(l(x.created_at), admin_bank_statement_path(x))
%td= x.bank_code
%td= x.iban
- sc = 'text-success' if x.status == BankStatement::FULLY_BINDED
- sc = 'text-warning' if x.status == BankStatement::PARTIALLY_BINDED
- sc = 'text-danger' if x.status == BankStatement::NOT_BINDED
%td{class: sc}= t(x.status)
.row
.col-md-12
= paginate @bank_statements

View file

@ -3,7 +3,7 @@
%h2.text-center-xs= t('bank_statement')
.col-sm-6
%h2.text-right.text-center-xs
= link_to(t('bind_with_invoices'), '#', class: 'btn btn-primary')
= link_to(t('bind_invoices'), bind_invoices_admin_bank_statement_path, class: 'btn btn-primary', method: :post)
= link_to(t('back_to_bank_statements'), admin_bank_statements_path, class: 'btn btn-default')
%hr
%row
@ -16,9 +16,15 @@
%dt= t('bank_code')
%dd= @bank_statement.bank_code
%dt= t('iban').upcase
%dt= t('iban')
%dd= @bank_statement.iban
%dt= t('status')
- sc = 'text-success' if @bank_statement.status == BankStatement::FULLY_BINDED
- sc = 'text-warning' if @bank_statement.status == BankStatement::PARTIALLY_BINDED
- sc = 'text-danger' if @bank_statement.status == BankStatement::NOT_BINDED
%dd{class: sc}= t(@bank_statement.status)
%dt= t('queried_at')
%dd= l(@bank_statement.queried_at)
@ -46,7 +52,7 @@
%th{class: 'col-xs-2'}
= sort_link(@q, 'currency')
%th{class: 'col-xs-2'}
= sort_link(@q, 'account_activity', t('status'))
= sort_link(@q, 'account_activity_id', t('status'))
%tbody
- @bank_transactions.each do |x|
%tr
@ -54,10 +60,8 @@
%td= x.buyer_name
%td= x.sum
%td= x.currency
%td
- c = x.binded? ? 'label-success' : 'label-danger'
%span.label{class: c}= x.binded? ? t('binded') : t('not_binded')
&nbsp;
- c = x.binded? ? 'text-success' : 'text-danger'
%td{class: c}= x.binded? ? t('binded') : t('not_binded')
.row
.col-md-12
= paginate @bank_transactions

View file

@ -16,6 +16,14 @@
%dt= t('document_no')
%dd= @bank_transaction.document_no
%dt= t('status')
- c = @bank_transaction.binded? ? 'text-success' : 'text-danger'
%dd{class: c}= @bank_transaction.binded? ? t('binded') : t('not_binded')
- if @bank_transaction.binded?
%dt= t('binded_invoice')
%dd= link_to(@bank_transaction.binded_invoice, '#')
%dt= t('bank_reference')
%dd= @bank_transaction.bank_reference

View file

@ -63,10 +63,7 @@
/ /.nav-collapse
.container
- display = (flash.empty?) ? 'none' : 'block'
#flash{style: "display: #{display};"}
- type = (flash[:notice]) ? 'bg-success' : 'bg-danger'
.alert{class: type}= flash[:notice] || flash[:alert]
= render 'registrar/shared/flash'
= yield
.footer.text-right

View file

@ -1,4 +1,5 @@
- display = (flash[:notice] || flash[:alert]) ? 'block' : 'none'
- display = (flash[:notice] || flash[:alert] || flash[:warning]) ? 'block' : 'none'
#flash{style: "display: #{display};"}
- type = (flash[:notice]) ? 'bg-success' : 'bg-danger'
.alert{class: type}= flash[:notice] || flash[:alert]
- type = 'bg-warning' if flash[:warning]
.alert{class: type}= flash[:notice] || flash[:alert] || flash[:warning]