transfers_controller.rb 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. class TransfersController < ApplicationController
  2. ##--- Abilities
  3. load_and_authorize_resource
  4. ##--- Breadcrum_rails
  5. add_breadcrumb I18n.t("breadcrumbs." + controller_name), :transfers_path
  6. add_breadcrumb "Nuevo traspaso", :new_transfer_path, only: :new
  7. add_breadcrumb "Detalle del traspaso", :transfer_path, only: :show
  8. add_breadcrumb "Editar traspaso", :edit_transfer_path, only: :edit
  9. add_breadcrumb "Verificar traspaso", :verify_transfer_path, only: :verify_transfer
  10. before_action :set_transfer, only: [:show, :edit, :update, :destroy]
  11. before_action :get_filters, only: [:index, :show, :edit, :new]
  12. # GET /transfers
  13. # GET /transfers.json
  14. def index
  15. @transfers = Transfer.includes(:user, :received_by, :transfer_details).all.order('id DESC, transfer_date DESC')
  16. unless current_user.usertype == "A"
  17. is_destiny =
  18. if current_user.usertype == "S"
  19. id_filter = current_user.warehouse_id
  20. 0
  21. else
  22. id_filter = current_user.pointsale_id
  23. 1
  24. end
  25. @received = @transfers.where(destiny_id: id_filter, destiny_is_pointsale: is_destiny).order('id DESC, transfer_date DESC')
  26. @sent = @transfers.where(origin_id: id_filter, origin_is_pointsale: is_destiny).order('id DESC, transfer_date DESC')
  27. end
  28. end
  29. # GET /transfers/1
  30. # GET /transfers/1.json
  31. def show; end
  32. # GET /transfers/new
  33. def new
  34. @transfer = Transfer.new
  35. set_transfer_data(nil)
  36. end
  37. # GET /transfers/1/edit
  38. def edit; end
  39. # POST /transfers
  40. # POST /transfers.json
  41. def create
  42. @transfer = Transfer.new(transfer_params)
  43. pre_transfers = PreTransfer.where(user_id: current_user.id)
  44. @transfer.user_id = current_user.id
  45. @transfer.status = :pending
  46. @transfer.origin_is_pointsale = params[:transfer][:origin_id].first == 'P' ? 1 : 0
  47. @transfer.destiny_is_pointsale = params[:transfer][:destiny_id].first == 'P' ? 1 : 0
  48. @transfer.origin_id = params[:transfer][:origin_id][2, params[:transfer][:origin_id].length]
  49. @transfer.destiny_id = params[:transfer][:destiny_id][2, params[:transfer][:destiny_id].length]
  50. pre_transfers.each do |pre|
  51. detail = TransferDetail.new(transfer_id: @transfer.id, product_id: pre.product_id, quantity: pre.quantity, adjustment: pre.quantity, status: "pending")
  52. @transfer.transfer_details << detail
  53. end
  54. respond_to do |format|
  55. origin_pointsale_name = @transfer.origin_is_pointsale? ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name
  56. destiny_pointsale_name = @transfer.destiny_is_pointsale? ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name
  57. @transfer.audit_comment = "Traspaso de #{origin_pointsale_name} a #{destiny_pointsale_name} creado."
  58. if @transfer.save
  59. pre_transfers.destroy_all
  60. message = "Traspaso creado al " + (@transfer.destiny_is_pointsale? ? "punto de venta #{destiny_pointsale_name}" : "almacén #{destiny_pointsale_name}")
  61. format.html { redirect_to transfers_path, success: message }
  62. format.json { render :show, status: :created, location: @transfer }
  63. else
  64. set_transfer_data(params)
  65. format.html { render :new }
  66. format.json { render json: @transfer.errors, status: :unprocessable_entity }
  67. end
  68. end
  69. end
  70. # DELETE /transfers/1
  71. # DELETE /transfers/1.json
  72. def destroy
  73. @transfer.audit_comment = "Traspaso de #{@transfer.origin_is_pointsale? ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name} a #{@transfer.destiny_is_pointsale? ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name} eliminado."
  74. @transfer.destroy
  75. respond_to do |format|
  76. format.html { redirect_to transfers_url, notice: 'Transfer was successfully destroyed.' }
  77. format.json { head :no_content }
  78. end
  79. end
  80. def verify_transfer
  81. @transfer = Transfer.find(params[:transfer_id])
  82. end
  83. # para guardar la cantidad recibida por producto en el traspaso
  84. def detail_adjustment
  85. respond_to do |format|
  86. @transfer = Transfer.find(params[:transfer_id])
  87. @transfer.transfer_details.each do |detail|
  88. # rubocop:disable Style/Next
  89. if detail.id == params[:detail_id].to_i
  90. detail.adjustment = params[:transfer_details][:adjustment].to_i
  91. if detail.adjustment > detail.quantity
  92. detail.has_looses = 0
  93. detail.has_surplus = 1
  94. elsif detail.adjustment < detail.quantity
  95. detail.has_looses = 1
  96. detail.has_surplus = 0
  97. end
  98. if detail.save
  99. format.json { head :ok }
  100. end
  101. end
  102. # rubocop:enable Style/Next
  103. end
  104. end
  105. end
  106. def accept_transfer
  107. @transfer = Transfer.find(params[:transfer_id])
  108. @transfer.observations = params[:transfer][:observations]
  109. @transfer.received_by_id = current_user.id
  110. @transfer.status = :received
  111. @transfer.reception_date = Date.today
  112. @transfer.audit_comment = "Se dio entrada a traspaso de #{@transfer.origin_is_pointsale? ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name} a #{@transfer.destiny_is_pointsale? ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name}"
  113. @transfer.save
  114. @transfer.transfer_details.each do |detail|
  115. if @transfer.destiny_is_pointsale == 1
  116. stock_product = AvailableProduct.find_by(product_id: detail.product_id, pointsale_id: @transfer.destiny_id)
  117. if stock_product.present?
  118. stock_product.stock = 0 if stock_product.stock.blank?
  119. stock_product.stock += detail.adjustment
  120. else
  121. stock_product = AvailableProduct.new(product_id: detail.product_id, pointsale_id: @transfer.destiny_id, stock: detail.adjustment)
  122. end
  123. else
  124. # actualizar stock del producto cuando es para almacen
  125. stock_product = WarehouseStock.find_by(product_id: detail.product_id, warehouse_id: @transfer.destiny_id)
  126. if stock_product.present?
  127. stock_product.stock = 0 if stock_product.stock.blank?
  128. stock_product.stock += detail.adjustment
  129. else
  130. stock_product = WarehouseStock.new(product_id: detail.product_id, warehouse_id: @transfer.destiny_id, stock: detail.adjustment)
  131. end
  132. end
  133. stock_product.save
  134. # guardar en bitacora de inventario
  135. move = InventoriesMove.new(product_id: detail.product_id, quantity: detail.adjustment, transfer_id: @transfer.id, move_type: "incoming", reason: "transfer")
  136. move.save
  137. end
  138. respond_to do |format|
  139. format.js { flash[:success] = "Traspaso realizado correctamente." }
  140. end
  141. end
  142. def print_receipt
  143. @transfer = Transfer.find(params[:transfer_id])
  144. origin = @transfer.origin_is_pointsale == 1 ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name
  145. destiny = @transfer.destiny_is_pointsale == 1 ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name
  146. with_looses = @transfer.transfer_details.where(has_looses: 1).count
  147. with_surplus = @transfer.transfer_details.where(has_surplus: 1).count
  148. reception_status =
  149. if with_looses > 0 && with_surplus.zero?
  150. 'CON PERDIDAS'
  151. elsif with_surplus > 0 && with_looses.zero?
  152. 'CON EXCEDENTE'
  153. elsif with_surplus > 0 && with_looses > 0
  154. 'CON INCONSISTENCIAS'
  155. else
  156. 'TRASPASO COMPLETO'
  157. end
  158. respond_to do |format|
  159. format.pdf do
  160. render pdf: "traspaso_#{@transfer.id}", template: "transfers/receipt.pdf.erb", layout: 'receipt.html.erb', locals: { transfer: @transfer, reception_status: reception_status, origin: origin, destiny: destiny }, show_as_html: params.key?('debug'), page_width: '80mm', page_height: '300mm'
  161. end
  162. end
  163. end
  164. def set_transfer_data(params)
  165. @destiny_pointsales = Pointsale.activos.ignore_current(current_user.pointsale_id)
  166. @pre_transfers = PreTransfer.where(user_id: current_user.id)
  167. @disable_origin = false
  168. @disable_destiny = false
  169. # reestablecer origen y destino
  170. if @pre_transfers.present?
  171. @origin_id = @pre_transfers[0].origin_is_pointsale? ? "P-#{@pre_transfers[0].origin_id}" : "W-#{@pre_transfers[0].origin_id}"
  172. @destiny_id = @pre_transfers[0].destiny_is_pointsale? ? "P-#{@pre_transfers[0].destiny_id}" : "W-#{@pre_transfers[0].destiny_id}"
  173. @disable_origin = true
  174. @disable_destiny = true
  175. elsif params.present?
  176. @origin_id = params[:transfer][:origin_id]
  177. @destiny_id = params[:transfer][:destiny_id]
  178. end
  179. if current_user.usertype == "G" || current_user.usertype == "C"
  180. @origin_id = "P-#{current_user.pointsale_id}"
  181. @disable_origin = true
  182. elsif current_user.usertype == "S"
  183. @origin_id = "W-#{current_user.warehouse_id}"
  184. @disable_origin = true
  185. end
  186. if @origin_id == @destiny_id
  187. @disable_origin = false
  188. @disable_destiny = false
  189. end
  190. end
  191. private
  192. # Use callbacks to share common setup or constraints between actions.
  193. def set_transfer
  194. @transfer = Transfer.find(params[:id])
  195. end
  196. def get_filters
  197. @current_page = params[:current_page].blank? ? 1 : params[:current_page]
  198. @filter = params[:filter]
  199. end
  200. # Never trust parameters from the scary internet, only allow the white list through.
  201. def transfer_params
  202. params.require(:transfer).permit(:origin_id, :destiny_id, :transfer_date, :user_id, :status, :received_by_id, :observations, transfer_details_attributes: [:transfer_id, :product_id, :quantity, :status, :adjustment, :reception_date])
  203. end
  204. end