Quellcode durchsuchen

[Issue #15] Validations in new transfers

Jacqueline Maldonado vor 7 Jahren
Ursprung
Commit
c9a889aec1

+ 94 - 112
app/controllers/transfers_controller.rb

@@ -15,14 +15,18 @@ class TransfersController < ApplicationController
   # GET /transfers
   # GET /transfers.json
   def index
-    if current_user.usertype == 'A'
-      @transfers = Transfer.all.includes(:user, :received_by).order('id DESC, transfer_date DESC')
-    elsif current_user.usertype == 'G' || current_user.usertype == 'C'
-      @received = Transfer.includes(:user, :received_by).where(destiny_id: current_user.pointsale_id, destiny_is_pointsale: 1).order('id DESC, transfer_date DESC')
-      @sent = Transfer.includes(:user, :received_by).where(origin_id: current_user.pointsale_id, origin_is_pointsale: 1).order('id DESC, transfer_date DESC')
-    elsif current_user.usertype == 'S'
-      @received = Transfer.includes(:user, :received_by).where(destiny_id: current_user.warehouse_id, destiny_is_pointsale: 0).order('id DESC, transfer_date DESC')
-      @sent = Transfer.includes(:user, :received_by).where(origin_id: current_user.warehouse_id, origin_is_pointsale: 0).order('id DESC, transfer_date DESC')
+    @transfers = Transfer.includes(:user, :received_by, :transfer_details).all.order('id DESC, transfer_date DESC')
+    unless current_user.usertype == "A"
+      is_destiny =
+        if current_user.usertype == "S"
+          id_filter = current_user.warehouse_id
+          0
+        else
+          id_filter = current_user.pointsale_id
+          1
+        end
+      @received = @transfers.where(destiny_id: id_filter, destiny_is_pointsale: is_destiny).order('id DESC, transfer_date DESC')
+      @sent = @transfers.where(origin_id: id_filter, origin_is_pointsale: is_destiny).order('id DESC, transfer_date DESC')
     end
   end
 
@@ -31,30 +35,10 @@ class TransfersController < ApplicationController
   def show; end
 
   # GET /transfers/new
-  # rubocop:disable Style/ZeroLengthPredicate
   def new
     @transfer = Transfer.new
-    @destiny_pointsales = Pointsale.activos.ignore_current(current_user.pointsale_id)
-    @pre_transfers = PreTransfer.where(user_id: current_user.id)
-    @disable_origin = false
-    @disable_destiny = false
-    @disabled_button = true
-    if @pre_transfers.size > 0
-      @origin_id = @pre_transfers[0].origin_is_pointsale == 1 ? "P-#{@pre_transfers[0].origin_id}" : "W-#{@pre_transfers[0].origin_id}"
-      @destiny_id = @pre_transfers[0].destiny_is_pointsale == 1 ? "P-#{@pre_transfers[0].destiny_id}" : "W-#{@pre_transfers[0].destiny_id}"
-      @disable_origin = true
-      @disable_destiny = true
-      @disabled_button = false
-    end
-    if current_user.usertype == "G" || current_user.usertype == "C"
-      @origin_id = "P-#{current_user.pointsale_id}"
-      @disable_origin = true
-    elsif current_user.usertype == "S"
-      @origin_id = "W-#{current_user.warehouse_id}"
-      @disable_origin = true
-    end
+    set_transfer_data(nil)
   end
-  # rubocop:enble Style/ZeroLengthPredicate
 
   # GET /transfers/1/edit
   def edit; end
@@ -71,44 +55,27 @@ class TransfersController < ApplicationController
     @transfer.origin_id = params[:transfer][:origin_id][2, params[:transfer][:origin_id].length]
     @transfer.destiny_id = params[:transfer][:destiny_id][2, params[:transfer][:destiny_id].length]
 
+    pre_transfers.each do |pre|
+      detail = TransferDetail.new(transfer_id: @transfer.id, product_id: pre.product_id, quantity: pre.quantity, adjustment: pre.quantity, status: "pending")
+      @transfer.transfer_details << detail
+    end
     respond_to do |format|
-      @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} creado."
+      origin_pointsale_name = @transfer.origin_is_pointsale? ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name
+      destiny_pointsale_name = @transfer.destiny_is_pointsale? ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name
+      @transfer.audit_comment = "Traspaso de #{origin_pointsale_name} a #{destiny_pointsale_name} creado."
       if @transfer.save
-        pre_transfers.each do |pre|
-          detail = TransferDetail.new
-          detail.transfer_id = @transfer.id
-          detail.product_id = pre.product_id
-          detail.quantity = pre.quantity
-          detail.adjustment = pre.quantity
-          detail.status = "pending"
-          @transfer.transfer_details << detail
-          pre.destroy
-        end
-
-        message = "Traspaso creado al " + (@transfer.destiny_is_pointsale == 1 ? "punto de venta #{Pointsale.find(@transfer.destiny_id).name}" : "almacén #{Warehouse.find(@transfer.destiny_id).name}")
+        pre_transfers.destroy_all
+        message = "Traspaso creado al " + (@transfer.destiny_is_pointsale? ? "punto de venta #{destiny_pointsale_name}" : "almacén #{destiny_pointsale_name}")
         format.html { redirect_to transfers_path, success: message }
         format.json { render :show, status: :created, location: @transfer }
       else
+        set_transfer_data(params)
         format.html { render :new }
         format.json { render json: @transfer.errors, status: :unprocessable_entity }
       end
     end
   end
 
-  # PATCH/PUT /transfers/1
-  # PATCH/PUT /transfers/1.json
-  def update
-    respond_to do |format|
-      if @transfer.update(transfer_params)
-        format.html { redirect_to @transfer, notice: 'Transfer was successfully updated.' }
-        format.json { render :show, status: :ok, location: @transfer }
-      else
-        format.html { render :edit }
-        format.json { render json: @transfer.errors, status: :unprocessable_entity }
-      end
-    end
-  end
-
   # DELETE /transfers/1
   # DELETE /transfers/1.json
   def destroy
@@ -149,81 +116,96 @@ class TransfersController < ApplicationController
     end
   end
 
-  # rubocop:disable Metrics/BlockLength
   def accept_transfer
-    respond_to do |format|
-      @transfer = Transfer.find(params[:transfer_id])
-      @transfer.observations = params[:transfer][:observations]
-      @transfer.received_by_id = current_user.id
-      @transfer.status = :received
-      @transfer.reception_date = Date.today
-      @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}"
-      @transfer.save
-      @transfer.transfer_details.each do |detail|
-        if @transfer.destiny_is_pointsale == 1
-          stock_product = AvailableProduct.find_by(product_id: detail.product_id, pointsale_id: @transfer.destiny_id)
-          if stock_product.present?
-            stock_product.stock = 0 if stock_product.stock.blank?
-            stock_product.stock += detail.adjustment
-          else
-            stock_product = AvailableProduct.new
-            stock_product.product_id = detail.product_id
-            stock_product.pointsale_id = @transfer.destiny_id
-            stock_product.stock = detail.adjustment
-          end
+    @transfer = Transfer.find(params[:transfer_id])
+    @transfer.observations = params[:transfer][:observations]
+    @transfer.received_by_id = current_user.id
+    @transfer.status = :received
+    @transfer.reception_date = Date.today
+    @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}"
+    @transfer.save
+    @transfer.transfer_details.each do |detail|
+      if @transfer.destiny_is_pointsale == 1
+        stock_product = AvailableProduct.find_by(product_id: detail.product_id, pointsale_id: @transfer.destiny_id)
+        if stock_product.present?
+          stock_product.stock = 0 if stock_product.stock.blank?
+          stock_product.stock += detail.adjustment
         else
-          # actualizar stock del producto cuando es para almacen
-          stock_product = WarehouseStock.find_by(product_id: detail.product_id, warehouse_id: @transfer.destiny_id)
-          if stock_product.present?
-            stock_product.stock = 0 if stock_product.stock.blank?
-            stock_product.stock += detail.adjustment
-          else
-            stock_product = WarehouseStock.new
-            stock_product.product_id = detail.product_id
-            stock_product.warehouse_id = @transfer.destiny_id
-            stock_product.stock = detail.adjustment
-          end
+          stock_product = AvailableProduct.new(product_id: detail.product_id, pointsale_id: @transfer.destiny_id, stock: detail.adjustment)
+        end
+      else
+        # actualizar stock del producto cuando es para almacen
+        stock_product = WarehouseStock.find_by(product_id: detail.product_id, warehouse_id: @transfer.destiny_id)
+        if stock_product.present?
+          stock_product.stock = 0 if stock_product.stock.blank?
+          stock_product.stock += detail.adjustment
+        else
+          stock_product = WarehouseStock.new(product_id: detail.product_id, warehouse_id: @transfer.destiny_id, stock: detail.adjustment)
         end
-        stock_product.save
-
-        # guardar en bitacora de inventario
-        move = InventoriesMove.new
-        move.product_id = detail.product_id
-        move.quantity = detail.adjustment
-        move.transfer_id = @transfer.id
-        move.move_type = "incoming"
-        move.reason = "transfer"
-        move.save
       end
+      stock_product.save
+
+      # guardar en bitacora de inventario
+      move = InventoriesMove.new(product_id: detail.product_id, quantity: detail.adjustment, transfer_id: @transfer.id, move_type: "incoming", reason: "transfer")
+      move.save
+    end
+    respond_to do |format|
       format.js { flash[:success] = "Traspaso realizado correctamente." }
     end
   end
-  # rubocop:enable Metrics/BlockLength
 
-  # rubocop:disable Style/ConditionalAssignment
   def print_receipt
-    respond_to do |format|
-      @transfer = Transfer.find(params[:transfer_id])
-      origin = @transfer.origin_is_pointsale == 1 ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name
-      destiny = @transfer.destiny_is_pointsale == 1 ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name
-      with_looses = @transfer.transfer_details.where(has_looses: 1).count
-      with_surplus = @transfer.transfer_details.where(has_surplus: 1).count
+    @transfer = Transfer.find(params[:transfer_id])
+    origin = @transfer.origin_is_pointsale == 1 ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name
+    destiny = @transfer.destiny_is_pointsale == 1 ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name
+    with_looses = @transfer.transfer_details.where(has_looses: 1).count
+    with_surplus = @transfer.transfer_details.where(has_surplus: 1).count
+    reception_status =
       if with_looses > 0 && with_surplus.zero?
-        reception_status = 'CON PERDIDAS'
+        'CON PERDIDAS'
       elsif with_surplus > 0 && with_looses.zero?
-        reception_status = 'CON EXCEDENTE'
+        'CON EXCEDENTE'
       elsif with_surplus > 0 && with_looses > 0
-        reception_status = 'CON INCONSISTENCIAS'
+        'CON INCONSISTENCIAS'
       else
-        reception_status = 'TRASPASO COMPLETO'
+        'TRASPASO COMPLETO'
       end
-
+    respond_to do |format|
       format.pdf do
         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'
       end
     end
   end
-  # rubocop:enable Style/ConditionalAssignment
+
+  def set_transfer_data(params)
+    @destiny_pointsales = Pointsale.activos.ignore_current(current_user.pointsale_id)
+    @pre_transfers = PreTransfer.where(user_id: current_user.id)
+    @disable_origin = false
+    @disable_destiny = false
+    # reestablecer origen y destino
+    if @pre_transfers.present?
+      @origin_id = @pre_transfers[0].origin_is_pointsale? ? "P-#{@pre_transfers[0].origin_id}" : "W-#{@pre_transfers[0].origin_id}"
+      @destiny_id = @pre_transfers[0].destiny_is_pointsale? ? "P-#{@pre_transfers[0].destiny_id}" : "W-#{@pre_transfers[0].destiny_id}"
+      @disable_origin = true
+      @disable_destiny = true
+    elsif params.present?
+      @origin_id = params[:transfer][:origin_id]
+      @destiny_id = params[:transfer][:destiny_id]
+    end
+
+    if current_user.usertype == "G" || current_user.usertype == "C"
+      @origin_id = "P-#{current_user.pointsale_id}"
+      @disable_origin = true
+    elsif current_user.usertype == "S"
+      @origin_id = "W-#{current_user.warehouse_id}"
+      @disable_origin = true
+    end
+
+    if @origin_id == @destiny_id
+      @disable_origin = false
+      @disable_destiny = false
+    end
+  end
 
   private
 

