← Back to team overview

openerp-community-reviewer team mailing list archive

[Merge] lp:~sylvain-legal/openerp-pos/7.0_pos_select_customer into lp:openerp-pos

 

Sylvain LE GAL (GRAP) has proposed merging lp:~sylvain-legal/openerp-pos/7.0_pos_select_customer into lp:openerp-pos with lp:~sylvain-legal/openerp-pos/7.0_pos_second_header as a prerequisite.

Commit message:
[ADD] Add new module to select customers in Front End Point Of Sale

Requested reviews:
  OpenERP Community Reviewer/Maintainer (openerp-community-reviewer)

For more details, see:
https://code.launchpad.net/~sylvain-legal/openerp-pos/7.0_pos_select_customer/+merge/228826

Add a module to select a customer in point of sale (front end view) module.
This module load all customers when POS is started (as product behaviour).


Nota: 
- Flake8: OK.
- This module doesn't cover for the time being some extra-feature. (pricelist, invoicing). Plz read __openerp__.py manifest for more information;

Thanks for your reviews.
-- 
https://code.launchpad.net/~sylvain-legal/openerp-pos/7.0_pos_select_customer/+merge/228826
Your team OpenERP Community Reviewer/Maintainer is requested to review the proposed merge of lp:~sylvain-legal/openerp-pos/7.0_pos_select_customer into lp:openerp-pos.
=== added directory 'pos_select_customer'
=== added file 'pos_select_customer/__init__.py'
--- pos_select_customer/__init__.py	1970-01-01 00:00:00 +0000
+++ pos_select_customer/__init__.py	2014-07-30 11:15:32 +0000
@@ -0,0 +1,22 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    Point Of Sale - Select Customer module for OpenERP
+#    Copyright (C) 2013-2014 GRAP (http://www.grap.coop)
+#    @author Julien WESTE
+#    @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################

=== added file 'pos_select_customer/__openerp__.py'
--- pos_select_customer/__openerp__.py	1970-01-01 00:00:00 +0000
+++ pos_select_customer/__openerp__.py	2014-07-30 11:15:32 +0000
@@ -0,0 +1,76 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    Point Of Sale - Select Customer module for OpenERP
+#    Copyright (C) 2014 GRAP (http://www.grap.coop)
+#    @author Julien WESTE
+#    @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+{
+    'name': 'Point Of Sale - Select Customers',
+    'summary': 'Allow users to select a customer in Front End Point Of Sale',
+    'version': '0.1',
+    'category': 'sale',
+    'description': """
+Allow users to select a customer in Front End Point Of Sale
+===========================================================
+
+Functionality:
+--------------
+    * Allow user to set a customer to a pos order in front end views;
+
+Possible improvements and fix:
+------------------------------
+    * This module displays all the customers. That can be long to display"""
+    """ if there are a lot of customers in database; Display only 80"""
+    """ could be a solution;
+    * Images of customers are loaded each time; Similar behaviour as"""
+    """ products image management (with cache) could be developped;
+
+NON Covered features:
+---------------------
+    * Possibility to create customers in front end views;
+    * Possibility to change price if customer has a list price different as"""
+    """ the default list price; (Big stuff);
+    * Possibility to see if the partner has not the default price list;
+    * Possibility to invoice in front-end views;
+
+Copyright, Authors and Licence:
+-------------------------------
+    * Copyright: 2014, GRAP: Groupement Régional Alimentaire de Proximité;
+    * Author:
+        * Julien WESTE;
+        * Sylvain LE GAL (https://twitter.com/legalsylvain);
+    * Licence: AGPL-3 (http://www.gnu.org/licenses/);""",
+    'author': 'GRAP',
+    'website': 'http://www.grap.coop',
+    'license': 'AGPL-3',
+    'depends': [
+        'point_of_sale',
+        'pos_second_header',
+    ],
+    'qweb': [
+        'static/src/xml/psc.xml',
+    ],
+    'js': [
+        'static/src/js/psc.js',
+    ],
+    'css': [
+        'static/src/css/psc.css',
+    ],
+}

