Accepted Offers flow
This commit is contained in:
parent
927a348c5a
commit
a018c87cef
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
58
app/controllers/admin/accepted_offers_controller.rb
Executable file
58
app/controllers/admin/accepted_offers_controller.rb
Executable 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
|
@ -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
|
||||
|
21
app/controllers/public/accepted_offers_controller.rb
Executable file
21
app/controllers/public/accepted_offers_controller.rb
Executable 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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
= 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
|
||||
Pas encore acceptée
|
||||
\-
|
||||
%td{style:"text-align:center"}
|
||||
-if accepted_offer
|
||||
=accepted_offer.human_admin_state
|
||||
|
||||
-else
|
||||
Offre pas encore acceptée
|
||||
|
||||
:javascript
|
||||
|
@ -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"}
|
||||
|
||||
|
||||
@ -47,7 +54,7 @@
|
||||
|
||||
=render @offers
|
||||
|
||||
.pagination.pull-right= paginate @offers
|
||||
.pagination.pull-right= paginate @offers
|
||||
.col-md-2
|
||||
-if @need
|
||||
=link_to "Ajouter une offre", new_admin_need_offer_path(@need),class:"btn btn-primary btn-block"
|
||||
|
@ -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'
|
||||
|
@ -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
|
||||
|
@ -106,14 +106,20 @@
|
||||
=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 "
|
||||
-else
|
||||
.offer-accepted
|
||||
=i(:"check") + " Offre Acceptée"
|
||||
|
||||
-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 "
|
||||
.my-account-link
|
||||
Consulter vos offres depuis la rubrique
|
||||
=link_to "Mon compte", public_my_account_path
|
||||
-else
|
||||
.offer-accepted
|
||||
=i(:"check") + " Offre Acceptée"
|
||||
|
||||
.offer-not-aceptable
|
||||
Vous n'êtes pas intéressé
|
||||
|
||||
|
||||
.clear
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user