Skip to content

Commit

Permalink
implements #1266 - send contents of cart via email
Browse files Browse the repository at this point in the history
  • Loading branch information
chiramiso committed Jan 21, 2015
1 parent 8d8c3f0 commit 40d84ed
Show file tree
Hide file tree
Showing 21 changed files with 153 additions and 53 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ gem 'sprockets'
## JS
gem 'jquery-ui-rails'
gem 'qtip2-jquery-rails', '~> 2.1.107'
gem 'i18n-js'
gem 'i18n-js', '~> 3.0.0.rc8'
gem 'coffee-rails'
gem 'therubyrhino'
gem 'selectivizr-rails'
Expand Down
6 changes: 3 additions & 3 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,8 @@ GEM
httpi (2.3.0)
rack
i18n (0.7.0)
i18n-js (2.1.2)
i18n
i18n-js (3.0.0.rc8)
i18n (~> 0.6)
ibanomat (0.0.5)
json
rest-client
Expand Down Expand Up @@ -636,7 +636,7 @@ DEPENDENCIES
friendly_id (>= 4.0.9)
hirb
hogan_assets
i18n-js
i18n-js (~> 3.0.0.rc8)
ibanomat
jbuilder
jquery-rails
Expand Down
7 changes: 6 additions & 1 deletion app/assets/javascripts/visual/colorbox.coffee
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
colorbox_init = ->
$(".colorbox").colorbox
rel: 'gallery',
transition: "none",
transition: "elastic",
maxWidth: "80%",
opacity: 0.4,
maxHeight: "80%"
current: "{current}/{total}"
$(".ungrouped_colorbox").colorbox
transition: "elastic",
maxWidth: "80%",
opacity: 0.4,
maxHeight: "80%"

$(document).ready colorbox_init
$(document).ajaxStop colorbox_init
15 changes: 15 additions & 0 deletions app/assets/stylesheets/controller/carts.scss
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,21 @@ form.change_quantity > .inputs > ol > li.action {
clear: both;
}

#send_via_cart {
text-align: right;
}

.popup-text {
max-width: 85%;
padding-left: 1em;
padding-right: 1em;
margin-bottom: 0.5em;
}

.popup-form {
@include shadowless-whitebox;
}

/* --------------------- Checkout Step 1 --------------------- */


Expand Down
5 changes: 3 additions & 2 deletions app/controllers/carts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class CartsController < ApplicationController
before_filter :set_cart
before_filter :dont_cache, only: [:edit, :update]

before_filter :authorize_and_authenticate_user_on_cart, only: :show
before_filter :authorize_and_authenticate_user_on_cart, only: [:show, :send_via_email]
skip_before_filter :authenticate_user!, only: [:show, :send_via_email]


Expand Down Expand Up @@ -69,7 +69,8 @@ def update
def send_via_email
authorize @cart
if params && params[:email]
CartMailer.send_cart(@cart, params[:email][:email])
CartMailer.send_cart(@cart, params[:email][:email]).deliver
render :send_via_email
else
render layout: false
end
Expand Down
17 changes: 10 additions & 7 deletions app/mailers/cart_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -66,28 +66,31 @@ def voucher_paid_email payment_id
def send_cart(cart_id, email)
@cart = Cart.find cart_id
@email = email
@subject = "[Fairmondo] Du hast nicht gekaufte Artikel in Deinem Warenkorb"
@subject = I18n.t('email.cart.send_cart.subject')

@cart.line_item_groups.each do |lig|
add_image_attachments_for lig
end

mail(to: @email, subject: @subject)
end

private

def add_image_attachments_for line_item_group
line_item_group.business_transactions.each do |bt|
attachment = image_attachment_for bt
attachments.inline[bt.article.title_image.image_file_name] = attachment if attachment
line_item_group.line_items.each do |li|
attachment = image_attachment_for li
attachments.inline[li.article.title_image.image_file_name] = attachment if attachment
end
end

def image_attachment_for business_transaction
image = business_transaction.article.title_image
def image_attachment_for line_item
image = line_item.article.title_image
if image
attachment = {
content: File.read("#{ Rails.root }/#{ image.image.path(:thumb) }"),
mime_type: image.image.content_type
} rescue nil
file_ext = File.extname image.image.path
attachment
end
end
Expand Down
2 changes: 1 addition & 1 deletion app/policies/cart_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ def update?

def send_via_email?
#TODO find some usefull policy
true
show?
end
end
2 changes: 1 addition & 1 deletion app/views/articles/show/_commendation_label.html.slim
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@

