purchases_controller.rb 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. if current_user.usertype == "A"
  15. @purchases = Purchase.all.includes(:supplier, :pointsale, :warehouse, :user).order("created_at DESC")
  16. else
  17. @purchases = Purchase.includes(:supplier, :user).where(:pointsale_id => current_user.pointsale_id).order('created_at desc')
  18. end
  19. end
  20. # GET /purchases/1
  21. # GET /purchases/1.json
  22. def show
  23. 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. if @pre_purchases.size > 0
  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} creada."
  67. @purchase.audit_comment = message
  68. if @purchase.save
  69. @pre_purchases.each do |pre_purchase|
  70. # agregar detalles de la compra
  71. detail = PurchaseDetail.new
  72. detail.product_id = pre_purchase.product_id
  73. detail.quantity = pre_purchase.quantity
  74. detail.amount = pre_purchase.total
  75. detail.price = pre_purchase.price_base
  76. detail.tax = pre_purchase.tax
  77. @purchase.purchase_details << detail
  78. # actualizar stock del producto cuando es para punto de venta
  79. if @purchase.pointsale_id.present?
  80. stockProduct = AvailableProduct.find_by(:product_id => detail.product_id, :pointsale_id => @purchase.pointsale_id)
  81. if stockProduct.present?
  82. stockProduct.stock = 0 if stockProduct.stock.blank?
  83. stockProduct.stock += detail.quantity
  84. stockProduct.save
  85. else
  86. stockProduct = AvailableProduct.new
  87. stockProduct.product_id = detail.product_id
  88. stockProduct.pointsale_id = @purchase.pointsale_id
  89. stockProduct.stock = detail.quantity
  90. stockProduct.save
  91. end
  92. else
  93. # actualizar stock del producto cuando es para punto de venta
  94. stockProduct = WarehouseStock.find_by(:product_id => detail.product_id, :warehouse_id => @purchase.warehouse_id)
  95. if stockProduct.present?
  96. stockProduct.stock = 0 if stockProduct.stock.blank?
  97. stockProduct.stock += detail.quantity
  98. stockProduct.save
  99. else
  100. stockProduct = WarehouseStock.new
  101. stockProduct.product_id = detail.product_id
  102. stockProduct.warehouse_id = @purchase.warehouse_id
  103. stockProduct.stock = detail.quantity
  104. stockProduct.save
  105. end
  106. end
  107. # guardar en bitacora de inventario
  108. move = InventoriesMove.new
  109. move.product_id = detail.product_id
  110. move.purchase_id = @purchase.id
  111. move.quantity = detail.quantity
  112. move.move_type = "incoming"
  113. move.reason = "purchase"
  114. move.save
  115. pre_purchase.destroy
  116. end
  117. format.html { redirect_to purchases_url, success: message }
  118. else
  119. format.html { render :new }
  120. format.json { render json: @purchase.errors.values, status: :unprocessable_entity }
  121. end
  122. end
  123. end
  124. # DELETE /purchases/1
  125. # DELETE /purchases/1.json
  126. def destroy
  127. respond_to do |format|
  128. message = "Compra #{@purchase.purchase_code} cancelada."
  129. @purchase.audit_comment = message
  130. if @purchase.update_attributes(:status => :cancelled)
  131. #checa si hay pagos de esta compra
  132. CashRegistersMove.where(:purchase_id => @purchase.id).each do |move|
  133. new_cash_move = move.dup
  134. new_cash_move.move_type = :ingreso
  135. new_cash_move.save
  136. end
  137. @purchase.purchase_details.each do |detail|
  138. detail.update_attributes(:status => :inactive)
  139. #busca y actualiza el stock de productos
  140. if @purchase.pointsale.present?
  141. stockProduct = AvailableProduct.find_by(:product_id => detail.product_id, :pointsale_id => @purchase.pointsale_id)
  142. else
  143. stockProduct = WarehouseStock.find_by(:product_id => detail.product_id, :warehouse_id => @purchase.warehouse_id)
  144. end
  145. # restarle al stock del producto
  146. stock = stockProduct.stock - detail.quantity
  147. stockProduct.update_attributes(:stock => stock)
  148. # guardar en bitacora de inventario
  149. move = InventoriesMove.new
  150. move.product_id = detail.product_id
  151. move.purchase_id = @purchase.id
  152. move.quantity = detail.quantity
  153. move.move_type = "outgoing"
  154. move.reason = "purchase_cancel"
  155. move.save
  156. end
  157. format.html { redirect_to purchases_url, warning: message }
  158. format.json { head :no_content }
  159. else
  160. format.html { render :edit }
  161. format.json { render json: @purchase.errors, status: :unprocessable_entity }
  162. end
  163. end
  164. end
  165. def find_purchases_by_date
  166. startDate = DateTime.parse(params[:begin_date])
  167. endDate = DateTime.parse(params[:end_date])
  168. if current_user.usertype == "A"
  169. @purchases = Purchase.includes(:supplier, :pointsale, :warehouse, :user).where(:purchase_date => startDate..endDate).order('purchase_date desc')
  170. else
  171. @purchases = Purchase.includes(:supplier, :user).where(:pointsale_id => current_user.pointsale_id, :created_at => startDate..endDate).order('purchase_date desc')
  172. end
  173. respond_to do |format|
  174. format.js
  175. end
  176. end
  177. private
  178. # Use callbacks to share common setup or constraints between actions.
  179. def set_purchase
  180. @purchase = Purchase.find(params[:id])
  181. end
  182. def get_filters
  183. if params[:current_page].blank?
  184. @current_page = 1
  185. else
  186. @current_page = params[:current_page]
  187. end
  188. @filter = params[:filter]
  189. end
  190. # Never trust parameters from the scary internet, only allow the white list through.
  191. def purchase_params
  192. params.require(:purchase).permit(:supplier_id, :pointsale_id, :warehouse_id ,:purchase_code, :amount, :tax, :total, :observations, :purchase_date, :is_in_dollars, :exchange)
  193. end
  194. end