Pārlūkot izejas kodu

Purchases and Expenses report by date

Jacqueline Maldonado 7 gadi atpakaļ
vecāks
revīzija
f790cc26e3

+ 87 - 89
app/assets/javascripts/config.js

@@ -1104,104 +1104,102 @@ var TableAdvancedPrintableAjax = function () {
 	};
 }();
 
-var TableAdvancedAjax = function () {
-	//create JSON array for aoColumnDefs
+	var TableAdvancedAjax = function () {
+		//create JSON array for aoColumnDefs
 		var initTableAjax = function () {
-				var table = $('.tableadvancedAjax');
-				var filter = $('#filter').val();
-		    var buscar_ = { };
-		    var page_ = 0;
-
-			 	$.fn.dataTableExt.oStdClasses.sFilterInput = "form-control input-medium input-inline";
-			 	if(filter != ""){ buscar_ = { search: filter }; }
-				if( $('#current_page').length > 0 ){	page_ = ($('#current_page').val() - 1) * 20;}
+			var table = $('.tableadvancedAjax');
+			var filter = $('#filter').val();
+	    var buscar_ = { };
+	    var page_ = 0;
+
+		 	$.fn.dataTableExt.oStdClasses.sFilterInput = "form-control input-medium input-inline";
+		 	if(filter != "")
+		 		{
+		 			buscar_ = { search: filter };
+		 		}
+			if($('#current_page').length > 0)
+				{
+					page_ = ($('#current_page').val() - 1) * 20;
+				}
 
-				var oTable = table.dataTable({
-			    "processing": true,
-			    "serverSide": true,
-					"ajax": {
-					    "url": $('.tableadvancedAjax').data('source'),
-					    "data": function ( d ) {
-					        d.busqueda = $('input[type="search"]').val();
-					        $('#filter').val(d.busqueda);
-				    	}
-				    },
-					"language": {
-							"aria": {
-									"sortAscending": ": activate to sort column ascending",
-									"sortDescending": ": activate to sort column descending"
-							},
-							"emptyTable": "No hay informacion en la tabla",
-							"sProcessing": "Cargando...",
-							"info": "Mostrando del _START_ al _END_ de _TOTAL_ registros",
-							"infoEmpty": "No se encontraron coincidencias",
-							"infoFiltered": "(filtrado un total de _MAX_ registros)",
-							"lengthMenu": "Mostrar _MENU_ registros",
-							"search": "Buscar:",
-							"zeroRecords": "No se encontraron coincidencias",
-							"paginate": {
-	                            "sPrevious": "Ant",
-	                            "sNext": "Sig"
-	                        }
+			var oTable = table.dataTable({
+		    "processing": true,
+		    "serverSide": true,
+				"ajax": {
+			    "url": $('.tableadvancedAjax').data('source'),
+			    "data": function ( d ) {
+		        d.busqueda = $('input[type="search"]').val();
+		        $('#filter').val(d.busqueda);
+		    	}
+		    },
+				"language": {
+					"aria": {
+						"sortAscending": ": activate to sort column ascending",
+						"sortDescending": ": activate to sort column descending"
 					},
-					"order": [
-							// [0, 'asc']
-					],
-					"lengthMenu": [
-							[20, 50, 75, 100,	-1],
-							[20, 50, 75, 100,	"Todos"] // change per page values here
-					],
-					"dom": "<'row'<'col-md-6 col-sm-12'l><'col-md-6 col-sm-12'f>r><'table-scrollable't><'row'<'col-md-5 col-sm-12'i><'col-md-7 col-sm-12'p>>", // horizobtal scrollable datatable
-					"search": buscar_,
-					// set the initial value
-					"pageLength": 20,
-					"iDisplayStart": page_,
-			    "fnDrawCallback": function( oSettings ) {
-						$('a.filtros').on( 'click', function (e) {
-							e.preventDefault();
-							var url_ = $(this).attr('href');
-							url_ += '?filter=' + $('#filter').val();
-							url_ += '&current_page=' + $('#current_page').val();
-							console.log(url_);
-							window.location.href = url_;
-
-				    });
-				    $('a.filtros2').on( 'click', function (e) {
-							e.preventDefault();
-							var url_ = $(this).attr('href');
-							url_ += '&filter=' + $('#filter').val();
-							url_ += '&current_page=' + $('#current_page').val();
-							console.log(url_);
-							window.location.href = url_;
-
-				    });
-					}
-				});
-
-				var tableWrapper = $('.tableadvancedAjax_wrapper');
+					"emptyTable": "No hay informacion en la tabla",
+					"sProcessing": "Cargando...",
+					"info": "Mostrando del _START_ al _END_ de _TOTAL_ registros",
+					"infoEmpty": "No se encontraron coincidencias",
+					"infoFiltered": "(filtrado un total de _MAX_ registros)",
+					"lengthMenu": "Mostrar _MENU_ registros",
+					"search": "Buscar:",
+					"zeroRecords": "No se encontraron coincidencias",
+					"paginate": {
+	          "sPrevious": "Ant",
+	          "sNext": "Sig"
+	        }
+				},
+				"order": [
+					// [0, 'asc']
+				],
+				"lengthMenu": [
+					[20, 50, 75, 100,	-1],
+					[20, 50, 75, 100,	"Todos"] // change per page values here
+				],
+				"dom": "<'row'<'col-md-6 col-sm-12'l><'col-md-6 col-sm-12'f>r><'table-scrollable't><'row'<'col-md-5 col-sm-12'i><'col-md-7 col-sm-12'p>>", // horizobtal scrollable datatable
+				"search": buscar_,
+				// set the initial value
+				"pageLength": 20,
+				"iDisplayStart": page_,
+		    "fnDrawCallback": function( oSettings ) {
+					$('a.filtros').on( 'click', function (e) {
+						e.preventDefault();
+						var url_ = $(this).attr('href');
+						url_ += '?filter=' + $('#filter').val();
+						url_ += '&current_page=' + $('#current_page').val();
+						window.location.href = url_;
+			    });
+			    $('a.filtros2').on( 'click', function (e) {
+						e.preventDefault();
+						var url_ = $(this).attr('href');
+						url_ += '&filter=' + $('#filter').val();
+						url_ += '&current_page=' + $('#current_page').val();
+						window.location.href = url_;
+			    });
+				}
+			});
 
-				tableWrapper.find('.dataTables_length select').select2();
+			var tableWrapper = $('.tableadvancedAjax_wrapper');
+			tableWrapper.find('.dataTables_length select').select2();
 
-				if( $('#current_page').length > 0 ){
-					$('.tableadvancedAjax').on( 'page.dt', function () {
-	            var oSettings = oTable.fnSettings();
-	            var page = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
-	            $('#current_page').val(page);
-	        });
-				}
+			if( $('#current_page').length > 0 ){
+				$('.tableadvancedAjax').on( 'page.dt', function () {
+	        var oSettings = oTable.fnSettings();
+	        var page = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
+	        $('#current_page').val(page);
+	      });
+			}
 		}
-
 		return {
-				init: function () {
-						if (!$().dataTable) {
-								return;
-						}
-						initTableAjax();
+			init: function () {
+				if (!$().dataTable) {
+					return;
 				}
-
+				initTableAjax();
+			}
 		};
-
-}();
+	}();
 
 var FormWizard = function () {
   return {

+ 26 - 1
app/controllers/reports_controller.rb

@@ -1,7 +1,7 @@
 class ReportsController < ApplicationController
   ##--- Breadcrum_rails
-  add_breadcrumb I18n.t("breadcrumbs." + controller_name), :reports_path
   add_breadcrumb "Reporte de mínimos y máximos", :min_max_path, only: :min_max
+  add_breadcrumb "Reporte de compras y egresos por mes", :purchases_per_month_path, only: :purchases_per_month
 
   def min_max
     @pointsales = Pointsale.activos
@@ -27,4 +27,29 @@ class ReportsController < ApplicationController
       end
     products.where(categories: { id: ids })
   end
+
+  def purchases_per_month
+    if params[:start_date].present? && params[:end_date].present?
+      @start_date = DateTime.parse(params[:start_date]).in_time_zone(Time.zone).beginning_of_day + 1.days
+      @end_date = DateTime.parse(params[:end_date]).in_time_zone(Time.zone).end_of_day + 1.days
+      @purchases = Purchase.includes(:purchase_details).where(created_at: @start_date..@end_date).order("id DESC")
+      @expenses = Expense.activos.where(created_at: @start_date..@end_date).order("id DESC")
+      unless params[:location] == "Todos"
+        location = params[:location].slice(2..-1)
+        @purchases =
+          if params[:location][0] == "P"
+            @purchases.where(pointsale_id: location)
+          elsif params[:location][0] == "W"
+            @purchases.where(warehouse_id: location)
+          end
+      end
+      @total_prods = 0
+      @purchases.each do |purchase|
+        @total_prods += purchase.purchase_details.sum(:quantity)
+      end
+      respond_to do |format|
+        format.js
+      end
+    end
+  end
 end

+ 10 - 0
app/helpers/expenses_helper.rb

@@ -1,2 +1,12 @@
 module ExpensesHelper
+  def expense_status(expense)
+    case expense.status
+    when "active" then
+      content_tag(:span, "Caja abierta", class: "label label-sm label-warning")
+    when "registered" then
+      content_tag(:span, "Caja cerrada", class: "label label-sm label-success")
+    when "cancelled" then
+      content_tag(:span, "Cancelado", class: "label label-sm label-danger")
+    end
+  end
 end

+ 2 - 3
app/models/expense.rb

@@ -6,10 +6,9 @@ class Expense < ActiveRecord::Base
   ##--- Llevar registro de Actividad del usuario
   audited
 
-  enum status: [:canceled, :active, :registered]
+  enum status: [:cancelled, :active, :registered]
 
-  attr_accessor :skip_open_cash_validation
-  attr_accessor :skip_open_cash_has_money
+  attr_accessor :skip_open_cash_validation, :skip_open_cash_has_money
 
   validates_presence_of :quantity, message: "Se debe indicar la cantidad."
   validates_numericality_of :quantity, greater_than: 0.00, message: "La cantidad debe ser mayor a $0"

+ 26 - 26
app/models/purchase.rb

@@ -1,34 +1,34 @@
 class Purchase < ActiveRecord::Base
 
-    ## Associaciones
-    belongs_to :supplier
-    belongs_to :pointsale
-    belongs_to :warehouse
-    belongs_to :user
-    has_many :cash_registers_moves
-    has_many :purchase_details
-    has_many :inventories_moves
-    has_many :products, :through => :purchase_details
+  ## Associaciones
+  belongs_to :supplier
+  belongs_to :pointsale
+  belongs_to :warehouse
+  belongs_to :user
+  has_many :cash_registers_moves
+  has_many :purchase_details
+  has_many :inventories_moves
+  has_many :products, :through => :purchase_details
 
-    ##--- Llevar registro de Actividad del usuario
-    audited
+  ##--- Llevar registro de Actividad del usuario
+  audited
 
-    enum status: [:notpaid, :cancelled, :paid, :parcial ]
-    accepts_nested_attributes_for :purchase_details
+  enum status: [:notpaid, :cancelled, :paid, :parcial]
+  accepts_nested_attributes_for :purchase_details
 
-	##--- Validaciones previas de guardar
-    validates :supplier_id , presence: { message: "Debe seleccionar el proveedor." }
-    validates :pointsale_id , presence: { message: "Debe seleccionar un almacén o un punto de venta." }, :if => Proc.new {|c| c.warehouse_id.blank?}
-    validates :warehouse_id , presence: { message: "Debe seleccionar un almacén o un punto de venta." }, :if => Proc.new {|c| c.pointsale_id.blank?}
-    validates :exchange , presence: { message: "Debe capturar el tipo de cambio." }, :if => Proc.new {|c| c.is_in_dollars? }
+  ##--- Validaciones previas de guardar
+  validates :supplier_id, presence: { message: "Debe seleccionar el proveedor." }
+  validates :pointsale_id, presence: { message: "Debe seleccionar un almacén o un punto de venta." }, if: Proc.new { |c| c.warehouse_id.blank? }
+  validates :warehouse_id, presence: { message: "Debe seleccionar un almacén o un punto de venta." }, if: Proc.new { |c| c.pointsale_id.blank? }
+  validates :exchange, presence: { message: "Debe capturar el tipo de cambio." }, if: Proc.new { |c| c.is_in_dollars? }
 
-	##--- Tipo de vistas / consultas
-	scope :notpaid, -> { where( "status = 0") }
-    scope :paid, -> { where( "status = 2") }
-    scope :cancelled, -> { where( "status = 1") }
-    scope :active, -> { where( "status != 1") }
+  ##--- Tipo de vistas / consultas
+  scope :notpaid, -> { where(status: 0) }
+  scope :paid, -> { where(status: 2) }
+  scope :cancelled, -> { where(status: 1) }
+  scope :active, -> { where.not(status: 1) }
 
-    def code_with_price
-        "Codigo: #{purchase_code} -  $ #{total}"
-    end
+  def code_with_price
+    "Codigo: #{purchase_code} - $ #{total}"
+  end
 end

+ 3 - 12
app/views/expenses/_expenses_for_admin.html.erb

@@ -40,16 +40,7 @@
                     <td><%= l(expense.created_at, format: '%d/%B/%Y') %> </td>
                     <td><%= number_to_currency(expense.quantity, precision: 2) %> </td>
                     <td><%= expense.observations %> </td>
-                    <td>
-                      <% case expense.status %>
-                      <% when "active"%>
-                        <span class="label label-sm label-warning"> <i class="fa fa-clock-o"></i> Caja abierta </span>
-                      <% when "canceled"%>
-                         <span class="label label-sm label-danger"> <i class="fa fa-close"></i> Cancelada </span>
-                      <% when "registered"%>
-                         <span class="label label-sm label-success"><i class="fa fa-check"></i>  Caja cerrada </span>
-                      <% end %>
-                    </td>
+                    <td><%= expense_status(expense) %></td>
                     <td class="text-center">
                       <% if expense.active? %>
                         <%= link_to expense, method: :delete, class: "btn btn-icon-only btn-danger", title: "Cancelar egreso", data: { confirm: '¿Está seguro que desea cancelar el egreso?' } do %> <i class="fa fa-ban"></i><% end %>
@@ -89,9 +80,9 @@
                     <td><%= expense.observations %> </td>
                     <td>
                       <% case expense.status %>
-                      <% when "active"%>
+                      <% when "active" %>
                         <span class="label label-sm label-success"> <i class="fa fa-check"></i> Activo </span>
-                      <% when "canceled"%>
+                      <% when "cancelled" %>
                          <span class="label label-sm label-danger"> <i class="fa fa-close"></i> Cancelado </span>
                       <% end %>
                     </td>

+ 1 - 10
app/views/expenses/_expenses_for_manager.html.erb

@@ -22,16 +22,7 @@
       <td><%= l(expense.created_at, format: '%d/%B/%Y') %> </td>
       <td><%= number_to_currency(expense.quantity, precision: 2) %> </td>
       <td><%= expense.observations %> </td>
-      <td>
-        <% case expense.status %>
-        <% when "active"%>
-          <span class="label label-sm label-warning"> <i class="fa fa-clock-o"></i> Caja abierta </span>
-        <% when "canceled"%>
-           <span class="label label-sm label-danger"> <i class="fa fa-close"></i> Cancelado </span>
-        <% when "registered"%>
-           <span class="label label-sm label-success"><i class="fa fa-check"></i>  Caja cerrada </span>
-        <% end %>
-      </td>
+      <td><%= expense_status(expense) %> </td>
       <td class="text-center">
         <% if expense.active? %>
           <%= link_to expense, method: :delete, class: "btn btn-icon-only btn-danger", title: "Cancelar egreso", data: { confirm: '¿Está seguro que desea cancelar el egreso?' } do %>

+ 8 - 0
app/views/reports/_report_expense.html.erb

@@ -0,0 +1,8 @@
+<tr class="<%= expense.cancelled? ? 'danger' : '' %>">
+  <td><%= expense.expense_date %></td>
+  <td><%= expense.expense_code %></td>
+  <td><%= expense.open_cash_register_id.present? ? expense.open_cash_register.pointsale.name : "" %></td>
+  <td><%= expense.observations %></td>
+  <td><%= expense_status(expense) %></td>
+  <td><%= number_to_currency(expense.quantity.round(2), precision: 2) %></td>
+</tr>

+ 13 - 0
app/views/reports/_report_purchase.html.erb

@@ -0,0 +1,13 @@
+<tr class="<%= purchase.cancelled? ? 'danger' : '' %>">
+  <td><%= purchase.purchase_date %></td>
+  <td><%= purchase.purchase_code %></td>
+  <td><%= purchase.pointsale_id.present? ? purchase.pointsale.name : "" %></td>
+  <td><%= purchase.warehouse_id.present? ? purchase.warehouse.name : "" %></td>
+  <td><%= purchase.supplier.nick_name %></td>
+  <td class="hidden"></td>
+  <td><%= purchase.purchase_details.sum(:quantity).to_i %></td>
+  <td><%= purchase_status(purchase) %></td>
+  <td><%= number_to_currency(purchase.amount.round(2), precision: 2) %></td>
+  <td><%= number_to_currency(purchase.tax.round(2), precision: 2) %></td>
+  <td><%= number_to_currency(purchase.total.round(2), precision: 2) %></td>
+</tr>

+ 206 - 0
app/views/reports/purchases_per_month.html.erb

@@ -0,0 +1,206 @@
+<!-- BEGIN CONTAINER -->
+<div class="page-container">
+  <!-- BEGIN CONTENT -->
+  <div class="page-content-wrapper">
+    <!-- BEGIN CONTENT BODY -->
+    <!-- BEGIN PAGE HEAD-->
+    <div class="page-head">
+      <div class="container-fluid">
+        <!-- BEGIN PAGE TITLE -->
+        <div class="page-title">
+          <h1>Reporte de compras y egresos por mes </h1>
+        </div>
+        <!-- END PAGE TITLE -->
+      </div>
+    </div>
+    <!-- END PAGE HEAD-->
+    <!-- BEGIN PAGE CONTENT BODY -->
+    <div class="page-content">
+      <div class="container-fluid">
+        <!-- BEGIN PAGE BREADCRUMBS -->
+        <ul class="page-breadcrumb breadcrumb">
+          <%= render_breadcrumbs :tag => :li, :separator => ' <i class="fa fa-circle"></i> ' %>
+        </ul>
+        <!-- END PAGE BREADCRUMBS -->
+        <%= form_tag(purchases_per_month_path, method: :get, remote: true) do |f| %>
+          <div class="search-page search-content-3">
+            <div class="row">
+              <div class="col-md-12">
+                <div class="search-filter bordered">
+                <!-- <h4 class=" uppercase form-section"> Búsqueda de producto </h4> <hr> -->
+                  <div class="form-group">
+                    <div class="row">
+                      <div class="col-md-3 col-sm-4">
+                        <div class="search-label uppercase">Localización</div>
+                        <div class="col-md-12">
+                          <%= select_tag "location", 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)] }],
+                            ["", ["Todos"]]], selected: "Todos"), class: "pointsale_id form-control select2" %>
+                        </div>
+                      </div>
+                      <div class="col-md-3 col-sm-4">
+                        <div class="search-label uppercase"> Del </div>
+                        <div class="col-md-6">
+                          <div class="input-group input-medium date date-picker" data-date-format="dd/mm/yyyy">
+                            <!-- <input id="start" type='text' class="form-control" value="< %= l(Date.today.beginning_of_month, format: '%d/%m/%Y') %>" /> -->
+                            <%= text_field_tag "start_date", l(Date.today.beginning_of_month, format: '%d/%m/%Y'), class: "form-control" %>
+                            <span class="input-group-addon">
+                              <span class="glyphicon glyphicon-calendar"></span>
+                            </span>
+                          </div>
+                        </div>
+                      </div>
+                      <div class="col-md-3 col-sm-4">
+                        <div class="search-label uppercase"> Al </div>
+                        <div class="col-md-6">
+                          <div class="input-group input-medium date date-picker" data-date-format="dd/mm/yyyy">
+                            <!-- <input id="end" type='text' class="form-control" value="<%= l(Date.today.end_of_month, format: '%d/%m/%Y') %>" /> -->
+                            <%= text_field_tag "end_date", l(Date.today.end_of_month, format: '%d/%m/%Y'), class: "form-control" %>
+                            <span class="input-group-addon">
+                              <span class="glyphicon glyphicon-calendar"></span>
+                            </span>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="form-group">
+                    <div class="row">
+                      <div class="col-md-3 col-sm-4" style="margin-top: 20px">
+                        <%= submit_tag 'Filtrar', { class: "btn green bold btn-block", style: 'margin:0px' } %>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        <% end %>
+        <!-- BEGIN PAGE CONTENT INNER -->
+        <div class="page-content-inner">
+          <div class="portlet light">
+            <div class="portlet-title">
+              <div class="caption">
+                <span class="caption-subject font-blue-dark bold uppercase">Compras y egresos</span>
+              </div>
+            </div>
+            <div class="portlet-body form" id="sales_content">
+              <div class="product_track_search">
+                <div class="row">
+                  <div class="col-md-12">
+                    <div class="note note-success hidden" id="note_info">
+                      <h4 class="block">Detalle de compras y egresos del periodo: <strong><span id="start_date_display"></span></strong> al <strong><span id="end_date_display"></span></strong></h4>
+                    </div>
+                    <div class="col-xs-offset-1 col-xs-5">
+                      <div class="text-center well" style="margin-bottom: 0px">
+                        <div class="font-grey-mint font-sm">NÚMERO DE COMPRAS</div>
+                        <div class="uppercase font-hg font-blue-sharp" id="purchases_quantity">0</div>
+                      </div>
+                    </div>
+                    <div class="col-xs-offset-1 col-xs-5">
+                      <div class="text-center well" style="margin-bottom: 0px">
+                        <div class="font-grey-mint font-sm">PRODUCTOS COMPRADOS</div>
+                        <div class="uppercase font-hg font-blue-sharp" id="prods_total">0</div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+                <div class="" style="margin-top:20px">
+                  <div class="col-md-3 col-sm-3 col-xs-6">
+                    <div class="text-center well" style="margin-bottom: 0px">
+                      <div class="font-grey-mint font-sm">Total comprado contado </div>
+                      <div class="uppercase font-hg font-blue-sharp" id="cash_purchases_total"> $0.00</div>
+                    </div>
+                  </div>
+                  <div class="col-md-3 col-sm-3 col-xs-6">
+                    <div class="text-center well hidden" style="margin-bottom: 0px">
+                      <div class="font-grey-mint font-sm">Total comprado crédito </div>
+                      <div class="uppercase font-hg font-blue-sharp" id="credit_purchases_total"> $0.00</div>
+                    </div>
+                  </div>
+                </div>
+                <div class="row" style="margin-top:20px">
+                  <div class="col-xs-3">
+                    <div class="text-center well" style="margin-bottom: 0px">
+                      <div class="font-grey-mint font-sm">TOTAL DE EGRESOS</div>
+                      <div class="uppercase font-hg font-green" id="expenses_total">$0.00</div>
+                    </div>
+                  </div>
+                  <div class="col-xs-3">
+                    <div class="text-center well" style="margin-bottom: 0px">
+                      <div class="font-grey-mint font-sm">TOTAL COMPRADO</div>
+                      <div class="uppercase font-hg font-green" id="purchases_total">$0.00</div>
+                    </div>
+                  </div>
+                </div>
+                <br>
+                <div class="row">
+                  <ul class="nav nav-tabs">
+                    <li class="active">
+                      <a href="#purchases" data-toggle="tab">Compras</a>
+                    </li>
+                    <li>
+                      <a href="#expenses" data-toggle="tab">Egresos</a>
+                    </li>
+                  </ul>
+                </div>
+                <div class="tab-content">
+                  <div class="tab-pane active" id="purchases">
+                    <div class="row">
+                      <div class="col-md-12">
+                        <table class="table table-striped table-bordered table-hover tableadvanced" id="purchases_per_month_table">
+                          <thead>
+                            <tr>
+                              <th>Fecha</th>
+                              <th>Folio</th>
+                              <th>Punto de venta</th>
+                              <th>Almacén</th>
+                              <th>Proveedor</th>
+                              <th class="hidden">Tipo</th>
+                              <th>Productos</th>
+                              <th>Status</th>
+                              <th>Subtotal</th>
+                              <th>IVA</th>
+                              <th>Total</th>
+                            </tr>
+                          </thead>
+                          <tbody>
+                          </tbody>
+                        </table>
+                      </div>
+                    </div>
+                  </div>
+                  <div class="tab-pane" id="expenses">
+                    <div class="row">
+                      <div class="col-md-12">
+                        <table class="table table-striped table-bordered table-hover tableadvanced" id="expenses_per_month_table">
+                          <thead>
+                            <tr>
+                              <th>Fecha</th>
+                              <th>Folio</th>
+                              <th>Punto de venta</th>
+                              <th>Observaciones</th>
+                              <th>Status</th>
+                              <th>Total</th>
+                            </tr>
+                          </thead>
+                          <tbody>
+                          </tbody>
+                        </table>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <!-- END PAGE CONTENT INNER -->
+      </div>
+    </div>
+    <!-- END PAGE CONTENT BODY -->
+    <!-- END CONTENT BODY -->
+  </div>
+  <!-- END CONTENT -->
+</div>

