From 1c6c9ff59678c8d32e09e08709db07232528f2d3 Mon Sep 17 00:00:00 2001 From: Nicolas Bally Date: Wed, 27 Sep 2017 12:06:13 +0200 Subject: [PATCH] suite commandes --- .../admin/product_orders_controller.rb | 74 ++++++ .../public/product_orders_controller.rb | 36 +-- app/mailers/product_orders_mails.rb | 28 +++ app/models/customer.rb | 7 + app/models/particular.rb | 43 ++++ app/models/product_order.rb | 76 +++++- app/models/product_order_product.rb | 8 + app/views/admin/particulars/_form.html.haml | 19 ++ .../admin/particulars/_particular.html.haml | 17 ++ .../product_orders/_product_order.html.haml | 2 +- app/views/admin/product_orders/bl.html.haml | 229 ++++++++++++++++++ app/views/admin/product_orders/show.html.haml | 2 + .../confirmation_cb.html.haml | 14 ++ .../confirmation_cheque.html.haml | 13 + .../public/particulars/_particular.html.haml | 19 ++ .../product_orders/_mail_recap.html.haml | 46 ++-- .../product_orders/_particular_form.html.haml | 6 +- .../product_orders/particulars.html.haml | 14 +- .../payment_instructions.html.haml | 14 +- .../product_orders/select_payment.html.haml | 56 ++--- app/views/public/products/index.html.haml | 2 +- config/routes.rb | 2 + .../20151208173913_create_particulars.rb | 29 +++ ...60308182022_add_civilite_to_particulars.rb | 5 + ...747_add_ogone_to_product_order_payments.rb | 19 ++ ...70927080645_add_particular_to_customers.rb | 37 +++ ...20170927093622_add_bl_to_product_orders.rb | 7 + db/schema.rb | 52 +++- pdf/bl/BL_13.pdf | 0 pdf/bl/BL_13_temp.pdf | Bin 0 -> 15160 bytes pdf_stamp/bl.pdf | Bin 0 -> 9907 bytes 31 files changed, 775 insertions(+), 101 deletions(-) create mode 100755 app/mailers/product_orders_mails.rb create mode 100644 app/models/particular.rb create mode 100644 app/views/admin/particulars/_form.html.haml create mode 100644 app/views/admin/particulars/_particular.html.haml create mode 100644 app/views/admin/product_orders/bl.html.haml create mode 100755 app/views/product_orders_mails/confirmation_cb.html.haml create mode 100755 app/views/product_orders_mails/confirmation_cheque.html.haml create mode 100644 app/views/public/particulars/_particular.html.haml create mode 100644 db/migrate/20151208173913_create_particulars.rb create mode 100644 db/migrate/20160308182022_add_civilite_to_particulars.rb create mode 100644 db/migrate/20160821203747_add_ogone_to_product_order_payments.rb create mode 100644 db/migrate/20170927080645_add_particular_to_customers.rb create mode 100644 db/migrate/20170927093622_add_bl_to_product_orders.rb create mode 100644 pdf/bl/BL_13.pdf create mode 100644 pdf/bl/BL_13_temp.pdf create mode 100644 pdf_stamp/bl.pdf diff --git a/app/controllers/admin/product_orders_controller.rb b/app/controllers/admin/product_orders_controller.rb index 7f86e45..bb4c5a0 100755 --- a/app/controllers/admin/product_orders_controller.rb +++ b/app/controllers/admin/product_orders_controller.rb @@ -166,6 +166,80 @@ class Admin::ProductOrdersController < ApplicationController flash[:notice] = "La commande à bien été supprimée." end + + def bl + @product_order = ProductOrder.find(params[:id]) + if !@product_order.bl_number? + @product_order.generate_bl_number + end + if @product_order.bl_number? + + + + @temp_file = "#{Rails.root}/pdf/bl/BL_#{@product_order.id}_temp.pdf" + @final_file = "#{Rails.root}/pdf/bl/BL_#{@product_order.id}.pdf" + + + view = ActionView::Base.new(Rails.root.join('app/views')) + view.class.include ApplicationHelper + view.class.include Rails.application.routes.url_helpers + + pdf = view.render( + :pdf => "#{@product_order.id}", + :template => "admin/product_orders/bl.html.haml", + + :locals => {:@product_order => @product_order}) + + # then save to a file + pdf = WickedPdf.new.pdf_from_string(pdf, :margin => { top: 0, # default 10 (mm) + bottom: 0, + left: 0, + right: 0 }) + + save_path = @temp_file + File.open(save_path, 'wb') do |file| + file << pdf + end + + + + + require 'posix/spawn' + + ::POSIX::Spawn::Child.new 'pdftk', @temp_file, 'background', Rails.root.join('pdf_stamp', 'bl.pdf').to_s, 'output', @final_file + + #pdftk /Users/nico/Desktop/Sanstitre4.pdf background /Users/nico/Dev/negos_app/pdf_stamp/bl.pdf output sortie.pdf + + + + + + @data_to_send = File.open( @final_file).read + + send_data @data_to_send, :filename =>"bl.pdf" , :type => 'application/pdf',:disposition => (params[:inline] ? 'inline' : "attachment") + + + + + + + + else + render :inline => "Aucun BL disponnible" + end + + + end + + + + + + + + + + protected diff --git a/app/controllers/public/product_orders_controller.rb b/app/controllers/public/product_orders_controller.rb index f4e91cb..8059513 100755 --- a/app/controllers/public/product_orders_controller.rb +++ b/app/controllers/public/product_orders_controller.rb @@ -40,12 +40,12 @@ class Public::ProductOrdersController < ApplicationController redirect_to new_public_product_order_path(:paid => true) else @product_order.customer = current_customer - #@product_order.product_customer.particular_bill.skip_validation = true - #@product_order.product_customer.particular_send.skip_validation = true + @product_order.customer.particular_bill.skip_validation = true + @product_order.customer.particular_send.skip_validation = true @product_order.save - #@product_order.product_customer.particular_bill.skip_validation = false + @product_order.customer.particular_bill.skip_validation = false @product_order.product_order_payment_type_ok_id = 3 if !@product_order.product_order_payment_type_ok_id? end @@ -54,27 +54,27 @@ class Public::ProductOrdersController < ApplicationController def particulars_save @product_order = ProductOrder.find(session[:product_order_id]) - #@product_order.product_customer.particular_bill.skip_validation = false - #@product_order.product_customer.particular_bill.skip_email = true + @product_order.customer.particular_bill.skip_validation = false + @product_order.customer.particular_bill.skip_email = true if !@product_order.particular_idem - @product_order.product_customer.particular_send.skip_validation = false - @product_order.product_customer.particular_send.skip_email = true + @product_order.customer.particular_send.skip_validation = false + @product_order.customer.particular_send.skip_email = true end if @product_order.update_attributes(params.require(:product_order).permit!) - @product_order.particular_bill = @product_order.product_customer.particular_bill.dup + @product_order.particular_bill = @product_order.customer.particular_bill.dup - @product_order.particular_idem = @product_order.product_customer.particular_idem + @product_order.particular_idem = @product_order.customer.particular_idem if @product_order.particular_idem - @product_order.particular_send = @product_order.product_customer.particular_bill.dup + @product_order.particular_send = @product_order.customer.particular_bill.dup else - @product_order.product_customer.particular_send.skip_validation = false - @product_order.product_customer.particular_send.skip_email = true + @product_order.customer.particular_send.skip_validation = false + @product_order.customer.particular_send.skip_email = true - @product_order.particular_send = @product_order.product_customer.particular_send.dup + @product_order.particular_send = @product_order.customer.particular_send.dup end @product_order.save @@ -133,7 +133,7 @@ class Public::ProductOrdersController < ApplicationController @product_order = ProductOrder.find(session[:product_order_id]) @product_order.archive_now if !@product_order.product_order_payment_type_ok_id? - @product_order.product_order_payment_type_ok_id = 3 + @product_order.product_order_payment_type_ok_id = 10 end @product_order.force_payment = true @@ -170,7 +170,7 @@ class Public::ProductOrdersController < ApplicationController if @product_order.product_order_payment_type_ok_id == 3 redirect_to paid_by_ogone_public_product_orders_path() else - if @product_order.product_order_payment_type_ok_id == 1 + if @product_order.product_order_payment_type_ok_id == 10 @product_order_payment = ProductOrderPayment.create(:product_order_payment_type_id => @product_order.product_order_payment_type_ok_id) @product_order.product_order_payments << @product_order_payment @product_order.product_order_payment_ok = @product_order_payment @@ -277,7 +277,7 @@ class Public::ProductOrdersController < ApplicationController puts "AAAAAAAAAAAAAA" options = { :amount => @product_order.total_ttc.to_i, - :email => @product_order.product_customer.email , + :email => @product_order.customer.email , :first_name => @product_order.particular_bill.firstname, :last_name => @product_order.particular_bill.name, :return_url => "http://#{HOSTNAME}"+paid_by_payplug_confirm_public_product_orders_path(:token => @product_order_payment.token), @@ -472,8 +472,8 @@ class Public::ProductOrdersController < ApplicationController @product_order_payment.save @product_order.product_order_payment_ok = @product_order_payment if @product_order.paid - @product_order.product_customer.particular_bill.skip_email = true - @product_order.product_customer.particular_send.skip_email = true + @product_order.customer.particular_bill.skip_email = true + @product_order.customer.particular_send.skip_email = true @product_order.save(:validate => false) @product_order.after_paid diff --git a/app/mailers/product_orders_mails.rb b/app/mailers/product_orders_mails.rb new file mode 100755 index 0000000..2d2d527 --- /dev/null +++ b/app/mailers/product_orders_mails.rb @@ -0,0 +1,28 @@ +# -*- encoding : utf-8 -*- +class ProductOrdersMails < ActionMailer::Base + layout 'mail' + + default from: "Negos - contact@negos.pro" + + + def confirmation_cheque(product_order, options = {}) + @options = options + @product_order = product_order + @email = @product_order.customer.email + @title = "Merci pour votre commande." + mail(:to => @email, :bcc => "info@nicolasbally.com", :subject => @title) + end + + def confirmation_cb(product_order, options = {}) + @options = options + @product_order = product_order + @email = @product_order.customer.email + @title = "Merci pour votre commande." + mail(:to => @email, :bcc => "info@nicolasbally.com", :subject => @title) + end + + + + + +end diff --git a/app/models/customer.rb b/app/models/customer.rb index 99c4951..bb184aa 100755 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,5 +1,12 @@ class Customer < ActiveRecord::Base + belongs_to :particular_bill, :class_name => "Particular" + + accepts_nested_attributes_for :particular_bill + + belongs_to :particular_send, :class_name => "Particular" + + accepts_nested_attributes_for :particular_send diff --git a/app/models/particular.rb b/app/models/particular.rb new file mode 100644 index 0000000..054c98a --- /dev/null +++ b/app/models/particular.rb @@ -0,0 +1,43 @@ +class Particular < ActiveRecord::Base + + belongs_to :owner, :polymorphic => true + validates :name, :presence => true, :if => :force_validation + validates :firstname, :presence => true, :if => :force_validation + validates :email, :presence => true, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, :if => :force_email_validation + validates :address_2, :presence => true, :if => :force_validation + validates :cp, :presence => true, :if => :force_validation + validates :city, :presence => true, :if => :force_validation + validates :country, :presence => true, :if => :force_validation + validates :tel, :presence => true, :if => :force_validation + validates :organisation, :presence => true, :if => :validate_pro + attr_accessor :validate_email, :skip_email + def validate_pro + true if self.force_validation and self.pro + end + def force_email_validation + true if (self.validate_email or self.force_validation) and !skip_email + end + def force_validation + + if self.skip_validation + false + else + true + end + end + + def address_longue + address_2.to_s + " " + address_3.to_s + end + + def civilite_prodons + if self.civilite == "M" + "MONSIEUR" + elsif self.civilite == "Mme" + "MADAME" + else + "" + end + end + +end diff --git a/app/models/product_order.rb b/app/models/product_order.rb index 7371510..8b99d0c 100755 --- a/app/models/product_order.rb +++ b/app/models/product_order.rb @@ -1,6 +1,5 @@ class ProductOrder < ActiveRecord::Base - belongs_to :customer has_many :product_order_products @@ -15,9 +14,9 @@ class ProductOrder < ActiveRecord::Base accepts_nested_attributes_for :particular_send - belongs_to :product_customer + belongs_to :customer - accepts_nested_attributes_for :product_customer + accepts_nested_attributes_for :customer belongs_to :product_fdp belongs_to :product_fdp_archived, :class_name => "ProductFdp" @@ -77,6 +76,14 @@ class ProductOrder < ActiveRecord::Base def total_ttc + total_ht + total_tva + end + + def total_tva + total_articles_tva + end + + def total_ht total_articles + total_fdp - vourcher_reduction end @@ -104,12 +111,35 @@ class ProductOrder < ActiveRecord::Base end + def archived_total_ttc + archived_total_ht + archived_total_tva + end + + def archived_total_tva + archived_total_articles_tva + end + + + + def archived_total_ht archived_total_articles + archived_total_fdp - archived_vourcher_reduction end + + def archived_total_articles_tva + total = 0.0 + product_order_products.each do |p| + total += p.archived_final_price_ttc_with_qty * (p.tva_archived/100.0) + end + total + end + + + + def archived_total_articles archived_total = 0.0 product_order_products.each do |p| @@ -161,6 +191,33 @@ class ProductOrder < ActiveRecord::Base self.generate_bill_number + self.generate_bl_number + + end + + def generate_bl_number + + + if !self.bl_number and self.product_order_payment_type_ok_id == 10 + + self.bl_year = self.updated_at.year + + + + + last_number = 0 + last_number = ProductOrder.where("bl_number is not null").where(:bl_year => self.bl_year ).order("bl_index DESC").first.bl_index if ProductOrder.where("bl_number is not null").where(:bl_year => self.bl_year ).first + self.bl_index = last_number+1 + self.bl_number = self.bl_ap+self.bl_year.to_s+('%05d' % self.bl_index) + self.save(:validate => false) + + end + end + + + def bl_ap + "VS" + end def after_ship @@ -252,6 +309,19 @@ class ProductOrder < ActiveRecord::Base total end + + + + + + def total_articles_tva + total = 0.0 + product_order_products.each do |p| + total += p.final_price_ttc_with_qty * (p.tva/100.0) + end + total + end + def total_fdp(fdp=self.product_fdp) if fdp if self.total_ttc_without_fdp < fdp.price_max diff --git a/app/models/product_order_product.rb b/app/models/product_order_product.rb index 0097cf4..2aac2e7 100755 --- a/app/models/product_order_product.rb +++ b/app/models/product_order_product.rb @@ -9,6 +9,14 @@ class ProductOrderProduct < ActiveRecord::Base belongs_to :archived_product, class_name: "Product" belongs_to :archived_product_size, class_name: "ProductSize" belongs_to :archived_product_option, class_name: "ProductOption" + + def tva + 20.0 + end + + def tva_archived + self.tva + end def price_ttc_with_qty qty.to_f * product.price_ttc.to_f diff --git a/app/views/admin/particulars/_form.html.haml b/app/views/admin/particulars/_form.html.haml new file mode 100644 index 0000000..fc19d41 --- /dev/null +++ b/app/views/admin/particulars/_form.html.haml @@ -0,0 +1,19 @@ +-if f.object.particular_type? + %h4=f.object.particular_type + +=f.hidden_field :particular_type +=f.hidden_field :skip_validation, :class => "skip_validation" +=f.input :name, :label => "Nom de famille" +=f.input :firstname, :label => "Prénom" +=f.input :pro, :label => "Organisation ?" +=f.input :organisation, :label => "Organisation" +=f.input :address_1, :label => "Adresse 1" +=f.input :address_2, :label => "Adresse 2" +=f.input :address_3, :label => "Adresse 3" +=f.input :address_4, :label => "Adresse 4" +=f.input :address_5, :label => "Adresse 5" +=f.input :cp, :label => "Code postal" +=f.input :city, :label => "Ville" +=f.input :country, :label => "Pays", :priority_countries => ["FR", "CH", "BE"], :include_blank => true +=f.input :email, :label => "Email" +=f.input :tel, :label => "Téléphone" \ No newline at end of file diff --git a/app/views/admin/particulars/_particular.html.haml b/app/views/admin/particulars/_particular.html.haml new file mode 100644 index 0000000..54b4bb5 --- /dev/null +++ b/app/views/admin/particulars/_particular.html.haml @@ -0,0 +1,17 @@ + +%strong + =particular.firstname + + =particular.name +%br +=particular.address_2 + +-if particular.address_3? + %br + =particular.address_3 +%br +=particular.cp + +=particular.city +%br +=particular.country \ No newline at end of file diff --git a/app/views/admin/product_orders/_product_order.html.haml b/app/views/admin/product_orders/_product_order.html.haml index 765d579..a1f2023 100755 --- a/app/views/admin/product_orders/_product_order.html.haml +++ b/app/views/admin/product_orders/_product_order.html.haml @@ -1,4 +1,4 @@ -%tr#product_order_row.product_order_row{:id => product_order.id, :class => ("success" if product_order.shiped)} +%tr#product_order_row.product_order_row{:id => product_order.id, :class => ("success" if product_order)} %td =product_order.id %td diff --git a/app/views/admin/product_orders/bl.html.haml b/app/views/admin/product_orders/bl.html.haml new file mode 100644 index 0000000..f3e0db6 --- /dev/null +++ b/app/views/admin/product_orders/bl.html.haml @@ -0,0 +1,229 @@ +!!! +%html + %head + + %meta{:"http-equiv" => "Content-Type", :content=>"text/html; charset=UTF-8"} + %meta{:name=>"viewport", :content=>"width=device-width,initial-scale=1"} + :css + body{ + font-size:11pt; + padding :0px; + margin:0px; + background-color: transparent; + + font-family:"Arial" ; + padding:1cm; + } + #main{ + //margin-left:4.2cm; + + } + td, th{ + //border:1px solid black; + padding:5px; + vertical-align:top; + + } + th{ + font-weight:normal; + border-bottom:1px solid gray; + text-align:left; + } + + table{ + border-collapse:collapse; + + + + } + + tr{ + page-break-inside:avoid; + + } + + #bottom{ + page-break-inside:avoid; + + } + .right{ + text-align:right; + + } + .line p{ + margin:0px; + } + .description{ + padding-top:2pt; + display:block; + + } + + .bot_separate{ + height:50pt; + + } + + .upcase{ + + text-transform:uppercase; + } + + h3{ + + font-size:1em; + margin-bottom:5px; + font-weight:normal; + } + + + + + + + + + + %body + #main + + %div{:style => "position:absolute;top:1cm;right:1cm;text-align:right;"} + Bon de commande n° + =@product_order.bill_number + %br + =l @product_order.created_at, :format => :date + + + %div{:style => "height:300px;"} + + + + %table.table{:style => "position:absolute;right:1cm;top:220px"} + %tr + %td{:style => "min-width:6cm;"} + %h3 Adresse de facturation + + %strong + =@product_order.particular_bill.firstname + + =@product_order.particular_bill.name + %br + =@product_order.particular_bill.address_2 + + -if @product_order.particular_bill.address_3? + %br + =@product_order.particular_bill.address_3 + %br + =@product_order.particular_bill.cp + + =@product_order.particular_bill.city + %br + =@product_order.particular_bill.country + + + %td + %h3 Adresse de livraison + + %strong + =@product_order.particular_send.firstname + + =@product_order.particular_send.name + %br + =@product_order.particular_send.address_2 + + -if @product_order.particular_send.address_3? + %br + =@product_order.particular_send.address_3 + %br + =@product_order.particular_send.cp + + =@product_order.particular_send.city + %br + =@product_order.particular_send.country + + %table.table{:style => "width:100%;margin:1cm 0;"} + %tr + %th + Description + %th + Taille + %th + Option + %th + Qté + %th + Unitaire + %th + Montant + -@product_order.product_order_products.order(:product_id).each do |product_order_product| + + %tr + + %td + = product_order_product.archived_product.lang(:fr).title + + %td + = product_order_product.archived_product_size.name if product_order_product.archived_product_size + %td + = product_order_product.archived_product_option.lang(I18n.locale).name if product_order_product.archived_product_option + + %td + = number_to_currency(product_order_product.archived_product.final_price_ttc.to_f, locale: :fr) if product_order_product.archived_product + %td + =product_order_product.qty + %td + = number_to_currency(product_order_product.archived_final_price_ttc_with_qty, locale: :fr) if product_order_product.archived_product + + + + + %tr + %td{:colspan => 4, :style => "border:0;"} + %td Total : + %td= number_to_currency(@product_order.archived_total_articles, locale: :fr) + + -if @product_order.vourcher_code_archived + %tr + %td{:colspan => 4, :style => "border:0;"} + %td + =qit "Code réduction tableau", "Code de réduction " + ="("+@product_order.vourcher_code_archived.slug+") :" + %td + ="-" + =number_to_currency @product_order.archived_vourcher_reduction, locale: :fr + + %tr + %td{:colspan => 4, :style => "border:0;"} + %td Frais de port : + %td= number_to_currency(@product_order.archived_total_fdp, locale: :fr) + %tr + %td{:colspan => 4, :style => "border:0;"} + %td + %strong Total : + %td + %strong + = number_to_currency(@product_order.archived_total_ttc, locale: :fr) + + + %p + Mode de paiment : + -if @product_order.product_order_payment_type_ok_id == 3 + CB + -elsif @product_order.product_order_payment_type_ok_id == 1 + Chèque + %br + + " + + + + + \ No newline at end of file diff --git a/app/views/admin/product_orders/show.html.haml b/app/views/admin/product_orders/show.html.haml index 0df6979..5cb3524 100755 --- a/app/views/admin/product_orders/show.html.haml +++ b/app/views/admin/product_orders/show.html.haml @@ -18,6 +18,8 @@ ="oui" if @product_order.paid =link_to "Facture", bill_admin_product_order_path(@product_order) + =link_to "BL", bl_admin_product_order_path(@product_order) + -if @product_order.paid -if !@product_order.shiped diff --git a/app/views/product_orders_mails/confirmation_cb.html.haml b/app/views/product_orders_mails/confirmation_cb.html.haml new file mode 100755 index 0000000..ff105ff --- /dev/null +++ b/app/views/product_orders_mails/confirmation_cb.html.haml @@ -0,0 +1,14 @@ +-if I18n.locale == :fr + + %p Bonjour, + + %p Nous avons le plaisir de vous informer que votre paiement par carte bancaire a été accepté. + + %p Nous vous remercions pour votre commande que nous traiterons dans les meilleurs délais. + + %p Vous trouverez ci-dessous le récapitulatif de celle-ci : + + + =render :partial => "public/product_orders/mail_recap" + + diff --git a/app/views/product_orders_mails/confirmation_cheque.html.haml b/app/views/product_orders_mails/confirmation_cheque.html.haml new file mode 100755 index 0000000..84c3f04 --- /dev/null +++ b/app/views/product_orders_mails/confirmation_cheque.html.haml @@ -0,0 +1,13 @@ + + +-if I18n.locale == :fr + + %p Bonjour, + + %p Nous vous remercions pour votre pré-commande, celle-ci sera expédiée dès que nous aurons reçu votre règlement. + + %p Vous trouverez ci-dessous le récapitulatif de cette commande : + + =render :partial => "public/product_orders/mail_recap" + + diff --git a/app/views/public/particulars/_particular.html.haml b/app/views/public/particulars/_particular.html.haml new file mode 100644 index 0000000..8a33898 --- /dev/null +++ b/app/views/public/particulars/_particular.html.haml @@ -0,0 +1,19 @@ +%strong + =particular.organisation +%br +%strong + =particular.firstname + + =particular.name +%br +=particular.address_2 + +-if particular.address_3? + %br + =particular.address_3 +%br +=particular.cp + +=particular.city +%br +=particular.country \ No newline at end of file diff --git a/app/views/public/product_orders/_mail_recap.html.haml b/app/views/public/product_orders/_mail_recap.html.haml index 8e74d32..28fad9f 100644 --- a/app/views/public/product_orders/_mail_recap.html.haml +++ b/app/views/public/product_orders/_mail_recap.html.haml @@ -1,17 +1,17 @@ %table{:style => "width:100%;"} %tr %td - %h3=qit "Adresse de facturation-mail", "Adresse de facturation" + %h3="Adresse de facturation" =render :partial => "public/particulars/particular", :object => @product_order.particular_bill if @product_order.particular_bill %td - %h3=qit "Adresse de livraison-mail", "Adresse de livraison" + %h3="Adresse de livraison" =render :partial => "public/particulars/particular", :object => @product_order.particular_send if @product_order.particular_send %br %table.order_table{:style => "width:100%;"} -@product_order.product_order_products.order(:product_id).each do |product_order_product| %tr %td{:style => "width:120px"} - =image_tag "https://#{HOSTNAME}"+product_order_product.product.default_image.image_file.file.large.medium.small.thumb.url, :style => "width:100%;" if product_order_product.product and product_order_product.product.default_image + =image_tag "http://#{HOSTNAME}"+product_order_product.product.default_image.image_file.file.large.medium.small.thumb.url, :style => "width:100%;" if product_order_product.product and product_order_product.product.default_image %td{:style => "vertical-align:top;"} %strong= product_order_product.archived_product.lang(:fr).title %br @@ -31,31 +31,27 @@ %tr %td{:colspan => 3, :style => "border:0;"} - %td Total : - %td= number_to_currency(@product_order.archived_total_articles, locale: :fr) - - - -if @product_order.vourcher_code_archived - %tr - %td{:colspan => 3, :style => "border:0;"} - %td - =qit "Code réduction tableau", "Code de réduction " - ="("+@product_order.vourcher_code_archived.slug+") :" - %td - ="-" - =number_to_currency @product_order.archived_vourcher_reduction, locale: :fr - - - - - %tr - %td{:colspan => 3, :style => "border:0;"} - %td=qit "frais de port dans tableau", "Frais de port :" - %td= number_to_currency(@product_order.archived_total_fdp, locale: :fr) + %td + %strong Total HT: + %td.boutique-right + %strong + = number_to_currency(@product_order.archived_total_ht, locale: :fr) %tr %td{:colspan => 3, :style => "border:0;"} %td - %strong Total : + %strong TVA: + %td.boutique-right + %strong + = number_to_currency(@product_order.archived_total_tva, locale: :fr) + + + %tr + %td{:colspan => 3, :style => "border:0;"} + %td + %strong Total HT: %td %strong = number_to_currency(@product_order.archived_total_ttc, locale: :fr) + + + \ No newline at end of file diff --git a/app/views/public/product_orders/_particular_form.html.haml b/app/views/public/product_orders/_particular_form.html.haml index c9ac836..6e04f94 100755 --- a/app/views/public/product_orders/_particular_form.html.haml +++ b/app/views/public/product_orders/_particular_form.html.haml @@ -6,11 +6,11 @@ %table{:style => "width:100%;"} %tr %td{:style => "width:20%"} - =f.input :civilite, :label => qit("don-particular-civilite","Civilité"), :as => :select, :collection => [[qit("don-particular-civilite-mme","Mme."), "Mme"], [qit("don-particular-civilite-m","M."), "M"]], :include_blank => false + =f.input :civilite, :label => "Civilité", :as => :select, :collection => [["Mme.", "Mme"], ["M.", "M"]], :include_blank => false %td{:style => "width:40%"} - =f.input :firstname, :label => qit("don-particular-firstname","Prénom") + =f.input :firstname, :label => "Prénom" %td{:style => "width:40%"} - =f.input :name, :label => qit("don-particular-name","Nom") + =f.input :name, :label => "Nom" =f.input :address_2, :label => "Adresse" =f.input :address_3, :label => "Adresse suite" diff --git a/app/views/public/product_orders/particulars.html.haml b/app/views/public/product_orders/particulars.html.haml index 787296f..810aaf3 100755 --- a/app/views/public/product_orders/particulars.html.haml +++ b/app/views/public/product_orders/particulars.html.haml @@ -1,14 +1,16 @@ #my_cart %h1 Coordonnées + = semantic_form_for [:public,@product_order], :url => particulars_save_public_product_orders_path(), :html => { :method => :post, :onchange =>"cb_infos();"}do |f| - =f.semantic_fields_for :product_customer do |f| + =f.semantic_fields_for :customer do |f| - + =debug @product_order.customer.particular_bill_id + =debug @product_order.customer.particular_send_id .row .columns.span_6{:style => "padding:10px;"} - %h3= qit "Adresse de facturation titre", "Adresse de facturation" + %h3= "Adresse de facturation" %p   =f.semantic_fields_for :particular_bill do |f| @@ -19,13 +21,13 @@ - -@particular_idem = f.object.particular_idem + -@particular_idem = @product_order.particular_idem .columns.span_6{:style => "padding:10px;"} - %h3=qit "Adresse de livraison titre", "Adresse de livraison" - %p=f.input :particular_idem, :label => qit("phrase-adresse-identique","Adresse de livraison identique à l'adresse de facturation ?"), :input_html => {:onchange => "particular_idem()", :id => "particular_idem_checkbox"} + %h3"Adresse de livraison" + %p=f.input :particular_idem, :label => "Adresse de livraison identique à l'adresse de facturation ?", :input_html => {:onchange => "particular_idem()", :id => "particular_idem_checkbox"}, :as => :boolean #particular_send diff --git a/app/views/public/product_orders/payment_instructions.html.haml b/app/views/public/product_orders/payment_instructions.html.haml index 3fa20c8..4af704e 100644 --- a/app/views/public/product_orders/payment_instructions.html.haml +++ b/app/views/public/product_orders/payment_instructions.html.haml @@ -1,18 +1,8 @@ .center - %h1=qit "Titre dans instruction commande par chèque", "Merci pour votre commande !" + %h1="Merci pour votre commande !" %p - Pour finaliser celle-ci, merci de nous envoyer votre réglement par chèque d'un montant de - = number_to_currency(@product_order_ar.total_ttc, locale: :fr) - à l'ordre de One Voice à l'adresse suivante : - %br - %strong One Voice - %br - 38 rue Saint Cornély - %br - 56340 Carnac - %br - France + Votre pré-commande a bien été enregistrée %br %br %br diff --git a/app/views/public/product_orders/select_payment.html.haml b/app/views/public/product_orders/select_payment.html.haml index df7e8de..ae1a3ba 100755 --- a/app/views/public/product_orders/select_payment.html.haml +++ b/app/views/public/product_orders/select_payment.html.haml @@ -1,42 +1,38 @@ #my_cart .order_recap - %h1=qit "titre page validation de commande", "Validation de votre commande" + %h1= "Validation de votre commande" %br -@recap = true %table.table =render @product_order.product_order_products.order(:product_id) - %tr - %td{:colspan => 3, :style => "border:0;"} - %td Total : - %td.boutique-right= number_to_currency(@product_order.total_articles, locale: :fr) - - -if @product_order.vourcher_code - %tr - %td{:colspan => 3, :style => "border:0;"} - %td - =qit "Code réduction tableau", "Code de réduction " - ="("+@product_order.vourcher_code.slug+") :" - %td.boutique-right - ="-" - =number_to_currency @product_order.vourcher_reduction, locale: :fr - - - - - %tr - %td{:colspan => 3, :style => "border:0;"} - %td=qit "frais de port dans tableau", "Frais de port :" - %td.boutique-right= number_to_currency(@product_order.total_fdp, locale: :fr) + %tr %td{:colspan => 3, :style => "border:0;"} %td - %strong Total : + %strong Total HT: + %td.boutique-right + %strong + = number_to_currency(@product_order.total_ht, locale: :fr) + %tr + %td{:colspan => 3, :style => "border:0;"} + %td + %strong TVA: + %td.boutique-right + %strong + = number_to_currency(@product_order.total_tva, locale: :fr) + + + %tr + %td{:colspan => 3, :style => "border:0;"} + %td + %strong Total HT: %td.boutique-right %strong = number_to_currency(@product_order.total_ttc, locale: :fr) + @@ -49,27 +45,27 @@ =f.hidden_field :force_payment - %h3=qit "paiement titre", "Paiement" + %h3 Paiement -if params[:paid_fail] - %p=qit "texte erreur de paiement", "Votre tentative de paiement par carte bancaire a échouée, ou vous avez annulé votre paiement, merci de bien vouloir essayer de nouveau ou changer de mode de paiement." + %p= "Votre tentative de paiement par carte bancaire a échouée, ou vous avez annulé votre paiement, merci de bien vouloir essayer de nouveau ou changer de mode de paiement." %br - =f.input :product_order_payment_type_ok_id, :label => false, :collection => [["Chèque",1],["Carte bancaire",3]], :as => :radio, :include_blank => false + =f.input :product_order_payment_type_ok_id, :label => false, :collection => [["Pré-commande",10]], :as => :radio, :include_blank => false .cb_infos - =qit "texte redirection paiement sécurisé", "Vous serez redirigé vers la page de paiement sécurisé." + = "Vous serez redirigé vers la page de paiement sécurisé." %br - =f.input :cgv, :label => qit("phrase jaccepte les cgv","J'accepte les conditions générales de vente.") + =f.input :cgv, :label => "J'accepte les conditions générales de vente." .actions %center - =f.submit qit("Valider ma commande bouton", "Valider ma commande"), :class => "btn btn-primary order_button" + =f.submit "Valider ma commande", :class => "btn btn-primary order_button" %br %br diff --git a/app/views/public/products/index.html.haml b/app/views/public/products/index.html.haml index 403639f..71015e4 100644 --- a/app/views/public/products/index.html.haml +++ b/app/views/public/products/index.html.haml @@ -3,4 +3,4 @@ %h1 Produits exclusifs réservés à ce réseau .boutique_body.products - =render Product.all + =render Product.where(:archived => false).all diff --git a/config/routes.rb b/config/routes.rb index d255f78..7ad38fb 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -313,6 +313,8 @@ Rails.application.routes.draw do get :ship get :bill + + get :bl end end diff --git a/db/migrate/20151208173913_create_particulars.rb b/db/migrate/20151208173913_create_particulars.rb new file mode 100644 index 0000000..494e7eb --- /dev/null +++ b/db/migrate/20151208173913_create_particulars.rb @@ -0,0 +1,29 @@ +class CreateParticulars < ActiveRecord::Migration + def change + create_table :particulars do |t| + t.boolean :pro + t.string :organisation + t.string :name + t.string :firstname + t.string :address_1 + t.string :address_2 + t.string :address_3 + t.string :address_4 + t.string :address_5 + t.string :cp + t.string :city + t.string :country + t.string :tel + t.string :email + t.string :tel2 + t.string :tel3 + t.string :fax + t.string :owner_type + t.integer :owner_id + t.string :particular_type + t.boolean :skip_validation + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160308182022_add_civilite_to_particulars.rb b/db/migrate/20160308182022_add_civilite_to_particulars.rb new file mode 100644 index 0000000..69f2b8f --- /dev/null +++ b/db/migrate/20160308182022_add_civilite_to_particulars.rb @@ -0,0 +1,5 @@ +class AddCiviliteToParticulars < ActiveRecord::Migration + def change + add_column :particulars, :civilite, :string + end +end diff --git a/db/migrate/20160821203747_add_ogone_to_product_order_payments.rb b/db/migrate/20160821203747_add_ogone_to_product_order_payments.rb new file mode 100644 index 0000000..0443ef4 --- /dev/null +++ b/db/migrate/20160821203747_add_ogone_to_product_order_payments.rb @@ -0,0 +1,19 @@ +class AddOgoneToProductOrderPayments < ActiveRecord::Migration + def change + add_column :product_order_payments, :ogone_payid, :string + add_column :product_order_payments, :ogone_pm, :string + add_column :product_order_payments, :ogone_status, :string + add_column :product_order_payments, :ogone_acceptance, :string + add_column :product_order_payments, :ogone_cardno, :string + add_column :product_order_payments, :ogone_ed, :string + add_column :product_order_payments, :ogone_cn, :string + add_column :product_order_payments, :ogone_trxdate, :string + add_column :product_order_payments, :ogone_ncerror, :string + add_column :product_order_payments, :ogone_brand, :string + add_column :product_order_payments, :ogone_subbrand, :string + add_column :product_order_payments, :ogone_eci, :string + add_column :product_order_payments, :ogone_ip, :string + add_column :product_order_payments, :ogone_alias, :string + add_column :product_order_payments, :ogone_cb_expiration, :date + end +end diff --git a/db/migrate/20170927080645_add_particular_to_customers.rb b/db/migrate/20170927080645_add_particular_to_customers.rb new file mode 100644 index 0000000..f79e34d --- /dev/null +++ b/db/migrate/20170927080645_add_particular_to_customers.rb @@ -0,0 +1,37 @@ +class AddParticularToCustomers < ActiveRecord::Migration + + def self.up + add_column :customers, :particular_idem, :boolean + add_column :customers, :particular_send_id, :integer + add_column :customers, :particular_bill_id, :integer + + Customer.all.each do |customer| + customer.particular_bill = Particular.new + customer.particular_bill.skip_validation = true + customer.particular_bill.organisation = customer.organisation + customer.particular_bill.name = customer.name + customer.particular_bill.firstname = customer.firstname + customer.particular_bill.address_2 = customer.address + customer.particular_bill.address_3 = customer.address2 + customer.particular_bill.cp = customer.cp + customer.particular_bill.city = customer.city + customer.particular_bill.country = customer.country + customer.particular_bill.tel = customer.phone + customer.particular_bill.email = customer.email + + customer.particular_send = Particular.new + customer.particular_send.skip_validation = true + + customer.particular_idem = true + customer.save + end + end + + def self.down + remove_column :customers, :particular_idem + remove_column :customers, :particular_send_id + remove_column :customers, :particular_bill_id + + end + +end diff --git a/db/migrate/20170927093622_add_bl_to_product_orders.rb b/db/migrate/20170927093622_add_bl_to_product_orders.rb new file mode 100644 index 0000000..014c993 --- /dev/null +++ b/db/migrate/20170927093622_add_bl_to_product_orders.rb @@ -0,0 +1,7 @@ +class AddBlToProductOrders < ActiveRecord::Migration + def change + add_column :product_orders, :bl_number, :string + add_column :product_orders, :bl_index, :integer + add_column :product_orders, :bl_year, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 51aa35c..f2db486 100755 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170912164519) do +ActiveRecord::Schema.define(version: 20170927093622) do create_table "accepted_offers", force: :cascade do |t| t.datetime "created_at", null: false @@ -259,6 +259,9 @@ ActiveRecord::Schema.define(version: 20170912164519) do t.boolean "referent", limit: 1, default: false t.boolean "chef_reseau", limit: 1, default: false t.string "reseaux_token", limit: 255 + t.boolean "particular_idem", limit: 1 + t.integer "particular_send_id", limit: 4 + t.integer "particular_bill_id", limit: 4 end create_table "data_files", force: :cascade do |t| @@ -599,6 +602,33 @@ ActiveRecord::Schema.define(version: 20170912164519) do t.datetime "updated_at" end + create_table "particulars", force: :cascade do |t| + t.boolean "pro", limit: 1 + t.string "organisation", limit: 255 + t.string "name", limit: 255 + t.string "firstname", limit: 255 + t.string "address_1", limit: 255 + t.string "address_2", limit: 255 + t.string "address_3", limit: 255 + t.string "address_4", limit: 255 + t.string "address_5", limit: 255 + t.string "cp", limit: 255 + t.string "city", limit: 255 + t.string "country", limit: 255 + t.string "tel", limit: 255 + t.string "email", limit: 255 + t.string "tel2", limit: 255 + t.string "tel3", limit: 255 + t.string "fax", limit: 255 + t.string "owner_type", limit: 255 + t.integer "owner_id", limit: 4 + t.string "particular_type", limit: 255 + t.boolean "skip_validation", limit: 1 + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "civilite", limit: 255 + end + create_table "portlets", force: :cascade do |t| t.integer "block_id", limit: 4 t.integer "content_id", limit: 4 @@ -754,6 +784,21 @@ ActiveRecord::Schema.define(version: 20170912164519) do t.string "token", limit: 255 t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "ogone_payid", limit: 255 + t.string "ogone_pm", limit: 255 + t.string "ogone_status", limit: 255 + t.string "ogone_acceptance", limit: 255 + t.string "ogone_cardno", limit: 255 + t.string "ogone_ed", limit: 255 + t.string "ogone_cn", limit: 255 + t.string "ogone_trxdate", limit: 255 + t.string "ogone_ncerror", limit: 255 + t.string "ogone_brand", limit: 255 + t.string "ogone_subbrand", limit: 255 + t.string "ogone_eci", limit: 255 + t.string "ogone_ip", limit: 255 + t.string "ogone_alias", limit: 255 + t.date "ogone_cb_expiration" end create_table "product_order_products", force: :cascade do |t| @@ -781,7 +826,7 @@ ActiveRecord::Schema.define(version: 20170912164519) do t.string "particular_send_id", limit: 255 t.string "token", limit: 255 t.boolean "completed_finish", limit: 1, default: false - t.integer "product_order_payment_ok", limit: 4 + t.integer "product_order_payment_ok_id", limit: 4 t.integer "product_order_payment_type_ok_id", limit: 4 t.integer "bill_index", limit: 4 t.string "bill_number", limit: 255 @@ -795,6 +840,9 @@ ActiveRecord::Schema.define(version: 20170912164519) do t.integer "product_fdp_archived_id", limit: 4 t.boolean "cgv", limit: 1 t.integer "customer_id", limit: 4 + t.string "bl_number", limit: 255 + t.integer "bl_index", limit: 4 + t.integer "bl_year", limit: 4 end create_table "product_product_sizes", force: :cascade do |t| diff --git a/pdf/bl/BL_13.pdf b/pdf/bl/BL_13.pdf new file mode 100644 index 0000000..e69de29 diff --git a/pdf/bl/BL_13_temp.pdf b/pdf/bl/BL_13_temp.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3de8607e5f042e1717f1ca85d7c5437bdf7002eb GIT binary patch literal 15160 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 literal 0 HcmV?d00001 diff --git a/pdf_stamp/bl.pdf b/pdf_stamp/bl.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ba20b3c045f3f49f5cdd46ab033c38d5dc48d7eb GIT binary patch literal 9907 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 literal 0 HcmV?d00001