spree-print-invoice 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.hound.yml +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +11 -0
  6. data/CONTRIBUTING.md +30 -0
  7. data/Gemfile +5 -0
  8. data/Guardfile +9 -0
  9. data/LICENSE.md +26 -0
  10. data/README.md +48 -0
  11. data/Rakefile +15 -0
  12. data/app/assets/javascripts/admin/spree_print_invoice.js +1 -0
  13. data/app/assets/stylesheets/admin/spree_print_invoice.css +3 -0
  14. data/app/controllers/spree/admin/orders_controller_decorator.rb +18 -0
  15. data/app/controllers/spree/admin/print_invoice_settings_controller.rb +16 -0
  16. data/app/overrides/add_print_invoice_to_admin_configuration_sidebar.rb +6 -0
  17. data/app/overrides/layouts_admin_print_buttons_decorator.rb +6 -0
  18. data/app/views/spree/admin/orders/_print_buttons.html.erb +12 -0
  19. data/app/views/spree/admin/orders/invoice.pdf.prawn +155 -0
  20. data/app/views/spree/admin/orders/packaging_slip.pdf.prawn +128 -0
  21. data/app/views/spree/admin/print_invoice_settings/edit.html.erb +90 -0
  22. data/bin/rails +7 -0
  23. data/config/locales/de.yml +37 -0
  24. data/config/locales/en.yml +37 -0
  25. data/config/locales/es.yml +37 -0
  26. data/config/locales/fr.yml +37 -0
  27. data/config/locales/sv.yml +37 -0
  28. data/config/routes.rb +11 -0
  29. data/db/migrate/20140123094547_add_invoice_details_to_spree_orders.rb +6 -0
  30. data/lib/generators/spree_print_invoice/install/install_generator.rb +19 -0
  31. data/lib/prawn_handler.rb +29 -0
  32. data/lib/spree/print_invoice_setting.rb +35 -0
  33. data/lib/spree_print_invoice.rb +13 -0
  34. data/lib/spree_print_invoice/engine.rb +29 -0
  35. data/lib/spree_print_invoice/version.rb +18 -0
  36. data/spec/features/spree/admin/print_invoice_setting_spec.rb +45 -0
  37. data/spec/features/spree/admin/print_invoice_spec.rb +60 -0
  38. data/spec/lib/prawn_handler_spec.rb +30 -0
  39. data/spec/spec_helper.rb +28 -0
  40. data/spec/support/capybara.rb +17 -0
  41. data/spec/support/databse_cleaner.rb +18 -0
  42. data/spec/support/factory_girl.rb +5 -0
  43. data/spec/support/i18n.rb +13 -0
  44. data/spec/support/matchers/have_text_like.rb +8 -0
  45. data/spec/support/spree.rb +12 -0
  46. data/spec/support/test.pdf.prawn +2 -0
  47. data/spec/translations/locale_spec.rb +15 -0
  48. data/spree_print_invoice.gemspec +47 -0
  49. metadata +398 -0
