cash_registers_moves_controller.rb 13 KB

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