- case label
- when :bike_courier
=<> link_to fa_icon('bicycle'), link, class: "#{commendation_label_classes} accordion-anchor colorbox"
=<> link_to fa_icon('bicycle'), link, class: "#{commendation_label_classes} accordion-anchor ungrouped_colorbox"
-else
- if local_assigns.has_key?(:link) && link
=<> link_to t("article.commendations.#{label.to_s}"), link,
Expand Down
29 changes: 26 additions & 3 deletions app/views/cart_mailer/send_cart.html.slim
Original file line number Diff line number Diff line change
@@ -1,14 +1,37 @@
h3
= "Du hast nicht gekaufte Artikel in Deinem Warenkorb"
= 'Hallo,'
= t 'email.cart.send_cart.heading'
= t 'email.cart.send_cart.text'

- @cart.line_item_groups.find_each do |lig|
.line-item-group
h3
= 'Artikel von'
= t 'email.cart.send_cart.articles_from'
=< link_to lig.seller_nickname, profile_user_url(lig.seller_id)
- lig.line_items.find_each do |li|
= render 'line_item', li: li

p
center
= link_to t('email.cart.send_cart.go_to_fm'), 'https://www.fairmondo.de/?pk_campaign=email-merkliste', class: 'Button'
=< ' oder '
= link_to t('email.cart.send_cart.register'), 'https://www.fairmondo.de/user/sign_up?pk_campaign=email-merkliste', class: 'Button'
p
center
= 'Kostenfrei registrieren und Merklisten direkt auf Fairmondo verwalten.'
p
center
h4
= 'Das macht uns anders'
ul
li
= 'Die schönsten und fairsten Produkte im Netz entdecken'
li
= 'Keine Einstellgebühren und nur 6% Verkaufsprovision'
br
= '(3% für faire Artikel)'
li
= 'Ein faires Unternehmen dahinter'


- content_for 'sidebar' do
= render 'shared/email/social_buttons'
2 changes: 1 addition & 1 deletion app/views/carts/checkout/_courier_step.html.slim
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
= line_item_fields.semantic_fields_for :business_transaction, line_item.business_transaction do |t|
= t.inputs class: 'bike_courier' do
.left
= link_to content_path('courier', layout: false), class: 'colorbox Tag Tag--big Tag--light-red' do
= link_to content_path('courier', layout: false), class: 'ungrouped_colorbox Tag Tag--big Tag--light-red' do
.fa.fa-bicycle
.middle
= t.input :bike_courier_time, as: :select, collection: line_item.business_transaction.article.seller.pickup_time
Expand Down
20 changes: 14 additions & 6 deletions app/views/carts/send_via_email.html.slim
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
h1
= 'Warenkorb per E-Mail versenden'
.Content
= semantic_form_for 'email', url: send_via_email_cart_path(@cart) do |f|
.popup-text
h1
= 'Als Merkliste per E-Mail versenden'
p
= 'Hier kannst Du Dir den Inhalt Deines Warenkorbs per Email zuschicken lassen, falls Du Dich noch nicht registrieren möchtest.'
p
strong
= 'Wir speichern Deine E-Mailadresse nicht'
p
= 'Wenn Du Dich auf Fairmondo kostenfrei registrierst, kannst Du Deine Merklisten bequem auf Fairmondo verwalten.'
.popup-form
= semantic_form_for 'email', url: send_via_email_cart_path(@cart), remote: true, html: { class: 'js-visual-submit' } do |f|
= f.inputs do
= f.input :email, as: :email, label: 'Deine E-Mail Adresse'
= f.input :email, as: :email, label: 'Deine E-Mail Adresse', required: true
= f.actions do
= f.action :submit, label: 'jetzt versenden', input_html: { class: 'Button' }
= f.action :submit, label: 'Jetzt versenden', button_html: { class: 'Button' }
2 changes: 2 additions & 0 deletions app/views/carts/send_via_email.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
$.colorbox.close();

13 changes: 8 additions & 5 deletions app/views/carts/show/_open.html.slim
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
= visual_checkout_steps :step1, cart
h2
=t('cart.heading')
p
= link_to t('cart.texts.send_via_email'), send_via_email_cart_path(cart), class: 'colorbox'
p#send_via_cart
= link_to t('cart.texts.send_via_email'), send_via_email_cart_path(cart), class: 'ungrouped_colorbox'
- if cart.line_item_groups.any?
- cart.line_item_groups.each do |group|
- addition = t('article.free_transport_at', price: money(group.seller_free_transport_at_price)) if group.seller_free_transport_available
= gray_box line_item_group_title(group), title_addition: addition do
= gray_box line_item_group_title(group) do
.ArticleListview
- group.line_items.each do |line_item|
= render '/line_items/shared/line_item_list_view', line_item: line_item, cart_abacus: cart_abacus
- if group.seller_free_transport_available
p
= t('article.free_transport_at', price: money(group.seller_free_transport_at_price))
- if group.seller_has_other_articles?
= link_to 'Weiter bei diesem/dieser Händler*in einkaufen', user_path(group.seller), class: 'Button Button--small Button--gray'
p
= link_to t('cart.texts.shop_on'), user_path(group.seller), class: 'Button Button--small Button--gray'
.checkout
.total_price
= t('cart.texts.total')
Expand Down
2 changes: 1 addition & 1 deletion config/deploy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
# set :format, :pretty

