pointsales_controller.rb 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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
  47. main_cash_register.name = @pointsale.name + " Principal"
  48. main_cash_register.description = "Caja registradora principal"
  49. main_cash_register.pointsale_id = @pointsale.id
  50. main_cash_register.main = 'yes'
  51. main_cash_register.status = 'active'
  52. main_cash_register.save
  53. format.html { redirect_to pointsales_url, success: "El punto de venta " + @pointsale.name + " fue creado." }
  54. format.json { render :show, status: :created, location: @pointsale }
  55. else
  56. format.html { render :new }
  57. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  58. end
  59. end
  60. end
  61. # PATCH/PUT /pointsales/1
  62. # PATCH/PUT /pointsales/1.json
  63. def update
  64. respond_to do |format|
  65. if @pointsale.update(pointsale_params)
  66. @pointsale.audit_comment = "El punto de venta #{@pointsale.name} fue modificado."
  67. format.html { redirect_to pointsales_url, success: "El punto de venta #{@pointsale.name} fue modificado." }
  68. format.json { render :show, status: :ok, location: @pointsale }
  69. else
  70. format.html { render :edit }
  71. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  72. end
  73. end
  74. end
  75. def update_status
  76. pointsale = Pointsale.find(params[:pointsale_id])
  77. if pointsale.active?
  78. pointsale.status = 2
  79. elsif pointsale.inactive?
  80. pointsale.status = 1
  81. end
  82. respond_to do |format|
  83. if pointsale.save(validate: false)
  84. pointsale.users.each do |user|
  85. unless user.erased?
  86. user.status = pointsale.status
  87. user.save(validate: false)
  88. end
  89. end
  90. format.html { redirect_to pointsales_url, warning: "El punto de venta " + pointsale.name + " fue " + (pointsale.active? ? "activado" : "desactivado") + "." }
  91. # format.json { render :show, status: :ok, location: @pointsale }
  92. format.json { head :no_content }
  93. else
  94. format.html { redirect_to pointsales_url }
  95. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  96. end
  97. end
  98. end
  99. # rubocop:disable Metrics/BlockLength
  100. def transfer_stock
  101. respond_to do |format|
  102. destiny = params[:destiny][2, params[:destiny].length]
  103. availables = AvailableProduct.where('id in (?)', params[:all_ids])
  104. AvailableProduct.find(params[:ids_to_transfer]).each do |available|
  105. if params[:destiny].first == 'P' # es a punto de venta
  106. stock_product = AvailableProduct.find_by(product_id: available.product_id, pointsale_id: destiny)
  107. if stock_product.present?
  108. stock_product.stock += available.stock
  109. else
  110. stock_product = available.dup
  111. stock_product.pointsale_id = destiny
  112. end
  113. else
  114. # es a almacen
  115. stock_product = WarehouseStock.find_by(product_id: available.product_id, warehouse_id: destiny)
  116. if stock_product.present?
  117. stock_product.stock += available.stock
  118. else
  119. 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)
  120. end
  121. end
  122. stock_product.save
  123. available.destroy
  124. end
  125. availables_with_zero = params[:all_ids] - params[:ids_to_transfer]
  126. unless availables_with_zero.empty?
  127. AvailableProduct.where(id: availables_with_zero).delete_all
  128. end
  129. format.json { head :ok }
  130. end
  131. end
  132. # rubocop:enable Metrics/BlockLength
  133. def assign_or_delete_products
  134. @todo = params[:todo]
  135. if @todo == 'delete'
  136. @products = AvailableProduct.find(params[:ids])
  137. elsif @todo == 'assign'
  138. @products = Product.find(params[:ids])
  139. end
  140. @pointsale = Pointsale.find(params[:pointsale_id])
  141. end
  142. def assign_products_to_pointsale
  143. respond_to do |format|
  144. @products = JSON.parse params[:products]
  145. @products.each do |product|
  146. available = AvailableProduct.new
  147. available.product_id = product['id']
  148. available.pointsale_id = params[:pointsale_id]
  149. available.stock_min = 0
  150. available.stock_max = 0
  151. available.stock = product['stock']
  152. available.save
  153. end
  154. format.json { head :ok }
  155. end
  156. end
  157. def delete_products_from_pointsale
  158. respond_to do |format|
  159. @ids = params[:ids]
  160. @to_delete_with_stock = AvailableProduct.where("id in (?) and stock > 0", @ids)
  161. @ids_array = Array.new
  162. @ids.each do |id|
  163. @ids_array << id
  164. end
  165. @ids_array = @ids_array.to_s
  166. if @to_delete_with_stock.blank?
  167. AvailableProduct.where(id: @ids).delete_all
  168. end
  169. format.js
  170. end
  171. end
  172. # DELETE /pointsales/1
  173. # DELETE /pointsales/1.json
  174. def destroy
  175. respond_to do |format|
  176. @pointsale.skip_name_validation = true
  177. @pointsale.skip_products_validation = true
  178. @pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue eliminado."
  179. if @pointsale.update_attributes(status: 0)
  180. CashRegister.where(pointsale_id: @pointsale.id).update_all(status: 'erased')
  181. format.html { redirect_to pointsales_url, warning: "El punto de venta " + @pointsale.name + " fue eliminado." }
  182. format.json { head :no_content }
  183. else
  184. format.html { render :edit }
  185. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  186. end
  187. end
  188. end
  189. private
  190. def set_pointsale
  191. @pointsale = Pointsale.find(params[:id])
  192. end
  193. def get_filters
  194. @current_page = params[:current_page].blank? ? 1 : params[:current_page]
  195. @filter = params[:filter]
  196. end
  197. def pointsale_params
  198. 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])
  199. end
  200. end