openerp.report_invoice_utility = function (instance, local) {
local.ReportWidget = instance.Widget.extend({
template: 'ReportContainerTemplate1',
invoices: [],
invoiceLines: [],
productProduct:[],
Currency:[],
start: function () {
this.fetchJournal();
this.fecthFecha();
this.$el.find('#report_form').submit(_.bind(this.submitForm, this));
},
fecthFecha: function() {
var to;
var dateFormat1 = "mm/dd/yy",
from = $( "#from" )
.datepicker({
dateFormat: "dd/mm/yy",
changeMonth: true,
numberOfMonths: 1,
})
.on( "change", function() {
to.datepicker( "option", "minDate", getDate(this), "dd/mm/yyyy");
});
to = $( "#to" ).datepicker({
dateFormat: "dd/mm/yy",
defaultDate: "+7d",
changeMonth: true,
numberOfMonths: 1,
})
.on( "change", function() {
from.datepicker( "option", "maxDate", getDate(this));
});
function getDate( element ) {
var fechaSel =element.value.split('/');
var date;
try {
date = $.datepicker.parseDate( dateFormat1, (fechaSel[1]+"/"+fechaSel[0]+"/"+fechaSel[2]));
} catch( error ) {
date = null;
}
return date;
}
},
// Buscar Diario
fetchJournal: function () {
var self = this;
var Journal = new instance.web.Model('account.journal');
Journal.query(['id', 'type', 'code', 'currency', 'name', 'company_id', 'active']).filter([['type', '=', 'sale'], ['active', '=', true]]).all().then(function (results) {
self.journal = results;
_.each(results, function (item) {
self.$el.find('#current-journal').append('');
});
self.$el.find('#current-journal').append('');
});
},
// Buscar Cambio de Monedas USD,PYG,ARG,BRL
fetchCurency: function () {
var defer = $.Deferred();
var currency_Rate = new instance.web.Model('res.currency.rate');
var fields = ['id', 'name', 'currency_id', 'rate', 'create_date'];
var domain = [['currency_id', '=', [166 , 20, 7, 3]]];
currency_Rate.query(fields).filter(domain).all().then(function (results) {
defer.resolve(results);
});
return defer;
},
// Invoice (FACTURAS)
fetchInvoiceV2: function (journalId) {
var desde =(this.$el.find('#from').val());
var hasta =(this.$el.find('#to').val());
var domain ="[['state', '=',['open','paid']],['type', '=', 'out_invoice']";
if( journalId != 9999999){
domain += ",['journal_id.id', '=', "+journalId+"]";
}
if (desde.length > 0 ){
domain += ",['date_invoice','>=', '"+desde+"'], ['date_invoice', '<=', '"+hasta+"']";
}
domain += "]";
var defer = $.Deferred();
var Invoice = new instance.web.Model('account.invoice');
Invoice.query(['id', 'type', 'number', 'origin', 'state', 'journal_id', 'currency_id', 'invoice_line','date_invoice']).filter(domain).all().then(function (results) {
defer.resolve(results);
});
return defer;
},
// Invoice line (Linea de Factura)
fetchInvoiceLine: function (invoices) {
var defer = $.Deferred();
var linesIds = _.flatten(_.map(invoices, function (item) {
return item.invoice_line;
}));
var InvoiceLine = new instance.web.Model('account.invoice.line');
InvoiceLine.query(['id', 'quantity', 'price_unit', 'discount', 'name', 'product_id', 'origin','invoice_id']).filter([['id', 'in', linesIds]]).all().then(function (results) {
defer.resolve(results)
});
return defer;
},
// Product Product
fecthProduct: function(invoiceLines){
var defer = $.Deferred();
var porductIDS = _.flatten(_.map(invoiceLines, function (item) {
return item.product_id[0];
}));
var ProductProdcut = new instance.web.Model('product.product');
var fields = ['id', 'default_code', 'name_template', 'factory_code', 'factory_reference', 'factory_barcode', 'standard_price','type'];
ProductProdcut.query(fields).filter([['id', 'in', porductIDS]]).all().then(function (results) {
defer.resolve(results)
});
return defer;
},
// Cansultar
submitForm: function (e) {
var desde =this.$el.find('#from').val();
var hasta =this.$el.find('#to').val();
e.preventDefault();
var formData = this.$(e.currentTarget).serializeJSON();
if ((formData.journal == 0) || (((desde.length == 0) && (hasta.length > 0)) || ((desde.length > 0) && (hasta.length == 0)))){
$("#dialog" ).dialog({
autoOpen: true,
resizable: false,
modal: true,
title: 'Atención',
open: function() {
$(this).html('Complete el formulario para generar el reporte');
},
show: {
effect: "shake",
duration: 300
},
hide: {
effect: "fade",
duration: 300
},
buttons: {
Aceptar: function() {
$(this).dialog('close');
}
}
});
return;
}
var self = this;
this.fetchCurency().then(function(currency) {
self.Currency = currency;
});
this.fetchInvoiceV2(formData.journal).then(function (invoices) {
self.invoices = invoices;
return invoices;
}).then(function (invoices) {
return self.fetchInvoiceLine(invoices);
}).then(function (invoiceLines) {
self.invoiceLines = invoiceLines;
return self.fecthProduct(invoiceLines);
}).then(function(productProduct){
self.productProduct = productProduct;
return self.invoice_Currency();
});
return false;
},
// Obtener Monedas de la Factura
getCutrrency: function (id){
return _.find(this.Currency,function (curr) {
return _.contains(curr.currency_id,id);
});
},
// Actualizar cambio de las moneda de Factura
invoice_Currency: function(){
for (var i = 0; i < this.invoices.length; i++) {
var currency_new;
var item = this.invoices[i];
var id = item.currency_id[0];
currency_new = this.getCutrrency(id)
if (!currency_new){
currency_new={};
currency_new.rate=1;
}
this.invoices[i].rate=(currency_new.rate);
}
return this.fectUtility();
},
// Obtener la Detalles de la Factura
getInvoice: function (id_line){
return _.find(this.invoices, function (inv) {
return _.contains(inv.invoice_line, id_line);
});
},
// Obtener las lineas de las Facturas
getProduct: function(pro_id){
return _.find(this.productProduct, function(prod){
return _.contains(pro_id, prod.id);
});
},
// unir los objetos
fectUtility: function(){
var data=[];
var item;
var invoice;
var producto;
for (var i = 0; i < this.invoiceLines.length; i++) {
item = this.invoiceLines[i];
invoice = this.getInvoice(item.id)
producto =this.getProduct(item.product_id)
if (!producto){
producto={};
producto.standard_price=0;
}
if (producto.type =="product"){
data.push({number : (invoice.number),
name : (item.name),
quantity : (item.quantity),
price_unity : (item.price_unit.toFixed(2) / invoice.rate.toFixed(2)),
standar_price : (producto.standard_price.toFixed(2)),
price_tot : (item.quantity * (item.price_unit.toFixed(2) / invoice.rate.toFixed(2))),
standar_tot : (item.quantity * producto.standard_price.toFixed(2)),
utility : ((item.quantity * (item.price_unit.toFixed(2) / invoice.rate.toFixed(2))) - (item.quantity * producto.standard_price)).toFixed(2)});
}
}
this.drawPDF(data);
},
// Generar el pdfDoc
drawPDF: function (rows) {
var rows2=[];
var sucusal = this.sucDescrip = this.$el.find('#current-journal option:selected').text();
var desde =(this.$el.find('#from').val());
var hasta =(this.$el.find('#to').val());
var totalPagesExp = "{total_pages_count_string}";
var getColumns = [
{title: "Factura", dataKey: "number"},
{title: "Producto", dataKey: "name"},
{title: "Cantidad", dataKey: "quantity"},
{title: "Precio Unitario", dataKey: "price_unity"},
{title: "Precio Costo", dataKey: "standar_price"},
{title: "Total Venta", dataKey: "price_tot"},
{title: "Total Costo", dataKey: "standar_tot"},
{title: "Utilidad", dataKey: "utility"}
];
var pdfDoc = new window.jsPDF();
var quantity=0,precio_cost=0,precio_unit=0,tol_cost=0,tot_unit=0,utility=0;
_.each(rows, function (datos) {
quantity += datos.quantity;
precio_unit += datos.price_unity;
precio_cost += parseFloat(datos.standar_price);
tot_unit += datos.price_tot;
tol_cost += datos.standar_tot;
utility += parseFloat(datos.utility);
});
rows.push({ number : " ",
name : "TOTAL USD ",
quantity: quantity,
price_unity : precio_unit.toFixed(2),
standar_price : precio_cost.toFixed(2),
price_tot : tot_unit.toFixed(2),
standar_tot : tol_cost.toFixed(2),
utility : utility.toFixed(2)});
rows.unshift({ number : " ",
name : "TOTAL USD ",
quantity: quantity,
price_unity : precio_unit.toFixed(2),
standar_price : precio_cost.toFixed(2),
price_tot : tot_unit.toFixed(2),
standar_tot : tol_cost.toFixed(2),
utility : utility.toFixed(2)});
_.each(rows, function (rows1) {
rows2.push({ number : rows1.number,
name : rows1.name,
quantity: accounting.formatNumber(rows1.quantity,0, ".", ","),
price_unity : accounting.formatNumber(rows1.price_unity, 2, ".", ","),
standar_price : accounting.formatNumber(rows1.standar_price, 2, ".", ","),
price_tot : accounting.formatNumber(rows1.price_tot, 2, ".", ","),
standar_tot : accounting.formatNumber(rows1.standar_tot, 2, ".", ","),
utility : accounting.formatNumber(rows1.utility, 2, ".", ",")});
});
pdfDoc.autoTable(getColumns, rows2, {
styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
columnStyles: {number: {fontStyle: 'bold'},
name :{columnWidth: '10px'},
quantity :{halign:'right' },
price_unity : {halign:'right' },
standar_price : {halign:'right' },
price_tot : {halign:'right' },
standar_tot : {halign:'right' },
utility : {halign:'right'},},
margin: { top: 16, horizontal: 7},
addPageContent: function (data) {
pdfDoc.setFontSize(12);
pdfDoc.setFontStyle('bold');
pdfDoc.setTextColor(40);
pdfDoc.text('Análisis de Utilidad '+ sucusal, data.settings.margin.left, 10);
if(desde.length > 0 ){
pdfDoc.setFontSize(10);
pdfDoc.setFontStyle('bold');
pdfDoc.setTextColor(40)
pdfDoc.text('Desde: '+desde+' Hasta: '+hasta, data.settings.margin.left,14);
}
// FOOTER
var str = "Pagina " + data.pageCount;
// Total page number plugin only available in jspdf v1.0+
if (typeof pdfDoc.putTotalPages === 'function') {
str = str + " de " + totalPagesExp;
}
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('Analisis de utilidad.pdf')
}
});
instance.web.client_actions.add('report_invoice_utility.action_report', 'instance.report_invoice_utility.ReportWidget');
}