diff --git a/app/controllers/admin/invoices_controller.rb b/app/controllers/admin/invoices_controller.rb index ce368742c..39d4e805c 100644 --- a/app/controllers/admin/invoices_controller.rb +++ b/app/controllers/admin/invoices_controller.rb @@ -1,6 +1,8 @@ class Admin::InvoicesController < AdminController load_and_authorize_resource + before_action :set_invoice, only: [:forward, :download_pdf] + def new @deposit = Deposit.new end @@ -39,9 +41,33 @@ class Admin::InvoicesController < AdminController end end + def forward + @invoice.billing_email = @invoice.buyer.billing_email + + return unless request.post? + + @invoice.billing_email = params[:invoice][:billing_email] + + if @invoice.forward(render_to_string('registrar/invoices/pdf', layout: false)) + flash[:notice] = t(:invoice_forwared) + redirect_to([:admin, @invoice]) + else + flash.now[:alert] = t(:failed_to_forward_invoice) + end + end + + def download_pdf + pdf = @invoice.pdf(render_to_string('registrar/invoices/pdf', layout: false)) + send_data pdf, filename: @invoice.pdf_name + end + private def deposit_params params.require(:deposit).permit(:amount, :description, :registrar_id) end + + def set_invoice + @invoice = Invoice.find(params[:invoice_id]) + end end diff --git a/app/models/invoice.rb b/app/models/invoice.rb index 271e37f2f..f55851849 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -7,7 +7,9 @@ class Invoice < ActiveRecord::Base accepts_nested_attributes_for :invoice_items - scope :unbinded, -> { where('id NOT IN (SELECT invoice_id FROM account_activities)') } + scope :unbinded, lambda { + where('id NOT IN (SELECT invoice_id FROM account_activities where invoice_id IS NOT NULL)') + } attr_accessor :billing_email validates :billing_email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i }, allow_blank: true @@ -36,7 +38,7 @@ class Invoice < ActiveRecord::Base class << self def cancel_overdue_invoices - logger.info "#{Time.zone.now.utc} - Cancelling overdue invoices\n" + STDOUT << "#{Time.zone.now.utc} - Cancelling overdue invoices\n" unless Rails.env.test? cr_at = Time.zone.now - Setting.days_to_keep_overdue_invoices_active.days invoices = Invoice.unbinded.where( @@ -45,7 +47,7 @@ class Invoice < ActiveRecord::Base count = invoices.update_all(cancelled_at: Time.zone.now) - logger.info "#{Time.zone.now.utc} - Successfully cancelled #{count} overdue invoices\n" + STDOUT << "#{Time.zone.now.utc} - Successfully cancelled #{count} overdue invoices\n" unless Rails.env.test? end end diff --git a/app/views/admin/invoices/forward.haml b/app/views/admin/invoices/forward.haml new file mode 100644 index 000000000..25f59d3ad --- /dev/null +++ b/app/views/admin/invoices/forward.haml @@ -0,0 +1,15 @@ +- content_for :actions do + = link_to(t(:back_to_invoice), admin_invoice_path(@invoice), class: 'btn btn-default') += render 'shared/title', name: t(:forward_invoice) + += form_for([:admin, @invoice], url: { action: :forward }, method: :post) do |f| + .row + .col-md-4.col-md-offset-4 + = render 'shared/full_errors', object: @invoice + .form-group + = f.label :billing_email + = f.text_field :billing_email, class: 'form-control', autocomplete: 'off' + + .row + .col-md-12.text-right + = button_tag(t(:forward), class: 'btn btn-warning') diff --git a/app/views/admin/invoices/show.haml b/app/views/admin/invoices/show.haml index c96cbb583..1d8480da4 100644 --- a/app/views/admin/invoices/show.haml +++ b/app/views/admin/invoices/show.haml @@ -4,6 +4,8 @@ = @invoice .col-sm-6 %h1.text-right.text-center-xs + = link_to(t(:download), admin_invoice_download_pdf_path(@invoice), class: 'btn btn-default') + = link_to(t(:forward), admin_invoice_forward_path(@invoice), class: 'btn btn-default') - if !@invoice.cancelled? && !@invoice.binded? = link_to(t(:cancel), cancel_admin_invoice_path(@invoice), method: :patch, class: 'btn btn-warning') = link_to(t(:back), admin_invoices_path, class: 'btn btn-default') diff --git a/config/routes.rb b/config/routes.rb index 96cddbdf2..bb1828c36 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -176,7 +176,9 @@ Rails.application.routes.draw do end resources :invoices do + get 'download_pdf' patch 'cancel', on: :member + match 'forward', via: [:post, :get] end resources :domains do diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index 9859d8a1d..d835c73c7 100644 --- a/db/schema-read-only.rb +++ b/db/schema-read-only.rb @@ -936,14 +936,14 @@ ActiveRecord::Schema.define(version: 20150713113436) do end create_table "que_jobs", id: false, force: :cascade do |t| - t.integer "priority", limit: 2, default: 100, null: false - t.datetime "run_at", default: '2015-06-30 14:16:50', null: false - t.integer "job_id", limit: 8, default: 0, null: false - t.text "job_class", null: false - t.json "args", default: [], null: false - t.integer "error_count", default: 0, null: false + t.integer "priority", limit: 2, default: 100, null: false + t.datetime "run_at", default: "now()", null: false + t.integer "job_id", limit: 8, default: "nextval('que_jobs_job_id_seq'::regclass)", null: false + t.text "job_class", null: false + t.json "args", default: [], null: false + t.integer "error_count", default: 0, null: false t.text "last_error" - t.text "queue", default: "", null: false + t.text "queue", default: "", null: false end create_table "registrant_verifications", force: :cascade do |t| diff --git a/db/structure.sql b/db/structure.sql index f16eada5e..dd524fc00 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2421,8 +2421,8 @@ ALTER SEQUENCE pricelists_id_seq OWNED BY pricelists.id; CREATE TABLE que_jobs ( priority smallint DEFAULT 100 NOT NULL, - run_at timestamp without time zone DEFAULT '2015-06-30 14:16:50.905537'::timestamp without time zone NOT NULL, - job_id bigint DEFAULT 0 NOT NULL, + run_at timestamp with time zone DEFAULT now() NOT NULL, + job_id bigint NOT NULL, job_class text NOT NULL, args json DEFAULT '[]'::json NOT NULL, error_count integer DEFAULT 0 NOT NULL, @@ -2431,6 +2431,32 @@ CREATE TABLE que_jobs ( ); +-- +-- Name: TABLE que_jobs; Type: COMMENT; Schema: public; Owner: - +-- + +COMMENT ON TABLE que_jobs IS '3'; + + +-- +-- Name: que_jobs_job_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE que_jobs_job_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: que_jobs_job_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE que_jobs_job_id_seq OWNED BY que_jobs.job_id; + + -- -- Name: registrant_verifications; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -3186,6 +3212,13 @@ ALTER TABLE ONLY people ALTER COLUMN id SET DEFAULT nextval('people_id_seq'::reg ALTER TABLE ONLY pricelists ALTER COLUMN id SET DEFAULT nextval('pricelists_id_seq'::regclass); +-- +-- Name: job_id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY que_jobs ALTER COLUMN job_id SET DEFAULT nextval('que_jobs_job_id_seq'::regclass); + + -- -- Name: id; Type: DEFAULT; Schema: public; Owner: - -- @@ -3705,6 +3738,14 @@ ALTER TABLE ONLY pricelists ADD CONSTRAINT pricelists_pkey PRIMARY KEY (id); +-- +-- Name: que_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY que_jobs + ADD CONSTRAINT que_jobs_pkey PRIMARY KEY (queue, priority, run_at, job_id); + + -- -- Name: registrant_verifications_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -4809,14 +4850,26 @@ INSERT INTO schema_migrations (version) VALUES ('20150520164507'); INSERT INTO schema_migrations (version) VALUES ('20150521120145'); +INSERT INTO schema_migrations (version) VALUES ('20150522164020'); + +INSERT INTO schema_migrations (version) VALUES ('20150525075550'); + +INSERT INTO schema_migrations (version) VALUES ('20150601083516'); + +INSERT INTO schema_migrations (version) VALUES ('20150601083800'); + INSERT INTO schema_migrations (version) VALUES ('20150603141549'); INSERT INTO schema_migrations (version) VALUES ('20150603211318'); INSERT INTO schema_migrations (version) VALUES ('20150603212659'); +INSERT INTO schema_migrations (version) VALUES ('20150609093515'); + INSERT INTO schema_migrations (version) VALUES ('20150609103333'); +INSERT INTO schema_migrations (version) VALUES ('20150610111019'); + INSERT INTO schema_migrations (version) VALUES ('20150610112238'); INSERT INTO schema_migrations (version) VALUES ('20150610144547'); @@ -4825,8 +4878,12 @@ INSERT INTO schema_migrations (version) VALUES ('20150611124920'); INSERT INTO schema_migrations (version) VALUES ('20150612123111'); +INSERT INTO schema_migrations (version) VALUES ('20150612125720'); + INSERT INTO schema_migrations (version) VALUES ('20150701074344'); +INSERT INTO schema_migrations (version) VALUES ('20150703084206'); + INSERT INTO schema_migrations (version) VALUES ('20150703084632'); INSERT INTO schema_migrations (version) VALUES ('20150706091724'); diff --git a/spec/features/admin/invoice_spec.rb b/spec/features/admin/invoice_spec.rb index 4e3747373..91e29afab 100644 --- a/spec/features/admin/invoice_spec.rb +++ b/spec/features/admin/invoice_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' feature 'Invoice', type: :feature do before :all do @user = Fabricate(:admin_user) - Fabricate(:invoice) + @invoice = Fabricate(:invoice) end before do @@ -12,15 +12,13 @@ feature 'Invoice', type: :feature do it 'should show index of invoices' do visit admin_invoices_url - i = Invoice.first - page.should have_link("Invoice no. #{i.id}") + page.should have_link("Invoice no. #{@invoice.id}") end it 'should show invoice' do visit admin_invoices_url - i = Invoice.first - click_link("Invoice no. #{i.id}") + click_link("Invoice no. #{@invoice.id}") page.should have_content("Seller") page.should have_content("Details") page.should have_content("Paldiski mnt. 123") @@ -42,4 +40,23 @@ feature 'Invoice', type: :feature do page.should have_content('120.0') page.should have_content(r.name) end + + it 'should forward invoice' do + visit '/admin/invoices' + click_link @invoice.to_s + click_link 'Forward' + click_button 'Forward' + page.should have_text('Failed to forward invoice') + fill_in 'Billing email', with: 'test@test.ee' + click_button 'Forward' + page.should have_text('Invoice forwarded') + end + + it 'should download invoice' do + visit '/admin/invoices' + click_link @invoice.to_s + click_link 'Download' + response_headers['Content-Type'].should == 'application/pdf' + response_headers['Content-Disposition'].should == "attachment; filename=\"#{@invoice.pdf_name}\"" + end end