pointsales_controller.rb 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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
  19. end
  20. # GET /pointsales/new
  21. def new
  22. @pointsale = Pointsale.new
  23. # @pointsale.users.new
  24. end
  25. # GET /pointsales/1/edit
  26. def edit
  27. @todo = params[:todo]
  28. add_breadcrumb ( @todo.present? ? "Actualizar productos del punto de venta " : "Editar Punto de venta") , :edit_pointsale_path, only: :edit
  29. respond_to do |format|
  30. format.html
  31. format.json { render json: AvailableProductsDatatable.new(view_context, @pointsale) }
  32. end
  33. end
  34. # POST /pointsales
  35. # POST /pointsales.json
  36. def create
  37. @pointsale = Pointsale.new(pointsale_params)
  38. @pointsale.skip_name_validation = false
  39. @pointsale.skip_products_validation = false
  40. @pointsale.users.first.skip_validations_from_pointsale = true
  41. @pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue creado."
  42. @pointsale.users.first.usertype = 'G'
  43. @pointsale.users.first.status = 1
  44. @pointsale.prefix.upcase!
  45. respond_to do |format|
  46. if @pointsale.save
  47. @pointsale.users.first.pointsale_id = @pointsale.id
  48. main_cash_register = CashRegister.new
  49. main_cash_register.name = @pointsale.name + " Principal"
  50. main_cash_register.description = "Caja registradora principal"
  51. main_cash_register.pointsale_id = @pointsale.id
  52. main_cash_register.main = 'yes'
  53. main_cash_register.status = 'active'
  54. main_cash_register.save
  55. format.html { redirect_to pointsales_url, success: "El punto de venta " + @pointsale.name + " fue creado." }
  56. format.json { render :show, status: :created, location: @pointsale }
  57. else
  58. format.html { render :new }
  59. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  60. end
  61. end
  62. end
  63. # PATCH/PUT /pointsales/1
  64. # PATCH/PUT /pointsales/1.json
  65. def update
  66. respond_to do |format|
  67. if @pointsale.update(pointsale_params)
  68. @pointsale.audit_comment = "El punto de venta #{@pointsale.name} fue modificado."
  69. format.html { redirect_to pointsales_url, success: "El punto de venta #{@pointsale.name} fue modificado." }
  70. format.json { render :show, status: :ok, location: @pointsale }
  71. else
  72. format.html { render :edit }
  73. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  74. end
  75. end
  76. end
  77. def update_status
  78. pointsale = Pointsale.find(params[:pointsale_id])
  79. puts pointsale.active?
  80. if pointsale.active?
  81. pointsale.status = 2
  82. elsif pointsale.inactive?
  83. pointsale.status = 1
  84. end
  85. respond_to do |format|
  86. if pointsale.save(:validate => false)
  87. pointsale.users.each do |user|
  88. if !user.erased?
  89. user.status = pointsale.status
  90. user.save(:validate => false)
  91. end
  92. end
  93. format.html { redirect_to pointsales_url, warning: "El punto de venta " + pointsale.name + " fue "+ (pointsale.active? ? "activado" : "desactivado")+"." }
  94. # format.json { render :show, status: :ok, location: @pointsale }
  95. format.json { head :no_content }
  96. else
  97. format.html { redirect_to pointsales_url }
  98. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  99. end
  100. end
  101. end
  102. def transfer_stock
  103. respond_to do |format|
  104. destiny = params[:destiny][2, params[:destiny].length]
  105. availables = AvailableProduct.where('id in (?)', params[:all_ids])
  106. AvailableProduct.find(params[:ids_to_transfer]).each do |available|
  107. if params[:destiny].first == 'P'
  108. # es a punto de venta
  109. stockProduct = AvailableProduct.find_by(:product_id => available.product_id, :pointsale_id => destiny)
  110. if stockProduct.present?
  111. stockProduct.stock += available.stock
  112. else
  113. stockProduct = available.dup
  114. stockProduct.pointsale_id = destiny
  115. end
  116. else
  117. # es a almacen
  118. stockProduct = WarehouseStock.find_by(:product_id => available.product_id, :warehouse_id => destiny)
  119. if stockProduct.present?
  120. stockProduct.stock += available.stock
  121. else
  122. stockProduct = WarehouseStock.new
  123. stockProduct.warehouse_id = destiny
  124. stockProduct.product_id = available.product_id
  125. stockProduct.stock_min = available.stock_min
  126. stockProduct.stock_max = available.stock_max
  127. stockProduct.stock = available.stock
  128. end
  129. end
  130. stockProduct.save
  131. available.destroy
  132. end
  133. availables_with_zero = params[:all_ids] - params[:ids_to_transfer]
  134. if availables_with_zero.length > 0
  135. AvailableProduct.where(id: availables_with_zero).delete_all
  136. end
  137. format.json { head :ok }
  138. end
  139. end
  140. def assign_or_delete_products
  141. @todo = params[:todo]
  142. if @todo == 'delete'
  143. @products = AvailableProduct.find(params[:ids])
  144. elsif @todo == 'assign'
  145. @products = Product.find(params[:ids])
  146. end
  147. @pointsale = Pointsale.find(params[:pointsale_id])
  148. end
  149. def assign_products_to_pointsale
  150. respond_to do |format|
  151. @products = JSON.parse params[:products]
  152. @products.each do | product |
  153. available = AvailableProduct.new
  154. available.product_id = product['id']
  155. available.pointsale_id = params[:pointsale_id]
  156. available.stock_min = 0
  157. available.stock_max = 0
  158. available.stock = product['stock']
  159. available.save
  160. end
  161. format.json { head :ok }
  162. end
  163. end
  164. def delete_products_from_pointsale
  165. respond_to do |format|
  166. @ids = params[:ids]
  167. @to_delete_with_stock = AvailableProduct.where("id in (?) and stock > 0", @ids)
  168. @ids_array = Array.new
  169. @ids.each do |id|
  170. @ids_array << id
  171. end
  172. @ids_array = @ids_array.to_s
  173. if @to_delete_with_stock.blank?
  174. AvailableProduct.where(id: @ids).delete_all
  175. end
  176. format.js
  177. end
  178. end
  179. # DELETE /pointsales/1
  180. # DELETE /pointsales/1.json
  181. def destroy
  182. respond_to do |format|
  183. @pointsale.skip_name_validation = true
  184. @pointsale.skip_products_validation = true
  185. @pointsale.audit_comment = "El punto de venta " + @pointsale.name + " fue eliminado."
  186. if @pointsale.update_attributes(:status => 0)
  187. CashRegister.where(:pointsale_id => @pointsale.id).update_all(:status => 'erased')
  188. format.html { redirect_to pointsales_url, warning: "El punto de venta " + @pointsale.name + " fue eliminado." }
  189. format.json { head :no_content }
  190. else
  191. format.html { render :edit }
  192. format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  193. end
  194. end
  195. end
  196. # GET /pointsales/1/update_products
  197. # def update_products
  198. # respond_to do |format|
  199. # if @pointsale.save
  200. # #format.html { redirect_to @pointsale, notice: 'El punto de venta fue creado.' }
  201. # format.html { redirect_to pointsales_url, success: "El punto de venta " + @pointsale.name + " fue creado." }
  202. # format.json { render :show, status: :created, location: @pointsale }
  203. # else
  204. # format.html { render :update_products }
  205. # format.json { render json: @pointsale.errors, status: :unprocessable_entity }
  206. # end
  207. # end
  208. # end
  209. private
  210. # Use callbacks to share common setup or constraints between actions.
  211. def set_pointsale
  212. @pointsale = Pointsale.find(params[:id])
  213. end
  214. def get_filters
  215. if params[:current_page].blank?
  216. @current_page = 1
  217. else
  218. @current_page = params[:current_page]
  219. end
  220. @filter = params[:filter]
  221. end
  222. # Never trust parameters from the scary internet, only allow the white list through.
  223. def pointsale_params
  224. 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])
  225. end
  226. end