diff --git a/app/controllers/admin/product_orders_controller.rb b/app/controllers/admin/product_orders_controller.rb index 0129a7f..3b20e31 100755 --- a/app/controllers/admin/product_orders_controller.rb +++ b/app/controllers/admin/product_orders_controller.rb @@ -191,6 +191,10 @@ class Admin::ProductOrdersController < ApplicationController @product_order = ProductOrder.find(params[:id]) end + def subs + @product_order = ProductOrder.find(params[:id]) + end + def bill @@ -200,8 +204,8 @@ class Admin::ProductOrdersController < ApplicationController - @temp_file = "#{Rails.root}/pdf/donator_transactions_recus/FACTURE_#{@product_order.id}_temp.pdf" - @final_file = "#{Rails.root}/pdf/donator_transactions_recus/FACTURE_#{@product_order.id}.pdf" + @temp_file = "#{Rails.root}/pdf/facture/FACTURE_#{@product_order.id}_temp.pdf" + @final_file = "#{Rails.root}/pdf/facture/FACTURE_#{@product_order.id}.pdf" view = ActionView::Base.new(Rails.root.join('app/views')) diff --git a/app/controllers/public/payments_controller.rb b/app/controllers/public/payments_controller.rb index 828a877..f34efb0 100644 --- a/app/controllers/public/payments_controller.rb +++ b/app/controllers/public/payments_controller.rb @@ -11,8 +11,14 @@ class Public::PaymentsController < ApplicationController if params[:orderID] if @payment.ogone_payid? and !@payment.element.paid - @abonnement = @payment.element - @payment = @abonnement.payments.create(:amount => @abonnement.total_price_ttc, :payment_type_id => 1, :customer_id => current_customer.id) + + if @payment.element_type == "ProductOrder" + redirect_to select_payment_public_product_orders_path(:paid_fail => 1) + else + + @abonnement = @payment.element + @payment = @abonnement.payments.create(:amount => @abonnement.total_price_ttc, :payment_type_id => 1, :customer_id => current_customer.id) + end end end @@ -75,6 +81,10 @@ class Public::PaymentsController < ApplicationController #redirect_to paid_public_payment_path(@payment) end + if @payment.element_type == "ProductOrder" + redirect_to paid_by_ogone_confirm_public_product_orders_path() + end + end diff --git a/app/controllers/public/product_orders_controller.rb b/app/controllers/public/product_orders_controller.rb index 6b1c762..a765d83 100755 --- a/app/controllers/public/product_orders_controller.rb +++ b/app/controllers/public/product_orders_controller.rb @@ -172,7 +172,13 @@ class Public::ProductOrdersController < ApplicationController if @product_order.product_order_payment_type_ok_id == 3 - redirect_to paid_by_ogone_public_product_orders_path() + #redirect_to paid_by_ogone_public_product_orders_path() + + @payment = @product_order.payments.create(:amount => @product_order.archived_total_ttc, :payment_type_id => 1, :customer_id => current_customer.id) + session[:payment_id] = @payment.id + redirect_to paid_by_ogone_public_payment_path(@payment) + + else if [10, 1, 2, 4].include?(@product_order.product_order_payment_type_ok_id) @@ -189,7 +195,7 @@ class Public::ProductOrdersController < ApplicationController @product_order.completed_finish = true @product_order.save - @product_order.after_paid + @product_order.after_paid_old #@product_order.generate_bl_number @@ -381,33 +387,10 @@ class Public::ProductOrdersController < ApplicationController def paid_by_ogone_confirm - @check = OgoneRails::CheckAuth.new( request ) - - if @check.valid? - - - @product_order_payment = ProductOrderPayment.find_by_token(params[:orderID]) - - @product_order = @product_order_payment.product_order - - end - - if !@product_order.paid - update_ogone_infos() - - end + @product_order = ProductOrder.find(session[:product_order_id]) session[:product_order_id] = nil if @product_order.paid - - @past_product_order = @product_order - - @product_order = ProductOrder.new - - - - if !@past_product_order.paid - redirect_to select_payment_public_product_orders_path(:orderID => "fail") - end + end diff --git a/app/models/fournisseur.rb b/app/models/fournisseur.rb new file mode 100644 index 0000000..c216ba4 --- /dev/null +++ b/app/models/fournisseur.rb @@ -0,0 +1,2 @@ +class Fournisseur < ActiveRecord::Base +end diff --git a/app/models/product.rb b/app/models/product.rb index 7a71011..1b229a8 100755 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -2,6 +2,8 @@ class Product < ActiveRecord::Base belongs_to :reseaux + has_many :sub_products, :dependent => :destroy + accepts_nested_attributes_for :sub_products has_many :product_product_sizes, :dependent => :destroy has_many :product_sizes, :through => :product_product_sizes diff --git a/app/models/product_order.rb b/app/models/product_order.rb index b3af17d..fc79652 100755 --- a/app/models/product_order.rb +++ b/app/models/product_order.rb @@ -1,7 +1,12 @@ class ProductOrder < ActiveRecord::Base + has_many :payments, :as => :element has_many :product_order_products + + has_many :sub_products, :through => :product_order_products + + has_many :fournisseurs, :through => :sub_products has_many :product_order_payments belongs_to :product_order_payment_ok, :class_name => "ProductOrderPayment" @@ -185,8 +190,8 @@ class ProductOrder < ActiveRecord::Base def generate_bill_number - if !self.bill_number and self.paid and self.product_order_payment_type_ok_id == 3 - self.paid_at = self.product_order_payment_ok.paid_at + if !self.bill_number and self.paid and self.product_order_payment_type_ok_id == 3 and self.payments.where(:paid => true).first + self.paid_at = self.payments.where(:paid => true).first.paid_at self.bill_year = self.paid_at.year @@ -196,13 +201,32 @@ class ProductOrder < ActiveRecord::Base last_number = 0 last_number = ProductOrder.where("paid_at is not null").where(:bill_year => self.bill_year ).order("bill_index DESC").first.bill_index if ProductOrder.where("paid_at is not null").where(:bill_year => self.bill_year ).first self.bill_index = last_number+1 - self.bill_number = "WEB"+self.bill_year.to_s+('%04d' % self.bill_index) + self.bill_number = "NG"+self.bill_year.to_s+('%04d' % self.bill_index) self.save(:validate => false) end end def after_paid + + self.product_order_products.each do |p| + + p.update_stock_th + + end + self.product_order_payment_type_ok_id = 3 + self.completed_finish = true + self.paid_at = Time.now + self.paid = true + self.save + self.generate_bill_number + + self.generate_bl_number + + end + + + def after_paid_old puts "TTTTTT" self.product_order_products.each do |p| @@ -219,7 +243,7 @@ class ProductOrder < ActiveRecord::Base def generate_bl_number - if !self.bl_number and ([1,2,4,10].include?(self.product_order_payment_type_ok_id)) + if !self.bl_number and ([1,2,3,4,10].include?(self.product_order_payment_type_ok_id)) self.bl_year = self.updated_at.year @@ -293,7 +317,17 @@ class ProductOrder < ActiveRecord::Base p.save end end - + p.sub_products.destroy_all + p.product.sub_products.each do |sub_product| + dup_sub_product = sub_product.dup + dup_sub_product.product_order_product = p + dup_sub_product.product = nil + dup_sub_product.sub_product_reference_id = sub_product.id + dup_sub_product.archived = true + + + dup_sub_product.save + end # save diff --git a/app/models/product_order_product.rb b/app/models/product_order_product.rb index 9c1a840..d5ecd96 100755 --- a/app/models/product_order_product.rb +++ b/app/models/product_order_product.rb @@ -11,6 +11,7 @@ class ProductOrderProduct < ActiveRecord::Base belongs_to :archived_product_size, class_name: "ProductSize" belongs_to :archived_product_option, class_name: "ProductOption" + has_many :sub_products def sage_reference if self.product diff --git a/app/models/sub_product.rb b/app/models/sub_product.rb new file mode 100644 index 0000000..df31b1d --- /dev/null +++ b/app/models/sub_product.rb @@ -0,0 +1,22 @@ +class SubProduct < ActiveRecord::Base + belongs_to :fournisseur + belongs_to :product + belongs_to :product_order_product + + def price_ht_with_qte + self.price_ht * self.qte + end + + def qte_tot + if self.product_order_product + self.qte * self.product_order_product.qty + else + 0.0 + end + end + + def price_tot_with_qte + self.qte_tot * self.price_ht + end + +end diff --git a/app/views/admin/product_orders/bill.html.haml b/app/views/admin/product_orders/bill.html.haml index 6cf86d8..3eda9c8 100644 --- a/app/views/admin/product_orders/bill.html.haml +++ b/app/views/admin/product_orders/bill.html.haml @@ -4,14 +4,15 @@ %meta{:"http-equiv" => "Content-Type", :content=>"text/html; charset=UTF-8"} %meta{:name=>"viewport", :content=>"width=device-width,initial-scale=1"} - :css + + :scss body{ font-size:11pt; padding :0px; margin:0px; background-color: transparent; - font-family:"Arial" ; + font-family:"Lato", Arial, Sans-serif; padding:1cm; } #main{ @@ -29,6 +30,15 @@ border-bottom:1px solid gray; text-align:left; } + + td{ + border-bottom:1px solid rgba(0,0,0,0.1); + + p{ + margin:5px 0; + } + + } table{ border-collapse:collapse; @@ -87,26 +97,27 @@ %body #main - %div{:style => "position:absolute;top:1cm;right:1cm;text-align:right;"} + %div{:style => "position:absolute;top:4.4cm;right:1cm;text-align:right;"} Facture n° =@product_order.bill_number %br =l @product_order.paid_at, :format => :date - %div{:style => "height:300px;"} + %div{:style => "height:350px;"} %table.table{:style => "position:absolute;right:1cm;top:220px"} %tr - %td{:style => "min-width:6cm;"} + %td{:style => "width:5.5cm;border:0"} %h3 Adresse de facturation - %strong - =@product_order.particular_bill.firstname + %strong=@product_order.particular_bill.organisation + %br + =@product_order.particular_bill.firstname - =@product_order.particular_bill.name + =@product_order.particular_bill.name %br =@product_order.particular_bill.address_2 @@ -119,15 +130,19 @@ =@product_order.particular_bill.city %br =@product_order.particular_bill.country + %br + %br + =@product_order.particular_bill.tel - %td + %td{:style => "width:5.5cm;border:0"} %h3 Adresse de livraison - %strong - =@product_order.particular_send.firstname + %strong=@product_order.particular_bill.organisation + %br + =@product_order.particular_send.firstname - =@product_order.particular_send.name + =@product_order.particular_send.name %br =@product_order.particular_send.address_2 @@ -140,93 +155,81 @@ =@product_order.particular_send.city %br =@product_order.particular_send.country + %br + %br + =@product_order.particular_bill.tel %table.table{:style => "width:100%;margin:1cm 0;"} %tr + %th %th Description - %th - Taille - %th - Option - %th + %th{:style => "text-align:right;width:100px"} + Prix U. HT + %th{:style => "text-align:right;width:80px"} Qté - %th - Unitaire - %th - Montant + %th{:style => "text-align:right;width:100px"} + Prix HT -@product_order.product_order_products.order(:product_id).each do |product_order_product| %tr + %td{:style => "width:135px;padding:0;vertical-align:middle"} + =image_tag "http://negos.pro"+product_order_product.product.default_image.image_file.file.large.medium.small.thumb.url, :style => "width:130px;" if product_order_product.product.default_image + %td + =simple_format product_order_product.archived_product.lang(:fr).bl_title + + + =# product_order_product.archived_product_size.name if product_order_product.archived_product_size - %td - = product_order_product.archived_product.lang(:fr).title + + =# product_order_product.archived_product_option.lang(I18n.locale).name if product_order_product.archived_product_option - %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 + %td{:style => "text-align:right;"} + = number_to_currency(product_order_product.archived_product.final_price_ht.to_f, locale: :fr) if product_order_product.archived_product + %td{:style => "text-align:right;"} =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 + %td{:style => "text-align:right;"} + = number_to_currency(product_order_product.archived_final_price_ht_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 + %td{:colspan => 3, :rowspan => 3, :style => "border:0;text-align:left;"} + %p + %br + 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 + -elsif @product_order.product_order_payment_type_ok_id == 2 + Virement + -elsif @product_order.product_order_payment_type_ok_id == 4 + Mandat administratif + %br + %br + Franco de port pour le Pays Voironnais + %td Total HT : + %td{:style => "text-align:right;"}= number_to_currency(@product_order.archived_total_ht, locale: :fr) %tr - %td{:colspan => 4, :style => "border:0;"} - %td Frais de port : - %td= number_to_currency(@product_order.archived_total_fdp, locale: :fr) + + %td TVA : + %td{:style => "text-align:right;"}= number_to_currency(@product_order.archived_total_tva, 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 - %p - Association à but non lucratif, non soumise à la TVA - %br - TVA non applicable, article 293B du code général des impots - " - + + %td Total TTC : + %td{:style => "text-align:right;"}= number_to_currency(@product_order.archived_total_ttc, locale: :fr) + + + %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 2249cb2..e4a11b1 100755 --- a/app/views/admin/product_orders/show.html.haml +++ b/app/views/admin/product_orders/show.html.haml @@ -11,7 +11,8 @@ .qi_row .qi_pannel.qi_plain.padding - + %p + =link_to "Voir le détail des sous produits", subs_admin_product_order_path(@product_order) %p Payée ? diff --git a/app/views/admin/product_orders/subs.html.haml b/app/views/admin/product_orders/subs.html.haml new file mode 100644 index 0000000..140e9da --- /dev/null +++ b/app/views/admin/product_orders/subs.html.haml @@ -0,0 +1,192 @@ +.qi_header + .right=# link_to 'Ajouter une taille', new_admin_product_size_path, :class => "btn btn-primary", :remote => true + %h1 + + Boutique + %span + Détail des sous produits de la commande + ="#"+@product_order.id.to_s + + + +.qi_row + .qi_pannel.qi_plain.padding + + + %table.table + %tr + %td + %h3 Adresse de facturation + =render @product_order.particular_bill if @product_order.particular_bill + %td + %h3 Adresse de livraison + =render @product_order.particular_send if @product_order.particular_send + + %table.table + -@product_order.product_order_products.order(:product_id).each do |product_order_product| + + %tr + %td + %strong + -if product_order_product.product + =link_to admin_product_path(product_order_product.product) do + = product_order_product.archived_product.lang(:fr).title + -else + = product_order_product.archived_product.lang(:fr).title + %table.sub_products{:style => "width:100%;margin-bottom:20px;margin-top:5px;"} + %tr + %th Référence + %th Nom + %th Nbr / produits + %th Prix / produits + %th Nbr + %th Prix tot. HT + %th Prix tot. TTC + + -product_order_product.sub_products.each do |sub_product| + %tr + %td + =sub_product.reference + %td + =sub_product.name + %td + =sub_product.qte + %td + =number_to_currency sub_product.price_ht_with_qte + %td + =sub_product.qte_tot + %td + =number_to_currency sub_product.price_tot_with_qte + + %td + =number_to_currency sub_product.price_tot_with_qte*1.2 + + + + %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) + + + + .fdp + %table.table + %tr + %td + =@product_order.product_fdp_archived.fdp_description + %td + =number_to_currency @product_order.product_fdp_archived.price + %br + + %hr + %h3 Détail des sous produits + %table.table + %tr + %th Fournisseur + %th Référence + %th Nom + %th Nbr Prod. + %th Nbr + %th Prix tot. HT + %th Prix tot. TTC + -@product_order.sub_products.group(:reference).each do |sub_product_group| + %tr + %td + = sub_product_group.fournisseur.name if sub_product_group.fournisseur + %td= sub_product_group.reference + %td= sub_product_group.name + + -sub_products = @product_order.sub_products.where(:reference => sub_product_group.reference) + %td + =sub_products.count + %td + -i = 0.0 + -sub_products.each do |sub_product| + -i += sub_product.qte_tot + =i + + %td + -i = 0.0 + -sub_products.each do |sub_product| + -i += sub_product.price_tot_with_qte + =number_to_currency i + + %td + =number_to_currency i*1.2 + =#number_to_currency sub_product.price_tot_with_qte + + %hr + %h3 Détail par fournisseurs + %table.table + %tr + %th Fournisseur + %th Prix HT + %th Prix TTC + -@product_order.fournisseurs.uniq.each do |fournisseur| + %tr + %td=fournisseur.name + %td + -i = 0.0 + -@product_order.sub_products.where(:fournisseur_id => fournisseur.id).each do |sub_product| + -i += sub_product.price_tot_with_qte + =number_to_currency i + + %td + =number_to_currency i*1.2 + %hr + %br + %table.table + %thead + %tr + %th Identifiant paiement + %th Date de paiement + %th Type de paiement + + %th ID Ogone + %th Status Ogone + %th Erreur Ogone + %th N°Carte + %th Montant + %th + + + %tbody#product_order_payments + =render @product_order.product_order_payments.order("created_at DESC") + diff --git a/app/views/admin/products/_form.html.haml b/app/views/admin/products/_form.html.haml index da8b6bc..45391c8 100755 --- a/app/views/admin/products/_form.html.haml +++ b/app/views/admin/products/_form.html.haml @@ -38,6 +38,14 @@ =form.input :sage_reference, :label => "Référence sage :" + %hr + %h3 + Sous produits + %p= link_to_add_fields "Ajouter un sous produit", form, :sub_products + + .sub_products_form + =form.semantic_fields_for :sub_products do |form| + =render :partial => "admin/sub_products/form", :locals => {:form => form} .actions = form.submit "Sauvegarder", :class => "btn btn-primary" diff --git a/app/views/admin/sub_products/_form.html.haml b/app/views/admin/sub_products/_form.html.haml new file mode 100755 index 0000000..34398d2 --- /dev/null +++ b/app/views/admin/sub_products/_form.html.haml @@ -0,0 +1,15 @@ +.field + .product_option_form + %hr + .product_option + + + =form.input :name + =form.input :qte + =form.input :price_ht + =form.input :reference + =form.input :fournisseur_id, :collection => Fournisseur.all, :as => :select + + + = link_to_remove_fields i(:"trash-o"), form + \ No newline at end of file diff --git a/app/views/public/payments/paid_by_ogone_confirm.html.haml b/app/views/public/payments/paid_by_ogone_confirm.html.haml index 99e8032..6196ce7 100644 --- a/app/views/public/payments/paid_by_ogone_confirm.html.haml +++ b/app/views/public/payments/paid_by_ogone_confirm.html.haml @@ -1,4 +1,8 @@ .center %h1 Merci pour votre paiement ! - %p - Vous pouvez désormais profiter de votre abonnement. \ No newline at end of file + + -if @payement.element_type == "ProductOrder" + Votre commande est validée + -else + %p + Vous pouvez désormais profiter de votre abonnement. \ No newline at end of file diff --git a/app/views/public/product_orders/select_payment.html.haml b/app/views/public/product_orders/select_payment.html.haml index 41a59da..1090640 100755 --- a/app/views/public/product_orders/select_payment.html.haml +++ b/app/views/public/product_orders/select_payment.html.haml @@ -55,7 +55,7 @@ - =f.input :product_order_payment_type_ok_id, :label => false, :collection => [["Chèque",1], ["Virement",2],["Mandat administratif",4]], :as => :radio, :include_blank => false #["Pré-commande",10] + =f.input :product_order_payment_type_ok_id, :label => false, :collection => [["Chèque",1], ["Virement",2],["Carte bancaire",3],["Mandat administratif",4]], :as => :radio, :include_blank => false #["Pré-commande",10] .cb_infos diff --git a/config/routes.rb b/config/routes.rb index 257457f..f4e3305 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -329,12 +329,11 @@ Rails.application.routes.draw do get :export get :export2 end - member do - get :ship - - get :bill - - get :bl + member do + get :ship + get :bill + get :bl + get :subs end end diff --git a/pdf_stamp/facture.pdf b/pdf_stamp/facture.pdf new file mode 100644 index 0000000..3adccda Binary files /dev/null and b/pdf_stamp/facture.pdf differ diff --git a/test/fixtures/fournisseurs.yml b/test/fixtures/fournisseurs.yml new file mode 100644 index 0000000..2b36db7 --- /dev/null +++ b/test/fixtures/fournisseurs.yml @@ -0,0 +1,13 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + description: MyText + iban: MyString + bic: MyString + +two: + name: MyString + description: MyText + iban: MyString + bic: MyString diff --git a/test/fixtures/sub_products.yml b/test/fixtures/sub_products.yml new file mode 100644 index 0000000..04bdfb8 --- /dev/null +++ b/test/fixtures/sub_products.yml @@ -0,0 +1,21 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + product_id: 1 + name: MyString + description: MyText + price_ht: 9.99 + price_ht_total: 9.99 + qte: 9.99 + product_order_product_id: 1 + fournisseur_id: 1 + +two: + product_id: 1 + name: MyString + description: MyText + price_ht: 9.99 + price_ht_total: 9.99 + qte: 9.99 + product_order_product_id: 1 + fournisseur_id: 1 diff --git a/test/models/fournisseur_test.rb b/test/models/fournisseur_test.rb new file mode 100644 index 0000000..14c6af1 --- /dev/null +++ b/test/models/fournisseur_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class FournisseurTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/sub_product_test.rb b/test/models/sub_product_test.rb new file mode 100644 index 0000000..b8b8792 --- /dev/null +++ b/test/models/sub_product_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class SubProductTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end