+ 36 - 0
app/helpers/transfers_helper.rb

@@ -1,2 +1,38 @@
 module TransfersHelper
+  def transfer_status(transfer)
+    case transfer.status
+    when "cancelled" then
+      content_tag(:span, "CANCELADO", class: "label label-danger", style: "font-size:85%")
+    when "pending" then
+      content_tag(:span, "PENDIENTE DE RECEPCIÓN", class: "label label-warning", style: "font-size:85%")
+    when "received" then
+      content_tag(:span, "RECIBIDO", class: "label label-info", style: "font-size:85%")
+    end
+  end
+
+  def transfer_details(transfer)
+    transfer_detail = transfer.transfer_details
+    has_looses = transfer_detail.where(has_looses: true)
+    has_surplus = transfer_detail.where(has_surplus: true)
+
+    if !has_looses.blank? && has_surplus.blank? # has loses but not surplus
+      content_tag(:span, "CON PÉRDIDAS", class: "label label-warning", style: "font-size:85%")
+    elsif !has_surplus.blank? && has_looses.blank? # has surplus but not loses
+      content_tag(:span, "CON EXCEDENTE", class: "label label-warning", style: "font-size:85%")
+    elsif !has_surplus.blank? && !has_looses.blank? # has surplus and loses
+      content_tag(:span, "CON INCONSISTENCIAS", class: "label label-danger", style: "font-size:85%")
+    elsif transfer.received?
+      content_tag(:i, "", class: "fa fa-check fa-2 font-green")
+    end
+  end
+
+  def transfer_details_status(detail)
+    if detail.has_looses?
+      content_tag(:span, "Con pérdidas", class: "label label-warning", style: "font-size:85%")
+    elsif detail.has_surplus?
+      content_tag(:span, "Con excedente", class: "label label-warning", style: "font-size:85%")
+    else
+      content_tag(:i, "", class: "fa fa-check fa-2 font-green")
+    end
+  end
 end

+ 1 - 1
app/models/pre_transfer.rb

@@ -4,5 +4,5 @@ class PreTransfer < ActiveRecord::Base
 
 	validates_presence_of :destiny_id, message: "Debe indicar el destino del traspaso."
 	validates_presence_of :product_id, message: "Debe indicar producto a traspasar."
-
+  validates_numericality_of :quantity, greater_than: 0, message: "La cantidad de productos a traspasar debe ser mayor a 0"
 end

+ 15 - 11
app/models/transfer.rb

@@ -1,14 +1,13 @@
 class Transfer < ActiveRecord::Base
-
 	audited
 
-	belongs_to :origin, :class_name => 'Pointsale'
-	belongs_to :destiny, :class_name => 'Pointsale'
-	belongs_to :user, :class_name => 'User'
-	belongs_to :received_by, :class_name => 'User'
+	belongs_to :origin, class_name: 'Pointsale'
+	belongs_to :destiny, class_name: 'Pointsale'
+	belongs_to :user, class_name: 'User'
+	belongs_to :received_by, class_name: 'User'
 
-    has_many :transfer_details
-  	has_many :products, :through => :transfer_details
+  has_many :transfer_details
+	has_many :products, through: :transfer_details
 	has_many :inventories_moves
 
 	enum status: [:cancelled, :pending, :received]
@@ -16,10 +15,15 @@ class Transfer < ActiveRecord::Base
 	accepts_nested_attributes_for :transfer_details
 
 	validates_associated :transfer_details
-	validates :origin_id, presence: { message: "Debe indicar origen del traspaso." }, :on => [:create, :update]
-	validates :destiny_id, presence: { message: "Debe indicar destino del traspaso." }, :on => [:create, :update]
-	validates :received_by_id, presence: { message: "Debe indicar quien recibió el traspaso." }, :on => [:update]
+	validates :origin_id, presence: { message: "Debe indicar origen del traspaso." }, on: [:create, :update]
+	validates :destiny_id, presence: { message: "Debe indicar destino del traspaso." }, on: [:create, :update]
+	validates :received_by_id, presence: { message: "Debe indicar quien recibió el traspaso." }, on: [:update]
+	validate :require_products, on: :create
 
-	scope :activos, -> { where("status = 1") }
+	scope :activos, -> { where(status: 1) }
 
+	private
+	def require_products
+		errors.add(:base, "Debe seleccionar al menos un producto") if transfer_details.size == 0
+	end
 end

+ 6 - 10
app/views/pre_transfers/_pre_transfer.html.erb

@@ -1,22 +1,18 @@
 <tr id="pre_transfer_<%= pre_transfer.id %>">
-  <td>
-    #
-  </td>
+  <td>#</td>
   <td class="text-center">
     <img src="<%= pre_transfer.product.small_img %>" width="100" height="100"/>
-  </td>  
-  <td>
-    <%= pre_transfer.product.sku %>
   </td>
+  <td><%= pre_transfer.product.sku %></td>
   <td>
     <%= pre_transfer.product.name %><br>
     <%= pre_transfer.product.display_attributes %>
   </td>
   <td>
