purchases_controller.rb 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. class PurchasesController < ApplicationController
  2. ##--- Abilities
  3. load_and_authorize_resource
  4. ##--- Breadcrum_rails
  5. add_breadcrumb I18n.t("breadcrumbs." + controller_name), :purchases_path
  6. add_breadcrumb "Nueva " + I18n.t("breadcrumbs." + controller_name).singularize, :new_purchase_path, only: :new
  7. add_breadcrumb "Detalle de la " + I18n.t("breadcrumbs." + controller_name).singularize, :purchase_path, only: :show
  8. add_breadcrumb "Editar " + I18n.t("breadcrumbs." + controller_name).singularize, :edit_purchase_path, only: :edit
  9. before_action :set_purchase, only: [:show, :edit, :update, :destroy]
  10. before_action :get_filters, only: [:index, :show, :edit, :new]
  11. # GET /purchases
  12. # GET /purchases.json
  13. def index
  14. @purchases =
  15. if current_user.usertype == "A" || current_user.usertype == "SS"
  16. Purchase.all.includes(:supplier, :pointsale, :warehouse, :user).order("created_at DESC")
  17. else
  18. Purchase.includes(:supplier, :user).where(pointsale_id: current_user.pointsale_id).order('created_at desc')
  19. end
  20. end
  21. # GET /purchases/1
  22. # GET /purchases/1.json
  23. def show; end
  24. # GET /purchases/new
  25. def new
  26. @disable_supplier = false
  27. @disable_pointsale = false
  28. @disable_warehouse = false
  29. @disable_is_in_dollars = false
  30. @disable_destiny = false
  31. @disabled_button = true
  32. @destiny = 'warehouse'
  33. @purchase = Purchase.new
  34. @purchase.purchase_details.new
  35. @pre_purchases = PrePurchase.where(user_id: current_user.id)
  36. unless @pre_purchases.empty?
  37. @purchase.supplier_id = @pre_purchases[0].supplier_id
  38. @purchase.pointsale_id = @pre_purchases[0].pointsale_id
  39. @purchase.warehouse_id = @pre_purchases[0].warehouse_id
  40. @destiny = @purchase.pointsale_id.present? ? 'pointsale' : 'warehouse'
  41. @purchase.exchange = @pre_purchases[0].exchange if @pre_purchases[0].exchange.present?
  42. @purchase.is_in_dollars = true if @pre_purchases[0].exchange.present?
  43. @disable_supplier = true
  44. @disable_pointsale = true
  45. @disable_warehouse = true
  46. @disable_is_in_dollars = true
  47. @disable_destiny = true
  48. @disabled_button = false
  49. end
  50. if current_user.usertype == 'G'
  51. @destiny = 'pointsale'
  52. @purchase.pointsale_id = current_user.pointsale_id
  53. @disable_pointsale = true
  54. @disable_warehouse = true
  55. @disable_destiny = true
  56. end
  57. end
  58. # POST /purchases
  59. # POST /purchases.json
  60. def create
  61. @purchase = Purchase.new(purchase_params)
  62. @purchase.user_id = current_user.id
  63. @purchase.status = :notpaid
  64. @pre_purchases = PrePurchase.where(user_id: current_user.id)
  65. respond_to do |format|
  66. message = "Compra #{@purchase.purchase_code} por $ #{@purchase.total} #{@purchase.exchange.present? ? "USD" : "MXN"} creada."
  67. @purchase.audit_comment = message
  68. if @purchase.save
  69. @pre_purchases.each do |pre_purchase|
  70. # agregar detalles de la compra
  71. create_purchase_details(@purchase, pre_purchase)
  72. pre_purchase.destroy
  73. end
  74. format.html { redirect_to purchases_url, success: message }
  75. else
  76. format.html { render :new }
  77. format.json { render json: @purchase.errors.values, status: :unprocessable_entity }
  78. end
  79. end
  80. end
  81. # DELETE /purchases/1
  82. # DELETE /purchases/1.json
  83. def destroy
  84. respond_to do |format|
  85. message = "Compra #{@purchase.purchase_code} cancelada."
  86. @purchase.audit_comment = message
  87. if @purchase.update_attributes(status: :cancelled)
  88. # checa si hay pagos de esta compra
  89. CashRegistersMove.where(purchase_id: @purchase.id).each do |move|
  90. new_cash_move = move.dup
  91. new_cash_move.move_type = :ingreso
  92. new_cash_move.save
  93. end
  94. @purchase.purchase_details.each do |detail|
  95. destroy_purchase_details(@purchase, detail)
  96. end
  97. format.html { redirect_to purchases_url, warning: message }
  98. format.json { head :no_content }
  99. else
  100. format.html { render :edit }
  101. format.json { render json: @purchase.errors, status: :unprocessable_entity }
  102. end
  103. end
  104. end
  105. def find_purchases_by_date
  106. start_date = DateTime.parse(params[:begin_date])
  107. end_date = DateTime.parse(params[:end_date])
  108. @purchases =
  109. if current_user.usertype == "A" || current_user.usertype == "SS"
  110. Purchase.includes(:supplier, :pointsale, :warehouse, :user).where(purchase_date: start_date..end_date).order('purchase_date desc')
  111. else
  112. Purchase.includes(:supplier, :user).where(pointsale_id: current_user.pointsale_id, created_at: start_date..end_date).order('purchase_date desc')
  113. end
  114. respond_to do |format|
  115. format.js
  116. end
  117. end
  118. private
  119. # Use callbacks to share common setup or constraints between actions.
  120. def set_purchase
  121. @purchase = Purchase.find(params[:id])
  122. end
  123. def get_filters
  124. @current_page =
  125. if params[:current_page].blank?
  126. 1
  127. else
  128. params[:current_page]
  129. end
  130. @filter = params[:filter]
  131. end
  132. def create_purchase_details(purchase, pre_purchase)
  133. detail = PurchaseDetail.new(product_id: pre_purchase.product_id, quantity: pre_purchase.quantity, amount: pre_purchase.total, price: pre_purchase.price_base, tax: pre_purchase.tax)
  134. purchase.purchase_details << detail
  135. # actualizar stock del producto cuando es para punto de venta
  136. if purchase.pointsale_id.present?
  137. stock_product = AvailableProduct.find_by(product_id: detail.product_id, pointsale_id: purchase.pointsale_id)
  138. if stock_product.nil?
  139. stock_product = AvailableProduct.create(product_id: detail.product_id, pointsale_id: purchase.pointsale_id, stock: detail.quantity)
  140. else
  141. stock_product = 0 if stock_product.stock.blank?
  142. stock_product.stock += detail.quantity
  143. end
  144. else
  145. # actualizar stock del producto cuando es para almacen
  146. stock_product = WarehouseStock.find_by(product_id: detail.product_id, warehouse_id: purchase.warehouse_id)
  147. if stock_product.nil?
  148. stock_product = WarehouseStock.create(product_id: detail.product_id, warehouse_id: purchase.warehouse_id, stock: detail.quantity)
  149. else
  150. stock_product = 0 if stock_product.stock.blank?
  151. stock_product.stock += detail.quantity
  152. end
  153. end
  154. stock_product.save
  155. # guardar en bitacora de inventario
  156. InventoriesMove.create(product_id: detail.product_id, purchase_id: purchase.id, quantity: detail.quantity, move_type: "incoming", reason: "purchase")
  157. end
  158. def destroy_purchase_details(purchase, purchase_detail)
  159. purchase_detail.update_attributes(status: :inactive)
  160. # busca y actualiza el stock de productos
  161. stock_product =
  162. if purchase.pointsale.present?
  163. AvailableProduct.find_by(product_id: purchase_detail.product_id, pointsale_id: purchase.pointsale_id)
  164. else
  165. WarehouseStock.find_by(product_id: purchase_detail.product_id, warehouse_id: purchase.warehouse_id)
  166. end
  167. # restarle al stock del producto
  168. stock = stock_product.stock - purchase_detail.quantity
  169. stock_product.update_attributes(stock: stock)
  170. # guardar en bitacora de inventario
  171. InventoriesMove.create(product_id: purchase_detail.product_id, purchase_id: purchase.id, quantity: purchase_detail.quantity, move_type: "outgoing", reason: "purchase_cancel")
  172. end
  173. # Never trust parameters from the scary internet, only allow the white list through.
  174. def purchase_params
  175. params.require(:purchase).permit(:supplier_id, :pointsale_id, :warehouse_id, :purchase_code, :amount, :tax, :total, :observations, :purchase_date, :is_in_dollars, :exchange)
  176. end
  177. end