=== added directory 'pos_select_customer/i18n'
=== added file 'pos_select_customer/i18n/fr.po'
--- pos_select_customer/i18n/fr.po	1970-01-01 00:00:00 +0000
+++ pos_select_customer/i18n/fr.po	2014-07-30 11:15:32 +0000
@@ -0,0 +1,74 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+#    Point Of Sale - Select Customer module for OpenERP
+#    Copyright (C) 2013-2014 GRAP (http://www.grap.coop)
+#    @author Julien WESTE
+#    @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+#	* pos_select_customer
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-16 16:31+0000\n"
+"PO-Revision-Date: 2014-04-16 16:31+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: pos_select_customer
+#. openerp-web
+#: code:addons/pos_select_customer/static/src/xml/psc.xml:48
+#, python-format
+msgid "Cancel"
+msgstr "Annuler"
+
+#. module: pos_select_customer
+#. openerp-web
+#: code:addons/pos_select_customer/static/src/js/psc.js:57
+#, python-format
+msgid "Customer"
+msgstr "Client"
+
+#. module: pos_select_customer
+#. openerp-web
+#: code:addons/pos_select_customer/static/src/xml/psc.xml:41
+#, python-format
+msgid "Customer Selection"
+msgstr "Sélection d'un client"
+
+#. module: pos_select_customer
+#. openerp-web
+#: code:addons/pos_select_customer/static/src/js/psc.js:68
+#, python-format
+msgid "Del."
+msgstr "Suppr."
+
+#. module: pos_select_customer
+#. openerp-web
+#: code:addons/pos_select_customer/static/src/xml/psc.xml:45
+#, python-format
+msgid "Search Customers"
+msgstr "Rechercher des clients"
+

=== added directory 'pos_select_customer/static'
=== added directory 'pos_select_customer/static/src'
=== added directory 'pos_select_customer/static/src/css'
=== added file 'pos_select_customer/static/src/css/psc.css'
--- pos_select_customer/static/src/css/psc.css	1970-01-01 00:00:00 +0000
+++ pos_select_customer/static/src/css/psc.css	2014-07-30 11:15:32 +0000
@@ -0,0 +1,168 @@
+/******************************************************************************
+    Point Of Sale - Select Customer module for OpenERP
+    Copyright (C) 2014 GRAP (http://www.grap.coop)
+    @author Julien WESTE
+    @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as
+    published by the Free Software Foundation, either version 3 of the
+    License, or (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+******************************************************************************/
+
+/*  ********* Current customer name  ********* */
+
+.point-of-sale #rightheader #customer-name{
+    width:200px;
+}
+.point-of-sale #rightheader #remove-customer-button{
+    width:80px;
+}
+
+/*  ********* Customer PopUp  ********* */
+.point-of-sale .modal-dialog .popup-select-customer{
+    margin-left:0;
+    margin-top:0;
+    left:5%;
+    width: 90%;
+    top:5%;
+    height:90%;
+}
+.point-of-sale .modal-dialog .popup-select-customer .customer-header{
+    height:65px;
+}
+
+.point-of-sale .modal-dialog .popup-select-customer #customer-title{
+/*    text-align:left;*/
+}
+.point-of-sale .modal-dialog .popup-select-customer .customer-searchbox{
+    float:left;
+    top: 20px;
+    position: absolute;
+    left: 10px;
+}
+.point-of-sale .modal-dialog .popup-select-customer #customer-cancel{
+    top: 0px;
+    position: absolute;
+    right: 10px;
+}
+/*  ********* Customer List  ********* */
+
+.point-of-sale .customer-list {
+    padding:10px !important;
+}
+
+.point-of-sale .customer-list-container {
+    position:absolute;
+    top:70px;
+    bottom:0px;
+    left:0px;
+    right:0px;
+}
+
+.point-of-sale .customer-list-scroller{
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+        -ms-box-sizing: border-box;
+            box-sizing: border-box;
+    width:100%;
+    height:100%;
+    overflow: hidden;
+}
+
+/*  ********* Customer Scrollbar  ********* */
+/*    Fix incorrect display of buttons.*/
+/*    TODO: found why it is necessary and remove top,bottom and left values*/
+.point-of-sale .customer-list-container .scrollbar .up-button{
+    top: -10px;
+    left: -5px;
+}
+.point-of-sale .customer-list-container .scrollbar .down-button {
+    left: -5px;
+    bottom: -5px;
+}
+
+/*  ********* Customer Item ********* */
+
+.point-of-sale .customer {
+    position:relative;
+    vertical-align: top;
+    display: inline-block;
+    font-size: 11px;
+    margin: 5px !important;
+    width: 200px;
+    height:110px;
+    background:#fff;
+    border: 1px solid #fff;
+    border-radius: 3px;
+    overflow: hidden;
+    -webkit-box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480; 
+       -moz-box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480; 
+            box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480; 
+}
+
+.point-of-sale .customer .customer-name,
+        .point-of-sale .customer .customer-email,
+        .point-of-sale .customer .customer-address,
+        .point-of-sale .customer .customer-phone,
+        .point-of-sale .customer .customer-mobile{
+    position: absolute;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+        -ms-box-sizing: border-box;
+            box-sizing: border-box;
+
+    text-align:left;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    background: -webkit-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1));
+    background:    -moz-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1));
+    background:     -ms-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1));
+    padding: 3px;
+}
+.point-of-sale .customer .customer-name{
+    font-size: 13px;
+    width:100%;
+    top:0px;
+    height: 20px;
+}
+.point-of-sale .customer .customer-email{
+    width:100%;
+    top:24px;
+    height: 16px;
+}
+.point-of-sale .customer .customer-img {
+    position: absolute;
+    top: 44px;
+    left: 0px;
+    width: 64px;
+    height: 64px;
+    background: white;
+    text-align: center;
+}
+.point-of-sale .customer .customer-address{
+    width:135px;
+    top:44px;
+    left: 65px;
+    height: 32px;
+}
+.point-of-sale .customer .customer-phone{
+    width:135px;
+    top:76px;
+    left: 65px;
+    height: 16px;
+}
+.point-of-sale .customer .customer-mobile{
+    width:135px;
+    top:92px;
+    left: 65px;
+    height: 16px;
+}

