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