diff --git a/app/controllers/eis_billing/invoices_controller.rb b/app/controllers/eis_billing/invoices_controller.rb index fb9ee04d1..81ff9b988 100644 --- a/app/controllers/eis_billing/invoices_controller.rb +++ b/app/controllers/eis_billing/invoices_controller.rb @@ -9,8 +9,9 @@ module EisBilling before_action :load_invoice, only: :update def update - if @invoice.update(modified_params) && payment_orders_handler - + # if @invoice.update(modified_params) && payment_orders_handler + state = InvoiceStateMachine.new(invoice: @invoice, status: params[:status]) + if @invoice.update(modified_params) && state.call render json: { message: 'Invoice data was successfully updated', }, status: :ok @@ -25,41 +26,41 @@ module EisBilling private - def payment_orders_handler - return false if @invoice.cancelled? && status.paid? || @invoice.cancelled? && status.issued? - return false if @invoice.paid? && (status.failed? || status.cancelled?) + # def payment_orders_handler + # return false if @invoice.cancelled? && status.paid? || @invoice.cancelled? && status.issued? + # return false if @invoice.paid? && (status.failed? || status.cancelled?) - case - when @invoice.paid? && status.paid? - true - when @invoice.unpaid? && status.issued? - true - when @invoice.cancelled? && (status.cancelled? || status.failed?) - true - when status.issued? - @invoice.cancel_manualy - when status.paid? - @invoice.autobind_manually - else - @invoice.cancel - end - end + # case + # when @invoice.paid? && status.paid? + # true + # when @invoice.unpaid? && status.issued? + # true + # when @invoice.cancelled? && (status.cancelled? || status.failed?) + # true + # when status.issued? + # @invoice.cancel_manualy + # when status.paid? + # @invoice.autobind_manually + # else + # @invoice.cancel + # end + # end - def status - status = case params[:status] - when 'paid' - 'paid' - when 'cancelled' - 'cancelled' - when 'failed' - 'failed' - else - 'unpaid' - end + # def status + # status = case params[:status] + # when 'paid' + # 'paid' + # when 'cancelled' + # 'cancelled' + # when 'failed' + # 'failed' + # else + # 'unpaid' + # end - Struct.new(:paid?, :cancelled?, :issued?, :failed?) - .new(status == PAID, status == CANCELLED, status == ISSUED, status == FAILED) - end + # Struct.new(:paid?, :cancelled?, :issued?, :failed?) + # .new(status == PAID, status == CANCELLED, status == ISSUED, status == FAILED) + # end def load_invoice @invoice = Invoice.find_by(number: params[:invoice][:invoice_number]) diff --git a/app/models/invoice_state_machine.rb b/app/models/invoice_state_machine.rb new file mode 100644 index 000000000..051925d71 --- /dev/null +++ b/app/models/invoice_state_machine.rb @@ -0,0 +1,44 @@ +# enum status: %i[unpaid paid cancelled failed] + +class InvoiceStateMachine + attr_reader :invoice, :status + + def initialize(invoice:, status:) + @invoice = invoice + @status = status.to_sym + end + + def call + case status + when :paid + mark_as_paid + when :cancelled + mark_as_cancel + when :unpaid + mark_as_unpaid + else + raise "Inavalid state #{invoice.status}" + end + end + + private + + def mark_as_paid + raise "Inavalid state #{invoice.status}" unless invoice.unpaid? || invoice.paid? + + invoice.autobind_manually + end + + def mark_as_cancel + # Paid invoice cannot be cancelled? + raise "Inavalid state #{invoice.status}" unless invoice.cancellable? || invoice.cancelled? + + invoice.cancel + end + + def mark_as_unpaid + raise "Inavalid state #{invoice.status}" unless invoice.paid? && invoice.payment_orders.present? || invoice.unpaid? + + invoice.cancel_manualy + end +end diff --git a/app/models/payment_orders/every_pay.rb b/app/models/payment_orders/every_pay.rb index 2695c20e0..15526e4d7 100644 --- a/app/models/payment_orders/every_pay.rb +++ b/app/models/payment_orders/every_pay.rb @@ -30,6 +30,10 @@ module PaymentOrders valid_hmac? && valid_amount? && valid_account? end + def payment_reference? + response['payment_reference'].present? + end + def settled_payment? SUCCESSFUL_PAYMENT.include?(response['payment_state']) end