pre_sales_controller.rb 6.7 KB

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