=== added directory 'pos_select_customer/static/src/img'
=== added file 'pos_select_customer/static/src/img/icon.png'
Binary files pos_select_customer/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and pos_select_customer/static/src/img/icon.png	2014-07-30 11:15:32 +0000 differ
=== added directory 'pos_select_customer/static/src/js'
=== added file 'pos_select_customer/static/src/js/psc.js'
--- pos_select_customer/static/src/js/psc.js	1970-01-01 00:00:00 +0000
+++ pos_select_customer/static/src/js/psc.js	2014-07-30 11:15:32 +0000
@@ -0,0 +1,309 @@
+/******************************************************************************
+    Point Of Sale - Select Customer module for OpenERP
+    Copyright (C) 2014 GRAP (http://www.grap.coop)
+    @author Julien WESTE
+    @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as
+    published by the Free Software Foundation, either version 3 of the
+    License, or (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+******************************************************************************/
+
+openerp.pos_select_customer = function (instance) {
+    module = instance.point_of_sale;
+    _t = instance.web._t;
+
+    /*************************************************************************
+        Define : CustomerOrderWidget that display the name of the customer
+        of the current pos order and display button to select of remove it.
+    */
+    module.CustomerOrderWidget = module.PosBaseWidget.extend({
+        template: 'CustomerOrderWidget',
+
+        /* Overload Section */
+        init: function(parent, options){
+            this._super(parent,options);
+            this.pos.bind('change:selectedOrder', this.refresh, this);
+        },
+
+        start: function(){
+            this._super();
+            this._build_widgets();
+        },
+
+        /* Custom Section */
+        refresh: function(){
+            this.renderElement();
+            this._build_widgets();
+        },
+
+        _build_widgets: function(){
+            // Create a button to open the customer popup
+            this.select_customer_button = new module.HeaderButtonWidget(this,{
+                label:_t('Customer'),
+                action: function(){
+                    self.screen_selector.show_popup('select-customer');
+                },
+            });
+            this.select_customer_button.replace($('.placeholder-SelectCustomerButton'));
+            this.select_customer_button.renderElement();
+
+            if (this.get_name() !== ''){
+                // Create a button to remove the current customer
+                this.remove_customer_button = new module.HeaderButtonWidget(this,{
+                    label:_t('Del.'),
+                    action: function(){
+                        this.pos.get('selectedOrder').set_client(undefined);
+                        this.pos_widget.customer_order.refresh();
+                        this.hide();
+                    },
+                });
+                this.remove_customer_button.replace($('.placeholder-RemoveCustomerButton'));
+                this.remove_customer_button.renderElement();
+            }
+        },
+
+        get_name: function(){
+            customer = this.pos.get('selectedOrder').get_client();
+            if(customer){
+                return customer.name;
+            }else{
+                return "";
+            }
+        },
+    });
+
+    /*************************************************************************
+        Define : CustomerWidget that display a customer
+    */
+    module.CustomerWidget = module.PosBaseWidget.extend({
+        template: 'CustomerWidget',
+
+        /* Overload Section */
+        init: function(parent, options) {
+            this._super(parent,options);
+            this.model = options.model;
+        },
+
+        renderElement: function() {
+            this._super();
+            this.$('img').replaceWith(this.pos_widget.image_cache.get_image(this.model.get_image_small_url()));
+            var self = this;
+            $("a", this.$el).click(function(e){
+                self.pos.get('selectedOrder').set_client(self.model.toJSON());
+                self.pos_widget.customer_order.refresh();
+                self.pos_widget.screen_selector.set_current_screen('products');
+            });
+        },
+    });
+
+    /*************************************************************************
+        Define : CustomerListScreenWidget that display a list of customers.
+    */
+    module.CustomerListScreenWidget = module.ScreenWidget.extend({
+        template:'CustomerListScreenWidget',
+
+        init: function(parent, options) {
+            this._super(parent,options);
+            this.customer_list = [];
+        },
+
+        start: function() {
+            this._super();
+            var self = this;
+        },
+
+        renderElement: function() {
+            this._super();
+            var self = this;
+            // Delete old customers widget and display refreshed customers list
+            for(var i = 0, len = this.customer_list.length; i < len; i++){
+                this.customer_list[i].destroy();
+            }
+            this.customer_list = [];
+            var customers = this.pos.get('customer_list_filter') || [];
+            for(var i = 0, len = customers.models.length; i < len; i++){
+                var customer = new module.CustomerWidget(this, {
+                    model: customers.models[i],
+                    click_product_action: this.click_product_action,
+                });
+                this.customer_list.push(customer);
+                customer.appendTo(this.$('.customer-list'));
+            }
+
+            // Delete old scrollbar widget and display refreshed scrollbar
+            if(this.scrollbar){
+                this.scrollbar.destroy();
+            }
+            this.scrollbar = new module.ScrollbarWidget(this,{
+                target_widget:   this,
+                target_selector: '.customer-list-scroller',
+                on_show: function(){
+                    self.$('.customer-list-scroller').css({'padding-right':'62px'},100);
+                },
+                on_hide: function(){
+                    self.$('.customer-list-scroller').css({'padding-right':'0px'},100);
+                },
+            });
+            this.scrollbar.replace(this.$('.placeholder-ScrollbarWidget'));
+        },
+    }),
+
+    /*************************************************************************
+        Define : SelectCustomerPopupWidget that display a pop up to search
+        and select customers.
+    */
+    module.SelectCustomerPopupWidget = module.PopUpWidget.extend({
+        template:'SelectCustomerPopupWidget',
+        
+        start: function(){
+            this._super();
+            var self = this;
+            this.customer_list_widget = new module.CustomerListScreenWidget(this,{});
+        },
+
+        show: function(){
+            this._super();
+            var self = this;
+            this.reset_customers();
+            this.customer_list_widget.replace($('.placeholder-CustomerListScreenWidget'));
+            this.$('#customer-cancel').off('click').click(function(){
+                self.pos_widget.screen_selector.set_current_screen('products');
+            });
+            // filter customers according to the search string
+            this.$('.customer-searchbox input').keyup(function(event){
+                pattern = $(this).val().toLowerCase();
+                if(pattern){
+                    var customers = self.pos.get('customer_list').search_customer(pattern);
+                    self.pos.set({'customer_list_filter' : customers});
+                    self.$('.customer-search-clear').fadeIn();
+                    self.customer_list_widget.renderElement();
+                }
+                else{
+                    self.reset_customers();
+                }
+            });
+            //reset the search when clicking on reset
+            this.$('.customer-search-clear').click(function(){
+                self.reset_customers();
+            });
+        },
+
+        reset_customers: function(){
+            this.pos.set({'customer_list_filter' : this.pos.get('customer_list')});
+            this.$('.customer-search-clear').fadeOut();
+            this.customer_list_widget.renderElement();
+            this.$('.customer-searchbox input').val('').focus();
+        },
+
+    });
+
+
+    /*************************************************************************
+        Overload : PosWidget to include button in PosOrderHeaderWidget widget
+        to select or unselect customers
+    */
+    module.PosWidget = module.PosWidget.extend({
+
+        build_widgets: function(){
+            this._super();
+            var self = this;
+
+            // Add a widget to manage customer
+            this.customer_order = new module.CustomerOrderWidget(this,{});
+            this.customer_order.appendTo(this.$('#pos_order_header'));
+
+            // create a pop up 'select-customer' to search and select customers
+            this.select_customer_popup = new module.SelectCustomerPopupWidget(this, {});
+            this.select_customer_popup.appendTo($('.point-of-sale'));
+            this.select_customer_popup.hide();
+            this.screen_selector.popup_set['select-customer'] = this.select_customer_popup;
+
+        },
+    });
+
+    /*************************************************************************
+        Define : New Model 'Customer'
+    */
+    module.Customer = Backbone.Model.extend({
+        get_image_small_url: function(){
+            return instance.session.url('/web/binary/image', {model: 'res.partner', field: 'image_small', id: this.get('id')});
+        },
+    });
+
+    module.CustomerCollection = Backbone.Collection.extend({
+        model: module.Customer,
+        
+        search_customer: function(pattern){
+            res = new module.CustomerCollection();
+            var reg = RegExp(pattern,"i");
+            for(var i = 0, len = this.models.length; i < len; i++){
+                res_reg = reg.exec(this.models[i].attributes.name);
+                if (res_reg){
+                    res.push(this.models[i]);
+                }
+            }
+            return res;
+        },
+    });
+
+    /*
+        Overload: PosModel.initialize() to define two new lists.
+        'customer_list' are the list of all customers available;
+        'customer_list_filter' are a sub-list according to the current filter
+        selection.
+    */
+    var _initialize_ = module.PosModel.prototype.initialize;
+    module.PosModel.prototype.initialize = function(session, attributes){
+         _initialize_.call(this, session, attributes);
+        this.set({
+            'customer_list': new module.CustomerCollection(),
+            'customer_list_filter': new module.CustomerCollection(),
+        });
+    };
+
+    /*
+        Overload: PosModel.load_server_data() function to get in memory
+        customers.
+        The function will load all usefull informations even if any
+        informations won't be used in this module, to allow further modules
+        to use them.
+    */
+    var _load_server_data_ = module.PosModel.prototype.load_server_data;
+    module.PosModel.prototype.load_server_data = function(){
+        var self = this;
+        var load_def = _load_server_data_.call(self).done(self.load_customers_data());
+        return load_def;
+    },
+
+    module.PosModel = module.PosModel.extend({
+        load_customers_data: function(){
+            var self = this;
+            var loaded = self.fetch(
+                    'res.partner',
+                    ['name','display_name','title','function','type',
+                    'parent_id','is_company',
+                    'lang','company_id','ean13','color',
+                    'contact_address','street','street2','city','zip','state_id','country_id',
+                    'property_product_pricelist','vat','debit_limit','credit_limit',
+                    'email','website','fax','phone','mobile',],
+                    [['customer', '=', true]])
+                .then(function(customers){
+                    console.log(customers);
+                    self.set({'customer_list' : new module.CustomerCollection(customers)});
+                    self.set({'customer_list_filter' : new module.CustomerCollection(customers)});
+                });
+            return loaded;
+        },
+    });
+};
+

