pointsales_controller.rb 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. class PointsalesController < ApplicationController
  2. ##--- Abilities
  3. load_and_authorize_resource
  4. ##--- Breadcrum_rails
  5. add_breadcrumb I18n.t("breadcrumbs." + controller_name), :pointsales_path
  6. add_breadcrumb "Nuevo Punto de venta", :new_pointsale_path, only: :new
  7. add_breadcrumb "Detalle del Punto de venta", :pointsale_path, only: :show
  8. before_action :set_pointsale, only: [:show, :edit, :update, :destroy, :update_products]
  9. before_action :get_filters, only: [:index, :show, :edit, :new]
  10. # before_action :get_available_products, only: [:edit, :update]
  11. # GET /pointsales
  12. # GET /pointsales.json
  13. def index
  14. @pointsales = Pointsale.vigentes
  15. end
  16. # GET /pointsales/1
  17. # GET /pointsales/1.json
  18. def show; end
  19. # GET /pointsales/new
  20. def new
  21. @pointsale = Pointsale.new
  22. end
  23. # GET /pointsales/1/edit
  24. def edit
  25. @todo = params[:todo]
  26. add_breadcrumb (@todo.present? ? "Actualizar productos del punto de venta " : "Editar Punto de venta"), :edit_pointsale_path, only: :edit
  27. respond_to do |format|
  28. format.html
  29. format.json { render json: AvailableProductsDatatable.new(view_context, @pointsale) }
  30. end
  31. end
  32. # POST /pointsales
  33. # POST /pointsales.json
  34. def create
  35. @pointsale = Pointsale.new(pointsale_params)
  36. @pointsale.skip_name_validation = false
  37. @pointsale.skip_products_validation = false
  38. @pointsale.users.first.skip_validations_from_pointsale = true
  39. @pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue creado."
  40. @pointsale.users.first.usertype = 'G'
  41. @pointsale.users.first.status = 1
  42. @pointsale.prefix.upcase!
  43. respond_to do |format|
  44. if @pointsale.save
  45. @pointsale.users.first.pointsale_id = @pointsale.id
  46. main_cash_register = CashRegister.new(name: "#{@pointsale.name} Principal", description: "Caja registradora principal", pointsale_id: @pointsale.id, main: 'yes', status: 'active')
  47. main_cash_register.save
  48. format.html { redirect_to pointsales_url, success: "El punto de venta " + @pointsale.name + " fue creado." }
  49. format.json { render :show, status: :created, location: @pointsale }
  50. else
  51. format.html { render :new }
  52. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  53. end
  54. end
  55. end
  56. # PATCH/PUT /pointsales/1
  57. # PATCH/PUT /pointsales/1.json
  58. def update
  59. respond_to do |format|
  60. if @pointsale.update(pointsale_params)
  61. @pointsale.audit_comment = "El punto de venta #{@pointsale.name} fue modificado."
  62. format.html { redirect_to pointsales_url, success: "El punto de venta #{@pointsale.name} fue modificado." }
  63. format.json { render :show, status: :ok, location: @pointsale }
  64. else
  65. format.html { render :edit }
  66. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  67. end
  68. end
  69. end
  70. def update_status
  71. pointsale = Pointsale.find(params[:pointsale_id])
  72. if pointsale.active?
  73. pointsale.status = 2
  74. elsif pointsale.inactive?
  75. pointsale.status = 1
  76. end
  77. respond_to do |format|
  78. if pointsale.save(validate: false)
  79. pointsale.users.each do |user|
  80. unless user.erased?
  81. user.status = pointsale.status
  82. user.save(validate: false)
  83. end
  84. end
  85. format.html { redirect_to pointsales_url, warning: "El punto de venta " + pointsale.name + " fue " + (pointsale.active? ? "activado" : "desactivado") + "." }
  86. # format.json { render :show, status: :ok, location: @pointsale }
  87. format.json { head :no_content }
  88. else
  89. format.html { redirect_to pointsales_url }
  90. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  91. end
  92. end
  93. end
  94. # rubocop:disable Metrics/BlockLength
  95. def transfer_stock
  96. respond_to do |format|
  97. destiny = params[:destiny][2, params[:destiny].length]
  98. availables = AvailableProduct.where('id in (?)', params[:all_ids])
  99. AvailableProduct.find(params[:ids_to_transfer]).each do |available|
  100. if params[:destiny].first == 'P' # es a punto de venta
  101. stock_product = AvailableProduct.find_by(product_id: available.product_id, pointsale_id: destiny)
  102. if stock_product.present?
  103. stock_product.stock += available.stock
  104. else
  105. stock_product = available.dup
  106. stock_product.pointsale_id = destiny
  107. end
  108. else
  109. # es a almacen
  110. stock_product = WarehouseStock.find_by(product_id: available.product_id, warehouse_id: destiny)
  111. if stock_product.present?
  112. stock_product.stock += available.stock
  113. else
  114. 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)
  115. end
  116. end
  117. stock_product.save
  118. available.destroy
  119. end
  120. availables_with_zero = params[:all_ids] - params[:ids_to_transfer]
  121. unless availables_with_zero.empty?
  122. AvailableProduct.where(id: availables_with_zero).delete_all
  123. end
  124. format.json { head :ok }
  125. end
  126. end
  127. # rubocop:enable Metrics/BlockLength
  128. def assign_or_delete_products
  129. @todo = params[:todo]
  130. if @todo == 'delete'
  131. @products = AvailableProduct.find(params[:ids])
  132. elsif @todo == 'assign'
  133. @products = Product.find(params[:ids])
  134. end
  135. @pointsale = Pointsale.find(params[:pointsale_id])
  136. end
  137. def assign_products_to_pointsale
  138. respond_to do |format|
  139. @products = JSON.parse params[:products]
  140. @products.each do |product|
  141. available = AvailableProduct.new(product_id: product['id'], pointsale_id: params[:pointsale_id], stock_min: 0, stock_max: 0, stock: product['stock'], price_sale: product['price'].to_f > 0 ? product['price'].to_f : Product.find(product['id']).price_sale)
  142. available.save
  143. end
  144. format.json { head :ok }
  145. end
  146. end
  147. def delete_products_from_pointsale
  148. respond_to do |format|
  149. @ids = params[:ids]
  150. @to_delete_with_stock = AvailableProduct.where("id in (?) and stock > 0", @ids)
  151. @ids_array = Array.new
  152. @ids.each do |id|
  153. @ids_array << id
  154. end
  155. @ids_array = @ids_array.to_s
  156. if @to_delete_with_stock.blank?
  157. AvailableProduct.where(id: @ids).delete_all
  158. end
  159. format.js
  160. end
  161. end
  162. # DELETE /pointsales/1
  163. # DELETE /pointsales/1.json
  164. def destroy
  165. respond_to do |format|
  166. @pointsale.skip_name_validation = true
  167. @pointsale.skip_products_validation = true
  168. @pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue eliminado."
  169. if @pointsale.update_attributes(status: 0)
  170. CashRegister.where(pointsale_id: @pointsale.id).update_all(status: 'erased')
  171. format.html { redirect_to pointsales_url, warning: "El punto de venta " + @pointsale.name + " fue eliminado." }
  172. format.json { head :no_content }
  173. else
  174. format.html { render :edit }
  175. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  176. end
  177. end
  178. end
  179. private
  180. def set_pointsale
  181. @pointsale = Pointsale.find(params[:id])
  182. end
  183. def get_filters
  184. @current_page = params[:current_page].blank? ? 1 : params[:current_page]
  185. @filter = params[:filter]
  186. end
  187. def pointsale_params
  188. params.require(:pointsale).permit(:name, :address, :notes, :status, :prefix, :img_pointsale, :img_pointsale_cache, :ticket_footer, :haggle_percent, :tax_regime, :business_name, :federal_taxpayer_registration, :postal_code, users_attributes: [:userid, :first_name, :last_name, :password, :email, :password_confirmation])
  189. end
  190. end