cash_registers_moves_controller.rb 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. class CashRegistersMovesController < ApplicationController
  2. before_action :set_cash_registers_move, only: [:show, :edit, :update, :destroy]
  3. # GET /cash_registers_moves/new
  4. def new
  5. @cash_registers_move = CashRegistersMove.new
  6. if params[:sale].present?
  7. @sale = Sale.find(params[:sale])
  8. @credito = Credit.where(:customer_id => @sale.customer_id, :status => "0").sum(:rest)
  9. @cash_registers_move.open_cash_register_id = @sale.open_cash_register_id
  10. elsif params[:products_return].present?
  11. @products_return = ProductsReturn.find(params[:products_return])
  12. end
  13. @cash_id = PaymentMethod.find_by(:isCash => 1).id
  14. if @sale.present?
  15. if @sale.saletype == 'reserved'
  16. if @sale.parcial?
  17. # esto quiere decir que la venta ya tiene un anticipo, se debe mostrar modal
  18. # para abonar al apartado o liquidarlo
  19. @payments = CashRegistersMove.where(:sale_id => @sale.id, :status => 1)
  20. render 'liquidate_reserved_sale'
  21. else
  22. # registrar apartado
  23. @min_quantity_reserve = ((@pos_config.reserve_sale_percent / 100) * @sale.total).round
  24. @cash_registers_move.quantity = @min_quantity_reserve
  25. render 'new_sale_reserve'
  26. end
  27. else
  28. # Nueva venta
  29. render 'new'
  30. end
  31. elsif @products_return.present?
  32. @open_cash_register_id = current_user.pointsale.get_open_cash_register.id
  33. render 'products_return_payment'
  34. end
  35. end
  36. # POST /cash_registers_moves
  37. # POST /cash_registers_moves.json
  38. def create
  39. @cash_registers_move = CashRegistersMove.new(cash_registers_move_params)
  40. @sale = Sale.find(params[:cash_registers_move][:sale_id]) if params[:cash_registers_move][:sale_id].present?
  41. @purchase = Purchase.find(params[:cash_registers_move][:purchase_id]) if params[:cash_registers_move][:purchase_id].present?
  42. credit = Credit.find_by_sale_id(@sale.id) if params[:cash_registers_move][:sale_id].present?
  43. @products_return = ProductsReturn.find(params[:cash_registers_move][:products_return_id]) if params[:cash_registers_move][:products_return_id].present?
  44. respond_to do |format|
  45. if @sale.present?
  46. # calcular cambio cuando aplica.
  47. @cash_registers_move.calculate_quantities
  48. @cash_registers_move.move_type = :ingreso
  49. if @sale.cash?
  50. @sale.update_attributes(:status => :paid)
  51. @cash_registers_move.concept = :sale
  52. elsif @sale.reserved?
  53. @cash_registers_move.status = :inactive
  54. @cash_registers_move.concept = :reserved_payment
  55. @cash_registers_move.open_cash_register_id = Pointsale.find(current_user.pointsale_id).open_cash_registers.where("open_cash_registers.status = 0").last.id
  56. end
  57. if credit.present?
  58. save_when_is_credit(credit)
  59. @cash_registers_move.open_cash_register_id = Pointsale.find(current_user.pointsale_id).open_cash_registers.where("open_cash_registers.status = 0").last.id
  60. end
  61. message = "movimiento de efectivo por venta con folio #{@cash_registers_move.sale.sale_code}"
  62. @cash_registers_move.audit_comment = message
  63. if @cash_registers_move.save
  64. format.js { flash[:success] = message }
  65. else
  66. format.js
  67. format.json { render json: @cash_registers_move.errors, status: :unprocessable_entity }
  68. end
  69. elsif @purchase.present?
  70. @cash_registers_move.move_type = :egreso
  71. @cash_registers_move.concept = :purchase
  72. @cash_registers_move.status = :inactive
  73. message = "movimiento de efectivo por compra con folio #{@cash_registers_move.purchase.purchase_code}"
  74. @cash_registers_move.audit_comment = message
  75. if @cash_registers_move.save
  76. format.html { redirect_to purchases_path, success: 'Movimiento de efectivo realizado correctamente.' }
  77. else
  78. format.html { render :new }
  79. format.json { render json: @cash_registers_move.errors, status: :unprocessable_entity }
  80. end
  81. elsif @products_return.present?
  82. # calcular cambio cuando aplica.
  83. @cash_registers_move.calculate_quantities
  84. @cash_registers_move.move_type = :ingreso
  85. @cash_registers_move.status = :inactive
  86. message = "movimiento de efectivo por devolución con folio #{@cash_registers_move.products_return.return_code}"
  87. @cash_registers_move.audit_comment = message
  88. if @cash_registers_move.save
  89. format.js { flash[:success] = message }
  90. else
  91. format.js
  92. format.json { render json: @cash_registers_move.errors, status: :unprocessable_entity }
  93. end
  94. end
  95. end
  96. end
  97. # DELETE /cash_registers_moves/1
  98. # DELETE /cash_registers_moves/1.json
  99. def destroy
  100. @cash_registers_move.destroy
  101. respond_to do |format|
  102. format.json { head :no_content }
  103. format.js { head :ok }
  104. end
  105. end
  106. def confirm_payments
  107. respond_to do |format|
  108. @sale = Sale.find(params[:sale_id]) if params[:sale_id].present?
  109. @products_return = ProductsReturn.find(params[:products_return_id]) if params[:products_return_id].present?
  110. if @sale.present?
  111. if CashRegistersMove.where(:sale_id => @sale.id).update_all(:status => 1)
  112. @sale.update_attributes(:status => :paid)
  113. message = "Venta registrada correctamente."
  114. end
  115. elsif @products_return.present?
  116. CashRegistersMove.where(:products_return_id => @products_return.id).update_all(:status => 1)
  117. message = "Devolución registrada correctamente."
  118. end
  119. format.js { flash[:success] = message }
  120. end
  121. end
  122. #funcion que se manda llamar cuando se clickea en 'Abonar' al crear apartado
  123. def confirm_reserve
  124. respond_to do |format|
  125. @sale = Sale.find(params[:sale_id])
  126. if CashRegistersMove.where(:sale_id => @sale.id).update_all(:status => 1)
  127. @sale.update_attributes(:status => :parcial)
  128. format.js { flash[:success] = "Apartado agregado al cliente #{@sale.customer.nick_name} correctamente." }
  129. end
  130. end
  131. end
  132. def add_payments_to_reserve
  133. respond_to do |format|
  134. @sale = Sale.find(params[:sale_id])
  135. @new_moves_array = Array.new
  136. @new_moves = CashRegistersMove.where(:sale_id => @sale.id, :status => 0)
  137. @new_moves.each do |move|
  138. @new_moves_array << move.id
  139. end
  140. if @new_moves.update_all(:status => 1)
  141. # if @sale.reserve_debt == 0
  142. if @sale.reserve_debt <= 0
  143. @sale.update_attributes(:status => :paid)
  144. end
  145. format.js { flash[:success] = "Abono al apartado #{@sale.sale_code} agregado correctamente." }
  146. end
  147. end
  148. end
  149. def delete_credit_payment
  150. respond_to do |format|
  151. payment = CreditPayment.find(params[:credit_payment_id])
  152. cashmoves = CashRegistersMove.where(:credit_payment_id => payment.id)
  153. openregister = OpenCashRegister.find_by(:id => cashmoves.first.open_cash_register_id)
  154. if openregister.open?
  155. payment.update_attributes(:status => :cancelled)
  156. #
  157. credit = Credit.find(params[:credit])
  158. sale = Sale.find(credit.sale_id)
  159. sum = payment.quantity + credit.rest
  160. if(credit.total < sum)
  161. credit.update_attributes(:rest => credit.total)
  162. sale.update_attributes(:status => :notpaid)
  163. else
  164. credit.update_attributes(:rest => sum)
  165. if sale.total = credit.rest
  166. sale.update_attributes(:status => :notpaid)
  167. end
  168. end
  169. cashmoves.each do |move|
  170. new_cash_move = move.dup
  171. new_cash_move.move_type = :egreso
  172. new_cash_move.save
  173. end
  174. format.html { redirect_to customer_sales_path(:customer_id => payment.customer_id), notice: "Movimiento de efectivo realizado correctamente." }
  175. format.js { flash[:success] = "Movimiento de efectivo realizado correctamente." }
  176. else
  177. format.html { redirect_to customer_sales_path(:customer_id => payment.customer_id), notice: "No se pudo realizar el movimiento." }
  178. format.js { flash[:success] = "NO se pudo realizar el movimiento." }
  179. end
  180. end
  181. end
  182. def add_quick_payment
  183. # type 1 es abono a credito, 2 es abono a apartado
  184. @type = params[:type].to_i
  185. if @type == 1
  186. debtors_ids = Credit.debtors
  187. @customers = Customer.find(debtors_ids.map { |m| m[0] })
  188. else
  189. @sales = Pointsale.find(current_user.pointsale_id).sales.where(:saletype => 2, :status => 3).select(:customer_id).distinct
  190. @customers = Customer.find(@sales.map { |m| m.customer_id })
  191. end
  192. end
  193. def create_quick_debt_payment
  194. @customer = Customer.find(params[:customer_id])
  195. @sale = @customer.sales.where('saletype = 0 and status != 1 and status != 2').order('date_sale DESC').last
  196. redirect_to new_cash_registers_move_path(:sale => @sale, :customer => @customer)
  197. end
  198. private
  199. # Use callbacks to share common setup or constraints between actions.
  200. def set_cash_registers_move
  201. @cash_registers_move = CashRegistersMove.find(params[:id])
  202. end
  203. # Never trust parameters from the scary internet, only allow the white list through.
  204. def cash_registers_move_params
  205. params.require(:cash_registers_move).permit(:payment_method_id, :quantity, :open_cash_register_id, :sale_id, :cardnumber, :ticket, :received, :change, :products_return_id)
  206. end
  207. def save_when_is_credit(credit)
  208. abono = @cash_registers_move.quantity
  209. @credit_payment = CreditPayment.new
  210. @credit_payment.credit_id = credit.id
  211. @credit_payment.customer_id = credit.customer_id
  212. @credit_payment.pointsale_id = credit.pointsale_id
  213. @credit_payment.status = :active
  214. @credit_payment.date_payment = Date.today
  215. @credit_payment.user_id = current_user.id
  216. if @credit_payment.save
  217. @cash_registers_move.credit_payment_id = @credit_payment.id
  218. @cash_registers_move.concept = :credit_payment
  219. @debt = Credit.where(:customer_id => credit.customer_id).sum(:rest)
  220. if abono >= credit.rest #si se paga más del adeudo de este crédito
  221. abono = abono - credit.rest
  222. # @debt = credit.rest
  223. credit.update_attributes(:rest => 0)
  224. @sale.update_attributes(:status => :paid)
  225. while abono > 0 do
  226. nextcredit = Credit.where("customer_id = #{credit.customer_id} and rest > 0").order("sale_id ASC")
  227. if nextcredit.first.present?
  228. if abono <= nextcredit.first.rest
  229. nextcredit.first.update_attributes(:rest => nextcredit.first.rest - abono)
  230. sale = Sale.find_by_id(nextcredit.first.sale_id)
  231. sale.update_attributes(:status => :parcial)
  232. abono = abono - nextcredit.first.rest
  233. else
  234. abono = abono - nextcredit.first.rest
  235. # @debt = nextcredit.first.rest
  236. nextcredit.first.update_attributes(:rest => 0)
  237. sale = Sale.find_by_id(nextcredit.sale_id)
  238. sale.update_attributes(:status => :paid)
  239. end
  240. else
  241. abono = 0 #si ya no hay deuda
  242. end
  243. end
  244. else
  245. @cash_registers_move.quantity = abono
  246. abono = credit.rest - abono
  247. credit.update_attributes(:rest => abono)
  248. @sale.update_attributes(:status => :parcial)
  249. end
  250. end
  251. end
  252. end