added state machine for invoice

This commit is contained in:
olegphenomenon 2023-02-07 11:05:40 +02:00
parent c9ed31771b
commit a4bf967e1d
3 changed files with 83 additions and 34 deletions

View file

@ -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

View file

@ -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