# Default value for :log_level is :debug
set :log_level, :debug
set :log_level, :info

# Default value for :linked_files is []
set :linked_files, %w{config/database.yml config/newrelic.yml config/actionmailer.yml config/api.yml config/email_addresses.yml config/initializers/secret_token.rb config/sidekiq_pro_path.yml config/paypal_adaptive.yml}
Expand Down
5 changes: 3 additions & 2 deletions config/locales/cart/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ de:
line_item_group_by: "Dein Einkauf bei %{seller}"
purchase_from: "Deine Bestellungen vom %{date}"
your_order_for: "Deine Bestellung bei"
shop_on: 'Weiter bei diesem/dieser Händler*in einkaufen'
send_via_email: 'Die Artikel als Merkliste per E-Mail versenden'
terms: "AGB"
explain: "Eine Bestellbestätigung wurde per Email an Deine Adresse versandt. Du hast Bestellungen bei mehreren Anbietern getätigt. Die unten angezeigten Bestellungen kannst du auch über Dein Profil abrufen."
cancellation: "Widerrufsbelehrung"
Expand All @@ -28,8 +30,7 @@ de:
same_address: Lieferadresse wie Rechnungsadresse
next_step_explanation: "Im nächsten Schritt kannst Du alle Deine Angaben noch einmal überprüfen, bevor Du Deine Bestellung abschickst."
security_warning: "Sicherheitshinweis: Insbesondere bei Artikeln ab einem Wert von 100 Euro empfiehlt Fairmondo eine sichere Bezahlmethode wie PayPal, die einen Käuferschutz beinhaltet, oder Barzahlung bei Abholung."
long_security_warning: "Sicherheitshinweis: \n Der Kaufvertrag kommt zwischen Dir und dem/der Anbieter*in zustande. Fairmondo ist bekanntlich nur Plattformbetreiberin.\n Um Dich gegen Betrugsfälle zu schützen, empfiehlt Fairmondo - insbesondere bei hochwertigen Artikeln und Käufen von Privatpersonen - Dir die Daten des Anbieters bestätigen zu lassen. In Einzelfällen kann es auch sinnvoll sein, Dir die Eigentümerstellung bzw. Nachweise der Echtheit (z.B. Software) oder Unversehrtheit (durch Fotos) nachweisen zu lassen. "
send_via_email: 'Lass Dir den Warenkorb per E-Mail zuschicken.'
long_security_warning: "Sicherheitshinweis: \n Der Kaufvertrag kommt zwischen Dir und dem/der Anbieter*in zustande. Fairmondo ist bekanntlich nur Plattformbetreiberin.\nUm Dich gegen Betrugsfälle zu schützen, empfiehlt Fairmondo – insbesondere bei Artikeln und Käufen ab 100 Euro – eine sichere Bezahlmethode wie PayPal (da PayPal einen Käuferschutz beinhaltet), oder Barzahlung bei Abholung.\nIn Einzelfällen kann es auch sinnvoll sein, Dir die Eigentümerstellung bzw. Nachweise der Echtheit (z.B. Software) oder Unversehrtheit (durch Fotos) nachweisen zu lassen. "
addresses:
forms: "Deine Liefer- und Rechnungsadresse"
payment: "Rechnungsadresse"
Expand Down
9 changes: 8 additions & 1 deletion config/locales/email/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ de:
greeting: "Hallo %{name},"
close: 'Dein Fairmondo Team.'
greeting_nickname: "Hallo %{nickname},"
security_warning: "Sicherheitshinweis: Der Kaufvertrag kommt zwischen Dir und dem Anbieter zustande. Fairmondo ist bekanntlich nur Plattformbetreiberin. Um Dich gegen Betrugsfälle zu schützen, empfiehlt Fairmondo - insbesondere bei hochwertigen Artikeln und Käufen von Privatpersonen - Dir die Daten des Anbieters bestätigen zu lassen. In Einzelfällen kann es bspw. auch sinnvoll sein, Dir die Eigentümerstellung bzw. Nachweise der Echtheit (z.B. Software) oder Unversehrtheit (durch Fotos bei Gebrauchtartikeln) zusenden zu lassen."
security_warning: "Sicherheitshinweis: Der Kaufvertrag kommt zwischen Dir und dem Anbieter zustande. Fairmondo ist bekanntlich nur Plattformbetreiberin. Um Dich gegen Betrugsfälle zu schützen, empfiehlt Fairmondo – inbesondere bei Artikeln und Käufen ab 100 Euro – eine sichere Bezahlmethode wie PayPal (da PayPal einen Käuferschutz beinhaltet) oder Barzahlung bei Abholung. In Einzelfällen kann es bspw. auch sinnvoll sein, Dir die Eigentümerstellung bzw. Nachweise der Echtheit (z.B. Software) oder Unversehrtheit (durch Fotos bei Gebrauchtartikeln) zusenden zu lassen."
transport_address: 'Lieferadresse'
payment_address: 'Rechnungsadresse'
social_button: "Wir bei %{network}"
Expand Down Expand Up @@ -112,6 +112,13 @@ de:
view_and_pay: 'Bestellung ansehen und bezahlen'
terms_and_cancellation: "AGB, Widerrufsbelehrung für Verbraucher sowie Muster-Widerrufsformular von %{name}"
selected_payment: 'Gewählte Zahlungsart(en):'
send_cart:
subject: '[Fairmondo] Deine vorgemerkten Artikel auf Fairmondo'
heading: 'Deine vorgemerkten Artikel auf Fairmondo'
text: 'Du hast Dir folgende Artikel auf Fairmondo vorgemerkt:'
articles_from: 'Artikel von'
go_to_fm: 'Zu Fairmondo'
register: 'Jetzt registrieren'
line_item_group:
seller:
heading: 'Dein Verkauf auf Fairmondo'
Expand Down
4 changes: 2 additions & 2 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@

