pre_sales_controller.rb 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. class PreSalesController < ApplicationController
  2. before_action :set_pre_sale, only: [:show, :edit, :update, :destroy]
  3. # GET /pre_sales/new
  4. def new; end
  5. # POST /pre_sales
  6. # POST /pre_sales.json
  7. def create
  8. total_in_pre_sales = 0
  9. @pre_sale = PreSale.new(pre_sale_params)
  10. @pre_sale.user_id = current_user.id
  11. # Sumar los totales de los presales en caso que exista.
  12. PreSale.where(user_id: @pre_sale.user_id).each do |pre|
  13. total_in_pre_sales = total_in_pre_sales + pre.total
  14. end
  15. #precio unitario
  16. @pre_sale.unit_price = @pre_sale.product.get_price_sale(OpenCashRegister.find(@pre_sale.open_cash_register_id).pointsale.id)
  17. @pre_sale.get_totals
  18. total_in_pre_sales += @pre_sale.total
  19. respond_to do |format|
  20. if has_enough_stock?(@pre_sale)
  21. #cuando la venta es a credito checar que el credito permita esta nueva venta
  22. if @pre_sale.sale_type == "credit"
  23. debiting = @pre_sale.customer.get_debiting
  24. if @pre_sale.customer.sale_approved?(debiting + total_in_pre_sales)
  25. if @pre_sale.save
  26. format.js
  27. else
  28. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  29. end
  30. else
  31. @pre_sale.errors.add(:customer_id, "El cliente ya no tiene crédito disponible.")
  32. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  33. end
  34. elsif @pre_sale.sale_type == "cash"
  35. if @pre_sale.save
  36. format.js
  37. else
  38. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  39. end
  40. elsif @pre_sale.sale_type == "reserved"
  41. if @pre_sale.save
  42. format.js
  43. else
  44. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  45. end
  46. end
  47. else
  48. @pre_sale.errors.add(:base, "Stock insuficiente del producto #{@pre_sale.product.name}")
  49. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  50. format.js
  51. end
  52. end
  53. end
  54. # PATCH/PUT /pre_sales/1
  55. # PATCH/PUT /pre_sales/1.json
  56. def update
  57. @pre_sale.quantity = params[:pre_sale][:quantity].to_i
  58. availableProduct = AvailableProduct.find_by(pointsale_id: current_user.pointsale_id, product_id: @pre_sale.product_id)
  59. same_product_quantity = 0
  60. total_in_pre_sales = 0
  61. PreSale.where(user_id: current_user.id, product_id: @pre_sale.product_id).where.not(id: @pre_sale.id).each do |pre|
  62. total_in_pre_sales += pre.total
  63. same_product_quantity += pre.quantity
  64. end
  65. total_quantity = same_product_quantity + @pre_sale.quantity
  66. respond_to do |format|
  67. if availableProduct.stock >= total_quantity
  68. @pre_sale.get_totals
  69. total_in_pre_sales += @pre_sale.total
  70. if !@pre_sale.credit?
  71. @pre_sale.update(pre_sale_params)
  72. format.json { render json: @pre_sale }
  73. elsif @pre_sale.customer.sale_approved?(@pre_sale.customer.get_debiting + total_in_pre_sales)
  74. @pre_sale.update(pre_sale_params)
  75. format.json { render json: @pre_sale }
  76. else
  77. @pre_sale.errors.add(:base, "El cliente ya no tiene crédito disponible")
  78. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  79. end
  80. else
  81. @pre_sale.errors.add(:base, "Stock insuficiente del producto #{@pre_sale.product.name}")
  82. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  83. end
  84. end
  85. end
  86. # DELETE /pre_sales/1
  87. # DELETE /pre_sales/1.json
  88. def destroy
  89. respond_to do |format|
  90. if @pre_sale.destroy
  91. format.json { head :ok }
  92. end
  93. end
  94. end
  95. def add_pre_sale_by_barcode
  96. total_in_pre_sales = 0
  97. pointsale = OpenCashRegister.get_pointsale(params[:open_cash_register_id], "open_cash_register")
  98. @product = pointsale.products.find_by("barcode = ? and stock > 0", params[:barcode])
  99. if @product.blank?
  100. format.js { render action: "create" }
  101. else
  102. # ir sumando todos los presales que tiene, para ver si lo abarca el credito
  103. PreSale.where(user_id: current_user.id).each do |pre|
  104. total_in_pre_sales = total_in_pre_sales + pre.total
  105. end
  106. @pre_sale = PreSale.new
  107. @pre_sale.customer_id = params[:customer_id]
  108. @pre_sale.user_id = current_user.id
  109. @pre_sale.open_cash_register_id = params[:open_cash_register_id]
  110. @pre_sale.product_id = @product.id
  111. @pre_sale.sale_type = params[:sale_type]
  112. #precio unitario
  113. @pre_sale.unit_price = @pre_sale.product.get_price_sale(OpenCashRegister.find(@pre_sale.open_cash_register_id).pointsale.id)
  114. @pre_sale.get_totals
  115. total_in_pre_sales = total_in_pre_sales + @pre_sale.total
  116. #cuando la venta es a credito checar que el credito permita esta nueva venta
  117. respond_to do |format|
  118. if has_enough_stock?(@pre_sale)
  119. if @pre_sale.sale_type == "credit"
  120. debiting = @pre_sale.customer.get_debiting
  121. if @pre_sale.customer.sale_approved?(debiting + total_in_pre_sales)
  122. if @pre_sale.save
  123. format.js { render action: "create" }
  124. end
  125. else
  126. @pre_sale.errors.add(:customer_id, "El cliente ya no tiene crédito disponible.")
  127. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  128. format.js { render action: "create" }
  129. end
  130. elsif @pre_sale.sale_type == "cash"
  131. if @pre_sale.save
  132. format.js { render action: "create" }
  133. else
  134. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  135. end
  136. elsif @pre_sale.sale_type == "reserved"
  137. if @pre_sale.save
  138. format.js
  139. else
  140. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  141. end
  142. end
  143. else
  144. @pre_sale.errors.add(:base, "Stock insuficiente del producto #{@pre_sale.product.name}")
  145. format.json { render json: @pre_sale.errors.values, status: :unprocessable_entity }
  146. end
  147. end
  148. end
  149. end
  150. def update_presale_customer
  151. @pre_sales = PreSale.where(user_id: current_user.id)
  152. @pre_sales.update_all(customer_id: params[:customer_id], sale_type: 1) if @pre_sales.present?
  153. respond_to do |format|
  154. format.json { head :ok }
  155. end
  156. end
  157. def update_saletype
  158. pre_sales = PreSale.where(user_id: current_user.id)
  159. type =
  160. case params[:type]
  161. when "credit" then
  162. 0
  163. when "cash" then
  164. 1
  165. when "reserved" then
  166. 3
  167. end
  168. respond_to do |format|
  169. if pre_sales.blank?
  170. format.json { head :ok }
  171. else
  172. if params[:type] != "credit" || pre_sales[0].customer.sale_approved?(pre_sales[0].customer.get_debiting + pre_sales.sum(:total))
  173. pre_sales.update_all(sale_type: type)
  174. format.json { head :ok }
  175. else
  176. pre_sales[0].errors.add(:base, "El cliente ya no tiene crédito disponible")
  177. format.json { render json: pre_sales[0].errors.values, status: :unprocessable_entity }
  178. end
  179. end
  180. end
  181. end
  182. private
  183. # Use callbacks to share common setup or constraints between actions.
  184. def set_pre_sale
  185. @pre_sale = PreSale.find(params[:id])
  186. end
  187. # Never trust parameters from the scary internet, only allow the white list through.
  188. def pre_sale_params
  189. params.require(:pre_sale).permit(:customer_id, :user_id, :open_cash_register_id, :sale_type, :product_id, :quantity, :amount, :tax, :discount, :total, :barcode, :haggle)
  190. end
  191. def has_enough_stock?(pre_sale)
  192. same_product_quantity = 0
  193. PreSale.where(user_id: current_user.id, product_id: pre_sale.product_id).each do |pre|
  194. same_product_quantity += pre.quantity
  195. end
  196. availableProduct = AvailableProduct.find_by(pointsale_id: current_user.pointsale_id, product_id: pre_sale.product_id)
  197. if availableProduct.stock >= (same_product_quantity + pre_sale.quantity)
  198. return true
  199. else
  200. return false
  201. end
  202. end
  203. end