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

@ -56,8 +56,18 @@
font-size:30px;
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;
float:right;
@ -65,6 +75,16 @@
font-size:20px;
font-weight:bold;
}
.my-account-link{
display:inline-block;
color:#3C763D;
font-size:10px;
float:right;
position:absolute;
right:10px;
bottom:0 ;
}
.price{
display:inline;
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
def upload_devis
@accepted_offer = AcceptedOffer.find(params[:id])
@accepted_offer.devis = params[:devis]
@accepted_offer.save
redirect_back_or_default :root
end
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'
"En attente de réception du devis signé"
when 'devis_received'
"Devis signé et reçu"
"Devis reçu et signé"
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

View File

@ -2,50 +2,23 @@
class DevisUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
# include CarrierWave::MiniMagick
include Rails.application.routes.url_helpers
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def filename
"Devis-#{model.offer.need.title}-pour-#{model.customer.organisation}.#{file.extension}" if original_filename.present?
end
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
"#{Rails.root}/private_medias/devis/#{model.id}"
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
%w(pdf doc docx)
%w(pdf)
end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
def url
download_admin_offer_accepted_offer_path(model.offer, model)
end
end

View File

@ -7,12 +7,18 @@
%td
=number_to_currency(offer.price, locale: :fr)
%td{style:"text-align:center;font-weight:bold;color:#3C763D;"}
=link_to i(:"cog") + " " + offer.customers.count.to_s + " / " + offer.need.wishes.length.to_s, accepted_admin_offer_path(offer)
%td{style:"text-align:center;font-weight:bold;"}
= 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"}
-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(:pencil), edit_admin_need_offer_path(@need, offer)
-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(:pencil), edit_admin_offer_path(offer)

View File

@ -1,5 +1,5 @@
%h1
= "Liste des clients intéressés par le besoin "
= "Gestion des offres par client pour le besoin "
<strong>
= @offer.need.title
</strong>
@ -38,11 +38,17 @@
Email
%th{style:"text-align:center"}
Offre acceptée?
%th{style:"text-align:center"}
Devis
%th{style:"text-align:center"}
État
%tbody.rows
-@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
-if wish.customer.organisation
=wish.customer.organisation
@ -55,13 +61,36 @@
-if wish.customer.email
= link_to i("envelope-o") + " #{wish.customer.email}", 'mailto:' + wish.customer.email
%td{style:"text-align:center"}
-accepted_offer = @offer.accepted_offers.where(customer_id: wish.customer.id).first
-if accepted_offer
=i(:"check") + " Acceptée"
-else
\-
%td{style:"text-align:center"}
-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
Pas encore acceptée
= 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
\-
%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
%strong Gestion des besoins
puis cliquer sur le bouton
%strong= i(:gift)
%strong= ic(:gift)
en face du besoin de votre choix.
-if @offers.length < 1
Aucune offre actuellement
-if @need
%br
%br
=link_to "Ajouter une offre", new_admin_need_offer_path(@need),class:"btn btn-primary"
%br
-else
.row
@ -33,13 +38,15 @@
%tr
%th
Besoin
Besoin concerné par l'offre
%th
Fournisseur
%th
Prix négocié
%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"}
&nbsp;

View File

@ -50,7 +50,9 @@
Mes offres acceptées
%div.alert.alert-info
%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
=render "public/needs/accepted_offers_index", accepted_offers: @accepted_offers
@ -60,15 +62,16 @@
Vous n'avez pas encore accepté d'offre
.padding.center.white
%h3
Ma liste de souhait
Mes besoins
%div.alert.alert-info
%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
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
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
=render "public/needs/wishes_index", wishes: @wishes
.pagination= paginate @wishes , param_name: 'page_wishes'

View File

@ -15,3 +15,7 @@
%td{style: 'text-align:center'}
=accepted_offer.human_state
%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,7 +106,7 @@
=number_to_currency(offer.price, locale: :fr)
.supplier{style: "position:absolute;bottom:-5px;"}
="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 "
@ -114,6 +114,12 @@
.offer-accepted
=i(:"check") + " Offre Acceptée"
.my-account-link
Consulter vos offres depuis la rubrique
=link_to "Mon compte", public_my_account_path
-else
.offer-not-aceptable
Vous n'êtes pas intéressé
.clear

View File

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