cash_registers_moves_controller.rb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  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 = session[: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. # rubocop:disable Metrics/BlockLength
  39. def create
  40. @cash_registers_move = CashRegistersMove.new(cash_registers_move_params)
  41. @sale = Sale.find(params[:cash_registers_move][:sale_id]) if params[:cash_registers_move][:sale_id].present?
  42. @purchase = Purchase.find(params[:cash_registers_move][:purchase_id]) if params[:cash_registers_move][:purchase_id].present?
  43. credit = Credit.find_by_sale_id(@sale.id) if params[:cash_registers_move][:sale_id].present?
  44. @products_return = ProductsReturn.find(params[:cash_registers_move][:products_return_id]) if params[:cash_registers_move][:products_return_id].present?
  45. respond_to do |format|
  46. if @sale.present?
  47. # calcular cambio cuando aplica.
  48. @cash_registers_move.calculate_quantities
  49. @cash_registers_move.move_type = :ingreso
  50. if @sale.cash?
  51. @sale.update_attributes(status: :paid)
  52. @cash_registers_move.concept = :sale
  53. elsif @sale.reserved?
  54. @cash_registers_move.status = :inactive
  55. @cash_registers_move.choose_concept_when_reserved
  56. @cash_registers_move.open_cash_register_id = session[:open_cash_register_id]
  57. end
  58. if credit.present?
  59. save_when_is_credit(credit)
  60. @cash_registers_move.open_cash_register_id = session[:open_cash_register_id]
  61. end
  62. message = "movimiento de efectivo por venta con folio #{@cash_registers_move.sale.sale_code}"
  63. @cash_registers_move.audit_comment = message
  64. if @cash_registers_move.save
  65. format.js { flash[:success] = message }
  66. else
  67. format.js
  68. format.json { render json: @cash_registers_move.errors, status: :unprocessable_entity }
  69. end
  70. elsif @purchase.present?
  71. @cash_registers_move.move_type = :egreso
  72. @cash_registers_move.concept = :purchase
  73. @cash_registers_move.status = :inactive
  74. message = "movimiento de efectivo por compra con folio #{@cash_registers_move.purchase.purchase_code}"
  75. @cash_registers_move.audit_comment = message
  76. if @cash_registers_move.save
  77. format.html { redirect_to purchases_path, success: 'Movimiento de efectivo realizado correctamente.' }
  78. else
  79. format.html { render :new }
  80. format.json { render json: @cash_registers_move.errors, status: :unprocessable_entity }
  81. end
  82. elsif @products_return.present?
  83. # calcular cambio cuando aplica.
  84. @cash_registers_move.calculate_quantities
  85. @cash_registers_move.move_type = :ingreso
  86. @cash_registers_move.concept = :products_return
  87. @cash_registers_move.sale_id = @cash_registers_move.products_return.sale_id
  88. @cash_registers_move.status = :inactive
  89. message = "movimiento de efectivo por devolución con folio #{@cash_registers_move.products_return.return_code}"
  90. @cash_registers_move.audit_comment = message
  91. if @cash_registers_move.save
  92. format.js { flash[:success] = message }
  93. else
  94. format.js
  95. format.json { render json: @cash_registers_move.errors, status: :unprocessable_entity }
  96. end
  97. end
  98. end
  99. end
  100. # rubocop:enable Metrics/BlockLength
  101. # DELETE /cash_registers_moves/1
  102. # DELETE /cash_registers_moves/1.json
  103. def destroy
  104. @cash_registers_move.destroy
  105. respond_to do |format|
  106. format.json { head :no_content }
  107. format.js { head :ok }
  108. end
  109. end
  110. def confirm_payments
  111. respond_to do |format|
  112. @sale = Sale.find(params[:sale_id]) if params[:sale_id].present?
  113. @products_return = ProductsReturn.find(params[:products_return_id]) if params[:products_return_id].present?
  114. if @sale.present?
  115. if CashRegistersMove.where(sale_id: @sale.id).update_all(status: 1)
  116. @sale.update_attributes(status: :paid)
  117. message = "Venta registrada correctamente."
  118. end
  119. elsif @products_return.present?
  120. CashRegistersMove.where(products_return_id: @products_return.id).update_all(status: 1)
  121. message = "Devolución registrada correctamente."
  122. end
  123. format.js { flash[:success] = message }
  124. end
  125. end
  126. # funcion que se manda llamar cuando se clickea en 'Abonar' al crear apartado
  127. def confirm_reserve
  128. respond_to do |format|
  129. @sale = Sale.find(params[:sale_id])
  130. if CashRegistersMove.where(sale_id: @sale.id).update_all(status: 1)
  131. @sale.update_attributes(status: :parcial)
  132. format.js { flash[:success] = "Apartado agregado al cliente #{@sale.customer.nick_name} correctamente." }
  133. end
  134. end
  135. end
  136. def add_payments_to_reserve
  137. respond_to do |format|
  138. @sale = Sale.find(params[:sale_id])
  139. @new_moves_array = Array.new
  140. @new_moves = CashRegistersMove.where(sale_id: @sale.id, status: 0)
  141. @new_moves.each do |move|
  142. @new_moves_array << move.id
  143. end
  144. if @new_moves.update_all(status: 1)
  145. # if @sale.reserve_debt == 0
  146. if @sale.reserve_debt <= 0
  147. @sale.update_attributes(status: :paid)
  148. end
  149. format.js { flash[:success] = "Abono al apartado #{@sale.sale_code} agregado correctamente." }
  150. end
  151. end
  152. end
  153. # rubocop:disable Metrics/BlockLength
  154. def delete_credit_payment
  155. respond_to do |format|
  156. payment = CreditPayment.find(params[:credit_payment_id])
  157. cashmoves = CashRegistersMove.where(credit_payment_id: payment.id)
  158. openregister = OpenCashRegister.find_by(id: cashmoves.first.open_cash_register_id)
  159. if openregister.open?
  160. payment.update_attributes(status: :cancelled)
  161. credit = Credit.find(params[:credit])
  162. sale = Sale.find(credit.sale_id)
  163. sum = payment.quantity + credit.rest
  164. if credit.total < sum
  165. credit.update_attributes(rest: credit.total)
  166. sale.update_attributes(status: :notpaid)
  167. else
  168. credit.update_attributes(rest: sum)
  169. if sale.total == credit.rest
  170. sale.update_attributes(status: :notpaid)
  171. end
  172. end
  173. cashmoves.each do |move|
  174. new_cash_move = move.dup
  175. new_cash_move.move_type = :egreso
  176. new_cash_move.save
  177. end
  178. format.html { redirect_to customer_sales_path(customer_id: payment.customer_id), notice: "Movimiento de efectivo realizado correctamente." }
  179. format.js { flash[:success] = "Movimiento de efectivo realizado correctamente." }
  180. else
  181. format.html { redirect_to customer_sales_path(customer_id: payment.customer_id), notice: "No se pudo realizar el movimiento." }
  182. format.js { flash[:success] = "NO se pudo realizar el movimiento." }
  183. end
  184. end
  185. end
  186. # rubocop:enable Metrics/BlockLength
  187. def add_quick_payment
  188. # type 1 es abono a credito, 2 es abono a apartado
  189. @type = params[:type].to_i
  190. if @type == 1
  191. debtors_ids = Credit.debtors
  192. @customers = Customer.find(debtors_ids.map { |m| m[0] })
  193. else
  194. @sales = Pointsale.find(current_user.pointsale_id).sales.where(saletype: 2, status: 3).select(:customer_id).distinct
  195. # rubocop:disable Style/SymbolProc
  196. @customers = Customer.find(@sales.map { |m| m.customer_id })
  197. # rubocop:enable Style/SymbolProc
  198. end
  199. end
  200. def create_quick_debt_payment
  201. @customer = Customer.find(params[:customer_id])
  202. @sale = @customer.sales.where('saletype = 0 and status != 1 and status != 2').order('date_sale DESC').last
  203. redirect_to new_cash_registers_move_path(sale: @sale, customer: @customer)
  204. end
  205. private
  206. # Use callbacks to share common setup or constraints between actions.
  207. def set_cash_registers_move
  208. @cash_registers_move = CashRegistersMove.find(params[:id])
  209. end
  210. # Never trust parameters from the scary internet, only allow the white list through.
  211. def cash_registers_move_params
  212. params.require(:cash_registers_move).permit(:payment_method_id, :quantity, :open_cash_register_id, :sale_id, :cardnumber, :ticket, :received, :change, :products_return_id)
  213. end
  214. def save_when_is_credit(credit)
  215. abono = @cash_registers_move.quantity
  216. recibido = @cash_registers_move.received
  217. change = recibido - abono
  218. while abono > 0 do
  219. credits_with_debt = Credit.where("customer_id = #{credit.customer_id} and rest > 0 and status = 0").order("sale_id ASC")
  220. if credits_with_debt.first.present?
  221. cash_registers_move_new = CashRegistersMove.new(cash_registers_move_params)
  222. next_credit = credits_with_debt.first
  223. @credit_payment = CreditPayment.new
  224. @credit_payment.credit_id = next_credit.id
  225. @credit_payment.customer_id = next_credit.customer_id
  226. @credit_payment.pointsale_id = next_credit.pointsale_id
  227. @credit_payment.status = :active
  228. @credit_payment.date_payment = Date.today
  229. @credit_payment.user_id = current_user.id
  230. if abono < next_credit.rest #si se paga más del adeudo de este crédito
  231. @credit_payment.quantity = abono
  232. sale = Sale.find_by_id(next_credit.sale_id)
  233. sale.update_attributes(:status => :parcial)
  234. cash_registers_move_new.quantity = abono
  235. cash_registers_move_new.received = abono + change
  236. cash_registers_move_new.change = change
  237. rest_aux = abono - next_credit.rest
  238. next_credit.update_attributes(:rest => next_credit.rest - abono)
  239. else
  240. @credit_payment.quantity = next_credit.rest
  241. sale = Sale.find_by_id(next_credit.sale_id)
  242. sale.update_attributes(:status => :paid)
  243. cash_registers_move_new.quantity = next_credit.rest
  244. cash_registers_move_new.received = next_credit.rest
  245. cash_registers_move_new.change = 0
  246. rest_aux = abono - next_credit.rest
  247. next_credit.update_attributes(:rest => 0)
  248. end
  249. if @credit_payment.save
  250. cash_registers_move_new.open_cash_register_id = @sale.open_cash_register_id
  251. cash_registers_move_new.credit_payment_id = @credit_payment.id
  252. cash_registers_move_new.concept = :credit_payment
  253. cash_registers_move_new.sale_id = next_credit.sale_id
  254. cash_registers_move_new.open_cash_register_id = session[:open_cash_register_id]
  255. cash_registers_move_new.move_type = :ingreso
  256. cash_registers_move_new.save
  257. end
  258. abono = rest_aux
  259. else
  260. abono = 0 #si ya no hay deuda
  261. end
  262. end
  263. true
  264. rescue
  265. false
  266. end
  267. # def save_when_is_credit(credit)
  268. # abono = @cash_registers_move.quantity
  269. # abono_this_credit = abono >= credit.rest ? credit.rest : abono
  270. # # por si abonan dinero de mas, checar cuanto debe de ser de esta venta, y separarlo.
  271. # # @cash_registers_move.quantity = abono_this_credit
  272. # @credit_payment = CreditPayment.new
  273. # @credit_payment.credit_id = credit.id
  274. # @credit_payment.customer_id = credit.customer_id
  275. # @credit_payment.pointsale_id = credit.pointsale_id
  276. # @credit_payment.status = :active
  277. # @credit_payment.date_payment = Date.today
  278. # @credit_payment.user_id = current_user.id
  279. # # @credit_payment.quantity = abono_this_credit
  280. # @credit_payment.quantity = abono_this_credit
  281. # if @credit_payment.save
  282. # @cash_registers_move.credit_payment_id = @credit_payment.id
  283. # @cash_registers_move.concept = :credit_payment
  284. # if abono >= credit.rest # si se paga mas del adeudo de este credito
  285. # abono -= credit.rest
  286. # credit.update_attributes(rest: 0)
  287. # @sale.update_attributes(status: :paid)
  288. # # rubocop:disable Style/WhileUntilDo
  289. # while abono > 0 do
  290. # nextcredit = Credit.where("customer_id = #{credit.customer_id} and rest > 0").order("sale_id ASC")
  291. # # rubocop:disable Metrics/BlockNesting
  292. # if nextcredit.first.present?
  293. # if abono <= nextcredit.first.rest
  294. # next_credit_payment = CreditPayment.create(customer_id: credit.customer_id, credit_id: nextcredit.first.id, pointsale_id: credit.pointsale_id, quantity: abono, status: 0, date_payment: Date.today, user_id: current_user.id)
  295. # # next_credit_abono = @cash_registers_move.dup
  296. # # next_credit_abono.quantity = abono
  297. # # next_credit_abono.credit_payment_id = next_credit_payment.id
  298. # # next_credit_abono.save
  299. # nextcredit.first.update_attributes(rest: nextcredit.first.rest - abono)
  300. # sale = Sale.find_by_id(nextcredit.first.sale_id)
  301. # sale.update_attributes(status: :parcial)
  302. # abono -= nextcredit.first.rest
  303. # else
  304. # abono -= nextcredit.first.rest
  305. # nextcredit.first.update_attributes(rest: 0)
  306. # sale = Sale.find_by_id(nextcredit.sale_id)
  307. # sale.update_attributes(status: :paid)
  308. # end
  309. # else
  310. # abono = 0 # si ya no hay deuda
  311. # end
  312. # # rubocop:enable Metrics/BlockNesting
  313. # end
  314. # # rubocop:enable Style/WhileUntilDo
  315. # else
  316. # @cash_registers_move.quantity = abono
  317. # abono = credit.rest - abono
  318. # credit.update_attributes(rest: abono)
  319. # @sale.update_attributes(status: :parcial)
  320. # end
  321. # end
  322. # end
  323. end