You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
8.7 KiB
212 lines
8.7 KiB
odoo.define('pos_multi_variant.ProductPopup', function (require)
|
|
{ "use strict";
|
|
|
|
var PosBaseWidget = require('point_of_sale.BaseWidget');
|
|
var gui = require('point_of_sale.gui');
|
|
var models = require('point_of_sale.models');
|
|
var core = require('web.core');
|
|
var screens = require('point_of_sale.screens');
|
|
var PopupWidget = require('point_of_sale.popups');
|
|
var Widget = require("web.Widget");
|
|
var QWeb = core.qweb;
|
|
var rpc = require('web.rpc');
|
|
var _t = require('web.core')._t;
|
|
|
|
models.load_models([
|
|
{ model: 'variants.tree',
|
|
fields: ["variants.tree", "pos_active", "value", "attribute", "variants_id", "extra_price"],
|
|
loaded: function(self, variants_tree)
|
|
{ self.variant_tree = variants_tree;
|
|
_.each(variants_tree, function(item)
|
|
{ self.item = item;
|
|
});
|
|
}
|
|
},{ model: 'product.attribute.value',
|
|
fields: ["id", "name"],
|
|
loaded: function(self,values)
|
|
{ self.values = values;
|
|
}
|
|
}]);
|
|
|
|
var super_models = models.PosModel.prototype.models;
|
|
models.load_fields('product.product','pos_variants');
|
|
models.load_fields('product.product','variant_line_ids');
|
|
|
|
var _super_orderline = models.Orderline.prototype;
|
|
models.Orderline = models.Orderline.extend
|
|
({ initialize: function(attr, options)
|
|
{ _super_orderline.initialize.call(this,attr,options);
|
|
this.product_variants = this.product_variants || [];
|
|
},
|
|
init_from_JSON: function(json)
|
|
{ _super_orderline.init_from_JSON.apply(this,arguments);
|
|
this.product_variants = json.product_variants || [];
|
|
},
|
|
export_as_JSON: function ()
|
|
{ var json = _super_orderline.export_as_JSON.apply(this, arguments);
|
|
json.product_variants = this.product_variants || [];
|
|
return json;
|
|
},
|
|
});
|
|
|
|
var ProductPopUp = PopupWidget.extend
|
|
({ template: 'ProductPopUp',
|
|
|
|
init: function(parent, options)
|
|
{ this._super(parent, options);
|
|
this.options = {};
|
|
this.pos_reference = "";
|
|
},
|
|
|
|
show: function(options)
|
|
{ this._super(options);
|
|
this.render_list(options);
|
|
},
|
|
|
|
events:
|
|
{ 'click .button.cancel': 'click_cancel',
|
|
'click .button.confirm': 'click_confirm',
|
|
'click .product': 'click_variant',
|
|
},
|
|
|
|
click_variant:function(e)
|
|
{ var order = this.self.pos.get('selectedOrder')
|
|
var self = e.currentTarget
|
|
var action = $(self).find('.action').text();
|
|
var categories = []
|
|
|
|
var category = $(self).find('.action').data('category');
|
|
$('.product-img').find('.variant-selected').each(function ()
|
|
{ if($(this).data('category') == category)
|
|
{ $(this).text("").removeClass('variant-selected');
|
|
$(self).find('.action').text("Selected").addClass('variant-selected');
|
|
}
|
|
});
|
|
$(self).find('.action').text("Selected").addClass('variant-selected');
|
|
var add = $(self).find('.extra-price').text().substr(1).slice(0, -2);
|
|
var type = $(self).find('.variants').text();
|
|
$(self).find('.variant-selected').attr('data-price', add);
|
|
$(self).find('.variant-selected').attr('data-type', type);
|
|
},
|
|
|
|
render_list:function(options)
|
|
{ this.list = options.list
|
|
this.image_url = options.image_url
|
|
this.pos_reference = options.data
|
|
this.variant_values = options.values
|
|
this.self = options.self
|
|
var AddError = "variants are not added";
|
|
var ActiveError = "No active variants "
|
|
var NotActive = 0;
|
|
var AttributeNumbers = []
|
|
var pushed = []
|
|
|
|
for (var i = 0; i < this.list.length; i++)
|
|
{ if(this.list[i].pos_active == false)
|
|
{ NotActive += 1
|
|
}
|
|
if(this.list.length == NotActive)
|
|
{ $("#notify").append(ActiveError);
|
|
}
|
|
if(this.list[i].pos_active == true)
|
|
{ if (!pushed.includes(this.list[i].attribute[0]))
|
|
{ var temp = {};
|
|
temp.id = this.list[i].attribute[0];
|
|
temp.name = this.list[i].attribute[1]
|
|
pushed.push(this.list[i].attribute[0])
|
|
AttributeNumbers.push(temp)
|
|
}
|
|
}
|
|
}
|
|
var tag = "<div class='"+i+"'>";
|
|
for ( var i in AttributeNumbers)
|
|
{ tag += "<h2 class='tag'>"+AttributeNumbers[i].name+"</h2>";
|
|
for (var attr = 0; attr < this.list.length; attr++)
|
|
{ if (AttributeNumbers[i].id == this.list[attr].attribute[0])
|
|
{ var values = this.list[attr].value.length
|
|
for(var j = 0; j < values; j++)
|
|
{ if(this.list[attr].extra_price)
|
|
{ var price = '+'+this.format_currency(this.list[attr].extra_price)}
|
|
else
|
|
{ var price = '+'+this.format_currency(0.00)}
|
|
for(var k=0; k < this.variant_values.length; k++)
|
|
{ if((this.variant_values[k].id == this.list[attr].value[j]) && this.list[attr].pos_active == true)
|
|
{ var rows ="<article class='product'>" +
|
|
"<div class='product-img'>"+
|
|
"<img src='"+this.image_url+"'/>" +
|
|
"<span class='extra-price'>"+price+"</span>"+
|
|
"<h2 class='action' data-price='' data-type='' data-category='"+AttributeNumbers[i].name+"'></h2>"+
|
|
"<span class='variants'>"+this.variant_values[k].name+"</span>"+
|
|
"</div>"+
|
|
"</article>"
|
|
tag += rows
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
tag += "</div>"
|
|
$("#notify").append(tag);
|
|
|
|
if(!(this.pos_reference.variant_line_ids.length>0))
|
|
{ $("#notify").append(AddError);
|
|
}
|
|
},
|
|
|
|
click_cancel: function()
|
|
{ var order = this.self.pos.get('selectedOrder').selected_orderline.product_variants = []
|
|
this.gui.close_popup();
|
|
},
|
|
|
|
click_confirm: function()
|
|
{ var price = 0.00
|
|
var order = this.self.pos.get('selectedOrder');
|
|
var selected_orderline = order.selected_orderline
|
|
$('.product-img').find('.variant-selected').each(function ()
|
|
{ price += parseFloat($(this).data('price'))
|
|
var variant = order.selected_orderline.product_variants
|
|
variant.push
|
|
({ 'extra_price': $(this).data('price'),
|
|
'type': $(this).data('type'),
|
|
})
|
|
});
|
|
selected_orderline.price_manually_set = true;
|
|
selected_orderline.price += price
|
|
selected_orderline.trigger('change', selected_orderline);
|
|
this.gui.close_popup();
|
|
}
|
|
});
|
|
gui.define_popup({name:'ProductSelection', widget: ProductPopUp});
|
|
|
|
screens.ProductScreenWidget.include
|
|
({ click_product: function(product)
|
|
{ var image_url = this.get_product_image(product.id);
|
|
var self = this;
|
|
var variant_tree = this.pos.variant_tree
|
|
var list = []
|
|
var values = this.pos.values
|
|
for(var i = 0; i < variant_tree.length; i++)
|
|
{ if(variant_tree[i].variants_id[0] == product.product_tmpl_id)
|
|
{ list.push(variant_tree[i]); }
|
|
}
|
|
if(product.to_weight && this.pos.config.iface_electronic_scale)
|
|
{ this.gui.show_screen('scale',{product: product});}
|
|
else if(product.pos_variants)
|
|
{ this.pos.get_order().add_product(product);
|
|
this.gui.show_popup('ProductSelection',
|
|
{ 'title': product.display_name,
|
|
data: product,
|
|
image_url: image_url,
|
|
list: list,
|
|
values: values,
|
|
self: self
|
|
});
|
|
}
|
|
else
|
|
{ this.pos.get_order().add_product(product); }
|
|
},
|
|
get_product_image: function(product)
|
|
{ return window.location.origin + '/web/image?model=product.product&field=image_medium&id='+product; }
|
|
});
|
|
});
|
|
|