| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- class PurchasesController < ApplicationController
- ##--- Abilities
- load_and_authorize_resource
- ##--- Breadcrum_rails
- add_breadcrumb I18n.t("breadcrumbs." + controller_name), :purchases_path
- add_breadcrumb "Nueva " + I18n.t("breadcrumbs." + controller_name).singularize, :new_purchase_path, only: :new
- add_breadcrumb "Detalle de la " + I18n.t("breadcrumbs." + controller_name).singularize , :purchase_path, only: :show
- add_breadcrumb "Editar " + I18n.t("breadcrumbs." + controller_name).singularize , :edit_purchase_path, only: :edit
- before_action :set_purchase, only: [:show, :edit, :update, :destroy]
- before_action :get_filters, only: [:index, :show, :edit, :new]
- # GET /purchases
- # GET /purchases.json
- def index
- if current_user.usertype == "A"
- @purchases = Purchase.all.includes(:supplier, :pointsale, :warehouse, :user).order("created_at DESC")
- else
- @purchases = Purchase.includes(:supplier, :user).where(:pointsale_id => current_user.pointsale_id).order('created_at desc')
- end
- end
- # GET /purchases/1
- # GET /purchases/1.json
- def show
- end
- # GET /purchases/new
- def new
- @disable_supplier = false
- @disable_pointsale = false
- @disable_warehouse = false
- @disable_is_in_dollars = false
- @disable_destiny = false
- @disabled_button = true
- @destiny = 'warehouse'
- @purchase = Purchase.new
- @purchase.purchase_details.new
- @pre_purchases = PrePurchase.where(:user_id => current_user.id)
- if @pre_purchases.size > 0
- @purchase.supplier_id = @pre_purchases[0].supplier_id
- @purchase.pointsale_id = @pre_purchases[0].pointsale_id
- @purchase.warehouse_id = @pre_purchases[0].warehouse_id
- @destiny = @purchase.pointsale_id.present? ? 'pointsale' : 'warehouse'
- @purchase.exchange = @pre_purchases[0].exchange if @pre_purchases[0].exchange.present?
- @purchase.is_in_dollars = true if @pre_purchases[0].exchange.present?
- @disable_supplier = true
- @disable_pointsale = true
- @disable_warehouse = true
- @disable_is_in_dollars = true
- @disable_destiny = true
- @disabled_button = false
- end
- if current_user.usertype == 'G'
- @destiny = 'pointsale'
- @purchase.pointsale_id = current_user.pointsale_id
- @disable_pointsale = true
- @disable_warehouse = true
- @disable_destiny = true
- end
- end
- # POST /purchases
- # POST /purchases.json
- def create
- @purchase = Purchase.new(purchase_params)
- @purchase.user_id = current_user.id
- @purchase.status = :notpaid
- @pre_purchases = PrePurchase.where(:user_id => current_user.id)
- respond_to do |format|
- message = "compra #{@purchase.purchase_code} por #{@purchase.total} creada."
- @purchase.audit_comment = message
- if @purchase.save
- @pre_purchases.each do |pre_purchase|
- # agregar detalles de la compra
- detail = PurchaseDetail.new
- detail.product_id = pre_purchase.product_id
- detail.quantity = pre_purchase.quantity
- detail.amount = pre_purchase.total
- detail.price = pre_purchase.price_base
- detail.tax = pre_purchase.tax
- @purchase.purchase_details << detail
- # actualizar stock del producto cuando es para punto de venta
- if @purchase.pointsale_id.present?
- stockProduct = AvailableProduct.find_by(:product_id => detail.product_id, :pointsale_id => @purchase.pointsale_id)
- if stockProduct.present?
- stockProduct.stock = 0 if stockProduct.stock.blank?
- stockProduct.stock += detail.quantity
- stockProduct.save
- else
- stockProduct = AvailableProduct.new
- stockProduct.product_id = detail.product_id
- stockProduct.pointsale_id = @purchase.pointsale_id
- stockProduct.stock = detail.quantity
- stockProduct.save
- end
- else
- # actualizar stock del producto cuando es para punto de venta
- stockProduct = WarehouseStock.find_by(:product_id => detail.product_id, :warehouse_id => @purchase.warehouse_id)
- if stockProduct.present?
- stockProduct.stock = 0 if stockProduct.stock.blank?
- stockProduct.stock += detail.quantity
- stockProduct.save
- else
- stockProduct = WarehouseStock.new
- stockProduct.product_id = detail.product_id
- stockProduct.warehouse_id = @purchase.warehouse_id
- stockProduct.stock = detail.quantity
- stockProduct.save
- end
- end
- # guardar en bitacora de inventario
- move = InventoriesMove.new
- move.product_id = detail.product_id
- move.purchase_id = @purchase.id
- move.quantity = detail.quantity
- move.move_type = "incoming"
- move.reason = "purchase"
- move.save
- pre_purchase.destroy
- end
- format.html { redirect_to purchases_url, success: message }
- else
- format.html { render :new }
- format.json { render json: @purchase.errors.values, status: :unprocessable_entity }
- end
- end
- end
- # DELETE /purchases/1
- # DELETE /purchases/1.json
- def destroy
- respond_to do |format|
- message = "Compra #{@purchase.purchase_code} cancelada."
- @purchase.audit_comment = message
- if @purchase.update_attributes(:status => :cancelled)
- #checa si hay pagos de esta compra
- CashRegistersMove.where(:purchase_id => @purchase.id).each do |move|
- new_cash_move = move.dup
- new_cash_move.move_type = :ingreso
- new_cash_move.save
- end
- @purchase.purchase_details.each do |detail|
- detail.update_attributes(:status => :inactive)
- #busca y actualiza el stock de productos
- if @purchase.pointsale.present?
- stockProduct = AvailableProduct.find_by(:product_id => detail.product_id, :pointsale_id => @purchase.pointsale_id)
- else
- stockProduct = WarehouseStock.find_by(:product_id => detail.product_id, :warehouse_id => @purchase.warehouse_id)
- end
- # restarle al stock del producto
- stock = stockProduct.stock - detail.quantity
- stockProduct.update_attributes(:stock => stock)
- # guardar en bitacora de inventario
- move = InventoriesMove.new
- move.product_id = detail.product_id
- move.purchase_id = @purchase.id
- move.quantity = detail.quantity
- move.move_type = "outgoing"
- move.reason = "purchase_cancel"
- move.save
- end
- format.html { redirect_to purchases_url, warning: message }
- format.json { head :no_content }
- else
- format.html { render :edit }
- format.json { render json: @purchase.errors, status: :unprocessable_entity }
- end
- end
- end
- def find_purchases_by_date
- startDate = DateTime.parse(params[:begin_date])
- endDate = DateTime.parse(params[:end_date])
- if current_user.usertype == "A"
- @purchases = Purchase.includes(:supplier, :pointsale, :warehouse, :user).where(:purchase_date => startDate..endDate).order('purchase_date desc')
- else
- @purchases = Purchase.includes(:supplier, :user).where(:pointsale_id => current_user.pointsale_id, :created_at => startDate..endDate).order('purchase_date desc')
- end
- respond_to do |format|
- format.js
- end
- end
- private
- # Use callbacks to share common setup or constraints between actions.
- def set_purchase
- @purchase = Purchase.find(params[:id])
- end
- def get_filters
- if params[:current_page].blank?
- @current_page = 1
- else
- @current_page = params[:current_page]
- end
- @filter = params[:filter]
- end
- # Never trust parameters from the scary internet, only allow the white list through.
- def purchase_params
- params.require(:purchase).permit(:supplier_id, :pointsale_id, :warehouse_id ,:purchase_code, :amount, :tax, :total, :observations, :purchase_date, :is_in_dollars, :exchange)
- end
- end
|