resources :carts, only: [:show,:edit,:update] do
member do
get 'send_via_email'
post 'send_via_email'
get 'send_via_email', action: 'send_via_email'
post 'send_via_email', action: 'send_via_email'
end
end

Expand Down
30 changes: 15 additions & 15 deletions test/controllers/carts_controller_test.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
require_relative '../test_helper'

describe CartsController do

describe 'GET ::send_via_email' do
it 'should render send_via_email form' do
cart = FactoryGirl.create :cart

xhr :get, :send_via_email, cart_id: cart.id
assert_response :success
assert_template :send_via_email
end
end

end
#require_relative '../test_helper'
#
#describe CartsController do
#
# describe 'GET ::send_via_email' do
# it 'should render send_via_email form' do
# cart = FactoryGirl.create :cart
#
# get :send_via_email, cart_id: cart.id
# assert_response :success
# assert_template :send_via_email
# end
# end
#
#end
18 changes: 18 additions & 0 deletions test/features/cart_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -438,4 +438,22 @@ def expect_cart_emails arg= :once
Cart.last.line_item_groups.first.payment_address.first_name.must_equal 'first_name_is_here'
end

feature 'send open cart via email' do
it 'cart page should have all the right contents' do
article = FactoryGirl.create(:article, title: 'foobar')
visit article_path(article)
click_button I18n.t('common.actions.to_cart')
page.html.must_include I18n.t('line_item.notices.success_create', href: '/carts/1').html_safe
click_link(I18n.t('header.cart.title', count: 1), match: :first)
page.must_have_content 'foobar'
page.must_have_content 'Die Artikel als Merkliste per E-Mail versenden'

click_link('Die Artikel als Merkliste per E-Mail versenden', match: :first)
page.must_have_content 'Als Merkliste per E-Mail versenden'
page.html.must_include 'Jetzt versenden'

page.fill_in 'email_email', with: 'test@test.com'
click_button 'Jetzt versenden'
end
end
end
13 changes: 12 additions & 1 deletion test/mailers/cart_mailer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
include EmailSpec::Matchers

it 'sends email to seller' do
seller_line_item_group = FactoryGirl.create(:line_item_group, :with_business_transactions, :sold)
seller_line_item_group = FactoryGirl.create(:line_item_group, :with_business_transactions, :sold, create_line_items: true)
user = seller_line_item_group.seller
mail = CartMailer.seller_email(seller_line_item_group)
mail.must deliver_to(user.email)
Expand Down Expand Up @@ -87,4 +87,15 @@
mail.must have_body_text 'werden von dem/der Käufer*in überwiesen'
end
end

describe '#send_cart' do
it 'sends open cart to specified email address' do
cart = FactoryGirl.create :cart
addr = 'test@test.com'
mail = CartMailer.send_cart(cart.id, addr)

mail.must deliver_to(addr)
mail.must have_subject('[Fairmondo] Deine vorgemerkten Artikel auf Fairmondo')
end
end
end
Loading

0 comments on commit 40d84ed

Please sign in to comment.