enable actions for multi (group) orders and ordergroup invoices
This commit is contained in:
parent
f676497e43
commit
e902aa0d5a
44 changed files with 550 additions and 324 deletions
|
|
@ -7,6 +7,14 @@ module Concerns::SendGroupOrderInvoicePdf
|
|||
invoice_data = group_order_invoice.load_data_for_invoice
|
||||
invoice_data[:title] = t('documents.group_order_invoice_pdf.title', supplier: invoice_data[:supplier])
|
||||
invoice_data[:no_footer] = true
|
||||
puts "
|
||||
" + "____________" + "
|
||||
" + "____________" + "
|
||||
" + "____________" + "
|
||||
" + "#{invoice_data.inspect}" + "
|
||||
" + "____________"+ "
|
||||
" + "____________"+ "
|
||||
" + "____________"
|
||||
GroupOrderInvoicePdf.new invoice_data
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,14 @@
|
|||
class Finance::BalancingController < Finance::BaseController
|
||||
def index
|
||||
@multi_orders = MultiOrder.includes(:orders, :group_orders).page(params[:page]).per(@per_page).order('ends DESC')
|
||||
@orders = Order.finished.non_multi_order.page(params[:page]).per(@per_page).order('ends DESC')
|
||||
page = params[:page].to_i
|
||||
page = 1 if page < 1
|
||||
per_page = @per_page.to_i
|
||||
offset = (page - 1) * per_page
|
||||
|
||||
multi_orders = MultiOrder.includes(:orders, :group_orders).page(params[:page]).per(@per_page).order('ends DESC')
|
||||
orders = Order.finished.non_multi_order.page(params[:page]).per(@per_page).order('ends DESC')
|
||||
combined = (multi_orders + orders).sort_by { |r| r.ends }.reverse
|
||||
@results = Kaminari.paginate_array(combined).page(params[:page]).per(@per_page)
|
||||
end
|
||||
|
||||
def new
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ class GroupOrderInvoicesController < ApplicationController
|
|||
gos.each do |go|
|
||||
goi = GroupOrderInvoice.find_or_create_by!(group_order_id: go.id)
|
||||
goi.invoice_date = invoice_date
|
||||
goi.invoice_number = goi.generate_invoice_number(GroupOrderInvoice, 1)
|
||||
goi.invoice_number = goi.generate_invoice_number(goi, 1)
|
||||
goi.save!
|
||||
end
|
||||
respond_to do |format|
|
||||
|
|
|
|||
|
|
@ -1,21 +1,42 @@
|
|||
class MultiOrdersController < ApplicationController
|
||||
include SepaHelper
|
||||
|
||||
before_action :set_multi_order, only: [:generate_ordergroup_invoices]
|
||||
|
||||
def create
|
||||
orders = Order.where(id: multi_order_params[:order_ids_for_multi_order])
|
||||
|
||||
unclosed_orders = orders.select { |order| order.closed? == false }
|
||||
multi_orders = orders.select { |order| order.multi_order_id.present? }
|
||||
invoiced_orders = orders.select {|order| order.group_orders.map(&:group_order_invoice).compact.present? }
|
||||
|
||||
if multi_order_params[:multi_order_ids_for_multi_multi_order].present?
|
||||
#TODO: do the i18n and add a test
|
||||
flash[:alert] = "Du kannst keine Multi-Bestellungen in eine Multi-Multi-Bestellung umwandeln."
|
||||
redirect_to finance_order_index_path
|
||||
msg = "Du kannst keine Multi-Bestellungen in eine Multi-Multi-Bestellung umwandeln."
|
||||
flash[:alert] = msg
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.html { redirect_to finance_order_index_path }
|
||||
end
|
||||
return
|
||||
end
|
||||
if multi_orders.any? || unclosed_orders.any?
|
||||
#TODO: do the i18n and add a test
|
||||
flash[:alert] = "Die Bestellung ist noch nicht abgeschlossen oder ist bereits Teil einer Multi-Bestellung."
|
||||
redirect_to finance_order_index_path
|
||||
msg = "Die Bestellung ist bereits Teil einer Multi-Bestellung oder ist noch nicht abgeschlossen."
|
||||
flash[:alert] = msg
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.html { redirect_to finance_order_index_path }
|
||||
end
|
||||
return
|
||||
end
|
||||
if invoiced_orders.any?
|
||||
msg = "Zusammenführen nicht möglich. Es gibt bereits Rechnungen für einige der Bestellgruppen."
|
||||
flash[:alert] = msg
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.html { redirect_to finance_order_index_path }
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
|
|
@ -24,15 +45,6 @@ class MultiOrdersController < ApplicationController
|
|||
@multi_order.orders = orders
|
||||
@multi_order.ends = orders.map(&:ends).max
|
||||
@multi_order.save!
|
||||
puts "
|
||||
" + "______________" + "
|
||||
" + "______________" + "
|
||||
" + "______________" + "
|
||||
" + "#{@multi_order.errors.inspect}" + "
|
||||
" + "______________"+ "
|
||||
" + "______________"+ "
|
||||
" + "______________"
|
||||
|
||||
#create multi group orders
|
||||
all_group_orders = orders.flat_map(&:group_orders)
|
||||
|
||||
|
|
@ -42,7 +54,6 @@ class MultiOrdersController < ApplicationController
|
|||
multi_group_order = MultiGroupOrder.create!(
|
||||
multi_order: @multi_order, group_orders: group_orders
|
||||
)
|
||||
|
||||
# Now, associate each group_order with the new multi_group_order
|
||||
group_orders.each do |group_order|
|
||||
group_order.update!(multi_group_order: multi_group_order)
|
||||
|
|
@ -51,9 +62,19 @@ class MultiOrdersController < ApplicationController
|
|||
redirect_to finance_order_index_path
|
||||
rescue ActiveRecord::RecordInvalid => e
|
||||
flash[:alert] = t('errors.general_msg', msg: e.message)
|
||||
redirect_to finance_order_index_path
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.html { redirect_to finance_order_index_path }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
@multi_order = MultiOrder.find(params[:id])
|
||||
@multi_order.destroy
|
||||
respond_to do |format|
|
||||
format.html { redirect_to finance_order_index_path }
|
||||
end
|
||||
end
|
||||
|
||||
def generate_ordergroup_invoices
|
||||
|
|
@ -65,6 +86,77 @@ class MultiOrdersController < ApplicationController
|
|||
redirect_to finance_order_index_path, alert: t('errors.general_msg', msg: e.message)
|
||||
end
|
||||
|
||||
def collective_direct_debit
|
||||
if foodsoft_sepa_ready?
|
||||
case params[:mode]
|
||||
when 'all'
|
||||
multi_group_orders = MultiGroupOrder.where(multi_order_id: params[:id])
|
||||
when 'selected'
|
||||
#TODO: !!! params and javascript
|
||||
multi_group_orders = MultiGroupOrder.where(id: params[:multi_group_order_ids])
|
||||
else
|
||||
redirect_to finance_order_index_path, alert: I18n.t('orders.collective_direct_debit.alert', ordergroup_names: '')
|
||||
end
|
||||
|
||||
@multi_order = MultiOrder.find(params[:id])
|
||||
ordergroups = multi_group_orders.flat_map(&:group_orders).map(&:ordergroup)
|
||||
|
||||
export_allowed = !ordergroups.map(&:sepa_possible?).include?(false) && !multi_group_orders.map { |go| go.ordergroup_invoice.present? }.include?(false)
|
||||
group_order_ids = multi_group_orders.map { |mgo| mgo.id if mgo.ordergroup_invoice.present? }
|
||||
|
||||
sepa_possible_ordergroup_names = ordergroups.map { |ordergroup| ordergroup.name if ordergroup.sepa_possible? }.compact_blank
|
||||
sepa_not_possible_ordergroup_names = ordergroups.map(&:name) - sepa_possible_ordergroup_names
|
||||
|
||||
if export_allowed && multi_group_orders.present?
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
collective_debit = OrderCollectiveDirectDebitXml.new(multi_group_orders)
|
||||
send_data collective_debit.xml_string, filename: @order.name + '_Sammellastschrift' + '.xml', type: 'text/xml'
|
||||
multi_group_orders.map(&:ordergroup_invoice).each(&:mark_sepa_downloaded)
|
||||
rescue SEPA::Error => e
|
||||
multi_group_orders.map(&:ordergroup_invoice).each(&:unmark_sepa_downloaded)
|
||||
redirect_to finance_order_index_path, alert: e.message
|
||||
rescue StandardError => e
|
||||
multi_group_orders.map(&:ordergroup_invoice).each(&:unmark_sepa_downloaded)
|
||||
redirect_to finance_order_index_path, alert: I18n.t('orders.collective_direct_debit.alert', ordergroup_names: sepa_not_possible_ordergroup_names.join(', '), error: e.message)
|
||||
end
|
||||
format.xml do
|
||||
multi_group_orders.map(&:ordergroup_invoice).each(&:mark_sepa_downloaded)
|
||||
collective_debit = OrderCollectiveDirectDebitXml.new(multi_group_orders)
|
||||
send_data collective_debit.xml_string, filename: @multi_order.orders.first.name + '_Sammellastschrift' + '.xml', type: 'text/xml'
|
||||
rescue SEPA::Error => e
|
||||
multi_group_orders.map(&:ordergroup_invoice).each(&:unmark_sepa_downloaded)
|
||||
render json: { error: e.message }
|
||||
rescue StandardError => e
|
||||
multi_group_orders.map(&:ordergroup_invoice).each(&:unmark_sepa_downloaded)
|
||||
render json: { error: I18n.t('orders.collective_direct_debit.alert', ordergroup_names: sepa_not_possible_ordergroup_names.join(', '), error: e.message) }
|
||||
end
|
||||
format.js
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
redirect_to finance_order_index_path, alert: I18n.t('orders.collective_direct_debit.alert', ordergroup_names: sepa_not_possible_ordergroup_names.join(', '), error: '')
|
||||
end
|
||||
format.xml do
|
||||
render json: { error: I18n.t('orders.collective_direct_debit.alert', ordergroup_names: sepa_not_possible_ordergroup_names.join(', '), error: '') }
|
||||
end
|
||||
format.js
|
||||
end
|
||||
end
|
||||
else
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
redirect_to finance_order_index_path, alert: "Wichtige SEPA Konfiguration in Administration >> Einstellungen >> Finanzen nicht gesetzt!"
|
||||
end
|
||||
format.xml do
|
||||
redirect_to finance_order_index_path, alert: "Wichtige SEPA Konfiguration in Administration >> Einstellungen >> Finanzen nicht gesetzt!"
|
||||
end
|
||||
format.js
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_multi_order
|
||||
|
|
@ -72,6 +164,6 @@ class MultiOrdersController < ApplicationController
|
|||
end
|
||||
|
||||
def multi_order_params
|
||||
params.permit(:id, order_ids_for_multi_order: [], multi_order_ids_for_multi_multi_order: [])
|
||||
params.permit(:id, :foodcoop, order_ids_for_multi_order: [], multi_order_ids_for_multi_multi_order: [])
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
class OrdergroupInvoicesController < ApplicationController
|
||||
include Concerns::SendGroupOrderInvoicePdf
|
||||
before_action :authenticate_finance
|
||||
|
|
@ -27,9 +28,11 @@ class OrdergroupInvoicesController < ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
gos = GroupOrder.where(id: params[:group_order_ids])
|
||||
mgo = MultiGroupOrder.find(params[:multi_group_order_id])
|
||||
@multi_order = mgo.multi_order
|
||||
begin
|
||||
OrdergroupInvoice.create!(group_order_ids: gos)
|
||||
|
||||
OrdergroupInvoice.create(multi_group_order_id: mgo.id)
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
|
|
@ -38,19 +41,139 @@ class OrdergroupInvoicesController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
oi = OrdergroupInvoice.find(params[:id])
|
||||
@multi_order = oi.multi_group_order.multi_order
|
||||
oi.destroy
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.json { head :no_content }
|
||||
end
|
||||
end
|
||||
|
||||
def create_multiple
|
||||
invoice_date = params[:ordergroup_invoce][:invoice_date]
|
||||
multi_order_id = params[:ordergroup_invoce][:multi_order_id]
|
||||
invoice_date = params[:ordergroup_invoice][:invoice_date]
|
||||
multi_order_id = params[:ordergroup_invoice][:multi_order_id]
|
||||
@multi_order = MultiOrder.find(multi_order_id)
|
||||
multi_group_orders = MultiGroupOrder.where("multi_order_id = ?", multi_order_id)
|
||||
mutli_group_orders.each do |multi_group_order|
|
||||
multi_group_orders.each do |multi_group_order|
|
||||
ordergroup_invoice = OrdergroupInvoice.find_or_create_by!(multi_group_order: multi_group_order)
|
||||
ordergroup_invoice.invoice_date = invoice_date
|
||||
ordergroup_invoice.invoice_number = ordergroup_invoice.generate_invoice_number(OrdergroupInvoice, 1)
|
||||
ordergroup_invoice.invoice_number = ordergroup_invoice.generate_invoice_number(ordergroup_invoice, 1)
|
||||
ordergroup_invoice.save!
|
||||
end
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def select_sepa_sequence_type
|
||||
@ordergroup_invoice = OrdergroupInvoice.find(params[:id])
|
||||
@multi_group_order = @ordergroup_invoice.multi_group_order
|
||||
return unless params[:sepa_sequence_type]
|
||||
|
||||
respond_to do |format|
|
||||
@ordergroup_invoice.sepa_sequence_type = params[:sepa_sequence_type]
|
||||
if @ordergroup_invoice.save!
|
||||
format.js
|
||||
else
|
||||
format.json { render json: @ordergroup_invoice.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def select_all_sepa_sequence_type
|
||||
@multi_order= MultiOrder.find(params[:multi_order_id])
|
||||
@ordergroup_invoices = @multi_order.multi_group_orders.map(&:ordergroup_invoice).compact
|
||||
return unless params[:sepa_sequence_type]
|
||||
@sepa_sequence_type = params[:sepa_sequence_type]
|
||||
@ordergroup_invoices.each do |oi|
|
||||
oi.sepa_sequence_type = params[:sepa_sequence_type]
|
||||
oi.save!
|
||||
end
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
def toggle_paid
|
||||
@ordergroup_invoice = OrdergroupInvoice.find(params[:id])
|
||||
respond_to do |format|
|
||||
@ordergroup_invoice.paid = !@ordergroup_invoice.paid
|
||||
if @ordergroup_invoice.save!
|
||||
format.js
|
||||
else
|
||||
format.json { render json: @ordergroup_invoice.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def toggle_sepa_downloaded
|
||||
@ordergroup_invoice = OrdergroupInvoice.find(params[:id])
|
||||
@multi_order= @ordergroup_invoice.multi_group_order.multi_order
|
||||
respond_to do |format|
|
||||
@ordergroup_invoice.sepa_downloaded = !@ordergroup_invoice.sepa_downloaded
|
||||
if @ordergroup_invoice.save!
|
||||
format.js
|
||||
else
|
||||
format.json { render json: @ordergroup_invoice.errors, status: :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def toggle_all_paid
|
||||
@multi_order= MultiOrder.find(params[:multi_order_id])
|
||||
@ordergroup_invoices = @multi_order.multi_group_orders.map(&:ordergroup_invoice).compact
|
||||
@ordergroup_invoices.each do |oi|
|
||||
oi.paid = !ActiveRecord::Type::Boolean.new.deserialize(params[:paid])
|
||||
oi.save!
|
||||
end
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
def toggle_all_sepa_downloaded
|
||||
@multi_order= MultiOrder.find(params[:multi_order_id])
|
||||
@ordergroup_invoices = @multi_order.multi_group_orders.map(&:ordergroup_invoice).compact
|
||||
@ordergroup_invoices.each do |goi|
|
||||
goi.sepa_downloaded = !ActiveRecord::Type::Boolean.new.deserialize(params[:sepa_downloaded])
|
||||
goi.save!
|
||||
end
|
||||
respond_to do |format|
|
||||
format.js
|
||||
end
|
||||
end
|
||||
|
||||
def download_all
|
||||
multi_order = MultiOrder.find(params[:multi_order_id])
|
||||
|
||||
invoices = multi_order.multi_group_orders.map(&:ordergroup_invoice)
|
||||
pdf = {}
|
||||
file_paths = []
|
||||
temp_file = Tempfile.new("all_invoices_for_multi_order_#{multi_order.id}.zip")
|
||||
Zip::File.open(temp_file.path, Zip::File::CREATE) do |zipfile|
|
||||
invoices.each do |invoice|
|
||||
pdf = create_invoice_pdf(invoice)
|
||||
file_path = File.join("tmp", pdf.filename)
|
||||
File.open(file_path, 'w:ASCII-8BIT') do |file|
|
||||
file.write(pdf.to_pdf)
|
||||
end
|
||||
file_paths << file_path
|
||||
zipfile.add(pdf.filename, file_path) unless zipfile.find_entry(pdf.filename)
|
||||
end
|
||||
end
|
||||
|
||||
zip_data = File.read(temp_file.path)
|
||||
file_paths.each do |file_path|
|
||||
File.delete(file_path)
|
||||
end
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
send_data(zip_data, type: 'application/zip', filename: "#{l multi_order.ends, format: :file}-#{multi_order.orders.first.supplier.name}-#{multi_order.id}.zip", disposition: 'attachment')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue