odoo.define('mrp.mrp_bom_report', function (require) {
'use strict';
var core = require('web.core');
var framework = require('web.framework');
var stock_report_generic = require('stock.stock_report_generic');
var QWeb = core.qweb;
var _t = core._t;
var MrpBomReport = stock_report_generic.extend({
events: {
'click .o_mrp_bom_unfoldable': '_onClickUnfold',
'click .o_mrp_bom_foldable': '_onClickFold',
'click .o_mrp_bom_action': '_onClickAction',
'click .o_mrp_show_attachment_action': '_onClickShowAttachment',
},
get_html: function() {
var self = this;
var args = [
this.given_context.active_id,
this.given_context.searchQty || false,
this.given_context.searchVariant,
];
return this._rpc({
model: 'report.mrp.report_bom_structure',
method: 'get_html',
args: args,
context: this.given_context,
})
.then(function (result) {
self.data = result;
if (! self.given_context.searchVariant) {
self.given_context.searchVariant = result.is_variant_applied && Object.keys(result.variants)[0];
}
});
},
set_html: function() {
var self = this;
return this._super().then(function () {
self.$('.o_content').html(self.data.lines);
self.renderSearch();
self.update_cp();
});
},
render_html: function(event, $el, result){
if (result.indexOf('mrp.document') > 0) {
if (this.$('.o_mrp_has_attachments').length === 0) {
var column = $('
| ', {
class: 'o_mrp_has_attachments',
title: 'Files attached to the product Attachments',
text: 'Attachments',
});
this.$('table thead th:last-child').after(column);
}
}
$el.after(result);
$(event.currentTarget).toggleClass('o_mrp_bom_foldable o_mrp_bom_unfoldable fa-caret-right fa-caret-down');
this._reload_report_type();
},
get_bom: function(event) {
var self = this;
var $parent = $(event.currentTarget).closest('tr');
var activeID = $parent.data('id');
var productID = $parent.data('product_id');
var lineID = $parent.data('line');
var qty = $parent.data('qty');
var level = $parent.data('level') || 0;
return this._rpc({
model: 'report.mrp.report_bom_structure',
method: 'get_bom',
args: [
activeID,
productID,
parseFloat(qty),
lineID,
level + 1,
]
})
.then(function (result) {
self.render_html(event, $parent, result);
});
},
get_operations: function(event) {
var self = this;
var $parent = $(event.currentTarget).closest('tr');
var activeID = $parent.data('bom-id');
var qty = $parent.data('qty');
var level = $parent.data('level') || 0;
return this._rpc({
model: 'report.mrp.report_bom_structure',
method: 'get_operations',
args: [
activeID,
parseFloat(qty),
level + 1
]
})
.then(function (result) {
self.render_html(event, $parent, result);
});
},
update_cp: function () {
var status = {
cp_content: {
$buttons: this.$buttonPrint,
$searchview: this.$searchView
},
};
return this.updateControlPanel(status);
},
renderSearch: function () {
this.$buttonPrint = $(QWeb.render('mrp.button', {'is_variant_applied': this.data.is_variant_applied}));
this.$buttonPrint.find('.o_mrp_bom_print').on('click', this._onClickPrint.bind(this));
this.$buttonPrint.find('.o_mrp_bom_print_all_variants').on('click', this._onClickPrint.bind(this));
this.$buttonPrint.find('.o_mrp_bom_print_unfolded').on('click', this._onClickPrint.bind(this));
this.$searchView = $(QWeb.render('mrp.report_bom_search', _.omit(this.data, 'lines')));
this.$searchView.find('.o_mrp_bom_report_qty').on('change', this._onChangeQty.bind(this));
this.$searchView.find('.o_mrp_bom_report_variants').on('change', this._onChangeVariants.bind(this));
this.$searchView.find('.o_mrp_bom_report_type').on('change', this._onChangeType.bind(this));
},
_onClickPrint: function (ev) {
var childBomIDs = _.map(this.$el.find('.o_mrp_bom_foldable').closest('tr'), function (el) {
return $(el).data('id');
});
framework.blockUI();
var reportname = 'mrp.report_bom_structure?docids=' + this.given_context.active_id +
'&report_type=' + this.given_context.report_type +
'&quantity=' + (this.given_context.searchQty || 1);
if (! $(ev.currentTarget).hasClass('o_mrp_bom_print_unfolded')) {
reportname += '&childs=' + JSON.stringify(childBomIDs);
}
if ($(ev.currentTarget).hasClass('o_mrp_bom_print_all_variants')) {
reportname += '&all_variants=' + 1;
} else if (this.given_context.searchVariant) {
reportname += '&variant=' + this.given_context.searchVariant;
}
var action = {
'type': 'ir.actions.report',
'report_type': 'qweb-pdf',
'report_name': reportname,
'report_file': 'mrp.report_bom_structure',
};
return this.do_action(action).then(function (){
framework.unblockUI();
});
},
_onChangeQty: function (ev) {
var qty = $(ev.currentTarget).val().trim();
if (qty) {
this.given_context.searchQty = parseFloat(qty);
this._reload();
}
},
_onChangeType: function (ev) {
var report_type = $("option:selected", $(ev.currentTarget)).data('type');
this.given_context.report_type = report_type;
this._reload_report_type();
},
_onChangeVariants: function (ev) {
this.given_context.searchVariant = $(ev.currentTarget).val();
this._reload();
},
_onClickUnfold: function (ev) {
var redirect_function = $(ev.currentTarget).data('function');
this[redirect_function](ev);
},
_onClickFold: function (ev) {
this._removeLines($(ev.currentTarget).closest('tr'));
$(ev.currentTarget).toggleClass('o_mrp_bom_foldable o_mrp_bom_unfoldable fa-caret-right fa-caret-down');
},
_onClickAction: function (ev) {
ev.preventDefault();
return this.do_action({
type: 'ir.actions.act_window',
res_model: $(ev.currentTarget).data('model'),
res_id: $(ev.currentTarget).data('res-id'),
context: {
'active_id': $(ev.currentTarget).data('res-id')
},
views: [[false, 'form']],
target: 'current'
});
},
_onClickShowAttachment: function (ev) {
ev.preventDefault();
var ids = $(ev.currentTarget).data('res-id');
return this.do_action({
name: _t('Attachments'),
type: 'ir.actions.act_window',
res_model: $(ev.currentTarget).data('model'),
domain: [['id', 'in', ids]],
views: [[false, 'kanban'], [false, 'list'], [false, 'form']],
view_mode: 'kanban,list,form',
target: 'current',
});
},
_reload: function () {
var self = this;
return this.get_html().then(function () {
self.$('.o_content').html(self.data.lines);
self._reload_report_type();
});
},
_reload_report_type: function () {
this.$('.o_mrp_bom_cost.o_hidden, .o_mrp_prod_cost.o_hidden').toggleClass('o_hidden');
if (this.given_context.report_type === 'bom_structure') {
this.$('.o_mrp_bom_cost, .o_mrp_prod_cost').toggleClass('o_hidden');
}
},
_removeLines: function ($el) {
var self = this;
var activeID = $el.data('id');
_.each(this.$('tr[parent_id='+ activeID +']'), function (parent) {
var $parent = self.$(parent);
var $el = self.$('tr[parent_id='+ $parent.data('id') +']');
if ($el.length) {
self._removeLines($parent);
}
$parent.remove();
});
},
});
core.action_registry.add('mrp_bom_report', MrpBomReport);
return MrpBomReport;
});