diff --git a/Gemfile b/Gemfile index 2bb10b8..f663054 100644 --- a/Gemfile +++ b/Gemfile @@ -30,6 +30,7 @@ gem 'kaminari' gem 'bootstrap4-kaminari-views' gem 'wicked_pdf' gem 'friendly_id', '~> 5.4.0' +gem 'combine_pdf' # Use ActiveStorage variant # gem 'mini_magick', '~> 4.8' diff --git a/app/assets/images/baner.png b/app/assets/images/baner.png new file mode 100644 index 0000000..8aaac92 Binary files /dev/null and b/app/assets/images/baner.png differ diff --git a/app/assets/images/baner_main.png b/app/assets/images/baner_main.png new file mode 100644 index 0000000..fd7575d Binary files /dev/null and b/app/assets/images/baner_main.png differ diff --git a/app/assets/images/no.png b/app/assets/images/no.png new file mode 100644 index 0000000..02aff76 Binary files /dev/null and b/app/assets/images/no.png differ diff --git a/app/assets/images/pdf_footer.png b/app/assets/images/pdf_footer.png new file mode 100644 index 0000000..319c4d5 Binary files /dev/null and b/app/assets/images/pdf_footer.png differ diff --git a/app/assets/images/pdf_header.png b/app/assets/images/pdf_header.png new file mode 100644 index 0000000..90a0c19 Binary files /dev/null and b/app/assets/images/pdf_header.png differ diff --git a/app/assets/images/raport_pdf_okladka_1.png b/app/assets/images/raport_pdf_okladka_1.png new file mode 100644 index 0000000..ae314ac Binary files /dev/null and b/app/assets/images/raport_pdf_okladka_1.png differ diff --git a/app/assets/images/raport_pdf_okladka_2.png b/app/assets/images/raport_pdf_okladka_2.png new file mode 100644 index 0000000..a6468d3 Binary files /dev/null and b/app/assets/images/raport_pdf_okladka_2.png differ diff --git a/app/assets/images/raport_pdf_tlo.png b/app/assets/images/raport_pdf_tlo.png new file mode 100644 index 0000000..645bc6e Binary files /dev/null and b/app/assets/images/raport_pdf_tlo.png differ diff --git a/app/assets/images/yes.png b/app/assets/images/yes.png new file mode 100644 index 0000000..f669af3 Binary files /dev/null and b/app/assets/images/yes.png differ diff --git a/app/assets/stylesheets/main.css b/app/assets/stylesheets/main.css index 2bd22ef..80c89e7 100644 --- a/app/assets/stylesheets/main.css +++ b/app/assets/stylesheets/main.css @@ -1,7 +1,7 @@ .mainer-header { position: relative; - min-height: 800px; - background: url("/assets/main_kalendarz1.png") no-repeat center center fixed; + min-height: 396px; + background: url("/assets/baner_main.png") no-repeat center center; background-size: cover; } @@ -31,3 +31,81 @@ -ms-flex-pack: center; justify-content: center; } + +.btn-outline-navy { + color: #1c509a; + border-color: #1c509a; +} + +.btn-outline-navy:hover { + color: #fff; + background-color: #1c509a; + border-color: #1c509a; +} + +.btn-outline-navy:focus, .btn-outline-navy.focus { + box-shadow: 0 0 0 0 rgba(40, 167, 69, 0.5); +} + +.btn-outline-navy.disabled, .btn-outline-navy:disabled { + color: #1c509a; + background-color: transparent; +} + +.btn-outline-navy:not(:disabled):not(.disabled):active, .btn-outline-navy:not(:disabled):not(.disabled).active, +.show > .btn-outline-navy.dropdown-toggle { + color: #fff; + background-color: #1c509a; + border-color: #1c509a; +} + +.btn-outline-navy:not(:disabled):not(.disabled):active:focus, .btn-outline-navy:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-navy.dropdown-toggle:focus { + box-shadow: 0 0 0 0 rgba(40, 167, 69, 0.5); +} + +.btn-navy { + color: #fff; + background-color: #1c509a; + border-color: #1c509a; + box-shadow: none; +} + +.btn-navy:hover { + color: #fff; + background-color: #0a3a7e; + border-color: #0A3AB0; +} + +.btn-navy:focus, .btn-navy.focus { + color: #fff; + background-color: #0a3a7e; + border-color: #1e7e34; + box-shadow: 0 0 0 0 rgba(72, 180, 97, 0.5); +} + +.btn-navy.disabled, .btn-success:disabled { + color: #fff; + background-color: #1c509a; + border-color: #0A3AB0; +} + +.btn-navy:not(:disabled):not(.disabled):active, .btn-navy:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #1c509a; + border-color: #0A3AB0; +} + +.btn-navy:not(:disabled):not(.disabled):active:focus, .btn-navy:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0 rgba(72, 180, 97, 0.5); +} + +.text-navy-new { + color: #1c509a; +} + +.text-navy-new:hover { + color: #0a3a7e; +} diff --git a/app/assets/stylesheets/pdf.css b/app/assets/stylesheets/pdf.css new file mode 100644 index 0000000..b7dc0af --- /dev/null +++ b/app/assets/stylesheets/pdf.css @@ -0,0 +1,32 @@ +table, th, td { + border: 0px solid black; + border-collapse: collapse; + vertical-align: top; +} +table { + width: 100%; +} + +.img-container { + position: relative; + text-align: left; + color: white; +} + +/* Bottom left text */ +.img-text-bottom-left { + position: absolute; + bottom: 240px; + left: 160px; +} + +/* Bottom right text */ +.img-text-bottom-right { + position: absolute; + bottom: 90px; + right: 130px; +} + +.text-right { + text-align: right; +} diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index f394a2b..20b8af0 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -4,6 +4,7 @@ class HomeController < ApplicationController layout 'home_layout' before_action :check_status + include HomeHelper def check_status if defined?(current_user) && user_signed_in? @@ -67,8 +68,38 @@ class HomeController < ApplicationController respond_to do |format| format.html format.pdf do - render pdf: @dotation.safe_id # Excluding ".pdf" extension. - end + pdf1a = WickedPdf.new.pdf_from_string( + render_cover_header(@dotation, @company_sizes), + {pdf: 'cover_header', + dpi: 300, + margin: { top: 0, bottom: 0, left: 0, right: 0 }, + background: true, + no_background: false, + enable_local_file_access: true}) + pdf1 = WickedPdf.new.pdf_from_string( + render_to_stringi(@dotation, @company_sizes), {pdf: @dotation.safe_id, # Excluding ".pdf" extension. + header: { content: render_to_string({ template: "shared/pdf_header.pdf", layout: false }), line: false }, + footer: { content: render_to_string({ template: 'shared/pdf_footer.html', layout: false }), line: false }, + dpi: 300, + margin: { top: 50, bottom: 50, left: 0, right: 0 }, + background: true, + no_background: false, + enable_local_file_access: true}) + # + pdf1b = WickedPdf.new.pdf_from_string( + render_cover_footer(@dotation, @company_sizes), + {pdf: 'cover_header', + dpi: 300, + margin: { top: 0, bottom: 0, left: 0, right: 0 }, + background: true, + no_background: false, + enable_local_file_access: true}) + combiner = CombinePDF.new + combiner << CombinePDF.parse(pdf1a) + combiner << CombinePDF.parse(pdf1) + combiner << CombinePDF.parse(pdf1b) + send_data combiner.to_pdf + end end end @@ -87,9 +118,40 @@ class HomeController < ApplicationController @company_sizes = CompanySize.all @dotations = Dotation.search_with_filters(filters).public_dot .point_desc.end_date_asc + dotation = @dotations.first respond_to do |format| format.pdf do - render pdf: "zestawienie_dotacji_#{Time.now.strftime('%d%m%Y')}" + pdf1a = WickedPdf.new.pdf_from_string( + render_cover_header(dotation, @company_sizes), + {pdf: 'cover_header', + dpi: 300, + margin: { top: 0, bottom: 0, left: 0, right: 0 }, + background: true, + no_background: false, + enable_local_file_access: true}) + pdf1 = WickedPdf.new.pdf_from_string( + render_to_pdf_all(@dotations, @company_sizes), {pdf: "zestawienie_dotacji_#{Time.now.strftime('%d%m%Y')}", # Excluding ".pdf" extension. + header: { content: render_to_string({ template: "shared/pdf_header.pdf", layout: false }), line: false }, + footer: { content: render_to_string({ template: 'shared/pdf_footer.html', layout: false }), line: false }, + dpi: 300, + margin: { top: 50, bottom: 50, left: 0, right: 0 }, + background: true, + no_background: false, + enable_local_file_access: true}) + # + pdf1b = WickedPdf.new.pdf_from_string( + render_cover_footer(dotation, @company_sizes), + {pdf: 'cover_header', + dpi: 300, + margin: { top: 0, bottom: 0, left: 0, right: 0 }, + background: true, + no_background: false, + enable_local_file_access: true}) + combiner = CombinePDF.new + combiner << CombinePDF.parse(pdf1a) + combiner << CombinePDF.parse(pdf1) + combiner << CombinePDF.parse(pdf1b) + send_data combiner.to_pdf end end end @@ -105,6 +167,10 @@ class HomeController < ApplicationController @projects = Project.all end + def pdf_header + + end + def build_filter_hash { search: params[:search], company_sizes: @company_size_chk, diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb index e53b6d3..a35b022 100644 --- a/app/helpers/home_helper.rb +++ b/app/helpers/home_helper.rb @@ -12,4 +12,59 @@ module HomeHelper end ret end + + def self.change_ammount(ammount) + return '' if ammount.blank? + + ret = if ammount >= 1_000_000 + "#{ammount / 1_000_000} mln" + else + "#{ammount / 1_000} tyś" + end + ret + end + + def render_to_stringi(data, comp_sizes) + action_view = ActionView::Base.new + action_view.view_paths = ActionController::Base.view_paths + action_view.class_eval do + include ApplicationHelper + end + action_view.render template: 'home/show.pdf', + layout: 'layouts/pdf.html', + locals: { dotation: data, company_sizes: comp_sizes } + end + + def render_to_pdf_all(data, comp_sizes) + action_view = ActionView::Base.new + action_view.view_paths = ActionController::Base.view_paths + action_view.class_eval do + include ApplicationHelper + end + action_view.render template: 'home/prepare_pdf.pdf', + layout: 'layouts/pdf.html', + locals: { dotations: data, company_sizes: comp_sizes } + end + + def render_cover_header(data, comp_sizes) + action_view = ActionView::Base.new + action_view.view_paths = ActionController::Base.view_paths + action_view.class_eval do + include ApplicationHelper + end + action_view.render template: 'home/show.pdf', + layout: 'layouts/pdf_header.html', + locals: { dotation: data, company_sizes: comp_sizes } + end + + def render_cover_footer(data, comp_sizes) + action_view = ActionView::Base.new + action_view.view_paths = ActionController::Base.view_paths + action_view.class_eval do + include ApplicationHelper + end + action_view.render template: 'home/show.pdf', + layout: 'layouts/pdf_footer.html', + locals: { dotation: data, company_sizes: comp_sizes } + end end diff --git a/app/models/dotation.rb b/app/models/dotation.rb index ef7492e..3f2adbb 100644 --- a/app/models/dotation.rb +++ b/app/models/dotation.rb @@ -145,4 +145,18 @@ class Dotation < ApplicationRecord def safe_id friendly_id end + + def replace_video + require 'nokogiri' + ret = full_descr + doc = Nokogiri::HTML(ret) + doc.css('iframe').each do |iframe| + url = 'https:' + iframe['src'] + new_node = doc.create_element 'a' + new_node['href'] = url + new_node.inner_html = url + iframe.replace new_node + end + doc + end end diff --git a/app/views/home/_dotation_card.html.erb b/app/views/home/_dotation_card.html.erb index 45c45d1..7b9e7ee 100644 --- a/app/views/home/_dotation_card.html.erb +++ b/app/views/home/_dotation_card.html.erb @@ -2,7 +2,7 @@