-    <% if pre_transfer.origin_is_pointsale == 1 %>
-      <%= AvailableProduct.find_by(:pointsale_id =>  pre_transfer.origin_id, :product_id => pre_transfer.product_id).stock  + pre_transfer.quantity %> 
-    <% else %> 
-      <%= WarehouseStock.find_by(:warehouse_id => pre_transfer.origin_id, :product_id => pre_transfer.product_id).stock  + pre_transfer.quantity %>
+    <% if pre_transfer.origin_is_pointsale? %>
+      <%= AvailableProduct.find_by(pointsale_id: pre_transfer.origin_id, product_id: pre_transfer.product_id).stock + pre_transfer.quantity %>
+    <% else %>
+      <%= WarehouseStock.find_by(warehouse_id: pre_transfer.origin_id, product_id: pre_transfer.product_id).stock + pre_transfer.quantity %>
     <% end %>
   </td>
   <td>

+ 2 - 1
app/views/pre_transfers/create.js.erb

@@ -6,5 +6,6 @@
 	x = $('#products_table').dataTable();
 	newRow.find('td:eq(0)').html(newRow.find('td:eq(0)').html().replace('#', x.fnGetData().length + 1));
 	table.row.add(newRow).draw();
+  $("#save_transfer").attr("disabled", false);
+  $("#reset_pre_transfers").attr("disabled", false);
 <% end %>
-

+ 85 - 66
app/views/transfers/_form.html.erb

@@ -1,10 +1,19 @@
-<%= form_for(@transfer, :html => {:class=>"form-horizontal", :id=> "transfer_form"}) do |f| %>
+<%= form_for(@transfer, html: { class: "form-horizontal", id: "transfer_form" }) do |f| %>
   <div class="portlet-body form">
-    <div id="error_explanation"></div>
+    <% if @transfer.errors.any? %>
+      <div class="alert alert-danger">
+        <strong>Tiene <%= pluralize(@transfer.errors.count, "error") %> no se puede guardar el traspaso</strong><br>
+        <ul>
+          <% @transfer.errors.values.each do |message| %>
+            <li><%= message.first.to_s %></li>
+          <% end %>
+        </ul>
+      </div>
+    <% end %>
     <div class="row">
       <!-- boton para resetear datos -->
       <div class="col-md-offset-10 col-md-2">
-        <button id="reset_pre_transfers" type="button" class="btn btn-warning" <%= @disabled_button ? 'disabled' : '' %> onclick="deletePreTransfers()">Restaurar traspaso</button>
+        <button id="reset_pre_transfers" type="button" class="btn btn-warning" <%= 'disabled' if @pre_transfers.blank? %> onclick="deletePreTransfers()">Restaurar traspaso</button>
       </div>
       <div class="col-md-7">
         <!-- fecha -->
@@ -29,8 +38,8 @@
           <% end %>
           <div class="input-group col-md-6 select2-bootstrap-prepend">
             <%= f.select :origin_id, grouped_options_for_select([
-              ['Puntos de venta',  Pointsale.activos.collect {|p| [ p.name, ('P-' + p.id.to_s) ] }],
-              ['Almacenes', Warehouse.activos.collect {|w| [ w.name, ('W-' + w.id.to_s)] }]], :selected => @origin_id), {:prompt => "Seleccione"}, { :class => 'form-control select2', :disabled => @disable_origin} %>
+              ['Puntos de venta',  Pointsale.activos.collect { |p| [ p.name, ('P-' + p.id.to_s) ] }],
+              ['Almacenes', Warehouse.activos.collect { |w| [ w.name, ('W-' + w.id.to_s)] }]], :selected => @origin_id), {:prompt => "Seleccione"}, { :class => 'form-control select2', :disabled => @disable_origin} %>
             <%= f.hidden_field :origin_id, :value => @origin_id, :id => 'origin_id' %>
           </div>
         </div>
@@ -41,8 +50,8 @@
           <% end %>
           <div class="input-group col-md-6 select2-bootstrap-prepend">
             <%= f.select :destiny_id, grouped_options_for_select([
-              ['Puntos de venta',  @destiny_pointsales.collect {|p| [ p.name, ('P-' + p.id.to_s)] }],
-              ['Almacenes', Warehouse.activos.collect {|w| [ w.name, ('W-' + w.id.to_s)] }]], :selected => @destiny_id), {:prompt => "Seleccione"}, { :class => 'form-control select2', :disabled => @disable_destiny} %>
+              ['Puntos de venta',  @destiny_pointsales.collect { |p| [ p.name, ('P-' + p.id.to_s)] }],
+              ['Almacenes', Warehouse.activos.collect { |w| [ w.name, ('W-' + w.id.to_s)] }]], :selected => @destiny_id), {:prompt => "Seleccione"}, { :class => 'form-control select2', :disabled => @disable_destiny} %>
             <%= f.hidden_field :destiny_id, :value => @destiny_id, :id => 'destiny_id' %>
           </div>
         </div>
@@ -90,8 +99,9 @@
     <div class="form-actions">
       <div class="row">
         <div class="col-md-9">
-          <%= f.submit 'Guardar', {:class=>"btn green"} %>
-          <%= link_to 'Cancelar', transfers_path(:filter => @filter, :current_page => @current_page), {:class=>"btn default"} %>
+          <!-- < %= f.submit 'Guardar', { class: "btn green", disabled: (@pre_transfers.present? ? false : true), id: "save_transfer" } %> -->
+          <button type="button" class="btn green" onclick="addTransfer()" id="save_transfer" <%= 'disabled' if @pre_transfers.blank? %>>Guardar</button>
+          <%= link_to 'Cancelar', transfers_path(filter: @filter, current_page: @current_page), { class: "btn default" } %>
         </div>
       </div>
     </div>
@@ -99,12 +109,22 @@
 <% end %>
 
 <script type="text/javascript">
-
   var selectedProduct;
   var timeout = null;
