function report_stock (reporting){
"use strict";
var instance = openerp;
reporting.ReportStockWidget = reporting.Base.extend({
template: 'ReportStock',
stockLocation: [],
stockQuant: [],
productProduct : [],
rowsData: [],
content: [],
newStock: [],
events : {
'change #current-location' : 'factSearch',
'change #current-category' : 'factSearch',
'click #toolbar > button' : 'clickOnAction',
'click-row.bs.table #table ' : 'clickAnalysisDetail',
},
init : function(parent){
this._super(parent);
},
start : function(){
var self = this;
var dato=[];
var table = this.$el.find('#table');
table.bootstrapTable({data : self.rowsData});
self.submitForm();
},
valorNull:function(dato){
var valor ="";
if (dato){
valor=dato;
}
return valor;
},
clickAnalysisDetail: function(e, row, $element,field){
if (field == 'product'){
this.do_action({
name:"Variantes de Producto",
type: 'ir.actions.act_window',
res_model: "product.product",
views: [[false,'form']],
target: 'new',
domain: [['id', '=',row.id ]],
context: {},
flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
res_id: row.id,
});
}
e.stopImmediatePropagation();
},
submitForm: function(){
var self = this;
self.fecthStockLocation().then(function(StockLocation){
self.StockLocation=StockLocation;
return StockLocation;
}).then(function(StockLocation){
return self.fecthStockQuant();
}).then(function(StockQuant){
self.StockQuant = StockQuant;
return self.fecthProductProduct();
}).then(function(ProductProduct){
self.ProductProduct = ProductProduct;
return self.fecthProductCategory();
}).then(function(ProductCategory){
self.ProductCategory = ProductCategory;
self.$el.find('#current-category').append('');
_.each(ProductCategory, function (item) {
self.$el.find('#current-category').append('');
});
self.search();
return self.BuildTable(self.stockQuant, self.stockLocation);
});
},
fecthStockLocation : function(){
var self = this;
var defer = $.Deferred();
var location = new instance.web.Model('stock.location');
var fields = ['id', 'name', 'company_id', 'location_id'];
var domain =[['active', '=', true],['usage', '=', 'internal']];
location.query(fields).filter(domain).order_by('id').all().then(function(results){
defer.resolve(results);
})
return defer;
},
fecthStockQuant : function(){
var self = this;
var defer = $.Deferred();
var location = _.flatten(_.map(self.StockLocation,function(item){
return item.id;
}));
var company_id =(_.map(self.StockLocation, function(item){
return item.company_id[0];
})).shift();
var quant = new instance.web.Model('stock.quant');
var fields = ['id', 'product_id', 'qty', 'cost','location_id'];
var domain =[['company_id', '=', company_id],['location_id', 'in',location]];
quant.query(fields).filter(domain).all().then(function(results){
defer.resolve(results);
})
return defer;
},
fecthProductProduct: function(){
var self = this;
var defer = $.Deferred();
var ids = _.flatten(_.map(self.StockQuant, function (item) {
return item.product_id[0];
}));
var fields = ['id','name','name_template', 'standard_price','type','attribute_value_ids', 'lst_price','ean13','categ_id','attribute_str'];
var ProductProduct = new instance.web.Model('product.product');
ProductProduct.query(fields).filter([['id', 'in', ids]]).all().then(function (results) {
defer.resolve(results)
});
return defer;
},
fecthProductCategory: function(){
var self = this;
var defer = $.Deferred();
var fields = ['id','name'];
var ProductCategory = new instance.web.Model('product.category');
ProductCategory.query(fields).filter([['type', '=', 'normal']]).all().then(function (results) {
defer.resolve(results)
});
return defer;
},
getProductProduct: function(ProductProduct, StockQuant){
var self = this;
var product_ids= _.flatten(_.map(StockQuant,function(map){
return map.product_id[0];
}));
return _.filter(ProductProduct,function(prod){return _.contains(product_ids, prod.id)});
},
getStockQuant: function(product_id, quantObjs){
var self = this;
var quantProduct = quantObjs;
if (product_id){
quantProduct = _.filter(quantProduct, function(item){
return item.product_id[0] == product_id;
});
}
return quantProduct;
},
BuildTable : function(stockQuant,stockLocation){
var self = this;
var data=[];
var itemLocation;
var itemProduct;
var itemQuant;
var ProductProduct;
var product;
var quantity = 0;
var total=0;
ProductProduct = self.getProductProduct(self.ProductProduct, self.StockQuant);
_.each(ProductProduct, function(item){
itemProduct = item;
itemQuant = self.getStockQuant( itemProduct.id, self.StockQuant);
if (itemQuant.length > 0){
quantity = _.reduce(_.map(itemQuant,function(item){
return item.qty;
}),function(mamo, num){
return mamo + num;
},0);
product = itemQuant.shift();
total = parseInt(quantity * itemProduct.standard_price);
data.push({
id : product.product_id[0],
product : product.product_id[1],
ean13 : self.valorNull(itemProduct.ean13),
category_name : itemProduct.categ_id[1],
qty : accounting.formatNumber(quantity,2, ".", ","),
standard_price : accounting.formatNumber(itemProduct.standard_price,0, ".", ","),
lst_price : accounting.formatNumber(itemProduct.lst_price,0, ".", ","),
valuation: accounting.formatNumber(total,0,".",","),
category_id : itemProduct.categ_id[0],
location_id : product.location_id[0],
total : total
});
}
})
self.content = data;
self.loadTable(data);
},
search: function () {
var self = this;
var results = self.ProductProduct;
results = _.map(results, function (item) {
return {
label: item.id + '- '+ ' [ ' + self.valorNull(item.default_code) + ' - ' + self.valorNull(item.ean13) + ' ] ' + item.name + ' ( ' + self.valorNull(item.attribute_str) + ' ) ' ,
value: item.id + '- '+ ' [ ' + self.valorNull(item.default_code) + ' - ' + self.valorNull(item.ean13) + ' ] ' + item.name + ' ( ' + self.valorNull(item.attribute_str) + ' ) '
}
});
self.$('#product').autocomplete({
source: results,
minLength:0,
search: function(event, ui) {
if (!(self.$('#product').val())){
self.factSearch();
}
},
close: function( event, ui ) {
self.factSearch();
},
select: function(event, ui) {
self.factSearch();
}
});
},
factSearch: function(){
var self = this;
var category = this.$el.find('#current-category').val();
var product= this.$el.find('#product').val().split('-');
var content = self.content;
if(category != 9999999){
content = _.filter(content,function(inv){
return inv.category_id == category;
});
}
if (product != ""){
content = _.filter(content, function(inv){
return inv.id == product[0];
});
}
self.loadTable(content)
},
loadTable:function(rowsTable){
var self = this;
self.rowsData = rowsTable;
var table = self.$el.find('#table');
table.bootstrapTable('load' ,rowsTable);
},
getObjectPdf: function(){
var self = this;
var rows=[];
var rows = self.rowsData;
var total = _.reduce(_.map(rows,function(map){
return(map.total);
}),function(memo, num){
return memo + num;
},0);
if (rows.length > 0){
rows.push({
product: "Totales ",
valuation: accounting.formatNumber(total,0,".",","),
});
}
return rows;
},
clickOnAction: function (e) {
var self = this;
var rowsNew;
var action = self.$el.find(e.target).val();
var table = self.$el.find("#table");
var data2 = table.bootstrapTable('getVisibleColumns');
var getColumns=[];
var rows=[];
rowsNew = self.getObjectPdf();
if (action === 'pdf') {
var dataNEW = _.map(data2, function (val){
return val.field;
});
_.each(rowsNew,function (item){
rows.push(_.pick(item, dataNEW));
});
// Obtener los nombre de la Cabezera
_.each(_.map(data2,function(val){
return val;
}), function(item){
getColumns.push([{
title: item.title,
dataKey: item.field
}]);
});
this.drawPDF(_.flatten(getColumns),rows);
}
},
drawPDF:function(getColumns,rows){
var self = this;
var fechaActu= new Date();
var location = this.sucDescrip = this.$el.find('#current-location option:selected').text();
var totalPagesExp = "{total_pages_count_string}";
var pdfDoc = new jsPDF();
pdfDoc.autoTable(getColumns, rows, {
styles: { overflow: 'linebreak', fontSize:8 , columnWidth: 'wrap'},
columnStyles:{
product :{columnWidth: '8px'},
qty : {halign:'center'},
standard_price : {halign:'right'},
lst_price : {halign:'right'},
valuation : {halign:'right'},
},
margin: { top: 16, horizontal: 7},
addPageContent: function (data) {
pdfDoc.setFontSize(12);
pdfDoc.setFontStyle('bold');
pdfDoc.setTextColor(40);
pdfDoc.text('Listado de productos', data.settings.margin.left, 10);
// FOOTER
var str = "Pagina " + data.pageCount;
if (typeof pdfDoc.putTotalPages === 'function') {
str = str + " de " + totalPagesExp;
// +"\n Día de Expedición "+fechaActu.getDate()+"/"+fechaActu.getMonth()+"/"+fechaActu.getFullYear();
}
pdfDoc.setFontSize(9);
pdfDoc.setFontStyle('bold');
pdfDoc.setTextColor(40);
pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
}
});
if (typeof pdfDoc.putTotalPages === 'function') {
pdfDoc.putTotalPages(totalPagesExp);
}
pdfDoc.save('Listado de productos.pdf');
}
});
}