app/models/wco/invoice.rb



require 'autoinc'
require 'prawn'
require 'prawn/table'

##
## Invoice - for wasya.co
## 2017-10-31 _vp_ Start
## 2023-08-18 _vp_ Continue
##
class Wco::Invoice
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Autoinc
  include Mongoid::Paranoia
  store_in collection: 'ish_invoice'

  attr_accessor :is_stripe

  field :email, type: String

  field :invoice_id, type: String # stripe

  belongs_to :leadset, class_name: 'Wco::Leadset'

  field :number, type: Integer, default: 100

  field :month_on, type: Date

  has_one :asset, class_name: 'Wco::Asset' ## the pdf

  def filename
    "invoice-#{number}.pdf"
  end

  field :description, type: String
  field :items,       type: Array   # used by stripe

  before_validation :create_stripe, on: :create
  def create_stripe
    if is_stripe
      stripe_invoice = Stripe::Invoice.create({
        customer:          leadset.customer_id,
        collection_method: 'send_invoice',
        days_until_due:    0,
        # collection_method: 'charge_automatically',
        pending_invoice_items_behavior: 'exclude',
      })
      items.each do |item|
        stripe_price = Wco::Price.find( item[:price_id] ).price_id
        invoice_item = Stripe::InvoiceItem.create({
          customer: leadset.customer_id,
          price:    stripe_price,
          invoice:  stripe_invoice.id,
          quantity: item[:quantity],
        })
      end
      Stripe::Invoice.finalize_invoice( stripe_invoice[:id] )
      self.invoice_id = stripe_invoice[:id]
    end
  end

  ## Prawn/pdf unit of measure is 1/72"
  ## Canvas width: 612, height: 792
  ##
  ## tree image: 896 x 1159
  ## tree image: 791 x 1024
  ## tree image: 964 x 1248
  ##
  def generate_monthly_invoice
    tree_img_url      = "#{Rails.root.join('public')}/tree-#{number}.jpg"
    wasya_co_logo_url = "#{Rails.root.join('public')}/259x66-WasyaCo-logo.png"

    ## canvas width: 612, height: 792
    pdf = Prawn::Document.new

    pdf.canvas do
      pdf.image tree_img_url, at: [ 0, 792 ], width: 612

      pdf.fill_color 'ffffff'
      pdf.transparent( 0.75 ) do
        pdf.fill_rectangle [0, 792], 612, 792
      end
      pdf.fill_color '000000'

      pdf.image wasya_co_logo_url, at: [252, 720], width: 108 ## 1.5"

      pdf.bounding_box( [0.75*72, 9.25*72], width: 3.25*72, height: 0.75*72 ) do
        pdf.text "From:"
        pdf.text "Wasya Co"
        pdf.text "victor@wasya.co"
      end

      pdf.bounding_box( [4.5*72, 9.25*72], width: 3.25*72, height: 0.75*72 ) do
        pdf.text "Stats:"
        pdf.text "Date: #{ Time.now.to_date.to_s }"
        pdf.text "Invoice #: #{ number }"
      end

      pdf.bounding_box( [0.75*72, 8.25*72], width: 3.25*72, height: 0.75*72 ) do
        pdf.text "To:"
        pdf.text leadset.name
        pdf.text leadset.email
      end

      pdf.bounding_box( [4.5*72, 8.25*72], width: 3.25*72, height: 0.75*72 ) do
        pdf.text "Notes:"
        pdf.text "Support & various tasks, for the month of #{ month_on.strftime('%B') }."
      end

      lineitems_with_header = [
        [ 'Description', 'Per Unit', '# of Units', 'Subtotal' ]
      ]
      total = 0
      leadset.subscriptions.each do |i|
        subtotal = (i.price.amount_cents * i.quantity).to_f/100
        lineitems_with_header.push([ i.price.product.name, i.price.name_simple, i.quantity, subtotal ])
        total += subtotal
      end


      pdf.move_down 20
      pdf.table(lineitems_with_header, {
        position: :center,
        width: 7.5*72,
        cell_style: {
          inline_format: true,
          borders: [ :bottom ]
        },
      } )

      pdf.table([
        [ 'Total' ],
        [ total ],
      ], {
        position: 7*72,
        width: 1*72,
        cell_style: {
          inline_format: true,
          borders: [ :bottom ]
        },
      } )

      pdf.text_box "Thank you!", at: [ 3.25*72, 1.25*72 ], width: 2*72, height: 1*72, align: :center
    end

    return pdf
  end

end