- <%= link_to dotation.name, "/dotacja/#{dotation.safe_id}" %> + <%= link_to dotation.name, "/dotacja/#{dotation.safe_id}", class: 'text-navy-new' %>

@@ -74,7 +74,7 @@
diff --git a/app/views/home/_dotation_card.pdf.erb b/app/views/home/_dotation_card.pdf.erb index d79f4f7..6b9bac0 100644 --- a/app/views/home/_dotation_card.pdf.erb +++ b/app/views/home/_dotation_card.pdf.erb @@ -24,7 +24,7 @@ Wartość projektu - do <%= change_ammount(dotation.max_amount) %> <%= dotation.max_amount_curr.name %> + do <%= HomeHelper.change_ammount(dotation.max_amount) %> <%= dotation.max_amount_curr.name %> <% end %> diff --git a/app/views/home/_dotations.html.erb b/app/views/home/_dotations.html.erb index 89dc828..9cb4574 100644 --- a/app/views/home/_dotations.html.erb +++ b/app/views/home/_dotations.html.erb @@ -4,9 +4,6 @@
-
-

Informacje

-
<% if @dotations.blank? %>
@@ -15,23 +12,23 @@
-
<% else %> -
-
Znalezionych aktywnych dotacji: <%= @dotations_size %>
-
-
+
+
+
-
<% end %>
diff --git a/app/views/home/_filter_form.html.erb b/app/views/home/_filter_form.html.erb index 61d92bd..20b19ba 100644 --- a/app/views/home/_filter_form.html.erb +++ b/app/views/home/_filter_form.html.erb @@ -7,7 +7,7 @@ <% unless params[:search].blank? %>
- <%= link_to raw(' Zapisz jako PDF'), "/zestawienie_dotacji/plik.pdf", class: 'btn btn-success btn-block' %> + <%= link_to raw(' Zapisz jako PDF'), "/zestawienie_dotacji/plik.pdf", class: 'btn btn-navy btn-block' %>