=== added directory 'pos_select_customer/static/src/xml'
=== added file 'pos_select_customer/static/src/xml/psc.xml'
--- pos_select_customer/static/src/xml/psc.xml	1970-01-01 00:00:00 +0000
+++ pos_select_customer/static/src/xml/psc.xml	2014-07-30 11:15:32 +0000
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ********************************************************************** -->
+<!--Point Of Sale - Select Customer module for OpenERP                      -->
+<!--Copyright (C) 2014 GRAP (http://www.grap.coop)                          -->
+<!--@author Julien WESTE                                                    -->
+<!--@author Sylvain LE GAL (https://twitter.com/legalsylvain)               -->
+
+<!--This program is free software: you can redistribute it and/or modify    -->
+<!--it under the terms of the GNU Affero General Public License as          -->
+<!--published by the Free Software Foundation, either version 3 of the      -->
+<!--License, or (at your option) any later version.                         -->
+
+<!--This program is distributed in the hope that it will be useful,         -->
+<!--but WITHOUT ANY WARRANTY; without even the implied warranty of          -->
+<!--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           -->
+<!--GNU Affero General Public License for more details.                     -->
+
+<!--You should have received a copy of the GNU Affero General Public License-->
+<!--along with this program.  If not, see <http://www.gnu.org/licenses/>.   -->
+<!-- ********************************************************************** -->
+<templates id="template" xml:space="preserve">
+
+    <t t-name="CustomerOrderWidget">
+        <div class="extra-label">
+            <span class="placeholder-SelectCustomerButton" />
+        </div>
+        <div id="customer-name" class="extra-label">
+            <div class="extra-text">
+                <t t-esc="widget.get_name()" />
+            </div>
+        </div>
+        <div id="remove-customer-button" class="extra-label">
+            <span class="placeholder-RemoveCustomerButton" />
+        </div>
+    </t>
+
+    <t t-name="SelectCustomerPopupWidget">
+        <div class="modal-dialog">
+            <div class="popup popup-select-customer">
+                <div class="customer-header">
+                    <div id="customer-title">
+                        Customer Selection
+                    </div>
+                    <div class="customer-searchbox">
+                        <input placeholder="Search Customers" />
+                        <img class="customer-search-clear" src="/point_of_sale/static/src/img/search_reset.gif" />
+                    </div>
+                    <div id="customer-cancel" class="button">
+                        Cancel
+                    </div>
+                </div>
+                <div class="content-container">
+                    <span class="placeholder-CustomerListScreenWidget" />
+                </div>
+            </div>
+        </div>
+    </t>
+
+    <t t-name="CustomerListScreenWidget">
+        <div class='customer-list-container'>
+            <div class="customer-list-scroller">
+                <ol id="customer-screen-ol" class="customer-list">
+                </ol>
+            </div>
+            <div class="shadow-top"></div>
+            <span class="placeholder-ScrollbarWidget" />
+        </div>
+    </t>
+
+    <t t-name="CustomerWidget">
+        <li class='customer'>
+            <a href="#">
+                <div class="customer-img">
+                    <img sr='' />
+                </div>
+                <div class="customer-name">
+                    <t t-esc="widget.model.get('name')"/>
+                </div>
+                <div class="customer-email">
+                    <t t-if="widget.model.get('email')">
+                        <t t-esc="widget.model.get('email')"/>
+                    </t>
+                </div>
+                <div class="customer-address">
+                    <t t-if="widget.model.get('contact_address')">
+                        <t t-esc="widget.model.get('contact_address')"/>
+                    </t>
+                </div>
+                <div class="customer-phone">
+                    <t t-if="widget.model.get('phone')">
+                        <t t-esc="widget.model.get('phone')"/>
+                    </t>
+                </div>
+                <div class="customer-mobile">
+                    <t t-if="widget.model.get('mobile')">
+                        <t t-esc="widget.model.get('mobile')"/>
+                    </t>
+                </div>
+            </a>
+        </li>
+    </t>
+
+</templates>


Follow ups