mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-11-29 10:24:20 +01:00
86 lines
2.8 KiB
Ruby
86 lines
2.8 KiB
Ruby
class API::InvoicesController < API::ApiController
|
|
before_action :authenticate_user!
|
|
before_action :set_invoice, only: [:show, :download]
|
|
|
|
def index
|
|
authorize Invoice
|
|
@invoices = Invoice.includes(:avoir, :invoiced, invoice_items: [:subscription, :invoice_item], user: [:profile, :trainings]).all.order('reference DESC')
|
|
end
|
|
|
|
def download
|
|
authorize @invoice
|
|
send_file File.join(Rails.root, @invoice.file), :type => 'application/pdf', :disposition => 'attachment'
|
|
end
|
|
|
|
def list
|
|
authorize Invoice
|
|
|
|
p = params.require(:query).permit(:number, :customer, :date, :order_by, :page, :size)
|
|
|
|
unless p[:page].is_a? Integer
|
|
render json: {error: 'page must be an integer'}, status: :unprocessable_entity
|
|
end
|
|
|
|
unless p[:size].is_a? Integer
|
|
render json: {error: 'size must be an integer'}, status: :unprocessable_entity
|
|
end
|
|
|
|
|
|
direction = (p[:order_by][0] == '-' ? 'DESC' : 'ASC')
|
|
order_key = (p[:order_by][0] == '-' ? p[:order_by][1, p[:order_by].size] : p[:order_by])
|
|
|
|
case order_key
|
|
when 'reference'
|
|
order_key = 'invoices.reference'
|
|
when 'date'
|
|
order_key = 'invoices.created_at'
|
|
when 'total'
|
|
order_key = 'invoices.total'
|
|
when 'name'
|
|
order_key = 'profiles.first_name'
|
|
else
|
|
order_key = 'invoices.id'
|
|
end
|
|
|
|
@invoices = Invoice.includes(:avoir, :invoiced, invoice_items: [:subscription, :invoice_item], user: [:profile, :trainings])
|
|
.joins(:user => :profile)
|
|
.order("#{order_key} #{direction}")
|
|
.page(p[:page])
|
|
.per(p[:size])
|
|
|
|
# ILIKE => PostgreSQL case-insensitive LIKE
|
|
@invoices = @invoices.where('invoices.reference LIKE :search', search: "#{p[:number].to_s}%") if p[:number].size > 0
|
|
@invoices = @invoices.where('profiles.first_name ILIKE :search OR profiles.last_name ILIKE :search', search: "%#{p[:customer]}%") if p[:customer].size > 0
|
|
@invoices = @invoices.where("date_trunc('day', invoices.created_at) = :search", search: "%#{DateTime.iso8601(p[:date]).to_time.to_date.to_s}%") unless p[:date].nil?
|
|
|
|
@invoices
|
|
|
|
end
|
|
|
|
# only for create refund invoices (avoir)
|
|
def create
|
|
authorize Invoice
|
|
invoice = Invoice.only_invoice.find(avoir_params[:invoice_id])
|
|
@avoir = invoice.build_avoir(avoir_params)
|
|
if @avoir.save
|
|
# when saved, expire the subscription if needed
|
|
if @avoir.subscription_to_expire
|
|
@avoir.expire_subscription
|
|
end
|
|
# then answer the API call
|
|
render :avoir, status: :created
|
|
else
|
|
render json: @avoir.errors, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
private
|
|
def avoir_params
|
|
params.require(:avoir).permit(:invoice_id, :avoir_date, :avoir_mode, :subscription_to_expire, :description, :invoice_items_ids => [])
|
|
end
|
|
|
|
def set_invoice
|
|
@invoice = Invoice.find(params[:id])
|
|
end
|
|
end
|