diff --git a/app/assets/stylesheets/admin.css.scss b/app/assets/stylesheets/admin.css.scss index 416dc66..553f727 100755 --- a/app/assets/stylesheets/admin.css.scss +++ b/app/assets/stylesheets/admin.css.scss @@ -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; +} diff --git a/app/assets/stylesheets/public/need.scss b/app/assets/stylesheets/public/need.scss index 6151d45..f774563 100755 --- a/app/assets/stylesheets/public/need.scss +++ b/app/assets/stylesheets/public/need.scss @@ -38,7 +38,7 @@ background-color:#f0ad4e; } .offer{ - + position: relative; padding:20px; height:100px; @@ -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; diff --git a/app/controllers/admin/accepted_offers_controller.rb b/app/controllers/admin/accepted_offers_controller.rb new file mode 100755 index 0000000..e753c0f --- /dev/null +++ b/app/controllers/admin/accepted_offers_controller.rb @@ -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 diff --git a/app/controllers/admin/offers_controller.rb b/app/controllers/admin/offers_controller.rb index 087fdad..3d2645d 100755 --- a/app/controllers/admin/offers_controller.rb +++ b/app/controllers/admin/offers_controller.rb @@ -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 diff --git a/app/controllers/public/accepted_offers_controller.rb b/app/controllers/public/accepted_offers_controller.rb new file mode 100755 index 0000000..bf3a7fa --- /dev/null +++ b/app/controllers/public/accepted_offers_controller.rb @@ -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 diff --git a/app/models/accepted_offer.rb b/app/models/accepted_offer.rb index 5c612e9..51aeec9 100755 --- a/app/models/accepted_offer.rb +++ b/app/models/accepted_offer.rb @@ -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 diff --git a/app/uploaders/devis_uploader.rb b/app/uploaders/devis_uploader.rb index b59dda7..aad367b 100755 --- a/app/uploaders/devis_uploader.rb +++ b/app/uploaders/devis_uploader.rb @@ -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 diff --git a/app/views/admin/offers/_offer.html.haml b/app/views/admin/offers/_offer.html.haml index fd7eb5c..1334256 100755 --- a/app/views/admin/offers/_offer.html.haml +++ b/app/views/admin/offers/_offer.html.haml @@ -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) diff --git a/app/views/admin/offers/accepted.html.haml b/app/views/admin/offers/accepted.html.haml index 4472b49..ed0b93b 100755 --- a/app/views/admin/offers/accepted.html.haml +++ b/app/views/admin/offers/accepted.html.haml @@ -1,5 +1,5 @@ %h1 - = "Liste des clients intéressés par le besoin " + = "Gestion des offres par client pour le besoin " = @offer.need.title @@ -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 diff --git a/app/views/admin/offers/index.html.haml b/app/views/admin/offers/index.html.haml index 2d20b8b..6af0cdb 100755 --- a/app/views/admin/offers/index.html.haml +++ b/app/views/admin/offers/index.html.haml @@ -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" diff --git a/app/views/public/my_account/index.html.haml b/app/views/public/my_account/index.html.haml index 73c4553..986e77b 100755 --- a/app/views/public/my_account/index.html.haml +++ b/app/views/public/my_account/index.html.haml @@ -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' diff --git a/app/views/public/needs/_accepted_offer.html.haml b/app/views/public/needs/_accepted_offer.html.haml index 917b0e4..32492e0 100755 --- a/app/views/public/needs/_accepted_offer.html.haml +++ b/app/views/public/needs/_accepted_offer.html.haml @@ -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 diff --git a/app/views/public/needs/show.html.haml b/app/views/public/needs/show.html.haml index 9a64c58..a8bff4a 100755 --- a/app/views/public/needs/show.html.haml +++ b/app/views/public/needs/show.html.haml @@ -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 diff --git a/config/routes.rb b/config/routes.rb index fa0b276..ccf186f 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -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