@@ -22,7 +22,7 @@
- - + <%#

@@ -97,12 +98,13 @@
- <%= text_field_tag(:localization, params[:localization], class: 'form-control', placeholder: 'Wpisz tu lokalizację') %> + text_field_tag(:localization, params[:localization], class: 'form-control', placeholder: 'Wpisz tu lokalizację')

-
+ %> +
- <%= raw partner.description %> + <%= raw simple_format(partner.description) %> diff --git a/app/views/shared/_disclaimer.html.erb b/app/views/shared/_disclaimer.html.erb new file mode 100644 index 0000000..80b60a2 --- /dev/null +++ b/app/views/shared/_disclaimer.html.erb @@ -0,0 +1,17 @@ +

Klauzula o wyłączeniu odpowiedzialności

+
    +
  1. Treści, które publikujemy w Serwisie, mają charakter wyłącznie informacyjny lub poglądowy. Nie stanowią żadnej formy doradztwa na rzecz Użytkowników Serwisu.
  2. +
  3. Staramy się, aby publikowane w Serwisie informacje dotyczyły możliwie największej liczby ogłoszonych w Polsce konkursów/programów/naborów wniosków organizowanych, w ramach których można ubiegać się o dofinansowanie ze środków publicznych, ale nie gwarantujemy, że w ramach w Serwisu można wyszukać informację o każdym konkursie/programie/naborze wniosków, który został ogłoszony.
  4. +
  5. Staramy się, aby publikowane w Serwisie informacje były aktualne, rzetelne i dokładne, ale nie gwarantujemy, że są one wyczerpujące i w pełni zgodne z obowiązującymi zasadami udzielania dofinansowania w ramach poszczególnych konkursów/programów/naborów wniosków. Treści publikowane w Serwisie mogą zawierać błędy lub nieścisłości i mogą być nieaktualne.
  6. +
  7. Celem Serwisu jest przedstawienie Użytkownikom najistotniejszych w naszej ocenie aspektów dotyczących dostępnych dotacji dla przedsiębiorców (lub przyszłych przedsiębiorców) i możliwości ubiegania się przez nich o dofinansowanie ze środków publicznych. Informacje te nie są jednak wystarczające do podjęcia ostatecznej decyzji o ubieganiu się o takie dofinansowanie. Użytkownicy Serwisu wykorzystują informacje dostępne w Serwisie na własne ryzyko i na własną odpowiedzialność. Złożenie wniosku o dotację/dofinansowanie w każdym wypadku wymaga dokładnego zapoznania się z pełną i aktualną dokumentacją konkursową udostępnianą bezpośrednio przez instytucję, która udziela wsparcia finansowego, i stosowania się do określonych w tej dokumentacji zasad.
  8. +
  9. Nie ponosimy odpowiedzialności za: +
      +
    1. treści i materiały zamieszczane na stronie,
    2. +
    3. skutki wykorzystania informacji, materiałów, komentarzy lub opinii dostępnych w Serwisie przez jego Użytkowników; w szczególności nie odpowiadamy za jakiekolwiek szkody majątkowe (w tym utracone korzyści lub nieuzyskanie finansowania), poniesione przez użytkowników Serwisu wskutek wykorzystania informacji dostępnych w Serwisie, nawet jeżeli informacje te były nieaktualne lub nierzetelne,
    4. +
    5. treści publikowane na innych stronach internetowych, do których mogą odsyłać informacje zawarte w naszym Serwisie,
    6. +
    7. działania osób trzecich, które oferują swoje usługi w ramach Serwisu,
    8. +
    9. skutki zakłóceń w dostępności lub funkcjonalnościach Serwisu.
    10. +
    +
  10. +
  11. Wyłączenie odpowiedzialności, o którym mowa powyżej dotyczy podmiotu prowadzącego Serwis oraz autorów poszczególnych treści, opinii lub komentarzy zawartych w Serwisie.
  12. +
