mirror of
https://github.com/ubicloud/ubicloud.git
synced 2025-10-04 05:42:15 +08:00
Customers want to add additional notes to their invoices for various reasons, such as providing PO numbers, special instructions, or personalized messages.
76 lines
2.3 KiB
Ruby
76 lines
2.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative "../model"
|
|
require "stripe"
|
|
require "countries"
|
|
require "excon"
|
|
|
|
class BillingInfo < Sequel::Model
|
|
one_to_many :payment_methods, order: Sequel.desc(:created_at)
|
|
one_to_one :project
|
|
|
|
plugin ResourceMethods, etc_type: true
|
|
|
|
def stripe_data
|
|
if (Stripe.api_key = Config.stripe_secret_key)
|
|
@stripe_data ||= begin
|
|
data = Stripe::Customer.retrieve(stripe_id)
|
|
return nil unless data
|
|
address = data["address"] || {}
|
|
metadata = data["metadata"] || {}
|
|
{
|
|
"name" => data["name"],
|
|
"email" => data["email"],
|
|
"address" => [address["line1"], address["line2"]].compact.join(" "),
|
|
"country" => address["country"],
|
|
"city" => address["city"],
|
|
"state" => address["state"],
|
|
"postal_code" => address["postal_code"],
|
|
"tax_id" => metadata["tax_id"],
|
|
"company_name" => metadata["company_name"],
|
|
"note" => metadata["note"]
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
def has_address?
|
|
!stripe_data&.[]("address").to_s.empty?
|
|
end
|
|
|
|
def country
|
|
ISO3166::Country.new(stripe_data["country"])
|
|
end
|
|
|
|
def after_destroy
|
|
if (Stripe.api_key = Config.stripe_secret_key)
|
|
Stripe::Customer.delete(stripe_id)
|
|
end
|
|
super
|
|
end
|
|
|
|
def validate_vat
|
|
response = Excon.get("https://ec.europa.eu/taxation_customs/vies/rest-api/ms/#{stripe_data["country"]}/vat/#{stripe_data["tax_id"]}", expects: 200)
|
|
case (status = JSON.parse(response.body)["userError"])
|
|
when "VALID"
|
|
true
|
|
when "INVALID", "INVALID_INPUT"
|
|
false
|
|
else
|
|
fail "Unexpected response from VAT service: #{status}"
|
|
end
|
|
end
|
|
end
|
|
|
|
# Table: billing_info
|
|
# Columns:
|
|
# id | uuid | PRIMARY KEY
|
|
# stripe_id | text | NOT NULL
|
|
# created_at | timestamp with time zone | NOT NULL DEFAULT now()
|
|
# valid_vat | boolean |
|
|
# Indexes:
|
|
# billing_info_pkey | PRIMARY KEY btree (id)
|
|
# billing_info_stripe_id_key | UNIQUE btree (stripe_id)
|
|
# Referenced By:
|
|
# payment_method | payment_method_billing_info_id_fkey | (billing_info_id) REFERENCES billing_info(id)
|
|
# project | project_billing_info_id_fkey | (billing_info_id) REFERENCES billing_info(id)
|