164 lines
6.7 KiB
Ruby
164 lines
6.7 KiB
Ruby
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
|
|
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
|
|
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
|
|
begin
|
|
@multi_order = MultiOrder.new
|
|
@multi_order.orders = orders
|
|
@multi_order.ends = orders.map(&:ends).max
|
|
@multi_order.save!
|
|
suppliers = orders.map(&:supplier).map(&:name).join(', ')
|
|
msg = "Multi Bestellung für #{suppliers} erstellt"
|
|
respond_to do |format|
|
|
flash[:notice] = msg
|
|
format.js
|
|
format.html { redirect_to finance_order_index_path }
|
|
end
|
|
rescue ActiveRecord::RecordInvalid => e
|
|
flash[:alert] = t('errors.general_msg', msg: e.message)
|
|
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])
|
|
if @multi_order.ordergroup_invoices.any?
|
|
flash[:alert]= "Lösche erst die Rechnungen"
|
|
redirect_to finance_order_index_path
|
|
else
|
|
@multi_order.destroy
|
|
redirect_to finance_order_index_path
|
|
|
|
end
|
|
end
|
|
|
|
def generate_ordergroup_invoices
|
|
@multi_order.group_orders.group_by(&:ordergroup_id).each do |_, group_orders|
|
|
OrdergroupInvoice.create!(group_orders: group_orders)
|
|
end
|
|
redirect_to finance_order_index_path, notice: t('finance.balancing.close.notice')
|
|
rescue StandardError => e
|
|
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.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
|
|
@multi_order = MultiOrder.find(params[:id])
|
|
end
|
|
|
|
def multi_order_params
|
|
params.permit(:id, :foodcoop, order_ids_for_multi_order: [], multi_order_ids_for_multi_multi_order: [])
|
|
end
|
|
end
|