diff --git a/app/views/shared/_disclaimer.pdf.erb b/app/views/shared/_disclaimer.pdf.erb new file mode 100644 index 0000000..80b60a2 --- /dev/null +++ b/app/views/shared/_disclaimer.pdf.erb @@ -0,0 +1,17 @@ +

Klauzula o wyłączeniu odpowiedzialności

+
    +
  1. Treści, które publikujemy w Serwisie, mają charakter wyłącznie informacyjny lub poglądowy. Nie stanowią żadnej formy doradztwa na rzecz Użytkowników Serwisu.
  2. +
  3. Staramy się, aby publikowane w Serwisie informacje dotyczyły możliwie największej liczby ogłoszonych w Polsce konkursów/programów/naborów wniosków organizowanych, w ramach których można ubiegać się o dofinansowanie ze środków publicznych, ale nie gwarantujemy, że w ramach w Serwisu można wyszukać informację o każdym konkursie/programie/naborze wniosków, który został ogłoszony.
  4. +
  5. Staramy się, aby publikowane w Serwisie informacje były aktualne, rzetelne i dokładne, ale nie gwarantujemy, że są one wyczerpujące i w pełni zgodne z obowiązującymi zasadami udzielania dofinansowania w ramach poszczególnych konkursów/programów/naborów wniosków. Treści publikowane w Serwisie mogą zawierać błędy lub nieścisłości i mogą być nieaktualne.
  6. +
  7. Celem Serwisu jest przedstawienie Użytkownikom najistotniejszych w naszej ocenie aspektów dotyczących dostępnych dotacji dla przedsiębiorców (lub przyszłych przedsiębiorców) i możliwości ubiegania się przez nich o dofinansowanie ze środków publicznych. Informacje te nie są jednak wystarczające do podjęcia ostatecznej decyzji o ubieganiu się o takie dofinansowanie. Użytkownicy Serwisu wykorzystują informacje dostępne w Serwisie na własne ryzyko i na własną odpowiedzialność. Złożenie wniosku o dotację/dofinansowanie w każdym wypadku wymaga dokładnego zapoznania się z pełną i aktualną dokumentacją konkursową udostępnianą bezpośrednio przez instytucję, która udziela wsparcia finansowego, i stosowania się do określonych w tej dokumentacji zasad.
  8. +
  9. Nie ponosimy odpowiedzialności za: +
      +
    1. treści i materiały zamieszczane na stronie,
    2. +
    3. skutki wykorzystania informacji, materiałów, komentarzy lub opinii dostępnych w Serwisie przez jego Użytkowników; w szczególności nie odpowiadamy za jakiekolwiek szkody majątkowe (w tym utracone korzyści lub nieuzyskanie finansowania), poniesione przez użytkowników Serwisu wskutek wykorzystania informacji dostępnych w Serwisie, nawet jeżeli informacje te były nieaktualne lub nierzetelne,
    4. +
    5. treści publikowane na innych stronach internetowych, do których mogą odsyłać informacje zawarte w naszym Serwisie,
    6. +
    7. działania osób trzecich, które oferują swoje usługi w ramach Serwisu,
    8. +
    9. skutki zakłóceń w dostępności lub funkcjonalnościach Serwisu.
    10. +
    +
  10. +
  11. Wyłączenie odpowiedzialności, o którym mowa powyżej dotyczy podmiotu prowadzącego Serwis oraz autorów poszczególnych treści, opinii lub komentarzy zawartych w Serwisie.
  12. +