@@ -0,0 +1,90 @@
1
+ <%= render 'spree/admin/shared/configuration_menu' %>
2
+
3
+ <% content_for :page_title do %>
4
+ <%= Spree.t(:settings, scope: :print_invoice) %>
5
+ <% end %>
6
+
7
+ <%= form_tag(admin_print_invoice_settings_path, method: :put) do %>
8
+ <fieldset class="no-border-top">
9
+ <div data-hook="admin_print_invoice_method_form_fields">
10
+ <div class="row">
11
+ <div class="alpha six columns" data-hook="pdf">
12
+ <fieldset class="no-border-bottom">
13
+ <legend align="center"><%= Spree.t(:pdf_legend, scope: :print_invoice) %></legend>
14
+
15
+ <div class="field">
16
+ <%= check_box_tag('preferences[use_footer]', Spree::PrintInvoice::Config[:use_footer], type: :boolean) %>
17
+ <%= label_tag Spree.t(:use_footer, scope: [:print_invoice, :preferences]) %>
18
+ </div>
19
+
20
+ <div class="field">
21
+ <%= check_box_tag('preferences[use_page_numbers]', Spree::PrintInvoice::Config[:use_page_numbers], type: :boolean) %>
22
+ <%= label_tag Spree.t(:use_page_numbers, scope: [:print_invoice, :preferences]) %>
23
+ </div>
24
+
25
+ <div class="field">
26
+ <%= label_tag Spree.t(:print_logo_path, scope: [:print_invoice, :preferences]) %><br>
27
+ <%= text_field_tag('preferences[print_invoice_logo_path]', Spree::PrintInvoice::Config[:print_invoice_logo_path], class: 'fullwidth') %>
28
+ </div>
29
+
30
+ <div class="field">
31
+ <%= label_tag Spree.t(:print_buttons, scope: [:print_invoice, :preferences]) %><br>
32
+ <%= text_field_tag('preferences[print_buttons]', Spree::PrintInvoice::Config[:print_buttons], class: 'fullwidth') %>
33
+ <span class="info"><%= Spree.t(:print_buttons_info, scope: [:print_invoice, :preferences]) %></span>
34
+ </div>
35
+
36
+ <div class="field">
37
+ <%= label_tag Spree.t(:print_invoice_next_number, scope: [:print_invoice, :preferences]) %><br>
38
+ <%= number_field_tag('preferences[print_invoice_next_number]', Spree::PrintInvoice::Config[:print_invoice_next_number], class: 'fullwidth') %>
39
+ </div>
40
+
41
+ <div class="field">
42
+ <%= label_tag Spree.t(:page_size, scope: [:print_invoice, :preferences]) %><br>
43
+ <%= select_tag('preferences[page_size]', options_for_select(Spree::PrintInvoice::Config.page_sizes, Spree::PrintInvoice::Config[:page_size]), class: 'fullwidth select2') %>
44
+ </div>
45
+
46
+ <div class="field">
47
+ <%= label_tag Spree.t(:page_layout, scope: [:print_invoice, :preferences]) %><br>
48
+ <%= select_tag('preferences[page_layout]', options_for_select(Spree::PrintInvoice::Config.page_layouts, Spree::PrintInvoice::Config[:page_layout]), class: 'fullwidth select2') %>
49
+ </div>
50
+
51
+ </fieldset>
52
+ </div>
53
+
54
+ <div class="six columns omega" data-hook="invoice">
55
+ <fieldset class="no-border-bottom">
56
+ <legend align="center"><%= Spree.t(:invoice_slip_legend, scope: :print_invoice) %></legend>
57
+
58
+ <div class="field">
59
+ <%= label_tag Spree.t(:footer_left, scope: [:print_invoice, :preferences]) %><br>
60
+ <%= text_area_tag('preferences[footer_left]', Spree::PrintInvoice::Config[:footer_left], class: 'fullwidth') %>
61
+ <span class="info"><%= Spree.t(:footer_left_info, scope: [:print_invoice, :preferences]) %></span>
62
+ </div>
63
+
64
+ <div class="field">
65
+ <%= label_tag Spree.t(:footer_right, scope: [:print_invoice, :preferences]) %><br>
66
+ <%= text_area_tag('preferences[footer_right]', Spree::PrintInvoice::Config[:footer_right], class: 'fullwidth') %>
67
+ <span class="info"><%= Spree.t(:footer_right_info, scope: [:print_invoice, :preferences]) %></span>
68
+ </div>
69
+
70
+ <div class="field">
71
+ <%= label_tag Spree.t(:return_message, scope: [:print_invoice, :preferences]) %><br>
72
+ <%= text_area_tag('preferences[return_message]', Spree::PrintInvoice::Config[:return_message], class: 'fullwidth') %>
73
+ </div>
74
+
75
+ <div class="field">
76
+ <%= label_tag Spree.t(:anomaly_message, scope: [:print_invoice, :preferences]) %><br>
77
+ <%= text_area_tag('preferences[anomaly_message]', Spree::PrintInvoice::Config[:anomaly_message], class: 'fullwidth') %>
78
+ </div>
79
+
80
+ </fieldset>
81
+ </div>
82
+ </div>
83
+
84
+ <div class="form-buttons filter-actions actions" data-hook="buttons">
85
+ <%= button Spree.t('actions.update'), 'icon-refresh' %>
86
+ </div>
87
+
88
+ </div>
89
+ </fieldset>
90
+ <% end %>
data/bin/rails ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
4
+ ENGINE_PATH = File.expand_path('../../lib/spree_print_invoice/engine', __FILE__)
5
+
6
+ require 'rails/all'
7
+ require 'rails/engine/commands'
@@ -0,0 +1,37 @@
1
+ ---
2
+ de:
3
+ spree:
4
+ print_invoice:
5
+ buttons:
6
+ invoice: Rechnung drucken
7
+ packaging_slip: Warenbegleitschein drucken
8
+ invoice: Kundenrechnung
9
+ item_name: Item Name or SKU
10
+ of: of
11
+ via: via
12
+ on_date: Order Date
13
+ packaging_slip: Packzettel drucken
14
+ page: Page
15
+ payment_via: "%{gateway} Online Payment #%{number} on %{date}"
16
+ preferences:
17
+ print_invoice_next_number: Print Invoice Next Number
18
+ use_footer: Use Footer
19
+ use_page_numbers: Use Page Numbers
20
+ anomaly_message: Order Anomaly Message
21
+ footer_left: Left footer content
22
+ footer_left_info: E.g. Your company name and address.
23
+ footer_right: Right footer content
24
+ footer_right_info: E.g. Your phone and email address.
25
+ page_layout: Page Layout
26
+ page_size: Page Size
27
+ print_buttons: Print Buttons
28
+ print_buttons_info: Comma separated list.
29
+ print_logo_path: Print Invoice Logo Path
30
+ return_message: Order Return Message
31
+ settings: Print Invoice Settings
32
+ unprocessed: Unprocessed
33
+ vat: VAT not applicable
34
+ pdf_legend: PDF
35
+ invoice_slip_legend: Invoice / Slip
36
+ invoice_number: 'Rechnungsnummer %{number}'
37
+ invoice_date: Rechnungsdatum
@@ -0,0 +1,37 @@
1
+ ---
2
+ en:
3
+ spree:
4
+ print_invoice:
5
+ buttons:
6
+ invoice: Print Invoice
7
+ packaging_slip: Print Slip
8
+ invoice: Customer Invoice
9
+ item_name: Item Name or SKU
10
+ of: of
11
+ via: via
12
+ on_date: Order Date
13
+ packaging_slip: Packaging Slip
14
+ page: Page
15
+ payment_via: "%{gateway} Online Payment #%{number} on %{date}"
16
+ preferences:
17
+ print_invoice_next_number: Print Invoice Next Number
18
+ use_footer: Use Footer
19
+ use_page_numbers: Use Page Numbers
20
+ anomaly_message: Order Anomaly Message
21
+ footer_left: Left footer content
22
+ footer_left_info: E.g. Your company name and address.
23
+ footer_right: Right footer content
24
+ footer_right_info: E.g. Your phone and email address.
25
+ page_layout: Page Layout
26
+ page_size: Page Size
27
+ print_buttons: Print Buttons
28
+ print_buttons_info: Comma separated list.
29
+ print_logo_path: Print Invoice Logo Path
30
+ return_message: Order Return Message
31
+ settings: Print Invoice Settings
32
+ unprocessed: Unprocessed
33
+ vat: VAT not applicable
34
+ pdf_legend: PDF
35
+ invoice_slip_legend: Invoice / Slip
36
+ invoice_number: 'Invoice Number %{number}'
37
+ invoice_date: Invoice Date
@@ -0,0 +1,37 @@
1
+ ---
2
+ es:
3
+ spree:
4
+ print_invoice:
5
+ buttons:
6
+ invoice: Imprimir Factura
7
+ packaging_slip: Imprimir Recibo para el Embalaje
8
+ invoice: Factura del cliente
9
+ item_name: Item Name or SKU
10
+ of: of
11
+ via: via
12
+ on_date: Order Date
13
+ packaging_slip: Recibo para el Embalaje
14
+ page: Page
15
+ payment_via: "%{gateway} Online Payment #%{number} on %{date}"
16
+ preferences:
17
+ print_invoice_next_number: Print Invoice Next Number
18
+ use_footer: Use Footer
19
+ use_page_numbers: Use Page Numbers
20
+ anomaly_message: Order Anomaly Message
21
+ footer_left: Left footer content
22
+ footer_left_info: E.g. Your company name and address.
23
+ footer_right: Right footer content
24
+ footer_right_info: E.g. Your phone and email address.
25
+ page_layout: Page Layout
26
+ page_size: Page Size
27
+ print_buttons: Print Buttons
28
+ print_buttons_info: Comma separated list.
29
+ print_logo_path: Print Invoice Logo Path
30
+ return_message: Order Return Message
31
+ settings: Print Invoice Settings
32
+ unprocessed: Unprocessed
33
+ vat: VAT not applicable
34
+ pdf_legend: PDF
35
+ invoice_slip_legend: Invoice / Slip
36
+ invoice_number: 'Invoice Number %{number}'
37
+ invoice_date: Invoice Date
@@ -0,0 +1,37 @@
1
+ ---
2
+ fr:
3
+ spree:
4
+ print_invoice:
5
+ buttons:
6
+ invoice: Imprimer Facture
7
+ packaging_slip: Imprimer Bordereau de Livraison
8
+ invoice: Facture
9
+ item_name: Nom ou Reference Article
10
+ of: de
11
+ via: via
12
+ on_date: Date de commande
13
+ packaging_slip: Bordereau de Livraison
14
+ page: Page
15
+ payment_via: "Payé en ligne le %{date} via %{gateway} - %{number}"
16
+ preferences:
17
+ print_invoice_next_number: Imprimer la facture prochain numéro
18
+ use_footer: Utilisez le pied de page
19
+ use_page_numbers: Utilisez des numéros de page
20
+ anomaly_message: Message d'anomalie
21
+ footer_left: Contenu pied de gauche
22
+ footer_left_info: Par exemple Votre nom et adresse d'entreprise.
23
+ footer_right: Contenu pied de droit
24
+ footer_right_info: Par exemple Votre téléphone et votre adresse e-mail.
25
+ page_layout: La mise en page
26
+ page_size: Taille de la page
27
+ print_buttons: Boutons Imprimer
28
+ print_buttons_info: Séparés par des virgules.
29
+ print_logo_path: Chemin de logo
30
+ return_message: Message de retour
31
+ settings: Les paramètres d'impression des factures
32
+ unprocessed: Non traité
33
+ vat: "TVA non applicable, article 293 B du Code Général des Impôts"
34
+ pdf_legend: PDF
35
+ invoice_slip_legend: Facture / Slip
36
+ invoice_number: 'Numéro de facture %{number}'
37
+ invoice_date: Date de la facture
@@ -0,0 +1,37 @@
1
+ ---
2
+ sv:
3
+ spree:
4
+ print_invoice:
5
+ buttons:
6
+ invoice: Skriv ut faktura
7
+ packaging_slip: Skriv ut följesedel
8
+ invoice: Kundfaktura
9
+ item_name: Artikelnamn eller SKU
10
+ of: av
11
+ via: via
12
+ on_date: Order datum
13
+ packaging_slip: Följesedel
14
+ page: Sida
15
+ payment_via: "%{gateway} betalning #%{number} den %{date}"
16
+ preferences:
17
+ print_invoice_next_number: Skriv ut faktura nästa nummer
18
+ use_footer: Använd sidfot
19
+ use_page_numbers: Använd sidnummer
20
+ anomaly_message: Avvikelse meddelande
21
+ footer_left: Vänster sidfot
22
+ footer_left_info: T.ex. Ditt företagsnamn och adress.
23
+ footer_right: Höger sidfot
24
+ footer_right_info: T.ex. Din telefon och e-postadress.
25
+ page_layout: Sidolayout
26
+ page_size: Pappers format
27
+ print_buttons: Utskriftsknappar
28
+ print_buttons_info: Kommaseparerad lista.
29
+ print_logo_path: Sökväg för logotyp
30
+ return_message: Returmeddelande
31
+ settings: Utskrift inställningar
32
+ unprocessed: Obearbetad
33
+ vat: Moms inte tillämpligt
34
+ pdf_legend: PDF
35
+ invoice_slip_legend: Faktura / följesedel
36
+ invoice_number: 'Faktura Nummer %{number}'
37
+ invoice_date: Faktura Datum
data/config/routes.rb ADDED
@@ -0,0 +1,11 @@
1
+ Spree::Core::Engine.routes.append do
2
+
3
+ namespace :admin do
4
+ resources :orders do
5
+ member do
6
+ get :show
7
+ end
8
+ end
9
+ resource :print_invoice_settings, only: [:edit, :update]
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class AddInvoiceDetailsToSpreeOrders < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_orders, :invoice_number, :integer
4
+ add_column :spree_orders, :invoice_date, :date
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ module SpreePrintInvoice
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: true
5
+
6
+ def add_migrations
7
+ run 'bundle exec rake railties:install:migrations FROM=spree_print_invoice'
8
+ end
9
+
10
+ def run_migrations
11
+ if options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask "Would you like to run the migrations now? [Y/n]")
12
+ run 'bundle exec rake db:migrate'
13
+ else
14
+ puts "Skiping rake db:migrate, don't forget to run it!"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ require 'prawn'
2
+
3
+ module ActionView
4
+ module Template::Handlers
5
+ class Prawn
6
+ def self.register!
7
+ Template.register_template_handler :prawn, self
8
+ end
9
+
10
+ def self.call(template)
11
+ %(extend #{DocumentProxy}; #{template.source}; pdf.render)
12
+ end
13
+
14
+ module DocumentProxy
15
+ def pdf
16
+ @pdf ||= ::Prawn::Document.new
17
+ end
18
+
19
+ private
20
+
21
+ def method_missing(method, *args, &block)
22
+ pdf.respond_to?(method) ? pdf.send(method, *args, &block) : super
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ ActionView::Template::Handlers::Prawn.register!
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ class PrintInvoiceSetting < Preferences::Configuration
3
+ preference :print_invoice_next_number, :integer, default: nil
4
+ preference :print_invoice_logo_path, :string, default: Spree::Config[:admin_interface_logo]
5
+ preference :print_buttons, :string, default: 'invoice,packaging_slip'
6
+
7
+ preference :page_size, :string, default: 'LETTER'
8
+ preference :page_layout, :string, default: 'landscape'
9
+ preference :footer_left, :string, default: ''
10
+ preference :footer_right, :string, default: ''
11
+ preference :return_message, :text, default: ''
12
+ preference :anomaly_message, :text, default: ''
13
+
14
+ preference :use_footer, :boolean, default: false
15
+ preference :use_page_numbers, :boolean, default: false
16
+
17
+ def page_sizes
18
+ ::PDF::Core::PageGeometry::SIZES.keys
19
+ end
20
+
21
+ def page_layouts
22
+ %w(landscape portrait)
23
+ end
24
+
25
+ def use_sequential_number?
26
+ print_invoice_next_number.present? && print_invoice_next_number > 0
27
+ end
28
+
29
+ def increase_invoice_number
30
+ current_invoice_number = print_invoice_next_number
31
+ set_preference(:print_invoice_next_number, current_invoice_number + 1)
32
+ current_invoice_number
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ require 'spree_core'
2
+ require 'spree_print_invoice/engine'
3
+ require 'spree_print_invoice/version'
4
+ require 'prawn_handler'
5
+ require 'coffee_script'
6
+
7
+ module Spree
8
+ module PrintInvoice
9
+ def self.config(&block)
10
+ yield(Spree::PrintInvoice::Config)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ module SpreePrintInvoice
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_print_invoice'
6
+
7
+ config.autoload_paths += %W(#{config.root}/lib)
8
+
9
+ initializer 'spree.print_invoice.mimetypes' do |app|
10
+ Mime::Type.register('application/pdf', :pdf) unless Mime::Type.lookup_by_extension(:pdf)
11
+ end
12
+
13
+ initializer 'spree.print_invoice.environment', before: :load_config_initializers do |app|
14
+ Spree::PrintInvoice::Config = Spree::PrintInvoiceSetting.new
15
+ end
16
+
17
+ def self.activate
18
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
19
+ Rails.configuration.cache_classes ? require(c) : load(c)
20
+ end
21
+
22
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/overrides/*.rb')) do |c|
23
+ Rails.configuration.cache_classes ? require(c) : load(c)
24
+ end
25
+ end
26
+
27
+ config.to_prepare &method(:activate).to_proc
28
+ end
29
+ end