+
+  function addTransfer() {
+    var origin = $('#origin_id').val();
+    var destiny = $('#destiny_id').val();
+    if((origin && destiny) && (origin != destiny)) {
+      $("#transfer_form").submit();
+    } else {
+      toastr["error"]("Falta seleccionar datos del formulario, o el origen y el destino son los mismos.");
+    }
+  }
+
   $(document).on("page:change", function() {
-     App.init();
-     enumeratePreTransfers();
+    App.init();
+    enumeratePreTransfers();
 
     $('#datetimepicker1').datetimepicker({
       icons: {
@@ -115,54 +135,52 @@
     });
   });
 
-    var bloodhound = new Bloodhound({
-      datumTokenizer: function (d) {
-        return Bloodhound.tokenizers.whitespace(d.value);
-      },
-      queryTokenizer: Bloodhound.tokenizers.whitespace,
-      remote: {
-        url: "/find_from_stock_by_pointsale?pointsale_id=ID&query=%QUERY",
-        wildcard: '%QUERY',
-        replace: function(url, uriEncodedQuery) {
-            origin = $('#origin_id').val();
-            return url.replace('ID', origin).replace('%QUERY', uriEncodedQuery)
-        }
+  var bloodhound = new Bloodhound({
+    datumTokenizer: function (d) {
+      return Bloodhound.tokenizers.whitespace(d.value);
+    },
+    queryTokenizer: Bloodhound.tokenizers.whitespace,
+    remote: {
+      url: "/find_from_stock_by_pointsale?pointsale_id=ID&query=%QUERY",
+      wildcard: '%QUERY',
+      replace: function(url, uriEncodedQuery) {
+          origin = $('#origin_id').val();
+          return url.replace('ID', origin).replace('%QUERY', uriEncodedQuery)
       }
-    });
-
-    bloodhound.initialize();
-
+    }
+  });
 
-    $('#typeahead').typeahead(
-      {
-        minLength: 3
-      },
-      {
-        displayKey: 'name',
-        source: bloodhound.ttAdapter(),
-        limit: Infinity,
-        templates: {
-          empty: [
-            '<div class="empty-message">',
-              'No se encontró ningun producto. Favor de verificar',
-            '</div>'
-          ].join('\n'),
-           suggestion: Handlebars.compile(
-              '<div class="media">' +
-                '<div class="pull-left">' +
-                    '<div class="media-object">' +
-                        '<img src="{{small_img}}" width="50" height="50"/>' +
-                    '</div>' +
-                '</div>' +
-                '<div class="media-body">' +
-                    '<h4 class="media-heading"><strong>{{sku}}</strong> | {{name}}</h4>' +
-                    '<p>{{barcode}}</p>' +
-                    '<p>{{description}}</p>' +
-                    '<p>{{display_attributes}}</p>' +
-                '</div>' +
-              '</div>')
-        }
-    });
+  bloodhound.initialize();
+  $('#typeahead').typeahead(
+    {
+      minLength: 3
+    },
+    {
+      displayKey: 'name',
+      source: bloodhound.ttAdapter(),
+      limit: Infinity,
+      templates: {
+        empty: [
+          '<div class="empty-message">',
+            'No se encontró ningun producto. Favor de verificar',
+          '</div>'
+        ].join('\n'),
+         suggestion: Handlebars.compile(
+            '<div class="media">' +
+              '<div class="pull-left">' +
+                  '<div class="media-object">' +
+                      '<img src="{{small_img}}" width="50" height="50"/>' +
+                  '</div>' +
+              '</div>' +
+              '<div class="media-body">' +
+                  '<h4 class="media-heading"><strong>{{sku}}</strong> | {{name}}</h4>' +
+                  '<p>{{barcode}}</p>' +
+                  '<p>{{description}}</p>' +
+                  '<p>{{display_attributes}}</p>' +
+              '</div>' +
+            '</div>')
+      }
+  });
 
   $('body').barcodeListener().on('barcode.valid', function(e, code) {
     findProductByBarcode(code);
@@ -238,7 +256,7 @@
   }
 
   function updateQuantity(input) {
-    if(input.val()) {
+    if(input.val() > 0) {
       clearTimeout(timeout);
       timeout = setTimeout(function () {
         var idText = input.closest('tr').attr('id');
@@ -249,21 +267,26 @@
             dataType: "json",
             data: {pre_transfer: {quantity: input.val()}},
             success: function(xhr, status, error) {
+              $("#save_transfer").attr("disabled", false);
             },
             statusCode: {
               422: function() {
+                $("#save_transfer").attr("disabled", true);
                 toastr["error"]("Error, El stock es insuficiente.");
               }
             }
         });
       }, 700);
+    } else {
+      $("#save_transfer").attr("disabled", true);
+      toastr["error"]("La cantidad debe ser mayor a 0");
     }
   }
 
- function findProductByBarcode(barcode) {
+  function findProductByBarcode(barcode) {
     var origin = $('#origin_id').val();
     var destiny = $('#destiny_id').val();
-    if(origin && destiny) {
+    if((origin && destiny) && (origin != destiny)) {
       $.ajax({
         type: "get",
         url:  '/add_pre_transfer_by_barcode/' + barcode + "/" + origin + "/" + destiny,
@@ -272,11 +295,7 @@
         },
       });
     } else {
-      toastr["error"]("Falta seleccionar datos del formulario.");
+      toastr["error"]("Falta seleccionar datos del formulario, o el origen y el destino son los mismos.");
     }
   }
-
 </script>
-
-
-

+ 10 - 30
app/views/transfers/_index_for_admin.html.erb

@@ -11,49 +11,29 @@
           <th>Destino</th>
           <th>Productos</th>
           <th>Status</th>
-          <th>Status recepción</th>
+          <th>Status<br>recepción</th>
           <th>Acciones</th>
         </tr>
       </thead>
       <tbody>
         <% @transfers.each_with_index do |transfer, key| %>
           <tr>
-            <td> <%= key +1 %> </td>
-            <td> <%= l(transfer.transfer_date, :format => '%d/%B/%Y') %> </td>
+            <td> <%= key + 1 %> </td>
+            <td> <%= l(transfer.transfer_date, format: '%d/%B/%Y') %> </td>
             <td>
-             <%= transfer.origin_is_pointsale == 1 ? Pointsale.find(transfer.origin_id).name : Warehouse.find(transfer.origin_id).name %>
+             <%= transfer.origin_is_pointsale? ? Pointsale.find(transfer.origin_id).name : Warehouse.find(transfer.origin_id).name %>
             </td>
             <td>
-              <%= transfer.destiny_is_pointsale == 1 ? Pointsale.find(transfer.destiny_id).name : Warehouse.find(transfer.destiny_id).name %>
+              <%= transfer.destiny_is_pointsale? ? Pointsale.find(transfer.destiny_id).name : Warehouse.find(transfer.destiny_id).name %>
             </td>
-            <td> <%= transfer.products.count %> </td>
+            <td> <%= transfer.transfer_details.count %> </td>
+            <td class="text-center"><%= transfer_status(transfer) %></td>
+            <td class="text-center"><%= transfer_details(transfer) %></td>
             <td class="text-center">
-                <% case transfer.status %>
-                  <% when "cancelled" %>
-                    <span class="label label-danger"> CANCELADO </span>
-                  <% when "pending" %>
-                    <span class="label bg-yellow-crusta"> PENDIENTE DE RECEPCIÓN </span>
-                  <% when "received" %>
-                    <span class="label label-success"> RECIBIDO </span>
-                <% end %>
-            </td>
-            <td class="text-center">
-              <% if transfer.transfer_details.where(:has_looses => 1).count > 0 &&
-                transfer.transfer_details.where(:has_surplus => 1).count == 0 %>
-                <span class="label label-warning"> CON PERDIDAS </span>
-              <% elsif transfer.transfer_details.where(:has_surplus => 1).count > 0 &&
-                transfer.transfer_details.where(:has_looses => 1).count == 0 %>
-                <span class="label label-warning"> CON EXCEDENTE </span>
-              <% elsif transfer.transfer_details.where(:has_surplus => 1).count > 0  &&
-              transfer.transfer_details.where(:has_looses => 1).count > 0 %>
-                <span class="label label-danger"> CON INCONSISTENCIAS </span>
-              <% end %>
-            </td>
-            <td class="text-center">
-              <%= link_to transfer, {:class=>"btn btn-icon-only default filtros", :title=>"Ver traspaso"} do %>
+              <%= link_to transfer, { class: "btn btn-icon-only default filtros", title: "Ver traspaso" } do %>
                 <i class="fa fa-search"></i>
               <% end %>
-              <%= link_to print_transfer_receipt_path(transfer.id, format: 'pdf'), {:class=>"btn btn-icon-only default", :target => "blank"} do %>
+              <%= link_to print_transfer_receipt_path(transfer.id, format: 'pdf'), { class: "btn btn-icon-only default", target: "blank" } do %>
                 <i class="fa fa-print"></i>
               <% end %>
             </td>

+ 28 - 72
app/views/transfers/_index_for_manager.html.erb

@@ -6,7 +6,7 @@
       </li>
       <li>
           <a href="#enviados" data-toggle="tab"> Enviados </a>
-      </li>                    
+      </li>
     </ul>
   </div>
   <div class="col-md-10 col-sm-9 col-xs-9">
@@ -22,7 +22,7 @@
                     <th>Origen</th>
                     <th>Productos</th>
                     <th>Status</th>
-                    <th>Status recepción</th>                       
+                    <th>Status recepción</th>
                     <th>Acciones</th>
                   </tr>
                 </thead>
@@ -32,49 +32,27 @@
                       <td> <%= key +1 %> </td>
                       <td> <%= l(transfer.transfer_date, :format => '%d/%B/%Y') %> </td>
                       <td> <%= transfer.origin_is_pointsale == 1 ? Pointsale.find(transfer.origin_id).name : Warehouse.find(transfer.origin_id).name %>  </td>
-                      <td> <%= transfer.products.count %> </td>
+                      <td> <%= transfer.transfer_details.count %> </td>
+                      <td><%= transfer_status(transfer) %> </td>
+                      <td class="text-center"><%= transfer_details(transfer) %></td>
                       <td>
-                          <% case transfer.status %>
-                            <% when "cancelled" %>
-                              <span class="label label-danger"> CANCELADO </span>
-                            <% when "pending" %>
-                              <span class="label bg-yellow-crusta"> PENDIENTE DE RECEPCIÓN </span>
-                            <% when "received" %>
-                              <span class="label label-success"> RECIBIDO </span>
-                          <% end %>
-                      </td>
-                      <td class="text-center">
-                        <% if transfer.transfer_details.where(:has_looses => 1).count > 0 && 
-                          transfer.transfer_details.where(:has_surplus => 1).count == 0 %>
-                          <span class="label label-warning"> CON PERDIDAS </span>
-                        <% elsif transfer.transfer_details.where(:has_surplus => 1).count > 0 &&
-                          transfer.transfer_details.where(:has_looses => 1).count == 0 %>
-                          <span class="label label-warning"> CON EXCEDENTE </span>
-                        <% elsif transfer.transfer_details.where(:has_surplus => 1).count > 0  && 
-                        transfer.transfer_details.where(:has_looses => 1).count > 0 %>
-                          <span class="label label-danger"> CON INCONSISTENCIAS </span>
-                        <% elsif transfer.received? %>
-                          <i class='fa fa-check fa-2 font-green'></i> 
-                        <% end %>
-                      </td>                       
-                      <td>
-                        <%= link_to transfer, {:class=>"btn btn-icon-only default", :title=>"Ver traspaso"} do %>
+                        <%= link_to transfer, { class: "btn btn-icon-only default", title:"Ver traspaso" } do %>
                           <i class="fa fa-search"></i>
                         <% end %>
-                        <%= link_to print_transfer_receipt_path(transfer.id, format: 'pdf'), {:class=>"btn btn-icon-only default", :target => "blank"} do %>
+                        <%= link_to print_transfer_receipt_path(transfer.id, format: 'pdf'), { class: "btn btn-icon-only default", target: "blank" } do %>
                           <i class="fa fa-print"></i>
-                        <% end %>                         
-                        <% if transfer.status =="pending" %>
-                          <%= link_to verify_transfer_path(transfer), {:class=>"btn btn-icon-only green-meadow", :title=>"Verificar traspaso"} do %>
+                        <% end %>
+                        <% if transfer.pending? %>
+                          <%= link_to verify_transfer_path(transfer), { class: "btn btn-icon-only green-meadow", title:"Verificar traspaso" } do %>
                             <i class="fa fa-check-square-o"></i>
-                          <% end %>                              
+                          <% end %>
                         <% end %>
                       </td>
                     </tr>
-                  <% end %>            
+                  <% end %>
                 </tbody>
-              </table>                            
-            </div>                                  
+              </table>
+            </div>
           </div>
         </div>
         <div class="tab-pane fade" id="enviados">
@@ -88,56 +66,34 @@
                     <th>Destino</th>
                     <th>Productos</th>
                     <th>Status</th>
-                    <th>Status recepción</th>                    
+                    <th>Status<br>recepción</th>
                     <th>Acciones</th>
                   </tr>
                 </thead>
                 <tbody>
                   <% @sent.each_with_index do |transfer, key| %>
                     <tr>
-                      <td> <%= key +1 %> </td>
-                      <td> <%= l(transfer.transfer_date, :format => '%d/%B/%Y') %> </td>
-                      <td> <%= transfer.destiny_is_pointsale == 1 ? Pointsale.find(transfer.destiny_id).name : Warehouse.find(transfer.destiny_id).name %>  </td>
-                      <td> <%= transfer.products.count %> </td>
+                      <td> <%= key + 1 %> </td>
+                      <td> <%= l(transfer.transfer_date, format: '%d/%B/%Y') %> </td>
+                      <td> <%= transfer.destiny_is_pointsale == 1 ? Pointsale.find(transfer.destiny_id).name : Warehouse.find(transfer.destiny_id).name %></td>
+                      <td> <%= transfer.products.count %></td>
+                      <td><%= transfer_status(transfer) %></td>
+                      <td class="text-center"><%= transfer_details(transfer) %></td>
                       <td>
-                          <% case transfer.status %>
-                            <% when "cancelled" %>
-                              <span class="label label-danger"> CANCELADO </span>
-                            <% when "pending" %>
-                              <span class="label bg-yellow-crusta"> PENDIENTE DE RECEPCIÓN </span>
-                            <% when "received" %>
-                              <span class="label label-success"> RECIBIDO </span>
-                          <% end %>
-                      </td>
-                      <td class="text-center">
-                        <% if transfer.transfer_details.where(:has_looses => 1).count > 0 && 
-                          transfer.transfer_details.where(:has_surplus => 1).count == 0 %>
-                          <span class="label label-warning"> CON PERDIDAS </span>
-                        <% elsif transfer.transfer_details.where(:has_surplus => 1).count > 0 &&
-                          transfer.transfer_details.where(:has_looses => 1).count == 0 %>
-                          <span class="label label-warning"> CON EXCEDENTE </span>
-                        <% elsif transfer.transfer_details.where(:has_surplus => 1).count > 0  && 
-                        transfer.transfer_details.where(:has_looses => 1).count > 0 %>
-                          <span class="label label-danger"> CON INCONSISTENCIAS </span>
-                        <% elsif transfer.received? %>
-                          <i class='fa fa-check fa-2 font-green'></i>                           
-                        <% end %>
-                      </td>                      
-                      <td>
-                        <%= link_to transfer, {:class=>"btn btn-icon-only default", :title=>"Ver traspaso"} do %>
+                        <%= link_to transfer, { class: "btn btn-icon-only default", title: "Ver traspaso" } do %>
                           <i class="fa fa-search"></i>
                         <% end %>
-                        <%= link_to print_transfer_receipt_path(transfer.id, format: 'pdf'), {:class=>"btn btn-icon-only default", :target => "blank"} do %>
+                        <%= link_to print_transfer_receipt_path(transfer.id, format: 'pdf'), { class: "btn btn-icon-only default", target: "blank" } do %>
                           <i class="fa fa-print"></i>
-                        <% end %>                         
+                        <% end %>
                       </td>
                     </tr>
-                  <% end %>            
+                  <% end %>
                 </tbody>
-              </table>                            
-            </div>                                  
+              </table>
+            </div>
           </div>
         </div>
      </div>
   </div>
-</div>
+</div>

+ 44 - 60
app/views/transfers/show.html.erb

@@ -18,7 +18,7 @@
 		<div class="page-content">
 			<div class="container-fluid">
 				<div class="pull-right margin-bottom-10 ">
-					<%= link_to  transfers_path(:filter => @filter, :current_page => @current_page), {:class=>"fr-space btn blue-hoki "} do %>
+					<%= link_to transfers_path(:filter => @filter, :current_page => @current_page), {:class=>"fr-space btn blue-hoki "} do %>
 						<i class="fa fa-angle-left "></i>
 						Regresar
 					<% end %>
@@ -38,54 +38,47 @@
 								</div>
 								<div class="portlet-body">
 									<div class="row static-info">
-										<div class="col-md-6 name"> <i class="fa fa-flag"></i>
+										<div class="col-md-5 name"> <i class="fa fa-flag"></i>
 										&nbsp Origen:</div>
-										<div class="col-md-6 value"> <%= @transfer.origin_is_pointsale == 1 ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name %> </div>
+										<div class="col-md-7 value"> <%= @transfer.origin_is_pointsale? ? Pointsale.find(@transfer.origin_id).name : Warehouse.find(@transfer.origin_id).name %> </div>
 									</div>
 									<div class="row static-info">
-										<div class="col-md-6 name"> <i class="fa fa-plane"></i>
+										<div class="col-md-5 name"> <i class="fa fa-plane"></i>
 										&nbsp Destino:</div>
-										<div class="col-md-6 value"> <%= @transfer.destiny_is_pointsale == 1 ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name %> </div>
+										<div class="col-md-7 value"> <%= @transfer.destiny_is_pointsale? ? Pointsale.find(@transfer.destiny_id).name : Warehouse.find(@transfer.destiny_id).name %> </div>
 									</div>
 									<div class="row static-info">
-										<div class="col-md-6 name"> <i class="fa fa-calendar"></i>
+										<div class="col-md-5 name"> <i class="fa fa-calendar"></i>
 										&nbsp Fecha envío: </div>
-										<div class="col-md-6 value"> <%= l(@transfer.transfer_date, :format => '%d/%B/%Y') %> </div>
+										<div class="col-md-7 value"> <%= l(@transfer.transfer_date, :format => '%d/%B/%Y') %> </div>
 									</div>
 									<div class="row static-info">
-										<div class="col-md-6 name"> <i class="fa fa-odnoklassniki"></i>
+										<div class="col-md-5 name"> <i class="fa fa-odnoklassniki"></i>
 										&nbsp Capturó: </div>
-										<div class="col-md-6 value"> <%= @transfer.user.first_name %> </div>
+										<div class="col-md-7 value"> <%= @transfer.user.first_name %> </div>
 									</div>
 									<div class="row static-info">
-										<div class="col-md-6 name"> <i class="fa fa-calendar"></i>
+										<div class="col-md-5 name"> <i class="fa fa-calendar"></i>
 										&nbsp Status: </div>
-										<div class="col-md-6 value">
-							                <% case @transfer.status %>
-							                  <% when "cancelled" %>
-							                    <span class="label label-danger"> CANCELADO </span>
-							                  <% when "pending" %>
-							                    <span class="label bg-yellow-crusta"> PENDIENTE</span>
-							                  <% when "received" %>
-							                    <span class="label label-success"> RECIBIDO </span>
-							                <% end %>
+										<div class="col-md-7 value">
+			                <%= transfer_status(@transfer) %>
 										</div>
 									</div>
-									<% if @transfer.received?%>
+									<% if @transfer.received? %>
 										<div class="row static-info">
-											<div class="col-md-6 name"> <i class="fa fa-calendar"></i>
+											<div class="col-md-5 name"> <i class="fa fa-calendar"></i>
 											&nbsp Fecha recepcion:</div>
-											<div class="col-md-6 value"> <%= l(@transfer.reception_date, :format => '%d/%B/%Y') %>  </div>
+											<div class="col-md-7 value"> <%= l(@transfer.reception_date, :format => '%d/%B/%Y') %>  </div>
 										</div>
 										<div class="row static-info">
-											<div class="col-md-6 name"> <i class="fa fa-smile-o"></i>
+											<div class="col-md-5 name"> <i class="fa fa-smile-o"></i>
 											&nbsp Recibió:</div>
-											<div class="col-md-6 value"> <%= @transfer.received_by.first_name %> </div>
+											<div class="col-md-7 value"> <%= @transfer.received_by.first_name %> </div>
 										</div>
 										<div class="row static-info">
-											<div class="col-md-6 name"> <i class="fa fa-comments"></i>
+											<div class="col-md-5 name"> <i class="fa fa-comments"></i>
 											&nbsp Observaciones:</div>
-											<div class="col-md-10 value"> <%= @transfer.observations %> </div>
+											<div class="col-md-70 value"> <%= @transfer.observations %> </div>
 										</div>
 									<% end %>
 								</div>
@@ -98,42 +91,33 @@
 								</div>
 								<div class="portlet-body">
 									<div class="table-scrollable">
-								        <table class="table table-hover table-bordered">
-								            <thead>
-								                <tr class="uppercase">
-								                    <th> # </th>
-								                    <th> Producto </th>
-								                    <th> Cantidad enviada </th>
-								                    <th> Cantidad recibida </th>
-								                    <th> Status de recepción</th>
-								                </tr>
-								            </thead>
-								            <tbody>
-								              <% @transfer.transfer_details.each_with_index do |detail, key| %>
-								                <tr>
-								                  	<td> <%= key +1 %> </td>
-								                  	<td>
-								                  		<%= detail.product.name %><br>
+						        <table class="table table-hover table-bordered">
+					            <thead>
+				                <tr class="uppercase">
+			                    <th> # </th>
+			                    <th> Producto </th>
+			                    <th> Cantidad enviada </th>
+			                    <th> Cantidad recibida </th>
+			                    <th> Status de recepción</th>
+				                </tr>
+					            </thead>
+					            <tbody>
+					              <% @transfer.transfer_details.each_with_index do |detail, key| %>
+					                <tr>
+				                  	<td> <%= key + 1 %> </td>
+				                  	<td>
+				                  		<%= detail.product.name %><br>
     													<%= detail.product.display_attributes %>
-
-								                  	</td>
-								                  	<td> <%= detail.quantity %> </td>
-								                  	<td> <%= detail.adjustment if @transfer.received?%> </td>
-								            		<td class="text-center">
-										              <% if detail.has_looses? %>
-										                <span class="label label-warning"> CON PERDIDA </span>
-										              <% elsif detail.has_surplus? %>
-										                <span class="label label-warning"> CON EXCEDENTE </span>
-										              <% elsif @transfer.received? %>
-				              							<i class='fa fa-check fa-2 font-green'></i>
-										              <% end %>
-										            </td>
-								                </tr>
-								              <% end %>
-								            </tbody>
-				                    	</table>
+				                  	</td>
+				                  	<td> <%= detail.quantity %> </td>
+				                  	<td> <%= detail.adjustment if @transfer.received? %> </td>
+						            		<td class="text-center"><%= transfer_details_status(detail) if @transfer.received? %></td>
+					                </tr>
+					              <% end %>
+					            </tbody>
+                  	</table>
 									</div>
-		                    	</div>
+              	</div>
 							</div>
 						</div>
 					</div>