diff --git a/app/views/shared/pdf_footer.html.erb b/app/views/shared/pdf_footer.html.erb new file mode 100644 index 0000000..0b701ba --- /dev/null +++ b/app/views/shared/pdf_footer.html.erb @@ -0,0 +1 @@ +<%= wicked_pdf_image_tag 'pdf_footer.png', style: 'border: 0px;' %> diff --git a/app/views/shared/pdf_header.pdf.erb b/app/views/shared/pdf_header.pdf.erb new file mode 100644 index 0000000..8e34abf --- /dev/null +++ b/app/views/shared/pdf_header.pdf.erb @@ -0,0 +1,6 @@ + + + +<%= wicked_pdf_image_tag 'pdf_header', alt: 'Header', height: '350px', style: 'border: 0px; margin-left: 0px; padding-left: 0px;' %> + + diff --git a/config/initializers/wicked_pdf.rb b/config/initializers/wicked_pdf.rb index d663930..a3d18dc 100644 --- a/config/initializers/wicked_pdf.rb +++ b/config/initializers/wicked_pdf.rb @@ -15,8 +15,8 @@ WickedPdf.config = { # or # exe_path: Gem.bin_path('wkhtmltopdf-binary', 'wkhtmltopdf') # exe_path: 'c:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' - exe_path: '/usr/bin/wkhtmltopdf' + exe_path: '/usr/bin/wkhtmltopdf', # Layout file to be used for all PDFs # (but can be overridden in `render :pdf` calls) - # layout: 'pdf.html', + layout: 'pdf.html.erb' }