jose miguel 7 роки тому
батько
коміт
a77a363970

+ 220 - 250
app/controllers/pointsales_controller.rb

@@ -1,252 +1,222 @@
 class PointsalesController < ApplicationController
-	##--- Abilities
-	load_and_authorize_resource
-
-	##--- Breadcrum_rails
-	add_breadcrumb I18n.t("breadcrumbs." + controller_name), :pointsales_path
-	add_breadcrumb "Nuevo Punto de venta" , :new_pointsale_path, only: :new
-	add_breadcrumb "Detalle del Punto de venta" , :pointsale_path, only: :show
-
-	before_action :set_pointsale, only: [:show, :edit, :update, :destroy, :update_products]
-	before_action :get_filters, only: [:index, :show, :edit, :new]
-	# before_action :get_available_products, only: [:edit, :update]
-
-	# GET /pointsales
-	# GET /pointsales.json
-	def index
-		@pointsales = Pointsale.vigentes
-	end
-
-	# GET /pointsales/1
-	# GET /pointsales/1.json
-	def show
-	end
-
-	# GET /pointsales/new
-	def new
-		@pointsale = Pointsale.new
-		# @pointsale.users.new
-	end
-
-	# GET /pointsales/1/edit
-	def edit
-		@todo = params[:todo]
-		add_breadcrumb ( @todo.present? ? "Actualizar productos del punto de venta " : "Editar Punto de venta") , :edit_pointsale_path, only: :edit
-	  	respond_to do |format|
-	    	format.html
-	    	format.json { render json: AvailableProductsDatatable.new(view_context, @pointsale) }
-	  	end
-	end
-
-	# POST /pointsales
-	# POST /pointsales.json
-	def create
-		@pointsale = Pointsale.new(pointsale_params)
-
-		@pointsale.skip_name_validation =  false
-		@pointsale.skip_products_validation =  false
-		@pointsale.users.first.skip_validations_from_pointsale = true
-		@pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue creado."
-		@pointsale.users.first.usertype = 'G'
-		@pointsale.users.first.status = 1
-		@pointsale.prefix.upcase!
-		respond_to do |format|
-			if @pointsale.save
-				@pointsale.users.first.pointsale_id = @pointsale.id
-				main_cash_register = CashRegister.new
-				main_cash_register.name = @pointsale.name + " Principal"
-				main_cash_register.description = "Caja registradora principal"
-				main_cash_register.pointsale_id = @pointsale.id
-				main_cash_register.main = 'yes'
-				main_cash_register.status = 'active'
-				main_cash_register.save
-
-				format.html { redirect_to pointsales_url, success: "El punto de venta " + @pointsale.name + " fue creado." }
-				format.json { render :show, status: :created, location: @pointsale }
-			else
-				format.html { render :new }
-				format.json { render json: @pointsale.errors, status: :unprocessable_entity }
-			end
-		end
-	end
-
-	# PATCH/PUT /pointsales/1
-	# PATCH/PUT /pointsales/1.json
-	def update
-		respond_to do |format|
-			if @pointsale.update(pointsale_params)
-				@pointsale.audit_comment = "El punto de venta #{@pointsale.name} fue modificado."
-				format.html { redirect_to pointsales_url, success: "El punto de venta #{@pointsale.name} fue modificado." }
-				format.json { render :show, status: :ok, location: @pointsale }
-			else
-				format.html { render :edit }
-				format.json { render json: @pointsale.errors, status: :unprocessable_entity }
-			end
-		end
-	end
-
-	def update_status
-	    pointsale = Pointsale.find(params[:pointsale_id])
-	    puts pointsale.active?
-    	if pointsale.active?
-    		pointsale.status = 2
-    	elsif pointsale.inactive?
-    		pointsale.status = 1
-    	end
-	    respond_to do |format|
-	    	if pointsale.save(:validate => false)
-	    		pointsale.users.each do |user|
-	    			if !user.erased?
-	    				user.status = pointsale.status
-	    				user.save(:validate => false)
-	    			end
-	    		end
-	        	format.html { redirect_to pointsales_url, warning: "El punto de venta " + pointsale.name + " fue "+ (pointsale.active? ? "activado" : "desactivado")+"." }
-				# format.json { render :show, status: :ok, location: @pointsale }
-				format.json { head :no_content }
-			else
-				format.html { redirect_to pointsales_url }
-				format.json { render json: @pointsale.errors, status: :unprocessable_entity }
-			end
-	    end
-	end
-
-	def transfer_stock
-		respond_to do |format|
-			destiny = params[:destiny][2, params[:destiny].length]
-
-			availables = AvailableProduct.where('id in (?)', params[:all_ids])
-
-			AvailableProduct.find(params[:ids_to_transfer]).each do |available|
-				if params[:destiny].first == 'P'
-					# es a punto de venta
-					stockProduct = AvailableProduct.find_by(:product_id => available.product_id, :pointsale_id => destiny)
-					if stockProduct.present?
-						stockProduct.stock += available.stock
-					else
-						stockProduct = available.dup
-						stockProduct.pointsale_id = destiny
-					end
-				else
-					# es a almacen
-					stockProduct = WarehouseStock.find_by(:product_id => available.product_id, :warehouse_id => destiny)
-					if stockProduct.present?
-						stockProduct.stock += available.stock
-					else
-						stockProduct = WarehouseStock.new
-						stockProduct.warehouse_id = destiny
-						stockProduct.product_id = available.product_id
-						stockProduct.stock_min = available.stock_min
-						stockProduct.stock_max = available.stock_max
-						stockProduct.stock = available.stock
-					end
-				end
-				stockProduct.save
-				available.destroy
-		 	end
-
-		 	availables_with_zero = params[:all_ids] - params[:ids_to_transfer]
-		 	if availables_with_zero.length > 0
-		 		AvailableProduct.where(id: availables_with_zero).delete_all
-		 	end
-		 	format.json { head :ok }
-		end
-	end
-
-  	def assign_or_delete_products
-  		@todo = params[:todo]
-  		if @todo == 'delete'
-  			@products = AvailableProduct.find(params[:ids])
-  		elsif @todo == 'assign'
-  			@products = Product.find(params[:ids])
-  		end
-
-	    @pointsale = Pointsale.find(params[:pointsale_id])
-  	end
-
-  	def assign_products_to_pointsale
-  		respond_to do |format|
-		    @products = JSON.parse params[:products]
-		    @products.each do | product |
-		    	available = AvailableProduct.new
-		    	available.product_id = product['id']
-		    	available.pointsale_id = params[:pointsale_id]
-		    	available.stock_min = 0
-		    	available.stock_max = 0
-		    	available.stock = product['stock']
-		    	available.save
-		    end
-		    format.json { head :ok }
-  		end
-  	end
-
-  	def delete_products_from_pointsale
-  		respond_to do |format|
-  			@ids = params[:ids]
-			@to_delete_with_stock = AvailableProduct.where("id in (?) and stock > 0", @ids)
-			@ids_array = Array.new
-			@ids.each do |id|
-				@ids_array << id
-			end
-			@ids_array = @ids_array.to_s
-
-			if @to_delete_with_stock.blank?
-				AvailableProduct.where(id: @ids).delete_all
-			end
-			format.js
-  		end
-  	end
-
-	# DELETE /pointsales/1
-	# DELETE /pointsales/1.json
-	def destroy
-		respond_to do |format|
-			@pointsale.skip_name_validation =  true
-			@pointsale.skip_products_validation =  true
-			@pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue eliminado."
-			if @pointsale.update_attributes(:status => 0)
-				CashRegister.where(:pointsale_id => @pointsale.id).update_all(:status => 'erased')
-				format.html { redirect_to pointsales_url, warning: "El punto de venta " + @pointsale.name + " fue eliminado." }
-				format.json { head :no_content }
-			else
-				format.html { render :edit }
-				format.json { render json: @pointsale.errors, status: :unprocessable_entity }
-			end
-		end
-	end
-
-	# GET /pointsales/1/update_products
-	# def update_products
-	#   respond_to do |format|
-	#     if @pointsale.save
-	#       #format.html { redirect_to @pointsale, notice: 'El punto de venta fue creado.' }
-	#       format.html { redirect_to pointsales_url, success: "El punto de venta " + @pointsale.name + " fue creado." }
-	#       format.json { render :show, status: :created, location: @pointsale }
-	#     else
-	#       format.html { render :update_products }
-	#       format.json { render json: @pointsale.errors, status: :unprocessable_entity }
-	#     end
-	#   end
-	# end
-
-
-	private
-		# Use callbacks to share common setup or constraints between actions.
-		def set_pointsale
-			@pointsale = Pointsale.find(params[:id])
-		end
-
-		def get_filters
-			if params[:current_page].blank?
-				@current_page = 1
-			else
-				@current_page = params[:current_page]
-			end
-			@filter = params[:filter]
-		end
-
-		# Never trust parameters from the scary internet, only allow the white list through.
-		def pointsale_params
-			params.require(:pointsale).permit(:name, :address, :notes, :status, :prefix, :img_pointsale, :img_pointsale_cache, :ticket_footer, :product_ids => [], users_attributes:[:userid, :first_name, :last_name, :password, :email, :password_confirmation])
-		end
+  ##--- Abilities
+  load_and_authorize_resource
+
+  ##--- Breadcrum_rails
+  add_breadcrumb I18n.t("breadcrumbs." + controller_name), :pointsales_path
+  add_breadcrumb "Nuevo Punto de venta", :new_pointsale_path, only: :new
+  add_breadcrumb "Detalle del Punto de venta", :pointsale_path, only: :show
+
+  before_action :set_pointsale, only: [:show, :edit, :update, :destroy, :update_products]
+  before_action :get_filters, only: [:index, :show, :edit, :new]
+  # before_action :get_available_products, only: [:edit, :update]
+
+  # GET /pointsales
+  # GET /pointsales.json
+  def index
+    @pointsales = Pointsale.vigentes
+  end
+
+  # GET /pointsales/1
+  # GET /pointsales/1.json
+  def show; end
+
+  # GET /pointsales/new
+  def new
+    @pointsale = Pointsale.new
+  end
+
+  # GET /pointsales/1/edit
+  def edit
+    @todo = params[:todo]
+    add_breadcrumb (@todo.present? ? "Actualizar productos del punto de venta " : "Editar Punto de venta"), :edit_pointsale_path, only: :edit
+    respond_to do |format|
+      format.html
+      format.json { render json: AvailableProductsDatatable.new(view_context, @pointsale) }
+    end
+  end
+
+  # POST /pointsales
+  # POST /pointsales.json
+  def create
+    @pointsale = Pointsale.new(pointsale_params)
+    @pointsale.skip_name_validation = false
+    @pointsale.skip_products_validation = false
+    @pointsale.users.first.skip_validations_from_pointsale = true
+    @pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue creado."
+    @pointsale.users.first.usertype = 'G'
+    @pointsale.users.first.status = 1
+    @pointsale.prefix.upcase!
+    respond_to do |format|
+      if @pointsale.save
+        @pointsale.users.first.pointsale_id = @pointsale.id
+        main_cash_register = CashRegister.new
+        main_cash_register.name = @pointsale.name + " Principal"
+        main_cash_register.description = "Caja registradora principal"
+        main_cash_register.pointsale_id = @pointsale.id
+        main_cash_register.main = 'yes'
+        main_cash_register.status = 'active'
+        main_cash_register.save
+
+        format.html { redirect_to pointsales_url, success: "El punto de venta " + @pointsale.name + " fue creado." }
+        format.json { render :show, status: :created, location: @pointsale }
+      else
+        format.html { render :new }
+        format.json { render json: @pointsale.errors, status: :unprocessable_entity }
+      end
+    end
+  end
+
+  # PATCH/PUT /pointsales/1
+  # PATCH/PUT /pointsales/1.json
+  def update
+    respond_to do |format|
+      if @pointsale.update(pointsale_params)
+        @pointsale.audit_comment = "El punto de venta #{@pointsale.name} fue modificado."
+        format.html { redirect_to pointsales_url, success: "El punto de venta #{@pointsale.name} fue modificado." }
+        format.json { render :show, status: :ok, location: @pointsale }
+      else
+        format.html { render :edit }
+        format.json { render json: @pointsale.errors, status: :unprocessable_entity }
+      end
+    end
+  end
+
+  def update_status
+    pointsale = Pointsale.find(params[:pointsale_id])
+    if pointsale.active?
+      pointsale.status = 2
+    elsif pointsale.inactive?
+      pointsale.status = 1
+    end
+    respond_to do |format|
+      if pointsale.save(validate: false)
+        pointsale.users.each do |user|
+          unless user.erased?
+            user.status = pointsale.status
+            user.save(validate: false)
+          end
+        end
+        format.html { redirect_to pointsales_url, warning: "El punto de venta " + pointsale.name + " fue " + (pointsale.active? ? "activado" : "desactivado") + "." }
+        # format.json { render :show, status: :ok, location: @pointsale }
+        format.json { head :no_content }
+      else
+        format.html { redirect_to pointsales_url }
+        format.json { render json: @pointsale.errors, status: :unprocessable_entity }
+      end
+    end
+  end
+
+  # rubocop:disable Metrics/BlockLength
+  def transfer_stock
+    respond_to do |format|
+      destiny = params[:destiny][2, params[:destiny].length]
+      availables = AvailableProduct.where('id in (?)', params[:all_ids])
+
+      AvailableProduct.find(params[:ids_to_transfer]).each do |available|
+        if params[:destiny].first == 'P' # es a punto de venta
+          stock_product = AvailableProduct.find_by(product_id: available.product_id, pointsale_id: destiny)
+          if stock_product.present?
+            stock_product.stock += available.stock
+          else
+            stock_product = available.dup
+            stock_product.pointsale_id = destiny
+          end
+        else
+          # es a almacen
+          stock_product = WarehouseStock.find_by(product_id: available.product_id, warehouse_id: destiny)
+          if stock_product.present?
+            stock_product.stock += available.stock
+          else
+            stock_product = WarehouseStock.new(warehouse_id: destiny, product_id: available.product_id, stock_min: available.stock_min, stock_max: available.stock_max, stock: available.stock)
+          end
+        end
+        stock_product.save
+        available.destroy
+      end
+
+      availables_with_zero = params[:all_ids] - params[:ids_to_transfer]
+      unless availables_with_zero.empty?
+        AvailableProduct.where(id: availables_with_zero).delete_all
+      end
+      format.json { head :ok }
+    end
+  end
+  # rubocop:enable Metrics/BlockLength
+
+  def assign_or_delete_products
+    @todo = params[:todo]
+    if @todo == 'delete'
+      @products = AvailableProduct.find(params[:ids])
+    elsif @todo == 'assign'
+      @products = Product.find(params[:ids])
+    end
+    @pointsale = Pointsale.find(params[:pointsale_id])
+  end
+
+  def assign_products_to_pointsale
+    respond_to do |format|
+      @products = JSON.parse params[:products]
+      @products.each do |product|
+        available = AvailableProduct.new
+        available.product_id = product['id']
+        available.pointsale_id = params[:pointsale_id]
+        available.stock_min = 0
+        available.stock_max = 0
+        available.stock = product['stock']
+        available.save
+      end
+      format.json { head :ok }
+    end
+  end
+
+  def delete_products_from_pointsale
+    respond_to do |format|
+      @ids = params[:ids]
+      @to_delete_with_stock = AvailableProduct.where("id in (?) and stock > 0", @ids)
+      @ids_array = Array.new
+      @ids.each do |id|
+        @ids_array << id
+      end
+      @ids_array = @ids_array.to_s
+
+      if @to_delete_with_stock.blank?
+        AvailableProduct.where(id: @ids).delete_all
+      end
+      format.js
+    end
+  end
+
+  # DELETE /pointsales/1
+  # DELETE /pointsales/1.json
+  def destroy
+    respond_to do |format|
+      @pointsale.skip_name_validation = true
+      @pointsale.skip_products_validation = true
+      @pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue eliminado."
+      if @pointsale.update_attributes(status: 0)
+        CashRegister.where(pointsale_id: @pointsale.id).update_all(status: 'erased')
+        format.html { redirect_to pointsales_url, warning: "El punto de venta " + @pointsale.name + " fue eliminado." }
+        format.json { head :no_content }
+      else
+        format.html { render :edit }
+        format.json { render json: @pointsale.errors, status: :unprocessable_entity }
+      end
+    end
+  end
+
+  private
+
+  def set_pointsale
+    @pointsale = Pointsale.find(params[:id])
+  end
+
+  def get_filters
+    @current_page = params[:current_page].blank? ? 1 : params[:current_page]
+    @filter = params[:filter]
+  end
+
+  def pointsale_params
+    params.require(:pointsale).permit(:name, :address, :notes, :status, :prefix, :img_pointsale, :img_pointsale_cache, :ticket_footer, :haggle_percent, users_attributes: [:userid, :first_name, :last_name, :password, :email, :password_confirmation])
+  end
 end

