Accepted Offers flow

This commit is contained in:
Nicolas VARROT 2016-03-03 22:26:04 +01:00
parent 927a348c5a
commit a018c87cef
14 changed files with 239 additions and 70 deletions

View File

@ -983,3 +983,24 @@ h3{
} }
} }
.btn-file {
position: relative;
overflow: hidden;
}
.btn-file input[type=file] {
position: absolute;
top: 0;
right: 0;
min-width: 100%;
min-height: 100%;
font-size: 100px;
text-align: right;
filter: alpha(opacity=0);
opacity: 0;
outline: none;
background: white;
cursor: inherit;
display: block;
}

View File

@ -38,7 +38,7 @@
background-color:#f0ad4e; background-color:#f0ad4e;
} }
.offer{ .offer{
position: relative; position: relative;
padding:20px; padding:20px;
height:100px; height:100px;
@ -56,8 +56,18 @@
font-size:30px; font-size:30px;
font-weight:bold; font-weight:bold;
} }
.offer-accepted{ .offer-not-aceptable{
display:inline-block;
float:right;
color:#B84442;
font-size:20px;
font-weight:bold;
}
.offer-accepted{
display:inline-block; display:inline-block;
float:right; float:right;
@ -65,6 +75,16 @@
font-size:20px; font-size:20px;
font-weight:bold; font-weight:bold;
} }
.my-account-link{
display:inline-block;
color:#3C763D;
font-size:10px;
float:right;
position:absolute;
right:10px;
bottom:0 ;
}
.price{ .price{
display:inline; display:inline;
font-size:25px; font-size:25px;

View File

@ -0,0 +1,58 @@
class Admin::AcceptedOffersController < ApplicationController
layout "admin"
before_filter :auth_admin
def upload_devis
@accepted_offer = AcceptedOffer.find(params[:id])
if !params[:devis]
flash[:error] = "Vous devez sélectionner un fichier"
else
@accepted_offer.devis = params[:devis]
if @accepted_offer.save
@accepted_offer.state = :devis_available
@accepted_offer.save
else
flash[:error] = "Impossible de charger le devis"
end
end
redirect_back_or_default :root
end
def download
@accepted_offer = AcceptedOffer.find(params[:id])
send_file @accepted_offer.devis.file.path
end
def delete
@accepted_offer = AcceptedOffer.find(params[:id])
@accepted_offer.remove_devis!
@accepted_offer.state = :waiting_devis
@accepted_offer.save
flash[:notice] = "Devis supprimé"
redirect_back_or_default :root
end
def received
@accepted_offer = AcceptedOffer.find(params[:id])
@accepted_offer.state = :devis_received
@accepted_offer.save
flash[:notice] = "Devis marqué comme reçu et signé"
redirect_back_or_default :root
end
end

View File

@ -119,12 +119,7 @@ class Admin::OffersController < ApplicationController
end end
def upload_devis
@accepted_offer = AcceptedOffer.find(params[:id])
@accepted_offer.devis = params[:devis]
@accepted_offer.save
redirect_back_or_default :root
end
private private

View File

@ -0,0 +1,21 @@
class Public::AcceptedOffersController < ApplicationController
layout "public"
before_filter :auth_customer
def download_devis
@accepted_offer = AcceptedOffer.find(params[:id])
if(@accepted_offer.customer.id != current_customer.id)
flash[:error] = "Vous n'avez pas la permission de télécharger ce devis"
redirect_back_or_default :root
else
@accepted_offer.state = :devis_downloaded
@accepted_offer.save
send_file @accepted_offer.devis.file.path
end
end
end

View File

@ -32,8 +32,20 @@ class AcceptedOffer < ActiveRecord::Base
when 'devis_downloaded' when 'devis_downloaded'
"En attente de réception du devis signé" "En attente de réception du devis signé"
when 'devis_received' when 'devis_received'
"Devis signé et reçu" "Devis reçu et signé"
end end
end end
def human_admin_state
case state
when 'waiting_devis'
"En attente de création du devis"
when 'devis_available'
"Devis disponible pour le client mais pas encore téléchargé"
when 'devis_downloaded'
"Dévis téléchargé par le client, en attente de réception du devis signé"
when 'devis_received'
"Devis reçu et signé"
end
end
end end

View File

@ -2,50 +2,23 @@
class DevisUploader < CarrierWave::Uploader::Base class DevisUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support: include Rails.application.routes.url_helpers
# include CarrierWave::RMagick
# include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored. def filename
# This is a sensible default for uploaders that are meant to be mounted: "Devis-#{model.offer.need.title}-pour-#{model.customer.organisation}.#{file.extension}" if original_filename.present?
end
def store_dir def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" "#{Rails.root}/private_medias/devis/#{model.id}"
end end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url
# # For Rails 3.1+ asset pipeline compatibility:
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
#
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
# process :scale => [200, 300]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
# version :thumb do
# process :resize_to_fit => [50, 50]
# end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list def extension_white_list
%w(pdf doc docx) %w(pdf)
end end
# Override the filename of the uploaded files: def url
# Avoid using model.id or version_name here, see uploader/store.rb for details. download_admin_offer_accepted_offer_path(model.offer, model)
# def filename end
# "something.jpg" if original_filename
# end
end end

View File

@ -7,12 +7,18 @@
%td %td
=number_to_currency(offer.price, locale: :fr) =number_to_currency(offer.price, locale: :fr)
%td{style:"text-align:center;font-weight:bold;color:#3C763D;"} %td{style:"text-align:center;font-weight:bold;"}
=link_to i(:"cog") + " " + offer.customers.count.to_s + " / " + offer.need.wishes.length.to_s, accepted_admin_offer_path(offer) = ic(:"hand-paper-o") + " " + offer.need.wishes.length.to_s
%td{style:"text-align:center;font-weight:bold;"}
= ic(:"check") + " " + offer.customers.count.to_s
%td.actions{:style => "width:150px;text-align:right"} %td.actions{:style => "width:150px;text-align:right"}
-if @need -if @need
= link_to i(:"cog"), accepted_admin_offer_path(offer), title: "Gérer les offres par client"
= link_to i(:"trash"), [:admin,@need, offer], :data => {:confirm => 'Voulez-vous vraiment supprimer cette offre ?'}, :method => :delete = link_to i(:"trash"), [:admin,@need, offer], :data => {:confirm => 'Voulez-vous vraiment supprimer cette offre ?'}, :method => :delete
= link_to i(:pencil), edit_admin_need_offer_path(@need, offer) = link_to i(:pencil), edit_admin_need_offer_path(@need, offer)
-else -else
= link_to i(:"cog"), accepted_admin_offer_path(offer), title: "Gérer les offres par client"
= link_to i(:"trash"), [:admin, offer], :data => {:confirm => 'Voulez-vous vraiment supprimer cette offre ?'}, :method => :delete = link_to i(:"trash"), [:admin, offer], :data => {:confirm => 'Voulez-vous vraiment supprimer cette offre ?'}, :method => :delete
= link_to i(:pencil), edit_admin_offer_path(offer) = link_to i(:pencil), edit_admin_offer_path(offer)

View File

@ -1,5 +1,5 @@
%h1 %h1
= "Liste des clients intéressés par le besoin " = "Gestion des offres par client pour le besoin "
<strong> <strong>
= @offer.need.title = @offer.need.title
</strong> </strong>
@ -38,11 +38,17 @@
Email Email
%th{style:"text-align:center"} %th{style:"text-align:center"}
Offre acceptée? Offre acceptée?
%th{style:"text-align:center"}
Devis
%th{style:"text-align:center"} %th{style:"text-align:center"}
État État
%tbody.rows %tbody.rows
-@offer.need.wishes.each do |wish| -@offer.need.wishes.each do |wish|
%tr -accepted_offer = @offer.accepted_offers.where(customer_id: wish.customer.id).first
-if accepted_offer && accepted_offer.devis_received?
-class_name = "success"
%tr{class: class_name}
%td %td
-if wish.customer.organisation -if wish.customer.organisation
=wish.customer.organisation =wish.customer.organisation
@ -55,13 +61,36 @@
-if wish.customer.email -if wish.customer.email
= link_to i("envelope-o") + " #{wish.customer.email}", 'mailto:' + wish.customer.email = link_to i("envelope-o") + " #{wish.customer.email}", 'mailto:' + wish.customer.email
%td{style:"text-align:center"} %td{style:"text-align:center"}
-accepted_offer = @offer.accepted_offers.where(customer_id: wish.customer.id).first
-if accepted_offer -if accepted_offer
=i(:"check") + " Acceptée" =i(:"check") + " Acceptée"
-else -else
\- \-
%td{style:"text-align:center"} %td{style:"text-align:center"}
-if accepted_offer -if accepted_offer
=accepted_offer.human_state
-if accepted_offer.devis?
-if accepted_offer.devis_downloaded?
=link_to "Reçu et signé", received_admin_offer_accepted_offer_path(@offer, accepted_offer), :data => {:confirm => 'Voulez-vous vraiment marquer le devis comme reçu et signé ?'}, style:"display:inline-block", class: "btn btn-success btn-sm"
=link_to "Télécharger le devis", accepted_offer.devis.url, style:"display:inline-block", class: "btn btn-primary btn-sm"
=link_to "Supprimer le devis", delete_admin_offer_accepted_offer_path(@offer, accepted_offer), style:"display:inline-block", class: "btn btn-danger btn-sm"
-else
= form_tag upload_devis_admin_offer_accepted_offer_path(@offer, accepted_offer), name: :devis, method: :post, multipart: true do
%span.btn.btn-default.btn-file
="..."
= file_field_tag :devis
= submit_tag("Charger" , class:"btn btn-primary")
-else -else
Pas encore acceptée \-
%td{style:"text-align:center"}
-if accepted_offer
=accepted_offer.human_admin_state
-else
Offre pas encore acceptée
:javascript

View File

@ -19,11 +19,16 @@
Pour créer une offre, il faut d'abord choisir un besoin. Pour cela, passer par l'onglet Pour créer une offre, il faut d'abord choisir un besoin. Pour cela, passer par l'onglet
%strong Gestion des besoins %strong Gestion des besoins
puis cliquer sur le bouton puis cliquer sur le bouton
%strong= i(:gift) %strong= ic(:gift)
en face du besoin de votre choix. en face du besoin de votre choix.
-if @offers.length < 1 -if @offers.length < 1
Aucune offre actuellement Aucune offre actuellement
-if @need
%br
%br
=link_to "Ajouter une offre", new_admin_need_offer_path(@need),class:"btn btn-primary"
%br
-else -else
.row .row
@ -33,13 +38,15 @@
%tr %tr
%th %th
Besoin Besoin concerné par l'offre
%th %th
Fournisseur Fournisseur
%th %th
Prix négocié Prix négocié
%th{style:"text-align:center;"} %th{style:"text-align:center;"}
Offres acceptées / Intéressés Clients Intéressés
%th{style:"text-align:center;"}
Offres Acceptées
%th{:style => "width:100px"} %th{:style => "width:100px"}
&nbsp; &nbsp;
@ -47,7 +54,7 @@
=render @offers =render @offers
.pagination.pull-right= paginate @offers .pagination.pull-right= paginate @offers
.col-md-2 .col-md-2
-if @need -if @need
=link_to "Ajouter une offre", new_admin_need_offer_path(@need),class:"btn btn-primary btn-block" =link_to "Ajouter une offre", new_admin_need_offer_path(@need),class:"btn btn-primary btn-block"

View File

@ -50,7 +50,9 @@
Mes offres acceptées Mes offres acceptées
%div.alert.alert-info %div.alert.alert-info
%p %p
Voici la liste de toutes les offres que vous avez acceptées Voici la liste de toutes les offres que vous avez acceptées. C'est ici que vous pouvez télécharger les devis quand ils sont disponibles.
%p
Une fois le devis téléchargé, vous devez nous le renvoyer signé.
-if @accepted_offers.length > 0 -if @accepted_offers.length > 0
=render "public/needs/accepted_offers_index", accepted_offers: @accepted_offers =render "public/needs/accepted_offers_index", accepted_offers: @accepted_offers
@ -60,15 +62,16 @@
Vous n'avez pas encore accepté d'offre Vous n'avez pas encore accepté d'offre
.padding.center.white .padding.center.white
%h3 %h3
Ma liste de souhait Mes besoins
%div.alert.alert-info %div.alert.alert-info
%p %p
Votre liste de souhait comprend tout les besoins pour lesquels vous avez signalé un intérêt. Votre liste de besoins comprend tout les besoins pour lesquels vous avez signalé un intérêt.
%p %p
Signaler votre intérêt vous permet d'acceder à des offres intéressantes si nous décidons de négocier ce besoin auprès de nos fournisseurs. Signaler votre intérêt vous permet d'acceder à des offres intéressantes si nous décidons par la suite de négocier ce besoin auprès de nos fournisseurs.
%p %p
Signaler un intérêt ne vous engage en rien, vous serez engagé seulement après avoir accepté une offre de notre part. Signaler un intérêt ne vous engage en rien, vous serez engagé seulement après avoir accepté une offre que nous vous proposons.
%p
Remarque: Vous pouvez signaler/supprimer un intérêt pour un besoin uniquement quand celui-ci est en sondage.
-if @wishes.length > 0 -if @wishes.length > 0
=render "public/needs/wishes_index", wishes: @wishes =render "public/needs/wishes_index", wishes: @wishes
.pagination= paginate @wishes , param_name: 'page_wishes' .pagination= paginate @wishes , param_name: 'page_wishes'

View File

@ -15,3 +15,7 @@
%td{style: 'text-align:center'} %td{style: 'text-align:center'}
=accepted_offer.human_state =accepted_offer.human_state
%td{style: 'text-align:right'} %td{style: 'text-align:right'}
-if accepted_offer.devis?
=link_to i(:"download") + " Télécharger", download_devis_public_accepted_offer_path(accepted_offer), class: "btn btn-primary"
-else
Pas encore disponible

View File

@ -106,14 +106,20 @@
=number_to_currency(offer.price, locale: :fr) =number_to_currency(offer.price, locale: :fr)
.supplier{style: "position:absolute;bottom:-5px;"} .supplier{style: "position:absolute;bottom:-5px;"}
="Avec #{offer.supplier}" ="Avec #{offer.supplier}"
-if offer.need.customers.include?(current_customer)
-if !offer.customers.include?(current_customer)
.accept-offer
=link_to i(:"check") + " Accepter l'offre", accept_public_need_offer_path(@need, offer), data: {confirm: "Voulez-vous vraiment accepter cette offre ? Attention, cette action vous engage à payer la somme proposée."}, class: "btn btn-lg btn-success "
-else
.offer-accepted
=i(:"check") + " Offre Acceptée"
-if !offer.customers.include?(current_customer) .my-account-link
.accept-offer Consulter vos offres depuis la rubrique
=link_to i(:"check") + " Accepter l'offre", accept_public_need_offer_path(@need, offer), data: {confirm: "Voulez-vous vraiment accepter cette offre ? Attention, cette action vous engage à payer la somme proposée."}, class: "btn btn-lg btn-success " =link_to "Mon compte", public_my_account_path
-else -else
.offer-accepted .offer-not-aceptable
=i(:"check") + " Offre Acceptée" Vous n'êtes pas intéressé
.clear .clear

View File

@ -88,7 +88,11 @@ Rails.application.routes.draw do
get 'my_account/my_annonces', :as => "my_annonces" get 'my_account/my_annonces', :as => "my_annonces"
get 'my_account/reconfirm', :as => "reconfirm_email" get 'my_account/reconfirm', :as => "reconfirm_email"
resources :accepted_offers do
member do
get :download_devis
end
end
resources :needs do resources :needs do
resources :messages resources :messages
resources :offers do resources :offers do
@ -262,6 +266,16 @@ Rails.application.routes.draw do
end end
end end
resources :offers do resources :offers do
resources :accepted_offers do
member do
post :upload_devis
get :download
get :delete
get :received
end
end
member do member do
get :accepted get :accepted
end end