+ 26 - 0
app/views/reports/purchases_per_month.js.erb

@@ -0,0 +1,26 @@
+var purchases_table = $('#purchases_per_month_table').DataTable();
+var expenses_table = $('#expenses_per_month_table').DataTable();
+$('#purchases_per_month_table').dataTable().fnClearTable();
+$('#expenses_per_month_table').dataTable().fnClearTable();
+
+<% @purchases.each_with_index do |purchase, key| %>
+  var row = $('<%= j render partial: "report_purchase", locals: { purchase: purchase } %>');
+  purchases_table.row.add(row).draw();
+<% end %>
+
+<% @expenses.each_with_index do |expense, key| %>
+  var row = $('<%= j render partial: "report_expense", locals: { expense: expense } %>');
+  expenses_table.row.add(row).draw();
+<% end %>
+
+$('#start_date_display').html("<%= l @start_date.to_date, format: :long %>");
+$('#end_date_display').html("<%= l @end_date.to_date, format: :long %>");
+$('#note_info').removeClass('hidden');
+
+$('#prods_total').html('<%= @total_prods %>');
+$('#purchases_quantity').html('<%= @purchases.count %>');
+
+$('#cash_purchases_total').html(accounting.formatMoney('<%= @purchases.sum(:total).round(2) %>'));
+// $('#credit_purchases_total').html(accounting.formatMoney('< %= @purchases.sum(:total).round(2) %>'));
+$('#expenses_total').html(accounting.formatMoney('<%= @expenses.sum(:quantity).round(2) %>'));
+$('#purchases_total').html(accounting.formatMoney('<%= @purchases.sum(:total).round(2) %>'));

+ 3 - 0
config/navigation.rb

@@ -135,7 +135,10 @@ SimpleNavigation::Configuration.run do |navigation|
       primary.item :reports, { icon: "fa fa-bar-chart", text: "Reportes" }, '#', class: 'menu-dropdown classic-menu-dropdown' do |sub_nav|
         sub_nav.dom_attributes = { class: 'dropdown-menu pull-left' }
         sub_nav.item :sales_per_month, 'Ventas por mes', sales_per_month_report_path
+        sub_nav.item :divider_after_month_sales, '#', divider: true
         sub_nav.item :minmax_report, 'Mínimos y Máximos', min_max_path
+        sub_nav.item :divider_after_minmax_report, '#', divider: true
+        sub_nav.item :purchases_per_month, 'Compras por mes', purchases_per_month_path
       end
     end
     # soporte

+ 1 - 0
config/routes.rb

@@ -252,6 +252,7 @@ Rails.application.routes.draw do
 
   ## reports
   get "min_max" => "reports#min_max"
+  get 'purchases_per_month' => 'reports#purchases_per_month'
 
   ## soporte
   get "contact_support" => "supports#contact_support"