+ 2 - 1
app/controllers/sales_controller.rb

@@ -360,7 +360,8 @@ class SalesController < ApplicationController
 
   def add_haggle
     @pre_sale = PreSale.find(params[:pre_sale])
-    @suggested_haggle = (@pos_config.haggle_in_sale_percent.to_f / 100) * @pre_sale.unit_price
+    @haggle_percent = current_user.pointsale.haggle_percent.zero? ? @pos_config.haggle_in_sale_percent : current_user.pointsale.haggle_percent
+    @suggested_haggle = (@haggle_percent.to_f / 100) * @pre_sale.unit_price
   end
 
   def create_haggle

+ 6 - 0
app/views/pointsales/_form.html.erb

@@ -31,6 +31,12 @@
 					<%= f.text_field :address, {:class=>"form-control"} %>
 				</div>
 			</div>
+			<div class="form-group">
+				<%= f.label :haggle_percent, {:class=>"col-md-3 control-label"} do %> Porcentaje de regateo para ventas <% end %>
+				<div class="col-md-2">
+					<%= f.number_field :haggle_percent, {:class=>"form-control" }  %>
+				</div>
+			</div>
 			<div class="form-group">
 				<%= f.label :notes, "Encabezado para el ticket", {:class=>"col-md-3 control-label"} %>
 				<div class="col-md-9">

+ 1 - 1
app/views/sales/_add_haggle.html.erb

@@ -27,7 +27,7 @@
                             <%= number_field_tag :haggle_percent, '', class: "form-control input-mask_decimal", min:0, max:100, step: "any" %>
                             <span class="input-group-addon"> % </span>
                         </div>
-                        <span class="help-block">Recomendado: <strong><%= @pos_config.haggle_in_sale_percent %></strong> %</span>
+                        <span class="help-block">Recomendado: <strong><%= @haggle_percent %></strong> %</span>
                     </div>
                 </div>
                 <div class="form-group">

+ 5 - 0
db/migrate/20180724174236_add_haggle_percent_to_pointsale.rb

@@ -0,0 +1,5 @@
+class AddHagglePercentToPointsale < ActiveRecord::Migration
+  def change
+  	add_column :pointsales, :haggle_percent, :decimal, precision: 10, scale: 2, :default => 0
+  end
+end