From 3982e3524a1ab8bbe18b931d614fbcb46ece07bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 17 Jul 2012 16:29:23 +0200 Subject: [PATCH 001/132] [FIX] point_of_sale: various css fixes bzr revid: fva@openerp.com-20120717142923-tk4nkp4mdbegcndi --- addons/point_of_sale/static/src/css/pos.css | 3 +++ addons/point_of_sale/static/src/js/pos_scrollbar_widget.js | 1 + 2 files changed, 4 insertions(+) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 0b92dce6504..d90a12b22eb 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -522,6 +522,7 @@ position:relative; vertical-align: top; display: inline-block; + line-height: 100px; font-size: 11px; margin: 5px; width: 120px; @@ -548,6 +549,7 @@ right: 2px; vertical-align: top; color: white; + line-height: 14px; background: #7f82ac; padding: 2px 5px; border-radius: 3px; @@ -561,6 +563,7 @@ box-sizing: border-box; bottom:0; top:auto; + line-height: 14px; width:100%; 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)); diff --git a/addons/point_of_sale/static/src/js/pos_scrollbar_widget.js b/addons/point_of_sale/static/src/js/pos_scrollbar_widget.js index d4f6903c435..7c765028231 100644 --- a/addons/point_of_sale/static/src/js/pos_scrollbar_widget.js +++ b/addons/point_of_sale/static/src/js/pos_scrollbar_widget.js @@ -65,6 +65,7 @@ function openerp_pos_scrollbar(instance, module){ //module is instance.point_of_ this.auto_hide(false); this.$element.bind('mousewheel',function(event,delta){ self.scroll(delta*self.wheel_step); + return false; }); this.$element.bind('click',function(event){ var vpos = event.pageY - self.$element.offset().top; From 1e00d4e9ec1c678f01ea53cb1e53a88b77b975b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 17 Jul 2012 18:25:17 +0200 Subject: [PATCH 002/132] [IMP] point_of_sale: made it easier to change the flux between screens bzr revid: fva@openerp.com-20120717162517-pjsq3x81zfw38siy --- .../static/src/js/pos_screens.js | 42 +++++++++++++------ .../static/src/js/pos_widgets.js | 10 +++-- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/pos_screens.js index eeb45e8a27d..c89228dcc18 100644 --- a/addons/point_of_sale/static/src/js/pos_screens.js +++ b/addons/point_of_sale/static/src/js/pos_screens.js @@ -349,6 +349,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ScaleInviteScreenWidget = module.ScreenWidget.extend({ template:'ScaleInviteScreenWidget', + next_screen:'scale', + previous_screen:'products', + show: function(){ this._super(); var self = this; @@ -359,7 +362,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa var weight = self.pos.proxy.weighting_read_kg(); if(weight > 0.001){ clearInterval(this.intervalID); - self.pos_widget.screen_selector.set_current_screen('scale'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); } },500); @@ -370,7 +373,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa click: function(){ clearInterval(this.intervalID); self.pos.proxy.weighting_end(); - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.previous_screen); } } ); @@ -383,6 +386,10 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ScaleScreenWidget = module.ScreenWidget.extend({ template:'ScaleScreenWidget', + + next_screen: 'products', + previous_screen: 'products', + show: function(){ this._super(); this.renderElement(); @@ -392,7 +399,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa label: 'back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.previous_screen); } }); @@ -401,7 +408,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa icon: '/point_of_sale/static/src/img/icons/png48/validate.png', click: function(){ self.order_product(); - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); }, }); @@ -419,7 +426,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this._super(); this.$('.product-picture').click(function(){ self.order_product(); - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); }); }, get_product: function(){ @@ -458,6 +465,8 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ClientPaymentScreenWidget = module.ScreenWidget.extend({ template:'ClientPaymentScreenWidget', + next_screen: 'welcome', + previous_screen: 'products', show: function(){ this._super(); var self = this; @@ -486,7 +495,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa self.pos.push_order(currentOrder.exportAsJSON()).then(function() { currentOrder.destroy(); self.pos.proxy.transaction_end(); - self.pos_widget.screen_selector.set_current_screen('welcome'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); }); }else if(payment === 'payment_rejected'){ clearInterval(this.intervalID); @@ -501,7 +510,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa click: function(){ //TODO Go to ask for weighting screen clearInterval(this.intervalID); self.pos.proxy.payment_canceled(); - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.previous_screen); } } ); @@ -515,12 +524,14 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.WelcomeScreenWidget = module.ScreenWidget.extend({ template:'WelcomeScreenWidget', + next_screen: 'products', + show_numpad: false, show_leftpane: false, barcode_client_action: function(ean){ this._super(ean); - this.pos_widget.screen_selector.set_current_screen('products'); + this.pos_widget.screen_selector.set_current_screen(self.next_screen); }, show: function(){ @@ -532,6 +543,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ProductScreenWidget = module.ScreenWidget.extend({ template:'ProductScreenWidget', + scale_screen: 'scale_invite', + client_next_screen: 'client_payment', + show_numpad: true, show_leftpane: true, @@ -543,7 +557,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.product_list_widget = new module.ProductListWidget(this,{ click_product_action: function(product){ if(product.get('to_weight') && self.pos.use_scale){ - self.pos_widget.screen_selector.set_current_screen('scale_invite', {product: product}); + self.pos_widget.screen_selector.set_current_screen(self.scale_screen, {product: product}); }else{ self.pos.get('selectedOrder').addProduct(product); } @@ -568,7 +582,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa label: 'pay', icon: '/point_of_sale/static/src/img/icons/png48/go-next.png', click: function(){ - self.pos_widget.screen_selector.set_current_screen('client_payment'); + self.pos_widget.screen_selector.set_current_screen(self.client_next_screen); } }); } @@ -643,6 +657,8 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.PaymentScreenWidget = module.ScreenWidget.extend({ template: 'PaymentScreenWidget', + back_screen: 'products', + next_screen: 'receipt', init: function(parent, options) { this._super(parent,options); this.model = options.model; @@ -664,7 +680,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa label: 'Back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.back_screen); }, }); @@ -682,7 +698,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.pos_widget.payment_screen.set_numpad_state(null); }, back: function() { - this.pos_widget.screen_selector.set_current_screen('products'); + this.pos_widget.screen_selector.set_current_screen(self.back_screen); }, validateCurrentOrder: function() { var self = this; @@ -697,7 +713,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa self.pos.proxy.print_receipt(currentOrder.export_for_printing()); self.pos.get('selectedOrder').destroy(); //finish order and go back to scan screen }else{ - self.pos_widget.screen_selector.set_current_screen('receipt'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); } }); }, diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/pos_widgets.js index b20bee712ee..0ee8cbf519d 100644 --- a/addons/point_of_sale/static/src/js/pos_widgets.js +++ b/addons/point_of_sale/static/src/js/pos_widgets.js @@ -676,6 +676,10 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa self.build_widgets(); + self.screen_selector.set_default_screen(); + + self.pos.barcode_reader.connect(); + instance.webclient.set_content_full_screen(true); if (!self.pos.get('pos_session')) { @@ -700,6 +704,9 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }); }, + + // This method instantiates all the screens, widgets, etc. If you want to add new screens change the + // startup screen, etc, override this method. build_widgets: function() { // -------- Screens --------- @@ -788,9 +795,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa default_mode: this.pos.use_selfcheckout ? 'client' : 'cashier', }); - this.screen_selector.set_default_screen(); - - this.pos.barcode_reader.connect(); }, //FIXME this method is probably not at the right place ... From 3577764184ebe2c6f34e59c8e781f4455882a1a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 17 Jul 2012 18:26:09 +0200 Subject: [PATCH 003/132] [FIX] point_of_sale: removed auto-installation of the module bzr revid: fva@openerp.com-20120717162609-sj48xe8u8k52v4j2 --- addons/point_of_sale/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/point_of_sale/__openerp__.py b/addons/point_of_sale/__openerp__.py index 5e7e5578f72..4c0bb14cc10 100644 --- a/addons/point_of_sale/__openerp__.py +++ b/addons/point_of_sale/__openerp__.py @@ -99,6 +99,6 @@ Main features : 'static/src/css/keyboard.css' ], 'qweb': ['static/src/xml/pos.xml'], - 'auto_install': True, + 'auto_install': False, } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From c94104586517da23fec98b8b50f93fb1ab30556c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Wed, 18 Jul 2012 11:29:54 +0200 Subject: [PATCH 004/132] [IMP] point_of_sale: very very subtle css improvement bzr revid: fva@openerp.com-20120718092954-ww84yaxh1p2cyf1b --- addons/point_of_sale/static/src/css/pos.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index d90a12b22eb..4ec88e02185 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -530,9 +530,9 @@ background:#fff; border: 1px solid #fff; border-radius: 3px; - -webkit-box-shadow: 0px 1px 8px rgba(0,0,0,0.2); - -moz-box-shadow: 0px 1px 8px rgba(0,0,0,0.2); - box-shadow: 0px 1px 8px rgba(0,0,0,0.2); + -webkit-box-shadow: 0px 1px 8px rgba(127,130,172,0.4); + -moz-box-shadow: 0px 1px 8px rgba(127,130,172,0.4); + box-shadow: 0px 1px 8px rgba(127,130,172,0.4); } .point-of-sale .product .product-img { From 6df84daaee48ea46ace902aee121c26aa1b243f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Thu, 19 Jul 2012 17:25:19 +0200 Subject: [PATCH 005/132] [IMP] point_of_sale: removed action bar bzr revid: fva@openerp.com-20120719152519-l6gbweu58fk54ga3 --- addons/point_of_sale/static/src/css/pos.css | 41 +++++++-- .../static/src/js/pos_screens.js | 84 ++++++++++++------ .../static/src/js/pos_widgets.js | 86 ++++++++++++++----- addons/point_of_sale/static/src/xml/pos.xml | 31 ++----- 4 files changed, 163 insertions(+), 79 deletions(-) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 4ec88e02185..b03633e181c 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -156,11 +156,11 @@ } .point-of-sale #rightheader button { - color: black; - height:29px; - margin:2px; + color: #273072; + height:27px; + margin:3px; margin-right:0px; - border: 1px solid black; + border: 1px solid #353A7E; background: #7f82ac; background: -webkit-gradient(linear, left top, left bottom, from(#b2b3d7), to(#7f82ac)); background: -moz-linear-gradient(#b2b3d7, #7f82ac); @@ -187,6 +187,33 @@ font-weight: 900; } +/* c) The session buttons */ + +.point-of-sale #rightheader .header-button{ + float:right; + height:32px; + padding-left:10px; + padding-right:10px; + border-right: 1px solid #3a3a3a; + border-left: 1px solid #3a3a3a; + color:#DDD; + line-height:32px; + text-align:center; + cursor: pointer; + + -webkit-transition-property: background; + -webkit-transition-duration: 0.2s; + -webkit-transition-timing-function: ease-out; +} +.point-of-sale #rightheader .header-button:last-child{ + border-left: 1px solid #3a3a3a; +} +.point-of-sale #rightheader .header-button:hover{ + background: rgba(0,0,0,0.2); + text-shadow: #000 0px 0px 3px; + color:#EEE; +} + /* c) The notifications indicator */ .point-of-sale .oe_pos_synch-notification{ @@ -234,7 +261,8 @@ left:0; width:440px; top:0px; - bottom:105px; + /*bottom:105px;*/ + bottom:0; border-right: solid 1px #CECBCB; background-color: white; } @@ -318,7 +346,8 @@ .point-of-sale #rightpane { position: absolute; top: 0; - bottom: 105px; + /*bottom: 105px;*/ + bottom:0; left: 440px; right: 0; vertical-align: top; diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/pos_screens.js index c89228dcc18..93e25ab21dc 100644 --- a/addons/point_of_sale/static/src/js/pos_screens.js +++ b/addons/point_of_sale/static/src/js/pos_screens.js @@ -152,14 +152,6 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.pos_widget.screen_selector.show_popup('help'); }, - logout_button_action: function(){ - this.pos_widget.screen_selector.set_user_mode('client'); - }, - - close_button_action: function(){ - this.pos_widget.try_close(); - }, - barcode_product_screen: 'products', //if defined, this screen will be loaded when a product is scanned barcode_product_error_popup: 'error', //if defined, this popup will be loaded when there's an error in the popup @@ -223,6 +215,29 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa } }, + // shows an action bar on the screen. The actionbar is automatically shown when you add a button + // with add_action_button() + show_action_bar: function(){ + this.pos_widget.action_bar.show(); + this.$element.css({'bottom':'105px'}); + }, + + // hides the action bar. The actionbar is automatically hidden when it is empty + hide_action_bar: function(){ + this.pos_widget.action_bar.hide(); + this.$element.css({'bottom':'0px'}); + }, + + // adds a new button to the action bar. The button definition takes three parameters, all optional : + // - label: the text below the button + // - icon: a small icon that will be shown + // - click: a callback that will be executed when the button is clicked. + // the method returns a reference to the button widget, and automatically show the actionbar. + add_action_button: function(button_def){ + this.show_action_bar(); + return this.pos_widget.action_bar.add_new_button(button_def); + }, + // this method shows the screen and sets up all the widget related to this screen. Extend this method // if you want to alter the behavior of the screen. show: function(){ @@ -231,15 +246,30 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.$element.show(); } + if(this.pos_widget.action_bar.get_button_count() > 0){ + this.show_action_bar(); + }else{ + this.hide_action_bar(); + } + var self = this; var cashier_mode = this.pos_widget.screen_selector.get_user_mode() === 'cashier'; this.pos_widget.set_numpad_visible(this.show_numpad && cashier_mode); this.pos_widget.set_leftpane_visible(this.show_leftpane); this.pos_widget.set_cashier_controls_visible(cashier_mode); - this.pos_widget.action_bar.set_element_visible('help-button', !cashier_mode, function(){ self.help_button_action(); }); - this.pos_widget.action_bar.set_element_visible('logout-button', cashier_mode && this.pos.use_selfcheckout, function(){ self.logout_button_action(); }); - this.pos_widget.action_bar.set_element_visible('close-button', cashier_mode, function(){ self.close_button_action(); }); + /*this.pos_widget.action_bar.set_element_visible('help-button', !cashier_mode, function(){ self.help_button_action(); });*/ + + if(cashier_mode && this.pos.use_selfcheckout){ + this.pos_widget.client_button.show(); + }else{ + this.pos_widget.client_button.hide(); + } + if(cashier_mode){ + this.pos_widget.close_button.show(); + }else{ + this.pos_widget.close_button.hide(); + } this.pos_widget.username.set_user_mode(this.pos_widget.screen_selector.get_user_mode()); @@ -251,7 +281,6 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa }); }, - // this method is called when the screen is closed to make place for a new screen. this is a good place // to put your cleanup stuff as it is guaranteed that for each show() there is one and only one close() close: function(){ @@ -366,8 +395,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa } },500); - this.pos_widget.action_bar.add_new_button( - { + this.add_action_button({ label: 'back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ @@ -375,8 +403,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa self.pos.proxy.weighting_end(); self.pos_widget.screen_selector.set_current_screen(self.previous_screen); } - } - ); + }); }, close: function(){ this._super(); @@ -395,7 +422,8 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.renderElement(); var self = this; - this.pos_widget.action_bar.add_new_button({ + + this.add_action_button({ label: 'back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ @@ -403,7 +431,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa } }); - this.validate_button = this.pos_widget.action_bar.add_new_button({ + this.validate_button = this.add_action_button({ label: 'Validate', icon: '/point_of_sale/static/src/img/icons/png48/validate.png', click: function(){ @@ -465,8 +493,10 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ClientPaymentScreenWidget = module.ScreenWidget.extend({ template:'ClientPaymentScreenWidget', + next_screen: 'welcome', previous_screen: 'products', + show: function(){ this._super(); var self = this; @@ -503,17 +533,15 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa } },500); - this.pos_widget.action_bar.add_new_button( - { + this.add_action_button({ label: 'back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', - click: function(){ //TODO Go to ask for weighting screen + click: function(){ clearInterval(this.intervalID); self.pos.proxy.payment_canceled(); self.pos_widget.screen_selector.set_current_screen(self.previous_screen); } - } - ); + }); }, close: function(){ this._super(); @@ -578,7 +606,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa } if(this.pos_widget.screen_selector.current_mode === 'client'){ - this.pos_widget.action_bar.add_new_button({ + this.add_action_button({ label: 'pay', icon: '/point_of_sale/static/src/img/icons/png48/go-next.png', click: function(){ @@ -618,13 +646,13 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this._super(); var self = this; - this.pos_widget.action_bar.add_new_button({ + this.add_action_button({ label: 'Print', icon: '/point_of_sale/static/src/img/icons/png48/printer.png', click: function(){ self.print(); }, }); - this.pos_widget.action_bar.add_new_button({ + this.add_action_button({ label: 'Next Order', icon: '/point_of_sale/static/src/img/icons/png48/go-next.png', click: function() { self.finishOrder(); }, @@ -676,7 +704,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.set_numpad_state(this.pos_widget.numpad.state); - this.back_button = this.pos_widget.action_bar.add_new_button({ + this.back_button = this.add_action_button({ label: 'Back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ @@ -684,7 +712,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa }, }); - this.validate_button = this.pos_widget.action_bar.add_new_button({ + this.validate_button = this.add_action_button({ label: 'Validate', icon: '/point_of_sale/static/src/img/icons/png48/validate.png', click: function(){ diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/pos_widgets.js index 0ee8cbf519d..a8948437f2c 100644 --- a/addons/point_of_sale/static/src/js/pos_widgets.js +++ b/addons/point_of_sale/static/src/js/pos_widgets.js @@ -112,7 +112,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa template:'OrderWidget', init: function(parent, options) { this._super(parent,options); - this.compact = false; + this.compact = options.compact !== undefined ? options.compact : true; this.set_numpad_state(options.numpadState); this.pos.bind('change:selectedOrder', this.change_selected_order, this); this.bind_orderline_events(); @@ -166,6 +166,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this._super(); if(!this.compact){ + console.log('not compact'); $('.point-of-sale .order-container').css({'bottom':'0px'}); } @@ -212,6 +213,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.$('.summary .value.total').html(this.format_currency(total)); }, set_compact: function(compact){ + console.log('set_compact',compact); if(this.compact !== compact){ this.compact = compact; this.renderElement(); @@ -313,6 +315,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa module.ActionButtonWidget = instance.web.Widget.extend({ template:'ActionButtonWidget', + icon_template:'ActionButtonWidgetWithIcon', init: function(parent, options){ this._super(parent, options); this.label = options.label || 'button'; @@ -320,7 +323,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.click_action = options.click; if(options.icon){ this.icon = options.icon; - this.template = 'ActionButtonWidgetWithIcon'; + this.template = this.icon_template; } }, renderElement: function(){ @@ -359,18 +362,20 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.button_list = []; return this; }, + get_button_count: function(){ + return this.button_list.length; + }, add_new_button: function(button_options){ - if(arguments.length == 1){ - var button = new module.ActionButtonWidget(this,button_options); - this.button_list.push(button); - button.appendTo($('.pos-actionbar-button-list')); - return button; - }else{ - for(var i = 0; i < arguments.length; i++){ - this.add_new_button(arguments[i]); - } - } - return undefined; + var button = new module.ActionButtonWidget(this,button_options); + this.button_list.push(button); + button.appendTo($('.pos-actionbar-button-list')); + return button; + }, + show:function(){ + this.$element.show(); + }, + hide:function(){ + this.$element.hide(); }, }); @@ -419,14 +424,10 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this._super(); var hasimages = false; //if none of the subcategories have images, we don't display buttons with icons - console.log('barfoo'); - _.each(this.subcategories, function(category){ if(category.category_image_small){ - console.log("Image:",category.category_image_small); hasimages = true; }else{ - console.log('NoImage:',category.category_image_small); } }); @@ -603,14 +604,35 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }, }); + module.HeaderButtonWidget = module.PosBaseWidget.extend({ + template: 'HeaderButtonWidget', + init: function(parent, options){ + options = options || {}; + this._super(parent, options); + this.action = options.action; + this.label = options.label; + }, + renderElement: function(){ + var self = this; + this._super(); + if(this.action){ + this.$element.click(function(){ self.action(); }); + } + }, + show: function(){ this.$element.show(); }, + hide: function(){ this.$element.hide(); }, + + }); + + // ---------- Main Point of Sale Widget ---------- // this is used to notify the user that data is being synchronized on the network module.SynchNotificationWidget = module.PosBaseWidget.extend({ template: "SynchNotificationWidget", - init: function(parent,options) { + init: function(parent, options){ options = options || {}; - this._super(parent,options); + this._super(parent, options); }, renderElement: function() { var self = this; @@ -652,6 +674,14 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.leftpane_visible = true; this.leftpane_width = '440px'; this.cashier_controls_visible = true; + var degree = 0; + /* + //Epileptic mode + setInterval(function(){ + $('body').css({'-webkit-filter':'sepia('+Math.round(Math.random())+') hue-rotate('+Math.random()*360+'deg) blur('+Math.random()*5+'px)' }); + },100); + */ + }, start: function() { @@ -708,6 +738,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // This method instantiates all the screens, widgets, etc. If you want to add new screens change the // startup screen, etc, override this method. build_widgets: function() { + var self = this; // -------- Screens --------- @@ -749,13 +780,13 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // -------- Misc --------- this.notification = new module.SynchNotificationWidget(this,{}); - this.notification.replace(this.$('.placeholder-SynchNotificationWidget')); + this.notification.appendTo(this.$('#rightheader')); this.username = new module.UsernameWidget(this,{}); this.username.replace(this.$('.placeholder-UsernameWidget')); this.action_bar = new module.ActionBarWidget(this); - this.action_bar.appendTo($(".point-of-sale #content")); + this.action_bar.appendTo($(".point-of-sale #rightpane")); this.paypad = new module.PaypadWidget(this, {}); this.paypad.replace($('#placeholder-PaypadWidget')); @@ -770,6 +801,19 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa 'keyboard_model': 'simple' }); this.onscreen_keyboard.appendTo($(".point-of-sale #content")); + + this.close_button = new module.HeaderButtonWidget(this,{ + label:'Close', + action: function(){ self.try_close(); }, + }); + this.close_button.appendTo(this.$('#rightheader')); + + this.client_button = new module.HeaderButtonWidget(this,{ + label:'Self-Checkout', + action: function(){ self.screen_selector.set_user_mode('client'); }, + }); + this.client_button.appendTo(this.$('#rightheader')); + // -------- Screen Selector --------- diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index 441189dae24..b690f6ebe6b 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -15,7 +15,7 @@
    - +
    @@ -44,6 +44,12 @@
    + +
    + +
    +
    +
    There are pending operations that could not be saved into the database, are you sure you want to exit?
    @@ -531,30 +537,7 @@
    -
    -
    -
    - -
    Help
    -
    -
    -
    -
    - -
    Close
    -
    -
    -
    -
    - -
    Client Mode
    -
    -
    -
      -
    From 48f50f9944f72128119d48bea12670899919bcee Mon Sep 17 00:00:00 2001 From: "Dharti Ratani (OpenERP)" Date: Fri, 20 Jul 2012 18:50:03 +0530 Subject: [PATCH 006/132] Adding a rng for label in digram view bzr revid: dhr@tinyerp.com-20120720132003-kq0ikv9b6ewkasxx --- openerp/addons/base/rng/view.rng | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openerp/addons/base/rng/view.rng b/openerp/addons/base/rng/view.rng index c583040495b..8f7b2647237 100644 --- a/openerp/addons/base/rng/view.rng +++ b/openerp/addons/base/rng/view.rng @@ -184,6 +184,9 @@ + + + From bf7e2b0e762601f5aa2c54323158585649c3d7ac Mon Sep 17 00:00:00 2001 From: "Dharti Ratani (OpenERP)" Date: Fri, 20 Jul 2012 18:54:14 +0530 Subject: [PATCH 007/132] Modifying diagram view to set label in diagram header bzr revid: dhr@tinyerp.com-20120720132414-pdftmig39m3ro93b --- addons/web_diagram/static/src/js/diagram.js | 13 +++++++++++++ addons/web_diagram/static/src/xml/base_diagram.xml | 1 + 2 files changed, 14 insertions(+) diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index f06e757f7f1..e7e85eea96a 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -51,6 +51,9 @@ instance.web.DiagramView = instance.web.View.extend({ var action = $(this).data('pager-action'); self.on_pager_action(action); }); + this.labels = _.filter(this.fields_view.arch.children, function(label){ + return label.tag == "label" ; + }); this.do_update_pager(); @@ -104,11 +107,21 @@ instance.web.DiagramView = instance.web.View.extend({ ); }, + get_label : function(){ + var self = this + var html_label = _.each(self.labels,function(label){ + html_label = "" + label.attrs.string + "" + self.$element.find('.oe_diagram_diagram_header').append(html_label) + }) + + }, + on_diagram_loaded: function(record) { var id_record = record['id']; if(id_record) { this.id = id_record; this.get_diagram_info(); + this.get_label(); } }, diff --git a/addons/web_diagram/static/src/xml/base_diagram.xml b/addons/web_diagram/static/src/xml/base_diagram.xml index 96e32f59648..40a98a59413 100644 --- a/addons/web_diagram/static/src/xml/base_diagram.xml +++ b/addons/web_diagram/static/src/xml/base_diagram.xml @@ -14,6 +14,7 @@
    +
    From 7a1cee1401bf7c5ea97981a69b4f25a0601ba1bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Fri, 20 Jul 2012 17:24:21 +0200 Subject: [PATCH 008/132] [IMP] point_of_sale: refactored the ean checksum method bzr revid: fva@openerp.com-20120720152421-lfq05r6xkczl1y56 --- addons/product/product.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/addons/product/product.py b/addons/product/product.py index 3cbff880cf9..c50ad3c27b9 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -30,15 +30,10 @@ from tools.translate import _ def is_pair(x): return not x%2 -def check_ean(eancode): - if not eancode: - return True +def ean_checksum(eancode): + """returns the checksum of an ean string of length 13, returns -1 if the string has the wrong length""" if len(eancode) <> 13: - return False - try: - int(eancode) - except: - return False + return -1 oddsum=0 evensum=0 total=0 @@ -54,10 +49,20 @@ def check_ean(eancode): total=(oddsum * 3) + evensum check = int(10 - math.ceil(total % 10.0)) %10 + return check - if check != int(eancode[-1]): +def check_ean(eancode): + """returns True if eancode is a valid ean13 string, or null""" + if not eancode: + return True + if len(eancode) <> 13: return False - return True + try: + int(eancode) + except: + return False + return ean_checksum(eancode) == int(eancode[-1]) + #---------------------------------------------------------- # UOM #---------------------------------------------------------- From f1fbf44b5c9ae1275c9fb9e6a5c1ef8e337742a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Fri, 20 Jul 2012 19:00:12 +0200 Subject: [PATCH 009/132] [WIP] point_of_sale: barcode validation wizard (wip) bzr revid: fva@openerp.com-20120720170012-eqp81clbpbfsr3hl --- addons/point_of_sale/point_of_sale.py | 38 ++++++++++++------ addons/point_of_sale/point_of_sale_view.xml | 44 +++++++++++++++------ addons/product/product.py | 13 ++++++ 3 files changed, 70 insertions(+), 25 deletions(-) diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index ed3fa9c1730..d86d4c3d8ad 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -22,6 +22,7 @@ import pdb import io import openerp import addons +import openerp.addons.product.product import time from datetime import datetime @@ -143,8 +144,6 @@ class pos_config(osv.osv): obj.sequence_id.unlink() return super(pos_config, self).unlink(cr, uid, ids, context=context) -pos_config() - class pos_session(osv.osv): _name = 'pos.session' _order = 'id desc' @@ -425,8 +424,6 @@ class pos_session(osv.osv): 'context' : context, } -pos_session() - class pos_order(osv.osv): _name = "pos.order" _description = "Point of Sale" @@ -1038,8 +1035,6 @@ class pos_order(osv.osv): self.create_account_move(cr, uid, ids, context=context) return True -pos_order() - class account_bank_statement(osv.osv): _inherit = 'account.bank.statement' _columns= { @@ -1138,8 +1133,6 @@ class pos_order_line(osv.osv): }) return super(pos_order_line, self).copy_data(cr, uid, id, default, context=context) -pos_order_line() - class pos_category(osv.osv): _name = 'pos.category' _description = "Point of Sale Category" @@ -1211,12 +1204,24 @@ class pos_category(osv.osv): # 'category_image': _get_default_image, #} -pos_category() - import io, StringIO +class ean_wizard(osv.osv_memory): + _name = 'pos.ean_wizard' + _columns = { + 'ean13_pattern': fields.char('Ean13 Pattern', size=32, required=True, translate=True), + } + def sanitize_ean13(self, cr, uid, ids, context): + for r in self.browse(cr,uid,ids): + ean13 = openerp.addons.product.product.sanitize_ean13(r.ean13_pattern) + m = context.get('active_model') + m_id = context.get('active_id') + self.pool.get(m).write(cr,uid,[m_id],{'ean13':ean13}) + class product_product(osv.osv): _inherit = 'product.product' + + def _get_small_image(self, cr, uid, ids, prop, unknow_none, context=None): result = {} for obj in self.browse(cr, uid, ids, context=context): @@ -1247,7 +1252,16 @@ class product_product(osv.osv): 'to_weight' : False, } -product_product() - + def add_ean13(self, cr, uid, ids, context): + return { + 'name': _('Return Products'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'pos.ean_wizard', + 'target' : 'new', + 'view_id': False, + 'context':context, + } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index f3b491116b7..1145189b408 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -618,12 +618,22 @@ form - - - - - - + + + + + + + + + + + + + + +
    -
    +
    Change: @@ -269,6 +269,9 @@

    Please scan an item or your member card

    +
    +

    Thank you for shopping with us.

    +
    From 7dabfe49eaa00d42649910af355811c6c2fd2512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 30 Jul 2012 17:42:28 +0200 Subject: [PATCH 023/132] [FIX] point_of_sale: removing useless console.log bzr revid: fva@openerp.com-20120730154228-5vabk5qyvjez9dgk --- addons/point_of_sale/static/src/js/pos_screens.js | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/pos_screens.js index f79b60052c0..07f1071fa6d 100644 --- a/addons/point_of_sale/static/src/js/pos_screens.js +++ b/addons/point_of_sale/static/src/js/pos_screens.js @@ -581,7 +581,6 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa var self = this; $('.goodbye-message').css({opacity:1}).show(); setTimeout(function(){ - console.log('kill'); $('.goodbye-message').animate({opacity:0},500,'swing',function(){$('.goodbye-message').hide();}); },3000); }, From 03a3533dc5519e15b3725e037c4017732dca7181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Thu, 2 Aug 2012 16:18:01 +0200 Subject: [PATCH 024/132] [WIP] point_of_sale: IndexedDB Backend bzr revid: fva@openerp.com-20120802141801-hpjqwkwlooqdaddu --- addons/point_of_sale/static/src/js/db.js | 66 ++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 addons/point_of_sale/static/src/js/db.js diff --git a/addons/point_of_sale/static/src/js/db.js b/addons/point_of_sale/static/src/js/db.js new file mode 100644 index 00000000000..86ad9a53a59 --- /dev/null +++ b/addons/point_of_sale/static/src/js/db.js @@ -0,0 +1,66 @@ +function openerp_pos_db(instance, module){ + function importIndexedDB(){ + if('indexedDB' in window){ + return true; + }else if('webkitIndexedDB' in window){ + window.indexedDB = window.webkitIndexedDB; + window.IDBCursor = window.webkitIDBCursor; + window.IDBDatabase = window.webkitIDBDatabase; + window.IDBDatabaseError = window.webkitIDBDatabaseError; + window.IDBDatabaseException = window.webkitIDBDatabaseException; + window.IDBFactory = window.webkitIDBFactory; + window.IDBIndex = window.webkitIDBIndex; + window.IDBKeyRange = window.webkitIDBKeyRange; + window.IDBObjectSrore = window.webkitIDBOjbectStore; + window.IDBRequest = window.webkitIDBRequest; + window.IDBTransaction = window.webkitIDBTransaction; + }else if('mozIndexedDB' in window){ + window.indexedDB = window.mozIndexedDB; + }else{ + throw new Error("DATABASE ERROR: IndexedDB not implemented. Please upgrade your web browser"); + } + } + importIndexedDB(); + + modula.PosDB = modula.Class.extend({ + + state: 'connecting', // 'connecting' || 'connected' || 'failed' + version: 1, + name: 'openerp_pos_db', + + init: function(options){ + var open_request = indexedDB.open(this.name, this.version); + }, + upgrade_db: function(oldversion, transaction){ + this.db = transaction.db; + var productStore = this.db.createObjectStore("products", {keyPath: "id"}); + + productStore.createIndex("ean13", "ean13", {unique:true}); + + productStore.createIndex("name", "name", {unique:false}); + + productStore.createIndex("category","category", {unique:false}); + + var imageStore = this.db.createObjectStore("images", {keyPath: "id"}); + + imageStore.createIndex("product_id", "product_id", {unique:true}); + }, + _add_data: function(store, data, result_callback){ + var transaction = this.db.transaction([store], IDBTransaction.READ_WRITE); + + transaction.oncomplete = function(event){ if(result_callback){ result_callback(event); }}; + + }, + add_product: function(product){ + }, + get_product_by_ean: function(ean, result_callback){ + }, + get_product_by_category: function(category, result_callback){ + }, + get_product_image: function(product, result_callback){ + }, + search_product: function(query,result_callback){ + }, + }); + +} From 996183acf719efb7bf44cef3c9709cedc866a0d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 6 Aug 2012 17:40:54 +0200 Subject: [PATCH 025/132] [WIP] point_of_sale: indexedDB backend bzr revid: fva@openerp.com-20120806154054-1yubgy8o8wwlc5b8 --- addons/point_of_sale/__openerp__.py | 1 + addons/point_of_sale/static/src/js/db.js | 66 ------------------- .../point_of_sale/static/src/js/pos_main.js | 2 + .../point_of_sale/static/src/js/pos_models.js | 1 + .../static/src/js/pos_widgets.js | 2 + 5 files changed, 6 insertions(+), 66 deletions(-) delete mode 100644 addons/point_of_sale/static/src/js/db.js diff --git a/addons/point_of_sale/__openerp__.py b/addons/point_of_sale/__openerp__.py index 9d985d40408..c4258511a68 100644 --- a/addons/point_of_sale/__openerp__.py +++ b/addons/point_of_sale/__openerp__.py @@ -86,6 +86,7 @@ Main features: 'js': [ 'static/lib/backbone/backbone-0.9.2.js', 'static/lib/mousewheel/jquery.mousewheel-3.0.6.js', + 'static/src/js/pos_db.js', 'static/src/js/pos_models.js', 'static/src/js/pos_basewidget.js', 'static/src/js/pos_keyboard_widget.js', diff --git a/addons/point_of_sale/static/src/js/db.js b/addons/point_of_sale/static/src/js/db.js deleted file mode 100644 index 86ad9a53a59..00000000000 --- a/addons/point_of_sale/static/src/js/db.js +++ /dev/null @@ -1,66 +0,0 @@ -function openerp_pos_db(instance, module){ - function importIndexedDB(){ - if('indexedDB' in window){ - return true; - }else if('webkitIndexedDB' in window){ - window.indexedDB = window.webkitIndexedDB; - window.IDBCursor = window.webkitIDBCursor; - window.IDBDatabase = window.webkitIDBDatabase; - window.IDBDatabaseError = window.webkitIDBDatabaseError; - window.IDBDatabaseException = window.webkitIDBDatabaseException; - window.IDBFactory = window.webkitIDBFactory; - window.IDBIndex = window.webkitIDBIndex; - window.IDBKeyRange = window.webkitIDBKeyRange; - window.IDBObjectSrore = window.webkitIDBOjbectStore; - window.IDBRequest = window.webkitIDBRequest; - window.IDBTransaction = window.webkitIDBTransaction; - }else if('mozIndexedDB' in window){ - window.indexedDB = window.mozIndexedDB; - }else{ - throw new Error("DATABASE ERROR: IndexedDB not implemented. Please upgrade your web browser"); - } - } - importIndexedDB(); - - modula.PosDB = modula.Class.extend({ - - state: 'connecting', // 'connecting' || 'connected' || 'failed' - version: 1, - name: 'openerp_pos_db', - - init: function(options){ - var open_request = indexedDB.open(this.name, this.version); - }, - upgrade_db: function(oldversion, transaction){ - this.db = transaction.db; - var productStore = this.db.createObjectStore("products", {keyPath: "id"}); - - productStore.createIndex("ean13", "ean13", {unique:true}); - - productStore.createIndex("name", "name", {unique:false}); - - productStore.createIndex("category","category", {unique:false}); - - var imageStore = this.db.createObjectStore("images", {keyPath: "id"}); - - imageStore.createIndex("product_id", "product_id", {unique:true}); - }, - _add_data: function(store, data, result_callback){ - var transaction = this.db.transaction([store], IDBTransaction.READ_WRITE); - - transaction.oncomplete = function(event){ if(result_callback){ result_callback(event); }}; - - }, - add_product: function(product){ - }, - get_product_by_ean: function(ean, result_callback){ - }, - get_product_by_category: function(category, result_callback){ - }, - get_product_image: function(product, result_callback){ - }, - search_product: function(query,result_callback){ - }, - }); - -} diff --git a/addons/point_of_sale/static/src/js/pos_main.js b/addons/point_of_sale/static/src/js/pos_main.js index 71ac69c6067..b9263b91314 100644 --- a/addons/point_of_sale/static/src/js/pos_main.js +++ b/addons/point_of_sale/static/src/js/pos_main.js @@ -5,6 +5,8 @@ openerp.point_of_sale = function(instance) { var module = instance.point_of_sale; + openerp_pos_db(instance,module); // import db.js + openerp_pos_models(instance,module); // import pos_models.js openerp_pos_basewidget(instance,module); // import pos_basewidget.js diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js index 548b6b749f9..634e0d9b862 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/pos_models.js @@ -74,6 +74,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal this.weightable_categories = []; // a flat list of all categories that directly contain weightable products this.barcode_reader = new module.BarcodeReader({'pos': this}); // used to read barcodes this.proxy = new module.ProxyDevice(); // used to communicate to the hardware devices via a local proxy + this.db = new module.PosDB(); // a database used to store the products and product images // pos settings this.use_scale = false; diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/pos_widgets.js index b41ccbfcc9a..a30a0ebe521 100644 --- a/addons/point_of_sale/static/src/js/pos_widgets.js +++ b/addons/point_of_sale/static/src/js/pos_widgets.js @@ -968,12 +968,14 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }); }, close: function() { + var self = this; this.pos.barcode_reader.disconnect(); return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_close_statement']], ['res_id']).pipe( _.bind(function(res) { return this.rpc('/web/action/load', {'action_id': res[0]['res_id']}).pipe(_.bind(function(result) { var action = result.result; action.context = _.extend(action.context || {}, {'cancel_action': {type: 'ir.actions.client', tag: 'reload'}}); + //self.destroy(); this.do_action(action); }, this)); }, this)); From dc8f543d17a7840b6c02729c2649d0bb37538710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 7 Aug 2012 18:18:44 +0200 Subject: [PATCH 026/132] [WIP] point_of_sale: indexeddb : compatible localstorage backend. + anthony's modifications to the views... bzr revid: fva@openerp.com-20120807161844-hd7ioxipnc6794jf --- addons/point_of_sale/point_of_sale_view.xml | 62 +-- addons/point_of_sale/static/src/js/pos_db.js | 466 ++++++++++++++++++ .../point_of_sale/static/src/js/pos_models.js | 2 +- .../wizard/pos_session_opening.xml | 2 +- 4 files changed, 487 insertions(+), 45 deletions(-) create mode 100644 addons/point_of_sale/static/src/js/pos_db.js diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 6a43cec39be..9aa9c095f65 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -3,10 +3,6 @@ - Others @@ -155,9 +151,6 @@ - - - Products @@ -170,10 +163,7 @@ You must define a Product for everything you buy or sell. Products can be raw materials, stockable products, consumables or services. The Product form contains detailed information about your products related to procurement logistics, sales price, product category, suppliers and so on. - + Sale lines @@ -673,11 +663,8 @@ tree,form - - Payment Methods @@ -689,10 +676,6 @@ Payment methods are defined by accounting journals having the field Payment Method checked. - POS Sales Lines @@ -716,9 +699,6 @@ - - - Invoices @@ -729,8 +709,6 @@ [('origin','like','POS')] - Start Point of Sale @@ -848,11 +826,6 @@ - - - - - pos.order.list.select pos.order @@ -1034,7 +993,6 @@ - pos.ean_wizard @@ -1050,6 +1008,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/addons/point_of_sale/static/src/js/pos_db.js b/addons/point_of_sale/static/src/js/pos_db.js new file mode 100644 index 00000000000..a38457a9f8d --- /dev/null +++ b/addons/point_of_sale/static/src/js/pos_db.js @@ -0,0 +1,466 @@ +/** + * This file contains an IndexedDB (html5 database) backend for the Point Of Sale. + * The IDB is used to store the list of products and especially their thumbnails, which may + * not fit in the localStorage. + * The IDB offers a big performance boost for products lookup, but not so much for search as + * searching is not yet implemented in the IndexedDB API and must be performed manually in JS. + * + */ +function openerp_pos_db(instance, module){ + + // this is used for testing + window.gen_products = function(options){ + options = options || {}; + var count = options.count || 100; + var imageSize = options.imageSize || 1800; + + var imagedata = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']; + + function gen_image(){ + var image = ''; + for(var i = 0; i < imageSize; i++){ + image += imagedata[Math.floor(Math.random()*imagedata.length)]; + } + return image; + } + + var categories = [ 'drinks', 'food', 'beers', 'meat', 'fruits', 'candy', 'bread', 'fruity beers', 'tea', 'coffee' ]; + var syllabes = [ + 'ko','no','mo','ro','do','so','ho','to','yo', + 'ke','ne','me','re','de','se','he','te','ye', + 'ki','ni','mi','ri','di','si','hi','ti','yi', + 'ku','nu','mu','ru','du','su','hu','tu','yu', + 'ka','na','ma','ra','da','sa','ha','ta','ya', + ' ', '-', '!', ' ', ' ', '-', ' ', ' ', ' ', + ]; + var id = 1284; + var ean = 845923; + + function gen_product(){ + var name = ''; + var sc = Math.ceil(Math.random()*10); + for(var i = 0; i < sc; i++){ + name = name + syllabes[Math.floor(Math.random()*syllabes.length)]; + } + return { + id: ''+(id++), + price: Math.random()*100, + ean13:''+(ean++), + name: name, + category: categories[Math.floor(Math.random()*categories.length)], + product_image_small: gen_image(), + }; + } + + var products = []; + for(var i = 0; i < count; i++){ + products.push(gen_product()); + } + return products; + }; + + //this is used for testing + window.log = function(x){ + console.log(x); + }; + + function importIndexedDB(){ + if('indexedDB' in window){ + return true; + }else if('webkitIndexedDB' in window){ + window.indexedDB = window.webkitIndexedDB; + window.IDBCursor = window.webkitIDBCursor; + window.IDBDatabase = window.webkitIDBDatabase; + window.IDBDatabaseError = window.webkitIDBDatabaseError; + window.IDBDatabaseException = window.webkitIDBDatabaseException; + window.IDBFactory = window.webkitIDBFactory; + window.IDBIndex = window.webkitIDBIndex; + window.IDBKeyRange = window.webkitIDBKeyRange; + window.IDBObjectSrore = window.webkitIDBOjbectStore; + window.IDBRequest = window.webkitIDBRequest; + window.IDBTransaction = window.webkitIDBTransaction; + }else if('mozIndexedDB' in window){ + window.indexedDB = window.mozIndexedDB; + }else{ + throw new Error("DATABASE ERROR: IndexedDB not implemented. Please upgrade your web browser"); + } + } + importIndexedDB(); + + module.PosDB = instance.web.Class.extend({ + + version: 1, + name: 'openerp_pos_db', + limit: 50, + + init: function(options){ + var self = this; + options = options || {}; + + this.version = options.version || this.version; + this.name = options.name || this.name; + + var open_request = indexedDB.open(this.name, this.version); + + open_request.onblocked = function(event){ + throw new Error("DATABASE ERROR: request blocked."); + }; + + // new API (firefox) + open_request.onupgradeneeded = function(event){ + console.log('using new API'); + var transaction = open_request.transaction; + self._upgrade_db(event.oldVersion,transaction); + }; + + open_request.onsuccess = function(event){ + console.log('db',self.db); + self.db = open_request.result; + var oldVersion = Number(self.db.version); + + if(oldVersion !== self.version){ + // if we get to this point, it means that onupgradeneeded hasn't been called. + // so we try the old api (webkit) + if(!self.db.setVersion){ + throw new Error("DATABASE ERROR: database API is broken. Your web browser is probably out of date"); + } + console.log('using old API'); + var version_request = self.db.setVersion(self.version); + version_request.onsuccess = function(event){ + var transaction = version_request.result; + self._upgrade_db(oldVersion, transaction); + }; + } + }; + }, + _upgrade_db: function(oldversion, transaction){ + console.log('upgrade_db:',oldversion); + + this.db = transaction.db; + var productStore = this.db.createObjectStore('products', {keyPath: 'id'}); + + productStore.createIndex('ean13', 'ean13', {unique:true}); + + productStore.createIndex('name', 'name', {unique:false}); + + productStore.createIndex('category','category', {unique:false}); + + var imageStore = this.db.createObjectStore('images', {keyPath: 'id'}); + }, + + _add_data: function(store, data){ + var transaction = this.db.transaction([store], 'readwrite'); + var objectStore = transaction.objectStore(store); + var request = objectStore.put(data); + }, + /* adds a product to the database, replacing the original product if it is already present. + * the product must be provided as a json as returned by the openerp backend + */ + add_product: function(product){ + if(product instanceof Array){ + for(var i = 0, len = product.length; i < len; i++){ + this.add_product(product[i]); + } + }else{ + if(product.product_image_small){ + var image = product.product_image_small; + var product = _.clone(product); + delete product['product_image_small']; + this._add_data('images', { id: product.id, image:image}); + } + this._add_data('products',product); + } + }, + + /* removes all the data in the database ! */ + clear: function(done_callback){ + var transaction = this.db.transaction(['products','images'],'readwrite'); + transaction.objectStore('products').clear(); + transaction.objectStore('images').clear(); + if(done_callback){ + transaction.oncomplete = function(){ done_callback(); }; + } + }, + + get_product_count: function(result_callback){ + this.db.transaction('products').objectStore('products').count().onsuccess = function(event){ + result_callback(event.target.result); + }; + }, + + get_image_count: function(result_callback){ + this.db.transaction('images').objectStore('images').count().onsuccess = function(event){ + result_callback(event.target.result); + }; + }, + + /* fetches a product with an id of 'id', returns the product as the first parameter + * of the result_callback function + */ + get_product_by_id: function(id, result_callback){ + var transaction = this.db.transaction('products'); + var objectStore = transaction.objectStore('products'); + var request = objectStore.get(id); + request.onsuccess = function(event){ + if(result_callback){ + result_callback(event.target.result); + } + }; + }, + get_product_by_name: function(name, result_callback){ + var transaction = this.db.transaction('products'); + var objectStore = transaction.objectStore('products'); + var index = objectStore.index('name'); + index.get(name).onsuccess = function(event){ + result_callback(event.target.result); + }; + }, + /* fetches the product with the ean13 matching the one provided. returns the product + * as the first parameter of the result_callback function + */ + get_product_by_ean13: function(ean13, result_callback){ + var transaction = this.db.transaction('products'); + var objectStore = transaction.objectStore('products'); + var index = objectStore.index('ean13'); + index.get(ean13).onsuccess = function(event){ + result_callback(event.target.result); + }; + }, + /* fetches all products belonging to a category, and returns the list of products + * as the first paramter of the result_callback function + */ + get_product_by_category: function(category, result_callback){ + var transaction = this.db.transaction('products'); + var objectStore = transaction.objectStore('products'); + var index = objectStore.index('category'); + var list = []; + index.openCursor(IDBKeyRange.only(category)).onsuccess = function(event){ + var cursor = event.target.result; + if(cursor){ + list.push(cursor.value); + cursor.continue(); + }else{ + result_callback(list); + } + }; + }, + /* Fetches a picture associated with a product. + * product: This is a product json object as returned by the openerp backend. + * result_callback: a callback that gets the image data as parameter. + */ + get_product_image: function(product, result_callback){ + var transaction = this.db.transaction('images'); + var objectStore = transaction.objectStore('images'); + var request = objectStore.get(product.id); + request.onsuccess = function(event){ + result_callback(event.target.result.image); + } + }, + /* fields: a string or a list of string representing the list of the fields that + * will be searched. the values of those field must be a string. + * query: a string that will be matched in the content of one of the searched fields. + * result_callback: a function that will be called with a list of all the products with + * a field that match the query. + */ + search_product: function(fields,query,result_callback){ + var transaction = this.db.transaction('products'); + var objectStore = transaction.objectStore('products'); + var list = []; + if(!(fields instanceof Array)){ + fields = [ fields ]; + } + query = query.toLowerCase(); + objectStore.openCursor().onsuccess = function(event){ + var cursor = event.target.result; + if(cursor){ + var obj = cursor.value; + for(var i = 0, len = fields.length; i < len; i++){ + if(obj[fields[i]].toLowerCase().indexOf(query) != -1){ + list.push(obj); + break; + } + } + cursor.continue(); + }else{ + result_callback(list); + } + } + }, + for_all_products: function(callback){ + var transaction = this.db.transaction('products'); + var objectStore = transaction.objectStore('products'); + objectStore.openCursor().onsuccess = function(event){ + var cursor = event.target.result; + if(cursor){ + var ret = callback(cursor.value); + if(ret !== 'break'){ + cursor.continue(); + } + } + }; + }, + }); + window.PosDB = module.PosDB; + + module.PosLS = instance.web.Class.extend({ + name: 'openerp_pos_ls', + limit: 50, + init: function(options){ + options = options || {}; + this.name = options.name || this.name; + this.limit = options.limit || this.limit; + this.products = this.name + '_products'; + this.images = this.name + '_images'; + }, + _get_products: function(){ + var products = localStorage[this.products]; + if(products){ + return JSON.parse(products) || {}; + }else{ + return {}; + } + }, + _set_products: function(products){ + localStorage[this.products] = JSON.stringify(products); + }, + _get_images: function(){ + var images = localStorage[this.images]; + if(images){ + return JSON.parse(images) || {}; + }else{ + return {}; + } + }, + _set_images: function(images){ + localStorage[this.images] = JSON.stringify(images); + }, + add_product: function(products){ + var stored_images = this._get_images(); + var stored_products = this._get_products(); + + if(!products instanceof Array){ + products = [products]; + } + for(var i = 0, len = products.length; i < len; i++){ + var product = products[i]; + if(product.product_image_small){ + product = _.clone(product); + stored_images[product.id] = product.product_image_small; + delete product['product_image_small']; + } + stored_products[product.id] = product; + } + this._set_images(stored_images); + this._set_products(stored_products); + }, + clear: function(done_callback){ + localStorage.removeItem(this.products); + localStorage.removeItem(this.images); + }, + _count_props : function(obj){ + if(obj.__count__){ + return obj.__count__; + }else{ + var count = 0; + for(var prop in obj){ + if(obj.hasOwnProperty(prop)){ + count++; + } + } + return count; + } + }, + get_product_count: function(result_callback){ + result_callback(this._count_props(this._get_products())); + }, + get_image_count: function(result_callback){ + result_callback(this._count_props(this._get_images())); + }, + get_product_by_id: function(id, result_callback){ + var products = this._get_products(); + result_callback( products[id] ); + }, + get_product_by_name: function(name, result_callback){ + var products = this._get_products(); + for(var i in products){ + if(products[i] && products[i].name === name){ + result_callback(products[i]); + return; + } + } + result_callback(undefined); + }, + get_product_by_ean13: function(ean13, result_callback){ + var products = this._get_products(); + for(var i in products){ + if( products[i] && products[i].ean13 === ean13){ + result_callback(products[i]); + return; + } + } + result_callback(undefined); + }, + get_product_by_category: function(category, result_callback){ + var products = this._get_products(); + var list = []; + for(var i in products){ + if( products[i] && products[i].category === category){ + list.push(products[i]); + } + } + result_callback(list); + }, + get_product_image: function(product, result_callback){ + var images = this._get_images(); + result_callback(images[product.id]); + }, + search_product: function(fields, query, result_callback){ + var products = this._get_products(); + var list = []; + if(typeof query !== 'string'){ + if(query.toString){ + query = query.toString(); + }else{ + throw new Error('search_product: the query must be a string or must be convertible to string'); + } + } + + query = query.toLowerCase(); + + if(!(fields instanceof Array)){ + fields = [fields]; + } + for(var i in products){ + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var field = products[i][fields[j]]; + if(field === null || field === undefined){ + continue; + } + if(typeof field !== 'string'){ + if(field.toString){ + field = field.toString(); + }else{ + continue; + } + } + if(field.toLowerCase().indexOf(query) != -1){ + list.push(products[i]); + break; + } + } + } + result_callback(list); + }, + for_all_products: function(callback){ + var products = this._get_products(); + for(var i in products){ + var ret = callback(products[i]); + if(ret === 'break'){ + break; + } + } + }, + }); + + window.PosLS = module.PosLS; +} diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js index 634e0d9b862..b4684c037b2 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/pos_models.js @@ -74,7 +74,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal this.weightable_categories = []; // a flat list of all categories that directly contain weightable products this.barcode_reader = new module.BarcodeReader({'pos': this}); // used to read barcodes this.proxy = new module.ProxyDevice(); // used to communicate to the hardware devices via a local proxy - this.db = new module.PosDB(); // a database used to store the products and product images + this.db = new module.PosLS(); // a database used to store the products and product images // pos settings this.use_scale = false; diff --git a/addons/point_of_sale/wizard/pos_session_opening.xml b/addons/point_of_sale/wizard/pos_session_opening.xml index 226edf70b62..ec7fae9c07e 100644 --- a/addons/point_of_sale/wizard/pos_session_opening.xml +++ b/addons/point_of_sale/wizard/pos_session_opening.xml @@ -28,7 +28,7 @@ pos.session.opening form form - new + inline From 03b79a983280fab5180ce0f7fe281e320ff729b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Thu, 9 Aug 2012 19:21:13 +0200 Subject: [PATCH 027/132] [WIP] point_of_sale: much progress on the indexeddb backend bzr revid: fva@openerp.com-20120809172113-ex3o5vyt4ckv4au6 --- addons/point_of_sale/static/src/js/pos_db.js | 225 +++++++++++++----- .../static/src/js/pos_devices.js | 63 ++--- .../point_of_sale/static/src/js/pos_models.js | 181 +++----------- .../static/src/js/pos_screens.js | 25 +- .../static/src/js/pos_widgets.js | 132 +++------- 5 files changed, 275 insertions(+), 351 deletions(-) diff --git a/addons/point_of_sale/static/src/js/pos_db.js b/addons/point_of_sale/static/src/js/pos_db.js index a38457a9f8d..59ea0da1684 100644 --- a/addons/point_of_sale/static/src/js/pos_db.js +++ b/addons/point_of_sale/static/src/js/pos_db.js @@ -146,6 +146,8 @@ function openerp_pos_db(instance, module){ productStore.createIndex('category','category', {unique:false}); var imageStore = this.db.createObjectStore('images', {keyPath: 'id'}); + + var categoryStore = this.db.createObjectStore('categories', {keypath:'name'}); }, _add_data: function(store, data){ @@ -286,6 +288,9 @@ function openerp_pos_db(instance, module){ } } }, + /* the callback function will be called with all products as parameter, by increasing id. + * if the callback returns 'break' the iteration will stop + */ for_all_products: function(callback){ var transaction = this.db.transaction('products'); var objectStore = transaction.objectStore('products'); @@ -299,6 +304,29 @@ function openerp_pos_db(instance, module){ } }; }, + /* the callback function will be called with all products as parameter by increasing id. + * if the callback returns 'break', the iteration will stop + * if the callback returns a product object, it will be inserted in the db, possibly + * overwriting an existing product. The intended usage is for the callback to return a + * modified version version of the product with the same id. Anything else and you're on your own. + */ + modify_all_products: function(callback){ + var transaction = this.db.transaction('products','readwrite'); + var objectStore = transaction.objectStore('products'); + objectStore.openCursor().onsuccess = function(event){ + var cursor = event.target.result; + if(cursor){ + var ret = callback(cursor.value); + if(ret === undefined || ret === null){ + cursor.continue(); + }else if(ret === 'break'){ + return; + }else{ + objectStore.put(ret); + } + } + }; + }, }); window.PosDB = module.PosDB; @@ -310,7 +338,74 @@ function openerp_pos_db(instance, module){ this.name = options.name || this.name; this.limit = options.limit || this.limit; this.products = this.name + '_products'; - this.images = this.name + '_images'; + this.categories = this.name + '_categories'; + + this.category_by_id = {}; + this.root_category_id = 0; + this.category_products = {}; + this.category_ancestors = {}; + this.category_childs = {}; + this.category_parent = {}; + }, + get_category_by_id: function(categ_id){ + if(categ_id instanceof Array){ + var list = []; + for(var i = 0, len = categ_id.length; i < len; i++){ + var cat = this.category_by_id[categ_id[i]]; + if(cat){ + list.push(cat); + }else{ + console.error("get_category_by_id: no category has id:",categ_id[i]); + } + } + return list; + }else{ + return this.category_by_id[categ_id]; + } + }, + get_category_childs_ids: function(categ_id){ + return this.category_childs[categ_id] || []; + }, + get_category_ancestors_ids: function(categ_id){ + return this.category_ancestors[categ_id] || []; + }, + get_category_parent_id: function(categ_id){ + return this.category_parent[categ_id] || this.root_category_id; + }, + add_categories: function(categories){ + var self = this; + if(!this.category_by_id[this.root_category_id]){ + this.category_by_id[this.root_category_id] = { + id : this.root_category_id, + name : 'Root', + }; + } + for(var i=0, len = categories.length; i < len; i++){ + console.log('putting category : ',categories[i].id, categories[i].name); + this.category_by_id[categories[i].id] = categories[i]; + } + for(var i=0, len = categories.length; i < len; i++){ + var cat = categories[i]; + var parent_id = cat.parent_id[0] || this.root_category_id; + console.log('category parent',cat.id, parent_id); + this.category_parent[cat.id] = cat.parent_id[0]; + if(!this.category_childs[parent_id]){ + this.category_childs[parent_id] = []; + } + this.category_childs[parent_id].push(cat.id); + } + function make_ancestors(cat_id, ancestors){ + self.category_ancestors[cat_id] = ancestors; + + ancestors = ancestors.slice(0); + ancestors.push(cat_id); + + var childs = self.category_childs[cat_id] || []; + for(var i=0, len = childs.length; i < len; i++){ + make_ancestors(childs[i], ancestors); + } + } + make_ancestors(this.root_category_id, []); }, _get_products: function(){ var products = localStorage[this.products]; @@ -323,39 +418,51 @@ function openerp_pos_db(instance, module){ _set_products: function(products){ localStorage[this.products] = JSON.stringify(products); }, - _get_images: function(){ - var images = localStorage[this.images]; - if(images){ - return JSON.parse(images) || {}; + _get_categories: function(){ + var categories = localStorage[this.categories]; + if(categories){ + return JSON.parse(categories) || {}; }else{ return {}; } }, - _set_images: function(images){ - localStorage[this.images] = JSON.stringify(images); + _set_categories: function(categories){ + localStorage[this.categories] = JSON.stringify(categories); }, add_product: function(products){ - var stored_images = this._get_images(); var stored_products = this._get_products(); + var stored_categories = this._get_categories(); if(!products instanceof Array){ products = [products]; } for(var i = 0, len = products.length; i < len; i++){ var product = products[i]; - if(product.product_image_small){ - product = _.clone(product); - stored_images[product.id] = product.product_image_small; - delete product['product_image_small']; + var categ_id = product.pos_categ_id[0]; + if(!stored_categories[categ_id]){ + stored_categories[categ_id] = []; + } + stored_categories[categ_id].push(product.id); + var ancestors = this.get_category_ancestors_ids(categ_id) || []; + console.log('ancestors:',ancestors); + + for(var j = 0; j < ancestors.length; j++){ + if(! stored_categories[ancestors[j]]){ + stored_categories[ancestors[j]] = []; + } + stored_categories[ancestors[j]].push(product.id); } stored_products[product.id] = product; } - this._set_images(stored_images); this._set_products(stored_products); + this._set_categories(stored_categories); }, clear: function(done_callback){ localStorage.removeItem(this.products); - localStorage.removeItem(this.images); + localStorage.removeItem(this.categories); + if(done_callback){ + done_callback(); + } }, _count_props : function(obj){ if(obj.__count__){ @@ -373,9 +480,6 @@ function openerp_pos_db(instance, module){ get_product_count: function(result_callback){ result_callback(this._count_props(this._get_products())); }, - get_image_count: function(result_callback){ - result_callback(this._count_props(this._get_images())); - }, get_product_by_id: function(id, result_callback){ var products = this._get_products(); result_callback( products[id] ); @@ -400,66 +504,55 @@ function openerp_pos_db(instance, module){ } result_callback(undefined); }, - get_product_by_category: function(category, result_callback){ - var products = this._get_products(); + get_product_by_category: function(category_id, result_callback){ + var stored_categories = this._get_categories(); + var stored_products = this._get_products(); + var product_ids = stored_categories[category_id]; var list = []; - for(var i in products){ - if( products[i] && products[i].category === category){ - list.push(products[i]); - } + for(var i = 0, len = product_ids.length; i < len; i++){ + list.push(stored_products[product_ids[i]]); } result_callback(list); }, - get_product_image: function(product, result_callback){ - var images = this._get_images(); - result_callback(images[product.id]); - }, - search_product: function(fields, query, result_callback){ - var products = this._get_products(); - var list = []; - if(typeof query !== 'string'){ - if(query.toString){ - query = query.toString(); - }else{ - throw new Error('search_product: the query must be a string or must be convertible to string'); + search_product_in_category: function(category_id, fields, query, result_callback){ + var self = this; + this.get_product_by_category(category_id, function(products){ + var list = []; + + query = query.toString().toLowerCase(); + + if(!(fields instanceof Array)){ + fields = [fields]; } - } - - query = query.toLowerCase(); - - if(!(fields instanceof Array)){ - fields = [fields]; - } - for(var i in products){ - for(var j = 0, jlen = fields.length; j < jlen; j++){ - var field = products[i][fields[j]]; - if(field === null || field === undefined){ - continue; - } - if(typeof field !== 'string'){ - if(field.toString){ - field = field.toString(); - }else{ + for(var i in products){ + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var field = products[i][fields[j]]; + if(field === null || field === undefined){ continue; } - } - if(field.toLowerCase().indexOf(query) != -1){ - list.push(products[i]); - break; + if(typeof field !== 'string'){ + if(field.toString){ + field = field.toString(); + }else{ + continue; + } + } + if(field.toLowerCase().indexOf(query) != -1){ + list.push(products[i]); + break; + } } } - } - result_callback(list); + result_callback(list); + }); }, - for_all_products: function(callback){ - var products = this._get_products(); - for(var i in products){ - var ret = callback(products[i]); - if(ret === 'break'){ - break; - } - } + add_order: function(order,done_callback){ }, + remove_order: function(order_id, done_callback){ + }, + get_orders: function(result_callback){ + }, + }); window.PosLS = module.PosLS; diff --git a/addons/point_of_sale/static/src/js/pos_devices.js b/addons/point_of_sale/static/src/js/pos_devices.js index c7d96eccffc..d39597c0b02 100644 --- a/addons/point_of_sale/static/src/js/pos_devices.js +++ b/addons/point_of_sale/static/src/js/pos_devices.js @@ -277,41 +277,37 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.action_callback[action] = undefined; } }, - - + // returns the checksum of the ean, or -1 if the ean has not the correct length, ean must be a string + ean_checksum: function(ean){ + var code = ean.split(''); + if(code.length !== 13){ + return -1; + } + var oddsum = 0, evensum = 0, total = 0; + code = code.reverse().splice(1); + for(var i = 0; i < code.length; i++){ + if(i % 2 == 0){ + oddsum += Number(code[i]); + }else{ + evensum += Number(code[i]); + } + } + total = oddsum * 3 + evensum; + return Number((10 - total % 10) % 10); + }, // returns true if the ean is a valid EAN codebar number by checking the control digit. // ean must be a string check_ean: function(ean){ - var code = ean.split(''); - for(var i = 0; i < code.length; i++){ - code[i] = Number(code[i]); + return ean_checksum(ean) === Number(ean[ean.length-1]); + }, + // returns a valid zero padded ean13 from an ean prefix. the ean prefix must be a string. + sanitize_ean:function(ean){ + ean = ean.substr(0,13); + + for(var n = 0, count = (13 - ean.length); n < count; n++){ + ean = ean + '0'; } - var st1 = code.slice(); - var st2 = st1.slice(0,st1.length-1).reverse(); - // some EAN13 barcodes have a length of 12, as they start by 0 - while (st2.length < 12) { - st2.push(0); - } - var countSt3 = 1; - var st3 = 0; - $.each(st2, function() { - if (countSt3%2 === 1) { - st3 += this; - } - countSt3 ++; - }); - st3 *= 3; - var st4 = 0; - var countSt4 = 1; - $.each(st2, function() { - if (countSt4%2 === 0) { - st4 += this; - } - countSt4 ++; - }); - var st5 = st3 + st4; - var cd = (10 - (st5%10)) % 10; - return code[code.length-1] === cd; + return ean.substr(0,12) + this.ean_checksum(ean); }, // attempts to interpret an ean (string encoding an ean) @@ -334,6 +330,7 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal type:'unknown', // prefix:'', ean:ean, + base_ean: ean, id:'', value: 0, unit: 'none', @@ -355,18 +352,22 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal parse_result.type = 'error'; } else if( match_prefix(this.price_prefix_set,'price')){ parse_result.id = ean.substring(0,7); + parse_result.base_ean = this.sanitize_ean(ean.substring(0,7)); parse_result.value = Number(ean.substring(7,12))/100.0; parse_result.unit = 'euro'; } else if( match_prefix(this.weight_prefix_set,'weight')){ parse_result.id = ean.substring(0,7); parse_result.value = Number(ean.substring(7,12))/1000.0; + parse_result.base_ean = this.sanitize_ean(ean.substring(0,7)); parse_result.unit = 'Kg'; } else if( match_prefix(this.client_prefix_set,'client')){ parse_result.id = ean.substring(0,7); + parse_result.unit = 'Kg'; } else if( match_prefix(this.cashier_prefix_set,'cashier')){ parse_result.id = ean.substring(0,7); } else if( match_prefix(this.discount_prefix_set,'discount')){ parse_result.id = ean.substring(0,7); + parse_result.base_ean = this.sanitize_ean(ean.substring(0,7)); parse_result.value = Number(ean.substring(7,12))/100.0; parse_result.unit = '%'; } else { diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js index b4684c037b2..ee0c770e6e6 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/pos_models.js @@ -64,17 +64,16 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal initialize: function(session, attributes) { Backbone.Model.prototype.initialize.call(this, attributes); var self = this; + this.session = session; this.dao = new module.LocalStorageDAO(); // used to store the order's data on the Hard Drive this.ready = $.Deferred(); // used to notify the GUI that the PosModel has loaded all resources this.flush_mutex = new $.Mutex(); // used to make sure the orders are sent to the server once at time - //this.build_tree = _.bind(this.build_tree, this); // ??? - this.session = session; - this.categories = {}; - this.root_category = null; - this.weightable_categories = []; // a flat list of all categories that directly contain weightable products + this.barcode_reader = new module.BarcodeReader({'pos': this}); // used to read barcodes - this.proxy = new module.ProxyDevice(); // used to communicate to the hardware devices via a local proxy - this.db = new module.PosLS(); // a database used to store the products and product images + this.proxy = new module.ProxyDevice(); // used to communicate to the hardware devices via a local proxy + this.db = new module.PosLS(); // a database used to store the products and categories + + window.db = this.db; // pos settings this.use_scale = false; @@ -267,30 +266,14 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal return session_data_def; }); - // associate the products with their categories - var prod_process_def = $.when(cat_def, session_def) - .pipe(function(){ - var product_list = self.get('product_list'); - var categories = self.get('categories'); - var cat_by_id = {}; - for(var i = 0; i < categories.length; i++){ - cat_by_id[categories[i].id] = categories[i]; - } - //set the parent in the category - for(var i = 0; i < categories.length; i++){ - categories[i].parent_category = cat_by_id[categories[i].parent_id[0]]; - } - for(var i = 0; i < product_list.length; i++){ - product_list[i].pos_category = cat_by_id[product_list[i].pos_categ_id[0]]; - } - }); - // when all the data has loaded, we compute some stuff, and declare the Pos ready to be used. - $.when(pack_def, cat_def, user_def, users_def, uom_def, session_def, tax_def, prod_process_def, user_def, this.flush()) + $.when(pack_def, cat_def, user_def, users_def, uom_def, session_def, tax_def, user_def, this.flush()) .then(function(){ - self.build_categories(); + self.db.clear(); + self.db.add_categories(self.get('categories')); + self.db.add_product(self.get('product_list')); self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))}); - //self.log_loaded_data(); //Uncomment if you want to log the data to the console for easier debugging + self.log_loaded_data(); //Uncomment if you want to log the data to the console for easier debugging self.ready.resolve(); },function(){ //we failed to load some backend data, or the backend was badly configured. @@ -325,7 +308,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal // order and a valid selected order on_removed_order: function(removed_order){ if( this.get('orders').isEmpty()){ - this.add_and_select_order(new module.Order({ pos: this })); + this.add_new_order(); } if( this.get('selectedOrder') === removed_order){ this.set({ selectedOrder: this.get('orders').last() }); @@ -340,13 +323,13 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal }); }, - add_and_select_order: function(newOrder) { - (this.get('orders')).add(newOrder); - return this.set({ - selectedOrder: newOrder - }); + //creates a new empty order and sets it as the current order + add_new_order: function(){ + var order = new module.Order({pos:this}); + this.get('orders').add(order); + this.set('selectedOrder', order); }, - + // attemps to send all pending orders ( stored in the DAO ) to the server. // it will do it one by one, and remove the successfully sent ones from the DAO once // it has been confirmed that they have been received. @@ -390,119 +373,25 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal }); }, - // this adds several properties to the categories in order to make it easier to diplay them - // fields added include the list of product relevant to each category, list of child categories, - // list of ancestors, etc. - build_categories : function(){ - var categories = this.get('categories'); - var products = this.get('product_list'); - - //append the content of array2 into array1 - function append(array1, array2){ - for(var i = 0, len = array2.length; i < len; i++){ - array1.push(array2[i]); + scan_product: function(parsed_ean){ + var self = this; + var def = new $.Deferred(); + this.db.get_product_by_ean13(parsed_ean.base_ean, function(product){ + var selectedOrder = this.get('selectedOrder'); + if(!product){ + def.reject('product-not-found: '+parsed_ean.base_ean); + return; } - } - - function appendSet(set1, set2){ - for(key in set2){ - set1[key] = set2[key]; + if(parsed_ean.type === 'price'){ + selectedOrder.addProduct(new module.Product(product), {price:parsed_ean.value}); + }else if(parsed_ean.type === 'weight'){ + selectedOrder.addProduct(new module.Product(product), {quantity:parsed_ean.value, merge:false}); + }else{ + selectedOrder.addProduct(new module.Product(product)); } - } - - var categories_by_id = {}; - for(var i = 0; i < categories.length; i++){ - categories_by_id[categories[i].id] = categories[i]; - } - this.categories_by_id = categories_by_id; - - var root_category = { - name : 'Root', - id : 0, - parent : null, - childrens : [], - }; - - // add parent and childrens field to categories, find root_categories - for(var i = 0; i < categories.length; i++){ - var cat = categories[i]; - - cat.parent = categories_by_id[cat.parent_id[0]]; - if(!cat.parent){ - root_category.childrens.push(cat); - cat.parent = root_category; - } - - cat.childrens = []; - for(var j = 0; j < cat.child_id.length; j++){ - cat.childrens.push(categories_by_id[ cat.child_id[j] ]); - } - } - - categories.push(root_category); - - // set some default fields for next steps - for(var i = 0; i < categories.length; i++){ - var cat = categories[i]; - - cat.product_list = []; //list of all products in the category - cat.product_set = {}; // [product.id] === true if product is in category - cat.weightable_product_list = []; - cat.weightable_product_set = {}; - cat.weightable = false; //true if directly contains weightable products - } - - this.root_category = root_category; - - //we add the products to the categories. - for(var i = 0, len = products.length; i < len; i++){ - var product = products[i]; - var cat = categories_by_id[product.pos_categ_id[0]]; - if(cat){ - cat.product_list.push(product); - cat.product_set[product.id] = true; - if(product.to_weight){ - cat.weightable_product_list.push(product); - cat.weightable_product_set[product.id] = true; - cat.weightable = true; - } - } - } - - // we build a flat list of all categories that directly contains weightable products - this.weightable_categories = []; - for(var i = 0, len = categories.length; i < len; i++){ - var cat = categories[i]; - if(cat.weightable){ - this.weightable_categories.push(cat); - } - } - - // add ancestor field to categories, contains the list of parents of parents, from root to parent - function make_ancestors(cat, ancestors){ - cat.ancestors = ancestors.slice(0); - ancestors.push(cat); - - for(var i = 0; i < cat.childrens.length; i++){ - make_ancestors(cat.childrens[i], ancestors.slice(0)); - } - } - - //add the products of the subcategories to the parent categories - function make_products(cat){ - for(var i = 0; i < cat.childrens.length; i++){ - make_products(cat.childrens[i]); - - append(cat.product_list, cat.childrens[i].product_list); - append(cat.weightable_product_list, cat.childrens[i].weightable_product_list); - - appendSet(cat.product_set, cat.childrens[i].product_set); - appendSet(cat.weightable_product_set, cat.childrens[i].weightable_product_set); - } - } - - make_ancestors(root_category,[]); - make_products(root_category); + def.resolve(); + }); + return def; }, }); diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/pos_screens.js index 07f1071fa6d..310d80a3603 100644 --- a/addons/point_of_sale/static/src/js/pos_screens.js +++ b/addons/point_of_sale/static/src/js/pos_screens.js @@ -159,17 +159,20 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa // it will add the product to the order and go to barcode_product_screen. Or show barcode_product_error_popup if // there's an error. barcode_product_action: function(ean){ - if(this.pos_widget.scan_product(ean)){ - this.pos.proxy.scan_item_success(ean); - if(this.barcode_product_screen){ - this.pos_widget.screen_selector.set_current_screen(this.barcode_product_screen); - } - }else{ - this.pos.proxy.scan_item_error_unrecognized(ean); - if(this.barcode_product_error_popup && this.pos_widget.screen_selector.get_user_mode() !== 'cashier'){ - this.pos_widget.screen_selector.show_popup(this.barcode_product_error_popup); - } - } + var self = this; + this.pos_widget.scan_product(ean) + .done(function(){ + self.pos.proxy.scan_item_success(ean); + if(self.barcode_product_screen){ + self.pos_widget.screen_selector.set_current_screen(self.barcode_product_screen); + } + }) + .fail(function(){ + self.pos.proxy.scan_item_error_unrecognized(ean); + if(self.barcode_product_error_popup && self.pos_widget.screen_selector.get_user_mode() !== 'cashier'){ + self.pos_widget.screen_selector.show_popup(self.barcode_product_error_popup); + } + }); }, // what happens when a cashier id barcode is scanned. diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/pos_widgets.js index a30a0ebe521..34de4cf567f 100644 --- a/addons/point_of_sale/static/src/js/pos_widgets.js +++ b/addons/point_of_sale/static/src/js/pos_widgets.js @@ -396,29 +396,21 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // changes the category. if undefined, sets to root category set_category : function(category){ + var db = this.pos.db; if(!category){ - this.category = this.pos.root_category; + this.category = db.get_category_by_id(db.root_category_id); }else{ this.category = category; } - this.breadcrumb = []; - for(var i = 1; i < this.category.ancestors.length; i++){ - this.breadcrumb.push(this.category.ancestors[i]); + var ancestors_ids = db.get_category_ancestors_ids(this.category.id); + for(var i = 1; i < ancestors_ids.length; i++){ + this.breadcrumb.push(db.get_category_by_id(ancestors_ids[i])); } - if(this.category !== this.pos.root_category){ + if(this.category.id !== db.root_category_id){ this.breadcrumb.push(this.category); } - if(this.product_type === 'weightable'){ - this.subcategories = []; - for(var i = 0; i < this.category.childrens.length; i++){ - if(this.category.childrens[i].weightable_product_list.length > 0){ - this.subcategories.push( this.category.childrens[i]); - } - } - }else{ - this.subcategories = this.category.childrens || []; - } + this.subcategories = db.get_category_by_id(db.get_category_childs_ids(this.category.id)); }, renderElement: function(){ @@ -443,7 +435,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa $(button).appendTo(this.$('.category-list')).click(function(event){ var id = category.id; - var cat = self.pos.categories_by_id[id]; + var cat = self.pos.db.get_category_by_id(id); self.set_category(cat); self.renderElement(); self.search_and_categories(cat); @@ -452,7 +444,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // breadcrumb click actions this.$(".oe-pos-categories-list a").click(function(event){ var id = $(event.target).data("category-id"); - var category = self.pos.categories_by_id[id]; + var category = self.pos.db.get_category_by_id(id); self.set_category(category); self.renderElement(); self.search_and_categories(category); @@ -475,50 +467,39 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // filters the products, and sets up the search callbacks search_and_categories: function(category){ var self = this; - - var all_products = this.pos.get('product_list'); - var all_packages = this.pos.get('product.packaging'); // find all products belonging to the current category - var products = []; - if(this.product_type === 'weightable'){ - products = all_products.filter( function(product){ - return self.category.weightable_product_set[product.id]; - }); - }else{ - products = all_products.filter( function(product){ - return self.category.product_set[product.id]; - }); - } + this.pos.db.get_product_by_category(this.category.id, function(products){ + // product lists watch for reset events on 'products' to re-render. + // FIXME that means all productlist widget re-render... even the hidden ones ! + self.pos.get('products').reset(products); + }); - // product lists watch for reset events on 'products' to re-render. - // FIXME that means all productlist widget re-render... even the hidden ones ! - this.pos.get('products').reset(products); - - // find all the products whose name match the query in the searchbox + // filter the products according to the search string this.$('.searchbox input').keyup(function(){ - var results, search_str; - search_str = $(this).val().toLowerCase(); - if(search_str){ - results = products.filter( function(p){ - return p.name.toLowerCase().indexOf(search_str) != -1 || - (p.ean13 && p.ean13.indexOf(search_str) != -1); + query = $(this).val().toLowerCase(); + if(query){ + self.pos.db.search_product_in_category(self.category.id, ['name','ean13'], query, function(products){ + self.pos.get('products').reset(products); + self.$('.search-clear').fadeIn(); }); - self.$element.find('.search-clear').fadeIn(); }else{ - results = products; - self.$element.find('.search-clear').fadeOut(); + self.pos.db.get_product_by_category(self.category.id, function(products){ + self.pos.get('products').reset(products); + self.$('.search-clear').fadeOut(); + }); } - self.pos.get('products').reset(results); - }); - this.$('.searchbox input').click(function(){ }); + this.$('.searchbox input').click(function(){}); //Why ??? + //reset the search when clicking on reset this.$('.search-clear').click(function(){ - self.pos.get('products').reset(products); - self.$('.searchbox input').val('').focus(); - self.$('.search-clear').fadeOut(); + self.pos.db.get_product_by_category(self.category.id, function(products){ + self.pos.get('products').reset(products); + self.$('.searchbox input').val('').focus(); + self.$('.search-clear').fadeOut(); + }); }); }, }); @@ -693,7 +674,9 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa self.build_currency_template(); self.renderElement(); - self.$('.neworder-button').click(_.bind(self.create_new_order, self)); + self.$('.neworder-button').click(function(){ + self.pos.add_new_order(); + }); //when a new order is created, add an order button widget self.pos.get('orders').bind('add', function(new_order){ @@ -721,7 +704,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa self.screen_selector.show_popup('error', 'Sorry, we could not find any PoS Configuration for this session'); } - self.$('.loader').animate({opacity:0},3000,'swing',function(){self.$('.loader').hide();}); + self.$('.loader').animate({opacity:0},1500,'swing',function(){self.$('.loader').hide();}); self.$('.loader img').hide(); if(jQuery.deparam(jQuery.param.querystring()).debug !== undefined){ @@ -851,51 +834,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }, - //FIXME this method is probably not at the right place ... - scan_product: function(parsed_ean){ - var selectedOrder = this.pos.get('selectedOrder'); - var scannedProductModel = this.get_product_by_ean(parsed_ean); - if (!scannedProductModel){ - return false; - } else { - if(parsed_ean.type === 'price'){ - selectedOrder.addProduct(new module.Product(scannedProductModel), { price:parsed_ean.value}); - }else if(parsed_ean.type === 'weight'){ - selectedOrder.addProduct(new module.Product(scannedProductModel), { quantity:parsed_ean.value, merge:false}); - }else{ - selectedOrder.addProduct(new module.Product(scannedProductModel)); - } - return true; - } - }, - - get_product_by_ean: function(parsed_ean) { - var allProducts = this.pos.get('product_list'); - var allPackages = this.pos.get('product.packaging'); - var scannedProductModel = undefined; - - if (parsed_ean.type === 'price' || parsed_ean.type === 'weight') { - var itemCode = parsed_ean.id; - var scannedPackaging = _.detect(allPackages, function(pack) { - return pack.ean && pack.ean.substring(0,7) === itemCode; - }); - if (scannedPackaging) { - scannedProductModel = _.detect(allProducts, function(pc) { return pc.id === scannedPackaging.product_id[0];}); - }else{ - scannedProductModel = _.detect(allProducts, function(pc) { return pc.ean13 && (pc.ean13.substring(0,7) === parsed_ean.id);}); - } - } else if(parsed_ean.type === 'unit'){ - scannedProductModel = _.detect(allProducts, function(pc) { return pc.ean13 === parsed_ean.ean;}); //TODO DOES NOT SCALE - } - return scannedProductModel; - }, - // creates a new order, and add it to the list of orders. - create_new_order: function() { - var new_order; - new_order = new module.Order({ pos: this.pos }); - this.pos.get('orders').add(new_order); - this.pos.set({ selectedOrder: new_order }); - }, changed_pending_operations: function () { var self = this; this.synch_notification.on_change_nbr_pending(self.pos.get('nbr_pending_operations').length); From 78d8b5d39498beb45231f8b0bcd093f670ca41b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Thu, 9 Aug 2012 21:55:55 +0200 Subject: [PATCH 028/132] [WIP] point_of_sale: indexeddb : products and categories are no longer in memory bzr revid: fva@openerp.com-20120809195555-oluxe7xe8k2ugcoi --- addons/point_of_sale/static/src/js/pos_db.js | 2 +- .../point_of_sale/static/src/js/pos_models.js | 30 +++++++------------ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/addons/point_of_sale/static/src/js/pos_db.js b/addons/point_of_sale/static/src/js/pos_db.js index 59ea0da1684..d660b130dd2 100644 --- a/addons/point_of_sale/static/src/js/pos_db.js +++ b/addons/point_of_sale/static/src/js/pos_db.js @@ -429,7 +429,7 @@ function openerp_pos_db(instance, module){ _set_categories: function(categories){ localStorage[this.categories] = JSON.stringify(categories); }, - add_product: function(products){ + add_products: function(products){ var stored_products = this._get_products(); var stored_categories = this._get_categories(); diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js index ee0c770e6e6..b6b58180f43 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/pos_models.js @@ -72,6 +72,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal this.barcode_reader = new module.BarcodeReader({'pos': this}); // used to read barcodes this.proxy = new module.ProxyDevice(); // used to communicate to the hardware devices via a local proxy this.db = new module.PosLS(); // a database used to store the products and categories + this.db.clear(); window.db = this.db; @@ -98,12 +99,10 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal 'products': new module.ProductCollection(), 'cashRegisters': null, - 'product_list': null, // the list of all products, does not change. 'bank_statements': null, 'taxes': null, 'pos_session': null, 'pos_config': null, - 'categories': null, 'selectedOrder': undefined, }); @@ -139,10 +138,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal self.set('currency',currencies[0]); }); - var cat_def = fetch('pos.category', ['id','name', 'parent_id', 'child_id', 'category_image_small']) - .pipe(function(result){ - return self.set({'categories': result}); - }); var uom_def = fetch( //unit of measure 'product.uom', @@ -213,18 +208,20 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal self.use_selfcheckout = pos_config.iface_self_checkout || false; self.use_cashbox = pos_config.iface_cashdrawer || false; - return shop_def = fetch('sale.shop',[], [['id','=',pos_config.shop_id[0]]]) + return fetch('sale.shop',[], [['id','=',pos_config.shop_id[0]]]) }).pipe(function(shops){ self.set('shop',shops[0]); + return fetch('pos.category', ['id','name', 'parent_id', 'child_id', 'category_image_small']) + }).pipe( function(categories){ + self.db.add_categories(categories); return fetch( 'product.product', - //context {pricelist: shop.pricelist_id[0]} ['name', 'list_price','price','pos_categ_id', 'taxes_id','product_image_small', 'ean13', 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type'], [['pos_categ_id','!=', false]], - {pricelist: shops[0].pricelist_id[0]} // context for price - ); - }).pipe( function(product_list){ - self.set({'product_list': product_list}); + {pricelist: self.get('shop').pricelist_id[0]} // context for price + ); + }).pipe( function(products){ + self.db.add_products(products); }); var bank_def = fetch( @@ -267,13 +264,10 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal }); // when all the data has loaded, we compute some stuff, and declare the Pos ready to be used. - $.when(pack_def, cat_def, user_def, users_def, uom_def, session_def, tax_def, user_def, this.flush()) + $.when(pack_def, user_def, users_def, uom_def, session_def, tax_def, user_def, this.flush()) .then(function(){ - self.db.clear(); - self.db.add_categories(self.get('categories')); - self.db.add_product(self.get('product_list')); self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))}); - self.log_loaded_data(); //Uncomment if you want to log the data to the console for easier debugging + //self.log_loaded_data(); //Uncomment if you want to log the data to the console for easier debugging self.ready.resolve(); },function(){ //we failed to load some backend data, or the backend was badly configured. @@ -286,7 +280,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal log_loaded_data: function(){ console.log('PosModel data has been loaded:'); console.log('PosModel: categories:',this.get('categories')); - console.log('PosModel: product_list:',this.get('product_list')); console.log('PosModel: units:',this.get('units')); console.log('PosModel: bank_statements:',this.get('bank_statements')); console.log('PosModel: journals:',this.get('journals')); @@ -300,7 +293,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal console.log('PosModel: user_list:',this.get('user_list')); console.log('PosModel: user:',this.get('user')); console.log('PosModel.session:',this.session); - console.log('PosModel.categories:',this.categories); console.log('PosModel end of data log.'); }, From 760939d83f4d51f56e8d4da21501116ac1bceef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Fri, 10 Aug 2012 15:58:32 +0200 Subject: [PATCH 029/132] [IMP] point_of_sale: IndexedDB: the LocalStorage DB is working now bzr revid: fva@openerp.com-20120810135832-7xb3yq0r1p829nv1 --- addons/point_of_sale/static/src/js/pos_db.js | 124 ++++++++++++------- 1 file changed, 80 insertions(+), 44 deletions(-) diff --git a/addons/point_of_sale/static/src/js/pos_db.js b/addons/point_of_sale/static/src/js/pos_db.js index d660b130dd2..7b252bb8c41 100644 --- a/addons/point_of_sale/static/src/js/pos_db.js +++ b/addons/point_of_sale/static/src/js/pos_db.js @@ -1,15 +1,20 @@ /** + * WIP : AS OF THIS COMMIT, THE INDEXEDB BACKEND IS IN A NON WORKING STATE + * * This file contains an IndexedDB (html5 database) backend for the Point Of Sale. * The IDB is used to store the list of products and especially their thumbnails, which may * not fit in the localStorage. * The IDB offers a big performance boost for products lookup, but not so much for search as * searching is not yet implemented in the IndexedDB API and must be performed manually in JS. + * + * this file also contains a localstorage implementation of the database to be used by browsers + * that don't support the indexeddb api. * */ function openerp_pos_db(instance, module){ // this is used for testing - window.gen_products = function(options){ + var gen_products = function(options){ options = options || {}; var count = options.count || 100; var imageSize = options.imageSize || 1800; @@ -60,10 +65,13 @@ function openerp_pos_db(instance, module){ }; //this is used for testing - window.log = function(x){ + var log = function(x){ console.log(x); }; + // window.gen_products = gen_products; + // window.log = log; + function importIndexedDB(){ if('indexedDB' in window){ return true; @@ -330,9 +338,12 @@ function openerp_pos_db(instance, module){ }); window.PosDB = module.PosDB; + /* PosLS is a LocalStorage based implementation of the point of sale database, + it performs better for few products, but does not scale beyond 500 products. + */ module.PosLS = instance.web.Class.extend({ - name: 'openerp_pos_ls', - limit: 50, + name: 'openerp_pos_ls', //the prefix of the localstorage data + limit: 100, // the maximum number of results returned by a search init: function(options){ options = options || {}; this.name = options.name || this.name; @@ -340,6 +351,10 @@ function openerp_pos_db(instance, module){ this.products = this.name + '_products'; this.categories = this.name + '_categories'; + //products cache put the data in memory to avoid roundtrips to the localstorage + this.products_cache = null; + this.categories_cache = null; + this.category_by_id = {}; this.root_category_id = 0; this.category_products = {}; @@ -347,6 +362,7 @@ function openerp_pos_db(instance, module){ this.category_childs = {}; this.category_parent = {}; }, + /* returns the category object from its id */ get_category_by_id: function(categ_id){ if(categ_id instanceof Array){ var list = []; @@ -363,15 +379,24 @@ function openerp_pos_db(instance, module){ return this.category_by_id[categ_id]; } }, + /* returns a list of the category's child categories ids, or an empty list + * if a category has no childs */ get_category_childs_ids: function(categ_id){ return this.category_childs[categ_id] || []; }, + /* returns a list of all ancestors (parent, grand-parent, etc) categories ids + * starting from the root category to the direct parent */ get_category_ancestors_ids: function(categ_id){ return this.category_ancestors[categ_id] || []; }, + /* returns the parent category's id of a category, or the root_category_id if no parent. + * the root category is parent of itself. */ get_category_parent_id: function(categ_id){ return this.category_parent[categ_id] || this.root_category_id; }, + /* adds categories definitions to the database. categories is a list of categories objects as + * returned by the openerp server. Categories must be inserted before the products or the + * product/ categories association may (will) not work properly */ add_categories: function(categories){ var self = this; if(!this.category_by_id[this.root_category_id]){ @@ -381,13 +406,11 @@ function openerp_pos_db(instance, module){ }; } for(var i=0, len = categories.length; i < len; i++){ - console.log('putting category : ',categories[i].id, categories[i].name); this.category_by_id[categories[i].id] = categories[i]; } for(var i=0, len = categories.length; i < len; i++){ var cat = categories[i]; var parent_id = cat.parent_id[0] || this.root_category_id; - console.log('category parent',cat.id, parent_id); this.category_parent[cat.id] = cat.parent_id[0]; if(!this.category_childs[parent_id]){ this.category_childs[parent_id] = []; @@ -407,7 +430,11 @@ function openerp_pos_db(instance, module){ } make_ancestors(this.root_category_id, []); }, + /* this internal method returns from disc a dictionary associating ids to the products */ _get_products: function(){ + if(this.products_cache){ + return this.products_cache; + } var products = localStorage[this.products]; if(products){ return JSON.parse(products) || {}; @@ -415,10 +442,16 @@ function openerp_pos_db(instance, module){ return {}; } }, + /* this internal method saves a dictionary associating ids to product to the disc */ _set_products: function(products){ localStorage[this.products] = JSON.stringify(products); + this.products_cache = products; }, + /* this internal method returns from disc a dictionary associating ids to the categories */ _get_categories: function(){ + if(this.categories_cache){ + return this.categories_cache; + } var categories = localStorage[this.categories]; if(categories){ return JSON.parse(categories) || {}; @@ -426,8 +459,10 @@ function openerp_pos_db(instance, module){ return {}; } }, + /* this internal method saves to disc an array associating ids to the categories */ _set_categories: function(categories){ localStorage[this.categories] = JSON.stringify(categories); + this.categories_cache = categories; }, add_products: function(products){ var stored_products = this._get_products(); @@ -444,7 +479,6 @@ function openerp_pos_db(instance, module){ } stored_categories[categ_id].push(product.id); var ancestors = this.get_category_ancestors_ids(categ_id) || []; - console.log('ancestors:',ancestors); for(var j = 0; j < ancestors.length; j++){ if(! stored_categories[ancestors[j]]){ @@ -457,6 +491,7 @@ function openerp_pos_db(instance, module){ this._set_products(stored_products); this._set_categories(stored_categories); }, + /* removes all the data from the database. TODO : being able to selectively remove data */ clear: function(done_callback){ localStorage.removeItem(this.products); localStorage.removeItem(this.categories); @@ -464,18 +499,15 @@ function openerp_pos_db(instance, module){ done_callback(); } }, + /* this internal methods returns the count of properties in an object. */ _count_props : function(obj){ - if(obj.__count__){ - return obj.__count__; - }else{ - var count = 0; - for(var prop in obj){ - if(obj.hasOwnProperty(prop)){ - count++; - } + var count = 0; + for(var prop in obj){ + if(obj.hasOwnProperty(prop)){ + count++; } - return count; } + return count; }, get_product_count: function(result_callback){ result_callback(this._count_props(this._get_products())); @@ -509,50 +541,54 @@ function openerp_pos_db(instance, module){ var stored_products = this._get_products(); var product_ids = stored_categories[category_id]; var list = []; - for(var i = 0, len = product_ids.length; i < len; i++){ + for(var i = 0, len = Math.min(product_ids.length,this.limit); i < len; i++){ list.push(stored_products[product_ids[i]]); } result_callback(list); }, + /* returns as a parameter of the result_callback function a list of products with : + * - a category that is or is a child of category_id, + * - a field in fields that contains a value that contains the query + * If a search is started before the previous has returned, the previous search may be cancelled + * (and the corresponding result_callback never called) + */ search_product_in_category: function(category_id, fields, query, result_callback){ var self = this; - this.get_product_by_category(category_id, function(products){ - var list = []; + var stored_categories = this._get_categories(); + var stored_products = this._get_products(); + var product_ids = stored_categories[category_id]; + var list = []; + var count = 0; + + query = query.toString().toLowerCase(); - query = query.toString().toLowerCase(); - - if(!(fields instanceof Array)){ - fields = [fields]; - } - for(var i in products){ - for(var j = 0, jlen = fields.length; j < jlen; j++){ - var field = products[i][fields[j]]; - if(field === null || field === undefined){ - continue; - } - if(typeof field !== 'string'){ - if(field.toString){ - field = field.toString(); - }else{ - continue; - } - } - if(field.toLowerCase().indexOf(query) != -1){ - list.push(products[i]); - break; - } + if(!(fields instanceof Array)){ + fields = [fields]; + } + for(var i = 0, len = product_ids.length; i < len && count < this.limit; i++){ + var product = stored_products[product_ids[i]]; + for(var j = 0, jlen = fields.length; j < jlen; j++){ + var field = product[fields[j]]; + if(field === null || field === undefined){ + continue; + } + field = field.toString().toLowerCase(); + if(field.indexOf(query) != -1){ + list.push(product); + count++; + break; } } - result_callback(list); - }); + } + result_callback(list); }, + // TODO move the order storage from the crappy DAO in pos_models.js add_order: function(order,done_callback){ }, remove_order: function(order_id, done_callback){ }, get_orders: function(result_callback){ }, - }); window.PosLS = module.PosLS; From 8759e49b8355eec82709aee70405ecc86f20be3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Fri, 10 Aug 2012 16:19:30 +0200 Subject: [PATCH 030/132] [FIX] point_of_sale: reverting changes on the pos's views bzr revid: fva@openerp.com-20120810141930-3xkh9ny0splzrs75 --- addons/point_of_sale/point_of_sale_view.xml | 62 +++++++++++++------ .../wizard/pos_session_opening.xml | 2 +- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 9aa9c095f65..6a43cec39be 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -3,6 +3,10 @@ + Others @@ -151,6 +155,9 @@ + + + Products @@ -163,7 +170,10 @@ You must define a Product for everything you buy or sell. Products can be raw materials, stockable products, consumables or services. The Product form contains detailed information about your products related to procurement logistics, sales price, product category, suppliers and so on. - + Sale lines @@ -663,8 +673,11 @@ tree,form + + Payment Methods @@ -676,6 +689,10 @@ Payment methods are defined by accounting journals having the field Payment Method checked. + POS Sales Lines @@ -699,6 +716,9 @@ + + + Invoices @@ -709,6 +729,8 @@ [('origin','like','POS')] + Start Point of Sale @@ -826,6 +848,11 @@ + + + + + pos.order.list.select pos.order @@ -993,6 +1034,7 @@ + pos.ean_wizard @@ -1008,24 +1050,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/addons/point_of_sale/wizard/pos_session_opening.xml b/addons/point_of_sale/wizard/pos_session_opening.xml index ec7fae9c07e..226edf70b62 100644 --- a/addons/point_of_sale/wizard/pos_session_opening.xml +++ b/addons/point_of_sale/wizard/pos_session_opening.xml @@ -28,7 +28,7 @@ pos.session.opening form form - inline + new From 246b47602002424c6ec45ed854251e99846d75b9 Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Mon, 13 Aug 2012 14:45:19 +0530 Subject: [PATCH 031/132] Workflow editor label. bzr revid: tta@openerp.com-20120813091519-lcxiemc2wojfx2d6 --- openerp/addons/base/ir/workflow/workflow_view.xml | 3 ++- openerp/addons/base/rng/view.rng | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openerp/addons/base/ir/workflow/workflow_view.xml b/openerp/addons/base/ir/workflow/workflow_view.xml index c20eeaed085..084d66f720f 100644 --- a/openerp/addons/base/ir/workflow/workflow_view.xml +++ b/openerp/addons/base/ir/workflow/workflow_view.xml @@ -41,7 +41,7 @@ workflow diagram - + @@ -55,6 +55,7 @@ + diff --git a/openerp/addons/base/rng/view.rng b/openerp/addons/base/rng/view.rng index 8f7b2647237..0d6527e5972 100644 --- a/openerp/addons/base/rng/view.rng +++ b/openerp/addons/base/rng/view.rng @@ -181,12 +181,12 @@ - + - - - - + + + + From c2c6a912ccd2734928007dc69dd03252b66dd451 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 13 Aug 2012 14:55:52 +0530 Subject: [PATCH 032/132] [IMP]: base: Improved country_id search by direct reference of xml_id bzr revid: rpa@tinyerp.com-20120813092552-q9mrusns0jok7ztl --- openerp/addons/base/base_data.xml | 2 +- openerp/addons/base/res/res_partner_demo.xml | 40 ++++++++++---------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/openerp/addons/base/base_data.xml b/openerp/addons/base/base_data.xml index 338435d2e75..12c90437e93 100644 --- a/openerp/addons/base/base_data.xml +++ b/openerp/addons/base/base_data.xml @@ -1064,7 +1064,7 @@ 45, Rue du Palais Paris 75016 - + +33 1 49 51 23 94 info@yourcompany.com www.yourcompany.com diff --git a/openerp/addons/base/res/res_partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml index 926b29a97fe..b01b2e05f18 100644 --- a/openerp/addons/base/res/res_partner_demo.xml +++ b/openerp/addons/base/res/res_partner_demo.xml @@ -85,7 +85,7 @@ 1 Taipei 106 - + 31 Hong Kong street info@asustek.com (+886) (02) 4162 2023 @@ -98,7 +98,7 @@ 1 Wavre 1300 - + 69 rue de Chimay info@agrolait.com +32 10 588 558 @@ -113,6 +113,7 @@ Shanghai 200000 + 52 Chop Suey street info@chinaexport.com +86 21 6484 5671 @@ -128,7 +129,7 @@ 1 Fremont CA 94538 - + 3661 Station Street info@deltapc.com @@ -142,7 +143,7 @@ 1 - + 60610 Chicago @@ -160,7 +161,7 @@ 1 Chicago IL 60623 - + 23 Rockwell Lane info@elecimport.com @@ -177,7 +178,7 @@ 81 Academy Avenue Birmingham B46 3AG - + +44 121 690 4596 email@wealthyandsons.com www.wealthyandsons.com/ @@ -193,7 +194,7 @@ Munich Luckenwalder Strasse 80352 - + +49 8932 450203 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 @@ -205,7 +206,7 @@ 1 203, Systems Plaza Mumbai - + info@bestdesigners.in +91 22 3445 0349 www.bestdesigners.com @@ -218,7 +219,7 @@ 1 Miami FL 33169 - + contact@jackson.com +1 786 525 0724 @@ -234,6 +235,7 @@ 1 Constitución, 80 + Barcelona 08078 +34 934 340 230 @@ -250,7 +252,7 @@ Le Bourget du Lac 73377 +33 4 49 23 44 54 - + 93, Press Avenue info@c2c.com www.camptocamp.com @@ -264,7 +266,7 @@ 1 Champs sur Marne 77420 - + info@axelor.com +33 1 64 61 04 01 12 rue Albert Einstein @@ -281,7 +283,7 @@ 1 Detroit MI 48212 - + 60, Rosewood Court info@chamberworks.com @@ -297,7 +299,7 @@ 1 89 Lingfield Tower - + London +44 20 1294 2193 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HDEKDY7SWXhz0F+zagmEcrZHvc9xc717LKpabuu1ZYyd1kBqvfL7hfuS1wLR029CpeiUuy9hS2hswHb8mc+qy/Vrh8zGRHDkoaNHur4TI14XRy2p3jwXHpysDgQPgTsd/ot3pGhbxmFZSuFhex7tuR242J3/AIkrbouqz0Kzs6za1AQQ3b6RM/MqGtf1q9MsqGZM9YhERFcLiRY2PoU8fXZXpVoq8LGhjGRtADWjyA+H+pWSiIqcz3CjO38zxHuQ5PHth1XVhhrMdz7xOYGjd55fg7y381o9UfZ8NqtpC7grOPp5fFQ04cqHczYLngtaDKNmk8+4PmOoI32263+i53WtN3Ef6ZV1S1++pEbHRHpxhobnzwB1yufM9wX19e1Hq6OhqTDY/AarvtsXyBI+0ImPkc1gHKG9efr7w32A32333OouDWcoZ7T+b4c6ogw1nD41mMbHbrCRrog57nP32O5cXkkFvmSQQrqRY+lp/wC+Vk9oL0xkQBEbRBwG5HPAA9lQp4O6yrcJstouDK6fuWMxm33rVizA/ZkThGOZmw92QGPfy297YEbbrd6h4RZCfTPD/BY3LQSR6Xux2LE1ouDpg0gkMAB2677AnoNhuVb6LP0tP9lq7XrwkGRxLuA4kR/xU7xN4M/p1xAvZzI2ajaEuENGs3dxmhshxcyXbbbYE+W/Ub+q+8Lw41kNXaD1Bm8zi559NVJqlp8XOXWGOY9jSOZvnyuAJPfcq30Wfp2bt3+81oNauxSFKRtAIGOAILT8g56Ln/h5wa1rpTM15xPomaD709smtvoOlvRsJHMyKVzPd6DoOnVxPdSfhdwzzmF4m6g19qO/jBcyXPDHTxcbmQchLf6Rwd15jyA7depJJJKtlFhltTbEclvca7d1w/dHiEEgCYmUREXQqZERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERf/2Q== @@ -312,7 +314,7 @@ 01060-324 Rua Dom Carlos, 1073 +55 11 2402 2045 - + 1 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 @@ -327,7 +329,7 @@ 34 Westwood Avenue Capital Federal +54 341 324 9459 - + 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 @@ -340,7 +342,7 @@ MA 02203 info@thinkbig.com +1 857 349 3049 - + One Lincoln Street www.think-big.com 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 @@ -354,7 +356,7 @@ 1 Cupertino CA 95014 - + 10200 S. De Anza Blvd info@seagate.com @@ -382,7 +384,7 @@ default Union Road Liverpool - + L25 4RL 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 @@ -398,7 +400,7 @@ Leicester LE4 2BN +44 20 1294 2193 - + www.vicking-direct.com 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 From 2d7f9ea474ed01309bc5878cdd8df5a260f8c34d Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 13 Aug 2012 15:20:10 +0530 Subject: [PATCH 033/132] [FIX]: base: Fixed xml_id of country uk bzr revid: rpa@tinyerp.com-20120813095010-3eak04yezq4aorix --- openerp/addons/base/res/res_partner_demo.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/res/res_partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml index b01b2e05f18..220c3535d82 100644 --- a/openerp/addons/base/res/res_partner_demo.xml +++ b/openerp/addons/base/res/res_partner_demo.xml @@ -178,7 +178,7 @@ 81 Academy Avenue Birmingham B46 3AG - + +44 121 690 4596 email@wealthyandsons.com www.wealthyandsons.com/ @@ -299,7 +299,7 @@ 1 89 Lingfield Tower - + London +44 20 1294 2193 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HDEKDY7SWXhz0F+zagmEcrZHvc9xc717LKpabuu1ZYyd1kBqvfL7hfuS1wLR029CpeiUuy9hS2hswHb8mc+qy/Vrh8zGRHDkoaNHur4TI14XRy2p3jwXHpysDgQPgTsd/ot3pGhbxmFZSuFhex7tuR242J3/AIkrbouqz0Kzs6za1AQQ3b6RM/MqGtf1q9MsqGZM9YhERFcLiRY2PoU8fXZXpVoq8LGhjGRtADWjyA+H+pWSiIqcz3CjO38zxHuQ5PHth1XVhhrMdz7xOYGjd55fg7y381o9UfZ8NqtpC7grOPp5fFQ04cqHczYLngtaDKNmk8+4PmOoI32263+i53WtN3Ef6ZV1S1++pEbHRHpxhobnzwB1yufM9wX19e1Hq6OhqTDY/AarvtsXyBI+0ImPkc1gHKG9efr7w32A32333OouDWcoZ7T+b4c6ogw1nD41mMbHbrCRrog57nP32O5cXkkFvmSQQrqRY+lp/wC+Vk9oL0xkQBEbRBwG5HPAA9lQp4O6yrcJstouDK6fuWMxm33rVizA/ZkThGOZmw92QGPfy297YEbbrd6h4RZCfTPD/BY3LQSR6Xux2LE1ouDpg0gkMAB2677AnoNhuVb6LP0tP9lq7XrwkGRxLuA4kR/xU7xN4M/p1xAvZzI2ajaEuENGs3dxmhshxcyXbbbYE+W/Ub+q+8Lw41kNXaD1Bm8zi559NVJqlp8XOXWGOY9jSOZvnyuAJPfcq30Wfp2bt3+81oNauxSFKRtAIGOAILT8g56Ln/h5wa1rpTM15xPomaD709smtvoOlvRsJHMyKVzPd6DoOnVxPdSfhdwzzmF4m6g19qO/jBcyXPDHTxcbmQchLf6Rwd15jyA7depJJJKtlFhltTbEclvca7d1w/dHiEEgCYmUREXQqZERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERf/2Q== @@ -384,7 +384,7 @@ default Union Road Liverpool - + L25 4RL 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 @@ -400,7 +400,7 @@ Leicester LE4 2BN +44 20 1294 2193 - + www.vicking-direct.com /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCACWAJYDASIAAhEBAxEB/8QAHQABAAICAwEBAAAAAAAAAAAAAAUGBwgCAwQBCf/EAD8QAAEDAwICBwUFBgUFAAAAAAEAAgMEBREGIRIxBxMiQVFhcQgUMoGRGCNSVaEVQoKUscE0Q6Ky0TZjcnOz/8QAGQEBAQEBAQEAAAAAAAAAAAAAAAECAwUE/8QAHxEBAQACAwACAwAAAAAAAAAAAAECEQMSIQRREzFB/9oADAMBAAIRAxEAPwDctERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQERYmuXtCdG9tuNTb66qucFVTSuhmjdQPy17Tgj6hZyzxx/dWTbLKLD32kei78wuP8i9PtI9F35hcf5F6z+bj+zrWYUUfpy7QX2zU12pYKuCCpZxxNqYTFIWnkS07gHmM9yhekTXti0HSQVuoWV7KSZ3AKiCldLG13c1xHwk92eeCt3KSbqLUiw99pHou/MLj/ACL0+0j0XfmFx/kXrH5uP7XrWYUVB6P+lzR2ur0+06clr6iojiM0hfSOYxjQQMlx2G52V+W8cplNxNaERFQREQEREBERAREQFpx7XelmxaoOrqCidAyocIbgzmBMNmybdzhgeo81uOqN0t6WpNQWCpjqYuKGeIwz4G4B+F48wcL5/k4XLDxvC+vz4V76HtR6I0peje9VWG4XyqgcDRwR9X1EZ/G4OPad4DGBz3PKrans1Zp6/wBZZq5uJ6WQtyBs9vNrh5EYPzUavMluN261+mOnbrTXywW+80efd66mjqIwcZDXtDgDjvGcFU/p11pp3RmjRJqW0uvFHcJfdDRNDSZAWkkkOIGBgeeSFX/ZFv37Z6HaSle/imtdRJRu8QAeNv8ApeFiX24L+KrWFm05G/LaGkNTKO4PlOB8+Fn6henycuuLtHGT3TBmqZLDNfKibTVPXU1skdxQwVhaZIs828TSeIDuPPx8VFgEnABJPIBFknoC0cdS6rbcKqEvt9tc17gRtLN+4z+59AO9eX+67NjfZU0rHpXSTmzUThdrgBUVsxI+7b/lxD0GSfMnuAWX4LnQT18tBDVRvqohmSMHdvL/AJC6dO25tttrISB1ru1K7xd4fJQVhuUU+ublRsttLC9jXcVQwdt+C3n9f0XrccuGMlcr7aty89xraa30rqqslEULcZcRyyoSgv1ReL1VUdqbC2mpRiSolBdxuzjDQCNtjv5eajtX176zSN0hnY1lRSVDYZOH4Xbghw8iDyXS5eeJMfVvo6mGspY6mneJIpBljh3hdNdc6Chnhgq6qOGSc8MTXHdxzj+6hLBXe56PtbImCWqnjDIIs/E7fc+AHMlebWdyZRXi0RTW6kqpZHbSSNOYzxNGW/1Tt5s16t6Krag1RPa9TU1rbSslilY1xcMl+SSMAcu4fVKrUVyt+oqK2XCjpQyrI4XQyOcW5OBnIGd07ROtWlFXqu/yv1SywW9kfWtYXzyyAkN2yAACMncfVRdodTTdIFU2vMouUWeqcx+Ins4Rtw8wcZPNOxpdURFpBcZo2SxOikaHMeC1wPeCuSINUvap0DIKc36kiL57e3E+BvJTk7O/hOc+WfBa2L9INcWeO62iQmJsrmMIcwjIewjtN+i0H6T9LS6R1dU23hd7pIeuo3n96InYeoOWn0XlfI4+mTvjdxmH2HdQe66svempX4jr6VtVCCf8yI4cB5lr8/wLEXTBqE6q6TtQX0P44p6xzYD/ANlnYj/0tB9SVF6O1DXaXv8ADebcQKiKOWMZ8HxuYf0cVDkknJOSeZWLyb45j9Gvdu6hpaiurYKKkidNUTyNjiY3m5xOAFvH0DaHg03YKWmw1/uw4pZANpZzu53oOQ9AsC+zBoiW5XQ6lqIMta8wUAcNi/k+T0aNs+OfBbk26kioaKOlhHZYMZ7ye8rv8Xi3e1TO6j0LH2nWud0jXprDhxilAPnlqyCo2jsdvpLtPdIY3ipnBD3FxIOSCdvkvvym9OUulU6Iuwy5wvHDIyRvE08xzH9l69dV0VRZL1RRwFjqWSHjfth5dg/UcipySwUX7SkuNM+ejqZRiV0D8B/qCCMrnLYrfLbJLfJG90Mr+slJeeN7vxE952WZjeumu03tjxr66yjT19lndLTuj6vhAwI25OW/MEn1BUt0jPbJqCwyMcHNcQQR3jjarbUWK21FmjtEsJdSx44BxHIxy3XTPpq1TNoWyxyu9xaGwZkPZAIIHnyCnS60dpvatam36ULVn8Ef9Xrlrj/rqw+rP/orVV2S31V3hus0bjVQgBjg4gDGe75lfbhZaCvuNNX1MbnT02OrIcQBg55eqtxvp2irT+7jpBnuFtqabrII8VbKiQRtLscOGnx2GduY81IWC0tl1LUX+prKSWeQERQ08nGGDGMk9+23LvUbcrLaazVFebvA+hYcOhfHkNnz8Ti7lnPdsuiDT1NBqS3S6ckqXsjfxVMrs8DW7bZwMk77bqe7VkNERdXMREQFr/7TPR8bxY5ZaGDiq6biqaPhG7vxxfMbgeQWwCj9Q24XK2vgAHWjtRHwcP8AnkuXNx98dNY3VfmepXSVjq9Saio7LRN+9qZMF3dGwbuefIDJ/RXPp+0e7TWrXV9PAY6C5Oc9oDcCOYfGzy33+fkso+yxoGRlGL3VxFlTcW5YSN4qYHOf4jv6cK8rHC3Lq7M49FOmaSxWOmbTRdXDDEIaZvfwjm4+ZP8AfxV2XGKNkUTY42hrGgBoHcFyXr4YTDHUcLd0Owyq/adSPukUktHaqiRsZAd94wHcZ7yp93wn0VO6LP8AAVn/ALG/7VbbuQk8WKz3eluYlbCHxzQu4ZYpBhzT6L7brmKytqaYUtREac4L5GYa7fGyq8bzT9J72x5DZuy8eOY8/wBQCvdpSvrarUFzgqKh8kcRIjaeTe0szL+LYtKKgWWrvtzsVdLHWVMk8T2GLgIy4nmDtyA3+alZLpVVWoKWzSVDqdscIfVuYQ0ufw54Qe4bhWZw6rUiq1vvEtHeLnQ1E7qinp4jNE5xBcAADw57+a7NLS1d6pp7hWVUzA6QtijidwtYB/Xn3q9tp1TtwrqSgg66snZCzkC48z4Ad672OD2Ne3k4ZCo2tfe36eoJa7jZUdYWvZnY4zh2PEjB+auVtj6ughb1j39gHLzk8kmW7os1HoREWkEREBERBjHpm0XbNQUXV3Gn6yjmlY92ObJGnII8MjI9CR3q46LtLLZamExtjkkaOyBjgaB2W/RTNRDFURGKZgewkHB8jkLsXLHikzuTVy3NCIi6svjvhPoqH0e3Git1DVCtnbCXOaWhwOSAPJX1Fmzd2svio6eo57jqmo1BLDJDT7inDxgu7PDnHhjP1XDRYI1NdyQR2j/uVxRSYL2VDovBFuq8gj70c/8AxC66+ljodc++18LHUNU3AkkbljXcIG+dhuP1VzXxzWuaWuAIPMEJ08kO3u0BUQ0dZNNRWuCk4H0zxLPEwdlxxwt4h8yR4BeLQ9bBQWuehuEjaWeCVxcyU8JwfDx5dytjGtY3hY0NHgBhfHRxucHOY1xHIkbhXr7tN/xStYGtqdMUlRUsfxGoc7dmC1hJ4cju2wrdbJo56CGSJ3EzgABxzwF6SARgjKJMdXZbuCIi0giIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiD//2Q== From e79a418f9329015d9e0d8886edae47b2b2e7e1b7 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 13 Aug 2012 16:22:37 +0530 Subject: [PATCH 034/132] [IMP,ADD]: crm: Improved and added mail messages for leads/opportunities bzr revid: rpa@tinyerp.com-20120813105237-14cnt886cgyqlncv --- addons/crm/crm_lead_demo.xml | 120 ++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml index ea26a24cad8..a274dadfe01 100644 --- a/addons/crm/crm_lead_demo.xml +++ b/addons/crm/crm_lead_demo.xml @@ -49,7 +49,6 @@ Can you send details, - Want to know features and benifits to use the new software. @@ -550,53 +549,86 @@ Andrew - Kitchen design + Plan to buy a Laptop crm.lead - html - - email - sent - - - - Reply - crm.lead - - html - - comment - - - - Reply - crm.lead - - html - - - comment - - - - Reply - crm.lead - - html - - - comment - - - - Your inquiry - crm.lead - - html - + html + <![CDATA[Email0 inquiry]]><div><font size="2">Hello,</font></div><div><font size="2"><br></font></div><div><font size="2">I am interested in your company's product and I plan to buy a new laptop having latest technologies and affordable price.</font></div><div><font size="2">Can you please send me product catalogue?</font></div> email received - + + + + Re: Plan to buy a Laptop + crm.lead + + + plain + Dear Customer, +Thanks for showing interest in our products. +We have attached the catalogue, +We would like to know your interests, Let us know if we can call you for more details. + +Thanks + email + + sent + + + Re: Plan to buy a Laptop + crm.lead + + html + <div>Thanks for the information,</div><div>I will visit the store soon.</div> + + email + + received + + + Re: Plan to buy a Laptop + crm.lead + + html + <font color="#1f1f1f">Can you tell me if the store is open at 9:00 PM?</b></font> + + email + received + + + + Re: Plan to buy a Laptop + crm.lead + + plain + Yes, its open till 10:00 PM, you are welcome! + email + sent + + + + + Inquiry + crm.lead + + plain + Hello, +I am Jason from Le Club SARL, +I am intertested to attend Training organized in your company, +Can you send details, + email + received + + + + + Need Details + crm.lead + + plain + Want to know features and benifits to use the new software. + comment + From 912189bebe61b7a52b08f39a97efeb53ff6ffccc Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Mon, 13 Aug 2012 18:51:28 +0530 Subject: [PATCH 035/132] [ADD]: base: Added demo contact images bzr revid: rpa@tinyerp.com-20120813132128-crurlr8meneyrkch --- openerp/addons/base/res/res_partner_demo.yml | 36 +++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/openerp/addons/base/res/res_partner_demo.yml b/openerp/addons/base/res/res_partner_demo.yml index 18d7025878b..ebbaacb319c 100644 --- a/openerp/addons/base/res/res_partner_demo.yml +++ b/openerp/addons/base/res/res_partner_demo.yml @@ -5,6 +5,7 @@ use_parent_address: True function: Service Manager email: tang@asustek.com + image: /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCACCAFcDASIAAhEBAxEB/8QAHQAAAQUBAQEBAAAAAAAAAAAABQAEBgcIAwIBCf/EAEEQAAEDAwIDBAYGBwgDAAAAAAECAwQABREGIQcSMRNBUWEUIjJxgZEII0KhscEVJCU0Q2JyFjNSY4KywtFTkqL/xAAaAQABBQEAAAAAAAAAAAAAAAADAAECBAYF/8QAKxEAAgIBBAECAwkAAAAAAAAAAAECEQMEEiExUQUiQXGxEyMyMzRhgcHh/9oADAMBAAIRAxEAPwDWimEmeF/+WOUn5ColeGEfogIBHM264CPDoampICoyiQOqevlUbvIaRbpnaLQkNPKWrJ6J5dz7tqlYNobRXY0Rp6RLebYa9HypbigAOneahV84v6Nt7PocGai4zGXFHlbUEt5BzjmP5VmDjrxgf1dqV2BBUU2K3nsY6A5gPKGynVeOcHHgKiWmdQobfUsMNtNEAFDKdyRsNzuT51Fyb6Esfk1zD46RSibLlWJwoUkBPYPcwznpnGDUw09xD0bqKLbkQbzHRI7YJLDyuRQVzdN9s1klOpkOx0tOtJ5Cdmye/wB3QUFvdyTBfiP+sx2boc9FWrIUNgeg6Y781FSYtiZv+Q0RbJIx0eNOQj9ckebCfxqmOCPEBE2U9om4yu0edhiZbitWVcqQOdonvIThQ78ZHdV3JA9MV5xx+VETsG4gWa0Db4238U/7qZWOMDd5gx/DH+6is1P7OZ8nj+NNbFte5Yx/D/5VIYfSoYctEdOPZH5mlRNCAqC2PKlSTJOB9WAW2gsDAdx99QzimHU6B1gYyeaQm3vLbAGSSGl7DxqZPqSGFEjIQ7v86GXFTaZ8pC083OhJHwO9QCM/KBt3DfOeUq2O9FtMuOSri23HirkLGCQj8/KuuobYGOIl0szTSXUt3N5htIPqkdqoJwfDGKuLSsCzacaDMOK2JC0guqQkrKj8e6q+bNsVLtnQ0ekedtt0kDbfpbUFxQhMTsmgNyVj1U+8jvozK4bR34yEypa1SQc9okYAPkDU007ODxUkh2PtsHWeUK91OJk5TMtDUWAq4OqPrZcDaU/Oqs803Hg7GP07DHtWVvpeLN0px00in0tZQqaylBGxUkkoUnzzkjzzW90/vKfOP/1WNpFjl33i/wAP57URUfs7iQ8hRzyhvDmR4jANS7iV9I7U2ndUz7HF03b4j0FRYLsp5S+cbELAGOowfjVvSSeTGr7OBrsSx5nFLg0XMH7Pb8nz+NcLGjF6ln/K/wCVYuunGjidfWFtm+rjMqUVBuDGCMf6sZ++pZ9FvWl7Y4spi36bPkM3mOqPzy3ioh0esjAPTOCPjVt45JWyltfZsJn90b91Kvrf7o37qVDCMZylq7KYnl2SQc0FvDji5SVKbUkuM+sB1Tt1ozKBzOHdyg0Gu6VqkRsA8ymM/DlprGZh3i3pNNg1gqUiMUPx5BK1gHDqSRhQ+BB+JoxpoPS4fZx1htalE85SCavTinolGrbFJcjKSi4RkktgjZ0AZCT4Hrg+eKo3RhW23zJGeVeCO8ZrlZ4uPD6Nb6fnhnluXb7+f+h1bE+3oQ6u4qfClBPrJSCnfqcADyp3MsMefcEqndrhSe2ZGSEqJ6ggdab3+UmQ+hl50c6dyjPKPAHzpxPuMpVtSeV0tNFtCOzaJBWTj2j069AfGhVJy3Lo6TjFRLJ4R22INQNhvkJt0d5xHjlSeTP/ANVC/pR6cjMa0tGo/RkLTcoIaWop/itdPiUkfKpnwJgui93ma4SUtQg0ST9pSgcfIUR+kNZHr7wyzEC/TIAEpns2ytXq5CgAN9wTXR0Xsha8syPqsktU/wBq+hnaOEloFAAGOgFD1XBdsurFwjOhuTDeQ+0c49ZJ5h+FMWmL6hCFSHFIb7uzRzpPlkbU6Z0rPnLMowJ7iCrJV2ZCRn8q6NlB5om+NL3Vi+aTtd4YV9TNjIfSf6hnFKqh4WzdUWjSkK2vzYUaFGb5W0TCeZI7sHwpULbQLemW9JdPpMpGBhxnPyoPcZC8wHgBkN8n4ijTqkmev1DhcY49XpsDUM4h6w05orTtuvOopaWGUKUlDSU8zshQPstp+0fuHeRQwlER4jazj6Hsfpi0odnTZbUSAws4Djqz1PfypGVH4DvqhIS5MG5S1zY/Z4lOIWUjCQebOCO7qCPI1XXGDXd117rRV8UXIsSOvFtjc2fRkA5BONiskAk+4dBWgdAPWziPpBq9xexYvLIDFwZ+ypwD7Q8FDdKvDbuqOXSyzY6j+JHR9P1McGX3cJ/EFFaZoalwpK2pLeMON4zgeI7x7/CiHokqQlp64Tnn0p9ZPaHbPiB0FNp1gZt1w5SJMNwHdCD093iK9wOVzVmnbS3IddXcbqzFy4c+oQpS9vDlSQffXNxwk3sZo8upjjxudXwXvoK0MWmwhiMpt1TzXbPuNqCgpavMdwGB8KMME5iZ6FCh+NYciT7tZpK12ufMgvsLU0sMPKQQUqKSMA+INWRofjzf7O+wxqVr9MwkbBYwiQkeSuivcfnXVWLakkYqcnkk5S7ZZ2reF9jlPP3a1uP2eYXMqXEXyhSuuSn2T8qF/wBn9YRXExZWqHXoyRutmMhtZH8yu734qfxLxBv2lG7zbHe1iS0h1pRGDg9xHcQcgjxFdbdyOXN5t0BSFslKgehFRt9DbVXRHIGh7Q7GZlzrFOuy3E5S7MllwEeQJwPlSqaad5WdOxYaFlYjrcZBJycJUcfdilT2xbUV1xo482/Ra022yIau2og2ULbK/qYwxgdqR1V/IN/Eisjasv8AetT3Vy86iuT8+Y5kBTh9VtOc8qE9Ep8hTNS08ylrUVKUSVKJyST301kuc2cdKNGCRJsHqP1hHcD91SzhPrSVoTV7F2RzLgO4ZuDCf4jJO5A/xJ9oe4jvqJPY504HXIr0n1k4OxokW4ytD/A3rKiWrUdrYeymRHebS7HfbODyqGQpJ8wag6tPRtL8T9L3693qBDtEV11wSpT6WsulPKhHKT13G4237qjX0TNZNzbPI0VcHgJMAKfgFR9pgn1kD+gnOPBXlUc+kRN1Czru13qY43+iHB2dtaxu12ZClhaT9pRwc9MYHdVvNixZYrNXKJQ1GSEXjT4YJ4wQzpzjBqOGOVcSRLM+MpBBBbfAdBB6EZUR8KiNwcU7bzIU2G1ZyUg5xUv44202682J5vKocm2Zhr6jsQ4pSEA/yhzlHkE1BVqKoq28nBGMVWyR2yaBJfE0j9Ge7dvwidiOqJLF0cQnPcCEqx8yfnVmRJ8dic5IcUAgNHO9UHwBmoh8PG0qdCFyLjIXgnryhKfyqbrvKHSr9YT2TR9ffqrwPlVCT9xZWK42WBZZBTaVOOKR2j0hx3dagQCrptSqCN6hZbSGRJTlsbjPjSptw6wsyCZBUdzSLmaYhzIya6IUauWAOpICsGvrB5k9pjBV0HgP+68bKGO8V6RlByBkdSKcQY0vd5undRQb7bz+sQ3g4kZwFj7SD5KBIPvq2vpN3aLemtH3S3LKoEqK5LaOegcUkEHzBTg+41TKMKRkEEGjCLm9OssKxSFczUNx5UZR+wHeUqT7uZPN71GjQl7XHyRrmyxeIF3jak4MaOlpHLcLFJctcseKFI5mljyIbx7warZbnKzmu0uU+xa3IaV8rbkhtTiO44zj5E/fQ1939WVjGxHfQpO2OWpobTcRekLa++24XHULeyHCPaWcY+GKPt2KGhh1nsir0oczpJOeUb/OhvCO7MyNHQIbyJSltLdZS6Gvq+UKyBnx3qQu8r/qKdcSknJ8MjbBrM7pRzzUvP8AbO+qlijt8ANGmbfgK5HjtsrnIJFKpOhAEdOHObYdRSqq3K+GWE1XKMm57j0r20s+yrqKblW4376+rOFhWeoxWrMyPkL9anCFZxQ1Du+adIXkVJMQ5S52asn2D18vOnDbhQ6laTgg560x589a+Mu4PYqO/VB/KnsQbuL3NHyD7Sk+7qOlMXljssKBOVdM1zefJhISNyHEgg+8VzfV7KT5mnbsVl48FCpfDf1Egq/STqevT2T+FH5cEvTC8pIO+3rYqJ8CVKc0JcEI3U3cSQM/5aDUscmMBzC+dvf7aSKyet3LPKvJotJTxRvwE4rKxGSCjcedKvUR1KmgpshQPeDmlQ0nRJtWY+C8rSPM19eJLiB76btLy8n410UrLqT5VqzNjhJ7qcMr2polWdq6tqxUkxDoKzXh8cwB6HuIrwlVeirupxCXJUpLaFe32qObz3605kL+sV/KAKHvYCkK8FpP312cUcq3zv18aYai/uAUZDXDx6Sfakz3Vf8AqEpH4Gpc6lJVsnNQrgPcOfh25FQ8AuNOdCk7bBQSoH471KHpslCiQ79wrJ62/t5fM0ekX3UaHaGWhlSELaV/iRtn4dKVDhcZOTl38KVQjKVBHFWZNa/vR7jXVP8Aef6aVKtajMnZrvrq3SpU6Edk9BX09fhSpVITOL3RH9afxrovrSpUwi1/o5k4v6c7YZOPiqrGm9VUqVZX1L9S/wCPoaDQ/koFy/aFKlSoEeg8uz//2Q== - !record {model: 'res.partner', id: base.res_partner_address_2}: name: Joseph Walters @@ -12,6 +13,7 @@ use_parent_address: True function: Store Manager email: joseph.walters@asustek.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_3}: name: Thomas Passot @@ -26,6 +28,7 @@ use_parent_address: True function: Analyst email: m.fletcher@agrolait.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_5}: name: Chao Wang @@ -33,6 +36,7 @@ use_parent_address: True function: Marketing Manager email: chao_wang@chinaexport.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_6}: name: Zhi Ch'ang @@ -46,7 +50,7 @@ parent_id: base.res_partner_4 use_parent_address: True function: Production Supervisor - email: + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_8}: name: Paul Williams @@ -68,6 +72,7 @@ use_parent_address: True function: Senior Consultant email: david.s@tech.info + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_11}: name: John M. Brown @@ -75,13 +80,13 @@ use_parent_address: True function: Director email: john.b@tech.info + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_12}: name: James Miller parent_id: base.res_partner_6 use_parent_address: True function: Electrical Supervisor - email: - !record {model: 'res.partner', id: base.res_partner_address_13}: name: Charlie Bernard @@ -89,6 +94,7 @@ use_parent_address: True function: Senior Associate email: charlie.bernard@wealthyandsons.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_14}: name: Jessica Dupont @@ -96,20 +102,21 @@ use_parent_address: True function: Analyst email: jessica.dupont@wealthyandsons.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_15}: name: Phillipp Miller parent_id: base.res_partner_8 use_parent_address: True function: Creative Director - email: + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_16}: name: Ayaan Agarwal parent_id: base.res_partner_9 use_parent_address: True function: Director - email: + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_17}: name: Daniel Jackson @@ -117,6 +124,7 @@ use_parent_address: True function: Managing Partner email: daniel@jackson.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_18}: name: William Thomas @@ -124,6 +132,7 @@ use_parent_address: True function: Senior Consultant email: william@jackson.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_19}: name: Sergio Pérez @@ -144,14 +153,12 @@ parent_id: base.res_partner_12 use_parent_address: True function: Director - email: - !record {model: 'res.partner', id: base.res_partner_address_22}: name: Laith Jubair parent_id: base.res_partner_13 use_parent_address: True function: Director - email: - !record {model: 'res.partner', id: base.res_partner_address_23}: name: Angel Cook @@ -166,13 +173,14 @@ use_parent_address: True function: System Analyst email: robert.anderson@chamberworks.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_25}: name: Jacob Taylor parent_id: base.res_partner_15 use_parent_address: True function: Order Clerk - email: + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_26}: name: Arthur Gomez @@ -186,14 +194,15 @@ parent_id: base.res_partner_16 use_parent_address: True function: Technical Director - email: + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_28}: name: Benjamin Flores parent_id: base.res_partner_17 use_parent_address: True function: Business Executive - email: ben@nebula.ar + email: ben@nebula.ar + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_29}: name: George Wilson @@ -208,6 +217,7 @@ use_parent_address: True function: Functional Consultant email: jones@thinkbig.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_31}: name: Edward Foster @@ -221,21 +231,21 @@ parent_id: base.res_partner_21 use_parent_address: True function: Sales Manager - email: + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_33}: name: Morgan Rose parent_id: base.res_partner_21 use_parent_address: True function: Financial Manager - email: + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_34}: name: Kevin Clarke parent_id: base.res_partner_21 use_parent_address: True function: Knowledge Manager - email: + image: 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 - !record {model: 'res.partner', id: base.res_partner_address_35}: name: Peter Mitchell @@ -251,6 +261,7 @@ use_parent_address: True function: Chief Executive Officer (CEO) email: mark@yourcompany.com + image: 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 - !record {model: 'res.partner', id: base.res_partner_main2}: name: Roger Scott @@ -259,3 +270,4 @@ use_parent_address: True function: Chief Operations Officer (COO) email: roger@yourcompany.com + image: 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 From b6c254942ab491a2273b42c377f1cf4772b96073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 13 Aug 2012 16:43:55 +0200 Subject: [PATCH 036/132] [FIX] point_of_sale: images are working now bzr revid: fva@openerp.com-20120813144355-vgojt7llli8u9vye --- addons/point_of_sale/point_of_sale_demo.xml | 179 +++++++++++++------- addons/point_of_sale/static/src/css/pos.css | 7 +- 2 files changed, 124 insertions(+), 62 deletions(-) diff --git a/addons/point_of_sale/point_of_sale_demo.xml b/addons/point_of_sale/point_of_sale_demo.xml index 9c87693a566..8a17299882d 100644 --- a/addons/point_of_sale/point_of_sale_demo.xml +++ b/addons/point_of_sale/point_of_sale_demo.xml @@ -158,7 +158,124 @@ - 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aVK5ZUlhJ7RvgfrWEsHSl0OiONqx6lV/BNr/AMsrydf97B/oKxeW031ZqsxqdUirL4Lus/uL6PH+2p/pWbyxdGWsy7xIH8Gavj93fWmf9pWpf2b5lf2jH+URfBOrFvnv7Xb7I1NZb5ieYr+UtweCXwPP1A8do4/8auOXQW7ZnLMJPZF2Pwbp6ffnupPYuAP0FaxwVJdzOWNqvsatnpdjYDFtbJGf7wHP510RhGOyOeVSUt2WqsgKACgAoAKACgAoAKACgAoAKACgAFCAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAFCAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAFCAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAFCAKACgAoAKACgAoAKACgApAFMAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAQGkAZoAM0AGaADNABmgAzQAZoAM0AGaADNABmgAzQAZoAM0ALRcAzRcBM0AGaLgANAC5oAKYBQAUgA0AGaADNABmgAFABTAKACgAoAKACgAoAKACgAzSAM0AGaAAc0AFABmgAzQAZoQBmgAzQAZoAM0AFMAoADSAM0AJmgYZoELmi4wouAUXEFABQAUAApgAAD/2Q== + /9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK +CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU +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 +IIGCCBjBggYzBBHpgggrnGYzHrGIxH//2Q== 2.83 @@ -1024,65 +1141,5 @@ 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 - - - 1.55 - Lays Natural XXL 300g - - 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 - - - 1.48 - Lays Natural Light 170g - - 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 - - - 1.48 - Lays Natural Light 170g - - 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 - - - 0.39 - Lays Natural 45g - - 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 - - - - 7.60 - IJsboerke Chocolat 2.5L - - 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 - - - 7.60 - IJsboerke Mocha 2.5L - - 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 - - - 7.40 - IJsboerke Vanilla 2.5L - - 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 - - - 8.40 - IJsboerke Stracciatella 2.5L - - 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 - - - 7.60 - IJsboerke 2.5L White Lady - - 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 - - diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 4101296c87a..5191b91b24b 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -31,6 +31,7 @@ background: -ms-linear-gradient(top,rgba(0,0,0,0.09),rgba(0,0,0,0)); background: linear-gradient(top,rgba(0,0,0,0.09),rgba(0,0,0,0)); } + .point-of-sale .darker-shadow-top{ position: absolute; top:0; @@ -42,6 +43,7 @@ background: -ms-linear-gradient(top,rgba(0,0,0,0.15),rgba(0,0,0,0)); background: linear-gradient(top,rgba(0,0,0,0.15),rgba(0,0,0,0)); } + /* ********* The black loading screen ********* */ .point-of-sale .loader{ @@ -527,9 +529,11 @@ cursor: pointer; } +/* .point-of-sale .category-button .category-img img { height: 100px; } +*/ .point-of-sale .category-button .category-name { position: absolute; @@ -577,7 +581,8 @@ } .point-of-sale .product .product-img img { - height: 100px; + max-height: 100px; + max-width: 120px; } .point-of-sale .product .price-tag { From 48062d4cf1a509afb0c364027ca5f99dc8c85bbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 13 Aug 2012 18:00:26 +0200 Subject: [PATCH 037/132] [IMP] point_of_sale: removed IndexeDB and asynchronous backend bzr revid: fva@openerp.com-20120813160026-04w28p3pojzvdlkj --- addons/point_of_sale/static/src/js/pos_db.js | 349 ++---------------- .../point_of_sale/static/src/js/pos_models.js | 34 +- .../static/src/js/pos_screens.js | 24 +- .../static/src/js/pos_widgets.js | 32 +- 4 files changed, 66 insertions(+), 373 deletions(-) diff --git a/addons/point_of_sale/static/src/js/pos_db.js b/addons/point_of_sale/static/src/js/pos_db.js index 0be3d058da4..5c790b45d9e 100644 --- a/addons/point_of_sale/static/src/js/pos_db.js +++ b/addons/point_of_sale/static/src/js/pos_db.js @@ -1,284 +1,5 @@ -/** - * WIP : AS OF THIS COMMIT, THE INDEXEDB BACKEND IS IN A NON WORKING STATE - * - * This file contains an IndexedDB (html5 database) backend for the Point Of Sale. - * The IDB is used to store the list of products and especially their thumbnails, which may - * not fit in the localStorage. - * The IDB offers a big performance boost for products lookup, but not so much for search as - * searching is not yet implemented in the IndexedDB API and must be performed manually in JS. - * - * this file also contains a localstorage implementation of the database to be used by browsers - * that don't support the indexeddb api. - * - */ function openerp_pos_db(instance, module){ - function importIndexedDB(){ - if('indexedDB' in window){ - return true; - }else if('webkitIndexedDB' in window){ - window.indexedDB = window.webkitIndexedDB; - window.IDBCursor = window.webkitIDBCursor; - window.IDBDatabase = window.webkitIDBDatabase; - window.IDBDatabaseError = window.webkitIDBDatabaseError; - window.IDBDatabaseException = window.webkitIDBDatabaseException; - window.IDBFactory = window.webkitIDBFactory; - window.IDBIndex = window.webkitIDBIndex; - window.IDBKeyRange = window.webkitIDBKeyRange; - window.IDBObjectSrore = window.webkitIDBOjbectStore; - window.IDBRequest = window.webkitIDBRequest; - window.IDBTransaction = window.webkitIDBTransaction; - }else if('mozIndexedDB' in window){ - window.indexedDB = window.mozIndexedDB; - }else{ - throw new Error("DATABASE ERROR: IndexedDB not implemented. Please upgrade your web browser"); - } - } - importIndexedDB(); - - module.PosDB = instance.web.Class.extend({ - - version: 1, - name: 'openerp_pos_db', - limit: 50, - - init: function(options){ - var self = this; - options = options || {}; - - this.version = options.version || this.version; - this.name = options.name || this.name; - - var open_request = indexedDB.open(this.name, this.version); - - open_request.onblocked = function(event){ - throw new Error("DATABASE ERROR: request blocked."); - }; - - // new API (firefox) - open_request.onupgradeneeded = function(event){ - console.log('using new API'); - var transaction = open_request.transaction; - self._upgrade_db(event.oldVersion,transaction); - }; - - open_request.onsuccess = function(event){ - console.log('db',self.db); - self.db = open_request.result; - var oldVersion = Number(self.db.version); - - if(oldVersion !== self.version){ - // if we get to this point, it means that onupgradeneeded hasn't been called. - // so we try the old api (webkit) - if(!self.db.setVersion){ - throw new Error("DATABASE ERROR: database API is broken. Your web browser is probably out of date"); - } - console.log('using old API'); - var version_request = self.db.setVersion(self.version); - version_request.onsuccess = function(event){ - var transaction = version_request.result; - self._upgrade_db(oldVersion, transaction); - }; - } - }; - }, - _upgrade_db: function(oldversion, transaction){ - console.log('upgrade_db:',oldversion); - - this.db = transaction.db; - var productStore = this.db.createObjectStore('products', {keyPath: 'id'}); - - productStore.createIndex('ean13', 'ean13', {unique:true}); - - productStore.createIndex('name', 'name', {unique:false}); - - productStore.createIndex('category','category', {unique:false}); - - var imageStore = this.db.createObjectStore('images', {keyPath: 'id'}); - - var categoryStore = this.db.createObjectStore('categories', {keypath:'name'}); - }, - - _add_data: function(store, data){ - var transaction = this.db.transaction([store], 'readwrite'); - var objectStore = transaction.objectStore(store); - var request = objectStore.put(data); - }, - /* adds a product to the database, replacing the original product if it is already present. - * the product must be provided as a json as returned by the openerp backend - */ - add_product: function(product){ - if(product instanceof Array){ - for(var i = 0, len = product.length; i < len; i++){ - this.add_product(product[i]); - } - }else{ - if(product.product_image_small){ - var image = product.product_image_small; - var product = _.clone(product); - delete product['product_image_small']; - this._add_data('images', { id: product.id, image:image}); - } - this._add_data('products',product); - } - }, - - /* removes all the data in the database ! */ - clear: function(done_callback){ - var transaction = this.db.transaction(['products','images'],'readwrite'); - transaction.objectStore('products').clear(); - transaction.objectStore('images').clear(); - if(done_callback){ - transaction.oncomplete = function(){ done_callback(); }; - } - }, - - get_product_count: function(result_callback){ - this.db.transaction('products').objectStore('products').count().onsuccess = function(event){ - result_callback(event.target.result); - }; - }, - - get_image_count: function(result_callback){ - this.db.transaction('images').objectStore('images').count().onsuccess = function(event){ - result_callback(event.target.result); - }; - }, - - /* fetches a product with an id of 'id', returns the product as the first parameter - * of the result_callback function - */ - get_product_by_id: function(id, result_callback){ - var transaction = this.db.transaction('products'); - var objectStore = transaction.objectStore('products'); - var request = objectStore.get(id); - request.onsuccess = function(event){ - if(result_callback){ - result_callback(event.target.result); - } - }; - }, - get_product_by_name: function(name, result_callback){ - var transaction = this.db.transaction('products'); - var objectStore = transaction.objectStore('products'); - var index = objectStore.index('name'); - index.get(name).onsuccess = function(event){ - result_callback(event.target.result); - }; - }, - /* fetches the product with the ean13 matching the one provided. returns the product - * as the first parameter of the result_callback function - */ - get_product_by_ean13: function(ean13, result_callback){ - var transaction = this.db.transaction('products'); - var objectStore = transaction.objectStore('products'); - var index = objectStore.index('ean13'); - index.get(ean13).onsuccess = function(event){ - result_callback(event.target.result); - }; - }, - /* fetches all products belonging to a category, and returns the list of products - * as the first paramter of the result_callback function - */ - get_product_by_category: function(category, result_callback){ - var transaction = this.db.transaction('products'); - var objectStore = transaction.objectStore('products'); - var index = objectStore.index('category'); - var list = []; - index.openCursor(IDBKeyRange.only(category)).onsuccess = function(event){ - var cursor = event.target.result; - if(cursor){ - list.push(cursor.value); - cursor.continue(); - }else{ - result_callback(list); - } - }; - }, - /* Fetches a picture associated with a product. - * product: This is a product json object as returned by the openerp backend. - * result_callback: a callback that gets the image data as parameter. - */ - get_product_image: function(product, result_callback){ - var transaction = this.db.transaction('images'); - var objectStore = transaction.objectStore('images'); - var request = objectStore.get(product.id); - request.onsuccess = function(event){ - result_callback(event.target.result.image); - } - }, - /* fields: a string or a list of string representing the list of the fields that - * will be searched. the values of those field must be a string. - * query: a string that will be matched in the content of one of the searched fields. - * result_callback: a function that will be called with a list of all the products with - * a field that match the query. - */ - search_product: function(fields,query,result_callback){ - var transaction = this.db.transaction('products'); - var objectStore = transaction.objectStore('products'); - var list = []; - if(!(fields instanceof Array)){ - fields = [ fields ]; - } - query = query.toLowerCase(); - objectStore.openCursor().onsuccess = function(event){ - var cursor = event.target.result; - if(cursor){ - var obj = cursor.value; - for(var i = 0, len = fields.length; i < len; i++){ - if(obj[fields[i]].toLowerCase().indexOf(query) != -1){ - list.push(obj); - break; - } - } - cursor.continue(); - }else{ - result_callback(list); - } - } - }, - /* the callback function will be called with all products as parameter, by increasing id. - * if the callback returns 'break' the iteration will stop - */ - for_all_products: function(callback){ - var transaction = this.db.transaction('products'); - var objectStore = transaction.objectStore('products'); - objectStore.openCursor().onsuccess = function(event){ - var cursor = event.target.result; - if(cursor){ - var ret = callback(cursor.value); - if(ret !== 'break'){ - cursor.continue(); - } - } - }; - }, - /* the callback function will be called with all products as parameter by increasing id. - * if the callback returns 'break', the iteration will stop - * if the callback returns a product object, it will be inserted in the db, possibly - * overwriting an existing product. The intended usage is for the callback to return a - * modified version version of the product with the same id. Anything else and you're on your own. - */ - modify_all_products: function(callback){ - var transaction = this.db.transaction('products','readwrite'); - var objectStore = transaction.objectStore('products'); - objectStore.openCursor().onsuccess = function(event){ - var cursor = event.target.result; - if(cursor){ - var ret = callback(cursor.value); - if(ret === undefined || ret === null){ - cursor.continue(); - }else if(ret === 'break'){ - return; - }else{ - objectStore.put(ret); - } - } - }; - }, - }); - window.PosDB = module.PosDB; - /* PosLS is a LocalStorage based implementation of the point of sale database, it performs better for few products, but does not scale beyond 500 products. */ @@ -372,7 +93,7 @@ function openerp_pos_db(instance, module){ make_ancestors(this.root_category_id, []); }, /* this internal method returns from disc a dictionary associating ids to the products */ - _get_products: function(){ + _load_products: function(){ if(this.products_cache){ return this.products_cache; } @@ -384,12 +105,12 @@ function openerp_pos_db(instance, module){ } }, /* this internal method saves a dictionary associating ids to product to the disc */ - _set_products: function(products){ + _save_products: function(products){ localStorage[this.products] = JSON.stringify(products); this.products_cache = products; }, /* this internal method returns from disc a dictionary associating ids to the categories */ - _get_categories: function(){ + _load_categories: function(){ if(this.categories_cache){ return this.categories_cache; } @@ -401,13 +122,13 @@ function openerp_pos_db(instance, module){ } }, /* this internal method saves to disc an array associating ids to the categories */ - _set_categories: function(categories){ + _save_categories: function(categories){ localStorage[this.categories] = JSON.stringify(categories); this.categories_cache = categories; }, add_products: function(products){ - var stored_products = this._get_products(); - var stored_categories = this._get_categories(); + var stored_products = this._load_products(); + var stored_categories = this._load_categories(); if(!products instanceof Array){ products = [products]; @@ -429,16 +150,13 @@ function openerp_pos_db(instance, module){ } stored_products[product.id] = product; } - this._set_products(stored_products); - this._set_categories(stored_categories); + this._save_products(stored_products); + this._save_categories(stored_categories); }, /* removes all the data from the database. TODO : being able to selectively remove data */ - clear: function(done_callback){ + clear: function(){ localStorage.removeItem(this.products); localStorage.removeItem(this.categories); - if(done_callback){ - done_callback(); - } }, /* this internal methods returns the count of properties in an object. */ _count_props : function(obj){ @@ -450,42 +168,27 @@ function openerp_pos_db(instance, module){ } return count; }, - get_product_count: function(result_callback){ - result_callback(this._count_props(this._get_products())); + get_product_by_id: function(id){ + return this._load_products()[id]; }, - get_product_by_id: function(id, result_callback){ - var products = this._get_products(); - result_callback( products[id] ); - }, - get_product_by_name: function(name, result_callback){ - var products = this._get_products(); - for(var i in products){ - if(products[i] && products[i].name === name){ - result_callback(products[i]); - return; - } - } - result_callback(undefined); - }, - get_product_by_ean13: function(ean13, result_callback){ - var products = this._get_products(); + get_product_by_ean13: function(ean13){ + var products = this._load_products(); for(var i in products){ if( products[i] && products[i].ean13 === ean13){ - result_callback(products[i]); - return; + return products[i]; } } - result_callback(undefined); + return undefined; }, - get_product_by_category: function(category_id, result_callback){ - var stored_categories = this._get_categories(); - var stored_products = this._get_products(); + get_product_by_category: function(category_id){ + var stored_categories = this._load_categories(); + var stored_products = this._load_products(); var product_ids = stored_categories[category_id]; var list = []; for(var i = 0, len = Math.min(product_ids.length,this.limit); i < len; i++){ list.push(stored_products[product_ids[i]]); } - result_callback(list); + return list; }, /* returns as a parameter of the result_callback function a list of products with : * - a category that is or is a child of category_id, @@ -493,10 +196,10 @@ function openerp_pos_db(instance, module){ * If a search is started before the previous has returned, the previous search may be cancelled * (and the corresponding result_callback never called) */ - search_product_in_category: function(category_id, fields, query, result_callback){ + search_product_in_category: function(category_id, fields, query){ var self = this; - var stored_categories = this._get_categories(); - var stored_products = this._get_products(); + var stored_categories = this._load_categories(); + var stored_products = this._load_products(); var product_ids = stored_categories[category_id]; var list = []; var count = 0; @@ -521,14 +224,14 @@ function openerp_pos_db(instance, module){ } } } - result_callback(list); + return list; }, // TODO move the order storage from the crappy DAO in pos_models.js - add_order: function(order,done_callback){ + add_order: function(order){ }, - remove_order: function(order_id, done_callback){ + remove_order: function(order_id){ }, - get_orders: function(result_callback){ + get_orders: function(){ }, }); diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js index 1fb8a0174fa..0f4d1b8aa64 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/pos_models.js @@ -216,7 +216,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal self.db.add_categories(categories); return fetch( 'product.product', - ['name', 'list_price','price','pos_categ_id', 'taxes_id','image', 'ean13', 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type'], + ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type'], [['pos_categ_id','!=', false]], {pricelist: self.get('shop').pricelist_id[0]} // context for price ); @@ -367,23 +367,21 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal scan_product: function(parsed_ean){ var self = this; - var def = new $.Deferred(); - this.db.get_product_by_ean13(parsed_ean.base_ean, function(product){ - var selectedOrder = this.get('selectedOrder'); - if(!product){ - def.reject('product-not-found: '+parsed_ean.base_ean); - return; - } - if(parsed_ean.type === 'price'){ - selectedOrder.addProduct(new module.Product(product), {price:parsed_ean.value}); - }else if(parsed_ean.type === 'weight'){ - selectedOrder.addProduct(new module.Product(product), {quantity:parsed_ean.value, merge:false}); - }else{ - selectedOrder.addProduct(new module.Product(product)); - } - def.resolve(); - }); - return def; + var product = this.db.get_product_by_ean13(parsed_ean.base_ean); + var selectedOrder = this.get('selectedOrder'); + + if(!product){ + return false; + } + + if(parsed_ean.type === 'price'){ + selectedOrder.addProduct(new module.Product(product), {price:parsed_ean.value}); + }else if(parsed_ean.type === 'weight'){ + selectedOrder.addProduct(new module.Product(product), {quantity:parsed_ean.value, merge:false}); + }else{ + selectedOrder.addProduct(new module.Product(product)); + } + return true; }, }); diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/pos_screens.js index 92665c5c381..659ee09c232 100644 --- a/addons/point_of_sale/static/src/js/pos_screens.js +++ b/addons/point_of_sale/static/src/js/pos_screens.js @@ -160,19 +160,17 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa // there's an error. barcode_product_action: function(ean){ var self = this; - this.pos_widget.scan_product(ean) - .done(function(){ - self.pos.proxy.scan_item_success(ean); - if(self.barcode_product_screen){ - self.pos_widget.screen_selector.set_current_screen(self.barcode_product_screen); - } - }) - .fail(function(){ - self.pos.proxy.scan_item_error_unrecognized(ean); - if(self.barcode_product_error_popup && self.pos_widget.screen_selector.get_user_mode() !== 'cashier'){ - self.pos_widget.screen_selector.show_popup(self.barcode_product_error_popup); - } - }); + if(pos_widget.scan_product(ean)){ + self.pos.proxy.scan_item_success(ean); + if(self.barcode_product_screen){ + self.pos_widget.screen_selector.set_current_screen(self.barcode_product_screen); + } + }else{ + self.pos.proxy.scan_item_error_unrecognized(ean); + if(self.barcode_product_error_popup && self.pos_widget.screen_selector.get_user_mode() !== 'cashier'){ + self.pos_widget.screen_selector.show_popup(self.barcode_product_error_popup); + } + } }, // what happens when a cashier id barcode is scanned. diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/pos_widgets.js index 106a7ca7c4b..329bb05aca8 100644 --- a/addons/point_of_sale/static/src/js/pos_widgets.js +++ b/addons/point_of_sale/static/src/js/pos_widgets.js @@ -242,7 +242,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.renderElement(); }, get_image_url: function() { - return 'data:image/gif;base64,'+this.model.get('image'); + return 'web/binary/image?session_id='+instance.connection.session_id+'&model=product.product&field=image&id='+this.model.get('id')+'&cache=1800'; }, renderElement: function() { this._super(); @@ -471,25 +471,20 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa var self = this; // find all products belonging to the current category - this.pos.db.get_product_by_category(this.category.id, function(products){ - // product lists watch for reset events on 'products' to re-render. - // FIXME that means all productlist widget re-render... even the hidden ones ! - self.pos.get('products').reset(products); - }); + var products = this.pos.db.get_product_by_category(this.category.id); + self.pos.get('products').reset(products); // filter the products according to the search string this.$('.searchbox input').keyup(function(){ query = $(this).val().toLowerCase(); if(query){ - self.pos.db.search_product_in_category(self.category.id, ['name','ean13'], query, function(products){ - self.pos.get('products').reset(products); - self.$('.search-clear').fadeIn(); - }); + var products = self.pos.db.search_product_in_category(self.category.id, ['name','ean13'], query); + self.pos.get('products').reset(products); + self.$('.search-clear').fadeIn(); }else{ - self.pos.db.get_product_by_category(self.category.id, function(products){ - self.pos.get('products').reset(products); - self.$('.search-clear').fadeOut(); - }); + var products = self.pos.db.get_product_by_category(self.category.id); + self.pos.get('products').reset(products); + self.$('.search-clear').fadeOut(); } }); @@ -497,11 +492,10 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa //reset the search when clicking on reset this.$('.search-clear').click(function(){ - self.pos.db.get_product_by_category(self.category.id, function(products){ - self.pos.get('products').reset(products); - self.$('.searchbox input').val('').focus(); - self.$('.search-clear').fadeOut(); - }); + var products = self.pos.db.get_product_by_category(self.category.id); + self.pos.get('products').reset(products); + self.$('.searchbox input').val('').focus(); + self.$('.search-clear').fadeOut(); }); }, }); From 8627aa0b28c643b45baecd369a3dac4d006b916f Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Tue, 14 Aug 2012 00:16:01 +0200 Subject: [PATCH 038/132] [IMP] point_of_sale add html5 manifest on /pos/app bzr revid: al@openerp.com-20120813221601-gfvwiwii6s1b785d --- addons/point_of_sale/__openerp__.py | 1 - addons/point_of_sale/controllers/__init__.py | 3 ++ .../{controllers.py => controllers/main.py} | 31 +++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 addons/point_of_sale/controllers/__init__.py rename addons/point_of_sale/{controllers.py => controllers/main.py} (66%) diff --git a/addons/point_of_sale/__openerp__.py b/addons/point_of_sale/__openerp__.py index 3f78580b958..1b6a6f1390f 100644 --- a/addons/point_of_sale/__openerp__.py +++ b/addons/point_of_sale/__openerp__.py @@ -83,7 +83,6 @@ Main features: 'application': True, # Web client 'js': [ - 'static/lib/backbone/backbone-0.9.2.js', 'static/lib/mousewheel/jquery.mousewheel-3.0.6.js', 'static/src/js/pos_db.js', 'static/src/js/pos_models.js', diff --git a/addons/point_of_sale/controllers/__init__.py b/addons/point_of_sale/controllers/__init__.py new file mode 100644 index 00000000000..b5f0bcc9ec6 --- /dev/null +++ b/addons/point_of_sale/controllers/__init__.py @@ -0,0 +1,3 @@ +import main +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/point_of_sale/controllers.py b/addons/point_of_sale/controllers/main.py similarity index 66% rename from addons/point_of_sale/controllers.py rename to addons/point_of_sale/controllers/main.py index 33a96dacf84..7fb417e92c2 100644 --- a/addons/point_of_sale/controllers.py +++ b/addons/point_of_sale/controllers/main.py @@ -1,14 +1,44 @@ # -*- coding: utf-8 -*- import logging +import simplejson try: import openerp.addons.web.common.http as openerpweb + from openerp.addons.web.controllers.main import manifest_list, module_boot, html_template except ImportError: import web.common.http as openerpweb class PointOfSaleController(openerpweb.Controller): _cp_path = '/pos' + @openerpweb.httprequest + def app(self, req, s_action=None, **kw): + js = "\n ".join('' % i for i in manifest_list(req, None, 'js')) + css = "\n ".join('' % i for i in manifest_list(req, None, 'css')) + + cookie = req.httprequest.cookies.get("instance0|session_id") + session_id = cookie.replace("%22","") + template = html_template.replace(' Date: Tue, 14 Aug 2012 00:16:45 +0200 Subject: [PATCH 039/132] [FIX] remove unused or duplicate files bzr revid: al@openerp.com-20120813221645-s8n8du7fy2sqhl0g --- .../static/lib/backbone/backbone-0.5.3.js | 1158 ------------- .../static/lib/backbone/backbone-0.9.2.js | 1431 ----------------- addons/point_of_sale/static/test.html | 22 - 3 files changed, 2611 deletions(-) delete mode 100644 addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js delete mode 100644 addons/point_of_sale/static/lib/backbone/backbone-0.9.2.js delete mode 100644 addons/point_of_sale/static/test.html diff --git a/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js b/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js deleted file mode 100644 index 8958c798466..00000000000 --- a/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js +++ /dev/null @@ -1,1158 +0,0 @@ -// Backbone.js 0.5.3 -// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc. -// Backbone may be freely distributed under the MIT license. -// For all details and documentation: -// http://documentcloud.github.com/backbone - -(function(){ - - // Initial Setup - // ------------- - - // Save a reference to the global object. - var root = this; - - // Save the previous value of the `Backbone` variable. - var previousBackbone = root.Backbone; - - // The top-level namespace. All public Backbone classes and modules will - // be attached to this. Exported for both CommonJS and the browser. - var Backbone; - if (typeof exports !== 'undefined') { - Backbone = exports; - } else { - Backbone = root.Backbone = {}; - } - - // Current version of the library. Keep in sync with `package.json`. - Backbone.VERSION = '0.5.3'; - - // Require Underscore, if we're on the server, and it's not already present. - var _ = root._; - if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._; - - // For Backbone's purposes, jQuery or Zepto owns the `$` variable. - var $ = root.jQuery || root.Zepto; - - // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable - // to its previous owner. Returns a reference to this Backbone object. - Backbone.noConflict = function() { - root.Backbone = previousBackbone; - return this; - }; - - // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option will - // fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and set a - // `X-Http-Method-Override` header. - Backbone.emulateHTTP = false; - - // Turn on `emulateJSON` to support legacy servers that can't deal with direct - // `application/json` requests ... will encode the body as - // `application/x-www-form-urlencoded` instead and will send the model in a - // form param named `model`. - Backbone.emulateJSON = false; - - // Backbone.Events - // ----------------- - - // A module that can be mixed in to *any object* in order to provide it with - // custom events. You may `bind` or `unbind` a callback function to an event; - // `trigger`-ing an event fires all callbacks in succession. - // - // var object = {}; - // _.extend(object, Backbone.Events); - // object.bind('expand', function(){ alert('expanded'); }); - // object.trigger('expand'); - // - Backbone.Events = { - - // Bind an event, specified by a string name, `ev`, to a `callback` function. - // Passing `"all"` will bind the callback to all events fired. - bind : function(ev, callback, context) { - var calls = this._callbacks || (this._callbacks = {}); - var list = calls[ev] || (calls[ev] = []); - list.push([callback, context]); - return this; - }, - - // Remove one or many callbacks. If `callback` is null, removes all - // callbacks for the event. If `ev` is null, removes all bound callbacks - // for all events. - unbind : function(ev, callback) { - var calls; - if (!ev) { - this._callbacks = {}; - } else if (calls = this._callbacks) { - if (!callback) { - calls[ev] = []; - } else { - var list = calls[ev]; - if (!list) return this; - for (var i = 0, l = list.length; i < l; i++) { - if (list[i] && callback === list[i][0]) { - list[i] = null; - break; - } - } - } - } - return this; - }, - - // Trigger an event, firing all bound callbacks. Callbacks are passed the - // same arguments as `trigger` is, apart from the event name. - // Listening for `"all"` passes the true event name as the first argument. - trigger : function(eventName) { - var list, calls, ev, callback, args; - var both = 2; - if (!(calls = this._callbacks)) return this; - while (both--) { - ev = both ? eventName : 'all'; - if (list = calls[ev]) { - for (var i = 0, l = list.length; i < l; i++) { - if (!(callback = list[i])) { - list.splice(i, 1); i--; l--; - } else { - args = both ? Array.prototype.slice.call(arguments, 1) : arguments; - callback[0].apply(callback[1] || this, args); - } - } - } - } - return this; - } - - }; - - // Backbone.Model - // -------------- - - // Create a new model, with defined attributes. A client id (`cid`) - // is automatically generated and assigned for you. - Backbone.Model = function(attributes, options) { - var defaults; - attributes || (attributes = {}); - if (defaults = this.defaults) { - if (_.isFunction(defaults)) defaults = defaults.call(this); - attributes = _.extend({}, defaults, attributes); - } - this.attributes = {}; - this._escapedAttributes = {}; - this.cid = _.uniqueId('c'); - this.set(attributes, {silent : true}); - this._changed = false; - this._previousAttributes = _.clone(this.attributes); - if (options && options.collection) this.collection = options.collection; - this.initialize(attributes, options); - }; - - // Attach all inheritable methods to the Model prototype. - _.extend(Backbone.Model.prototype, Backbone.Events, { - - // A snapshot of the model's previous attributes, taken immediately - // after the last `"change"` event was fired. - _previousAttributes : null, - - // Has the item been changed since the last `"change"` event? - _changed : false, - - // The default name for the JSON `id` attribute is `"id"`. MongoDB and - // CouchDB users may want to set this to `"_id"`. - idAttribute : 'id', - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize : function(){}, - - // Return a copy of the model's `attributes` object. - toJSON : function() { - return _.clone(this.attributes); - }, - - // Get the value of an attribute. - get : function(attr) { - return this.attributes[attr]; - }, - - // Get the HTML-escaped value of an attribute. - escape : function(attr) { - var html; - if (html = this._escapedAttributes[attr]) return html; - var val = this.attributes[attr]; - return this._escapedAttributes[attr] = escapeHTML(val == null ? '' : '' + val); - }, - - // Returns `true` if the attribute contains a value that is not null - // or undefined. - has : function(attr) { - return this.attributes[attr] != null; - }, - - // Set a hash of model attributes on the object, firing `"change"` unless you - // choose to silence it. - set : function(attrs, options) { - - // Extract attributes and options. - options || (options = {}); - if (!attrs) return this; - if (attrs.attributes) attrs = attrs.attributes; - var now = this.attributes, escaped = this._escapedAttributes; - - // Run validation. - if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false; - - // Check for changes of `id`. - if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; - - // We're about to start triggering change events. - var alreadyChanging = this._changing; - this._changing = true; - - // Update attributes. - for (var attr in attrs) { - var val = attrs[attr]; - if (!_.isEqual(now[attr], val)) { - now[attr] = val; - delete escaped[attr]; - this._changed = true; - if (!options.silent) this.trigger('change:' + attr, this, val, options); - } - } - - // Fire the `"change"` event, if the model has been changed. - if (!alreadyChanging && !options.silent && this._changed) this.change(options); - this._changing = false; - return this; - }, - - // Remove an attribute from the model, firing `"change"` unless you choose - // to silence it. `unset` is a noop if the attribute doesn't exist. - unset : function(attr, options) { - if (!(attr in this.attributes)) return this; - options || (options = {}); - var value = this.attributes[attr]; - - // Run validation. - var validObj = {}; - validObj[attr] = void 0; - if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false; - - // Remove the attribute. - delete this.attributes[attr]; - delete this._escapedAttributes[attr]; - if (attr == this.idAttribute) delete this.id; - this._changed = true; - if (!options.silent) { - this.trigger('change:' + attr, this, void 0, options); - this.change(options); - } - return this; - }, - - // Clear all attributes on the model, firing `"change"` unless you choose - // to silence it. - clear : function(options) { - options || (options = {}); - var attr; - var old = this.attributes; - - // Run validation. - var validObj = {}; - for (attr in old) validObj[attr] = void 0; - if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false; - - this.attributes = {}; - this._escapedAttributes = {}; - this._changed = true; - if (!options.silent) { - for (attr in old) { - this.trigger('change:' + attr, this, void 0, options); - } - this.change(options); - } - return this; - }, - - // Fetch the model from the server. If the server's representation of the - // model differs from its current attributes, they will be overriden, - // triggering a `"change"` event. - fetch : function(options) { - options || (options = {}); - var model = this; - var success = options.success; - options.success = function(resp, status, xhr) { - if (!model.set(model.parse(resp, xhr), options)) return false; - if (success) success(model, resp); - }; - options.error = wrapError(options.error, model, options); - return (this.sync || Backbone.sync).call(this, 'read', this, options); - }, - - // Set a hash of model attributes, and sync the model to the server. - // If the server returns an attributes hash that differs, the model's - // state will be `set` again. - save : function(attrs, options) { - options || (options = {}); - if (attrs && !this.set(attrs, options)) return false; - var model = this; - var success = options.success; - options.success = function(resp, status, xhr) { - if (!model.set(model.parse(resp, xhr), options)) return false; - if (success) success(model, resp, xhr); - }; - options.error = wrapError(options.error, model, options); - var method = this.isNew() ? 'create' : 'update'; - return (this.sync || Backbone.sync).call(this, method, this, options); - }, - - // Destroy this model on the server if it was already persisted. Upon success, the model is removed - // from its collection, if it has one. - destroy : function(options) { - options || (options = {}); - if (this.isNew()) return this.trigger('destroy', this, this.collection, options); - var model = this; - var success = options.success; - options.success = function(resp) { - model.trigger('destroy', model, model.collection, options); - if (success) success(model, resp); - }; - options.error = wrapError(options.error, model, options); - return (this.sync || Backbone.sync).call(this, 'delete', this, options); - }, - - // Default URL for the model's representation on the server -- if you're - // using Backbone's restful methods, override this to change the endpoint - // that will be called. - url : function() { - var base = getUrl(this.collection) || this.urlRoot || urlError(); - if (this.isNew()) return base; - return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); - }, - - // **parse** converts a response into the hash of attributes to be `set` on - // the model. The default implementation is just to pass the response along. - parse : function(resp, xhr) { - return resp; - }, - - // Create a new model with identical attributes to this one. - clone : function() { - return new this.constructor(this); - }, - - // A model is new if it has never been saved to the server, and lacks an id. - isNew : function() { - return this.id == null; - }, - - // Call this method to manually fire a `change` event for this model. - // Calling this will cause all objects observing the model to update. - change : function(options) { - this.trigger('change', this, options); - this._previousAttributes = _.clone(this.attributes); - this._changed = false; - }, - - // Determine if the model has changed since the last `"change"` event. - // If you specify an attribute name, determine if that attribute has changed. - hasChanged : function(attr) { - if (attr) return this._previousAttributes[attr] != this.attributes[attr]; - return this._changed; - }, - - // Return an object containing all the attributes that have changed, or false - // if there are no changed attributes. Useful for determining what parts of a - // view need to be updated and/or what attributes need to be persisted to - // the server. - changedAttributes : function(now) { - now || (now = this.attributes); - var old = this._previousAttributes; - var changed = false; - for (var attr in now) { - if (!_.isEqual(old[attr], now[attr])) { - changed = changed || {}; - changed[attr] = now[attr]; - } - } - return changed; - }, - - // Get the previous value of an attribute, recorded at the time the last - // `"change"` event was fired. - previous : function(attr) { - if (!attr || !this._previousAttributes) return null; - return this._previousAttributes[attr]; - }, - - // Get all of the attributes of the model at the time of the previous - // `"change"` event. - previousAttributes : function() { - return _.clone(this._previousAttributes); - }, - - // Run validation against a set of incoming attributes, returning `true` - // if all is well. If a specific `error` callback has been passed, - // call that instead of firing the general `"error"` event. - _performValidation : function(attrs, options) { - var error = this.validate(attrs); - if (error) { - if (options.error) { - options.error(this, error, options); - } else { - this.trigger('error', this, error, options); - } - return false; - } - return true; - } - - }); - - // Backbone.Collection - // ------------------- - - // Provides a standard collection class for our sets of models, ordered - // or unordered. If a `comparator` is specified, the Collection will maintain - // its models in sort order, as they're added and removed. - Backbone.Collection = function(models, options) { - options || (options = {}); - if (options.comparator) this.comparator = options.comparator; - _.bindAll(this, '_onModelEvent', '_removeReference'); - this._reset(); - if (models) this.reset(models, {silent: true}); - this.initialize.apply(this, arguments); - }; - - // Define the Collection's inheritable methods. - _.extend(Backbone.Collection.prototype, Backbone.Events, { - - // The default model for a collection is just a **Backbone.Model**. - // This should be overridden in most cases. - model : Backbone.Model, - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize : function(){}, - - // The JSON representation of a Collection is an array of the - // models' attributes. - toJSON : function() { - return this.map(function(model){ return model.toJSON(); }); - }, - - // Add a model, or list of models to the set. Pass **silent** to avoid - // firing the `added` event for every new model. - add : function(models, options) { - if (_.isArray(models)) { - for (var i = 0, l = models.length; i < l; i++) { - this._add(models[i], options); - } - } else { - this._add(models, options); - } - return this; - }, - - // Remove a model, or a list of models from the set. Pass silent to avoid - // firing the `removed` event for every model removed. - remove : function(models, options) { - if (_.isArray(models)) { - for (var i = 0, l = models.length; i < l; i++) { - this._remove(models[i], options); - } - } else { - this._remove(models, options); - } - return this; - }, - - // Get a model from the set by id. - get : function(id) { - if (id == null) return null; - return this._byId[id.id != null ? id.id : id]; - }, - - // Get a model from the set by client id. - getByCid : function(cid) { - return cid && this._byCid[cid.cid || cid]; - }, - - // Get the model at the given index. - at: function(index) { - return this.models[index]; - }, - - // Force the collection to re-sort itself. You don't need to call this under normal - // circumstances, as the set will maintain sort order as each item is added. - sort : function(options) { - options || (options = {}); - if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); - this.models = this.sortBy(this.comparator); - if (!options.silent) this.trigger('reset', this, options); - return this; - }, - - // Pluck an attribute from each model in the collection. - pluck : function(attr) { - return _.map(this.models, function(model){ return model.get(attr); }); - }, - - // When you have more items than you want to add or remove individually, - // you can reset the entire set with a new list of models, without firing - // any `added` or `removed` events. Fires `reset` when finished. - reset : function(models, options) { - models || (models = []); - options || (options = {}); - this.each(this._removeReference); - this._reset(); - this.add(models, {silent: true}); - if (!options.silent) this.trigger('reset', this, options); - return this; - }, - - // Fetch the default set of models for this collection, resetting the - // collection when they arrive. If `add: true` is passed, appends the - // models to the collection instead of resetting. - fetch : function(options) { - options || (options = {}); - var collection = this; - var success = options.success; - options.success = function(resp, status, xhr) { - collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options); - if (success) success(collection, resp); - }; - options.error = wrapError(options.error, collection, options); - return (this.sync || Backbone.sync).call(this, 'read', this, options); - }, - - // Create a new instance of a model in this collection. After the model - // has been created on the server, it will be added to the collection. - // Returns the model, or 'false' if validation on a new model fails. - create : function(model, options) { - var coll = this; - options || (options = {}); - model = this._prepareModel(model, options); - if (!model) return false; - var success = options.success; - options.success = function(nextModel, resp, xhr) { - coll.add(nextModel, options); - if (success) success(nextModel, resp, xhr); - }; - model.save(null, options); - return model; - }, - - // **parse** converts a response into a list of models to be added to the - // collection. The default implementation is just to pass it through. - parse : function(resp, xhr) { - return resp; - }, - - // Proxy to _'s chain. Can't be proxied the same way the rest of the - // underscore methods are proxied because it relies on the underscore - // constructor. - chain: function () { - return _(this.models).chain(); - }, - - // Reset all internal state. Called when the collection is reset. - _reset : function(options) { - this.length = 0; - this.models = []; - this._byId = {}; - this._byCid = {}; - }, - - // Prepare a model to be added to this collection - _prepareModel: function(model, options) { - if (!(model instanceof Backbone.Model)) { - var attrs = model; - model = new this.model(attrs, {collection: this}); - if (model.validate && !model._performValidation(attrs, options)) model = false; - } else if (!model.collection) { - model.collection = this; - } - return model; - }, - - // Internal implementation of adding a single model to the set, updating - // hash indexes for `id` and `cid` lookups. - // Returns the model, or 'false' if validation on a new model fails. - _add : function(model, options) { - options || (options = {}); - model = this._prepareModel(model, options); - if (!model) return false; - var already = this.getByCid(model); - if (already) throw new Error(["Can't add the same model to a set twice", already.id]); - this._byId[model.id] = model; - this._byCid[model.cid] = model; - var index = options.at != null ? options.at : - this.comparator ? this.sortedIndex(model, this.comparator) : - this.length; - this.models.splice(index, 0, model); - model.bind('all', this._onModelEvent); - this.length++; - if (!options.silent) model.trigger('add', model, this, options); - return model; - }, - - // Internal implementation of removing a single model from the set, updating - // hash indexes for `id` and `cid` lookups. - _remove : function(model, options) { - options || (options = {}); - model = this.getByCid(model) || this.get(model); - if (!model) return null; - delete this._byId[model.id]; - delete this._byCid[model.cid]; - this.models.splice(this.indexOf(model), 1); - this.length--; - if (!options.silent) model.trigger('remove', model, this, options); - this._removeReference(model); - return model; - }, - - // Internal method to remove a model's ties to a collection. - _removeReference : function(model) { - if (this == model.collection) { - delete model.collection; - } - model.unbind('all', this._onModelEvent); - }, - - // Internal method called every time a model in the set fires an event. - // Sets need to update their indexes when models change ids. All other - // events simply proxy through. "add" and "remove" events that originate - // in other collections are ignored. - _onModelEvent : function(ev, model, collection, options) { - if ((ev == 'add' || ev == 'remove') && collection != this) return; - if (ev == 'destroy') { - this._remove(model, options); - } - if (model && ev === 'change:' + model.idAttribute) { - delete this._byId[model.previous(model.idAttribute)]; - this._byId[model.id] = model; - } - this.trigger.apply(this, arguments); - } - - }); - - // Underscore methods that we want to implement on the Collection. - var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect', - 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include', - 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size', - 'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty', 'groupBy']; - - // Mix in each Underscore method as a proxy to `Collection#models`. - _.each(methods, function(method) { - Backbone.Collection.prototype[method] = function() { - return _[method].apply(_, [this.models].concat(_.toArray(arguments))); - }; - }); - - // Backbone.Router - // ------------------- - - // Routers map faux-URLs to actions, and fire events when routes are - // matched. Creating a new one sets its `routes` hash, if not set statically. - Backbone.Router = function(options) { - options || (options = {}); - if (options.routes) this.routes = options.routes; - this._bindRoutes(); - this.initialize.apply(this, arguments); - }; - - // Cached regular expressions for matching named param parts and splatted - // parts of route strings. - var namedParam = /:([\w\d]+)/g; - var splatParam = /\*([\w\d]+)/g; - var escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g; - - // Set up all inheritable **Backbone.Router** properties and methods. - _.extend(Backbone.Router.prototype, Backbone.Events, { - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize : function(){}, - - // Manually bind a single named route to a callback. For example: - // - // this.route('search/:query/p:num', 'search', function(query, num) { - // ... - // }); - // - route : function(route, name, callback) { - Backbone.history || (Backbone.history = new Backbone.History); - if (!_.isRegExp(route)) route = this._routeToRegExp(route); - Backbone.history.route(route, _.bind(function(fragment) { - var args = this._extractParameters(route, fragment); - callback.apply(this, args); - this.trigger.apply(this, ['route:' + name].concat(args)); - }, this)); - }, - - // Simple proxy to `Backbone.history` to save a fragment into the history. - navigate : function(fragment, triggerRoute) { - Backbone.history.navigate(fragment, triggerRoute); - }, - - // Bind all defined routes to `Backbone.history`. We have to reverse the - // order of the routes here to support behavior where the most general - // routes can be defined at the bottom of the route map. - _bindRoutes : function() { - if (!this.routes) return; - var routes = []; - for (var route in this.routes) { - routes.unshift([route, this.routes[route]]); - } - for (var i = 0, l = routes.length; i < l; i++) { - this.route(routes[i][0], routes[i][1], this[routes[i][1]]); - } - }, - - // Convert a route string into a regular expression, suitable for matching - // against the current location hash. - _routeToRegExp : function(route) { - route = route.replace(escapeRegExp, "\\$&") - .replace(namedParam, "([^\/]*)") - .replace(splatParam, "(.*?)"); - return new RegExp('^' + route + '$'); - }, - - // Given a route, and a URL fragment that it matches, return the array of - // extracted parameters. - _extractParameters : function(route, fragment) { - return route.exec(fragment).slice(1); - } - - }); - - // Backbone.History - // ---------------- - - // Handles cross-browser history management, based on URL fragments. If the - // browser does not support `onhashchange`, falls back to polling. - Backbone.History = function() { - this.handlers = []; - _.bindAll(this, 'checkUrl'); - }; - - // Cached regex for cleaning hashes. - var hashStrip = /^#*/; - - // Cached regex for detecting MSIE. - var isExplorer = /msie [\w.]+/; - - // Has the history handling already been started? - var historyStarted = false; - - // Set up all inheritable **Backbone.History** properties and methods. - _.extend(Backbone.History.prototype, { - - // The default interval to poll for hash changes, if necessary, is - // twenty times a second. - interval: 50, - - // Get the cross-browser normalized URL fragment, either from the URL, - // the hash, or the override. - getFragment : function(fragment, forcePushState) { - if (fragment == null) { - if (this._hasPushState || forcePushState) { - fragment = window.location.pathname; - var search = window.location.search; - if (search) fragment += search; - if (fragment.indexOf(this.options.root) == 0) fragment = fragment.substr(this.options.root.length); - } else { - fragment = window.location.hash; - } - } - return decodeURIComponent(fragment.replace(hashStrip, '')); - }, - - // Start the hash change handling, returning `true` if the current URL matches - // an existing route, and `false` otherwise. - start : function(options) { - - // Figure out the initial configuration. Do we need an iframe? - // Is pushState desired ... is it available? - if (historyStarted) throw new Error("Backbone.history has already been started"); - this.options = _.extend({}, {root: '/'}, this.options, options); - this._wantsPushState = !!this.options.pushState; - this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState); - var fragment = this.getFragment(); - var docMode = document.documentMode; - var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); - if (oldIE) { - this.iframe = $('"},load:function(a){this.src_setter(a)},src_setter:function(a){this.g.childNodes[0].src=a;this.callEvent("onXLS",[]);dhx.delay(this.Je,this);return a},Je:function(){try{dhx.event(this.getWindow(),"load",dhx.bind(function(){this.callEvent("onXLS",[])},this))}catch(a){this.callEvent("onXLE",[])}},getWindow:function(){return this.g.childNodes[0].contentWindow}, -waitMessage_setter:function(a){dhx.extend(this,dhx.ui.overlay);return a}},dhx.ui.view,dhx.EventSystem); -dhx.ui.overlay={$init:function(){if(dhx.isNotDefined(this.ba)&&this.attachEvent)this.attachEvent("onXLS",this.showOverlay),this.attachEvent("onXLE",this.hideOverlay),this.ba=null},showOverlay:function(){if(!this.ba)this.ba=dhx.html.create("DIV",{"class":"dhx_loading_overlay"},""),dhx.html.insertBefore(this.ba,this.b.firstChild,this.b)},hideOverlay:function(){if(this.ba)dhx.html.remove(this.ba),this.ba=null}}; -dhx.protoUI({name:"scrollview",defaults:{scroll:"x",scrollSpeed:"0ms"},$init:function(){this.b.className+=" dhx_scrollview"},content_setter:function(a){this.ha=dhx.ui.Oa(a);this.ha.D=this;this.d.appendChild(this.ha.b)},body_setter:function(a){return this.content_setter(a)},$getSize:function(){this.ga=this.ha.$getSize();if(this.a.scroll=="x"&&this.ga[3]>0)this.a.height=this.ga[3];else if(this.a.scroll=="y"&&this.ga[1]>0)this.a.width=this.ga[1];return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a, -b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))this.ha.$setSize(Math.max(this.ga[1],this.j),Math.max(this.ga[3],this.m)),this.d.style.width=this.ha.j+"px",this.d.style.height=this.ha.m+"px"}},dhx.Scrollable,dhx.ui.view);dhx.CanvasMgr=function(a){var b=dhx.CanvasMgr.prototype.qc;!b[a]&&document.getCSSCanvasContext&&(b[a]=!0,dhx.CanvasMgr.prototype[a](b))}; -dhx.CanvasMgr.prototype={buttonGrd:["#fefefe","#e0e0e0","#e5e5e5","#e0e0e0",32],qc:[],Pa:function(a,b,c,d,e){var f=document.getCSSCanvasContext("2d",d,18,c),g=f.createLinearGradient(0,0,0,c);g.addColorStop(0,a);g.addColorStop(1,b);f.fillStyle=g;f.strokeStyle="#93B0BA";f.lineWidth=2;e?(f.moveTo(0,0.5),f.lineTo(17.5,c/2+0.5),f.lineTo(0,c-0.5),f.lineTo(0,0.5)):(f.moveTo(18,0.5),f.lineTo(0.5,c/2+0.5),f.lineTo(18,c-0.5),f.lineTo(18,0.5));f.stroke();f.fill()},dhxArrowLeftT:function(){this.Pa(this.buttonGrd[2], -this.buttonGrd[3],this.buttonGrd[4],"dhxArrowLeftT")},dhxArrowRightT:function(){this.Pa(this.buttonGrd[2],this.buttonGrd[3],this.buttonGrd[4],"dhxArrowRightT",!0)},dhxArrowLeft:function(){this.Pa(this.buttonGrd[0],this.buttonGrd[1],this.buttonGrd[4],"dhxArrowLeft");dhx.CanvasMgr("dhxArrowLeftT")},dhxArrowRight:function(){this.Pa(this.buttonGrd[0],this.buttonGrd[1],this.buttonGrd[4],"dhxArrowRight",!0);dhx.CanvasMgr("dhxArrowRightT")}}; -dhx.attachEvent("onClick",function(a){var b=dhx.ui.get(a);if(b&&b.touchable){b.getNode(a);var c=a.target||a.srcElement,d="",e=null,f=!1;if(!(c.className&&c.className.indexOf("dhx_view")===0)){for(;c&&c.parentNode;){if(c.getAttribute){if(c.getAttribute("view_id"))break;if(d=c.className)if(d=d.split(" "),d=d[0]||d[1],b.on_click[d]){var g=b.on_click[d].call(b,a,b.a.id,c);if(g===!1)return}}c=c.parentNode}if(b.a.click){var h=dhx.toFunctor(b.a.click);h&&h.call&&h.call(b,b.a.id,a)}if(b.a.multiview){var i= -dhx.ui.get(b.a.multiview);i&&i.show&&i.show()}if(b.a.popup){var j=dhx.ui.get(b.a.popup);j.a.master=b.a.id;j.show(b.getInput()||b.getNode(),j.h.a.align||"bottom",!0)}b.callEvent("onItemClick",[b.a.id,a])}}}); -dhx.protoUI({name:"button",touchable:!0,defaults:{template:"
    ",height:42,label:"label",s:10},$init:function(a){this.data=this.a;this.d=this.b;dhx.sa&&(dhx.sa.elements[a.name||a.id]=this,this.mapEvent({onbeforetabclick:dhx.sa,onaftertabclick:dhx.sa,onitemclick:dhx.sa}));a.type=="prev"&&dhx.CanvasMgr("dhxArrowLeft");a.type=="next"&&dhx.CanvasMgr("dhxArrowRight")},type_setter:function(a){this.a.template=dhx.Template(this.pd[a][0]); -var b=this.pd[a][1];if(b)this.a.s=b},pd:{round:["
    "],"default":["
    "],form:[function(a){return"
    "}],prev:["
    ",28],next:["
    ",28],big:["
    ",28],biground:["
    ", -28]},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this,a,b)&&this.render()},K:function(a){this.a.label=a;this.getInput().value=a},getValue:function(){return this.d.childNodes.length>0?this.ab():this.a.value},setValue:function(a){var b=this.a.value;this.a.value=a;if(this.d.childNodes.length>0)this.Md=a,this.K(a),this.callEvent("onChange",[a,b])},focus:function(){this.getInput().focus()},ab:function(){return this.a.label||""},getInput:function(){return this.d.getElementsByTagName("input")[0]}, -J:function(){return this.getInput()},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.s+"px":this.J().style.width=this.j-this.a.s+"px"},render:function(){if(dhx.AtomRender.render.call(this)){this.Z();if(this.a.align)switch(this.a.align){case "right":this.d.firstChild.style.cssFloat=this.d.firstChild.style.styleFloat="right";break;case "center":this.d.firstChild.style.display="inline-block";this.d.firstChild.parentNode.style.textAlign="center";break;case "middle":this.d.firstChild.style.marginTop= -Math.round((this.m-40)/2)+"px";break;case "bottom":this.d.firstChild.style.marginTop=this.m-40+"px";break;case "left":this.d.firstChild.parentNode.style.textAlign="left"}this.Aa&&this.Aa(this.data);this.Md!=this.a.value&&this.setValue(this.a.value)}},refresh:function(){this.render()},on_click:{Ib:function(a,b){var c=dhx.html.locate(a,"button_id");if(c&&this.callEvent("onBeforeTabClick",[b,c])){this.a.selected=c;this.refresh();if(this.a.multiview){var d=dhx.ui.get(c);d&&d.show&&d.show()}this.callEvent("onAfterTabClick", -[b,c])}},dhx_el_segmented:function(a,b){this.on_click.Ib.call(this,a,b)},dhx_el_tabbar:function(a,b){this.on_click.Ib.call(this,a,b)},dhx_inp_counter_next:function(){this.next(this.a.step,this.a.min,this.a.max)},dhx_inp_counter_prev:function(){this.prev(this.a.step,this.a.min,this.a.max)},dhx_inp_toggle_left_off:function(){var a=this.a.options;this.setValue(a[0].value)},dhx_inp_toggle_right_off:function(){var a=this.a.options;this.setValue(a[1].value)},dhx_inp_combo:function(a,b,c){c.focus()},dhx_inp_checkbox_border:function(){this.toggle()}, -dhx_inp_checkbox_label:function(){this.toggle()},dhx_inp_radio_border:function(a){var b=dhx.html.locate(a,"radio_id");this.setValue(b)},dhx_inp_radio_label:function(a,b,c){c=c.parentNode.getElementsByTagName("input")[0];return this.on_click.dhx_inp_radio_border.call(this,c,b,c)}},Ba:function(a){for(var b=0;b #label#
    ",label:""},Z:function(){}},dhx.ui.button);dhx.protoUI({name:"label",defaults:{template:"
    #label#
    "},focus:function(){return!1},J:function(){return this.d.firstChild},K:function(a){this.a.label=a;this.d.firstChild.innerHTML=a}},dhx.ui.button); -dhx.protoUI({name:"icon",defaults:{template:"
    ",width:42},Z:function(){}},dhx.ui.button); -dhx.protoUI({name:"segmented",defaults:{template:function(a,b){var c=a.options,d="",e;b.Ba(c);if(!a.selected)a.selected=c[0].value;for(var f=0;f"+c[f].label+"
    ";return"
    "+d+"
    "},s:28,nb:0},K:function(a){if(this.d&& -this.d.firstChild)for(var b=this.d.firstChild.childNodes,c=0;c";d+=h?""+c[f].label+"":"
    "+ -c[f].label+"";d+=""}return"
    "+d+"
    "},s:4}},dhx.ui.segmented); -dhx.protoUI({name:"text",wd:!0,$b:function(a,b,c){c.labelPosition=="left"?a+=b:a=b+a;return"
    "+a+"
    "},pb:function(a,b,c,d){var e=a.inputAlign||"left",f=a.labelAlign||"left",g=dhx.uid(),h="
    ";h+="
    ";var i=this.a.inputWidth-this.a.labelWidth-18;i<0&&(i= -0);h+=d?"
    "+(a.text||a.value||"")+"
    ":"";h+="
    ";return"
    "+h+"
    "},qb:function(a, -b){if(!a.label)return"";var c=a.labelAlign||"left";return"
    "+a.label+"
    "},defaults:{template:function(a,b){return b.pb(a,"text")},labelWidth:80,s:28,nb:0},type_setter:function(a){return a},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.labelWidth-this.a.s+"px":this.J().style.width=this.j-this.a.labelWidth-this.a.s-this.a.nb+"px"},focus:function(){var a=this.d.getElementsByTagName("input")[0]; -a&&a.focus()},K:function(a){this.getInput().value=a},ab:function(){return this.getInput().value}},dhx.ui.button); -dhx.protoUI({name:"toggle",defaults:{template:function(a,b){var c=a.options;b.Ba(c);var d=b.a.inputWidth/2||"auto",e=[c[0].width||d,c[1].width||d],f=b.qb(a,"toggle"),g="";g+="";return b.$b(f,g,a)},label:"",labelWidth:0,s:20},Z:function(){},Aa:function(a){this.setValue(a.value)},$a:function(){return this.d.getElementsByTagName("input")}, -K:function(a){var b=this.$a(),c=this.a.options;a==c[1].value?(b[0].className="dhx_inp_toggle_left_off",b[1].className="dhx_inp_toggle_right_on"):(b[0].className="dhx_inp_toggle_left_on",b[1].className="dhx_inp_toggle_right_off")},ab:function(){var a=this.$a(),b=this.a.options;return a[0].className=="dhx_inp_toggle_left_on"?b[0].value:b[1].value}},dhx.ui.text); -dhx.protoUI({name:"input",defaults:{attributes:["maxlength","disabled","placeholder"],template:function(a,b){for(var c=""+c+""},s:28,labelWidth:0}},dhx.ui.text); -dhx.protoUI({name:"select",defaults:{template:function(a,b){var c=a.options;b.Ba(c);var d=""+c[e].label+"";d+="";return"
    "+d+"
    "},labelWidth:0,nb:0,s:10},getInput:function(){return this.d.firstChild.firstChild}},dhx.ui.text); -dhx.protoUI({name:"textarea",defaults:{template:function(a){return"
    "},cssContant:28},Z:function(){this.a.inputWidth?this.J().style.width=this.a.inputWidth-this.a.cssContant+"px":this.J().style.width=this.j-this.a.nb-this.a.cssContant+"px";this.a.inputHeight?this.J().style.height=this.a.inputHeight+"px":this.J().style.height=this.m-9+"px"},getInput:function(){return this.d.firstChild.firstChild}, -K:function(a){this.getInput().value=a},ab:function(){return this.getInput().value}},dhx.ui.text); -dhx.protoUI({name:"counter",defaults:{template:function(a,b){var c=a.value||0,d=b.qb(a,"counter"),e="";e+="
    "+c+"
    ";e+="";return b.$b(d,e,a)},min:1,step:1,labelWidth:0,label:"",s:145},J:function(){return this.getInput().parentNode},getLabel:function(){return this.getInput().previousSibling||this.getInput().parentNode.lastChild},Z:function(){if(this.a.label&& -!this.a.labelWidth){var a=this.getLabel();if(a)a.style.width=(this.a.inputWidth||this.j)-this.a.s+"px"}},K:function(a){this.getInput().nextSibling.innerHTML=a},getValue:function(){return(this.a.value||0)*1},next:function(a,b,c){a=a||1;this.kd(a,b,c)},prev:function(a,b,c){a=-1*(a||1);this.kd(a,b,c)},kd:function(a,b,c){var b=typeof b=="undefined"?-Infinity:b,c=typeof c=="undefined"?Infinity:c,d=this.getValue()+a;d>=b&&d<=c&&this.setValue(d)}},dhx.ui.text); -dhx.protoUI({name:"checkbox",defaults:{template:function(a,b){var c=a.value?"dhx_inp_checkbox_on":"dhx_inp_checkbox_on hidden",d="
    ",e=b.qb(a,"checkbox");return b.$b(e,d,a)}},K:function(a){var b=this.getInput();b.className=a?"dhx_inp_checkbox_on":"dhx_inp_checkbox_on hidden"},toggle:function(){this.setValue(!this.getValue())},getLabel:function(){var a=this.getInput().parentNode;return a.nextSibling||a.previousSibling}, -getValue:function(){return this.a.value?1:0},J:function(){return this.getInput().parentNode.parentNode}},dhx.ui.counter); -dhx.protoUI({name:"radio",defaults:{template:function(a,b){b.Ba(a.options);for(var c=[],d=0;d");var e="
    ";a.label=a.options[d].label;var f=b.qb(a,"radio");a.labelPosition=="left"?c.push(f+e):c.push(e+f)}return"
    "+ -c.join("
    ")+"
    "}},$getSize:function(){var a=dhx.ui.button.prototype.$getSize.call(this);if(this.a.options){for(var b=1,c=0;c]*>/g,""):this.getInput().innerHTML=c},getValue:function(){return this.a.value}},dhx.ui.text); -dhx.protoUI({name:"combo",defaults:{template:function(a,b){return b.pb(a,"combo")},filter:function(a,b){return a.value.toString().toLowerCase().indexOf(b.toLowerCase())===0?!0:!1}},Y:function(a){a.popup||this.Cb("list",a);this.dc();dhx.event(this.d,"keydown",function(b){var b=b||event,c=b.target||b.srcElement,d=dhx.ui.get(a.popup);window.clearTimeout(d.key_timer);var e=this;d.key_timer=window.setTimeout(function(){d.h.filter(function(a){return e.a.filter.apply(e,[a,c.value])});var a=dhx.ui.get(d.a.master); -a.a.value=d.h.dataCount()==1&&d.h.type.template(d.h.item(d.h.first()))==c.value?d.h.first():""},200);d.show(c,d.h.a.align||"bottom",!0)},this);this.Y=function(){}},Aa:function(a){this.Y(a);dhx.isNotDefined(a.value)||this.setValue(a.value)}},dhx.ui.richselect); -dhx.protoUI({name:"datepicker",defaults:{template:function(a,b){return b.pb(a,"list",!0,!0)}},Y:function(a){a.popup||this.Cb("calendar",a);var b=dhx.ui.get(a.popup);b.h.attachEvent("onDateSelect",function(a){var b=dhx.ui.get(this.getParent().a.master);this.getParent().hide();b.setValue(a)});this.Y=function(){}},Aa:function(a){this.Y(a);dhx.isNotDefined(a.value)||this.setValue(a.value)},K:function(a){var b=dhx.ui.get(this.a.popup.toString()),c=b.h;typeof a=="string"&&a&&(a=(this.a.dateFormat||dhx.i18n.dateFormatDate)(a)); -c.selectDate(a,!0);this.a.value=a?c.config.date:"";this.getInput().innerHTML=a?(this.a.dateFormatStr||dhx.i18n.dateFormatStr)(this.a.value):""},dateFormat_setter:function(a){this.a.dateFormatStr=dhx.Date.dateToStr(a);return dhx.Date.strToDate(a)},getValue:function(){return this.a.value||null}},dhx.ui.richselect); -dhx.ValidateData={validate:function(a){var b=!0,c=this.a.rules;if(c){var d=c.$obj;!a&&this.getValues&&(a=this.getValues());if(d&&!d.call(this,a))return!1;var e=c.$all,f;for(f in c)f.indexOf("$")!==0&&(c[f].call(this,a[f],a,f)&&(!e||e.call(this,a[f],a,f))?this.callEvent("onValidationSuccess",[f,a])&&this.tc&&this.tc(f,a):(b=!1,this.callEvent("onValidationError",[f,a])&&this.Lc&&this.Lc(f,a)))}return b}}; -dhx.rules={isNumber:function(a){return parseFloat(a)==a},isNotEmpty:function(a){return a=="0"||a}}; -dhx.RenderStack={$init:function(){this.F=document.createElement("DIV");this.data.attachEvent("onIdChange",dhx.bind(this.Zb,this));this.attachEvent("onItemClick",this.Dd);if(!this.types)this.types={"default":this.type},this.type.name="default";this.type=dhx.copy(this.types[this.type.name])},customize:function(a){dhx.Type(this,a)},type_setter:function(a){this.types[a]?(this.type=dhx.copy(this.types[a]),this.type.css&&(this.g.className+=" "+this.type.css)):this.customize(a);return a},template_setter:function(a){this.type.template= -dhx.Template(a)},xa:function(a){this.callEvent("onItemRender",[a]);return this.type.templateStart(a,this.type)+(a.$template?this.type["template"+a.$template]:this.type.template)(a,this.type)+this.type.templateEnd(a,this.type)},ld:function(a){this.F.innerHTML=this.xa(a);return this.F.firstChild},Zb:function(a,b){var c=this.pa(a);c&&(c.setAttribute(this.ma,b),this.B[b]=this.B[a],delete this.B[a])},Dd:function(){if(this.a.click){var a=dhx.toFunctor(this.a.click);a&&a.call&&a.apply(this,arguments)}}, -pa:function(a){if(this.B)return this.B[a];this.B={};for(var b=this.d.childNodes,c=0;c0&&(!this.r||!this.a.scroll))this.a.height=a[3];if(a[1]>0&&(this.r||!this.a.scroll))this.a.width=a[1];a=dhx.ui.view.prototype.$getSize.call(this);if(a[3]<=0&&this.Db> -0)a[3]=this.Db,a[2]=0;return a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.apply(this,arguments);dhx.ui.baselayout.prototype.$setSize.call(this,this.j,this.m)},render:function(){if(this.isVisible(this.a.id)&&this.fc)this.setValues(this.fc),this.fc=null},refresh:function(){this.render()},type_setter:function(a){this.g.className+=" dhx_"+a.toLowerCase()}},dhx.Scrollable,dhx.AtomDataLoader,dhx.Values,dhx.ui.baselayout,dhx.EventSystem,dhx.ValidateData); -dhx.protoUI({name:"form",defaults:{scroll:!0},Db:-1,Vc:function(a){this.g.className+=" dhx_form";if(a.elements)this.Q=a.elements,this.r=!0;delete a.elements;dhx.sa=this},type_setter:function(){}},dhx.ui.toolbar); -dhx.MouseEvents={$init:function(){this.on_click&&dhx.event(this.g,"click",this.me,this);this.on_context&&dhx.event(this.g,"contextmenu",this.ne,this);this.on_dblclick&&dhx.event(this.g,"dblclick",this.oe,this);this.on_mouse_move&&(dhx.event(this.g,"mousemove",this.Rc,this),dhx.event(this.g,dhx.env.isIE?"mouseleave":"mouseout",this.Rc,this))},me:function(a){return this.Ja(a,this.on_click,"ItemClick")},oe:function(a){return this.Ja(a,this.on_dblclick,"ItemDblClick")},ne:function(a){if(this.Ja(a,this.on_context, -"BeforeContextMenu"))return this.Ja(a,{},"AfterContextMenu"),dhx.html.preventEvent(a)},Rc:function(a){dhx.env.isIE&&(a=document.createEventObject(event));this.Nc&&window.clearTimeout(this.Nc);this.callEvent("onMouseMoving",[a]);this.Nc=window.setTimeout(dhx.bind(function(){a.type=="mousemove"?this.pe(a):this.qe(a)},this),500)},pe:function(a){this.Ja(a,this.on_mouse_move,"MouseMove")||this.callEvent("onMouseOut",[a||event])},qe:function(a){this.callEvent("onMouseOut",[a||event])},Ja:function(a,b,c){for(var a= -a||event,d=a.target||a.srcElement,e="",f=null,g=!1;d&&d.parentNode;){if(!g&&d.getAttribute&&(f=d.getAttribute(this.ma))){d.getAttribute("userdata")&&this.callEvent("onLocateData",[f,d]);if(!this.callEvent("on"+c,[f,a,d]))return;g=!0}if(e=d.className)if(e=e.split(" "),e=e[0]||e[1],b[e]){var h=b[e].call(this,a,f||dhx.html.locate(a,this.ma),d);if(typeof h!="undefined"&&h!==!0)return}d=d.parentNode}return g}}; -dhx.SelectionModel={$init:function(){this.i=dhx.toArray();this.data.attachEvent("onStoreUpdated",dhx.bind(this.Pd,this));this.data.attachEvent("onStoreLoad",dhx.bind(this.Od,this));this.data.attachEvent("onAfterFilter",dhx.bind(this.Nd,this));this.data.attachEvent("onChangeId",dhx.bind(this.Zd,this))},Zd:function(a,b){for(var c=this.i.length-1;c>=0;c--)this.i[c]==a&&(this.i[c]=b)},Nd:function(){for(var a=this.i.length-1;a>=0;a--){if(this.data.indexById(this.i[a])<0)var b=this.i[a];var c=this.item(b); -c&&delete c.$selected;this.i.splice(a,1);this.callEvent("onSelectChange",[b])}},Pd:function(a,b,c){if(c=="delete")this.i.remove(a);else if(!this.data.dataCount()&&!this.data.p)this.i=dhx.toArray()},Od:function(){this.a.select&&this.data.each(function(a){a.$selected&&this.select(a.id)},this)},ub:function(a,b,c){if(!c&&!this.callEvent("onBeforeSelect",[a,b]))return!1;this.data.item(a).$selected=b;c?c.push(a):(b?this.i.push(a):this.i.remove(a),this.Vb(a));return!0},select:function(a,b,c){if(!a)return this.selectAll(); -if(dhx.isArray(a))for(var d=0;d100||a.length>this.data.dataCount/ -2},Vb:function(a){typeof a!="object"&&(a=[a]);if(a.length){if(this.ee(a))this.data.refresh();else for(var b=0;b=0?b[c]:null},nextSibling:function(a){var b=this.branch[this.item(a).$parent],c=dhx.PowerArray.find.call(b,a)+1;return c0&&this.groupBy(g,f[l],!0,l,e+1)}else{var n= -arguments,g=[];this.branch={0:[]};for(l=n.length-1;l>=0;l--)g.push(n[l]);this.groupBy(g,this.pull,!0,"0",0);this.refresh()}}};dhx.animate=function(a,b){if(dhx.isArray(a))for(var c=0;c1){for(var d=0;d=0;b--)dhx.html.remove(a[b])}}; -dhx.protoUI({name:"list",$init:function(){this.data.provideApi(this,!0)},defaults:{select:!1,scroll:!0},ma:"dhx_l_id",on_click:{dhx_list_item:function(a,b){if(this.a.select)this.ra=!0,this.a.select=="multiselect"?this.select(b,a.ctrlKey,a.shiftKey):this.select(b),this.ra=!1}},$getSize:function(){if(this.type.width!="auto")this.a.width=this.type.width+(this.type.padding+this.type.margin)*2;if(this.a.yCount)this.a.height=(this.type.height+(this.type.padding+this.type.margin)*2+1)*(this.a.yCount=="auto"? -this.dataCount():this.a.yCount);return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments)},type:{css:"",widthSize:function(a,b){return b.width+(b.width>-1?"px":"")},heightSize:function(a,b){return b.height+(b.height>-1?"px":"")},template:dhx.Template("#value#"),width:"auto",height:22,margin:0,padding:10,border:1,templateStart:dhx.Template("
    "), -templateEnd:dhx.Template("
    ")}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.ui.proto); -dhx.protoUI({name:"grouplist",defaults:{animate:{}},$init:function(){dhx.extend(this.data,dhx.TreeStore,!0);this.data.provideApi(this,!0);this.data.attachEvent("onClearAll",dhx.bind(this.Qc,this));this.b.className+=" dhx_grouplist";this.Qc()},Qc:function(){this.aa=[];this.z=[]},on_click:{dhx_list_item:function(a,b){if(this.oa)return!1;for(var c=0;c"), -templateBack:dhx.Template("< #value#"),templateItem:dhx.Template("#value#"),templateGroup:dhx.Template("#value#"),templateEnd:function(a){var b="";a.$count&&(b+="
    ");b+="";return b}},showItem:function(a){var b,c;if(a&&(b=this.item(a),c=b.$parent,b.$count))c=b.id;this.aa=this.data.branch[c||0];for(this.z=[];c;)this.item(c).$template="Back",this.z.unshift(c),c=this.item(c).$parent;this.ra=!0;this.render();this.ra=!1;dhx.RenderStack.showItem.call(this,a)}},dhx.ui.list); -dhx.Type(dhx.ui.grouplist,{}); -dhx.protoUI({name:"pagelist",defaults:{scroll:"x",panel:!1,scrollOffset:0},Yd:!0,$init:function(a){this.b.className+=" dhx_pagelist";a.scroll=a.scroll=="y"?"y":"x";this.type.layout=a.scroll;this.attachEvent("onAfterRender",this.Ie);this.$ready.push(this.zb);this.l=0},zb:function(){if(this.a.scroll=="x")this.d.style.height="100%";this.type.layout=this.a.scroll;this.attachEvent("onAfterScroll",this.Ld)},Ie:function(){if(this.a.scroll=="x")this.d.style.width=(this.type.width+(this.type.padding+this.type.margin)* -2+this.type.border)*this.dataCount()+"px";this.a.panel&&this.Wb()},panel_setter:function(a){a&&(this.b.className+=" hidden_scroll",a===!0&&(a={}),this.Ia(a,{size:16,itemSize:16,align:"bottom"}));return a},bd:function(a){var b=this.indexById(a);if(typeof b!="undefined"&&this.a.panel)this.l=b,this.Xb()},getActive:function(){return this.l?this.data.order[this.l]:this.first()},Ld:function(a){var b=(this.a.scroll=="y"?this.type.height:this.type.width)+(this.type.padding+this.type.margin)*2+this.type.border, -c=this.a.scroll=="y"?this.d.scrollHeight-this.m:this.d.scrollWidth-this.j,d;this.a.scroll=="y"?(d=Math.round(a.f/b),a.f=d*b,a.f=this.uc(a.f,c)):(d=Math.round(a.e/b),a.e=d*b,a.e=this.uc(a.e,c));this.l=-d;this.a.panel&&this.Xb();return!0},uc:function(a,b){var c=this.a.scrollOffset;if(c&&Math.abs(a)>c){var d=dhx.Touch.A[dhx.Touch.H]>dhx.Touch.w[dhx.Touch.H];a+=d?c:1-c}Math.abs(a)>b&&(a=-b);return a},$getSize:function(){if(this.a.scroll=="y"){if(this.type.width!="auto")this.a.width=this.type.width+(this.type.padding+ -this.type.margin)*2+this.type.border;if(this.a.yCount)this.a.height=(this.type.height+(this.type.padding+this.type.margin)*2+this.type.border)*(this.a.yCount=="auto"?this.dataCount():this.a.yCount)}else if(this.type.height!="auto")this.a.height=this.type.height+(this.type.padding+this.type.margin)*2+this.type.border;return dhx.ui.view.prototype.$getSize.call(this)},$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.apply(this,arguments)){if(this.type.fullScreen)this.type.width=this.j,this.type.height= -this.m,this.type.padding=0,this.render();this.a.panel&&this.Wb()}},type:{templateStart:function(a,b){var c="dhx_list_item dhx_list_"+b.css+"_item"+(a.$selected?"_selected":""),d="width:"+b.width+"px; height:"+b.height+"px; padding:"+b.padding+"px; margin:"+b.margin+"px; overflow:hidden;"+(b.layout&&b.layout=="x"?"float:left;":"");return"
    "}}},dhx.ui.list,dhx.CarouselPanel); -dhx.protoUI({name:"multiview",defaults:{animate:{}},$init:function(){this.l=0;this.r=1;this.b.style.position="relative";this.b.className+=" dhx_multiview";this.M=[]},xd:function(a,b){var c=dhx.ui.get(a);if(!c.La)c.rb=[],c.La={};c.La[b]||(c.La[b]=!0,c.rb.push(b))},Yb:function(a){var b=dhx.ui.get(a);this.M[this.M.length-2]!=a?(this.M.length==10&&this.M.splice(0,1),this.M.push(a)):this.M.splice(this.M.length-1,1);if(b.La){for(var c=0;c-1)a[3]=this.a.height,a[2]= -0;if(this.a.width>-1)a[1]=this.a.width,a[0]=0;a[0]&&(a[1]=0);a[2]&&(a[3]=0);return a},$setSize:function(a,b){dhx.ui.baseview.prototype.$setSize.call(this,a,b);this.c[this.l].$setSize(a,b)},isVisible:function(a,b){return b&&b!=this.getActive()?(a&&this.xd(b,a),!1):dhx.ui.view.prototype.isVisible.call(this,a,this.a.id)},getActive:function(){return this.c.length?this.c[this.l].a.id:null},back:function(a){a=a||1;if(this.callEvent("onBeforeBack",[this.getActive(),a])&&this.M.length>a){var b=this.M[this.M.length- -a-1];dhx.ui.get(b).show();return b}return null}},dhx.ui.baselayout,dhx.EventSystem);dhx.html.addMeta=function(a,b){document.getElementsByTagName("head").item(0).appendChild(dhx.html.create("meta",{name:a,content:b}))}; -(function(){var a=function(){var a=!!(window.orientation%180);if(dhx.ui.orientation!==a)dhx.ui.orientation=a,dhx.callEvent("onRotate",[a])};dhx.ui.orientation=!!((dhx.isNotDefined(window.orientation)?90:window.orientation)%180);dhx.event(window,"onorientationchange"in window?"orientationchange":"resize",a);dhx.ui.fullScreen=function(){dhx.html.addMeta("apple-mobile-web-app-capable","yes");dhx.html.addMeta("viewport","initial-scale = 1.0, maximum-scale = 1.0, user-scalable = no");if(dhx.env.touch){var b= -document.body.offsetHeight,c=navigator.userAgent.indexOf("iPhone")!=-1,d=c&&(b==356||b==208||b==306||b==158),e=function(){if(c)dhx.ui.orientation?(b=480,e=d?268:300):(b=320,e=d?416:460);else{document.body.style.width=document.body.style.height="1px";document.body.style.overflow="hidden";var a=window.outerWidth/window.innerWidth,b=window.outerWidth/a,e=window.outerHeight/a}document.body.style.height=e+"px";document.body.style.width=b+"px";dhx.ui.yc=!1;dhx.ui.resize();dhx.delay(function(){window.scrollTo(0, -1)})},f=function(){dhx.ui.yc=!0;dhx.env.isSafari?e():dhx.delay(e,null,[],500)};dhx.attachEvent("onClick",function(a){a.target.tagName=="INPUT"||a.target.tagName=="TEXTAREA"||a.target.tagName=="SELECT"||(d&&window.innerHeight<416||!d&&window.innerHeight0;)c=this.Ve[a%16]+c,a=Math.floor(a/16);for(;c.length0?c[0].substr(f,e):c[0].substr(0,e+f),d=g+(d?b.groupDelimiter+d:"")}while(f>0);return d+b.decimalDelimeter+c[1]},numToStr:function(a){return function(b){return dhx.Number.format(b,a)}}}; -dhx.Date={Locale:{month_full:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),month_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),day_full:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(",")},weekStart:function(a){var b=a.getDay();this.config.start_on_monday&&(b===0?b=6:b--);return this.date_part(this.add(a,-1*b,"day"))},monthStart:function(a){a.setDate(1);return this.date_part(a)}, -yearStart:function(a){a.setMonth(0);return this.month_start(a)},dayStart:function(a){return this.date_part(a)},dateToStr:function(a,b){a=a.replace(/%[a-zA-Z]/g,function(a){switch(a){case "%d":return'"+dhx.math.toFixed(date.getDate())+"';case "%m":return'"+dhx.math.toFixed((date.getMonth()+1))+"';case "%j":return'"+date.getDate()+"';case "%n":return'"+(date.getMonth()+1)+"';case "%y":return'"+dhx.math.toFixed(date.getFullYear()%100)+"';case "%Y":return'"+date.getFullYear()+"';case "%D":return'"+dhx.Date.Locale.day_short[date.getDay()]+"'; -case "%l":return'"+dhx.Date.Locale.day_full[date.getDay()]+"';case "%M":return'"+dhx.Date.Locale.month_short[date.getMonth()]+"';case "%F":return'"+dhx.Date.Locale.month_full[date.getMonth()]+"';case "%h":return'"+dhx.math.toFixed((date.getHours()+11)%12+1)+"';case "%g":return'"+((date.getHours()+11)%12+1)+"';case "%G":return'"+date.getHours()+"';case "%H":return'"+dhx.math.toFixed(date.getHours())+"';case "%i":return'"+dhx.math.toFixed(date.getMinutes())+"';case "%a":return'"+(date.getHours()>11?"pm":"am")+"'; -case "%A":return'"+(date.getHours()>11?"PM":"AM")+"';case "%s":return'"+dhx.math.toFixed(date.getSeconds())+"';case "%W":return'"+dhx.math.toFixed(dhx.Date.getISOWeek(date))+"';default:return a}});b===!0&&(a=a.replace(/date\.get/g,"date.getUTC"));return new Function("date",'return "'+a+'";')},strToDate:function(a,b){for(var c="var temp=date.split(/[^0-9a-zA-Z]+/g);",d=a.match(/%[a-zA-Z]/g),e=0;e50?1900:2000);";break;case "%g":case "%G":case "%h":case "%H":c+="set[3]=temp["+e+"]||0;";break;case "%i":c+="set[4]=temp["+e+"]||0;";break;case "%Y":c+="set[0]=temp["+e+"]||0;";break;case "%a":case "%A":c+="set[3]=set[3]%12+((temp["+e+"]||'').toLowerCase()=='am'?0:12);";break;case "%s":c+="set[5]=temp["+e+"]||0;"}var f="set[0],set[1],set[2],set[3],set[4],set[5]";b&&(f=" Date.UTC("+f+")");return new Function("date", -"var set=[0,0,1,0,0,0]; "+c+" return new Date("+f+");")},getISOWeek:function(a){if(!a)return!1;var b=a.getDay();b===0&&(b=7);var c=new Date(a.valueOf());c.setDate(a.getDate()+(4-b));var d=c.getFullYear(),e=Math.floor((c.getTime()-(new Date(d,0,1)).getTime())/864E5),f=1+Math.floor(e/7);return f},getUTCISOWeek:function(a){return this.getISOWeek(a)},add:function(a,b,c){var d=new Date(a.valueOf());switch(c){case "day":d.setDate(d.getDate()+b);break;case "week":d.setDate(d.getDate()+7*b);break;case "month":d.setMonth(d.getMonth()+ -b);break;case "year":d.setYear(d.getFullYear()+b);break;case "hour":d.setHours(d.getHours()+b);break;case "minute":d.setMinutes(d.getMinutes()+b)}return d},datePart:function(a){var b=this.copy(a);b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0);return b},timePart:function(a){var b=this.copy(a);return(b.valueOf()/1E3-b.getTimezoneOffset()*60)%86400},copy:function(a){return new Date(a.valueOf())}};dhx.i18n.setLocale("en");dhx.format=function(a){a=a||{};this.$init(a)}; -dhx.format.prototype={$init:function(a){this.a={};this.a.groupDelimiter=a.groupDelimiter||" ";this.a.groupNumber=a.groupNumber||3;this.a.decimalPoint=a.decimalPoint||",";this.a.fractNumber=a.fractNumber||5;this.a.dateFormat=a.dateFormat||"%Y/%m/%d";this.a.stringTemplate=a.stringTemplate||"{value}";this.ff=dhx.Date.str_to_date(this.a.dateFormat);this.Qd=dhx.Date.date_to_str(this.a.dateFormat)},define:function(a,b){this.a[a]=b},format:function(a,b){b=b||this.formatAutoDefine(a);return this["format__"+ -b]?this["format__"+b](a):a},formatAutoDefine:function(a){return typeof a=="number"||a instanceof Number?"number":a instanceof Date?"date":typeof a=="string"||a instanceof String?isNaN(parseFloat(a))?"string":"number":!1},format__number:function(a){var b="";typeof a=="number"||a instanceof Number||(a=parseFloat(a));var c=a.toFixed(this.a.fractNumber).toString(),c=c.split("."),d=this.add_delimiter_to_int(c[0]),e=this.str_reverse(this.add_delimiter_to_int(this.str_reverse(c[1])));return b=d+this.a.decimalPoint+ -e},add_delimiter_to_int:function(a){for(var b=0,c="",d=a.length-1;d>=0;d--)c=a[d]+c,b++,b==this.a.groupNumber&&(c=this.a.groupDelimiter+c,b=0);return c},str_reverse:function(a){for(var b="",c=a.length-1;c>=0;c--)b+=a[c];return b},format__date:function(a){var b=this.Qd(a);return b},attachFormat:function(a,b){this["format__"+a]=b},format__string:function(a){var b=this.a.stringTemplate.replace("{value}",a);return b},format__bold:function(a){return typeof a=="string"||a instanceof String?a.bold():a}}; -dhx.i18n.setLocale(); -dhx.protoUI({name:"calendar",defaults:{date:null,startOnMonday:!0,navigation:!0,weekHeader:!1,weekNumber:!1,timeSelect:!1,skipEmptyWeeks:!0,cellHeight:36,minuteStep:15,hourStart:6,hourEnd:24,hourFormat:"%H",calendarHeader:"%F %Y",calendarDay:"%d",calendarWeekHeader:"W#",calendarWeek:"%W",width:300,height:300,selectedCss:"dhx_cal_selected_day"},skin:{monthHeaderHeight:40,weekHeaderHeight:20,timeSelectHeight:32},hourFormat_setter:dhx.Date.dateToStr,calendarHeader_setter:dhx.Date.dateToStr,calendarDay_setter:dhx.Date.dateToStr, -calendarWeekHeader_setter:dhx.Date.dateToStr,calendarWeek_setter:dhx.Date.dateToStr,date_setter:function(a){typeof a=="string"&&(a=dhx.i18n.fullDateFormatDate(a));this.L=this.L||a;return a},$init:function(){this.fa={};this.ec=[];var a="%Y-%m-%d";this.rc=dhx.Date.dateToStr(a);this.Cd=dhx.Date.strToDate(a)},$getSize:function(){var a=this.a;if(a.cellHeight>0)a.height=this.Xd();return dhx.ui.view.prototype.$getSize.call(this)},cellHeight_setter:function(a){return a=="auto"?0:a},$setSize:function(a,b){dhx.ui.view.prototype.$setSize.call(this, -a,b)&&this.render()},Ac:function(){var a=this.a;if(!this.L)this.L=new Date;var b=new Date(this.L);b.setDate(1);var c=b.getDay();this.ke=new Date(b);this.vd=a.startOnMonday?1:0;this.lb=(c-this.vd+7)%7;this.Nb=32-(new Date(b.getFullYear(),b.getMonth(),32)).getDate();var d=42-this.lb-this.Nb;this.df=new Date(b.setDate(this.Nb));this.G=a.skipEmptyWeeks?6-Math.floor(d/7):6;this.Ob=this.G*7-this.lb-this.Nb;this.cf=new Date(b.setDate(b.getDate()+d));this.Dc=this.skin.monthHeaderHeight+(a.weekHeader?this.skin.weekHeaderHeight: -0)+(a.timeSelect?this.skin.timeSelectHeight:0)},Xd:function(){this.Ac();return this.Dc+this.G*this.a.cellHeight},Td:function(){this.Ac();var a=this.a;this.Da=[];this.W=[];var b=this.j;b+=1;for(var c=this.m,d=a.weekNumber?8:7,e=0;e";a.weekHeader&&(b+="
    "+this.Xe()+"
    ");b+="
    "+this.Bd()+"
    ";a.timeSelect&&(b+="
    "+this.Ue()+"
    ");b+="
    ";this.g.innerHTML=b;if(a.timeSelect){for(var c=this.g.getElementsByTagName("select"),d=this.ec,e=0;e"+f+"";d+=this.W[0]}for(var g=0;g<7;g++){var h=(c+g)%7,i=dhx.Date.Locale.day_short[h], -j="dhx_cal_day_name",k=this.W[g+e]-1;g==6&&(j+=" dhx_cal_day_name_last",k+=1);h===0&&(j+=" dhx_sunday");h==6&&(j+=" dhx_saturday");b+="
    "+i+"
    ";d+=this.W[g+e]}return b},Bd:function(){var a=this.a,b=0,c=dhx.Date.add(this.ke,-this.lb,"day"),c=dhx.Date.datePart(c),d=0,e="";if(a.weekNumber){var d=1,f=dhx.Date.add(c,(this.vd+1)%2,"day");e+='';for(var g= -0;g=7||g==this.G-2&&this.Ob==14))k="dhx_next_month",j="";g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+="";f=dhx.Date.add(f,7,"day")}e+="
    ";e+="
    "+j+"
    ";e+="
    "}var o=dhx.Date.datePart(new Date);e+='';for(var m= -this.G*7-1,g=0;g";for(var l=0;l<7;l++){var n=a.calendarDay(c),p=this.rc(c),k="dhx_cal_day_num";bm-this.Ob&&(k="dhx_next_month",p=n="");h=this.Da[g]-2;i=this.W[l+d]-2;l==6&&(k+=" dhx_cal_day_num_rborder",i+=1);g==this.G-1&&(k+=" dhx_cal_day_num_bborder",h+=1);e+=""; -c=dhx.Date.add(c,1,"day");b++}e+=""}e+="
    ";o.valueOf()==c.valueOf()&&(k+=" dhx_cal_current_day");e+="
    "+n+"
    ";e+="
    ";return e},Ue:function(){for(var a=this.a,b="";b+="";return b},le:function(){var a="
    ";return a+"prev"+b+a+"next"+b},on_click:{dhx_cal_arrow:function(a,b,c){var d=c.className.match(/prev/i)?-1:1,e=new Date(this.L),f=new Date(e);f.setDate(1);f=dhx.Date.add(f,d,"month");this.callEvent("onBeforeMonthChange",[e,f])&&(this.showCalendar(f),this.selectDate(this.a.date,!1),this.callEvent("onAfterMonthChange",[f,e]))},dhx_cal_day_num:function(a,b,c){var d=c.getAttribute("date"),e=this.Cd(d);if(this.a.timeSelect){var f=this.ec;e.setMinutes(f[0].value*60+f[1].value* -1)}this.selectDate(e);this.callEvent("onDateSelect",[e]);this.callEvent("onChange",[e])}}},dhx.MouseEvents,dhx.Settings,dhx.EventSystem,dhx.Movable,dhx.ui.view);dhx.Modality={modal_setter:function(a){if(a){if(!this.qa)this.qa=dhx.html.create("div",{"class":a=="rich"?"dhx_modal_rich":"dhx_modal"}),this.qa.style.zIndex=dhx.ui.zIndex(),this.b.style.zIndex=dhx.ui.zIndex(),document.body.appendChild(this.qa)}else this.qa&&dhx.html.remove(this.qa),this.qa=null;return a}}; -dhx.protoUI({name:"window",$init:function(a){this.b.innerHTML="
    ";this.g=this.b.firstChild;this.eb=this.g.childNodes[0];this.pc=this.g.childNodes[1];this.b.className+=" dhx_window";this.R=this.h=null;this.a.k={top:!1,left:!1,right:!1,bottom:!1};if(!a.id)a.id=dhx.uid()},Zc:function(){this.h={destructor:function(){}}},ac:function(a){this.h.destructor();this.h=a;this.h.D=this;this.pc.appendChild(this.h.b); -this.resize()},show:function(a,b,c){this.a.hidden=!1;this.b.style.zIndex=dhx.ui.zIndex();this.a.modal&&this.modal_setter(!0);var d,e,f;if(a){typeof a=="object"&&!a.tagName?(d={x:a.clientX-this.$[0]/2,y:a.clientY},e=document.body.offsetWidth,f=1):a=dhx.toNode(a);var g=document.body.offsetWidth,h=document.body.offsetHeight;e=e||a.offsetWidth;f=f||a.offsetHeight;var i=this.$;d=d||dhx.html.offset(a);var j=6,k=6,o=6,c="top",m=0,l=0,n=0,p=0;b=="right"?(p=d.x+j+e,k=-f,c="left",m=Math.round(d.y+f/2),l=p- -o):b=="left"?(p=d.x-j-i[0]-1,k=-f,c="right",m=Math.round(d.y+f/2),l=p+i[0]+1):(p=g-d.x>i[0]?d.x:g-j-i[0],l=Math.round(d.x+e/2),l>p+i[0]&&(l=p+i[0]/2));h-f-d.y-k>i[1]?(n=f+d.y+k,m||(c="top",m=n-o)):(n=d.y-k-i[1],n<0?(n=0,c=!1):m||(c="bottom",n--,m=n+i[1]+1));this.setPosition(p,n);c&&this.cd&&this.cd(c,l,m)}this.Le=new Date;this.b.style.display="block";if(this.la){for(var q=0;q250&&this.hide()},$getSize:function(){var a=this.h.$getSize();if(a[3])this.a.height=a[3]+this.a.padding*2;if(a[1])this.a.width=a[1]+this.a.padding*2;if(a[0]||a[2])this.a.gravity=Math.max(a[0],a[2]);return dhx.ui.view.prototype.$getSize.call(this)}, -$setSize:function(a,b){if(dhx.ui.view.prototype.$setSize.call(this,a,b))a=this.j-this.a.padding*2,b=this.m-this.a.padding*2,this.g.style.padding=this.a.padding+"px",this.eb.style.display="none",this.h.$setSize(a,b)},body_setter:function(a){a=dhx.ui.window.prototype.body_setter.call(this,a);this.h.a.k={top:!1,left:!1,right:!1,bottom:!1};return a},defaults:{padding:8},head_setter:null,cd:function(a,b,c){this.Fc();document.body.appendChild(this.Ka=dhx.html.create("DIV",{"class":"dhx_point_"+a},"")); -this.Ka.style.zIndex=dhx.ui.zIndex();this.Ka.style.top=c+"px";this.Ka.style.left=b+"px"},Fc:function(){this.Ka=dhx.html.remove(this.Ka)}},dhx.ui.window); -dhx.protoUI({name:"alert",defaults:{position:"center",head:{template:"Info",css:"dhx_alert_template"},height:170,modal:!0,callback:null,body:{type:"clean",rows:[{template:"
    #text#
    ",data:{text:"You have forgot to define the text :) "}},{view:"button",height:60,id:"dhx_alert_ok",type:"big",label:"Ok",click:function(){this.getParent().getParent().Bb(!0)}}]}},$init:function(){(!this.b.parentNode||!this.b.parentNode.tagName)&&document.body.appendChild(this.b);this.$ready.push(this.resize)}, -Yc:function(a){typeof a=="string"&&(a={title:this.defaults.head.template,message:a});dhx.extend(a,this.defaults);delete a.head;delete a.body;this.Rb(a,{});this.resize();this.show()},title_setter:function(a){this.R.define("template",a);this.R.render()},message_setter:function(a){var b=this.h.c[0];b.data={text:a};b.render()},labelOk_setter:function(a){var b=this.h.c[1];b.config.label=a;b.render()},labelCancel_setter:function(a){var b=this.h.c[2];b.config.label=a;b.render()},Bb:function(a){this.hide(); -this.a.callback&&dhx.toFunctor(this.a.callback).call(this,a,this.a.details)}},dhx.ui.window);dhx.alert=dhx.single(dhx.ui.alert); -dhx.protoUI({name:"confirm",defaults:{height:210,body:{type:"clean",rows:[{id:"dhx_confirm_message",template:"
    #text#
    ",data:{text:"You have forgot to define the text :) "}},{height:53,view:"button",type:"big",id:"dhx_confirm_ok",label:"Ok",click:function(){this.getParent().getParent().Bb(!0)}},{height:55,view:"button",type:"biground",id:"dhx_confirm_cancel",label:"Cancel",click:function(){this.getParent().getParent().Bb(!1)}}]}}},dhx.ui.alert);dhx.confirm=dhx.single(dhx.ui.confirm); -dhx.dp=function(a){if(typeof a=="object"&&a.a)a=a.a.id;if(dhx.dp.Tb[a])return dhx.dp.Tb[a];if(typeof a=="string"||typeof a=="number")a={master:dhx.ui.get(a)};var b=new dhx.DataProcessor(a);return dhx.dp.Tb[b.a.master.a.id]=b};dhx.dp.Tb={}; -dhx.DataProcessor=dhx.proto({defaults:{autoupdate:!0,mode:"post"},$init:function(){this.V=[];this.bf=[];this.X=null;this.na=!1;this.name="DataProcessor";this.$ready.push(this.zb)},master_setter:function(a){var b=a;if(a.name!="DataStore")b=a.data;this.a.store=b;return a},zb:function(){this.a.store.attachEvent("onStoreUpdated",dhx.bind(this.Sc,this))},ignore:function(a,b){var c=this.na;this.na=!0;a.call(b||this);this.na=c},off:function(){this.na=!0},on:function(){this.na=!1},Kd:function(a){var b={}, -c;for(c in a)c.indexOf("$")!==0&&(b[c]=a[c]);return b},save:function(a,b){b=b||"update";this.Sc(a,this.a.store.item(a),b)},Sc:function(a,b,c){if(this.na===!0||!c)return!0;var d={id:a,data:this.Kd(b)};switch(c){case "update":d.operation="update";break;case "add":d.operation="insert";break;case "delete":d.operation="delete";break;default:return!0}if(d.operation!="delete"&&!this.validate(d.data))return!1;this.Gd(d)&&this.V.push(d);this.a.autoupdate&&this.send();return!0},Gd:function(a){for(var b=0;b< -this.V.length;b++){var c=this.V[b];if(c.id==a.id){if(a.operation=="delete")c.operation=="insert"?this.V.splice(b,1):c.operation="delete";c.data=a.data;return!1}}return!0},send:function(){this.Ge()},Ge:function(){if(this.a.url){for(var a=this.V,b=[],c=0;c=0&&this.V.splice(i,1),h.tid!=h.sid&&this.a.store.changeId(h.sid,h.tid),this.callEvent("onAfter"+h.type,[h])}this.callEvent("onAfterSync",[f,a,b,c])},escape:function(a){return this.a.escape?this.a.escape(a):encodeURIComponent(a)}},dhx.Settings,dhx.EventSystem,dhx.ValidateData); -(function(){var a=dhx.Touch={config:{longTouchDelay:1E3,scrollDelay:150,gravity:500,deltaStep:30,speed:"0ms",finish:1500},disable:function(){a.Fb=!0},enable:function(){a.Fb=!1},$init:function(){dhx.env.touch?(dhx.event(document.body,"touchstart",a.nd),dhx.event(document.body,"touchmove",a.gc),dhx.event(document.body,"touchend",a.md)):(a.bb=a.Wd,dhx.event(document.body,"mousedown",a.nd),dhx.event(document.body,"mousemove",a.gc),dhx.event(document.body,"mouseup",a.md),document.body.style.overflowX= -document.body.style.overflowY="hidden");dhx.event(document.body,"dragstart",function(a){return dhx.html.preventEvent(a)});dhx.event(document.body,"touchstart",function(b){if(!a.Fb&&dhx.env.isSafari)return b.srcElement.tagName=="SELECT"?!0:dhx.html.preventEvent(b)});a.Ca()},Ca:function(){a.A=a.w=a.ca=null;a.H=a.v=a.n=null;a.I={wb:0,xb:0,Na:0};if(a.Xa)dhx.html.removeCss(a.Xa,"dhx_touch"),a.Xa=null;window.clearTimeout(a.Kc);a.ud=!0;a.Sa=!0;a.Ta=!0;a.ic||a.ua()},md:function(b){if(a.A){if(a.H){var c=a.Hb(a.v), -d=c.e,e=c.f,f=a.config.finish,g=a.Bc(b,!0);if(g.Na){var h=d+a.config.gravity*g.wb/g.Na,i=e+a.config.gravity*g.xb/g.Na,j=a.q[0]?a.Wa(h,!1,!1,a.n.dx,a.n.px):d,k=a.q[1]?a.Wa(i,!1,!1,a.n.dy,a.n.py):e,o=Math.max(Math.abs(j-d),Math.abs(k-e));o<150&&(f=f*o/150);if(j!=d||k!=e)f=Math.round(f*Math.max((j-d)/(h-d),(k-e)/(i-e)));var m={e:j,f:k},l=dhx.ui.get(a.v);l&&l.callEvent&&l.callEvent("onAfterScroll",[m]);f=Math.max(100,f);d!=m.e||e!=m.f?(a.wa(a.v,m.e,m.f,f+"ms"),a.dd(m.e,m.f,f+"ms")):a.ua()}else a.ua()}else if(a.Ta&& -!a.Sa)a.ya("onSwipeX");else if(a.Sa&&!a.Ta)a.ya("onSwipeY");else if(dhx.env.isSafari){var n=a.A.target;dhx.delay(function(){var a=document.createEvent("MouseEvents");a.initEvent("click",!0,!0);n.dispatchEvent(a)})}a.ya("onTouchEnd");a.Ca()}},gc:function(b){if(a.A){var c=a.Bc(b);a.ya("onTouchMove");if(a.H)a.ed(c);else if(a.Sa=a.lc(c.Ye,"x",a.Sa),a.Ta=a.lc(c.Ze,"y",a.Ta),a.H){var d=a.Cc("onBeforeScroll");if(d){var e={};d.callEvent("onBeforeScroll",[e]);if(e.update)a.config.speed=e.speed,a.config.scale= -e.scale}a.ce(c)}return dhx.html.preventEvent(b)}},ed:function(){if(a.v){var b=a.Hb(a.v),c=b.e,d=b.f,e=a.ca||a.A;if(a.q[0])b.e=a.Wa(b.e-e.x+a.w.x,!0,b.e,a.n.dx,a.n.px);if(a.q[1])b.f=a.Wa(b.f-e.y+a.w.y,!0,b.f,a.n.dy,a.n.py);a.wa(a.v,b.e,b.f,"0ms");a.dd(b.e,b.f,"0ms")}},dd:function(b,c,d){var e=a.n.px/a.n.dx*-b,f=a.n.py/a.n.dy*-c;a.q[0]&&a.wa(a.q[0],e,0,d);a.q[1]&&a.wa(a.q[1],0,f,d)},wa:function(b,c,d,e){a.ic=!0;b.style[dhx.env.transformPrefix+"Transform"]=dhx.env.translate+"("+Math.round(c)+"px, "+ -Math.round(d)+"px"+(dhx.env.translate=="translate3d"?", 0":"")+")";b.style[dhx.env.transformPrefix+"TransitionDuration"]=e},Hb:function(a){var c=window.getComputedStyle(a)[dhx.env.transformPrefix+"Transform"];if(c=="none")return{e:0,f:0};else{if(window.WebKitCSSMatrix)return new WebKitCSSMatrix(c);for(var d=c.replace(/(matrix\()(.*)(\))/gi,"$2"),d=d.replace(/\s/gi,""),d=d.split(","),e={},f="a,b,c,d,e,f".split(","),g=0;g0)return c?d+h*Math.sqrt(g):0;var i=e-f;return i+a<0?c?d-Math.sqrt(-(a-d)):-i:a},ce:function(){a.H.indexOf("x")!=-1&&(a.q[0]=a.vc("x",a.n.dx,a.n.px,"width"));a.H.indexOf("y")!=-1&&(a.q[1]=a.vc("y",a.n.dy,a.n.py,"height"));if(!a.v.scroll_enabled){a.v.scroll_enabled=!0;a.v.parentNode.style.position="relative";var b=dhx.env.transformCSSPrefix;a.v.style.cssText+=b+"transition: "+b+"transform; "+b+"user-select:none; "+b+"transform-style:flat;";a.v.addEventListener(dhx.env.transitionEnd, -a.ua,!1)}window.setTimeout(a.ed,1)},vc:function(b,c,d,e){if(c-d<2)return a.H="";var f=dhx.html.create("DIV",{"class":"dhx_scroll_"+b},"");f.style[e]=d*d/c-7+"px";a.v.parentNode.appendChild(f);return f},lc:function(b,c,d){if(b>a.config.deltaStep){if(a.ud&&(a.he(c),(a.H||"").indexOf(c)==-1))a.H="";return!1}return d},ua:function(){if(!a.H)dhx.html.remove(a.q),a.q=[null,null];a.ic=!1},he:function(b){window.clearTimeout(a.Kc);a.ud=!1;a.Jc(b)},nd:function(b){if(!a.Fb){a.A=a.bb(b);a.ya("onTouchStart");a.q[0]|| -a.q[1]?a.Re(b,a.q[0]?"x":"y"):a.Kc=window.setTimeout(a.ie,a.config.longTouchDelay);var c=dhx.ui.get(b);if(c&&c.touchable&&(!b.target.className||b.target.className.indexOf("dhx_view")!==0))a.Xa=c.getNode(b),dhx.html.addCss(a.Xa,"dhx_touch")}},ie:function(){a.ya("onLongTouch");dhx.callEvent("onClick",[a.A]);a.Ca()},Re:function(b,c){a.Jc(c);var d=a.q[0]||a.q[1];if(d&&(!a.v||d.parentNode!=a.v.parentNode))a.Ca(),a.ua(),a.A=a.bb(b);a.gc(b)},Bc:function(b){a.ca=a.w;a.w=a.bb(b);a.I.Ye=Math.abs(a.A.x-a.w.x); -a.I.Ze=Math.abs(a.A.y-a.w.y);if(a.ca)a.w.time-a.ca.time";this.g=this.b.firstChild;this.map=null;this.$ready.push(this.render)},render:function(){var a=this.a,b={zoom:a.zoom,center:a.center,mapTypeId:a.mapType};this.map=new google.maps.Map(this.g,b)},center_setter:function(a){typeof a!="object"&&(a={});this.Ia(a,{x:48.724,y:8.215});a=new google.maps.LatLng(a.x,a.y);this.map&&this.map.setCenter(a);return a}, -mapType_setter:function(a){a=google.maps.MapTypeId[a];this.map&&this.map.setMapTypeId(a);return a},zoom_setter:function(a){this.map&&this.map.setZoom(a);return a},defaults:{zoom:5,center:{},mapType:"ROADMAP"},$setSize:function(){dhx.ui.view.prototype.$setSize.apply(this,arguments);google.maps.event.trigger(this.map,"resize")}},dhx.ui.view);if(!window.scheduler)window.scheduler={config:{},templates:{},xy:{},locale:{}};if(!scheduler.locale)scheduler.locale={}; -scheduler.locale.labels={list_tab:"List",day_tab:"Day",month_tab:"Month",icon_today:"Today",icon_save:"Save",icon_delete:"Delete event",icon_cancel:"Cancel",icon_edit:"Edit",icon_back:"Back",icon_close:"Close form",icon_yes:"Yes",icon_no:"No",confirm_closing:"Your changes will be lost, are your sure ?",confirm_deleting:"Event will be deleted permanently, are you sure?",label_event:"Event",label_start:"Start",label_end:"End",label_details:"Notes",label_from:"from",label_to:"to"}; -scheduler.config={init_date:new Date,form_date:"%d-%m-%Y %H:%i",xml_date:"%Y-%m-%d %H:%i",item_date:"%d.%m.%Y",header_date:"%d.%m.%Y",hour_date:"%H:%i",scale_hour:"%H",calendar_date:"%F %Y"};scheduler.config.form_rules={end_date:function(a,b){return b.start_date.valueOf()";if(dhx.Date.datePart(a.start_date).valueOf()==dhx.Date.datePart(a.end_date).valueOf()){var c=dhx.i18n.dateFormatStr(a.start_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="
    "+c+"
    ";b+="
    "+scheduler.locale.labels.label_from+" "+d+" "+scheduler.locale.labels.label_to+ -" "+e+"
    "}else{var f=dhx.i18n.longDateFormatStr(a.start_date),g=dhx.i18n.longDateFormatStr(a.end_date),d=dhx.i18n.timeFormatStr(a.start_date),e=dhx.i18n.timeFormatStr(a.end_date);b+="
    "+scheduler.locale.labels.label_from+" "+d+" "+f+"
    ";b+="
    "+scheduler.locale.labels.label_to+" "+e+" "+g+"
    "}a.details&&a.details!==""&&(b+="
    "+scheduler.locale.labels.label_details+"
    ",b+="
    "+a.details+"
    "); -b+="";return b},calendar_event:function(a){return a+"
    "},event_date:function(a){return dhx.i18n.dateFormatStr(a)},event_long_date:function(a){return dhx.i18n.longDateFormatStr(a)},event_time:function(a){return dhx.i18n.timeFormatStr(a)},event_color:function(a){return a.color?"background-color:"+a.color:""},event_marker:function(a,b){return"
    "},event_title:function(a,b){return"
    "+ -b.dateStart(a.start_date)+"
    "+b.timeStart(a.start_date)+"
    "+b.marker(a,b)+"
    "+a.text+"
    "},month_event_title:function(a,b){return b.marker(a,b)+"
    "+b.timeStart(a.start_date)+"
    "+a.text+"
    "},day_event:function(a){return a.text}};scheduler.config.views=[]; -dhx.ready(function(){if(scheduler.locale&&scheduler.locale.date)dhx.Date.Locale=scheduler.locale.date;if(!scheduler.config.form)scheduler.config.form=[{view:"text",label:scheduler.locale.labels.label_event,name:"text"},{view:"datepicker",label:scheduler.locale.labels.label_start,name:"start_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"datepicker",label:scheduler.locale.labels.label_end,name:"end_date",timeSelect:1,dateFormat:scheduler.config.form_date},{view:"textarea",label:scheduler.locale.labels.label_details, -name:"details",width:300,height:150},{view:"button",label:scheduler.locale.labels.icon_delete,id:"delete",type:"form",css:"delete"}];if(!scheduler.config.bottom_toolbar)scheduler.config.bottom_toolbar=[{view:"button",id:"today",label:scheduler.locale.labels.icon_today,inputWidth:scheduler.xy.icon_today,align:"left",width:scheduler.xy.icon_today+6},{view:"segmented",id:"buttons",selected:"list",align:"center",multiview:!0,options:[{value:"list",label:scheduler.locale.labels.list_tab,width:scheduler.xy.list_tab}, -{value:"day",label:scheduler.locale.labels.day_tab,width:scheduler.xy.day_tab},{value:"month",label:scheduler.locale.labels.month_tab,width:scheduler.xy.month_tab}]},{view:"button",css:"add",id:"add",align:"right",label:"",inputWidth:42,width:50},{view:"label",label:"",inputWidth:42,width:50,batch:"readonly"}];if(!scheduler.config.day_toolbar)scheduler.config.day_toolbar=[{view:"label",id:"prev",align:"left",label:"
    "},{view:"label",id:"date",align:"center", -width:200},{view:"label",id:"next",align:"right",label:"
    "}];if(!scheduler.config.selected_toolbar)scheduler.config.selected_toolbar=[{view:"button",inputWidth:scheduler.xy.icon_back,type:"prev",id:"back",align:"left",label:scheduler.locale.labels.icon_back},{view:"button",inputWidth:scheduler.xy.icon_edit,id:"edit",align:"right",label:scheduler.locale.labels.icon_edit}];if(!scheduler.config.form_toolbar)scheduler.config.form_toolbar=[{view:"button", -inputWidth:scheduler.xy.icon_cancel,id:"cancel",css:"cancel",align:"left",label:scheduler.locale.labels.icon_cancel},{view:"button",inputWidth:scheduler.xy.icon_save,id:"save",align:"right",label:scheduler.locale.labels.icon_save}];scheduler.types={event_list:{name:"EventsList",css:"events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.list_height,width:"auto",dateStart:scheduler.templates.event_date,timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker, -template:scheduler.templates.event_title},day_event_list:{name:"DayEventsList",css:"day_events",cssNoEvents:"no_events",padding:0,height:scheduler.xy.month_list_height,width:"auto",timeStart:scheduler.templates.event_time,color:scheduler.templates.event_color,marker:scheduler.templates.event_marker,template:scheduler.templates.month_event_title}};dhx.Type(dhx.ui.list,scheduler.types.event_list);dhx.Type(dhx.ui.list,scheduler.types.day_event_list);dhx.DataDriver.scheduler={records:"/*/event"};dhx.extend(dhx.DataDriver.scheduler, -dhx.DataDriver.xml);var a=[{id:"list",view:"list",type:"EventsList",startDate:new Date},{id:"day",rows:[{id:"dayBar",view:"toolbar",css:"dhx_topbar",elements:scheduler.config.day_toolbar},{id:"dayList",view:"dayevents"}]},{id:"month",rows:[{id:"calendar",view:"calendar",dayWithEvents:scheduler.templates.calendar_event,calendarHeader:scheduler.config.calendar_date},{id:"calendarDayEvents",view:"list",type:"DayEventsList"}]},{id:"event",animate:{type:"slide",subtype:"in",direction:"top"},rows:[{id:"eventBar", -view:"toolbar",type:"TopBar",css:"single_event",elements:scheduler.config.selected_toolbar},{id:"eventTemplate",view:"template",template:scheduler.templates.selected_event}]},{id:"form",rows:[{id:"editBar",view:"toolbar",type:"TopBar",elements:scheduler.config.form_toolbar},{id:"editForm",view:"form",elements:scheduler.config.form,rules:scheduler.config.form_rules}]}].concat(scheduler.config.views);dhx.protoUI({name:"scheduler",defaults:{rows:[{view:"multiview",id:"views",cells:a},{view:"toolbar", -id:"bottomBar",type:"SchedulerBar",visibleBatch:"default",elements:scheduler.config.bottom_toolbar}],color:"#color#",textColor:"#textColor#"},$init:function(){this.name="Scheduler";this.b.className+=" dhx_scheduler";dhx.i18n.dateFormat=scheduler.config.item_date;dhx.i18n.timeFormat=scheduler.config.hour_date;dhx.i18n.fullDateFormat=scheduler.config.xml_date;dhx.i18n.headerFormatStr=dhx.Date.dateToStr(scheduler.config.header_date);dhx.i18n.setLocale();this.data.provideApi(this);this.data.extraParser= -dhx.bind(function(a){a.start_date=dhx.i18n.fullDateFormatDate(a.start_date);a.end_date=dhx.i18n.fullDateFormatDate(a.end_date)},this);this.$ready.push(this.$d);this.data.attachEvent("onStoreUpdated",dhx.bind(this.Oe,this))},$d:function(){this.ae();this.de();this.coreData=new dhx.DataValue;this.coreData.setValue(scheduler.config.init_date);this.$$("dayList").define("date",this.coreData);this.selectedEvent=new dhx.DataRecord;this.config.readonly?this.define("readonly",this.config.readonly):scheduler.config.readonly&& -this.define("readonly",!0);if(this.config.save){var a=new dhx.DataProcessor({master:this,url:this.config.save});a.attachEvent("onBeforeDataSend",this.re)}this.$$("date")&&this.$$("date").bind(this.coreData,null,dhx.i18n.headerFormatStr);this.$$("list").sync(this);this.$$("list").bind(this.coreData,function(a,b){return ba.start_date}); -this.$$("calendar").bind(this.coreData);this.$$("calendarDayEvents").sync(this,!0);this.$$("calendarDayEvents").bind(this.coreData,function(a,b){var e=dhx.Date.datePart(b);return ea.start_date});this.$$("eventTemplate").bind(this);this.$$("editForm").bind(this);this.$$("list").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("dayList").attachEvent("onItemClick",dhx.bind(this.Qb,this));this.$$("calendarDayEvents").attachEvent("onItemClick",dhx.bind(this.Qb, -this))},Qb:function(a){this.setCursor(a);this.$$("event").show()},Oe:function(){this.data.blockEvent();this.data.sort(function(a,b){return a.start_date";e+="
    "+a+"
    ";e+="
    ";e+="
    "+c+"
    ";e+="
    "+d+"
    ";e+="
    ";e+="
    ";e+="
    ";e+="
    ";e+="
    ";e+="";return e},type:{templateStart:dhx.Template("
    "),template:scheduler.templates.day_event,templateEnd:dhx.Template("
    "),templateCss:dhx.Template(""),templateColor:dhx.Template("#color#"), -templateTextColor:dhx.Template("#textColor#"),padding:2},we:function(){var a=this.data.getRange(),b=[],c,d,e,f,g;for(d=0;dg)g=b[e].$sorder;c.$sorder=g+1;c.$inner=!1}else c.$sorder=0;b.push(c);if(b.length>(b.max_count||0))b.max_count=b.length}for(d=0;ddhx.Date.datePart(d).valueOf()&&(d=c);dhx.Date.datePart(c).valueOf()dhx.Date.datePart(b).valueOf()&&(d=dhx.Date.datePart(b),d.setMinutes(0),d.setHours(this.config.lastHour));if(e=this.config.lastHour)e=this.config.lastHour&&(d.setMinutes(0), -d.setHours(this.config.lastHour));var g=Math.floor((this.j-this.config.timeScaleWidth-this.config.eventOffset-8)/a.$count);a.$left=a.$sorder*g+this.config.timeScaleWidth+this.config.eventOffset;a.$inner||(g*=a.$count-a.$sorder);a.$width=g-this.config.eventOffset-this.type.padding*2;var h=c.getHours()*60+c.getMinutes(),i=d.getHours()*60+d.getMinutes()||this.config.lastHour*60;a.$top=Math.round((h-this.config.firstHour/60)*(this.config.timeScaleHeight+1)/60);a.$height=Math.max(10,(i-h)*(this.config.timeScaleHeight+ -1)/60-2)-this.type.padding*2}},dhx.MouseEvents,dhx.SelectionModel,dhx.Scrollable,dhx.RenderStack,dhx.DataLoader,dhx.ui.view,dhx.EventSystem,dhx.Settings); diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/blue_tab.png deleted file mode 100644 index f874fa321f76c0160b4b8f48a9daedd36cee8bd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-K!2~3QS7wv~DYlXzzhEE@1bNHYCjzN8o-U3d z9-VKm8gd;nkZ60jT|%I+@bbcQPDi;T_O`Hp6$;Z=5S?@TU|y`(N|Rpai&^>LliG7K>pl(rSzno3KoOa=R6OQ;>i`)H-Zq+|- rem;NCMy?*i15f`I>27?rBbrhEz?;bOtEaj?aro^_LoO#n0oLiZ?RyuPUpS?GqslgVeZo@nfDPL>Z59ly6Z$XQd?Wp%_+|rv zAin+&({_B_Y(4LETD{imw~SIs%Zs#+$MK)Oc_XY_)5OIud&1wMy*F!&Hls+*7R9w&bR`KG0FOwjF-VBE?4X&3fUtYA4 zZOCxh+_YJ5b5rp9hAQ(dF0b>sFK%4)^arb~S3yWRWAq}R%Naaf{an^LB{Ts5d(dK@ diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/but_repeat.gif deleted file mode 100644 index dd6595e5d9ef43bd03c486ff87079f398267e085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1149 zcmZ?wbhEHblw#0e_|Cu(?klqTfBEyoYklCmVoqenVS|Pe!)>e59cFWsU9>AW zZP8U{yyh;8RlNr303RUE2#_d#_^)>0%x$Xs10t-?UO*$CP9jc$w;rijn>#HZ* ziuOA9HrlOUoN#1EY26vWko7W`kGGuIQyH^LXXo0ihgT<^dANV+jn?#K4u`fCUwwP* z-M5!ZXNH}5yl>s2_-m)ym(2>l`}us|%dq{M3y$q7@2KifR>Y}Mw6)3c8m-~M#w=7-a1 z2lYB02kd$=@8hpG|NsAI7zM*O1QdU=FfuSCFzA512+9-e9RC>(a>#gWSa7hJLs%<@ z!>y62jYpg%f??u==`spD872Y>4UJt1VGkBu+W4e}lTpRt$^pd#JWK}3LKB3T9*Ht> z{5N>MH5zv}sFyVmL)JDz@z9|n~A2ze=aoMTfc#?RCTa!a?fk(jUuvRNSo+m#7 zABgF&Eo)ezv2bzAcA+K}&I`<}M+6xCroGv*gqxjLp!QVD$^#6OloTdwc^t4{g{)f>K6CCawk>Cl{7Cw?#BK3K$BV zSs5kRIOOdXxUhBTvni|)Xl*QJN-QjLPzCavSUfPI0sfDy@jpkeH{?dy!N3 zhQbX7(}VJFMYr8B{IE5rQKCY`;NikW%s2R0UNrDKaC~s&6i8KY$lHF<>b{ktD z&gisyeO}}wWwu=IPQcysynfG5*AoY441ID30dRqYbB2hDj*oeU0SAKw43?OemjIca zmy8XQ2$l?`rlkO-{A0vp~mdytYTbG?msW^U zr#j6lvq09dT+^yuJJf1X0dM0fC;-4L+`9_kQoUzXuU`e6%*y?X_HW+7hz~0^%s6r5 zqF(Vz#(P-uVW*ZU-_3lP;(^MbIg1WWdbDW)xdf)NP2)85Uy zx9{J;VH*OpAUN;?ZyFFc{+kM-;>@E-IQ3E2UV#jV2dz}|K7IbH;;QNrz*VAWT z&%M2R_w3)xkI!-mk0eEOoX77&KNJ1{1{YYw5-_xof)G1|V4wyF7P#Pp5RRZj1OPka Cm_4ij diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/calendar.gif deleted file mode 100644 index 67257083540f7ea06881718da65d749f7284e165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmZ?wbhEHb6k-r!c*ek>prLT)%o*dfGgj$`HW)Az6cjY9_^@!{!iEJG{{Q%I;E^z4 z!G;SD{sW1G2@e`(9Qfam@FBrq!iozH0SOHY9(?%lzo28ogbn{4Djqzr5a{jgov`A= zh65M&@85s>_U->O8UiXVBt#?>EcoD1aG_wvg9k7EH#9UXSaD#%jt2)U1ZK{h8PM>c zVZn$0|NmdSa?Qab;lPOt4J-aPEI9Dt$A5={2S5dnpFCc$;lTAP*C%YaV3lz(dCI*9 z4g$qf)-Kp_;lhmv7j9e#Xtg?cw=gYN-LX^L zkc~}ezmnDRmHU*|uGiL?1^(|-fE8lblbd4od4L*O>-Nnixo_MTBMAhPt^YXsC%yN=J0u$6;9q86(1O;^YnlA`!OMrv9(1`BVyeag@*_CuyPgcJ8^Pz`Z*T|W<~~U06^u> AiU0rr diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/clock_big.gif deleted file mode 100644 index 61f7dc2e5ac32fc064ffb4e231f344df03d07baf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1321 zcmeH``!m}I0KmVIhu6+xXQh>06V%F?qh)EkZW3)hs&#ZarWvxNoo;QVXEiO_5K$#2 z#3Qb$#AB(~2ueM&NkRnmh*v}-2#b)=1sRIUu7ARQ-{<$wFQ2=Qf1ux~)A*ynQDB=1 z7>!1;SX|9t2@eksi-{YQYbGWpD%+Ooy0mdgS<1zCJfSY5{B?FQxA1qBY<91EWb?-a zY8rbwzjh9PJ6SZWBoGLOt+$f#1qQo*dVaraXydP?75Us=W`#mAuhFjQXBQ7zgwj7H zW17`X{rYA`ei^f}d1T@>wM?E_P*GGfRK%{yd9KW5)d%C^N}J`67;V{XQ8rguRaM1p z=*(bL)_3$%*i-#7jbe7Os&koL+aZu@cm^7wXN@X-Xe8PN?$>z29$mX=EIjrQ&;<*L&i(WN_EhjyG@vvlM zVrG|C$maLSMy7XEnzc#gZu(Qn+TR;gmL!W=PhrdQN*g*QvP4=#R@q>yX!J>8Wo_F) zgFwd@_T@dRlT5CZ)^lYoT|sVFFT;WtZ~AVk=f!jOFMXfDCf7J;?tQP z5%C`}U?5*ByZ}z^p*jFrIHdJ;4H9K?#)Xs)cZ{N1@4aZ2nl#MPhsy56Hr+^JoodF;gB)*blVN`(U9opG zg#^RL$q+kY!O!_tBK$bY7vcjlyJm!XVe*uEfFDFU_%yX* zBpYUP0@)s#hIx?ggB9V?0Qis;U5pAiJBn~N^+G`r2k&g>aq$78=Sj?4a6hoO*D{Cv z^`sPI*MctxtcXOw_a`=p`S@ET5d*XO*gT#5!C_1p3doCqUVxp5`J8S`X!C$rpo6I* zxI0Y+y%=3Z&#dh{Q3Xy-~T6X|NCUj z-+AKAj$^O4oc%v(-P4P=e*FLcf6~g^o6r1jUwo^5;nm*dx0CC)-F@*tt7XTEoe$67 z_;%s`|Hp6s*U!GR{=kbx`@T+Hb}p-J@5KlIx1IZ+(X#u*#rLa^|4XUcG-vJAQ(#*m&j9|EU{aOxyJG*p2@MJ%=AY`_F&_DE?$& zWMD97&;iMV{KUYv@WAW>4;`s~kH?3FUzRA%b1$-r3GorDP~irs!TK&W1KgS zYyNz(**XTyD^~EWWH!*5t)a)Vc?;hbJ&oC#61;5t_V44B(41|qt0=^I>a>ue?olUw ebzx;08D(L0{R_^j3Wi)SnAsUe&p%Yv$JM$_W8+`K+vL zQy1@KV`DF|zZPaRp-Va7Es`fWH{!n_taqfi)L%}l+!NRT_gf~c5vTfPAO=yP@zY`zB-u?Ry@*U>$I(GcT$y28*)fmoQIDhHFx$tYDF7dZ+ zoj;d(|GrD{K0OuZ-`~Uy| diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/controlls5.png deleted file mode 100644 index 24957208fdcb6ec0fdc02a6468100c686eb9ecf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2835 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 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg.png deleted file mode 100644 index f0ffbdabc108e650383ef3df89eacc043db5d9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#$P6SsHY~OWQfvV}A+B%Uefj_Yf7JdxSwIm! mPZ!4!j+x0B2?}CDybM!6aWy6%oWKf{VeoYIb6Mw<&;$Uo3K%*7 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/databg_now.png deleted file mode 100644 index 9f371b4df716915175019c9422df7c12c27f64ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#$P6SsHY~OWQfvV}A+C3xefj_Yf8N#)Y(Nn{ mPZ!4!j+x0B2?}CDybM!6aWy6%oWKf{VeoYIb6Mw<&;$UeBp3Vu diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/event-bg.png deleted file mode 100644 index a3bae3e018613bfa0c160ea6a36723d641e3a415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^j371(GmxD1Q}Q5?(hcwlasB`Q|B`)I{(pP)|LfiV zpKt#Ebmjkt3;*Ar{{Qy)|2K#JzuNo%<<9@lxBP#$;s2A>$=A-j2WnLEba4#fn3)`q yV31Idz>(mQpplS~Fyp|6hD7GWjBVUJ{0z3Y*cxAN?N9-#X7F_Nb6Mw<&;$TzL__TW diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/icon.png deleted file mode 100644 index 31d6626cdd40848c6d900eeb8e8d4057f6dfd553..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmVsi?L4DSwy6=Gyw9+ zFovGaHzsTy&(`(mA|C-TpGSSX^ClSheK+Y%@EY4KGI}?S^dBdHlI7}ny*~iZxu7XL g^hQK^3Fvj(FC=_u*5-+h;{X5v07*qoM6N<$f}pKl{{R30 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/left-separator.png deleted file mode 100644 index 22d630927f32a8d4c66b4cbb851f20002aad0e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^#z4%(!2~3$o)(t^DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MID|ljv*DdZ2WHv9#-I)EPr>QcFBix7yH*t@Vh9Pq$SxT zu<3%V-R-{5>$oF!%xaa|x+_&9hR3^f$)(@tYA>xRzwqPwv(VfP!nqvDPIKS5)_mcq ep0}TYnc VW}y=sH5X_cgQu&X%Q~loCII&SCFTGC diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/lightbox.png deleted file mode 100644 index f0314fa609946421251eeafe1bd88b61216e671d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{S!3-q3+C<%eR8)XZi0hJlSN;RRw?{v|y!`n2 z!>f?N^}pM%{@r@@@5al2*I)d*`uyLO=l?E0`*-o_ zzY9v zum3Ng%&d+z7H&;jaY@O1TaS?83{1OTQT Bb#(v$ diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/loading.gif deleted file mode 100644 index f5e71df6aa432e63b71dc708a929027822689ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3951 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 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/move.png deleted file mode 100644 index 15681b311e095bcf71a016c10b98215d2f62fdeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^j371(GmxD1Q}Q5?(hBeias3Yj{~rDSclZCloB#h^ z`TzIA|G%gI|2_Wy@1g&H_x}I8^Z%bM|Nm_G|7SJho#WC#T}qxVjv*W~lLZn25)2Xw s5;zh(5;PJr5@sCO(2&S{n6ZtU!Ptv+qi^c>nLyPHp00i_>zopr08)lQEdT%j diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/multi-days-bg.png deleted file mode 100644 index f43a46357b2b8a44c62bb6955413ca6c422397b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^j6n2-gBi#={doIQAhj#NC&cyt|NoEQ|GW3*->p~w zu0H>F@#()akD%!6<9|SO4vfw}`3FH4p8UJ;6r>D-E%CiATwRVHQB_&GBsJyf6H$?=Q$jla?0-X33{vuFPP+`eJUrfnOyZZ0n`!f@W=oF diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/second-top-days-bg.png deleted file mode 100644 index 8f9a4f6da021cb45908bfe9e8d904e042b2f047a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^j6kf#!3HFY>I`du6lZ})WHAE+-w_aIoT|+y4HUHT zba4#fxSkxb>HVqtw*L+XN*+8aW?NSO|37nQJx{^4`Zq~BXM7Zz1ZN)Ya^*R*tKh#R ivt*e81LI3EMh3oTj_Eal|F_ZNmx0r(h1H*=|U3OfpzvHi}DR`OfUbAABv-upo?U|K(>>jf7 X&0u(ba8}zzpe_baS3j3^P6`1px&CF4n_O8yr)Fq>iQ?Oe~R- ZJN}%psYOZYWQNhg04>pOR|ysdYXG(YZ0G<0 diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab.png deleted file mode 100644 index 7ee9285229449c6b3361135be958566c494f600b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^HbAVx!2~3uq|aRjQfwtbe!)N*2=bP(PXtoeJzX3_ zB3j>G-OY8#K%(uTzJx$wVG#S=qhjd?Up>&>QB}RGinHtkLtax@;ku5}S3yfIH9KFl zY%=}#!9Mud^!^DP4Bp4T{&^th_9K7kqBWtXYBy_6>*GFPB(-bulr??_@=7O=S3O<*T-G@yGywp3=X(MG diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_glossy/white_tab_wide.png deleted file mode 100644 index 6e5ffb852f02941eeb6e6b7bf27e6509c93ad44f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^Q9!K1!3HEb8+12=r~;43Vg?4jBOuH;Rhv&5D0t7) z#W5t~-rMWD`3@$?w0*2!+}Uxor7<$&j8OYQ-H5w#tGzEARNUyPVJLhsMNrZ9#q!Mc z2d+!ZyMO8Mk0)oRUz>2@jwRdm-_G;&!#`N>T%)K=Dy9 z8UiCN1S$f&%o!LM8A^iug8wrB^T7xPYptJY1LL2wz$3Dlfr0M`2s2LA=92~rvX^-J zy0YJ9;TPmqcHKEq1uWzmQQ}xyl96A;uyWlQ51tBm$KdF>F7ur5`BF0TK>REXvEwOJ_JB{j41*#tzY6T9lm1@b!Q5 zYnU?U{M_8syb^|QXQu53im`!|g=CiGq%y2{cS#*6qVMVA7$Pw>IpGMG1P7@BN BaBTnp diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_left.png deleted file mode 100644 index 651215a15ae456fa3036d74224e7eddb127d51de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1955 zcmaJ?Yfuws6paBQW5HUB2vX`2Dqw}Ykc6Z}3~T}nCcH8V29%I2BuaKeb|DeP2M)m( zTD1jfttbMmyiAe$2m+=ff{Kbr!BTA%N)>D|AjYB-+l>|NkJ6pl{a)vsd+&G8%2JgaK(#h7#tIA2+p<0i~Qv zUKJ#y3Dx0{LK&H>ff8~>Vp;Bb8Cy;cT?T~cIJkfc!lZysl?kI99hdw{mxIr3+f*{} z3WBZYlK)96Q5Xw^BN_+@qR;|lG$svT(kb-7r7RZ9A7IevG%Afjr85HPEKVSUL!$w& zA2J?IBTwhVgM!zw@D-P=z%Vt3O4Vw$6m1{{(PU8RY&P4b!C(a7hyZj0j7fC?FzP*} z079rtqf}!`1O{x1(ljI+KbefvAD-gdkv* z5|$%c^c7ktZBHcxHg-my*Jm=<5Wu{{LiUf1BJzB%_u9D!i(9tHBmy8hadwJUC|a%qp* zV$F_S+?C(xvZK*2i}(hM?Hr`rL)Afr(^W~_6mLpHjJ-CC8vV$t(7k5jn zR_lw&L6@spu7OvNO~h%|0!?l#Ju_QAJ^5^e$;eVBsjjmc4f_< zTsNn9^8TZ3ZT#`vW|vt7Ys`HmM~#bs?KxxZDf-5qo*u_oMyX4_)!lQu2>|0U9fQcn8$`+p`n@OX=LcRhC#m>~&0 zmhy?pm}^K8i^cCb+H=H|ku_gl^Kp@Ea->@5=hI<6*vOQE!bo zI;%77+lPAd@I|NWHO<0;Vo%ICN$@K4UY)$7bKce&#S4lAU!|Yga4W&*z+$82iR}5< zkLbv{{+QFmK)(Cl-) zwy}Lq;lS;dy90s78HyzrI>XD=#(00%pA7osPwKFtOkdBtk6bTY1FO5ZbjdspsiZ!#L6hj4pPCt8_eCF( z8Tqr)M(pS%g4P>$j=#^Zb0`i8J7mf<(S~Smay2tt&+y``2lKm9^6Q>I2SS0Uy%Zk7qpmoM1=zVJxRP Tx#+8xw%=wHUj){NrRM()d4nQp diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/arrow_right.png deleted file mode 100644 index 901b5b7fb79f2623717d8673f12eb26e2ca35e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1975 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 M(NJ8R=s0`f4|MHo@c;k- diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/imgs_mobile/noevents.png deleted file mode 100644 index 05da890fe1cf4b98f8c955cfedeb53be9cba4462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1687 zcma)+c~sI_6vuyAxsaliCrivNCoFTxG)4EhJfHhXo8l|ZQjqe%C-O!{(^9W)90K84*Yi?P=kr31XJ%2u;F|Zb{=WM`n zem(LX9l?WcOpr{a1Ep1+9uU$7A%rC{&eAC~kV1_HHffn{hd4~d4^wFgbV@iG1S)hp zT_6hoPU)mjmDCiZM3Df;1zjyDqNR!iP|t&Lp>z^JpslLp8@?x}FwRDXLQ*w z<_!t})`xjw-Ei>*(}QB~fKVfiFGN{!mm||!|2K3~{CM5IJiioJ_GQaPJ#)Tu90B}X z%YJUd_v2;GOrLi`?78ldX~Ey`Jh9QF*3;_fmdb)eMC{yO=_w3Z@mk&91;(C2*;GHZ zJ-1ra(Q+1zMy~^|J;q6Z7PgMoI$y0H^in^$&XU-_RNrYvB9Od(?I%8HZ_gX5EATDF zVJ?2F;q#NE@2qch%r)mAY0 zD=y>WCvjXZxBZ4mwWDc~sJgN;D5tlt&maSPq6k9}gkXw@c)Xtbmb93aB_-M6)v{D7 zySx_H)TbnjNa&L$!D(? zqK*pfYzU1tvw>^mP!pe|(nq_!H4&N5=8e95lS}jRwnm@MAqBm=WffROcyg*d#D%-r zopxH&EESK(KaQIW2lyEt7Nvq~tKBB}%yD=Ioj3=SUO7yjNDhc?5y zaO;RLvnlraAeExjNyH>{{5hGq* zUH$l5e$0qELdz^ZDInl&17qSUnaQj@W3$Px;Y=`r@Dq>h@S&%thPwVqh#fh9yo=+c zyqO)DUt$!Jzk~QnkynziFhhuDkcVIVekdFSL0Xl>>nLt^A&Xu zAGZFAHNPWGq*85($xDhXWWgcxZ%fKYNfzcpJ2>7AmM(0p>L}%8S4bO;{*<~9FXTUW zB?^+KCnxRM1B+-ijg*u3_8KCQn=;y_rlxv&aPqRq*w`E-|8VwVP2@h-L^pTxf=nhG z+=4_tS`Z}2#wUBrv7<8OXrq%6Tm~9sJ{#Q#N?`sG5mt!a{${VHrlx0MSy%0$Bgt+^ zUQV>wIGiiY3WbBmSuFG_U2t)+?%nOQG(2%K*9QzMc?AQ(CTVBP&=I!sHB-cB}uChvDYVsKepkD zdskOidKnF0in{=U{|pP$FC7}1>VGu2)2V>waCACi}TZ1 z^QUMZb3+r8Tp@I`;CQ|H)O9YM)3LgpO@|KwEG z%F0SzU7devTjtAi_Wfe<#mSzXi*^EuX#XDV?RuI^~J@-r=lnt~IW6I)=tan0ou6VSU#UK$c12R?jIbTT3$B3LXA zS{%KQu?cm+*k`#~ZSt_%8eFTV_Ag!@ra$Hapi6;W-`XXmLjNz|dE^AP%01-rzn2#b AcK`qY diff --git a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt b/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt deleted file mode 100644 index 67cb13ff468..00000000000 --- a/addons/web_calendar/static/lib/dhtmlxScheduler/codebase/readme.txt +++ /dev/null @@ -1,16 +0,0 @@ -There are a lot of files here, but you need only part of them - -Desctop scheduler, default skin - dhtmlxscheduler.js - dhtmlxscheduler.css - imgs\ - -Desctop scheduler, glossy skin - dhtmlxscheduler.js - dhtmlxscheduler_glossy.css - imgs_glossy\ - -Mobile scheduler - dhtmlxscheduler_mobile.js - dhtmlxscheduler_mobile.css - imgs_mobile\ \ No newline at end of file From ccfa1eb25299bb954e16a13b6e065f0b17d1fd34 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sat, 18 Aug 2012 22:16:32 +0200 Subject: [PATCH 081/132] [IMP] abstractfield options replace getter by attribute bzr revid: al@openerp.com-20120818201632-5aoioz8mhu62im3p --- addons/web/static/src/js/view_form.js | 36 +++++++++++---------------- addons/web/static/src/xml/base.xml | 6 ++--- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index e2a254773ae..f39740863f3 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1908,6 +1908,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w this.field = this.field_manager.get_field(this.name); this.widget = this.node.attrs.widget; this.string = this.node.attrs.string || this.field.string || this.name; + this.options = JSON.parse(this.node.attrs.options || '{}'); this.set({'value': false}); this.set({required: this.modifiers['required'] === true}); @@ -1993,16 +1994,6 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w focus: function() { return false; }, - /** - * Utility method to get the widget options defined in the field xml description. - */ - get_definition_options: function() { - if (!this.definition_options) { - var str = this.node.attrs.options || '{}'; - this.definition_options = JSON.parse(str); - } - return this.definition_options; - }, set_input_id: function(id) { this.id_for_label = id; }, @@ -2667,7 +2658,7 @@ instance.web.form.CompletionFieldMixin = { var slow_create = function () { self._search_create_popup("form", undefined, {"default_name": name}); }; - if (self.get_definition_options().quick_create === undefined || self.get_definition_options().quick_create) { + if (self.options.quick_create === undefined || self.options.quick_create) { new instance.web.DataSet(this, this.field.relation, self.build_context()) .name_create(name, function(data) { self.add_id(data[0]); @@ -2924,7 +2915,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc var lines = _.escape(str).split("\n"); var link = ""; var follow = ""; - if (! this.get_definition_options().highlight_first_line) { + if (! this.options.highlight_first_line) { link = lines.join("
    "); } else { link = lines[0]; @@ -2935,7 +2926,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc var $link = this.$element.find('.oe_form_uri') .unbind('click') .html(link); - if (! this.get_definition_options().no_open) + if (! this.options.no_open) $link.click(function () { self.do_action({ type: 'ir.actions.act_window', @@ -2954,7 +2945,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc var self = this; if (value_ instanceof Array) { this.display_value = {}; - if (! this.get_definition_options().always_reload) { + if (! this.options.always_reload) { this.display_value["" + value_[0]] = value_[1]; } value_ = value_[0]; @@ -4683,10 +4674,6 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ if (this.$element.parent().is('header')) { this.$element.after('
    '); } - // preview in start only for selection fields, because of the dynamic behavior of many2one fields. - if (this.field.type in ['selection']) { - this.render_list(); - } }, set_value: function(value_) { var self = this; @@ -4705,7 +4692,6 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ return self.render_list(); }); }, - /** Get the status list and render them * to_show: [[identifier, value_to_display]] where * - identifier = key for a selection, id for a many2one @@ -4715,7 +4701,8 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ render_list: function() { var self = this; // get selection values, filter them and render them - var selection_done = this.get_selection().pipe(self.proxy('filter_selection')).pipe(self.proxy('render_elements')); + var selection_done = + this.get_selection().pipe(self.proxy('filter_selection')).pipe(self.proxy('render_elements')); }, /** Get the selection list to be displayed in the statusbar widget. @@ -4790,12 +4777,15 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ if (this.clickable) { this.$element.addClass("oe_form_steps_clickable"); $('.oe_form_steps_arrow').remove(); + var elemts = this.$element.find('li'); _.each(elemts, function(element){ $item = $(element); if ($item.attr("data-id") != self.selected_value) { $item.click(function(event){ var data_id = parseInt($(this).attr("data-id")) + + return this.view.recursive_save().pipe(exec_action); self.view.dataset.call('stage_set', [[self.view.datarecord.id],data_id]).then(function() { return self.view.reload(); }); @@ -4807,11 +4797,13 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ } var colors = JSON.parse((this.node.attrs || {}).statusbar_colors || "{}"); var color = colors[this.selected_value]; - if (color) { + if (color) { var elem = this.$element.find("li.oe_form_steps_active span"); - elem.css("color", color); + elem.css("color", color); } }, + on_click_stage: function () { + }, }); /** diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 8e6f7ffc3cb..f2e022c74e0 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1017,12 +1017,12 @@ - - + + - /
    Date: Sat, 18 Aug 2012 22:18:59 +0200 Subject: [PATCH 082/132] [IMP] abstractfield options replace getter by attribute bzr revid: al@openerp.com-20120818201859-xjpvcmipg59f0p3e --- addons/mail/static/src/js/mail.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index 5eb9e5e3c72..00242ecee38 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -838,13 +838,13 @@ openerp.mail = function(session) { init: function() { this._super.apply(this, arguments); - this.params = this.get_definition_options(); + this.params = this.options; this.params.thread_level = this.params.thread_level || 0; this.thread = null; this.ds = new session.web.DataSet(this, this.view.model); this.ds_users = new session.web.DataSet(this, 'res.users'); }, - + start: function() { // NB: all the widget should be modified to check the actual_mode property on view, not use // any other method to know if the view is in create mode anymore From e9d39f98a0c9ed6846d07df6323e1be19c9141db Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 19 Aug 2012 00:10:35 +0200 Subject: [PATCH 083/132] [FIX] form field statusbar clean version bzr revid: al@openerp.com-20120818221035-zue58v11r1qmbcbo --- addons/web/static/src/js/view_form.js | 146 +++++++++----------------- addons/web/static/src/xml/base.xml | 30 +----- 2 files changed, 57 insertions(+), 119 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index f39740863f3..0ef17ac685a 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4666,11 +4666,17 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ template: "FieldStatus", - clickable: false, start: function() { this._super(); this.selected_value = null; - this.clickable = !!this.node.attrs.clickable; + // backward compatibility + this.options.clickable = this.options.clickable || (this.node.attrs || {}).clickable || false; + this.options.visible = this.options.visible || (this.node.attrs || {}).statusbar_visible || false; + this.loaded = new $.Deferred(); + if (this.options.clickable) { + this.$element.on('click','li',this.on_click_stage); + } + // TODO move the following into css :after if (this.$element.parent().is('header')) { this.$element.after('
    '); } @@ -4688,121 +4694,73 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ } // trick to be sure all values are loaded in the form, therefore // enabling the evaluation of dynamic domains + self.selection = []; $.async_when().then(function() { - return self.render_list(); + self.get_selection(); }); + return this.loaded; }, - /** Get the status list and render them - * to_show: [[identifier, value_to_display]] where - * - identifier = key for a selection, id for a many2one - * - display_val = label that will be displayed - * - ex: [[0, "New"]] (many2one) or [["new", "In Progress"]] (selection) - */ - render_list: function() { - var self = this; - // get selection values, filter them and render them - var selection_done = - this.get_selection().pipe(self.proxy('filter_selection')).pipe(self.proxy('render_elements')); - }, - - /** Get the selection list to be displayed in the statusbar widget. + /** Get the selection and render it + * selection: [[identifier, value_to_display], ...] * For selection fields: this is directly given by this.field.selection - * For many2one fields : - * - perform a search on the relation of the many2one field (given by - * field.relation ) - * - get the field domain for the search - * - self.build_domain() gives the domain given by the view or by - * the field - * - if the optional statusbar_fold attribute is set to true, make - * an AND with build_domain to hide all 'fold=true' columns - * - make an OR with current value, to be sure it is displayed, - * with the correct order, even if it is folded + * For many2one fields: perform a search on the relation of the many2one field */ get_selection: function() { var self = this; if (this.field.type == "many2one") { - this.selection = []; - // get fold information from widget - var fold = ((this.node.attrs || {}).statusbar_fold || true); - // build final domain: if fold option required, add the - if (fold == true) { - var domain = new instance.web.CompoundDomain(['|'], ['&'], self.build_domain(), [['fold', '=', false]], [['id', '=', self.selected_value]]); - } else { - var domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.selected_value]]); + var domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.selected_value]]); + var ds = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain); + ds.read_slice(['name'], {}).done( function (records) { + for(var i = 0; i < records.length; i++) { + self.selection.push([records[i].id, records[i].name]); + } + self.render_elements(); + self.loaded.resolve(); + }); + } else { + this.loaded.resolve(); + // For field type selection filter values according to + // statusbar_visible attribute of the field. For example: + // statusbar_visible="draft,open". + var selection = this.field.selection; + console.log(selection); + for(var i=0; i< selection.length; i++) { + var key = selection[i][0]; + if(key == this.selected_value || !this.options.visible || this.options.visible.indexOf(key) != -1) { + this.selection.push(selection[i]); + } } - // get a DataSetSearch on the current field relation (ex: crm.lead.stage_id -> crm.case.stage) - var model_ext = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain); - // fetch selection - var read_defer = model_ext.read_slice(['name'], {}).pipe( function (records) { - _(records).each(function (record) { - self.selection.push([record.id, record.name]); - }); - }); - } else { - this.selection = this.field.selection; - var read_defer = new $.Deferred().resolve(); - } - return read_defer; - }, - - /** Filters this.selection, according to values coming from the statusbar_visible - * attribute of the field. For example: statusbar_visible="draft,open" - * Currently, the key of (key, label) pairs has to be used in the - * selection of visible items. This feature is not meant to be used - * with many2one fields. - */ - filter_selection: function() { - var self = this; - var shown = _.map(((this.node.attrs || {}).statusbar_visible || "").split(","), - function(x) { return _.str.trim(x); }); - shown = _.select(shown, function(x) { return x.length > 0; }); - - if (shown.length == 0) { - this.to_show = this.selection; - } else { - this.to_show = _.select(this.selection, function(x) { - return _.indexOf(shown, x[0]) !== -1 || x[0] === self.selected_value; - }); + console.log(this.selection); + this.render_elements(); } }, - /** Renders the widget. This function also checks for statusbar_colors='{"pending": "blue"}' * attribute in the widget. This allows to set a given color to a given * state (given by the key of (key, label)). */ render_elements: function () { var self = this; - var content = instance.web.qweb.render("FieldStatus.content", {widget: this, _:_}); + var content = instance.web.qweb.render("FieldStatus.content", {widget: this}); this.$element.html(content); - if (this.clickable) { - this.$element.addClass("oe_form_steps_clickable"); - $('.oe_form_steps_arrow').remove(); - - var elemts = this.$element.find('li'); - _.each(elemts, function(element){ - $item = $(element); - if ($item.attr("data-id") != self.selected_value) { - $item.click(function(event){ - var data_id = parseInt($(this).attr("data-id")) - - return this.view.recursive_save().pipe(exec_action); - self.view.dataset.call('stage_set', [[self.view.datarecord.id],data_id]).then(function() { - return self.view.reload(); - }); - }); - } - }); - } else { - this.$element.addClass("oe_form_steps"); - } var colors = JSON.parse((this.node.attrs || {}).statusbar_colors || "{}"); var color = colors[this.selected_value]; if (color) { - var elem = this.$element.find("li.oe_form_steps_active span"); - elem.css("color", color); + this.$("oe_active").css("color", color); } }, - on_click_stage: function () { + on_click_stage: function (ev) { + var self = this; + var $li = $(ev.currentTarget); + var val = parseInt($li.data("id")); + if (val != self.selected_value) { + this.view.recursive_save().then(function() { + var change = {}; + change[self.name] = val; + self.view.dataset.write(self.view.datarecord.id, change).then(function() { + self.view.reload(); + }); + }); + } }, }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index f2e022c74e0..c91c156a2c4 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1083,33 +1083,13 @@ -
      +
        - - - - -
      • -
        - - - - - -
        -
      • -
        -
        - - - - - -
      • - - - + +
      • + +
      • From d43eb323f12df787e4b317094aceae8f4e04c330 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 19 Aug 2012 00:51:51 +0200 Subject: [PATCH 084/132] [FIX] form field statusbar clickable class bzr revid: al@openerp.com-20120818225151-y2nymkwwn10uvo7u --- addons/web/static/src/js/view_form.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 0ef17ac685a..4f3f1c62f13 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4666,12 +4666,15 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ template: "FieldStatus", - start: function() { - this._super(); - this.selected_value = null; - // backward compatibility + init: function(field_manager, node) { + this._super(field_manager, node); this.options.clickable = this.options.clickable || (this.node.attrs || {}).clickable || false; this.options.visible = this.options.visible || (this.node.attrs || {}).statusbar_visible || false; + this.selected_value = null; + }, + start: function() { + this._super(); + // backward compatibility this.loaded = new $.Deferred(); if (this.options.clickable) { this.$element.on('click','li',this.on_click_stage); From 7e7c583d24bbb1605f5a48e2e7b470d638e5b65f Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sun, 19 Aug 2012 03:06:46 +0200 Subject: [PATCH 085/132] [FIX] web_api example, renamed from web_rpc bzr revid: al@openerp.com-20120819010646-ujct3dwe9j0pmjq6 --- addons/{web_rpc => web_api}/__init__.py | 0 addons/web_api/__openerp__.py | 13 +++++ addons/{web_rpc => web_api}/i18n/es_CR.po | 0 addons/{web_rpc => web_api}/i18n/web_rpc.pot | 0 addons/web_api/static/src/example.html | 55 ++++++++++++++++++++ addons/web_rpc/__openerp__.py | 24 --------- addons/web_rpc/static/src/example.html | 51 ------------------ 7 files changed, 68 insertions(+), 75 deletions(-) rename addons/{web_rpc => web_api}/__init__.py (100%) create mode 100644 addons/web_api/__openerp__.py rename addons/{web_rpc => web_api}/i18n/es_CR.po (100%) rename addons/{web_rpc => web_api}/i18n/web_rpc.pot (100%) create mode 100644 addons/web_api/static/src/example.html delete mode 100644 addons/web_rpc/__openerp__.py delete mode 100644 addons/web_rpc/static/src/example.html diff --git a/addons/web_rpc/__init__.py b/addons/web_api/__init__.py similarity index 100% rename from addons/web_rpc/__init__.py rename to addons/web_api/__init__.py diff --git a/addons/web_api/__openerp__.py b/addons/web_api/__openerp__.py new file mode 100644 index 00000000000..efc99afb7a9 --- /dev/null +++ b/addons/web_api/__openerp__.py @@ -0,0 +1,13 @@ +{ + "name" : "OpenERP Web API", + "category" : "Hidden", + "description":"""Openerp Web API.""", + "version" : "2.0", + "depends" : ['web'], + "installable" : True, + 'auto_install': False, + 'js' : [ + ], + 'css' : [ + ], +} diff --git a/addons/web_rpc/i18n/es_CR.po b/addons/web_api/i18n/es_CR.po similarity index 100% rename from addons/web_rpc/i18n/es_CR.po rename to addons/web_api/i18n/es_CR.po diff --git a/addons/web_rpc/i18n/web_rpc.pot b/addons/web_api/i18n/web_rpc.pot similarity index 100% rename from addons/web_rpc/i18n/web_rpc.pot rename to addons/web_api/i18n/web_rpc.pot diff --git a/addons/web_api/static/src/example.html b/addons/web_api/static/src/example.html new file mode 100644 index 00000000000..9c920e31fa2 --- /dev/null +++ b/addons/web_api/static/src/example.html @@ -0,0 +1,55 @@ + + + + + + OpenERP web_api example + + + + +

        OpenERP web_api examples

        +

        Example 1: Load the list of defined ir.model

        +
        +

        Code:

        +
        +<script type="text/javascript" src="/web/webclient/js"></script>
        +<script type="text/javascript">
        +
        +    var instance = openerp.init(["web"]); // get a new instance
        +    instance.session.session_bind(); // bind it to the right hostname
        +    instance.session.session_authenticate("trunk", "admin", "admin", false).then(function() {
        +        var ds = new instance.web.DataSetSearch(null, "ir.model");
        +        ds.read_slice(['name','model'], {}).then(function(models){
        +            _.each(models,function(m,i){
        +                $("#ex1res").append("<li>" + m.model + " (" + m.name + ") </li>")
        +            });
        +        });
        +    });
        +
        </script> +
        +

        Div for output:

        +
        +   +
        +
        +

        Help me to complete this examples on launchpad

        + + + diff --git a/addons/web_rpc/__openerp__.py b/addons/web_rpc/__openerp__.py deleted file mode 100644 index 44946d27cb5..00000000000 --- a/addons/web_rpc/__openerp__.py +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name" : "OpenERP Web Web", - "category" : "Hidden", - "description":"""Openerp Web Web.""", - "version" : "2.0", - "depends" : [], - "installable" : False, - 'auto_install': False, - 'js' : [ - "../web/static/lib/datejs/date-en-US.js", - "../web/static/lib/jquery/jquery-1.6.4.js", - "../web/static/lib/json/json2.js", - "../web/static/lib/qweb/qweb2.js", - "../web/static/lib/underscore/underscore.js", - "../web/static/lib/underscore/underscore.string.js", - "../web/static/src/js/boot.js", - "../web/static/src/js/core.js", - "../web/static/src/js/formats.js", - "../web/static/src/js/chrome.js", - "../web/static/src/js/data.js", - ], - 'css' : [ - ], -} diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html deleted file mode 100644 index fb5d12f73e3..00000000000 --- a/addons/web_rpc/static/src/example.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - OpenERP web_rpc example - - - - - -

        OpenERP web_rpc examples

        -

        Example 1: Display a list of defined ir.model

        -

        Code:

        -
        -<script type="text/javascript" src="/base/webclient/js?mods=web_rpc"></script> 
        -<script type="text/javascript">
        -
        -    var c = openerp.init(); // get a new webclient
        -    c._modules_loaded = true; // Hack to prevent loading of additional modules
        -
        -    var s = new c.base.Session(); // setup a Session
        -    s.login("web-trunk", "admin", "admin", function() {
        -
        -            var ds = new c.base.DataSetSearch(s, "ir.model"); // DataSetSearch used to search, read
        -            ds.read_slice(['name','model'], {}, function(users){
        -                for(var i in users) { 
        -                    $("#ex1res").append("<li>" + users[i].model + " (" + users[i].name + ") </li>")
        -                }
        -            });
        -        }
        -    );
        -
        </script> -
        -

        Div for output:

        -
        -   -
        -

        Help me to complete this example page on launchpad

        - - - From 185c82348c9bd57f595e2981883dde8e8a38d111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 20 Aug 2012 09:13:27 +0200 Subject: [PATCH 086/132] [IMP] point_of_sale: todos bzr revid: fva@openerp.com-20120820071327-wfbd7g5wbh5zrnaa --- addons/point_of_sale/static/src/js/TODO.txt | 23 +++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/addons/point_of_sale/static/src/js/TODO.txt b/addons/point_of_sale/static/src/js/TODO.txt index 74148ce4e80..8da3c2ab262 100644 --- a/addons/point_of_sale/static/src/js/TODO.txt +++ b/addons/point_of_sale/static/src/js/TODO.txt @@ -5,17 +5,12 @@ v Scrolling dans la sélection produit et dans la liste de courses v Réductions v Redesign liste de courses -- Redesign du receipt -x générer les données de printing -x popups d'erreur certainement buggés v bugs scans produits par prix par poids v si pas photo photo par defaut -- WebSQL +v WebSQL v Redesign header, bouton retour aux backend en mode caissière v bouton exit en mode caissière doit retourner au backend. -- user preferences : désactiver la balance etc. -- posting orders -- login alternatif +v posting orders v bug ajout ligne payment à zero + curseur dedans + suppression + design plus grand v si case print via proxy cochée, alors on skip l'ecran receipt v bouton exit self checkout @@ -23,8 +18,18 @@ v demarrage en mode self-checkout si self-checkout v produits poid code barre non reconnus v activer popup client aux écrans self-checkout v discount pas plus grand que 100 +v numpad dans l'écran payment pour pouvoir entrer le montant +v différence de total. Methode d'arrondis + +- login alternatif +- user preferences : désactiver la balance etc. - numpad state parfois sans state - numpad state en mode pesée ?? le cacher ? -v numpad dans l'écran payment pour pouvoir entrer le montant -- différence de total. Methode d'arrondis +- Redesign du receipt +- retirer le receipt screen +- le numpad en mode paymenet marche pas +- l'écran de payement est hyper laid +- l'écran de pesée est hyper laid +x générer les données de printing +x popups d'erreur certainement buggés From 0d4603f4f97289d0fae3b811eb3d5b7ac1da0ded Mon Sep 17 00:00:00 2001 From: help <> Date: Mon, 20 Aug 2012 14:57:16 +0530 Subject: [PATCH 087/132] [IMP]improved modules description from rst2html bzr revid: help-20120820092716-x61hs1o7d8lz6tpg --- addons/account/__openerp__.py | 4 +- .../account_analytic_analysis/__openerp__.py | 4 +- .../account_analytic_default/__openerp__.py | 2 +- addons/account_analytic_plans/__openerp__.py | 31 +++++----- addons/account_anglo_saxon/__openerp__.py | 19 ++++--- addons/account_asset/__openerp__.py | 5 +- .../__openerp__.py | 7 ++- addons/account_budget/__openerp__.py | 16 ++++-- addons/account_cancel/__openerp__.py | 4 +- addons/account_check_writing/__openerp__.py | 1 + addons/account_coda/__openerp__.py | 56 +++++++++++++------ addons/account_followup/__openerp__.py | 18 +++--- addons/account_payment/__openerp__.py | 12 +++- addons/account_sequence/__openerp__.py | 1 + .../__openerp__.py | 2 +- .../__openerp__.py | 2 +- .../analytic_contract_project/__openerp__.py | 1 + addons/auth_anonymous/__openerp__.py | 5 +- addons/auth_ldap/__openerp__.py | 6 +- addons/auth_oauth/__openerp__.py | 5 +- addons/auth_openid/__openerp__.py | 5 +- addons/auth_reset_password/__openerp__.py | 5 +- addons/auth_signup/__openerp__.py | 5 +- addons/base_action_rule/__openerp__.py | 2 +- addons/base_calendar/__openerp__.py | 1 + addons/base_crypt/__openerp__.py | 6 +- addons/base_iban/__openerp__.py | 2 +- addons/base_module_record/__openerp__.py | 1 + addons/base_status/__openerp__.py | 9 ++- addons/base_vat/__openerp__.py | 27 ++++----- addons/caldav/__openerp__.py | 13 +++-- addons/crm_partner_assign/__openerp__.py | 1 + addons/crm_profiling/__openerp__.py | 2 +- addons/crm_todo/__openerp__.py | 1 + addons/document/__openerp__.py | 1 + addons/document_webdav/__openerp__.py | 24 ++++---- addons/event/__openerp__.py | 6 +- addons/event_moodle/__openerp__.py | 14 +++-- addons/fetchmail/__openerp__.py | 5 +- addons/google_base_account/__openerp__.py | 5 +- addons/google_docs/__openerp__.py | 5 +- addons/hr/__openerp__.py | 1 + addons/hr_expense/__openerp__.py | 1 + addons/hr_holidays/__openerp__.py | 11 ++-- addons/hr_payroll_account/__openerp__.py | 2 +- addons/hr_timesheet_sheet/__openerp__.py | 6 +- addons/import_base/__openerp__.py | 4 +- addons/import_google/__openerp__.py | 5 +- addons/import_sugarcrm/__openerp__.py | 5 +- addons/l10n_ar/__openerp__.py | 1 + addons/l10n_at/__openerp__.py | 7 ++- addons/l10n_be/__openerp__.py | 10 +++- .../l10n_be_hr_payroll_account/__openerp__.py | 1 + addons/l10n_be_invoice_bba/__openerp__.py | 14 ++--- addons/l10n_br/__openerp__.py | 2 +- addons/l10n_ch/__openerp__.py | 41 +++++++------- addons/l10n_cl/__openerp__.py | 2 +- addons/l10n_cr/__openerp__.py | 1 + addons/l10n_es/__openerp__.py | 2 +- addons/l10n_fr/__openerp__.py | 2 +- addons/l10n_fr_hr_payroll/__openerp__.py | 1 + addons/l10n_fr_rib/__openerp__.py | 7 ++- addons/l10n_hn/__openerp__.py | 3 + addons/l10n_pe/__openerp__.py | 4 +- addons/l10n_syscohada/__openerp__.py | 4 ++ addons/l10n_uk/__openerp__.py | 4 +- addons/l10n_us/__openerp__.py | 1 + addons/mail/__openerp__.py | 6 +- addons/marketing_campaign/__openerp__.py | 3 +- addons/membership/__openerp__.py | 1 + addons/mrp_operations/__openerp__.py | 4 +- addons/mrp_repair/__openerp__.py | 1 + addons/mrp_subproduct/__openerp__.py | 2 + addons/pad_project/__openerp__.py | 1 + addons/plugin/__openerp__.py | 1 + addons/portal/__openerp__.py | 2 +- addons/portal_claim/__openerp__.py | 4 +- addons/portal_crm/__openerp__.py | 4 +- addons/portal_event/__openerp__.py | 4 +- addons/portal_hr_employees/__openerp__.py | 4 +- addons/portal_project/__openerp__.py | 4 +- addons/portal_project_issue/__openerp__.py | 4 +- addons/portal_sale/__openerp__.py | 4 +- addons/process/__openerp__.py | 5 +- addons/product/__openerp__.py | 1 + addons/product_expiry/__openerp__.py | 1 + addons/product_manufacturer/__openerp__.py | 1 + .../product_visible_discount/__openerp__.py | 2 +- addons/project_mailgate/__openerp__.py | 1 + addons/report_webkit/__openerp__.py | 3 +- addons/sale/__openerp__.py | 6 +- addons/sale_journal/__openerp__.py | 6 +- addons/sale_order_dates/__openerp__.py | 1 + addons/stock/__openerp__.py | 1 + addons/stock_location/__openerp__.py | 12 ++-- addons/stock_planning/__openerp__.py | 33 ++++++----- addons/subscription/__openerp__.py | 1 + addons/web_linkedin/__openerp__.py | 5 +- addons/web_shortcuts/__openerp__.py | 1 + 99 files changed, 376 insertions(+), 236 deletions(-) diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py index e1b9078ec3f..aaa71db0a7d 100644 --- a/addons/account/__openerp__.py +++ b/addons/account/__openerp__.py @@ -44,8 +44,8 @@ Creates a dashboard for accountants that includes: * Company Analysis * Graph of Treasury -The processes like maintaining of general ledger is done through the defined financial Journals (entry move line orgrouping is maintained through journal) for a particular -financial year and for preparation of vouchers there is a module named account_voucher. +The processes like maintaining of general ledger is done through the defined financial Journals (entry move line orgrouping is maintained through journal) +for a particular financial year and for preparation of vouchers there is a module named account_voucher. """, 'website': 'http://www.openerp.com', 'images' : ['images/accounts.jpeg','images/bank_statement.jpeg','images/cash_register.jpeg','images/chart_of_accounts.jpeg','images/customer_invoice.jpeg','images/journal_entries.jpeg'], diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/account_analytic_analysis/__openerp__.py index e0bec840467..4e328f84e28 100644 --- a/addons/account_analytic_analysis/__openerp__.py +++ b/addons/account_analytic_analysis/__openerp__.py @@ -28,9 +28,7 @@ This module is for modifying account analytic view to show important data to project manager of services companies. =================================================================================================================== -Adds menu to show relevant information to each manager. -You can also view the report of account analytic summary -user-wise as well as month-wise. +Adds menu to show relevant information to each manager.You can also view the report of account analytic summary user-wise as well as month-wise. """, "author": "Camptocamp", "website": "http://www.camptocamp.com/", diff --git a/addons/account_analytic_default/__openerp__.py b/addons/account_analytic_default/__openerp__.py index 5ec1fc66c73..72e196a49b6 100644 --- a/addons/account_analytic_default/__openerp__.py +++ b/addons/account_analytic_default/__openerp__.py @@ -25,7 +25,7 @@ "category": 'Accounting & Finance', 'description': """ Set default values for your analytic accounts. -============================================= +============================================== Allows to automatically select analytic accounts based on criterions: --------------------------------------------------------------------- diff --git a/addons/account_analytic_plans/__openerp__.py b/addons/account_analytic_plans/__openerp__.py index a9000cfa490..ac0ce9d8d7d 100644 --- a/addons/account_analytic_plans/__openerp__.py +++ b/addons/account_analytic_plans/__openerp__.py @@ -26,38 +26,41 @@ 'category': 'Accounting & Finance', 'description': """ This module allows to use several analytic plans according to the general journal. -=================================================================================== +================================================================================== Here multiple analytic lines are created when the invoice or the entries are confirmed. For example, you can define the following analytic structure: - Projects +------------------------------------------------------------- + **Projects** Project 1 SubProj 1.1 + SubProj 1.2 Project 2 - Salesman + + **Salesman** Eric + Fabien -Here, we have two plans: Projects and Salesman. An invoice line must -be able to write analytic entries in the 2 plans: SubProj 1.1 and -Fabien. The amount can also be split. The following example is for -an invoice that touches the two subproject and assigned to one salesman: - -Plan1: +Here, we have two plans: Projects and Salesman. An invoice line must be able to write analytic entries in the 2 plans: SubProj 1.1 and Fabien. The amount can also be split. + +The following example is for an invoice that touches the two subprojects and assigned to one salesman: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Plan1:** SubProject 1.1 : 50% + SubProject 1.2 : 50% -Plan2: + +**Plan2:** Eric: 100% -So when this line of invoice will be confirmed, it will generate 3 analytic lines, -for one account entry. +So when this line of invoice will be confirmed, it will generate 3 analytic lines,for one account entry. -The analytic plan validates the minimum and maximum percentage at the time of creation -of distribution models. +The analytic plan validates the minimum and maximum percentage at the time of creation of distribution models. """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', diff --git a/addons/account_anglo_saxon/__openerp__.py b/addons/account_anglo_saxon/__openerp__.py index 5073d6522e3..9856add884e 100644 --- a/addons/account_anglo_saxon/__openerp__.py +++ b/addons/account_anglo_saxon/__openerp__.py @@ -27,15 +27,18 @@ This module supports the Anglo-Saxon accounting methodology by changing the accounting logic with stock transactions. ===================================================================================================================== -The difference between the Anglo-Saxon accounting countries and the Rhine (or also called -Continental accounting) countries is the moment of taking the Cost of Goods Sold versus -Cost of Sales. Anglo-Saxons accounting does take the cost when sales invoice is created, -Continental accounting will take the cost at the moment the goods are shipped. +The difference between the Anglo-Saxon accounting countries and the Rhine +(or also called Continental accounting) countries is the moment of taking +the Cost of Goods Sold versus Cost of Sales. Anglo-Saxons accounting does +take the cost when sales invoice is created, Continental accounting will +take the cost at the moment the goods are shipped. -This module will add this functionality by using a interim account, to store the value of -shipped goods and will contra book this interim account when the invoice is created to -transfer this amount to the debtor or creditor account. Secondly, price differences between -actual purchase price and fixed product standard price are booked on a separate account.""", +This module will add this functionality by using a interim account, to +store the value of shipped goods and will contra book this interim +account when the invoice is created to transfer this amount to the +debtor or creditor account. Secondly, price differences between actual +purchase price and fixed product standard price are booked on a separate +account.""", "images": ["images/account_anglo_saxon.jpeg"], "depends": ["product", "purchase"], "category": "Accounting & Finance", diff --git a/addons/account_asset/__openerp__.py b/addons/account_asset/__openerp__.py index 2cf79e9d30d..1c205808b26 100644 --- a/addons/account_asset/__openerp__.py +++ b/addons/account_asset/__openerp__.py @@ -28,8 +28,9 @@ Financial and accounting asset management. ========================================== -This Module manages the assets owned by a company or an individual. It will keep track of depreciation's occurred on those assets. -And it allows to create Move's of the depreciation lines. +This Module manages the assets owned by a company or an individual. It will keep +track of depreciation's occurred on those assets. And it allows to create Move's +of the depreciation lines. """, "website" : "http://www.openerp.com", diff --git a/addons/account_bank_statement_extensions/__openerp__.py b/addons/account_bank_statement_extensions/__openerp__.py index a3765d33622..2e3ec89e2e3 100644 --- a/addons/account_bank_statement_extensions/__openerp__.py +++ b/addons/account_bank_statement_extensions/__openerp__.py @@ -30,13 +30,16 @@ Module that extends the standard account_bank_statement_line object for improved =================================================================================================== This module adds: +----------------- - valuta date - batch payments - traceability of changes to bank statement lines - bank statement line views - bank statements balances report - - performance improvements for digital import of bank statement (via 'ebanking_import' context flag) - - name_search on res.partner.bank enhanced to allow search on bank and iban account numbers + - performance improvements for digital import of bank statement (via + 'ebanking_import' context flag) + - name_search on res.partner.bank enhanced to allow search on bank + and iban account numbers ''', 'depends': ['account'], 'demo_xml': [], diff --git a/addons/account_budget/__openerp__.py b/addons/account_budget/__openerp__.py index e03c66c2132..dd1a1c71883 100644 --- a/addons/account_budget/__openerp__.py +++ b/addons/account_budget/__openerp__.py @@ -32,16 +32,20 @@ Once the Budgets are defined (in Invoicing/Budgets/Budgets), the Project Manager can set the planned amount on each Analytic Account. The accountant has the possibility to see the total of amount planned for each -Budget in order to ensure the total planned is not greater/lower than what he planned -for this Budget. Each list of record can also be switched to a graphical view of it. +Budget in order to ensure the total planned is not greater/lower than what he +planned for this Budget. Each list of record can also be switched to a graphical +view of it. Three reports are available: +---------------------------- + 1. The first is available from a list of Budgets. It gives the spreading, for + these Budgets, of the Analytic Accounts. - 1. The first is available from a list of Budgets. It gives the spreading, for these Budgets, of the Analytic Accounts. + 2. The second is a summary of the previous one, it only gives the spreading, + for the selected Budgets, of the Analytic Accounts. - 2. The second is a summary of the previous one, it only gives the spreading, for the selected Budgets, of the Analytic Accounts. - - 3. The last one is available from the Analytic Chart of Accounts. It gives the spreading, for the selected Analytic Accounts of Budgets. + 3. The last one is available from the Analytic Chart of Accounts. It gives + the spreading, for the selected Analytic Accounts of Budgets. """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', diff --git a/addons/account_cancel/__openerp__.py b/addons/account_cancel/__openerp__.py index c616cc9d5e0..0cd61a8be1d 100644 --- a/addons/account_cancel/__openerp__.py +++ b/addons/account_cancel/__openerp__.py @@ -25,10 +25,10 @@ "author" : "OpenERP SA", "category": 'Accounting & Finance', "description": """ -Allows cancelling accounting entries. +Allows canceling accounting entries. ===================================== -This module adds 'Allow Cancelling Entries' field on form view of account journal. +This module adds 'Allow Canceling Entries' field on form view of account journal. If set to true it allows user to cancel entries & invoices. """, 'website': 'http://www.openerp.com', diff --git a/addons/account_check_writing/__openerp__.py b/addons/account_check_writing/__openerp__.py index faba82928ed..ecac0fe6e86 100644 --- a/addons/account_check_writing/__openerp__.py +++ b/addons/account_check_writing/__openerp__.py @@ -25,6 +25,7 @@ "category": "Generic Modules/Accounting", "description": """ Module for the Check Writing and Check Printing. +================================================ """, 'website': 'http://www.openerp.com', 'init_xml': [], diff --git a/addons/account_coda/__openerp__.py b/addons/account_coda/__openerp__.py index 094ab45acc0..a98d40a9e40 100644 --- a/addons/account_coda/__openerp__.py +++ b/addons/account_coda/__openerp__.py @@ -29,44 +29,64 @@ Module to import CODA bank statements. ====================================== Supported are CODA flat files in V2 format from Belgian bank accounts. +---------------------------------------------------------------------- * CODA v1 support. * CODA v2.2 support. * Foreign Currency support. * Support for all data record types (0, 1, 2, 3, 4, 8, 9). - * Parsing & logging of all Transaction Codes and Structured Format Communications. + * Parsing & logging of all Transaction Codes and Structured Format + Communications. * Automatic Financial Journal assignment via CODA configuration parameters. * Support for multiple Journals per Bank Account Number. - * Support for multiple statements from different bank accounts in a single CODA file. - * Support for 'parsing only' CODA Bank Accounts (defined as type='info' in the CODA Bank Account configuration records). - * Multi-language CODA parsing, parsing configuration data provided for EN, NL, FR. + * Support for multiple statements from different bank accounts in a single + CODA file. + * Support for 'parsing only' CODA Bank Accounts (defined as type='info' in + the CODA Bank Account configuration records). + * Multi-language CODA parsing, parsing configuration data provided for EN, + NL, FR. The machine readable CODA Files are parsed and stored in human readable format in CODA Bank Statements. Also Bank Statements are generated containing a subset of -the CODA information (only those transaction lines that are required for the creation -of the Financial Accounting records). The CODA Bank Statement is a 'read-only' -object, hence remaining a reliable representation of the original CODA file whereas -the Bank Statement will get modified as required by accounting business processes. +the CODA information (only those transaction lines that are required for the +creation of the Financial Accounting records). The CODA Bank Statement is a +'read-only' object, hence remaining a reliable representation of the original +CODA file whereas the Bank Statement will get modified as required by accounting +business processes. CODA Bank Accounts configured as type 'Info' will only generate CODA Bank Statements. -A removal of one object in the CODA processing results in the removal of the associated -objects. The removal of a CODA File containing multiple Bank Statements will also -remove those associated statements. +A removal of one object in the CODA processing results in the removal of the +associated objects. The removal of a CODA File containing multiple Bank +Statements will also remove those associated statements. The following reconciliation logic has been implemented in the CODA processing: - -1) The Company's Bank Account Number of the CODA statement is compared against the Bank Account Number field of the Company's CODA Bank Account configuration records (whereby bank accounts defined in type='info' configuration records are ignored). If this is the case an 'internal transfer' transaction is generated using the 'Internal Transfer Account' field of the CODA File Import wizard. -2) As a second step the 'Structured Communication' field of the CODA transaction line is matched against the reference field of in- and outgoing invoices (supported : Belgian Structured Communication Type). -3) When the previous step doesn't find a match, the transaction counterparty is located via the Bank Account Number configured on the OpenERP Customer and Supplier records. -4) In case the previous steps are not successful, the transaction is generated by using the 'Default Account for Unrecognized Movement' field of the CODA File Import wizard in order to allow further manual processing. +------------------------------------------------------------------------------- + 1) The Company's Bank Account Number of the CODA statement is compared against + the Bank Account Number field of the Company's CODA Bank Account + configuration records (whereby bank accounts defined in type='info' + configuration records are ignored). If this is the case an 'internal transfer' + transaction is generated using the 'Internal Transfer Account' field of the + CODA File Import wizard. + 2) As a second step the 'Structured Communication' field of the CODA transaction + line is matched against the reference field of in- and outgoing invoices + (supported : Belgian Structured Communication Type). + 3) When the previous step doesn't find a match, the transaction counterparty is + located via the Bank Account Number configured on the OpenERP Customer and + Supplier records. + 4) In case the previous steps are not successful, the transaction is generated + by using the 'Default Account for Unrecognized Movement' field of the CODA + File Import wizard in order to allow further manual processing. In stead of a manual adjustment of the generated Bank Statements, you can also re-import the CODA after updating the OpenERP database with the information that was missing to allow automatic reconciliation. Remark on CODA V1 support: -In some cases a transaction code, transaction category or structured communication code has been given a new or clearer description in CODA V2. -The description provided by the CODA configuration tables is based upon the CODA V2.2 specifications. +~~~~~~~~~~~~~~~~~~~~~~~~~~ +In some cases a transaction code, transaction category or structured +communication code has been given a new or clearer description in CODA V2.The +description provided by the CODA configuration tables is based upon the CODA +V2.2 specifications. If required, you can manually adjust the descriptions via the CODA configuration menu. ''', "images" : ["images/coda_logs.jpeg","images/import_coda_logs.jpeg"], diff --git a/addons/account_followup/__openerp__.py b/addons/account_followup/__openerp__.py index e8724b01b4e..d6bb507df49 100644 --- a/addons/account_followup/__openerp__.py +++ b/addons/account_followup/__openerp__.py @@ -28,22 +28,20 @@ Module to automate letters for unpaid invoices, with multi-level recalls. ========================================================================== You can define your multiple levels of recall through the menu: +--------------------------------------------------------------- + **Invoicing** / **Configuration** / **Miscellaneous** / **Follow-ups** - Invoicing/Configuration/Miscellaneous/Follow-ups - -Once it is defined, you can automatically print recalls every day through simply -clicking on the menu: - - Invoicing/Periodical Processing/Billing/Send follow-ups +Once it is defined, you can automatically print recalls every day through simply clicking on the menu: +------------------------------------------------------------------------------------------------------ + **Invoicing** / **Periodical Processing** / **Billing** / **Send follow-ups** It will generate a PDF with all the letters according to the the different levels of recall defined. You can define different policies for different companies. You can also send mail to the customer. -Note that if you want to check the follow-up level for a given partner/account -entry, you can do from in the menu: - - Invoicing/Reporting/Generic Reporting/Partners/Follow-ups Sent +Note that if you want to check the follow-up level for a given partner/account entry, you can do from in the menu: +------------------------------------------------------------------------------------------------------------------ + **Invoicing** / **Reporting** / **Generic Reporting** / **Partners** / **Follow-ups Sent** """, 'author': 'OpenERP SA', diff --git a/addons/account_payment/__openerp__.py b/addons/account_payment/__openerp__.py index 9e7209a348e..814b0dabcae 100644 --- a/addons/account_payment/__openerp__.py +++ b/addons/account_payment/__openerp__.py @@ -28,13 +28,19 @@ Module to manage the payment of your supplier invoices. ======================================================= -This module allows you to create and manage your payment orders, with purposes to +This module allows you to create and manage your payment orders, with purposes to +--------------------------------------------------------------------------------- * serve as base for an easy plug-in of various automated payment mechanisms. * provide a more efficient way to manage invoice payment. Warning: --------- -The confirmation of a payment order does _not_ create accounting entries, it just records the fact that you gave your payment order to your bank. The booking of your order must be encoded as usual through a bank statement. Indeed, it's only when you get the confirmation from your bank that your order has been accepted that you can book it in your accounting. To help you with that operation, you have a new option to import payment orders as bank statement lines. +~~~~~~~~ +The confirmation of a payment order does _not_ create accounting entries, it just +records the fact that you gave your payment order to your bank. The booking of +your order must be encoded as usual through a bank statement. Indeed, it's only +when you get the confirmation from your bank that your order has been accepted +that you can book it in your accounting. To help you with that operation, you +have a new option to import payment orders as bank statement lines. """, 'images': ['images/payment_mode.jpeg','images/payment_order.jpeg'], 'depends': ['account','account_voucher'], diff --git a/addons/account_sequence/__openerp__.py b/addons/account_sequence/__openerp__.py index 0f860d400e9..c366d01ff60 100644 --- a/addons/account_sequence/__openerp__.py +++ b/addons/account_sequence/__openerp__.py @@ -30,6 +30,7 @@ This module maintains internal sequence number for accounting entries. Allows you to configure the accounting sequences to be maintained. You can customize the following attributes of the sequence: +----------------------------------------------------------- * Prefix * Suffix * Next Number diff --git a/addons/analytic_contract_expense_project/__openerp__.py b/addons/analytic_contract_expense_project/__openerp__.py index b569330d117..e5cc6af2c1b 100644 --- a/addons/analytic_contract_expense_project/__openerp__.py +++ b/addons/analytic_contract_expense_project/__openerp__.py @@ -26,7 +26,7 @@ 'category': 'Hidden', 'description': """ This module is for modifying project view to show some data related to the hr_expense module. - +============================================================================================= """, "author": "OpenERP S.A.", "website": "http://www.openerp.com/", diff --git a/addons/analytic_contract_hr_expense/__openerp__.py b/addons/analytic_contract_hr_expense/__openerp__.py index 6d5cca8b574..e95e1f49670 100644 --- a/addons/analytic_contract_hr_expense/__openerp__.py +++ b/addons/analytic_contract_hr_expense/__openerp__.py @@ -26,7 +26,7 @@ 'category': 'Hidden', 'description': """ This module is for modifying account analytic view to show some data related to the hr_expense module. - +====================================================================================================== """, "author": "OpenERP S.A.", "website": "http://www.openerp.com/", diff --git a/addons/analytic_contract_project/__openerp__.py b/addons/analytic_contract_project/__openerp__.py index 4e4f621663c..2ca11521614 100644 --- a/addons/analytic_contract_project/__openerp__.py +++ b/addons/analytic_contract_project/__openerp__.py @@ -28,6 +28,7 @@ "depends" : ["project", "account_analytic_analysis"], "description": """ Add "Contract Data" in project view. +==================================== """, "init_xml" : [], "update_xml": ["analytic_contract_project_view.xml"], diff --git a/addons/auth_anonymous/__openerp__.py b/addons/auth_anonymous/__openerp__.py index 95d98e65fea..db75b1ba2c3 100644 --- a/addons/auth_anonymous/__openerp__.py +++ b/addons/auth_anonymous/__openerp__.py @@ -1,6 +1,9 @@ { 'name': 'Anonymous', - 'description': 'Allow anonymous access to OpenERP.', + 'description': """ +Allow anonymous access to OpenERP. +================================== + """, 'author': 'OpenERP SA', 'version': '1.0', 'category': 'Authentication', diff --git a/addons/auth_ldap/__openerp__.py b/addons/auth_ldap/__openerp__.py index 4e5bc811dca..8182fa51a11 100644 --- a/addons/auth_ldap/__openerp__.py +++ b/addons/auth_ldap/__openerp__.py @@ -30,7 +30,7 @@ Adds support for authentication by LDAP server. This module allows users to login with their LDAP username and password, and will automatically create OpenERP users for them on the fly. -Note: This module only work on servers who have Python's ``ldap`` module installed. +**Note:** This module only work on servers who have Python's ``ldap`` module installed. Configuration: -------------- @@ -64,7 +64,7 @@ It is also possible to have local OpenERP users in the database along with LDAP-authenticated users (the Administrator account is one obvious example). Here is how it works: - +--------------------- * The system first attempts to authenticate users against the local OpenERP database; * if this authentication fails (for example because the user has no local @@ -84,7 +84,7 @@ Template*. If set, this user will be used as template to create the local users whenever someone authenticates for the first time via LDAP authentication. This allows pre-setting the default groups and menus of the first-time users. -Warning: if you set a password for the user template, this password will be +**Warning:** if you set a password for the user template, this password will be assigned as local password for each new LDAP user, effectively setting a *master password* for these users (until manually changed). You usually do not want this. One easy way to setup a template user is to diff --git a/addons/auth_oauth/__openerp__.py b/addons/auth_oauth/__openerp__.py index 6c79bba2151..99a3a25af5a 100644 --- a/addons/auth_oauth/__openerp__.py +++ b/addons/auth_oauth/__openerp__.py @@ -24,7 +24,10 @@ 'name': 'OAuth2 Authentication', 'version': '1.0', 'category': 'Tools', - 'description': """Allow users to login through Google OAuth2.""", + 'description': """ +Allow users to login through Google OAuth2. +=========================================== +""", 'author': 'Victor Tabuenca', 'maintainer': 'OpenERP s.a.', 'website': 'http://www.openerp.com', diff --git a/addons/auth_openid/__openerp__.py b/addons/auth_openid/__openerp__.py index cd1a12fce7f..b372e35efbb 100644 --- a/addons/auth_openid/__openerp__.py +++ b/addons/auth_openid/__openerp__.py @@ -24,7 +24,10 @@ 'name': 'OpenID Authentification', 'version': '2.0', 'category': 'Tools', - 'description': """Allow users to login through OpenID.""", + 'description': """ +Allow users to login through OpenID. +==================================== +""", 'author': 'OpenERP s.a.', 'maintainer': 'OpenERP s.a.', 'website': 'http://www.openerp.com', diff --git a/addons/auth_reset_password/__openerp__.py b/addons/auth_reset_password/__openerp__.py index 76528bbfeb8..f7a67aa4b4d 100644 --- a/addons/auth_reset_password/__openerp__.py +++ b/addons/auth_reset_password/__openerp__.py @@ -1,6 +1,9 @@ { 'name': 'Reset Password', - 'description': 'Allow users to reset their password from the login page', + 'description': """ +Allow users to reset their password from the login page. +======================================================== +""", 'author': 'OpenERP SA', 'version': '1.0', 'category': 'Authentication', diff --git a/addons/auth_signup/__openerp__.py b/addons/auth_signup/__openerp__.py index 765a36ef252..80f120efd9b 100644 --- a/addons/auth_signup/__openerp__.py +++ b/addons/auth_signup/__openerp__.py @@ -21,7 +21,10 @@ { 'name': 'Signup', - 'description': 'Allow users to sign up', + 'description': """ +Allow users to sign up. +======================= + """, 'author': 'OpenERP SA', 'version': '1.0', 'category': 'Authentication', diff --git a/addons/base_action_rule/__openerp__.py b/addons/base_action_rule/__openerp__.py index eff92685313..ad75ab65b60 100644 --- a/addons/base_action_rule/__openerp__.py +++ b/addons/base_action_rule/__openerp__.py @@ -29,7 +29,7 @@ This module allows to implement action rules for any object. Use automated actions to automatically trigger actions for various screens. -Example: A lead created by a specific user may be automatically set to a specific +**Example:** A lead created by a specific user may be automatically set to a specific sales team, or an opportunity which still has status pending after 14 days might trigger an automatic reminder email. """, diff --git a/addons/base_calendar/__openerp__.py b/addons/base_calendar/__openerp__.py index 58f666baa0d..8f431d46dd2 100644 --- a/addons/base_calendar/__openerp__.py +++ b/addons/base_calendar/__openerp__.py @@ -28,6 +28,7 @@ This is a full-featured calendar system. ======================================== It supports: +------------ - Calendar of events - Alerts (create requests) - Recurring events diff --git a/addons/base_crypt/__openerp__.py b/addons/base_crypt/__openerp__.py index 62edc76b277..6e2046a42ee 100644 --- a/addons/base_crypt/__openerp__.py +++ b/addons/base_crypt/__openerp__.py @@ -30,7 +30,7 @@ Replaces cleartext passwords in the database with a secure hash. ================================================================ For your existing user base, the removal of the cleartext passwords occurs -immediately when you instal base_crypt. +immediately when you install base_crypt. All passwords will be replaced by a secure, salted, cryptographic hash, preventing anyone from reading the original password in the database. @@ -49,8 +49,8 @@ contain critical data. Appropriate security measures need to be implemented by the system administrator in all areas, such as: protection of database backups, system files, remote shell access, physical server access. -Interation with LDAP authentication: ------------------------------------- +Interaction with LDAP authentication: +------------------------------------- This module is currently not compatible with the ``user_ldap`` module and will disable LDAP authentication completely if installed at the same time. """, diff --git a/addons/base_iban/__openerp__.py b/addons/base_iban/__openerp__.py index f7778c13f2b..25619ee79ae 100644 --- a/addons/base_iban/__openerp__.py +++ b/addons/base_iban/__openerp__.py @@ -24,7 +24,7 @@ "category": 'Hidden/Dependency', 'description': """ This module installs the base for IBAN (International Bank Account Number) bank accounts and checks for it's validity. -===================================================================================================================== +====================================================================================================================== The ability to extract the correctly represented local accounts from IBAN accounts with a single statement. diff --git a/addons/base_module_record/__openerp__.py b/addons/base_module_record/__openerp__.py index 4cdc8116217..92d9a5b8146 100644 --- a/addons/base_module_record/__openerp__.py +++ b/addons/base_module_record/__openerp__.py @@ -39,6 +39,7 @@ This should help you to easily create reusable and publishable modules for custo configurations and demo/testing data. How to use it?: +--------------- Run Settings/Technical/Module Creation/Export Customizations As a Module wizard. Select datetime criteria of recording and objects to be recorded and Record module. """, diff --git a/addons/base_status/__openerp__.py b/addons/base_status/__openerp__.py index bbd82b703ac..5d282a7edde 100644 --- a/addons/base_status/__openerp__.py +++ b/addons/base_status/__openerp__.py @@ -24,12 +24,11 @@ 'version': '1.0', 'category': 'Hidden', 'description': """ -This module handles state and stage. It is derived from the crm_base and -crm_case classes from crm. -======================================================================== +This module handles state and stage. It is derived from the crm_base and crm_case classes from crm. +=================================================================================================== - * ``base_state``: state management - * ``base_stage``: stage management + * ``base_state``: state management + * ``base_stage``: stage management """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', diff --git a/addons/base_vat/__openerp__.py b/addons/base_vat/__openerp__.py index 7b09ee24a58..e093b024976 100644 --- a/addons/base_vat/__openerp__.py +++ b/addons/base_vat/__openerp__.py @@ -33,19 +33,20 @@ be validated for all supported countries. The country is inferred from the will be validated using the Belgian rules. There are two different levels of VAT number validation: - - * By default, a simple off-line check is performed using the known validation - rules for the country, usually a simple check digit. This is quick and - always available, but allows numbers that are perhaps not truly allocated, - or not valid anymore. - * When the "VAT VIES Check" option is enabled (in the configuration of the user's - Company), VAT numbers will be instead submitted to the online EU VIES - database, which will truly verify that the number is valid and currently - allocated to a EU company. This is a little bit slower than the simple - off-line check, requires an Internet connection, and may not be available - all the time. If the service is not available or does not support the - requested country (e.g. for non-EU countries), a simple check will be performed - instead. +-------------------------------------------------------- + * By default, a simple off-line check is performed using the known validation + rules for the country, usually a simple check digit. This is quick and + always available, but allows numbers that are perhaps not truly allocated, + or not valid anymore. + + * When the "VAT VIES Check" option is enabled (in the configuration of the user's + Company), VAT numbers will be instead submitted to the online EU VIES + database, which will truly verify that the number is valid and currently + allocated to a EU company. This is a little bit slower than the simple + off-line check, requires an Internet connection, and may not be available + all the time. If the service is not available or does not support the + requested country (e.g. for non-EU countries), a simple check will be performed + instead. Supported countries currently include EU countries, and a few non-EU countries such as Chile, Colombia, Mexico, Norway or Russia. For unsupported countries, diff --git a/addons/caldav/__openerp__.py b/addons/caldav/__openerp__.py index 2946fe77b1f..a3d0b02f3b1 100644 --- a/addons/caldav/__openerp__.py +++ b/addons/caldav/__openerp__.py @@ -37,16 +37,21 @@ This module contains basic functionality for Caldav system. - Provides iCal Import/Export functionality To access Calendars using CalDAV clients, point them to: +-------------------------------------------------------- http://HOSTNAME:PORT/webdav/DATABASE_NAME/calendars/users/USERNAME/c To access OpenERP Calendar using WebCal to remote site use the URL like: +------------------------------------------------------------------------ http://HOSTNAME:PORT/webdav/DATABASE_NAME/Calendars/CALENDAR_NAME.ics Where, - HOSTNAME: Host on which OpenERP server(With webdav) is running - PORT : Port on which OpenERP server is running (By Default : 8069) - DATABASE_NAME: Name of database on which OpenERP Calendar is created - CALENDAR_NAME: Name of calendar to access + **HOSTNAME:** Host on which OpenERP server(With webdav) is running + + **PORT :** Port on which OpenERP server is running (By Default : 8069) + + **DATABASE_NAME:** Name of database on which OpenERP Calendar is created + + **CALENDAR_NAME:** Name of calendar to access """, 'category': 'Hidden/Dependency', "author": "OpenERP SA", diff --git a/addons/crm_partner_assign/__openerp__.py b/addons/crm_partner_assign/__openerp__.py index 5feb8c199d4..89d292adf7c 100644 --- a/addons/crm_partner_assign/__openerp__.py +++ b/addons/crm_partner_assign/__openerp__.py @@ -32,6 +32,7 @@ You can geolocalize your opportunities by using this module. Use geolocalization when assigning opportunities to partners. Determine the GPS coordinates according to the address of the partner. + The most appropriate partner can be assigned. You can also use the geolocalization without using the GPS coordinates. """, diff --git a/addons/crm_profiling/__openerp__.py b/addons/crm_profiling/__openerp__.py index 68594281b9b..36c0716e3dc 100644 --- a/addons/crm_profiling/__openerp__.py +++ b/addons/crm_profiling/__openerp__.py @@ -35,7 +35,7 @@ questionnaire and directly use it on a partner. It also has been merged with the earlier CRM & SRM segmentation tool because they were overlapping. - * Note: this module is not compatible with the module segmentation, since + * **Note:** this module is not compatible with the module segmentation, since it's the same which has been renamed. """, 'author': 'OpenERP SA', diff --git a/addons/crm_todo/__openerp__.py b/addons/crm_todo/__openerp__.py index 824dac13c21..5f5a5a20e2c 100644 --- a/addons/crm_todo/__openerp__.py +++ b/addons/crm_todo/__openerp__.py @@ -26,6 +26,7 @@ "category": 'Customer Relationship Management', 'description': """ Todo list for CRM leads and opportunities. +========================================== """, 'author': 'OpenERP SA', 'depends': ['crm','project_gtd'], diff --git a/addons/document/__openerp__.py b/addons/document/__openerp__.py index d9ad9a09675..5eea7b4d42f 100644 --- a/addons/document/__openerp__.py +++ b/addons/document/__openerp__.py @@ -37,6 +37,7 @@ This is a complete document management system. * Files Size by Month (graph) ATTENTION: +---------- - When you install this module in a running company that have already PDF files stored into the database, you will lose them all. - After installing this module PDF's are no longer stored into the database, diff --git a/addons/document_webdav/__openerp__.py b/addons/document_webdav/__openerp__.py index 4d39a4e8015..c63eeb3af6b 100644 --- a/addons/document_webdav/__openerp__.py +++ b/addons/document_webdav/__openerp__.py @@ -42,18 +42,20 @@ You can then use any compatible browser to remotely see the attachments of OpenO After installation, the WebDAV server can be controlled by a [webdav] section in the server's config. -Server Configuration Parameter: - [webdav] - ; enable = True ; Serve webdav over the http(s) servers - ; vdir = webdav ; the directory that webdav will be served at - ; this default val means that webdav will be - ; on "http://localhost:8069/webdav/ - ; verbose = True ; Turn on the verbose messages of webdav - ; debug = True ; Turn on the debugging messages of webdav - ; since the messages are routed to the python logging, with - ; levels "debug" and "debug_rpc" respectively, you can leave - ; these options on +Server Configuration Parameter: +------------------------------- +[webdav]: ++++++++++ + * enable = True ; Serve webdav over the http(s) servers + * vdir = webdav ; the directory that webdav will be served at + * this default val means that webdav will be + * on "http://localhost:8069/webdav/ + * verbose = True ; Turn on the verbose messages of webdav + * debug = True ; Turn on the debugging messages of webdav + * since the messages are routed to the python logging, with + * levels "debug" and "debug_rpc" respectively, you can leave + * these options on Also implements IETF RFC 5785 for services discovery on a http server, which needs explicit configuration in openerp-server.conf too. diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py index 46eb9759ec2..6b2df4fec8b 100644 --- a/addons/event/__openerp__.py +++ b/addons/event/__openerp__.py @@ -30,14 +30,16 @@ Organization and management of Events. ====================================== -This module allows you +This module allows you: +----------------------- * to manage your events and their registrations * to use emails to automatically confirm and send acknowledgements for any registration to an event Note that: +---------- - You can define new types of events in - Events/Configuration/Types of Events + **Events** / **Configuration** / **Types of Events** """, 'author': 'OpenERP SA', 'depends': ['base_setup', 'board', 'email_template', 'google_map'], diff --git a/addons/event_moodle/__openerp__.py b/addons/event_moodle/__openerp__.py index 14f6de8668d..a1507e5b881 100644 --- a/addons/event_moodle/__openerp__.py +++ b/addons/event_moodle/__openerp__.py @@ -34,10 +34,10 @@ to avoid wasting time. Now you have a simple way to create training or courses with OpenERP and moodle. STEPS TO CONFIGURE: ------------------- +------------------- 1. Activate web service in moodle. ----------------------------------- +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >site administration >plugins >web services >manage protocols activate the xmlrpc web service @@ -48,16 +48,18 @@ STEPS TO CONFIGURE: 2. Create confirmation email with login and password. ------------------------------------------------------ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We strongly suggest you to add those following lines at the bottom of your event confirmation email to communicate the login/password of moodle to your subscribers. ........your configuration text....... -URL: your moodle link for exemple: http://openerp.moodle.com -LOGIN: ${object.moodle_username} -PASSWORD: ${object.moodle_user_password} +**URL:** your moodle link for exemple: http://openerp.moodle.com + +**LOGIN:** ${object.moodle_username} + +**PASSWORD:** ${object.moodle_user_password} """, 'author': 'OpenERP SA', 'depends': ['event'], diff --git a/addons/fetchmail/__openerp__.py b/addons/fetchmail/__openerp__.py index 1e8c57a9524..76aaf03e8f6 100644 --- a/addons/fetchmail/__openerp__.py +++ b/addons/fetchmail/__openerp__.py @@ -35,9 +35,8 @@ these accounts will be automatically downloaded into your OpenERP system. All POP3/IMAP-compatible servers are supported, included those that require an encrypted SSL/TLS connection. -This can be used to easily create email-based workflows for many email-enabled -OpenERP documents, such as: - +This can be used to easily create email-based workflows for many email-enabled OpenERP documents, such as: +---------------------------------------------------------------------------------------------------------- * CRM Leads/Opportunities * CRM Claims * Project Issues diff --git a/addons/google_base_account/__openerp__.py b/addons/google_base_account/__openerp__.py index 9dc4a233dcb..1edcaa87117 100644 --- a/addons/google_base_account/__openerp__.py +++ b/addons/google_base_account/__openerp__.py @@ -24,7 +24,10 @@ 'name': 'Google Users', 'version': '1.0', 'category': 'Tools', - 'description': """The module adds google user in res user.""", + 'description': """ +The module adds google user in res user. +======================================== +""", 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], diff --git a/addons/google_docs/__openerp__.py b/addons/google_docs/__openerp__.py index 8cc5671e08a..4a005a5d769 100644 --- a/addons/google_docs/__openerp__.py +++ b/addons/google_docs/__openerp__.py @@ -34,5 +34,8 @@ 'res_config_user_view.xml' ], 'depends': ['google_base_account'], - 'description': 'Module to attach a google document to any model.' + 'description': """ +Module to attach a google document to any model. +================================================ +""" } diff --git a/addons/hr/__openerp__.py b/addons/hr/__openerp__.py index 65b2d5fc08f..b084783da74 100644 --- a/addons/hr/__openerp__.py +++ b/addons/hr/__openerp__.py @@ -32,6 +32,7 @@ Module for Human Resource Management. ===================================== You can manage: +--------------- * Employees and hierarchies : You can define your employee with User and display hierarchies * HR Departments * HR Jobs diff --git a/addons/hr_expense/__openerp__.py b/addons/hr_expense/__openerp__.py index c40670508f4..77113709c45 100644 --- a/addons/hr_expense/__openerp__.py +++ b/addons/hr_expense/__openerp__.py @@ -31,6 +31,7 @@ This module aims to manage employee's expenses. =============================================== The whole workflow is implemented: +---------------------------------- * Draft expense * Confirmation of the sheet by the employee * Validation by his manager diff --git a/addons/hr_holidays/__openerp__.py b/addons/hr_holidays/__openerp__.py index 45dd9ea39a5..8e6c752dee2 100644 --- a/addons/hr_holidays/__openerp__.py +++ b/addons/hr_holidays/__openerp__.py @@ -37,21 +37,24 @@ Implements a dashboard for human resource management that includes: * Leaves Note that: +~~~~~~~~~~ - A synchronisation with an internal agenda (use of the CRM module) is possible: in order to automatically create a case when an holiday request is accepted, you have to link the holidays status to a case section. You can setup this info and your colour preferences in - Human Resources/Configuration/Leave Type + + **Human Resources** / **Configuration** / **Leave Type** - An employee can make an ask for more off-days by making a new Allocation. It will increase his total of that leave type available (if the request is accepted). - There are two ways to print the employee's holidays: * The first will allow to choose employees by department and is used by clicking the menu item located in - Reporting/Human Resources/Leaves/Leaves by Department + **Reporting** / **Human Resources** / **Leaves** / **Leaves by Department** * The second will allow you to choose the holidays report for specific employees. Go on the list - Human Resources/Human Resources/Employees + **Human Resources** / **Human Resources** / **Employees** then select the ones you want to choose, click on the print icon and select the option 'Leaves Summary' - The wizard allows you to choose if you want to print either the Approved & Confirmed holidays or both. These states must be set up by a user from the group 'HR'. You can define these features in the security tab from the user data in - Settings/Users/Users + **Settings** / **Users** / **Users** + for example, you maybe will do it for the user 'admin'. """, 'images': ['images/hr_allocation_requests.jpeg', 'images/hr_leave_requests.jpeg', 'images/leaves_analysis.jpeg'], diff --git a/addons/hr_payroll_account/__openerp__.py b/addons/hr_payroll_account/__openerp__.py index f869c93697b..a96d609f875 100644 --- a/addons/hr_payroll_account/__openerp__.py +++ b/addons/hr_payroll_account/__openerp__.py @@ -25,7 +25,7 @@ 'category': 'Human Resources', 'description': """ Generic Payroll system Integrated with Accounting. -=================================================== +================================================== * Expense Encoding * Payment Encoding diff --git a/addons/hr_timesheet_sheet/__openerp__.py b/addons/hr_timesheet_sheet/__openerp__.py index 1acaa5780b8..d569cafce09 100644 --- a/addons/hr_timesheet_sheet/__openerp__.py +++ b/addons/hr_timesheet_sheet/__openerp__.py @@ -33,17 +33,19 @@ This module helps you to easily encode and validate timesheet and attendances wi * It will maintain attendances and track (sign in/sign out) events. * Track the timesheet lines. -Other tabs contains statistics views to help you analyse your -time or the time of your team: +Other tabs contains statistics views to help you analyse your time or the time of your team: +-------------------------------------------------------------------------------------------- * Time spent by day (with attendances) * Time spent by project This module also implements a complete timesheet validation process: +-------------------------------------------------------------------- * Draft sheet * Confirmation at the end of the period by the employee * Validation by the project manager The validation can be configured in the company: +------------------------------------------------ * Period size (day, week, month, year) * Maximal difference between timesheet and attendances """, diff --git a/addons/import_base/__openerp__.py b/addons/import_base/__openerp__.py index 294f864a0e3..1ce799c46d1 100644 --- a/addons/import_base/__openerp__.py +++ b/addons/import_base/__openerp__.py @@ -24,8 +24,8 @@ 'version': '0.9', 'category': 'Hidden/Dependency', 'description': """ -This module provide a class import_framework to help importing complex data from -other software. +This module provide a class import_framework to help importing complex data from other software. +================================================================================================ """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', diff --git a/addons/import_google/__openerp__.py b/addons/import_google/__openerp__.py index 9e47a213072..0ff09b7ef64 100644 --- a/addons/import_google/__openerp__.py +++ b/addons/import_google/__openerp__.py @@ -23,7 +23,10 @@ 'name': 'Google Import', 'version': '1.0', 'category': 'Customer Relationship Management', - 'description': """The module adds google contact in partner address and add google calendar events details in Meeting.""", + 'description': """ +The module adds google contact in partner address and add google calendar events details in Meeting. +==================================================================================================== +""", 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base', 'import_base', 'google_base_account', 'base_calendar'], diff --git a/addons/import_sugarcrm/__openerp__.py b/addons/import_sugarcrm/__openerp__.py index f84b096e28a..0c58da1fed2 100644 --- a/addons/import_sugarcrm/__openerp__.py +++ b/addons/import_sugarcrm/__openerp__.py @@ -24,8 +24,9 @@ 'version': '1.0', 'category': 'Customer Relationship Management', 'description': """ -This Module Import SugarCRM Leads, Opportunities, Users, Accounts, Contacts, Employees, -Meetings, Phonecalls, Emails, Project and Project Tasks Data into OpenERP Module.""", +This Module Import SugarCRM Leads, Opportunities, Users, Accounts, Contacts, Employees, Meetings, Phonecalls, Emails, Project and Project Tasks Data into OpenERP Module. +========================================================================================================================================================================= +""", 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['import_base','crm', 'document'], diff --git a/addons/l10n_ar/__openerp__.py b/addons/l10n_ar/__openerp__.py index ef04805d1b0..e73a0abc034 100644 --- a/addons/l10n_ar/__openerp__.py +++ b/addons/l10n_ar/__openerp__.py @@ -23,6 +23,7 @@ "version": "1.0", "description": """ Argentinian accounting chart and tax localization. +================================================== Plan contable argentino e impuestos de acuerdo a disposiciones vigentes diff --git a/addons/l10n_at/__openerp__.py b/addons/l10n_at/__openerp__.py index fc266e40d51..03fde22720b 100644 --- a/addons/l10n_at/__openerp__.py +++ b/addons/l10n_at/__openerp__.py @@ -27,9 +27,10 @@ "category" : "Localization/Account Charts", "depends" : ["account_chart", 'base_vat'], "description": """ -This module provides the standard Accounting Chart for Austria which is based on -the Template from BMF.gv.at. Please keep in mind that you should review and adapt -it with your Accountant, before using it in a live Environment.""", +This module provides the standard Accounting Chart for Austria which is based on the Template from BMF.gv.at. +============================================================================================================= +Please keep in mind that you should review and adapt it with your Accountant, before using it in a live Environment. +""", "demo_xml" : [], "update_xml" : ['account_tax_code.xml',"account_chart.xml",'account_tax.xml',"l10n_chart_at_wizard.xml"], "auto_install": False, diff --git a/addons/l10n_be/__openerp__.py b/addons/l10n_be/__openerp__.py index 1f4bcfe6284..a48b6a92bc6 100644 --- a/addons/l10n_be/__openerp__.py +++ b/addons/l10n_be/__openerp__.py @@ -34,16 +34,20 @@ After installing this module, the Configuration wizard for accounting is launche Thus, the pure copy of Chart Template is generated. Wizards provided by this module: +-------------------------------- * Partner VAT Intra: Enlist the partners with their related VAT and invoiced amounts. Prepares an XML file format. - Path to access : Invoicing/Reporting/Legal Reports/Belgium Statements/Partner VAT Intra + + **Path to access :** Invoicing/Reporting/Legal Reports/Belgium Statements/Partner VAT Intra * Periodical VAT Declaration: Prepares an XML file for Vat Declaration of the Main company of the User currently Logged in. - Path to access : Invoicing/Reporting/Legal Reports/Belgium Statements/Periodical VAT Declaration + + **Path to access :** Invoicing/Reporting/Legal Reports/Belgium Statements/Periodical VAT Declaration * Annual Listing Of VAT-Subjected Customers: Prepares an XML file for Vat Declaration of the Main company of the User currently Logged in Based on Fiscal year. - Path to access : Invoicing/Reporting/Legal Reports/Belgium Statements/Annual Listing Of VAT-Subjected Customers + + **Path to access :** Invoicing/Reporting/Legal Reports/Belgium Statements/Annual Listing Of VAT-Subjected Customers """, 'author': 'Noviat & OpenERP SA', diff --git a/addons/l10n_be_hr_payroll_account/__openerp__.py b/addons/l10n_be_hr_payroll_account/__openerp__.py index 4ad70f9687c..29b3d28a0d4 100644 --- a/addons/l10n_be_hr_payroll_account/__openerp__.py +++ b/addons/l10n_be_hr_payroll_account/__openerp__.py @@ -26,6 +26,7 @@ 'version': '1.0', 'description': """ Accounting Data for Belgian Payroll Rules. +========================================== """, 'auto_install': True, diff --git a/addons/l10n_be_invoice_bba/__openerp__.py b/addons/l10n_be_invoice_bba/__openerp__.py index 9f4efe1b31e..ca045c4f861 100644 --- a/addons/l10n_be_invoice_bba/__openerp__.py +++ b/addons/l10n_be_invoice_bba/__openerp__.py @@ -28,19 +28,19 @@ 'category' : 'Localization', 'description': """ -Belgian localisation for in- and outgoing invoices (prereq to account_coda): +Belgian localization for in- and outgoing invoices (prereq to account_coda): +============================================================================ - Rename 'reference' field labels to 'Communication' - Add support for Belgian Structured Communication -A Structured Communication can be generated automatically on outgoing invoices -according to the following algorithms: - +A Structured Communication can be generated automatically on outgoing invoices according to the following algorithms: +--------------------------------------------------------------------------------------------------------------------- 1) Random : +++RRR/RRRR/RRRDD+++ - R..R = Random Digits, DD = Check Digits + **R..R =** Random Digits, **DD =** Check Digits 2) Date : +++DOY/YEAR/SSSDD+++ - DOY = Day of the Year, SSS = Sequence Number, DD = Check Digits) + **DOY =** Day of the Year, **SSS =** Sequence Number, **DD =** Check Digits 3) Customer Reference +++RRR/RRRR/SSSDDD+++ - R..R = Customer Reference without non-numeric characters, SSS = Sequence Number, DD = Check Digits) + **R..R =** Customer Reference without non-numeric characters, **SSS =** Sequence Number, **DD =** Check Digits The preferred type of Structured Communication and associated Algorithm can be specified on the Partner records. A 'random' Structured Communication will diff --git a/addons/l10n_br/__openerp__.py b/addons/l10n_br/__openerp__.py index 022fa1b6a4d..abc024ca1b7 100644 --- a/addons/l10n_br/__openerp__.py +++ b/addons/l10n_br/__openerp__.py @@ -26,7 +26,7 @@ Base module for the Brazilian localization. =========================================== This module consists in: - +------------------------ - Generic Brazilian chart of accounts - Brazilian taxes such as: diff --git a/addons/l10n_ch/__openerp__.py b/addons/l10n_ch/__openerp__.py index 6de20acf98a..2619e6ef02e 100644 --- a/addons/l10n_ch/__openerp__.py +++ b/addons/l10n_ch/__openerp__.py @@ -21,20 +21,21 @@ {"name" : "Switzerland - Accounting", "description" : """ -Swiss localisation : - - DTA generation for a lot of payment types - - BVR management (number generation, report.) - - Import account move from the bank file (like v11) - - Simplify the way you handle the bank statement for reconciliation +Swiss localization : +==================== + - DTA generation for a lot of payment types + - BVR management (number generation, report.) + - Import account move from the bank file (like v11) + - Simplify the way you handle the bank statement for reconciliation You can also add ZIP and bank completion with: - - l10n_ch_zip - - l10n_ch_bank +---------------------------------------------- + - l10n_ch_zip + - l10n_ch_bank - Author: Camptocamp SA - Donors: Hasa Sàrl, Open Net Sàrl and Prisme Solutions Informatique SA - ------------------------------------------------------------------------- + **Author:** Camptocamp SA + + **Donors:** Hasa Sàrl, Open Net Sàrl and Prisme Solutions Informatique SA Module incluant la localisation Suisse de OpenERP revu et corrigé par Camptocamp. Cette nouvelle version comprend la gestion et l'émissionde BVR, le paiement @@ -43,16 +44,18 @@ et l'import du relevé de compte depuis la banque de manière automatisée. De p nous avons intégré la définition de toutes les banques Suisses(adresse, swift et clearing). Par ailleurs, conjointement à ce module, nous proposons la complétion NPA: - -Vous pouvez ajouter la completion des banques et des NPA avec with: - - l10n_ch_zip - - l10n_ch_bank - - Auteur: Camptocamp SA - Donateurs: Hasa Sàrl, Open Net Sàrl and Prisme Solutions Informatique SA - -------------------------------------------------------------------------- +Vous pouvez ajouter la completion des banques et des NPA avec with: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + - l10n_ch_zip + - l10n_ch_bank + + **Auteur:** Camptocamp SA + + **Donateurs:** Hasa Sàrl, Open Net Sàrl and Prisme Solutions Informatique SA + TODO : +------ - Implement bvr import partial reconciliation - Replace wizard by osv_memory when possible - Add mising HELP diff --git a/addons/l10n_cl/__openerp__.py b/addons/l10n_cl/__openerp__.py index d10acdae575..af04349686e 100644 --- a/addons/l10n_cl/__openerp__.py +++ b/addons/l10n_cl/__openerp__.py @@ -23,7 +23,7 @@ "version": "1.0", "description": """ Chilean accounting chart and tax localization. - +============================================== Plan contable chileno e impuestos de acuerdo a disposiciones vigentes """, diff --git a/addons/l10n_cr/__openerp__.py b/addons/l10n_cr/__openerp__.py index 562af835398..b9168597859 100644 --- a/addons/l10n_cr/__openerp__.py +++ b/addons/l10n_cr/__openerp__.py @@ -44,6 +44,7 @@ Chart of accounts for Costa Rica. ================================= Includes: +--------- * account.type * account.account.template * account.tax.template diff --git a/addons/l10n_es/__openerp__.py b/addons/l10n_es/__openerp__.py index b2897e07748..bcd99fe2c17 100644 --- a/addons/l10n_es/__openerp__.py +++ b/addons/l10n_es/__openerp__.py @@ -37,7 +37,7 @@ Spanish Charts of Accounts (PGCE 2008). * Defines templates for sale and purchase VAT * Defines tax code templates -Note: You should install the l10n_ES_account_balance_report module for yearly +**Note:** You should install the l10n_ES_account_balance_report module for yearly account reporting (balance, profit & losses). """, "license" : "GPL-3", diff --git a/addons/l10n_fr/__openerp__.py b/addons/l10n_fr/__openerp__.py index ec31f71513a..921403b38b4 100644 --- a/addons/l10n_fr/__openerp__.py +++ b/addons/l10n_fr/__openerp__.py @@ -51,7 +51,7 @@ and "service" VAT taxes. We consider that it is too "heavy" to have this by defa in l10n_fr; companies that sell services to DOM-based companies should update the configuration of their taxes and fiscal positions manually. -Credits: Sistheo, Zeekom, CrysaLEAD, Akretion and Camptocamp. +**Credits:** Sistheo, Zeekom, CrysaLEAD, Akretion and Camptocamp. """, "depends" : ['base_iban', 'account', 'account_chart', 'base_vat', 'l10n_fr_rib'], "init_xml" : [], diff --git a/addons/l10n_fr_hr_payroll/__openerp__.py b/addons/l10n_fr_hr_payroll/__openerp__.py index c3b2c332a46..feac3648977 100755 --- a/addons/l10n_fr_hr_payroll/__openerp__.py +++ b/addons/l10n_fr_hr_payroll/__openerp__.py @@ -33,6 +33,7 @@ French Payroll Rules. - New payslip report TODO : +------ - Integration with holidays module for deduction and allowance - Integration with hr_payroll_account for the automatic account_move_line creation from the payslip diff --git a/addons/l10n_fr_rib/__openerp__.py b/addons/l10n_fr_rib/__openerp__.py index fedac46381d..2e1594ed4e0 100644 --- a/addons/l10n_fr_rib/__openerp__.py +++ b/addons/l10n_fr_rib/__openerp__.py @@ -27,12 +27,15 @@ This module lets users enter the banking details of Partners in the RIB format (French standard for bank accounts details). =========================================================================================================================== -RIB Bank Accounts can be entered in the "Accounting" tab of the Partner form by specifying -the account type "RIB". The four standard RIB fields will then become mandatory: +RIB Bank Accounts can be entered in the "Accounting" tab of the Partner form by specifying the account type "RIB". + +The four standard RIB fields will then become mandatory: +-------------------------------------------------------- - Bank Code - Office Code - Account number - RIB key + As a safety measure, OpenERP will check the RIB key whenever a RIB is saved, and will refuse to record the data if the key is incorrect. Please bear in mind that this can only happen when the user presses the "save" button, for example on the diff --git a/addons/l10n_hn/__openerp__.py b/addons/l10n_hn/__openerp__.py index 25655e52e70..1e01a829fa8 100644 --- a/addons/l10n_hn/__openerp__.py +++ b/addons/l10n_hn/__openerp__.py @@ -37,6 +37,9 @@ 'version': '0.1', 'category': 'Localization/Account Charts', 'description': """ +This is the base module to manage the accounting chart for Honduras. +==================================================================== + Agrega una nomenclatura contable para Honduras. También incluye impuestos y la moneda Lempira. -- Adds accounting chart for Honduras. It also includes taxes and the Lempira currency.""", diff --git a/addons/l10n_pe/__openerp__.py b/addons/l10n_pe/__openerp__.py index 7908664ca83..87209b6ab23 100644 --- a/addons/l10n_pe/__openerp__.py +++ b/addons/l10n_pe/__openerp__.py @@ -22,8 +22,8 @@ "name": "Peru Localization Chart Account", "version": "1.0", "description": """ -Peruvian accounting chart and tax localization. Acording the PCGE 2010. - +Peruvian accounting chart and tax localization. According the PCGE 2010. +======================================================================== Plan contable peruano e impuestos de acuerdo a disposiciones vigentes de la SUNAT 2011 (PCGE 2010). diff --git a/addons/l10n_syscohada/__openerp__.py b/addons/l10n_syscohada/__openerp__.py index 2fd6917ec11..878e74dd26e 100644 --- a/addons/l10n_syscohada/__openerp__.py +++ b/addons/l10n_syscohada/__openerp__.py @@ -29,9 +29,13 @@ This module implements the accounting chart for OHADA area. =========================================================== It allows any company or association to manage its financial accounting. + Countries that use OHADA are the following: +------------------------------------------- Benin, Burkina Faso, Cameroon, Central African Republic, Comoros, Congo, + Ivory Coast, Gabon, Guinea, Guinea Bissau, Equatorial Guinea, Mali, Niger, + Replica of Democratic Congo, Senegal, Chad, Togo. """, "website": "http://www.baamtu.com", diff --git a/addons/l10n_uk/__openerp__.py b/addons/l10n_uk/__openerp__.py index 444ea2b9dd3..88113fb100d 100644 --- a/addons/l10n_uk/__openerp__.py +++ b/addons/l10n_uk/__openerp__.py @@ -24,8 +24,8 @@ 'version': '1.0', 'category': 'Localization/Account Charts', 'description': """ -This is the latest UK OpenERP localisation necessary to run OpenERP accounting -for UK SME's with: +This is the latest UK OpenERP localisation necessary to run OpenERP accounting for UK SME's with: +================================================================================================= - a CT600-ready chart of accounts - VAT100-ready tax structure - InfoLogic UK counties listing diff --git a/addons/l10n_us/__openerp__.py b/addons/l10n_us/__openerp__.py index f900c3d5e99..3dff6cbc9c3 100644 --- a/addons/l10n_us/__openerp__.py +++ b/addons/l10n_us/__openerp__.py @@ -25,6 +25,7 @@ "category": 'Localization/Account Charts', "description": """ United States - Chart of accounts. +================================== """, 'website': 'http://www.openerp.com', 'init_xml': [], diff --git a/addons/mail/__openerp__.py b/addons/mail/__openerp__.py index 0e1caabcf65..95b9036403f 100644 --- a/addons/mail/__openerp__.py +++ b/addons/mail/__openerp__.py @@ -26,9 +26,8 @@ "sequence": 2, "summary": "Discussions, Mailing Lists, News", 'description': """ -A business oriented Social Networking with a fully-integrated email -and message management. -===================================================================== +A business oriented Social Networking with a fully-integrated email and message management. +=========================================================================================== The Social Networking module provides an unified social network abstraction layer allowing applications to display a complete @@ -40,6 +39,7 @@ allows to follow documents, and to be constantly updated about recent news. The main features of the module are: +------------------------------------ * a clean and renewed communication history for any OpenERP document that can act as a discussion topic, * a discussion mean on documents, diff --git a/addons/marketing_campaign/__openerp__.py b/addons/marketing_campaign/__openerp__.py index e0cf8b56439..619cb02f392 100644 --- a/addons/marketing_campaign/__openerp__.py +++ b/addons/marketing_campaign/__openerp__.py @@ -35,6 +35,7 @@ This module provides leads automation through marketing campaigns (campaigns can ========================================================================================================================================= The campaigns are dynamic and multi-channels. The process is as follows: +------------------------------------------------------------------------ * Design marketing campaigns like workflows, including email templates to send, reports to print and send by email, custom actions * Define input segments that will select the items that should enter the @@ -49,7 +50,7 @@ The campaigns are dynamic and multi-channels. The process is as follows: While the campaign runs you can of course continue to fine-tune the parameters, input segments, workflow. -Note: If you need demo data, you can install the marketing_campaign_crm_demo +**Note:** If you need demo data, you can install the marketing_campaign_crm_demo module, but this will also install the CRM application as it depends on CRM Leads. """, diff --git a/addons/membership/__openerp__.py b/addons/membership/__openerp__.py index a05240c08e7..c6056358157 100644 --- a/addons/membership/__openerp__.py +++ b/addons/membership/__openerp__.py @@ -29,6 +29,7 @@ This module allows you to manage all operations for managing memberships. ========================================================================= It supports different kind of members: +-------------------------------------- * Free member * Associated member (e.g.: a group subscribes to a membership for all subsidiaries) * Paid members diff --git a/addons/mrp_operations/__openerp__.py b/addons/mrp_operations/__openerp__.py index 25446456dec..b585ff718f7 100644 --- a/addons/mrp_operations/__openerp__.py +++ b/addons/mrp_operations/__openerp__.py @@ -33,11 +33,13 @@ When finishing/confirming, cancelling manufacturing orders set all state lines to the according state. Create menus: - Manufacturing > Manufacturing > Work Orders +------------- + **Manufacturing** > **Manufacturing** > **Work Orders** Which is a view on "Work Orders" lines in manufacturing order. Add buttons in the form view of manufacturing order under workorders tab: +------------------------------------------------------------------------- * start (set state to confirm), set date_start * done (set state to done), set date_stop * set to draft (set state to draft) diff --git a/addons/mrp_repair/__openerp__.py b/addons/mrp_repair/__openerp__.py index c54a0c383ee..7cde9d3dcd4 100644 --- a/addons/mrp_repair/__openerp__.py +++ b/addons/mrp_repair/__openerp__.py @@ -29,6 +29,7 @@ The aim is to have a complete module to manage all products repairs. ==================================================================== The following topics should be covered by this module: +------------------------------------------------------ * Add/remove products in the reparation * Impact for stocks * Invoicing (products and/or services) diff --git a/addons/mrp_subproduct/__openerp__.py b/addons/mrp_subproduct/__openerp__.py index 793d0f104e0..939a7170407 100644 --- a/addons/mrp_subproduct/__openerp__.py +++ b/addons/mrp_subproduct/__openerp__.py @@ -31,9 +31,11 @@ This module allows you to produce several products from one production order. You can configure sub-products in the bill of material. Without this module: +-------------------- A + B + C -> D With this module: +----------------- A + B + C -> D + E """, 'author': 'OpenERP SA', diff --git a/addons/pad_project/__openerp__.py b/addons/pad_project/__openerp__.py index 3f4a279800a..9aaa63d95d3 100644 --- a/addons/pad_project/__openerp__.py +++ b/addons/pad_project/__openerp__.py @@ -25,6 +25,7 @@ "category": "Project Management", 'description': """ This module adds a PAD in all project kanban views. +=================================================== """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', diff --git a/addons/plugin/__openerp__.py b/addons/plugin/__openerp__.py index 801e0571c58..a9008612ca1 100644 --- a/addons/plugin/__openerp__.py +++ b/addons/plugin/__openerp__.py @@ -26,6 +26,7 @@ 'category': 'Hidden/Dependency', 'description': """ The common interface for plug-in. +================================= """, 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', diff --git a/addons/portal/__openerp__.py b/addons/portal/__openerp__.py index 283e007a598..7e8f05f9b88 100644 --- a/addons/portal/__openerp__.py +++ b/addons/portal/__openerp__.py @@ -31,7 +31,7 @@ 'category': 'Portal', 'description': """ Customize access to your OpenERP database to external users by creating portals. - +================================================================================ A portal defines a specific user menu and access rights for its members. This menu can ben seen by portal members, anonymous users and any other user that have the access to technical features (e.g. the administrator). diff --git a/addons/portal_claim/__openerp__.py b/addons/portal_claim/__openerp__.py index 197227cc45f..9f9e4b9157c 100644 --- a/addons/portal_claim/__openerp__.py +++ b/addons/portal_claim/__openerp__.py @@ -26,8 +26,8 @@ 'category': 'Tools', 'complexity': "easy", 'description': """ -This module adds claim menu and features to your portal if claim and portal are -installed. +This module adds claim menu and features to your portal if claim and portal are installed. +========================================================================================== """, 'author': 'OpenERP SA', 'depends': ['crm_claim','portal'], diff --git a/addons/portal_crm/__openerp__.py b/addons/portal_crm/__openerp__.py index 4fe023ccb48..d03a72b240e 100644 --- a/addons/portal_crm/__openerp__.py +++ b/addons/portal_crm/__openerp__.py @@ -26,8 +26,8 @@ 'category': 'Tools', 'complexity': "easy", 'description': """ -This module adds a contact page (with a contact form creating a lead when -submitted) to your portal if crm and portal are installed. +This module adds a contact page (with a contact form creating a lead when submitted) to your portal if crm and portal are installed. +==================================================================================================================================== """, 'author': 'OpenERP SA', 'depends': ['crm','portal'], diff --git a/addons/portal_event/__openerp__.py b/addons/portal_event/__openerp__.py index 2f5220c9f36..ddb881d2681 100644 --- a/addons/portal_event/__openerp__.py +++ b/addons/portal_event/__openerp__.py @@ -26,8 +26,8 @@ 'category': 'Tools', 'complexity': "easy", 'description': """ -This module adds event menu and features to your portal if event and portal are -installed. +This module adds event menu and features to your portal if event and portal are installed. +========================================================================================== """, 'author': 'OpenERP SA', 'depends': ['event','portal'], diff --git a/addons/portal_hr_employees/__openerp__.py b/addons/portal_hr_employees/__openerp__.py index ec883e78acf..33a988ead5e 100644 --- a/addons/portal_hr_employees/__openerp__.py +++ b/addons/portal_hr_employees/__openerp__.py @@ -26,8 +26,8 @@ 'category': 'Tools', 'complexity': "easy", 'description': """ -This module adds a list of employees to your portal's contact page if hr and -portal_crm (which creates the contact page) are installed. +This module adds a list of employees to your portal's contact page if hr and portal_crm (which creates the contact page) are installed. +======================================================================================================================================= """, 'author': 'OpenERP SA', 'depends': ['hr','portal_crm'], diff --git a/addons/portal_project/__openerp__.py b/addons/portal_project/__openerp__.py index 4f8774bf99e..a782e202558 100644 --- a/addons/portal_project/__openerp__.py +++ b/addons/portal_project/__openerp__.py @@ -26,8 +26,8 @@ 'category': 'Tools', 'complexity': "easy", 'description': """ -This module adds project menu and features (tasks) to your portal if project -and portal are installed. +This module adds project menu and features (tasks) to your portal if project and portal are installed. +====================================================================================================== """, 'author': 'OpenERP SA', 'depends': ['project','portal'], diff --git a/addons/portal_project_issue/__openerp__.py b/addons/portal_project_issue/__openerp__.py index 17ba4b0d5aa..1aebdb472c9 100644 --- a/addons/portal_project_issue/__openerp__.py +++ b/addons/portal_project_issue/__openerp__.py @@ -26,8 +26,8 @@ 'category': 'Tools', 'complexity': "easy", 'description': """ -This module adds issue menu and features to your portal if project_issue and -portal are installed. +This module adds issue menu and features to your portal if project_issue and portal are installed. +================================================================================================== """, 'author': 'OpenERP SA', 'depends': ['project_issue','portal'], diff --git a/addons/portal_sale/__openerp__.py b/addons/portal_sale/__openerp__.py index f87bebd19fd..99e6e83c59b 100644 --- a/addons/portal_sale/__openerp__.py +++ b/addons/portal_sale/__openerp__.py @@ -26,8 +26,8 @@ 'category': 'Tools', 'complexity': "easy", 'description': """ -This module adds sale menu and features to your portal if sale and portal are -installed. +This module adds sale menu and features to your portal if sale and portal are installed. +======================================================================================== """, 'author': 'OpenERP SA', 'depends': ['sale','portal'], diff --git a/addons/process/__openerp__.py b/addons/process/__openerp__.py index 657aee868b2..39dca254d58 100644 --- a/addons/process/__openerp__.py +++ b/addons/process/__openerp__.py @@ -28,8 +28,9 @@ This module shows the basic processes involved in the selected modules and in the sequence they occur. ====================================================================================================== -Note: This applies to the modules containing modulename_process.xml. -e.g product/process/product_process.xml. +**Note:** This applies to the modules containing modulename_process.xml. + +**e.g.** product/process/product_process.xml. """, 'author': 'OpenERP SA', diff --git a/addons/product/__openerp__.py b/addons/product/__openerp__.py index 5ade1a1a66b..87d013a63a5 100644 --- a/addons/product/__openerp__.py +++ b/addons/product/__openerp__.py @@ -36,6 +36,7 @@ Products support variants, different pricing methods, suppliers information, make to stock/order, different unit of measures, packaging and properties. Pricelists support: +------------------- * Multiple-level of discount (by product, category, quantities) * Compute price based on different criteria: * Other pricelist diff --git a/addons/product_expiry/__openerp__.py b/addons/product_expiry/__openerp__.py index 29e30bf380d..9188137c7a6 100644 --- a/addons/product_expiry/__openerp__.py +++ b/addons/product_expiry/__openerp__.py @@ -30,6 +30,7 @@ Track different dates on products and production lots. ====================================================== Following dates can be tracked: +------------------------------- - end of life - best before date - removal date diff --git a/addons/product_manufacturer/__openerp__.py b/addons/product_manufacturer/__openerp__.py index 98cf8d2d8de..7ac86b3c743 100644 --- a/addons/product_manufacturer/__openerp__.py +++ b/addons/product_manufacturer/__openerp__.py @@ -30,6 +30,7 @@ A module that adds manufacturers and attributes on the product form. ==================================================================== You can now define the following for a product: +----------------------------------------------- * Manufacturer * Manufacturer Product Name * Manufacturer Product Code diff --git a/addons/product_visible_discount/__openerp__.py b/addons/product_visible_discount/__openerp__.py index 0bba2cca4ac..c3e5204bb5e 100644 --- a/addons/product_visible_discount/__openerp__.py +++ b/addons/product_visible_discount/__openerp__.py @@ -28,7 +28,7 @@ This module lets you calculate discounts on Sale Order lines and Invoice lines b To this end, a new check box named "Visible Discount" is added to the pricelist form. -Example: +**Example:** For the product PC1 and the partner "Asustek": if listprice=450, and the price calculated using Asustek's pricelist is 225. If the check box is checked, we will have on the sale order line: Unit price=450, Discount=50,00, Net price=225. diff --git a/addons/project_mailgate/__openerp__.py b/addons/project_mailgate/__openerp__.py index 656a091d4e8..e6861c27ebb 100644 --- a/addons/project_mailgate/__openerp__.py +++ b/addons/project_mailgate/__openerp__.py @@ -36,6 +36,7 @@ Allows creating tasks based on new emails arriving at a given mailbox, similarly to what the CRM application has for Leads/Opportunities. There are two common alternatives to configure the mailbox integration: +----------------------------------------------------------------------- * Install the ``fetchmail`` module and configure a new mailbox, then select ``Project Tasks`` as the target for incoming emails. * Set it up manually on your mail server based on the 'mail gateway' script diff --git a/addons/report_webkit/__openerp__.py b/addons/report_webkit/__openerp__.py index 1021d129d39..9316713348f 100644 --- a/addons/report_webkit/__openerp__.py +++ b/addons/report_webkit/__openerp__.py @@ -38,6 +38,7 @@ This module adds a new Report Engine based on WebKit library (wkhtmltopdf) to su The module structure and some code is inspired by the report_openoffice module. The module allows: +------------------ - HTML report definition - Multi header support - Multi logo @@ -56,7 +57,7 @@ For a sample report see also the webkit_report_sample module, and this video: http://files.me.com/nbessi/06n92k.mov Requirements and Installation: ------------------------------ +------------------------------ This module requires the ``wkthtmltopdf`` library to render HTML documents as PDF. Version 0.9.9 or later is necessary, and can be found at http://code.google.com/p/wkhtmltopdf/ for Linux, Mac OS X (i386) and Windows (32bits). diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index b6be6f7b1e3..698cc3e3416 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -31,7 +31,7 @@ The base module to manage quotations and sales orders. Workflow with validation steps: ------------------------------- - * Quotation -> Sales order -> Invoice + * **Quotation** -> **Sales order** -> **Invoice** Create Invoice: --------------- @@ -46,10 +46,10 @@ Partners preferences: * Invoicing Products stocks and prices: --------------------------- +--------------------------- Delivery method: ------------------ +---------------- * The Poste * Free Delivery Charges * Normal Delivery Charges diff --git a/addons/sale_journal/__openerp__.py b/addons/sale_journal/__openerp__.py index 11408161bf4..3030ad0c4d8 100644 --- a/addons/sale_journal/__openerp__.py +++ b/addons/sale_journal/__openerp__.py @@ -30,17 +30,19 @@ The sales journal modules allows you to categorise your sales and deliveries (pi This module is very helpful for bigger companies that works by departments. You can use journal for different purposes, some examples: +---------------------------------------------------------- * isolate sales of different departments * journals for deliveries by truck or by UPS Journals have a responsible and evolves between different status: +----------------------------------------------------------------- * draft, open, cancel, done. Batch operations can be processed on the different journals to confirm all sales at once, to validate or invoice packing. -It also supports batch invoicing methods that can be configured by partners and -sales orders, examples: +It also supports batch invoicing methods that can be configured by partners and sales orders, examples: +------------------------------------------------------------------------------------------------------- * daily invoicing * monthly invoicing diff --git a/addons/sale_order_dates/__openerp__.py b/addons/sale_order_dates/__openerp__.py index f5ccef7ffe5..fc115796864 100644 --- a/addons/sale_order_dates/__openerp__.py +++ b/addons/sale_order_dates/__openerp__.py @@ -29,6 +29,7 @@ Add additional date information to the sales order. =================================================== You can add the following additional dates to a sale order: +----------------------------------------------------------- * Requested Date * Commitment Date * Effective Date diff --git a/addons/stock/__openerp__.py b/addons/stock/__openerp__.py index 55d9c7c6c5a..1e71239e86c 100644 --- a/addons/stock/__openerp__.py +++ b/addons/stock/__openerp__.py @@ -29,6 +29,7 @@ OpenERP Inventory Management module can manage multi-warehouses, multi and struc ====================================================================================================== Thanks to the double entry management, the inventory controlling is powerful and flexible: +------------------------------------------------------------------------------------------ * Moves history and planning, * Stock valuation (standard or average price, ...) * Robustness faced with Inventory differences diff --git a/addons/stock_location/__openerp__.py b/addons/stock_location/__openerp__.py index db2858bb44a..a9c2b3f0114 100644 --- a/addons/stock_location/__openerp__.py +++ b/addons/stock_location/__openerp__.py @@ -29,12 +29,13 @@ This module supplements the Warehouse application by effectively implementing Pu ============================================================================================================ Typically this could be used to: +-------------------------------- * Manage product manufacturing chains * Manage default locations per product * Define routes within your warehouse according to business needs, such as: - - Quality Control - - After Sales Services - - Supplier Returns + - Quality Control + - After Sales Services + - Supplier Returns * Help rental management, by generating automated return moves for rented products @@ -84,9 +85,10 @@ Use-Case: --------- You can use the demo data as follow: - CPU1: Sell some CPU1 from Chicago Shop and run the scheduler +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + **CPU1:** Sell some CPU1 from Chicago Shop and run the scheduler - Warehouse: delivery order, Chicago Shop: reception - CPU3: + **CPU3:** - When receiving the product, it goes to Quality Control location then stored to shelf 2. - When delivering the customer: Pick List -> Packing -> Delivery Order from Gate A diff --git a/addons/stock_planning/__openerp__.py b/addons/stock_planning/__openerp__.py index f83aa11ef63..d671e59308b 100644 --- a/addons/stock_planning/__openerp__.py +++ b/addons/stock_planning/__openerp__.py @@ -46,17 +46,20 @@ Forecast" and "Stock Planning" to emphasize that we use quantity values. Where to begin: --------------- Using this module is done in three steps: - * Create Stock Periods via the Warehouse>Configuration>Stock Periods menu +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Create Stock Periods via the **Warehouse** > **Configuration** > **Stock Periods** menu (Mandatory step) * Create Sale Forecasts fill them with forecast quantities, via the - Sales > Sales Forecast menu. (Optional step but useful for further planning) + **Sales** > **Sales Forecast** menu. (Optional step but useful for further planning) * Create the actual MPS plan, check the balance and trigger the procurements as required. The actual procurement is the final step for the Stock Period. Stock Period configuration: --------------------------- -You have two menu items for Periods in "Warehouse > Configuration > Stock Periods". +You have two menu items for Periods in "**Warehouse** > **Configuration** > **Stock Periods**". + There are: +~~~~~~~~~~ * "Create Stock Periods" - can automatically creating daily, weekly or monthly periods. * "Stock Periods" - allows to create any type of periods, change the dates @@ -67,6 +70,7 @@ button in "Stock Periods", but it is recommended to use the automatic assistant "Create Stock Periods". Remarks: +++++++++ - These periods (Stock Periods) are completely distinct from Financial or other periods in the system. - Periods are not assigned to companies (when you use multicompany). Module @@ -86,7 +90,8 @@ Remarks: Sales Forecasts configuration: ------------------------------ -You have few menus for Sales forecast in "Sales > Sales Forecasts": +You have few menus for Sales forecast in "**Sales** > **Sales Forecasts**": +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - "Create Sales Forecasts" - can automatically create forecast lines according to your needs - "Sales Forecasts" - for managing the Sales forecasts @@ -96,6 +101,7 @@ Category, for selected Period and for selected Warehouse. It is also possible to copy the previous forecast. Remarks: +++++++++ - This tool doesn't duplicate lines if you already have an entry for the same Product, Period, Warehouse, created or validated by the same user. If you wish to create another forecast, if relevant lines exists you have to do it @@ -130,8 +136,9 @@ MPS or Procurement Planning: ---------------------------- An MPS planning consists in Stock Planning lines, used to analyze and possibly drive the procurement of products for each relevant Stock Period and Warehouse. -The menu is located in "Warehouse > Schedulers > Master Procurement Schedule": +The menu is located in "**Warehouse** > **Schedulers** > **Master Procurement Schedule**": +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - "Create Stock Planning Lines" - a wizard to help automatically create many planning lines - "Master Procurement Schedule" - management of your planning lines @@ -186,14 +193,14 @@ Computation of Stock Simulation quantities: The Stock Simulation value is the estimated stock quantity at the end of the period. The calculation always starts with the real stock on hand at the beginning of the current period, then adds or subtracts the computed quantities. -When you are in the same period (current period is the same as calculated) Stock -Simulation is calculated as follows: -Stock Simulation = Stock of beginning of current Period - Planned Out + Planned In +When you are in the same period (current period is the same as calculated) Stock Simulation is calculated as follows: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Stock Simulation =** Stock of beginning of current Period - Planned Out + Planned In When you calculate period next to current: - -Stock Simulation = Stock of beginning of current Period - Planned Out of current Period +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Stock Simulation =** Stock of beginning of current Period - Planned Out of current Period + Confirmed In of current Period (incl. Already In) - Planned Out of calculated Period + Planned In of calculated Period . @@ -204,8 +211,8 @@ that you should complete the planning and procurement of the current Period befo going to the next one. When you plan for future Periods: - -Stock Simulation = Stock of beginning of current Period +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**Stock Simulation =** Stock of beginning of current Period - Sum of Planned Out of Periods before calculated + Sum of Confirmed In of Periods before calculated (incl. Already In) - Planned Out of calculated Period @@ -215,7 +222,7 @@ Here "Periods before calculated" designates all periods starting with the curren until the period before the one being calculated. Remarks: - +++++++++ - Remember to make the proceed with the planning of each period in chronological order, otherwise the numbers will not reflect the reality - If you planned for future periods and find that real Confirmed Out is larger diff --git a/addons/subscription/__openerp__.py b/addons/subscription/__openerp__.py index 3a4220efe52..17a37805961 100644 --- a/addons/subscription/__openerp__.py +++ b/addons/subscription/__openerp__.py @@ -31,6 +31,7 @@ Create recurring documents. This module allows to create new documents and add subscriptions on that document. e.g. To have an invoice generated automatically periodically: +------------------------------------------------------------- * Define a document type based on Invoice object * Define a subscription whose source document is the document defined as above. Specify the interval information and partner to be invoice. diff --git a/addons/web_linkedin/__openerp__.py b/addons/web_linkedin/__openerp__.py index 122453d6096..614055899a4 100644 --- a/addons/web_linkedin/__openerp__.py +++ b/addons/web_linkedin/__openerp__.py @@ -5,8 +5,9 @@ 'complexity': "easy", "description": """ - OpenERP Web LinkedIn module. - This module provides the Integration of the LinkedIn with OpenERP. +OpenERP Web LinkedIn module. +============================ +This module provides the Integration of the LinkedIn with OpenERP. """, 'update_xml': [ 'web_linkedin_view.xml', diff --git a/addons/web_shortcuts/__openerp__.py b/addons/web_shortcuts/__openerp__.py index b587215a501..51b28957307 100644 --- a/addons/web_shortcuts/__openerp__.py +++ b/addons/web_shortcuts/__openerp__.py @@ -27,6 +27,7 @@ Enable shortcuts feature in the web client. =========================================== Add a Shortcut icon in the systray in order to access the user's shortcuts (if any). + Add a Shortcut icon besides the views title in order to add/remove a shortcut. """, 'author': 'OpenERP SA', From b29c4a6113a002528aeed1fa59e823172bfce841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 20 Aug 2012 12:24:01 +0200 Subject: [PATCH 088/132] [IMP] point_of_sale: improved receipt screen bzr revid: fva@openerp.com-20120820102401-t5zkmh2hoamba719 --- addons/point_of_sale/static/src/css/pos.css | 11 ++++++++++- addons/point_of_sale/static/src/js/pos_screens.js | 2 ++ addons/point_of_sale/static/src/xml/pos.xml | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 54bf8eb65db..973c8b10d87 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -728,8 +728,17 @@ width: 300px; background-color: white; margin: 20px; - padding: 10px; + padding: 15px; + padding-bottom:30px; display: inline-block; + font-family: "Inconsolata"; + -webkit-box-shadow: 0px 5px 16px rgba(0,0,0, 0.3); + -moz-box-shadow: 0px 5px 16px rgba(0,0,0, 0.3); + box-shadow: 0px 5px 16px rgba(0,0,0, 0.3); +} +.point-of-sale .pos-sale-ticket .emph{ + font-size: 20px; + margin:5px; } .point-of-sale .pos-sale-ticket table { width: 100%; diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/pos_screens.js index a007453bd9e..d71199331f3 100644 --- a/addons/point_of_sale/static/src/js/pos_screens.js +++ b/addons/point_of_sale/static/src/js/pos_screens.js @@ -676,6 +676,8 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa icon: '/point_of_sale/static/src/img/icons/png48/go-next.png', click: function() { self.finishOrder(); }, }); + + window.print(); }, print: function() { window.print(); diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index 89256dd1286..81f929d50e2 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -508,7 +508,7 @@ Tax: - Total: + Total: From 0b639b586b12d38065c092ba96f2db3e5cc1c6ec Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Mon, 20 Aug 2012 13:02:07 +0200 Subject: [PATCH 089/132] [FIX] account_voucher: supplier payment in multi-currency. Accounting entries generation fixed bzr revid: qdp-launchpad@openerp.com-20120820110207-w2sow7o2rmpbqykl --- addons/account_voucher/account_voucher.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 1287c7b3c18..223705af85e 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -1106,7 +1106,8 @@ class account_voucher(osv.osv): # otherwise we use the rates of the system (giving the voucher date in the context) amount_currency = currency_obj.compute(cr, uid, company_currency, line.move_line_id.currency_id.id, move_line['debit']-move_line['credit'], context=ctx) if line.amount == line.amount_unreconciled and line.move_line_id.currency_id.id == voucher_currency: - foreign_currency_diff = line.move_line_id.amount_residual_currency + amount_currency + sign = voucher_brw.type in ('payment', 'purchase') and -1 or 1 + foreign_currency_diff = sign * line.move_line_id.amount_residual_currency + amount_currency move_line['amount_currency'] = amount_currency voucher_line = move_line_obj.create(cr, uid, move_line) From 1450ebd8476d81a5b3a4181a4526c280d85294a7 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Mon, 20 Aug 2012 13:50:42 +0200 Subject: [PATCH 090/132] [FIX] base: restored translations for label 'VAT' changed into 'TIN' in revision 4344 bzr revid: qdp-launchpad@openerp.com-20120820115042-13epfxw99vzvumer --- openerp/addons/base/i18n/ab.po | 4 ++-- openerp/addons/base/i18n/af.po | 4 ++-- openerp/addons/base/i18n/am.po | 4 ++-- openerp/addons/base/i18n/ar.po | 4 ++-- openerp/addons/base/i18n/base.pot | 4 ++-- openerp/addons/base/i18n/bg.po | 4 ++-- openerp/addons/base/i18n/bs.po | 4 ++-- openerp/addons/base/i18n/ca.po | 4 ++-- openerp/addons/base/i18n/cs.po | 4 ++-- openerp/addons/base/i18n/da.po | 4 ++-- openerp/addons/base/i18n/de.po | 4 ++-- openerp/addons/base/i18n/el.po | 4 ++-- openerp/addons/base/i18n/en_GB.po | 4 ++-- openerp/addons/base/i18n/es.po | 4 ++-- openerp/addons/base/i18n/es_AR.po | 4 ++-- openerp/addons/base/i18n/es_CL.po | 4 ++-- openerp/addons/base/i18n/es_CR.po | 6 +++--- openerp/addons/base/i18n/es_EC.po | 4 ++-- openerp/addons/base/i18n/et.po | 4 ++-- openerp/addons/base/i18n/eu.po | 4 ++-- openerp/addons/base/i18n/fa.po | 4 ++-- openerp/addons/base/i18n/fa_AF.po | 4 ++-- openerp/addons/base/i18n/fi.po | 4 ++-- openerp/addons/base/i18n/fr.po | 4 ++-- openerp/addons/base/i18n/gl.po | 4 ++-- openerp/addons/base/i18n/gu.po | 4 ++-- openerp/addons/base/i18n/he.po | 4 ++-- openerp/addons/base/i18n/hr.po | 4 ++-- openerp/addons/base/i18n/hu.po | 4 ++-- openerp/addons/base/i18n/hy.po | 4 ++-- openerp/addons/base/i18n/id.po | 4 ++-- openerp/addons/base/i18n/is.po | 4 ++-- openerp/addons/base/i18n/it.po | 4 ++-- openerp/addons/base/i18n/ja.po | 4 ++-- openerp/addons/base/i18n/ka.po | 4 ++-- openerp/addons/base/i18n/kk.po | 4 ++-- openerp/addons/base/i18n/ko.po | 4 ++-- openerp/addons/base/i18n/lt.po | 4 ++-- openerp/addons/base/i18n/lt_LT.po | 2 +- openerp/addons/base/i18n/lv.po | 4 ++-- openerp/addons/base/i18n/mk.po | 4 ++-- openerp/addons/base/i18n/mn.po | 4 ++-- openerp/addons/base/i18n/nb.po | 4 ++-- openerp/addons/base/i18n/nl.po | 4 ++-- openerp/addons/base/i18n/nl_BE.po | 4 ++-- openerp/addons/base/i18n/nl_NL.po | 2 +- openerp/addons/base/i18n/pl.po | 4 ++-- openerp/addons/base/i18n/pt.po | 4 ++-- openerp/addons/base/i18n/pt_BR.po | 6 +++--- openerp/addons/base/i18n/ro.po | 4 ++-- openerp/addons/base/i18n/ru.po | 4 ++-- openerp/addons/base/i18n/sk.po | 4 ++-- openerp/addons/base/i18n/sl.po | 4 ++-- openerp/addons/base/i18n/sq.po | 4 ++-- openerp/addons/base/i18n/sr.po | 4 ++-- openerp/addons/base/i18n/sr@latin.po | 4 ++-- openerp/addons/base/i18n/sv.po | 4 ++-- openerp/addons/base/i18n/th.po | 4 ++-- openerp/addons/base/i18n/tlh.po | 4 ++-- openerp/addons/base/i18n/tr.po | 4 ++-- openerp/addons/base/i18n/uk.po | 4 ++-- openerp/addons/base/i18n/uk_UA.po | 2 +- openerp/addons/base/i18n/ur.po | 4 ++-- openerp/addons/base/i18n/vi.po | 4 ++-- openerp/addons/base/i18n/zh_CN.po | 4 ++-- openerp/addons/base/i18n/zh_HK.po | 4 ++-- openerp/addons/base/i18n/zh_TW.po | 4 ++-- 67 files changed, 133 insertions(+), 133 deletions(-) diff --git a/openerp/addons/base/i18n/ab.po b/openerp/addons/base/i18n/ab.po index e7888a8a720..5f5c450592a 100644 --- a/openerp/addons/base/i18n/ab.po +++ b/openerp/addons/base/i18n/ab.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/af.po b/openerp/addons/base/i18n/af.po index 4f2dd5fb776..597bf9ab330 100644 --- a/openerp/addons/base/i18n/af.po +++ b/openerp/addons/base/i18n/af.po @@ -3653,7 +3653,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9864,7 +9864,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/am.po b/openerp/addons/base/i18n/am.po index 1ccb028cac0..4627d531674 100644 --- a/openerp/addons/base/i18n/am.po +++ b/openerp/addons/base/i18n/am.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ar.po b/openerp/addons/base/i18n/ar.po index 1a2642d9e1f..8b2dbeb7c2e 100644 --- a/openerp/addons/base/i18n/ar.po +++ b/openerp/addons/base/i18n/ar.po @@ -3721,7 +3721,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ضريبة القيمة المضافة" #. module: base @@ -9975,7 +9975,7 @@ msgstr "الأسابيع" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/base.pot b/openerp/addons/base/i18n/base.pot index b4d28052ba8..884dac7d821 100644 --- a/openerp/addons/base/i18n/base.pot +++ b/openerp/addons/base/i18n/base.pot @@ -3383,7 +3383,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9064,7 +9064,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/bg.po b/openerp/addons/base/i18n/bg.po index ab9556f269c..2bb32e19c40 100644 --- a/openerp/addons/base/i18n/bg.po +++ b/openerp/addons/base/i18n/bg.po @@ -3705,7 +3705,7 @@ msgstr "Проверка на EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ДДС" #. module: base @@ -9961,7 +9961,7 @@ msgstr "Седмици" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/bs.po b/openerp/addons/base/i18n/bs.po index 778679bb04d..97e44c61523 100644 --- a/openerp/addons/base/i18n/bs.po +++ b/openerp/addons/base/i18n/bs.po @@ -3642,7 +3642,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9853,7 +9853,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ca.po b/openerp/addons/base/i18n/ca.po index fa5f95b14da..340ddb494f5 100644 --- a/openerp/addons/base/i18n/ca.po +++ b/openerp/addons/base/i18n/ca.po @@ -3757,7 +3757,7 @@ msgstr "Verificació EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CIF/NIF" #. module: base @@ -10082,7 +10082,7 @@ msgstr "Setmanes" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/cs.po b/openerp/addons/base/i18n/cs.po index 4819a321dda..79939664d5c 100644 --- a/openerp/addons/base/i18n/cs.po +++ b/openerp/addons/base/i18n/cs.po @@ -3787,7 +3787,7 @@ msgstr "Kontrola Ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "DIČ" #. module: base @@ -10090,7 +10090,7 @@ msgstr "Týdnů" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "DPH: " #. module: base diff --git a/openerp/addons/base/i18n/da.po b/openerp/addons/base/i18n/da.po index 2710b5c4629..854dd6e6293 100644 --- a/openerp/addons/base/i18n/da.po +++ b/openerp/addons/base/i18n/da.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Moms" #. module: base @@ -9845,7 +9845,7 @@ msgstr "Uger" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/de.po b/openerp/addons/base/i18n/de.po index 9db01f56eb0..017a2d48b6b 100644 --- a/openerp/addons/base/i18n/de.po +++ b/openerp/addons/base/i18n/de.po @@ -4266,7 +4266,7 @@ msgstr "EAN Prüfung" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "USt-IdNr. / UID" #. module: base @@ -10907,7 +10907,7 @@ msgstr "Wochen" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "UID: " #. module: base diff --git a/openerp/addons/base/i18n/el.po b/openerp/addons/base/i18n/el.po index 7a9c9db6811..f8975ee4dad 100644 --- a/openerp/addons/base/i18n/el.po +++ b/openerp/addons/base/i18n/el.po @@ -3728,7 +3728,7 @@ msgstr "Έλεγχος ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ΦΠΑ" #. module: base @@ -9997,7 +9997,7 @@ msgstr "Εβδομάδες" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/en_GB.po b/openerp/addons/base/i18n/en_GB.po index d7bc4f79bbf..259f120278d 100644 --- a/openerp/addons/base/i18n/en_GB.po +++ b/openerp/addons/base/i18n/en_GB.po @@ -4123,7 +4123,7 @@ msgstr "Ean check" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "VAT" #. module: base @@ -10427,7 +10427,7 @@ msgstr "Weeks" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/es.po b/openerp/addons/base/i18n/es.po index ef47237de9f..2c3cc3414af 100644 --- a/openerp/addons/base/i18n/es.po +++ b/openerp/addons/base/i18n/es.po @@ -3977,7 +3977,7 @@ msgstr "Verificación EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CIF/NIF" #. module: base @@ -10306,7 +10306,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/es_AR.po b/openerp/addons/base/i18n/es_AR.po index fdc9c0340dd..b36b88a179a 100644 --- a/openerp/addons/base/i18n/es_AR.po +++ b/openerp/addons/base/i18n/es_AR.po @@ -3668,7 +3668,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CUIT" #. module: base @@ -9900,7 +9900,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/es_CL.po b/openerp/addons/base/i18n/es_CL.po index 9c200b406c5..d484cdd7f94 100644 --- a/openerp/addons/base/i18n/es_CL.po +++ b/openerp/addons/base/i18n/es_CL.po @@ -3795,7 +3795,7 @@ msgstr "Verificación EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "RUT" #. module: base @@ -10124,7 +10124,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/es_CR.po b/openerp/addons/base/i18n/es_CR.po index a5124cc2596..3eaeea2e0b0 100644 --- a/openerp/addons/base/i18n/es_CR.po +++ b/openerp/addons/base/i18n/es_CR.po @@ -1975,7 +1975,7 @@ msgstr "" "``BE0477472701``\n" "será validado con la normativa belga.\n" "\n" -"Hay dos niveles diferentes de validación del número de VAT: \n" +"Hay dos niveles diferentes de validación del número de TIN: \n" "\n" "*Por defecto, un simple fuera de linea de verificación se realiza mediante " "la validación conocida\n" @@ -4391,7 +4391,7 @@ msgstr "Verificación EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CIF/NIF" #. module: base @@ -12421,7 +12421,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "IVA: " #. module: base diff --git a/openerp/addons/base/i18n/es_EC.po b/openerp/addons/base/i18n/es_EC.po index 9a8ee789f45..233214a8b3f 100644 --- a/openerp/addons/base/i18n/es_EC.po +++ b/openerp/addons/base/i18n/es_EC.po @@ -3971,7 +3971,7 @@ msgstr "Ean de verificación" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "CIF/NIF" #. module: base @@ -10350,7 +10350,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "IVA " #. module: base diff --git a/openerp/addons/base/i18n/et.po b/openerp/addons/base/i18n/et.po index 92461a33610..164dbde7e9b 100644 --- a/openerp/addons/base/i18n/et.po +++ b/openerp/addons/base/i18n/et.po @@ -3665,7 +3665,7 @@ msgstr "Ean kontroll" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Käibemaks" #. module: base @@ -9890,7 +9890,7 @@ msgstr "Nädalad" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/eu.po b/openerp/addons/base/i18n/eu.po index cac59f27002..16081128c30 100644 --- a/openerp/addons/base/i18n/eu.po +++ b/openerp/addons/base/i18n/eu.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/fa.po b/openerp/addons/base/i18n/fa.po index 74885636856..fc9e0b5910a 100644 --- a/openerp/addons/base/i18n/fa.po +++ b/openerp/addons/base/i18n/fa.po @@ -3667,7 +3667,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "مالیات بر ارزش افزوده" #. module: base @@ -9894,7 +9894,7 @@ msgstr "هفته‌ها" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/fa_AF.po b/openerp/addons/base/i18n/fa_AF.po index 99a346be694..86d22d26b10 100644 --- a/openerp/addons/base/i18n/fa_AF.po +++ b/openerp/addons/base/i18n/fa_AF.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/fi.po b/openerp/addons/base/i18n/fi.po index c2de09b902d..6cf9e4d0979 100644 --- a/openerp/addons/base/i18n/fi.po +++ b/openerp/addons/base/i18n/fi.po @@ -3751,7 +3751,7 @@ msgstr "EAN tarkistus" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ALV" #. module: base @@ -10091,7 +10091,7 @@ msgstr "Viikot" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "ALV: " #. module: base diff --git a/openerp/addons/base/i18n/fr.po b/openerp/addons/base/i18n/fr.po index 3f755a59d14..4849ed703f7 100644 --- a/openerp/addons/base/i18n/fr.po +++ b/openerp/addons/base/i18n/fr.po @@ -4371,7 +4371,7 @@ msgstr "Vérification EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "TVA" #. module: base @@ -11707,7 +11707,7 @@ msgstr "Semaines" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "TVA: " #. module: base diff --git a/openerp/addons/base/i18n/gl.po b/openerp/addons/base/i18n/gl.po index 91ac9510620..bce4cfa8d20 100644 --- a/openerp/addons/base/i18n/gl.po +++ b/openerp/addons/base/i18n/gl.po @@ -3757,7 +3757,7 @@ msgstr "comprobar EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "IVE" #. module: base @@ -10069,7 +10069,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/gu.po b/openerp/addons/base/i18n/gu.po index 91597862bf5..91a923c6c5b 100644 --- a/openerp/addons/base/i18n/gu.po +++ b/openerp/addons/base/i18n/gu.po @@ -3692,7 +3692,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9903,7 +9903,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/he.po b/openerp/addons/base/i18n/he.po index 967b11c89a0..51dc0b68178 100644 --- a/openerp/addons/base/i18n/he.po +++ b/openerp/addons/base/i18n/he.po @@ -3654,7 +3654,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "מע\"מ" #. module: base @@ -9877,7 +9877,7 @@ msgstr "שבועות" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/hr.po b/openerp/addons/base/i18n/hr.po index e50c21bd73c..da97294a878 100644 --- a/openerp/addons/base/i18n/hr.po +++ b/openerp/addons/base/i18n/hr.po @@ -3784,7 +3784,7 @@ msgstr "Provjera Ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PDV" #. module: base @@ -10050,7 +10050,7 @@ msgstr "Tjedni" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "PDV " #. module: base diff --git a/openerp/addons/base/i18n/hu.po b/openerp/addons/base/i18n/hu.po index d98ee515473..94525dfaff2 100644 --- a/openerp/addons/base/i18n/hu.po +++ b/openerp/addons/base/i18n/hu.po @@ -3744,7 +3744,7 @@ msgstr "EAN ellenőrzés" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Közösségi/nemzetközi adószám" #. module: base @@ -10063,7 +10063,7 @@ msgstr "Hetek" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/hy.po b/openerp/addons/base/i18n/hy.po index 2c5ed383c32..8d3072b598f 100644 --- a/openerp/addons/base/i18n/hy.po +++ b/openerp/addons/base/i18n/hy.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/id.po b/openerp/addons/base/i18n/id.po index de2d31683ee..f71c65e63e8 100644 --- a/openerp/addons/base/i18n/id.po +++ b/openerp/addons/base/i18n/id.po @@ -3638,7 +3638,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9849,7 +9849,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/is.po b/openerp/addons/base/i18n/is.po index bab1f557502..d84c81ee518 100644 --- a/openerp/addons/base/i18n/is.po +++ b/openerp/addons/base/i18n/is.po @@ -3668,7 +3668,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "VSK" #. module: base @@ -9880,7 +9880,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/it.po b/openerp/addons/base/i18n/it.po index e1f369680a2..8b33bb7a1e7 100644 --- a/openerp/addons/base/i18n/it.po +++ b/openerp/addons/base/i18n/it.po @@ -3807,7 +3807,7 @@ msgstr "Verifica EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Partita IVA" #. module: base @@ -10132,7 +10132,7 @@ msgstr "Settimane" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ja.po b/openerp/addons/base/i18n/ja.po index 35382f62daa..a3fe9843e4e 100644 --- a/openerp/addons/base/i18n/ja.po +++ b/openerp/addons/base/i18n/ja.po @@ -4131,7 +4131,7 @@ msgstr "EANチェック" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "VAT(Value Added Tax)" #. module: base @@ -11571,7 +11571,7 @@ msgstr "週" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ka.po b/openerp/addons/base/i18n/ka.po index a7a4c233c3c..9edba583232 100644 --- a/openerp/addons/base/i18n/ka.po +++ b/openerp/addons/base/i18n/ka.po @@ -4267,7 +4267,7 @@ msgstr "EAN-ის შემოწმება" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "დღგ" #. module: base @@ -11688,7 +11688,7 @@ msgstr "კვირეები" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "დღგ: " #. module: base diff --git a/openerp/addons/base/i18n/kk.po b/openerp/addons/base/i18n/kk.po index 09a985213b8..bffba2e7eb6 100644 --- a/openerp/addons/base/i18n/kk.po +++ b/openerp/addons/base/i18n/kk.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "апта" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/ko.po b/openerp/addons/base/i18n/ko.po index b66cb25933e..95a91eb27cb 100644 --- a/openerp/addons/base/i18n/ko.po +++ b/openerp/addons/base/i18n/ko.po @@ -3681,7 +3681,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "부가세" #. module: base @@ -9906,7 +9906,7 @@ msgstr "주" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/lt.po b/openerp/addons/base/i18n/lt.po index eb59a102506..fd31f08f45d 100644 --- a/openerp/addons/base/i18n/lt.po +++ b/openerp/addons/base/i18n/lt.po @@ -3646,7 +3646,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PVM" #. module: base @@ -9877,7 +9877,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/lt_LT.po b/openerp/addons/base/i18n/lt_LT.po index 13846af119e..be05dc522d1 100644 --- a/openerp/addons/base/i18n/lt_LT.po +++ b/openerp/addons/base/i18n/lt_LT.po @@ -4533,7 +4533,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/lv.po b/openerp/addons/base/i18n/lv.po index 0a83e177d06..ddffb721e47 100644 --- a/openerp/addons/base/i18n/lv.po +++ b/openerp/addons/base/i18n/lv.po @@ -3678,7 +3678,7 @@ msgstr "EAN pārbaude" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PVN" #. module: base @@ -9919,7 +9919,7 @@ msgstr "Nedēļas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/mk.po b/openerp/addons/base/i18n/mk.po index 3414ae7063c..c83e232dc72 100644 --- a/openerp/addons/base/i18n/mk.po +++ b/openerp/addons/base/i18n/mk.po @@ -3645,7 +3645,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9856,7 +9856,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/mn.po b/openerp/addons/base/i18n/mn.po index c80aa9afb14..3dfce8aabd9 100644 --- a/openerp/addons/base/i18n/mn.po +++ b/openerp/addons/base/i18n/mn.po @@ -4166,7 +4166,7 @@ msgstr "Зур.код чеклэх" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "НӨАТ" #. module: base @@ -11762,7 +11762,7 @@ msgstr "7 хоног" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "НӨАТ: " #. module: base diff --git a/openerp/addons/base/i18n/nb.po b/openerp/addons/base/i18n/nb.po index 1542c677529..fc9ab46d995 100644 --- a/openerp/addons/base/i18n/nb.po +++ b/openerp/addons/base/i18n/nb.po @@ -3686,7 +3686,7 @@ msgstr "Ean sjekk" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "MVA" #. module: base @@ -9926,7 +9926,7 @@ msgstr "Uker" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/nl.po b/openerp/addons/base/i18n/nl.po index 45560f7e363..ba5b8b3cd07 100644 --- a/openerp/addons/base/i18n/nl.po +++ b/openerp/addons/base/i18n/nl.po @@ -3863,7 +3863,7 @@ msgstr "Ean controle" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "BTW" #. module: base @@ -10292,7 +10292,7 @@ msgstr "Weken" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "BTW: " #. module: base diff --git a/openerp/addons/base/i18n/nl_BE.po b/openerp/addons/base/i18n/nl_BE.po index cf2cc84f2fd..d7f03b217f4 100644 --- a/openerp/addons/base/i18n/nl_BE.po +++ b/openerp/addons/base/i18n/nl_BE.po @@ -3649,7 +3649,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9860,7 +9860,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/nl_NL.po b/openerp/addons/base/i18n/nl_NL.po index bfb371faf05..267b058bfef 100644 --- a/openerp/addons/base/i18n/nl_NL.po +++ b/openerp/addons/base/i18n/nl_NL.po @@ -4711,7 +4711,7 @@ msgstr "html" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "BTW" #. module: base diff --git a/openerp/addons/base/i18n/pl.po b/openerp/addons/base/i18n/pl.po index b0e489d3b03..a58a4b07acc 100644 --- a/openerp/addons/base/i18n/pl.po +++ b/openerp/addons/base/i18n/pl.po @@ -3730,7 +3730,7 @@ msgstr "Sprawdzanie EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "NIP" #. module: base @@ -10025,7 +10025,7 @@ msgstr "Tygodni" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "NIP: " #. module: base diff --git a/openerp/addons/base/i18n/pt.po b/openerp/addons/base/i18n/pt.po index b60b9b98d76..ef27a385d12 100644 --- a/openerp/addons/base/i18n/pt.po +++ b/openerp/addons/base/i18n/pt.po @@ -3959,7 +3959,7 @@ msgstr "Verificar EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "IVA" #. module: base @@ -10340,7 +10340,7 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "IVA: " #. module: base diff --git a/openerp/addons/base/i18n/pt_BR.po b/openerp/addons/base/i18n/pt_BR.po index 97cbcce0eb6..01db31d7ebe 100644 --- a/openerp/addons/base/i18n/pt_BR.po +++ b/openerp/addons/base/i18n/pt_BR.po @@ -4164,7 +4164,7 @@ msgstr "Verificar EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Imposto" #. module: base @@ -10849,8 +10849,8 @@ msgstr "Semanas" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " -msgstr "VAT: " +msgid "TIN: " +msgstr "TIN: " #. module: base #: model:res.country,name:base.af diff --git a/openerp/addons/base/i18n/ro.po b/openerp/addons/base/i18n/ro.po index f079b8bd10a..aa7d5de6a86 100644 --- a/openerp/addons/base/i18n/ro.po +++ b/openerp/addons/base/i18n/ro.po @@ -4363,7 +4363,7 @@ msgstr "Verificati codul EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "TVA" #. module: base @@ -12351,7 +12351,7 @@ msgstr "Saptamani" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "TVA: " #. module: base diff --git a/openerp/addons/base/i18n/ru.po b/openerp/addons/base/i18n/ru.po index c3ba2f63acd..d879ea9fefc 100644 --- a/openerp/addons/base/i18n/ru.po +++ b/openerp/addons/base/i18n/ru.po @@ -3811,7 +3811,7 @@ msgstr "Проверка кода Ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ИНН" #. module: base @@ -10154,7 +10154,7 @@ msgstr "Недели" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sk.po b/openerp/addons/base/i18n/sk.po index 94ee24e819d..d1da2e46b6d 100644 --- a/openerp/addons/base/i18n/sk.po +++ b/openerp/addons/base/i18n/sk.po @@ -3712,7 +3712,7 @@ msgstr "Ean kontrola" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "DPH" #. module: base @@ -9991,7 +9991,7 @@ msgstr "Týždne" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sl.po b/openerp/addons/base/i18n/sl.po index f9eeb1456c2..8a800c2d8ea 100644 --- a/openerp/addons/base/i18n/sl.po +++ b/openerp/addons/base/i18n/sl.po @@ -3741,7 +3741,7 @@ msgstr "Preveri ean" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "DDV" #. module: base @@ -10047,7 +10047,7 @@ msgstr "Tedni" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sq.po b/openerp/addons/base/i18n/sq.po index b1f0478ed8a..735a237fbed 100644 --- a/openerp/addons/base/i18n/sq.po +++ b/openerp/addons/base/i18n/sq.po @@ -3633,7 +3633,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9844,7 +9844,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sr.po b/openerp/addons/base/i18n/sr.po index e8c74060cc3..a1d444c03b0 100644 --- a/openerp/addons/base/i18n/sr.po +++ b/openerp/addons/base/i18n/sr.po @@ -3710,7 +3710,7 @@ msgstr "EAN provera" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PDV" #. module: base @@ -9975,7 +9975,7 @@ msgstr "Nedelje" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/sr@latin.po b/openerp/addons/base/i18n/sr@latin.po index 5c187aeec8b..2632130f415 100644 --- a/openerp/addons/base/i18n/sr@latin.po +++ b/openerp/addons/base/i18n/sr@latin.po @@ -4309,7 +4309,7 @@ msgstr "EAN provera" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "PDV" #. module: base @@ -11242,7 +11242,7 @@ msgstr "Nedelje" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "PDV: " #. module: base diff --git a/openerp/addons/base/i18n/sv.po b/openerp/addons/base/i18n/sv.po index 2e9ff2e0539..ba4f6334f63 100644 --- a/openerp/addons/base/i18n/sv.po +++ b/openerp/addons/base/i18n/sv.po @@ -3952,7 +3952,7 @@ msgstr "EAN kontroll" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Moms" #. module: base @@ -10426,7 +10426,7 @@ msgstr "Veckor" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "Moms: " #. module: base diff --git a/openerp/addons/base/i18n/th.po b/openerp/addons/base/i18n/th.po index df20f7a2adc..2e53f3a9734 100644 --- a/openerp/addons/base/i18n/th.po +++ b/openerp/addons/base/i18n/th.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/tlh.po b/openerp/addons/base/i18n/tlh.po index 805035cf850..58b349f8bbd 100644 --- a/openerp/addons/base/i18n/tlh.po +++ b/openerp/addons/base/i18n/tlh.po @@ -3633,7 +3633,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9844,7 +9844,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/tr.po b/openerp/addons/base/i18n/tr.po index b6670894b5c..9d54b0aed7e 100644 --- a/openerp/addons/base/i18n/tr.po +++ b/openerp/addons/base/i18n/tr.po @@ -3773,7 +3773,7 @@ msgstr "EAN kontrolü" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "KDV" #. module: base @@ -10097,7 +10097,7 @@ msgstr "Hafta" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "VNO: " #. module: base diff --git a/openerp/addons/base/i18n/uk.po b/openerp/addons/base/i18n/uk.po index 79d5db6ef59..8310cd833ce 100644 --- a/openerp/addons/base/i18n/uk.po +++ b/openerp/addons/base/i18n/uk.po @@ -3669,7 +3669,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ПДВ" #. module: base @@ -9893,7 +9893,7 @@ msgstr "Тижні" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/uk_UA.po b/openerp/addons/base/i18n/uk_UA.po index 8263fde5c5e..8a8f1d3613f 100644 --- a/openerp/addons/base/i18n/uk_UA.po +++ b/openerp/addons/base/i18n/uk_UA.po @@ -4551,7 +4551,7 @@ msgstr "html" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "ПДВ" #. module: base diff --git a/openerp/addons/base/i18n/ur.po b/openerp/addons/base/i18n/ur.po index 4239bc2adf3..c48f39785d1 100644 --- a/openerp/addons/base/i18n/ur.po +++ b/openerp/addons/base/i18n/ur.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/vi.po b/openerp/addons/base/i18n/vi.po index 0255aaf2f57..51c018a9672 100644 --- a/openerp/addons/base/i18n/vi.po +++ b/openerp/addons/base/i18n/vi.po @@ -3661,7 +3661,7 @@ msgstr "Kiểm tra EAN" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "Thuế GTGT" #. module: base @@ -9878,7 +9878,7 @@ msgstr "Tuần" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/zh_CN.po b/openerp/addons/base/i18n/zh_CN.po index ee0f43d8372..3cf1f1365fb 100644 --- a/openerp/addons/base/i18n/zh_CN.po +++ b/openerp/addons/base/i18n/zh_CN.po @@ -4032,7 +4032,7 @@ msgstr "条码检查" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "增值税" #. module: base @@ -10638,7 +10638,7 @@ msgstr "周" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "增值税: " #. module: base diff --git a/openerp/addons/base/i18n/zh_HK.po b/openerp/addons/base/i18n/zh_HK.po index 96313cd3e58..216a05705bb 100644 --- a/openerp/addons/base/i18n/zh_HK.po +++ b/openerp/addons/base/i18n/zh_HK.po @@ -3634,7 +3634,7 @@ msgstr "" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "" #. module: base @@ -9845,7 +9845,7 @@ msgstr "" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base diff --git a/openerp/addons/base/i18n/zh_TW.po b/openerp/addons/base/i18n/zh_TW.po index a4804f29e56..aad1201ccfa 100644 --- a/openerp/addons/base/i18n/zh_TW.po +++ b/openerp/addons/base/i18n/zh_TW.po @@ -3639,7 +3639,7 @@ msgstr "Ean 檢查" #. module: base #: field:res.partner,vat:0 -msgid "VAT" +msgid "TIN" msgstr "增值稅" #. module: base @@ -9858,7 +9858,7 @@ msgstr "週" #. module: base #: code:addons/base/res/res_company.py:157 #, python-format -msgid "VAT: " +msgid "TIN: " msgstr "" #. module: base From 2501b06ca0dec18c98f2b9d73b64a7b0aebe13e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 20 Aug 2012 14:22:43 +0200 Subject: [PATCH 091/132] [IMP] removed left and top bar from printing bzr revid: fva@openerp.com-20120820122243-z9wtrkpb2ub79enf --- addons/web/static/src/css/base.css | 41 ++++++++++++++++------------- addons/web/static/src/css/base.sass | 4 +++ 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 87a83b4c70e..2276bb2445e 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -64,6 +64,11 @@ } } +@media print { + .oe_topbar, .oe_leftbar, .oe_loading { + display: none !important; + } +} .openerp.openerp_webclient_container { height: 100%; position: relative; @@ -234,7 +239,7 @@ font-size: 13px; } .openerp .ui-widget-content a { - color: #8a89ba; + color: #7c7bad; } .openerp .ui-menu .ui-menu-item { margin: 0 8px 0 0; @@ -336,7 +341,7 @@ border-radius: 0 0 2px 2px; } .openerp.ui-dialog .oe_about a { - color: #8a89ba; + color: #7c7bad; } .openerp.ui-dialog .oe_about a:hover { text-decoration: underline; @@ -547,7 +552,7 @@ -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; - color: #8a89ba; + color: #7c7bad; font-weight: bold; } .openerp .oe_button.oe_link span:hover { @@ -578,7 +583,7 @@ color: #4c4c4c; } .openerp .oe_tag_dark { - background: #8786b7; + background: #7c7bad; color: #eeeeee; } .openerp .oe_tags.oe_inline { @@ -1007,7 +1012,7 @@ .openerp .oe_topbar { width: 100%; height: 31px; - border-top: solid 1px #d3d3d3; + border-top: solid 1px lightgrey; background-color: #646060; background-image: -webkit-gradient(linear, left top, left bottom, from(#646060), to(#262626)); background-image: -webkit-linear-gradient(top, #646060, #262626); @@ -1180,7 +1185,7 @@ .openerp .oe_secondary_menu_section { font-weight: bold; margin-left: 8px; - color: #8a89ba; + color: #7c7bad; } .openerp .oe_secondary_submenu { padding: 2px 0 8px 0; @@ -1202,11 +1207,11 @@ top: 1px; right: 1px; font-size: 10px; - background: #8a89ba; + background: #7c7bad; color: white; padding: 2px 4px; margin: 1px 6px 0 0; - border: 1px solid lightGray; + border: 1px solid lightgrey; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -moz-border-radius: 4px; -webkit-border-radius: 4px; @@ -1222,9 +1227,9 @@ padding: 1px 4px; } .openerp .oe_secondary_submenu .oe_active { - background: #8a89ba; - border-top: 1px solid lightGray; - border-bottom: 1px solid lightGray; + background: #7c7bad; + border-top: 1px solid lightgrey; + border-bottom: 1px solid lightgrey; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); @@ -1235,7 +1240,7 @@ } .openerp .oe_secondary_submenu .oe_active .oe_menu_label { background: #eeeeee; - color: #8a89ba; + color: #7c7bad; text-shadow: 0 1px 1px white; -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); @@ -1243,7 +1248,7 @@ } .openerp .oe_secondary_submenu .oe_active .oe_menu_counter { background: #eeeeee; - color: #8a89ba; + color: #7c7bad; } .openerp .oe_secondary_submenu .oe_menu_toggler:before { width: 0; @@ -1273,7 +1278,7 @@ width: 100%; } .openerp .oe_application a { - color: #8a89ba; + color: #7c7bad; } .openerp .oe_application a:hover { text-decoration: underline; @@ -1314,7 +1319,7 @@ float: left; } .openerp .oe_view_manager table.oe_view_manager_header h2 a { - color: #8a89ba; + color: #7c7bad; } .openerp .oe_view_manager table.oe_view_manager_header .oe_button_group { display: inline-block; @@ -1673,7 +1678,7 @@ } .openerp .oe_searchview .oe_searchview_drawer h3 { margin: 8px 4px 4px 12px; - color: #8786b7; + color: #7c7bad; font-size: 13px; } .openerp .oe_searchview .oe_searchview_drawer h4, .openerp .oe_searchview .oe_searchview_drawer h4 * { @@ -2074,7 +2079,7 @@ background-image: linear-gradient(to bottom, #e8e8e8, #cacaca); } .openerp ul.oe_form_steps_clickable li .label { - color: #8a89ba; + color: #7c7bad; } .openerp ul.oe_form_steps_clickable li.oe_active:hover { background-color: #4c85c2; @@ -2174,7 +2179,7 @@ } .openerp .oe_form .oe_form_label_help[for] span, .openerp .oe_form .oe_form_label[for] span { font-size: 80%; - color: darkGreen; + color: darkgreen; vertical-align: top; position: relative; top: -4px; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 6472f7aaacd..653adad7813 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -142,6 +142,10 @@ $sheet-max-width: 860px opacity: 1 // }}} +@media print + .oe_topbar, .oe_leftbar, .oe_loading + display: none !important + .openerp.openerp_webclient_container height: 100% position: relative From c447533f7d999c191aa0e9e04713fb2f614804bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 20 Aug 2012 14:40:07 +0200 Subject: [PATCH 092/132] [FIX] point_of_sale: fix css for receipt printing bzr revid: fva@openerp.com-20120820124007-fg36abyblxpboiyi --- addons/point_of_sale/static/src/css/pos.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 973c8b10d87..ff361ab2e2d 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -749,18 +749,18 @@ } @media print { - #oe_header, #oe_menu, .point-of-sale #topheader, .point-of-sale #leftpane { - display: none; + .point-of-sale #topheader, .point-of-sale #leftpane { + display: none !important; } .point-of-sale #content { - top: 0px; + top: 0px !important; } .point-of-sale #rightpane { - left: 0px; + left: 0px !important; background-color: white; } #receipt-screen header { - display: none; + display: none !important; } #receipt-screen { text-align: left; From 8f9f8603232fc7a0bbd55fd83471c6f61184591a Mon Sep 17 00:00:00 2001 From: Hardik Date: Mon, 20 Aug 2012 18:26:44 +0530 Subject: [PATCH 093/132] [IMP]Update __openerp__.py for all modules bzr revid: hsa@tinyerp.com-20120820125644-px287o03bxrx8h3o --- addons/account/__openerp__.py | 1 - addons/account_accountant/__openerp__.py | 1 - .../account_analytic_analysis/__openerp__.py | 1 - .../account_analytic_default/__openerp__.py | 1 - addons/account_analytic_plans/__openerp__.py | 1 - addons/account_anglo_saxon/__openerp__.py | 1 - addons/account_asset/__openerp__.py | 2 -- .../__openerp__.py | 2 -- addons/account_budget/__openerp__.py | 1 - addons/account_cancel/__openerp__.py | 1 - addons/account_chart/__openerp__.py | 1 - addons/account_check_writing/__openerp__.py | 1 - addons/account_coda/__openerp__.py | 2 -- addons/account_followup/__openerp__.py | 1 - addons/account_payment/__openerp__.py | 1 - addons/account_sequence/__openerp__.py | 1 - addons/account_voucher/__openerp__.py | 8 ++------ addons/analytic/__openerp__.py | 1 - .../__openerp__.py | 1 - .../__openerp__.py | 1 - .../analytic_contract_project/__openerp__.py | 1 - addons/analytic_user_function/__openerp__.py | 1 - addons/anonymization/__openerp__.py | 2 -- addons/audittrail/__openerp__.py | 1 - addons/base_action_rule/__openerp__.py | 4 +--- addons/base_calendar/__openerp__.py | 6 ++---- addons/base_iban/__openerp__.py | 3 +-- addons/base_module_doc_rst/__openerp__.py | 1 - addons/base_module_record/__openerp__.py | 1 - addons/base_report_designer/__openerp__.py | 3 +-- addons/base_status/__openerp__.py | 1 - addons/base_tools/__openerp__.py | 1 - addons/caldav/__openerp__.py | 4 ++-- addons/claim_from_delivery/__openerp__.py | 1 - addons/crm/__openerp__.py | 3 +-- addons/crm_caldav/__openerp__.py | 3 +-- addons/crm_claim/__openerp__.py | 5 +---- addons/crm_helpdesk/__openerp__.py | 4 +--- addons/crm_profiling/__openerp__.py | 1 - addons/decimal_precision/__openerp__.py | 1 - addons/delivery/__openerp__.py | 4 ++-- addons/document/__openerp__.py | 1 - addons/document_ftp/__openerp__.py | 1 - addons/document_page/__openerp__.py | 1 - addons/document_webdav/__openerp__.py | 1 - addons/event/__openerp__.py | 1 - addons/event_moodle/__openerp__.py | 1 - addons/event_project/__openerp__.py | 1 - addons/fetchmail/__openerp__.py | 1 - addons/google_base_account/__openerp__.py | 1 - addons/google_map/__openerp__.py | 1 - addons/hr/__openerp__.py | 1 - addons/hr_contract/__openerp__.py | 4 ++-- addons/hr_expense/__openerp__.py | 1 - addons/hr_holidays/__openerp__.py | 1 - addons/hr_payroll/__openerp__.py | 2 -- addons/hr_payroll_account/__openerp__.py | 2 -- addons/hr_timesheet/__openerp__.py | 2 +- addons/hr_timesheet_sheet/__openerp__.py | 1 - addons/idea/__openerp__.py | 1 - addons/import_base/__openerp__.py | 1 - addons/import_google/__openerp__.py | 1 - addons/knowledge/__openerp__.py | 1 - addons/l10n_ar/__openerp__.py | 1 - addons/l10n_be/__openerp__.py | 1 - addons/l10n_be_invoice_bba/__openerp__.py | 1 - addons/l10n_br/__openerp__.py | 4 +--- addons/l10n_ca/__openerp__.py | 1 - addons/l10n_ch/__openerp__.py | 20 +++++++++---------- addons/l10n_cl/__openerp__.py | 1 - addons/l10n_cn/__openerp__.py | 4 +--- addons/l10n_cr/__openerp__.py | 1 - addons/l10n_de/__openerp__.py | 1 - addons/l10n_ec/__openerp__.py | 1 - addons/l10n_es/__openerp__.py | 2 -- addons/l10n_fr/__openerp__.py | 1 - addons/l10n_fr_rib/__openerp__.py | 3 +-- addons/l10n_gr/__openerp__.py | 1 - addons/l10n_gt/__openerp__.py | 1 - addons/l10n_hn/__openerp__.py | 1 - addons/l10n_it/__openerp__.py | 2 -- addons/l10n_lu/__openerp__.py | 1 - addons/l10n_ma/__openerp__.py | 1 - addons/l10n_multilang/__openerp__.py | 1 - addons/l10n_nl/__openerp__.py | 1 - addons/l10n_pe/__openerp__.py | 2 -- addons/l10n_syscohada/__openerp__.py | 1 - addons/l10n_th/__openerp__.py | 1 - addons/l10n_tr/__openerp__.py | 1 - addons/l10n_uk/__openerp__.py | 1 - addons/l10n_us/__openerp__.py | 1 - addons/l10n_uy/__openerp__.py | 1 - addons/lunch/__openerp__.py | 1 - addons/marketing/__openerp__.py | 1 - addons/marketing_campaign/__openerp__.py | 1 - .../__openerp__.py | 1 - addons/membership/__openerp__.py | 4 ++-- addons/mrp/__openerp__.py | 1 - addons/mrp_operations/__openerp__.py | 1 - addons/mrp_subproduct/__openerp__.py | 1 - addons/multi_company/__openerp__.py | 1 - addons/pad_project/__openerp__.py | 1 - addons/plugin_outlook/__openerp__.py | 1 - addons/plugin_thunderbird/__openerp__.py | 1 - addons/point_of_sale/__openerp__.py | 2 -- addons/process/__openerp__.py | 1 - addons/procurement/__openerp__.py | 1 - addons/product/__openerp__.py | 1 - addons/product_expiry/__openerp__.py | 1 - addons/product_manufacturer/__openerp__.py | 1 - addons/profile_tools/__openerp__.py | 1 - addons/project_gtd/__openerp__.py | 1 - addons/project_issue/__openerp__.py | 4 +--- addons/project_issue_sheet/__openerp__.py | 1 - addons/project_long_term/__openerp__.py | 1 - addons/project_mailgate/__openerp__.py | 1 - addons/project_mrp/__openerp__.py | 1 - addons/project_retro_planning/__openerp__.py | 1 - addons/project_timesheet/__openerp__.py | 2 +- addons/purchase_analytic_plans/__openerp__.py | 1 - .../purchase_double_validation/__openerp__.py | 1 - addons/purchase_requisition/__openerp__.py | 1 - addons/report_designer/__openerp__.py | 1 - addons/report_intrastat/__openerp__.py | 4 ++-- addons/resource/__openerp__.py | 1 - addons/sale/__openerp__.py | 1 - addons/sale_analytic_plans/__openerp__.py | 1 - addons/sale_crm/__openerp__.py | 1 - addons/sale_journal/__openerp__.py | 2 +- addons/sale_mrp/__openerp__.py | 1 - addons/sale_order_dates/__openerp__.py | 1 - addons/stock/__openerp__.py | 1 - addons/stock_invoice_directly/__openerp__.py | 1 - addons/stock_location/__openerp__.py | 1 - addons/subscription/__openerp__.py | 1 - 135 files changed, 37 insertions(+), 186 deletions(-) diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py index 3fb186d5965..39ca916f41f 100644 --- a/addons/account/__openerp__.py +++ b/addons/account/__openerp__.py @@ -49,7 +49,6 @@ financial year and for preparation of vouchers there is a module named account_v """, 'website': 'http://www.openerp.com', 'images' : ['images/accounts.jpeg','images/bank_statement.jpeg','images/cash_register.jpeg','images/chart_of_accounts.jpeg','images/customer_invoice.jpeg','images/journal_entries.jpeg'], - 'data': [], 'depends' : ['base_setup', 'product', 'analytic', 'process', 'board', 'edi'], 'data': [ 'security/account_security.xml', diff --git a/addons/account_accountant/__openerp__.py b/addons/account_accountant/__openerp__.py index 558bafe9ff3..ea4d7887a15 100644 --- a/addons/account_accountant/__openerp__.py +++ b/addons/account_accountant/__openerp__.py @@ -36,7 +36,6 @@ It assigns manager and user access rights to the Administrator and only user rights to Demo user. """, 'website': 'http://www.openerp.com', - 'data': [], 'depends' : ['account_voucher'], 'data': [ 'security/account_security.xml', diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/account_analytic_analysis/__openerp__.py index 7ad2b826b94..f306dc78591 100644 --- a/addons/account_analytic_analysis/__openerp__.py +++ b/addons/account_analytic_analysis/__openerp__.py @@ -36,7 +36,6 @@ user-wise as well as month-wise. 'website': 'http://www.camptocamp.com/', 'images': ['images/bill_tasks_works.jpeg','images/overpassed_accounts.jpeg'], 'depends': ['hr_timesheet_invoice', 'sale'], #although sale is technically not required to install this module, all menuitems are located under 'Sales' application - 'data': [], 'data': [ 'security/ir.model.access.csv', 'account_analytic_analysis_view.xml', diff --git a/addons/account_analytic_default/__openerp__.py b/addons/account_analytic_default/__openerp__.py index 1bc104d12e1..7bbbd413989 100644 --- a/addons/account_analytic_default/__openerp__.py +++ b/addons/account_analytic_default/__openerp__.py @@ -39,7 +39,6 @@ Allows to automatically select analytic accounts based on criterions: 'website' : 'http://www.openerp.com', 'images' : ['images/analytic_defaults.jpeg'], 'depends' : ['sale'], - 'data' : [], 'data': [ 'security/ir.model.access.csv', 'security/account_analytic_default_security.xml', diff --git a/addons/account_analytic_plans/__openerp__.py b/addons/account_analytic_plans/__openerp__.py index 51a666a5883..9928b4b685c 100644 --- a/addons/account_analytic_plans/__openerp__.py +++ b/addons/account_analytic_plans/__openerp__.py @@ -63,7 +63,6 @@ of distribution models. 'website': 'http://www.openerp.com', 'images': ['images/analytic_plan.jpeg'], 'depends': ['account', 'account_analytic_default'], - 'data': [], 'data': [ 'security/account_analytic_plan_security.xml', 'security/ir.model.access.csv', diff --git a/addons/account_anglo_saxon/__openerp__.py b/addons/account_anglo_saxon/__openerp__.py index 0bbe78bcbf9..d1fd2cf5d40 100644 --- a/addons/account_anglo_saxon/__openerp__.py +++ b/addons/account_anglo_saxon/__openerp__.py @@ -39,7 +39,6 @@ actual purchase price and fixed product standard price are booked on a separate 'images': ['images/account_anglo_saxon.jpeg'], 'depends': ['product', 'purchase'], 'category': 'Accounting & Finance', - 'data': [], 'demo': [], 'data': ['product_view.xml',], 'auto_install': False, diff --git a/addons/account_asset/__openerp__.py b/addons/account_asset/__openerp__.py index 19465c8703c..10b4c55a1a4 100644 --- a/addons/account_asset/__openerp__.py +++ b/addons/account_asset/__openerp__.py @@ -35,8 +35,6 @@ And it allows to create Move's of the depreciation lines. 'website' : 'http://www.openerp.com', 'category' : 'Accounting & Finance', 'sequence': 32, - 'data' : [ - ], 'demo' : [ 'account_asset_demo.xml' ], 'test': [ diff --git a/addons/account_bank_statement_extensions/__openerp__.py b/addons/account_bank_statement_extensions/__openerp__.py index dd873c803dd..3851f314686 100644 --- a/addons/account_bank_statement_extensions/__openerp__.py +++ b/addons/account_bank_statement_extensions/__openerp__.py @@ -40,8 +40,6 @@ This module adds: ''', 'depends': ['account'], 'demo': [], - 'data': [ - ], 'data' : [ 'security/ir.model.access.csv', 'account_bank_statement_view.xml', diff --git a/addons/account_budget/__openerp__.py b/addons/account_budget/__openerp__.py index 64cee70972f..bb24766b1a3 100644 --- a/addons/account_budget/__openerp__.py +++ b/addons/account_budget/__openerp__.py @@ -47,7 +47,6 @@ Three reports are available: 'website': 'http://www.openerp.com', 'images': ['images/budget.jpeg','images/budgetary_position.jpeg'], 'depends': ['account'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'security/account_budget_security.xml', diff --git a/addons/account_cancel/__openerp__.py b/addons/account_cancel/__openerp__.py index 198f00b318f..187fdae858d 100644 --- a/addons/account_cancel/__openerp__.py +++ b/addons/account_cancel/__openerp__.py @@ -34,7 +34,6 @@ If set to true it allows user to cancel entries & invoices. 'website': 'http://www.openerp.com', 'images' : ['images/account_cancel.jpeg'], 'depends' : ['account'], - 'data': [], 'data': ['account_cancel_view.xml' ], 'demo': [], 'installable': True, diff --git a/addons/account_chart/__openerp__.py b/addons/account_chart/__openerp__.py index d5651849290..2c458ceb49f 100644 --- a/addons/account_chart/__openerp__.py +++ b/addons/account_chart/__openerp__.py @@ -34,7 +34,6 @@ Deactivates minimal chart of accounts. 'website': 'http://www.openerp.com', 'depends': ['account'], 'data': [], - 'data': [], 'demo': [], 'installable': True, 'certificate': '0073332443901', diff --git a/addons/account_check_writing/__openerp__.py b/addons/account_check_writing/__openerp__.py index e78a5ce64e7..d2e5d2955e2 100644 --- a/addons/account_check_writing/__openerp__.py +++ b/addons/account_check_writing/__openerp__.py @@ -27,7 +27,6 @@ Module for the Check Writing and Check Printing. """, 'website': 'http://www.openerp.com', - 'data': [], 'depends' : [ 'account_voucher', ], diff --git a/addons/account_coda/__openerp__.py b/addons/account_coda/__openerp__.py index 0ee1d90908a..4303d25ea1f 100644 --- a/addons/account_coda/__openerp__.py +++ b/addons/account_coda/__openerp__.py @@ -77,8 +77,6 @@ If required, you can manually adjust the descriptions via the CODA configuration 'account_coda_trans_code.xml', 'account_coda_trans_category.xml', 'account_coda_comm_type.xml', - ], - 'data' : [ 'security/ir.model.access.csv', 'security/account_security.xml', 'account_coda_wizard.xml', diff --git a/addons/account_followup/__openerp__.py b/addons/account_followup/__openerp__.py index 74275e36899..057b36103a2 100644 --- a/addons/account_followup/__openerp__.py +++ b/addons/account_followup/__openerp__.py @@ -50,7 +50,6 @@ entry, you can do from in the menu: 'website': 'http://www.openerp.com', 'images': ['images/follow_ups.jpeg','images/send_followups.jpeg'], 'depends': ['account_accountant', 'mail'], - 'data': [], 'data': [ 'security/account_followup_security.xml', 'security/ir.model.access.csv', diff --git a/addons/account_payment/__openerp__.py b/addons/account_payment/__openerp__.py index ff852fbc82f..562c46fce42 100644 --- a/addons/account_payment/__openerp__.py +++ b/addons/account_payment/__openerp__.py @@ -38,7 +38,6 @@ The confirmation of a payment order does _not_ create accounting entries, it jus """, 'images': ['images/payment_mode.jpeg','images/payment_order.jpeg'], 'depends': ['account','account_voucher'], - 'data': [], 'data': [ 'security/account_payment_security.xml', 'security/ir.model.access.csv', diff --git a/addons/account_sequence/__openerp__.py b/addons/account_sequence/__openerp__.py index e282894640d..b0fecb88b91 100644 --- a/addons/account_sequence/__openerp__.py +++ b/addons/account_sequence/__openerp__.py @@ -40,7 +40,6 @@ You can customize the following attributes of the sequence: 'website': 'http://www.openerp.com', 'images': ['images/internal_sequence_number.jpeg'], 'depends': ['account'], - 'data': [], 'data': [ 'account_sequence_data.xml', 'account_sequence_installer_view.xml', diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py index 5335e1eed68..03befcc3acd 100644 --- a/addons/account_voucher/__openerp__.py +++ b/addons/account_voucher/__openerp__.py @@ -38,12 +38,7 @@ eInvoicing & Payments module manage all Voucher Entries such as 'Reconciliation 'website' : 'http://openerp.com', 'images' : ['images/customer_payment.jpeg','images/journal_voucher.jpeg','images/sales_receipt.jpeg','images/supplier_voucher.jpeg'], 'depends' : ['account'], - 'data' : [ - 'account_voucher_data.xml', - ], - 'demo' : [], - 'data' : [ 'security/ir.model.access.csv', 'account_voucher_sequence.xml', @@ -56,7 +51,8 @@ eInvoicing & Payments module manage all Voucher Entries such as 'Reconciliation 'account_voucher_wizard.xml', 'account_voucher_pay_invoice.xml', 'report/account_voucher_sales_receipt_view.xml', - 'security/account_voucher_security.xml' + 'security/account_voucher_security.xml', + 'account_voucher_data.xml', ], 'test' : [ 'test/account_voucher.yml', diff --git a/addons/analytic/__openerp__.py b/addons/analytic/__openerp__.py index 35191462e88..5baf8d9130a 100644 --- a/addons/analytic/__openerp__.py +++ b/addons/analytic/__openerp__.py @@ -34,7 +34,6 @@ In OpenERP, analytic accounts are linked to general accounts but are treated totally independently. So, you can enter various different analytic operations that have no counterpart in the general financial accounts. """, - 'data' : [], 'data': ['security/analytic_security.xml', 'security/ir.model.access.csv', 'analytic_sequence.xml', diff --git a/addons/analytic_contract_expense_project/__openerp__.py b/addons/analytic_contract_expense_project/__openerp__.py index 4f87171aa60..93a982f51a8 100644 --- a/addons/analytic_contract_expense_project/__openerp__.py +++ b/addons/analytic_contract_expense_project/__openerp__.py @@ -31,7 +31,6 @@ This module is for modifying project view to show some data related to the hr_ex 'author': 'OpenERP S.A.', 'website': 'http://www.openerp.com/', 'depends': ['analytic_contract_hr_expense','project'], - 'data': [], 'data': [ 'analytic_contract_expense_project_view.xml', ], diff --git a/addons/analytic_contract_hr_expense/__openerp__.py b/addons/analytic_contract_hr_expense/__openerp__.py index 2af987ab6f0..40029426a69 100644 --- a/addons/analytic_contract_hr_expense/__openerp__.py +++ b/addons/analytic_contract_hr_expense/__openerp__.py @@ -31,7 +31,6 @@ This module is for modifying account analytic view to show some data related to 'author': 'OpenERP S.A.', 'website': 'http://www.openerp.com/', 'depends': ['hr_expense','account_analytic_analysis'], - 'data': [], 'data': [ 'analytic_contract_hr_expense_view.xml', ], diff --git a/addons/analytic_contract_project/__openerp__.py b/addons/analytic_contract_project/__openerp__.py index 09aa56d4953..c6c672f271a 100644 --- a/addons/analytic_contract_project/__openerp__.py +++ b/addons/analytic_contract_project/__openerp__.py @@ -29,7 +29,6 @@ 'description': """ Add "Contract Data" in project view. """, - 'data' : [], 'data': ['analytic_contract_project_view.xml'], 'demo_xml': [], 'installable': True, diff --git a/addons/analytic_user_function/__openerp__.py b/addons/analytic_user_function/__openerp__.py index 3705ffe71b2..f23296012d2 100644 --- a/addons/analytic_user_function/__openerp__.py +++ b/addons/analytic_user_function/__openerp__.py @@ -41,7 +41,6 @@ compatible with older configurations. 'website': 'http://www.openerp.com', 'images': ['images/analytic_user_function.jpeg'], 'depends': ['hr_timesheet_sheet'], - 'data': [], 'data': ['analytic_user_function_view.xml', 'security/ir.model.access.csv'], 'demo': [], 'installable': True, diff --git a/addons/anonymization/__openerp__.py b/addons/anonymization/__openerp__.py index f6db94e6ac9..b0387dd626b 100644 --- a/addons/anonymization/__openerp__.py +++ b/addons/anonymization/__openerp__.py @@ -40,8 +40,6 @@ anonymization process to recover your previous data. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'data': [], - 'data': [], 'demo': [ 'anonymization_demo.xml', ], diff --git a/addons/audittrail/__openerp__.py b/addons/audittrail/__openerp__.py index adb4a9ba55c..3ba8c59a2f3 100644 --- a/addons/audittrail/__openerp__.py +++ b/addons/audittrail/__openerp__.py @@ -34,7 +34,6 @@ and can check logs. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'data': [], 'data': [ 'wizard/audittrail_view_log_view.xml', 'audittrail_view.xml', diff --git a/addons/base_action_rule/__openerp__.py b/addons/base_action_rule/__openerp__.py index b54aa53f782..cf30edba6a6 100644 --- a/addons/base_action_rule/__openerp__.py +++ b/addons/base_action_rule/__openerp__.py @@ -36,12 +36,10 @@ trigger an automatic reminder email. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base', 'mail'], - 'data': [ - 'base_action_rule_data.xml' - ], 'data': [ 'base_action_rule_view.xml', 'security/ir.model.access.csv', + 'base_action_rule_data.xml' ], 'demo': [], 'installable': True, diff --git a/addons/base_calendar/__openerp__.py b/addons/base_calendar/__openerp__.py index a8eb55a4283..e1579553673 100644 --- a/addons/base_calendar/__openerp__.py +++ b/addons/base_calendar/__openerp__.py @@ -38,10 +38,6 @@ If you need to manage your meetings, you should install the CRM module. 'author': 'OpenERP SA', 'category': 'Hidden/Dependency', 'website': 'http://www.openerp.com', - 'data': [ - 'base_calendar_data.xml', - 'crm_meeting_data.xml', - ], 'demo': ['crm_meeting_demo.xml'], 'data': [ 'security/calendar_security.xml', @@ -49,6 +45,8 @@ If you need to manage your meetings, you should install the CRM module. 'wizard/base_calendar_invite_attendee_view.xml', 'base_calendar_view.xml', 'crm_meeting_view.xml', + 'base_calendar_data.xml', + 'crm_meeting_data.xml', ], 'test' : ['test/base_calendar_test.yml'], 'installable': True, diff --git a/addons/base_iban/__openerp__.py b/addons/base_iban/__openerp__.py index 9df87d6b138..447d9a1a6a1 100644 --- a/addons/base_iban/__openerp__.py +++ b/addons/base_iban/__openerp__.py @@ -32,8 +32,7 @@ with a single statement. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'data': ['base_iban_data.xml'], - 'data': ['base_iban_view.xml'], + 'data': ['base_iban_data.xml' , 'base_iban_view.xml'], 'installable': True, 'auto_install': False, 'certificate': '0050014379549', diff --git a/addons/base_module_doc_rst/__openerp__.py b/addons/base_module_doc_rst/__openerp__.py index 11970c1bd4e..100a90dbd96 100644 --- a/addons/base_module_doc_rst/__openerp__.py +++ b/addons/base_module_doc_rst/__openerp__.py @@ -34,7 +34,6 @@ This module generates the Technical Guides of selected modules in Restructured T 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'data': [], 'data': [ 'base_module_doc_rst_view.xml', 'wizard/generate_relation_graph_view.xml', diff --git a/addons/base_module_record/__openerp__.py b/addons/base_module_record/__openerp__.py index ee1a310597c..59f968c828b 100644 --- a/addons/base_module_record/__openerp__.py +++ b/addons/base_module_record/__openerp__.py @@ -45,7 +45,6 @@ Select datetime criteria of recording and objects to be recorded and Record modu 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'wizard/base_module_record_object_view.xml', diff --git a/addons/base_report_designer/__openerp__.py b/addons/base_report_designer/__openerp__.py index 584e318ab6a..3e0ca2152da 100644 --- a/addons/base_report_designer/__openerp__.py +++ b/addons/base_report_designer/__openerp__.py @@ -34,8 +34,7 @@ Once you have modified it you can upload the report using the same wizard. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'data': ['wizard/base_report_design_view.xml'], - 'data': ['base_report_designer_installer.xml'], + 'data': ['wizard/base_report_design_view.xml' , 'base_report_designer_installer.xml'], 'demo': [], 'installable': True, 'auto_install': False, diff --git a/addons/base_status/__openerp__.py b/addons/base_status/__openerp__.py index 7fe9b667a1f..21a56d2199d 100644 --- a/addons/base_status/__openerp__.py +++ b/addons/base_status/__openerp__.py @@ -35,7 +35,6 @@ crm_case classes from crm. 'website': 'http://www.openerp.com', 'depends': ['base'], 'data': [], - 'data': [], 'demo': [], 'installable': True, 'auto_install': False, diff --git a/addons/base_tools/__openerp__.py b/addons/base_tools/__openerp__.py index 148d269f6f9..c41ee4873c2 100644 --- a/addons/base_tools/__openerp__.py +++ b/addons/base_tools/__openerp__.py @@ -11,7 +11,6 @@ Common base for tools modules. Creates menu link for Tools from where tools like survey, lunch, idea are accessible if installed. """, - 'data': [], 'data': [ 'tools_view.xml' ], diff --git a/addons/caldav/__openerp__.py b/addons/caldav/__openerp__.py index 266a7907dc0..123c8a1525c 100644 --- a/addons/caldav/__openerp__.py +++ b/addons/caldav/__openerp__.py @@ -51,7 +51,6 @@ To access OpenERP Calendar using WebCal to remote site use the URL like: 'category': 'Hidden/Dependency', 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', - 'data': ['caldav_data.xml'], 'demo': [], 'data': [ 'security/ir.model.access.csv', @@ -60,7 +59,8 @@ To access OpenERP Calendar using WebCal to remote site use the URL like: 'wizard/calendar_event_subscribe_view.xml', 'wizard/caldav_browse_view.xml', 'caldav_view.xml', - 'caldav_setup.xml' + 'caldav_setup.xml', + 'caldav_data.xml' ], 'installable': True, 'auto_install': False, diff --git a/addons/claim_from_delivery/__openerp__.py b/addons/claim_from_delivery/__openerp__.py index c103b8b4b56..9c4395927af 100644 --- a/addons/claim_from_delivery/__openerp__.py +++ b/addons/claim_from_delivery/__openerp__.py @@ -23,7 +23,6 @@ 'author' : 'OpenERP SA', 'category' : 'Warehouse Management', 'depends' : ['base', 'crm_claim', 'stock'], - 'data' : [], 'demo' : [], 'description': """ Create a claim from a delivery order. diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py index 7d7a16c9f37..a5df8eed3d6 100644 --- a/addons/crm/__openerp__.py +++ b/addons/crm/__openerp__.py @@ -74,8 +74,7 @@ Creates a dashboard for CRM that includes: 'crm_data.xml', 'crm_lead_data.xml', 'crm_phonecall_data.xml', - ], - 'data': [ + 'security/crm_security.xml', 'security/ir.model.access.csv', diff --git a/addons/crm_caldav/__openerp__.py b/addons/crm_caldav/__openerp__.py index efcb6f863ce..98a32cd1cb7 100644 --- a/addons/crm_caldav/__openerp__.py +++ b/addons/crm_caldav/__openerp__.py @@ -37,9 +37,8 @@ Caldav features in Meeting. 'data': [ 'crm_caldav_data.xml', 'crm_caldav_setup.xml', + 'crm_caldav_view.xml' ], - - 'data': ['crm_caldav_view.xml'], 'demo': [], 'installable': True, 'auto_install': False, diff --git a/addons/crm_claim/__openerp__.py b/addons/crm_claim/__openerp__.py index 4ae470c174a..429ff335ee7 100644 --- a/addons/crm_claim/__openerp__.py +++ b/addons/crm_claim/__openerp__.py @@ -34,16 +34,13 @@ automatically new claims based on incoming emails. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['crm'], - 'data': [ - 'crm_claim_data.xml', - ], - 'data': [ 'crm_claim_view.xml', 'crm_claim_menu.xml', 'security/ir.model.access.csv', 'report/crm_claim_report_view.xml', 'res_config_view.xml', + 'crm_claim_data.xml', ], 'demo': [ 'crm_claim_demo.xml', diff --git a/addons/crm_helpdesk/__openerp__.py b/addons/crm_helpdesk/__openerp__.py index fa0caf572f3..2c614177ac8 100644 --- a/addons/crm_helpdesk/__openerp__.py +++ b/addons/crm_helpdesk/__openerp__.py @@ -36,14 +36,12 @@ and categorize your interventions with a channel and a priority level. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['crm'], - 'data': [ - 'crm_helpdesk_data.xml', - ], 'data': [ 'crm_helpdesk_view.xml', 'crm_helpdesk_menu.xml', 'security/ir.model.access.csv', 'report/crm_helpdesk_report_view.xml', + 'crm_helpdesk_data.xml', ], 'demo': [ 'crm_helpdesk_demo.xml', diff --git a/addons/crm_profiling/__openerp__.py b/addons/crm_profiling/__openerp__.py index 965025df08d..a8021e6fa8d 100644 --- a/addons/crm_profiling/__openerp__.py +++ b/addons/crm_profiling/__openerp__.py @@ -41,7 +41,6 @@ were overlapping. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base', 'crm'], - 'data': [], 'data': ['security/ir.model.access.csv', 'wizard/open_questionnaire_view.xml', 'crm_profiling_view.xml'], 'demo': ['crm_profiling_demo.xml'], 'test': [ diff --git a/addons/decimal_precision/__openerp__.py b/addons/decimal_precision/__openerp__.py index 24293908df2..107fb49a1c5 100644 --- a/addons/decimal_precision/__openerp__.py +++ b/addons/decimal_precision/__openerp__.py @@ -31,7 +31,6 @@ The decimal precision is configured per company. 'version': '0.1', 'depends': ['base'], 'category' : 'Hidden/Dependency', - 'data': [], 'data': [ 'decimal_precision_view.xml', 'security/ir.model.access.csv', diff --git a/addons/delivery/__openerp__.py b/addons/delivery/__openerp__.py index 82b6949f1c0..03bb2662b77 100644 --- a/addons/delivery/__openerp__.py +++ b/addons/delivery/__openerp__.py @@ -33,12 +33,12 @@ invoices from picking, OpenERP is able to add and compute the shipping line. """, 'author': 'OpenERP SA', 'depends': ['sale', 'purchase', 'stock'], - 'data': ['delivery_data.xml'], 'data': [ 'security/ir.model.access.csv', 'delivery_report.xml', 'delivery_view.xml', - 'partner_view.xml' + 'partner_view.xml', + 'delivery_data.xml' ], 'demo': ['delivery_demo.xml'], 'test': [ diff --git a/addons/document/__openerp__.py b/addons/document/__openerp__.py index 1ff48f12e0f..26f338d2b7f 100644 --- a/addons/document/__openerp__.py +++ b/addons/document/__openerp__.py @@ -45,7 +45,6 @@ ATTENTION: 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['process','board', 'knowledge'], - 'data': [], 'data': [ 'security/document_security.xml', 'document_view.xml', diff --git a/addons/document_ftp/__openerp__.py b/addons/document_ftp/__openerp__.py index a1676766054..f8968d6c3df 100644 --- a/addons/document_ftp/__openerp__.py +++ b/addons/document_ftp/__openerp__.py @@ -35,7 +35,6 @@ FTP client. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base', 'document'], - 'data': [], 'data': [ 'wizard/ftp_configuration_view.xml', 'wizard/ftp_browse_view.xml', diff --git a/addons/document_page/__openerp__.py b/addons/document_page/__openerp__.py index b5c1443e1a8..274d3e4d29d 100644 --- a/addons/document_page/__openerp__.py +++ b/addons/document_page/__openerp__.py @@ -31,7 +31,6 @@ Web pages 'author': ['OpenERP SA'], 'website': 'http://www.openerp.com/', 'depends': ['knowledge'], - 'data': [], 'data': [ 'wizard/document_page_create_menu_view.xml', 'wizard/document_page_show_diff_view.xml', diff --git a/addons/document_webdav/__openerp__.py b/addons/document_webdav/__openerp__.py index c2c10f1a2ea..58eb3e4924f 100644 --- a/addons/document_webdav/__openerp__.py +++ b/addons/document_webdav/__openerp__.py @@ -59,7 +59,6 @@ Also implements IETF RFC 5785 for services discovery on a http server, which needs explicit configuration in openerp-server.conf too. """, 'depends' : ['base', 'document'], - 'data' : [], 'data' : ['security/ir.model.access.csv', 'webdav_view.xml', 'webdav_setup.xml', diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py index 347bb6aa270..8e611e4fe20 100644 --- a/addons/event/__openerp__.py +++ b/addons/event/__openerp__.py @@ -41,7 +41,6 @@ Note that: """, 'author': 'OpenERP SA', 'depends': ['base_setup', 'board', 'email_template', 'google_map'], - 'data': [], 'data': [ 'security/event_security.xml', 'security/ir.model.access.csv', diff --git a/addons/event_moodle/__openerp__.py b/addons/event_moodle/__openerp__.py index e2f41da4e43..438b8d20a29 100644 --- a/addons/event_moodle/__openerp__.py +++ b/addons/event_moodle/__openerp__.py @@ -61,7 +61,6 @@ PASSWORD: ${object.moodle_user_password} """, 'author': 'OpenERP SA', 'depends': ['event'], - 'data': [], 'data': [ 'wizard_moodle.xml', 'event_view.xml', diff --git a/addons/event_project/__openerp__.py b/addons/event_project/__openerp__.py index 55595e7f113..b6710c8bac4 100644 --- a/addons/event_project/__openerp__.py +++ b/addons/event_project/__openerp__.py @@ -32,7 +32,6 @@ This module allows you to create retro planning for managing your events. 'author': 'OpenERP SA', 'images': ['images/event.jpeg'], 'depends': ['project_retro_planning', 'event'], - 'data': [], 'data': ['wizard/event_project_retro_view.xml', 'event_project_view.xml'], 'demo': [], 'installable': True, diff --git a/addons/fetchmail/__openerp__.py b/addons/fetchmail/__openerp__.py index 05ee67d77fe..10685cb847b 100644 --- a/addons/fetchmail/__openerp__.py +++ b/addons/fetchmail/__openerp__.py @@ -56,7 +56,6 @@ For more specific needs, you may also assign custom-defined actions (technically: Server Actions) to be triggered for each incoming mail. """, 'website': 'http://www.openerp.com', - 'data': [], 'data': [ 'fetchmail_view.xml', 'fetchmail_data.xml', diff --git a/addons/google_base_account/__openerp__.py b/addons/google_base_account/__openerp__.py index cf2632dd555..226bb87430f 100644 --- a/addons/google_base_account/__openerp__.py +++ b/addons/google_base_account/__openerp__.py @@ -28,7 +28,6 @@ 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'data': [], 'data': [ 'google_base_account_view.xml', 'wizard/google_login_view.xml', diff --git a/addons/google_map/__openerp__.py b/addons/google_map/__openerp__.py index b649aea85f2..f5577b17994 100644 --- a/addons/google_map/__openerp__.py +++ b/addons/google_map/__openerp__.py @@ -34,7 +34,6 @@ Using this you can directly open Google Map from the URL widget.""", 'images': ['images/google_map.jpeg'], 'depends': ['base'], 'data': [], - 'data': [ ], 'demo': [], 'js': ['static/src/js/google_map.js'], 'installable': True, diff --git a/addons/hr/__openerp__.py b/addons/hr/__openerp__.py index 04874824d40..08ca8b025e9 100644 --- a/addons/hr/__openerp__.py +++ b/addons/hr/__openerp__.py @@ -45,7 +45,6 @@ You can manage: 'static/src/img/default_image.png', ], 'depends': ['base_setup','mail', 'resource', 'board'], - 'data': [], 'data': [ 'security/hr_security.xml', 'security/ir.model.access.csv', diff --git a/addons/hr_contract/__openerp__.py b/addons/hr_contract/__openerp__.py index c6afd625a84..a492cb3b08f 100644 --- a/addons/hr_contract/__openerp__.py +++ b/addons/hr_contract/__openerp__.py @@ -39,10 +39,10 @@ You can assign several contracts per employee. 'website': 'http://www.openerp.com', 'images': ['images/hr_contract.jpeg'], 'depends': ['hr'], - 'data': ['hr_contract_data.xml'], 'data': [ 'security/ir.model.access.csv', - 'hr_contract_view.xml' + 'hr_contract_view.xml', + 'hr_contract_data.xml' ], 'demo': [], 'test': [ diff --git a/addons/hr_expense/__openerp__.py b/addons/hr_expense/__openerp__.py index b0e1d8f1d1a..0430d8b9538 100644 --- a/addons/hr_expense/__openerp__.py +++ b/addons/hr_expense/__openerp__.py @@ -45,7 +45,6 @@ re-invoice your customer's expenses if your work by project. 'website': 'http://www.openerp.com', 'images': ['images/hr_expenses_analysis.jpeg', 'images/hr_expenses.jpeg'], 'depends': ['hr', 'account'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'hr_expense_data.xml', diff --git a/addons/hr_holidays/__openerp__.py b/addons/hr_holidays/__openerp__.py index a2df68a1cc2..268a07b460c 100644 --- a/addons/hr_holidays/__openerp__.py +++ b/addons/hr_holidays/__openerp__.py @@ -56,7 +56,6 @@ Note that: """, 'images': ['images/hr_allocation_requests.jpeg', 'images/hr_leave_requests.jpeg', 'images/leaves_analysis.jpeg'], 'depends': ['hr', 'base_calendar', 'process', 'resource'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'security/ir_rule.xml', diff --git a/addons/hr_payroll/__openerp__.py b/addons/hr_payroll/__openerp__.py index eaaeea6fbfb..c5a411e387b 100644 --- a/addons/hr_payroll/__openerp__.py +++ b/addons/hr_payroll/__openerp__.py @@ -46,8 +46,6 @@ Generic Payroll system. 'hr_holidays', 'decimal_precision', ], - 'data': [ - ], 'data': [ 'security/hr_security.xml', 'wizard/hr_payroll_payslips_by_employees.xml', diff --git a/addons/hr_payroll_account/__openerp__.py b/addons/hr_payroll_account/__openerp__.py index 05677f7ae0d..7f6ab8efdd6 100644 --- a/addons/hr_payroll_account/__openerp__.py +++ b/addons/hr_payroll_account/__openerp__.py @@ -39,8 +39,6 @@ Generic Payroll system Integrated with Accounting. 'account', 'hr_expense' ], - 'data': [ - ], 'data': [ 'hr_payroll_account_view.xml', ], diff --git a/addons/hr_timesheet/__openerp__.py b/addons/hr_timesheet/__openerp__.py index d0d185fb1e9..2162b6095e8 100644 --- a/addons/hr_timesheet/__openerp__.py +++ b/addons/hr_timesheet/__openerp__.py @@ -41,7 +41,6 @@ up a management by affair. 'website': 'http://www.openerp.com', 'images': ['images/hr_timesheet_lines.jpeg'], 'depends': ['account', 'hr', 'base', 'hr_attendance', 'process'], - 'data': ['hr_timesheet_data.xml'], 'data': [ 'security/ir.model.access.csv', 'security/hr_timesheet_security.xml', @@ -53,6 +52,7 @@ up a management by affair. 'wizard/hr_timesheet_print_users_view.xml', 'wizard/hr_timesheet_sign_in_out_view.xml', 'hr_timesheet_installer.xml', + 'hr_timesheet_data.xml' ], 'demo': ['hr_timesheet_demo.xml'], 'test': [ diff --git a/addons/hr_timesheet_sheet/__openerp__.py b/addons/hr_timesheet_sheet/__openerp__.py index 450e8d5dd14..3d1cde509bc 100644 --- a/addons/hr_timesheet_sheet/__openerp__.py +++ b/addons/hr_timesheet_sheet/__openerp__.py @@ -51,7 +51,6 @@ The validation can be configured in the company: 'website': 'http://www.openerp.com', 'images': ['images/hr_my_timesheet.jpeg','images/hr_timesheet_analysis.jpeg','images/hr_timesheet_sheet_analysis.jpeg','images/hr_timesheets.jpeg'], 'depends': ['hr_timesheet', 'hr_timesheet_invoice', 'process'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'security/hr_timesheet_sheet_security.xml', diff --git a/addons/idea/__openerp__.py b/addons/idea/__openerp__.py index 9d1b0a145a5..c8c8d87c711 100644 --- a/addons/idea/__openerp__.py +++ b/addons/idea/__openerp__.py @@ -36,7 +36,6 @@ Once installed, check the menu 'Ideas' in the 'Tools' main menu.""", 'author': 'OpenERP SA', 'website': 'http://openerp.com', 'depends': ['base_tools','mail'], - 'data': [], 'data': [ 'security/idea_security.xml', 'security/ir.model.access.csv', diff --git a/addons/import_base/__openerp__.py b/addons/import_base/__openerp__.py index 993c11de7ae..ce1941d874c 100644 --- a/addons/import_base/__openerp__.py +++ b/addons/import_base/__openerp__.py @@ -30,7 +30,6 @@ other software. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base','mail'], - 'data': [], 'data': ['import_base_view.xml'], 'demo': [], 'test': [], #TODO provide test diff --git a/addons/import_google/__openerp__.py b/addons/import_google/__openerp__.py index 3ab23e4c0c5..2d9cdc4782b 100644 --- a/addons/import_google/__openerp__.py +++ b/addons/import_google/__openerp__.py @@ -27,7 +27,6 @@ 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base', 'import_base', 'google_base_account', 'base_calendar'], - 'data': [], 'data': ['security/ir.model.access.csv', 'sync_google_calendar_view.xml', 'wizard/import_google_data_view.xml', diff --git a/addons/knowledge/__openerp__.py b/addons/knowledge/__openerp__.py index f3032fc334e..14b2d045d6c 100644 --- a/addons/knowledge/__openerp__.py +++ b/addons/knowledge/__openerp__.py @@ -34,7 +34,6 @@ Makes the Knowledge Application Configuration available from where you can insta document and Wiki based Hidden. """, 'website': 'http://www.openerp.com', - 'data': [], 'data': [ 'security/knowledge_security.xml', 'security/ir.model.access.csv', diff --git a/addons/l10n_ar/__openerp__.py b/addons/l10n_ar/__openerp__.py index 0cc0419a9bc..77869967098 100644 --- a/addons/l10n_ar/__openerp__.py +++ b/addons/l10n_ar/__openerp__.py @@ -40,7 +40,6 @@ Plan contable argentino e impuestos de acuerdo a disposiciones vigentes 'l10n_ar_wizard.xml', ], 'demo': [], - 'data': [], 'active': False, 'installable': True, 'images': ['images/config_chart_l10n_ar.jpeg','images/l10n_ar_chart.jpeg'], diff --git a/addons/l10n_be/__openerp__.py b/addons/l10n_be/__openerp__.py index 7540ca4ad01..c543e83dd2d 100644 --- a/addons/l10n_be/__openerp__.py +++ b/addons/l10n_be/__openerp__.py @@ -54,7 +54,6 @@ Wizards provided by this module: 'account_chart', 'account_coda', ], - 'data': [], 'data': [ 'account_financial_report.xml', 'account_pcmn_belgium.xml', diff --git a/addons/l10n_be_invoice_bba/__openerp__.py b/addons/l10n_be_invoice_bba/__openerp__.py index 76c24906237..f7cd4393cc7 100644 --- a/addons/l10n_be_invoice_bba/__openerp__.py +++ b/addons/l10n_be_invoice_bba/__openerp__.py @@ -49,7 +49,6 @@ generated if no algorithm is specified on the Partner record. """, 'depends': ['account'], 'demo': [], - 'data': [], 'data' : [ 'partner_view.xml', 'account_invoice_view.xml', diff --git a/addons/l10n_br/__openerp__.py b/addons/l10n_br/__openerp__.py index c887baa92f9..522fdd11eef 100644 --- a/addons/l10n_br/__openerp__.py +++ b/addons/l10n_br/__openerp__.py @@ -71,11 +71,9 @@ for online use of 'private modules'.""", 'data/account_tax_template.xml', 'data/l10n_br_data.xml', 'security/ir.model.access.csv', - ], - 'data': [ 'account_view.xml', 'l10n_br_view.xml', - ], + ], 'installable': True, 'certificate' : '001280994939126801405', } diff --git a/addons/l10n_ca/__openerp__.py b/addons/l10n_ca/__openerp__.py index 6888fa80e4d..a132cadf674 100644 --- a/addons/l10n_ca/__openerp__.py +++ b/addons/l10n_ca/__openerp__.py @@ -31,7 +31,6 @@ This is the module to manage the English and French - Canadian accounting chart Canadian accounting charts and localizations. """, 'depends' : ['base', 'account', 'base_iban', 'base_vat', 'account_chart'], - 'data' : [], 'data' : [ 'account_chart_en.xml', 'account_tax_code_en.xml', diff --git a/addons/l10n_ch/__openerp__.py b/addons/l10n_ch/__openerp__.py index c75e32eb044..25de976b737 100644 --- a/addons/l10n_ch/__openerp__.py +++ b/addons/l10n_ch/__openerp__.py @@ -79,20 +79,18 @@ TODO : 'sterchi_chart/account.xml', 'sterchi_chart/vat.xml', 'sterchi_chart/vat2011.xml', - 'sterchi_chart/fiscal_position.xml'], + 'sterchi_chart/fiscal_position.xml', + 'wizard.xml', + 'wizard/bvr_import_view.xml', + 'wizard/create_dta_view.xml', + 'company_view.xml', + 'account_invoice.xml', + 'bank_view.xml', + 'security/ir.model.access.csv', + 'report/report_webkit_html_view.xml'], 'demo': ['demo/demo.xml', 'demo/dta_demo.xml'], - - 'data': ['wizard.xml', - 'wizard/bvr_import_view.xml', - 'wizard/create_dta_view.xml', - 'company_view.xml', - 'account_invoice.xml', - 'bank_view.xml', - 'security/ir.model.access.csv', - 'report/report_webkit_html_view.xml'], - 'test': ['test/l10n_ch_report.yml', 'test/l10n_ch_dta.yml', #TODO: uncomment the 2 following tests once they are fixed diff --git a/addons/l10n_cl/__openerp__.py b/addons/l10n_cl/__openerp__.py index 19c499d9f7d..0d2cc4025a8 100644 --- a/addons/l10n_cl/__openerp__.py +++ b/addons/l10n_cl/__openerp__.py @@ -40,7 +40,6 @@ Plan contable chileno e impuestos de acuerdo a disposiciones vigentes 'l10n_cl_wizard.xml', ], 'demo': [], - 'data': [], 'active': False, 'installable': True, 'images': ['images/config_chart_l10n_cl.jpeg','images/l10n_cl_chart.jpeg'], diff --git a/addons/l10n_cn/__openerp__.py b/addons/l10n_cn/__openerp__.py index f69c7b04205..a504f304fa0 100644 --- a/addons/l10n_cn/__openerp__.py +++ b/addons/l10n_cn/__openerp__.py @@ -31,13 +31,11 @@ ============================================================ """, 'depends' : ['base','account'], - 'data': [ - 'base_data.xml', - ], 'demo' : [], 'data' : [ 'account_chart.xml', 'l10n_chart_cn_wizard.xml', + 'base_data.xml', ], 'license': 'GPL-3', 'auto_install': False, diff --git a/addons/l10n_cr/__openerp__.py b/addons/l10n_cr/__openerp__.py index 410170543e3..1434614e919 100644 --- a/addons/l10n_cr/__openerp__.py +++ b/addons/l10n_cr/__openerp__.py @@ -54,7 +54,6 @@ Everything is in English with Spanish translation. Further translations are welc please go to http://translations.launchpad.net/openerp-costa-rica. """, 'depends': ['account', 'account_chart', 'base'], - 'data': [], 'demo': [], 'data': [ 'l10n_cr_base_data.xml', diff --git a/addons/l10n_de/__openerp__.py b/addons/l10n_de/__openerp__.py index f3a1cfa6c35..1cc45df5dac 100644 --- a/addons/l10n_de/__openerp__.py +++ b/addons/l10n_de/__openerp__.py @@ -133,7 +133,6 @@ Dieses Modul beinhaltet einen deutschen Kontenrahmen basierend auf dem SKR03. German accounting chart and localization. """, 'depends' : ['base', 'account', 'base_iban', 'base_vat', 'account_chart'], - 'data' : [ ], 'demo' : [ ], 'data' : [ 'account_tax_skr03.xml', diff --git a/addons/l10n_ec/__openerp__.py b/addons/l10n_ec/__openerp__.py index a1c062f5232..e581f31f64f 100644 --- a/addons/l10n_ec/__openerp__.py +++ b/addons/l10n_ec/__openerp__.py @@ -35,7 +35,6 @@ Accounting chart and localization for Ecuador. 'account_chart', 'account_coda', ], - 'data': [], 'data': [ 'account_tax_code.xml', 'account_chart.xml', diff --git a/addons/l10n_es/__openerp__.py b/addons/l10n_es/__openerp__.py index 6022f5ed31b..c4a7d6de9bf 100644 --- a/addons/l10n_es/__openerp__.py +++ b/addons/l10n_es/__openerp__.py @@ -52,8 +52,6 @@ Note: You should install the l10n_ES_account_balance_report module for yearly 'l10n_es_wizard.xml' ], 'demo' : [], - 'data' : [ - ], 'auto_install': False, 'installable': True, 'certificate' : '00408828172062583229', diff --git a/addons/l10n_fr/__openerp__.py b/addons/l10n_fr/__openerp__.py index 1ecfefb3bf9..86379a30083 100644 --- a/addons/l10n_fr/__openerp__.py +++ b/addons/l10n_fr/__openerp__.py @@ -54,7 +54,6 @@ configuration of their taxes and fiscal positions manually. Credits: Sistheo, Zeekom, CrysaLEAD, Akretion and Camptocamp. """, 'depends' : ['base_iban', 'account', 'account_chart', 'base_vat', 'l10n_fr_rib'], - 'data' : [], 'data' : [ 'fr_report.xml', 'plan_comptable_general.xml', diff --git a/addons/l10n_fr_rib/__openerp__.py b/addons/l10n_fr_rib/__openerp__.py index 208ca7b44c0..852db1895c8 100644 --- a/addons/l10n_fr_rib/__openerp__.py +++ b/addons/l10n_fr_rib/__openerp__.py @@ -48,8 +48,7 @@ Accounts in OpenERP: the first with the type 'RIB', the second with the type 'IB """, 'author' : u'Numérigraphe SARL', 'depends': ['account', 'base_iban'], - 'data': ['bank_data.xml', ], - 'data': ['bank_view.xml', ], + 'data': ['bank_data.xml', 'bank_view.xml'], 'installable': True, 'certificate': '003407950790', 'auto_install': False, diff --git a/addons/l10n_gr/__openerp__.py b/addons/l10n_gr/__openerp__.py index 32b4a1b724e..f021941ecc8 100644 --- a/addons/l10n_gr/__openerp__.py +++ b/addons/l10n_gr/__openerp__.py @@ -32,7 +32,6 @@ This is the base module to manage the accounting chart for Greece. Greek accounting chart and localization. """, 'depends' : ['base', 'account', 'base_iban', 'base_vat', 'account_chart'], - 'data' : [], 'demo' : [], 'data' : [ 'account_types.xml', 'account_chart.xml', diff --git a/addons/l10n_gt/__openerp__.py b/addons/l10n_gt/__openerp__.py index af6711eb674..e36e418ee21 100644 --- a/addons/l10n_gt/__openerp__.py +++ b/addons/l10n_gt/__openerp__.py @@ -46,7 +46,6 @@ taxes and the Quetzal currency.""", 'author': 'José Rodrigo Fernández Menegazzo', 'website': 'http://solucionesprisma.com/', 'depends': ['base', 'account', 'account_chart'], - 'data': [], 'data': [ 'account_types.xml', 'account_chart.xml', diff --git a/addons/l10n_hn/__openerp__.py b/addons/l10n_hn/__openerp__.py index e44a94d3204..ad5baacb77d 100644 --- a/addons/l10n_hn/__openerp__.py +++ b/addons/l10n_hn/__openerp__.py @@ -43,7 +43,6 @@ and the Lempira currency.""", 'author': 'Salvatore Josue Trimarchi Pinto', 'website': 'http://trimarchi.co.cc', 'depends': ['base', 'account', 'account_chart'], - 'data': [], 'data': [ 'account_types.xml', 'account_chart.xml', diff --git a/addons/l10n_it/__openerp__.py b/addons/l10n_it/__openerp__.py index 71ad9b68a12..b1687de7b13 100644 --- a/addons/l10n_it/__openerp__.py +++ b/addons/l10n_it/__openerp__.py @@ -41,8 +41,6 @@ Italian accounting chart and localization. 'license': 'AGPL-3', 'category' : 'Localization/Account Charts', 'website': 'http://www.openerp-italia.org/', - 'data': [ - ], 'data': [ 'data/account.account.template.csv', 'data/account.tax.code.template.csv', diff --git a/addons/l10n_lu/__openerp__.py b/addons/l10n_lu/__openerp__.py index ae72fbe212c..70f30444a3e 100644 --- a/addons/l10n_lu/__openerp__.py +++ b/addons/l10n_lu/__openerp__.py @@ -34,7 +34,6 @@ This is the base module to manage the accounting chart for Luxembourg. 'author': 'OpenERP SA', 'website': 'http://openerp.com', 'depends': ['account', 'base_vat', 'base_iban'], - 'data': [], 'data': [ 'account.tax.code.template.csv', 'l10n_lu_data.xml', diff --git a/addons/l10n_ma/__openerp__.py b/addons/l10n_ma/__openerp__.py index 9266ef0c6a1..a61137d7f93 100644 --- a/addons/l10n_ma/__openerp__.py +++ b/addons/l10n_ma/__openerp__.py @@ -35,7 +35,6 @@ L'intégration comptable a été validé avec l'aide du Cabinet d'expertise comp Seddik au cours du troisième trimestre 2010.""", 'website': 'http://www.kazacube.com', 'depends' : ['base', 'account'], - 'data' : [], 'data' : [ 'security/compta_security.xml', 'security/ir.model.access.csv', diff --git a/addons/l10n_multilang/__openerp__.py b/addons/l10n_multilang/__openerp__.py index 944d6a356a5..d140ef41235 100644 --- a/addons/l10n_multilang/__openerp__.py +++ b/addons/l10n_multilang/__openerp__.py @@ -32,7 +32,6 @@ templates to target objects. """, 'website': 'http://www.openerp.com', - 'data': [], 'depends' : ['account_accountant'], 'data': [], 'demo': [], diff --git a/addons/l10n_nl/__openerp__.py b/addons/l10n_nl/__openerp__.py index 3dca32c22b6..0fcda46ed2b 100644 --- a/addons/l10n_nl/__openerp__.py +++ b/addons/l10n_nl/__openerp__.py @@ -122,7 +122,6 @@ De extra cijfers worden dan achter het rekeningnummer aangevult met 'nullen'. 'base_iban', 'account_chart' ], - 'data' : [], 'data' : ['account_chart_netherlands.xml', 'l10n_nl_wizard.xml' ], diff --git a/addons/l10n_pe/__openerp__.py b/addons/l10n_pe/__openerp__.py index aa1f0936a9a..22f84b3f24d 100644 --- a/addons/l10n_pe/__openerp__.py +++ b/addons/l10n_pe/__openerp__.py @@ -42,8 +42,6 @@ SUNAT 2011 (PCGE 2010). ], 'demo': [ ], - 'data': [ - ], 'active': False, 'installable': True, 'certificate' : '0045046493412', diff --git a/addons/l10n_syscohada/__openerp__.py b/addons/l10n_syscohada/__openerp__.py index 8fcc87baf9f..3db14012e98 100644 --- a/addons/l10n_syscohada/__openerp__.py +++ b/addons/l10n_syscohada/__openerp__.py @@ -37,7 +37,6 @@ Countries that use OHADA are the following: 'website': 'http://www.baamtu.com', 'depends' : ['account', 'base_vat'], 'demo' : [], - 'data':[], 'data' : ['l10n_syscohada_data.xml','l10n_syscohada_wizard.xml'], 'auto_install': False, 'installable': True diff --git a/addons/l10n_th/__openerp__.py b/addons/l10n_th/__openerp__.py index 7efb1d6996a..d2c5d07142a 100644 --- a/addons/l10n_th/__openerp__.py +++ b/addons/l10n_th/__openerp__.py @@ -32,7 +32,6 @@ Thai accounting chart and localization. 'author': 'Almacom', 'website': 'http://almacom.co.th/', 'depends': ['account_chart'], - 'data': [], 'data': [ 'account_data.xml' ], 'installable': True, 'certificate' : '00722263103978957725', diff --git a/addons/l10n_tr/__openerp__.py b/addons/l10n_tr/__openerp__.py index 579756ab0f3..32780202884 100644 --- a/addons/l10n_tr/__openerp__.py +++ b/addons/l10n_tr/__openerp__.py @@ -38,7 +38,6 @@ Bu modül kurulduktan sonra, Muhasebe yapılandırma sihirbazı çalışır 'base_vat', 'account_chart', ], - 'data': [], 'data': [ 'account_code_template.xml', 'account_tdhp_turkey.xml', diff --git a/addons/l10n_uk/__openerp__.py b/addons/l10n_uk/__openerp__.py index b6269fececc..4291704307c 100644 --- a/addons/l10n_uk/__openerp__.py +++ b/addons/l10n_uk/__openerp__.py @@ -33,7 +33,6 @@ for UK SME's with: 'author': 'SmartMode LTD', 'website': 'http://www.smartmode.co.uk', 'depends': ['base_iban', 'base_vat', 'account_chart'], - 'data': [], 'data': [ 'data/account.account.type.csv', 'data/account.account.template.csv', diff --git a/addons/l10n_us/__openerp__.py b/addons/l10n_us/__openerp__.py index 91e4224c8d0..23b20ebb0d5 100644 --- a/addons/l10n_us/__openerp__.py +++ b/addons/l10n_us/__openerp__.py @@ -27,7 +27,6 @@ United States - Chart of accounts. """, 'website': 'http://www.openerp.com', - 'data': [], 'depends': [ 'account_chart', ], diff --git a/addons/l10n_uy/__openerp__.py b/addons/l10n_uy/__openerp__.py index 5c00893ffc4..c931f3b362c 100644 --- a/addons/l10n_uy/__openerp__.py +++ b/addons/l10n_uy/__openerp__.py @@ -38,7 +38,6 @@ Provide Templates for Chart of Accounts, Taxes for Uruguay. 'depends' : [ 'account', ], - 'data' : [], 'data': [ 'account_types.xml', 'taxes_code_template.xml', diff --git a/addons/lunch/__openerp__.py b/addons/lunch/__openerp__.py index 0ee2e792b6b..f84edb1db35 100644 --- a/addons/lunch/__openerp__.py +++ b/addons/lunch/__openerp__.py @@ -32,7 +32,6 @@ The base module to manage lunch. keep track for the Lunch Order, Cash Moves, CashBox, Product. Apply Different Category for the product. """, - 'data': [], 'data': [ 'security/lunch_security.xml', 'security/ir.model.access.csv', diff --git a/addons/marketing/__openerp__.py b/addons/marketing/__openerp__.py index ac569316d66..65329783933 100644 --- a/addons/marketing/__openerp__.py +++ b/addons/marketing/__openerp__.py @@ -33,7 +33,6 @@ Menu for Marketing. Contains the installer for marketing-related modules. """, 'website': 'http://www.openerp.com', - 'data': [], 'data': [ 'security/marketing_security.xml', 'security/ir.model.access.csv', diff --git a/addons/marketing_campaign/__openerp__.py b/addons/marketing_campaign/__openerp__.py index 170dd7e59cc..408ec3ce40a 100644 --- a/addons/marketing_campaign/__openerp__.py +++ b/addons/marketing_campaign/__openerp__.py @@ -54,7 +54,6 @@ Note: If you need demo data, you can install the marketing_campaign_crm_demo CRM Leads. """, 'website': 'http://www.openerp.com', - 'data': [], 'data': [ 'marketing_campaign_view.xml', 'marketing_campaign_data.xml', diff --git a/addons/marketing_campaign_crm_demo/__openerp__.py b/addons/marketing_campaign_crm_demo/__openerp__.py index e583ecdaeb3..558469b00c0 100644 --- a/addons/marketing_campaign_crm_demo/__openerp__.py +++ b/addons/marketing_campaign_crm_demo/__openerp__.py @@ -36,7 +36,6 @@ Creates demo data like leads, campaigns and segments for the module marketing_ca """, 'website': 'http://www.openerp.com', 'data': [], - 'data': [], 'demo': [ 'marketing_campaign_demo.xml', ], diff --git a/addons/membership/__openerp__.py b/addons/membership/__openerp__.py index ea23642d95b..4a26eec4e57 100644 --- a/addons/membership/__openerp__.py +++ b/addons/membership/__openerp__.py @@ -39,13 +39,13 @@ invoice and send propositions for membership renewal. """, 'author': 'OpenERP SA', 'depends': ['base', 'product', 'account', 'process'], - 'data': ['membership_data.xml'], 'data': [ 'security/ir.model.access.csv', 'wizard/membership_invoice_view.xml', 'membership_view.xml', 'report/report_membership_view.xml', - 'process/membership_process.xml' + 'process/membership_process.xml', + 'membership_data.xml' ], 'demo': ['membership_demo.xml'], 'test': ['test/test_membership.yml'], diff --git a/addons/mrp/__openerp__.py b/addons/mrp/__openerp__.py index af4090b0dd0..87bce75be26 100644 --- a/addons/mrp/__openerp__.py +++ b/addons/mrp/__openerp__.py @@ -67,7 +67,6 @@ Dashboard provided by this module: * List of next production orders * Graph of stock value variation """, - 'data': [], 'data': [ 'security/mrp_security.xml', 'security/ir.model.access.csv', diff --git a/addons/mrp_operations/__openerp__.py b/addons/mrp_operations/__openerp__.py index 707a0d64767..1da48b0b8f4 100644 --- a/addons/mrp_operations/__openerp__.py +++ b/addons/mrp_operations/__openerp__.py @@ -54,7 +54,6 @@ So, that we can compare the theoretic delay and real delay. 'website': 'http://www.openerp.com', 'images': ['images/work_order_analysis.jpeg','images/work_order_planning.jpeg','images/work_order.jpeg'], 'depends': ['mrp'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'mrp_operations_workflow.xml', diff --git a/addons/mrp_subproduct/__openerp__.py b/addons/mrp_subproduct/__openerp__.py index 24925349677..e1d5cc3d02f 100644 --- a/addons/mrp_subproduct/__openerp__.py +++ b/addons/mrp_subproduct/__openerp__.py @@ -40,7 +40,6 @@ With this module: 'website': 'http://www.openerp.com', 'images': ['images/bom_subproduct.jpeg'], 'depends': ['base', 'mrp'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'mrp_subproduct_view.xml' diff --git a/addons/multi_company/__openerp__.py b/addons/multi_company/__openerp__.py index e1150eb49a2..6001e539d9e 100644 --- a/addons/multi_company/__openerp__.py +++ b/addons/multi_company/__openerp__.py @@ -37,7 +37,6 @@ This module is the base module for other multi-company modules. 'sale', 'project', ], - 'data': [], 'data': [ 'res_company_view.xml' ], diff --git a/addons/pad_project/__openerp__.py b/addons/pad_project/__openerp__.py index 5f511cac45c..a6a86166613 100644 --- a/addons/pad_project/__openerp__.py +++ b/addons/pad_project/__openerp__.py @@ -29,7 +29,6 @@ This module adds a PAD in all project kanban views. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['project', 'pad'], - 'data': [], 'data': ['project_task.xml'], 'demo': [], 'installable': True, diff --git a/addons/plugin_outlook/__openerp__.py b/addons/plugin_outlook/__openerp__.py index 72ad304f7c9..3f26399e71f 100644 --- a/addons/plugin_outlook/__openerp__.py +++ b/addons/plugin_outlook/__openerp__.py @@ -36,7 +36,6 @@ your email and its attachments from MS Outlook. You can select a partner, a task a project, an analytical account, or any other object and archive selected mail into mail.message with attachments. """, - 'data' : [], 'demo' : [], 'data' : ['plugin_outlook.xml'], 'auto_install': False, diff --git a/addons/plugin_thunderbird/__openerp__.py b/addons/plugin_thunderbird/__openerp__.py index 9e673dbef12..54e05603e53 100644 --- a/addons/plugin_thunderbird/__openerp__.py +++ b/addons/plugin_thunderbird/__openerp__.py @@ -36,7 +36,6 @@ account, or any other object and attach the selected mail as a .eml file in the attachment of a selected record. You can create documents for CRM Lead, HR Applicant and Project Issue from selected mails. """, - 'data' : [], 'demo' : [], 'data' : ['plugin_thunderbird.xml'], 'auto_install': False, diff --git a/addons/point_of_sale/__openerp__.py b/addons/point_of_sale/__openerp__.py index 3a277498c29..df717b3d4ff 100644 --- a/addons/point_of_sale/__openerp__.py +++ b/addons/point_of_sale/__openerp__.py @@ -42,8 +42,6 @@ Main features: 'author': 'OpenERP SA', 'images': ['images/cash_registers.jpeg', 'images/pos_analysis.jpeg','images/register_analysis.jpeg','images/sale_order_pos.jpeg','images/product_pos.jpeg'], 'depends': ['sale'], - 'data': [], - 'data': [ 'security/point_of_sale_security.xml', 'security/ir.model.access.csv', diff --git a/addons/process/__openerp__.py b/addons/process/__openerp__.py index 64142b1084d..6992e4a952e 100644 --- a/addons/process/__openerp__.py +++ b/addons/process/__openerp__.py @@ -35,7 +35,6 @@ e.g product/process/product_process.xml. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'process_view.xml' diff --git a/addons/procurement/__openerp__.py b/addons/procurement/__openerp__.py index 405f916688f..21f83b8dafc 100644 --- a/addons/procurement/__openerp__.py +++ b/addons/procurement/__openerp__.py @@ -43,7 +43,6 @@ for the product which needs replenishment. This procurement will start a task, either a purchase order form for the supplier, or a production order depending on the product's configuration. """, - 'data': [], 'data': [ 'security/ir.model.access.csv', 'security/procurement_security.xml', diff --git a/addons/product/__openerp__.py b/addons/product/__openerp__.py index b733c3abab7..8286165f98f 100644 --- a/addons/product/__openerp__.py +++ b/addons/product/__openerp__.py @@ -26,7 +26,6 @@ 'author' : 'OpenERP SA', 'category': 'Sales Management', 'depends' : ['base', 'process', 'decimal_precision', 'mail'], - 'data' : [], 'demo' : ['product_demo.xml', 'product_image_demo.xml'], 'description': """ This is the base module for managing products and pricelists in OpenERP. diff --git a/addons/product_expiry/__openerp__.py b/addons/product_expiry/__openerp__.py index 90eaeb48f0b..7444d282087 100644 --- a/addons/product_expiry/__openerp__.py +++ b/addons/product_expiry/__openerp__.py @@ -23,7 +23,6 @@ 'author' : 'OpenERP SA', 'category' : 'Specific Industry Applications', 'depends' : ['stock'], - 'data' : [], 'demo' : ['product_expiry_demo.xml'], 'description': """ Track different dates on products and production lots. diff --git a/addons/product_manufacturer/__openerp__.py b/addons/product_manufacturer/__openerp__.py index 30f09176796..169c299cf81 100644 --- a/addons/product_manufacturer/__openerp__.py +++ b/addons/product_manufacturer/__openerp__.py @@ -23,7 +23,6 @@ 'author' : 'OpenERP SA', 'category': 'Purchase Management', 'depends' : ['stock'], - 'data' : [], 'demo' : [], 'description': """ A module that adds manufacturers and attributes on the product form. diff --git a/addons/profile_tools/__openerp__.py b/addons/profile_tools/__openerp__.py index 9ff9ca658e6..ddd1eba5ca0 100644 --- a/addons/profile_tools/__openerp__.py +++ b/addons/profile_tools/__openerp__.py @@ -35,7 +35,6 @@ modules like share, lunch, pad, idea, survey and subscription. """, 'website': 'http://www.openerp.com', 'data': [], - 'data': [], 'demo': [], 'installable': True, 'auto_install': False, diff --git a/addons/project_gtd/__openerp__.py b/addons/project_gtd/__openerp__.py index b2b3182cbf3..baa3200df08 100644 --- a/addons/project_gtd/__openerp__.py +++ b/addons/project_gtd/__openerp__.py @@ -48,7 +48,6 @@ performing those tasks. 'author': 'OpenERP SA', 'images': ['images/project_gtd.jpeg'], 'depends': ['project'], - 'data': [], 'data': [ 'project_gtd_data.xml', 'project_gtd_view.xml', diff --git a/addons/project_issue/__openerp__.py b/addons/project_issue/__openerp__.py index 20c60eeacf7..71c40fc3f39 100644 --- a/addons/project_issue/__openerp__.py +++ b/addons/project_issue/__openerp__.py @@ -43,9 +43,6 @@ and decide on their status as they evolve. 'crm', 'project', ], - 'data': [ - 'project_issue_data.xml' - ], 'data': [ 'project_issue_view.xml', 'project_issue_menu.xml', @@ -54,6 +51,7 @@ and decide on their status as they evolve. 'security/ir.model.access.csv', 'board_project_issue_view.xml', 'res_config_view.xml', + 'project_issue_data.xml' ], 'demo': ['project_issue_demo.xml'], 'test': [ diff --git a/addons/project_issue_sheet/__openerp__.py b/addons/project_issue_sheet/__openerp__.py index 3140b766b36..e12bc1a14cd 100644 --- a/addons/project_issue_sheet/__openerp__.py +++ b/addons/project_issue_sheet/__openerp__.py @@ -37,7 +37,6 @@ Worklogs can be maintained to signify number of hours spent by users to handle a 'project_issue', 'hr_timesheet_sheet', ], - 'data': [], 'data': [ 'project_issue_sheet_view.xml', 'security/ir.model.access.csv', diff --git a/addons/project_long_term/__openerp__.py b/addons/project_long_term/__openerp__.py index d173e2a9b1c..2968a5b035d 100644 --- a/addons/project_long_term/__openerp__.py +++ b/addons/project_long_term/__openerp__.py @@ -44,7 +44,6 @@ Features: * Schedule Tasks: All the tasks which are in draft, pending and open state are scheduled with taking the phase's start date. """, - 'data': [], 'demo': ['project_long_term_demo.xml'], 'test': [ 'test/phase_process.yml', diff --git a/addons/project_mailgate/__openerp__.py b/addons/project_mailgate/__openerp__.py index dbd7bd9e2eb..de18756c798 100644 --- a/addons/project_mailgate/__openerp__.py +++ b/addons/project_mailgate/__openerp__.py @@ -42,7 +42,6 @@ There are two common alternatives to configure the mailbox integration: provided in the ``mail`` module - and connect it to the `project.task` model. """, 'data': [], - 'data': [], 'demo': [], 'installable': True, 'auto_install': False, diff --git a/addons/project_mrp/__openerp__.py b/addons/project_mrp/__openerp__.py index 37711ddf6bd..dd20c1c9c1e 100644 --- a/addons/project_mrp/__openerp__.py +++ b/addons/project_mrp/__openerp__.py @@ -50,7 +50,6 @@ task is completed. 'website': 'http://www.openerp.com', 'images': ['images/product.jpeg', 'images/task_from_SO.jpeg'], 'depends': ['project', 'procurement', 'sale', 'mrp_jit'], - 'data': [], 'data': ['project_mrp_workflow.xml', 'process/project_mrp_process.xml', 'project_mrp_view.xml'], 'demo': ['project_mrp_demo.xml'], 'test': ['test/project_task_procurement.yml'], diff --git a/addons/project_retro_planning/__openerp__.py b/addons/project_retro_planning/__openerp__.py index 621a6972df1..17889ddf9a1 100644 --- a/addons/project_retro_planning/__openerp__.py +++ b/addons/project_retro_planning/__openerp__.py @@ -33,7 +33,6 @@ the tasks will change accordingly. 'author': 'OpenERP SA', 'depends': ['base', 'project'], 'data': [], - 'data': [], 'demo': [], 'test' : [ 'test/deadline_change.yml' diff --git a/addons/project_timesheet/__openerp__.py b/addons/project_timesheet/__openerp__.py index b4d87d8c672..8e64bf0eb3b 100644 --- a/addons/project_timesheet/__openerp__.py +++ b/addons/project_timesheet/__openerp__.py @@ -35,13 +35,13 @@ with the effect of creating, editing and deleting either ways. 'website': 'http://www.openerp.com', 'images': ['images/invoice_task_work.jpeg', 'images/my_timesheet.jpeg', 'images/working_hour.jpeg'], 'depends': ['project', 'hr_timesheet_sheet', 'hr_timesheet_invoice', 'account_analytic_analysis'], - 'data': ['project_timesheet_data.xml'], 'data': [ 'security/ir.model.access.csv', 'security/project_timesheet_security.xml', 'process/project_timesheet_process.xml', 'report/task_report_view.xml', 'project_timesheet_view.xml', + 'project_timesheet_data.xml' ], 'demo': ['project_timesheet_demo.xml'], 'test': [ diff --git a/addons/purchase_analytic_plans/__openerp__.py b/addons/purchase_analytic_plans/__openerp__.py index 97edd5129b6..9a0220a028e 100644 --- a/addons/purchase_analytic_plans/__openerp__.py +++ b/addons/purchase_analytic_plans/__openerp__.py @@ -35,7 +35,6 @@ on a supplier purchase order into several accounts and analytic plans. 'website': 'http://www.openerp.com', 'images' : ['images/purchase_analytic_distribution.jpeg'], 'depends': ['purchase', 'account_analytic_plans'], - 'data': [], 'data': ['purchase_analytic_plans_view.xml'], 'demo': [], 'installable': True, diff --git a/addons/purchase_double_validation/__openerp__.py b/addons/purchase_double_validation/__openerp__.py index 51761ceea13..d05870ca951 100644 --- a/addons/purchase_double_validation/__openerp__.py +++ b/addons/purchase_double_validation/__openerp__.py @@ -34,7 +34,6 @@ This module modifies the purchase workflow in order to validate purchases that exceeds minimum amount set by configuration wizard. """, 'website': 'http://www.openerp.com', - 'data': [], 'data': [ 'purchase_double_validation_workflow.xml', 'purchase_double_validation_installer.xml', diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index dcd4afdf15d..64b449cc5d8 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -33,7 +33,6 @@ related requisition. This new object will regroup and will allow you to easily keep track and order all your purchase orders. """, 'depends' : ['purchase','mrp'], - 'data' : [], 'demo' : ['purchase_requisition_demo.xml'], 'data' : ['security/purchase_tender.xml', 'wizard/purchase_requisition_partner_view.xml', diff --git a/addons/report_designer/__openerp__.py b/addons/report_designer/__openerp__.py index 02226222064..78d699eabef 100644 --- a/addons/report_designer/__openerp__.py +++ b/addons/report_designer/__openerp__.py @@ -34,7 +34,6 @@ Makes the Reporting Hidden Configuration available from where you can install modules like base_report_designer and base_report_creator. """, 'website': 'http://www.openerp.com', - 'data': [], 'data': [ 'security/ir.model.access.csv', ], diff --git a/addons/report_intrastat/__openerp__.py b/addons/report_intrastat/__openerp__.py index fc52f9b9b8f..aa4fa31a0b0 100644 --- a/addons/report_intrastat/__openerp__.py +++ b/addons/report_intrastat/__openerp__.py @@ -33,11 +33,11 @@ European Union.""", 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['base', 'product', 'stock', 'sale', 'purchase'], - 'data': ['report_intrastat_data.xml'], 'data': [ 'security/ir.model.access.csv', 'report_intrastat_view.xml', - 'intrastat_report.xml' + 'intrastat_report.xml', + 'report_intrastat_data.xml' ], 'demo': [], 'test': ['test/report_intrastat_report.yml'], diff --git a/addons/resource/__openerp__.py b/addons/resource/__openerp__.py index 540eaab2088..e893cf35fc2 100644 --- a/addons/resource/__openerp__.py +++ b/addons/resource/__openerp__.py @@ -36,7 +36,6 @@ associated to every resource. It also manages the leaves of every resource. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'depends': ['process'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'resource_view.xml', diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index c0512de0b2e..7307d35e59d 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -64,7 +64,6 @@ Dashboard for Sales Manager that includes: 'website': 'http://www.openerp.com', 'images': ['images/deliveries_to_invoice.jpeg','images/sale_dashboard.jpeg','images/Sale_order_line_to_invoice.jpeg','images/sale_order.jpeg','images/sales_analysis.jpeg'], 'depends': ['stock', 'procurement', 'board', 'account_voucher'], - 'data': [], 'data': [ 'wizard/sale_make_invoice_advance.xml', 'wizard/sale_line_invoice.xml', diff --git a/addons/sale_analytic_plans/__openerp__.py b/addons/sale_analytic_plans/__openerp__.py index 97122b4fcb2..df33feae578 100644 --- a/addons/sale_analytic_plans/__openerp__.py +++ b/addons/sale_analytic_plans/__openerp__.py @@ -33,7 +33,6 @@ Using this module you will be able to link analytic accounts to sales orders. 'website': 'http://www.openerp.com', 'images': ['images/sale_order_analytic_account.jpeg', 'images/sales_order_line.jpeg'], 'depends': ['sale', 'account_analytic_plans'], - 'data': [], 'data': ['sale_analytic_plans_view.xml'], 'demo': [], 'installable': True, diff --git a/addons/sale_crm/__openerp__.py b/addons/sale_crm/__openerp__.py index 430bf2717b5..5df824b4d90 100644 --- a/addons/sale_crm/__openerp__.py +++ b/addons/sale_crm/__openerp__.py @@ -38,7 +38,6 @@ modules. 'website': 'http://www.openerp.com', 'images': ['images/crm_statistics_dashboard.jpeg', 'images/opportunity_to_quote.jpeg'], 'depends': ['sale', 'crm'], - 'data': [], 'data': ['wizard/crm_make_sale_view.xml', 'sale_crm_view.xml', 'process/sale_crm_process.xml', diff --git a/addons/sale_journal/__openerp__.py b/addons/sale_journal/__openerp__.py index 1dc4952ec68..22d438fa541 100644 --- a/addons/sale_journal/__openerp__.py +++ b/addons/sale_journal/__openerp__.py @@ -50,10 +50,10 @@ Some statistics by journals are provided. 'website': 'http://www.openerp.com', 'images': ['images/invoice_type.jpeg'], 'depends': ['sale'], - 'data': ['sale_journal_data.xml'], 'data': [ 'security/ir.model.access.csv', 'sale_journal_view.xml', + 'sale_journal_data.xml' ], 'demo': ['sale_journal_demo.xml'], 'test': [ ], diff --git a/addons/sale_mrp/__openerp__.py b/addons/sale_mrp/__openerp__.py index 4339b197ced..696b5d8b9d7 100644 --- a/addons/sale_mrp/__openerp__.py +++ b/addons/sale_mrp/__openerp__.py @@ -35,7 +35,6 @@ from sales order. It adds sales name and sales Reference on production order. 'website': 'http://www.openerp.com', 'images': ['images/SO_to_MO.jpeg'], 'depends': ['mrp', 'sale'], - 'data': [], 'data': [ 'security/ir.model.access.csv', 'sale_mrp_view.xml', diff --git a/addons/sale_order_dates/__openerp__.py b/addons/sale_order_dates/__openerp__.py index 8fc22bd4c86..84288ccc9a5 100644 --- a/addons/sale_order_dates/__openerp__.py +++ b/addons/sale_order_dates/__openerp__.py @@ -37,7 +37,6 @@ You can add the following additional dates to a sale order: 'website': 'http://www.openerp.com', 'images': ['images/sale_order_dates.jpeg'], 'depends': ['sale'], - 'data': [], 'data': [ 'sale_order_dates_view.xml', ], diff --git a/addons/stock/__openerp__.py b/addons/stock/__openerp__.py index ae709cc2764..5ebc5e519d3 100644 --- a/addons/stock/__openerp__.py +++ b/addons/stock/__openerp__.py @@ -50,7 +50,6 @@ Dashboard for warehouse that includes: 'depends' : ['product', 'account'], 'category' : 'Warehouse Management', 'sequence': 16, - 'data' : [], 'demo' : [ 'stock_demo.xml', # 'stock_demo.yml', diff --git a/addons/stock_invoice_directly/__openerp__.py b/addons/stock_invoice_directly/__openerp__.py index d24b1ee1d91..57b4f8e38bb 100644 --- a/addons/stock_invoice_directly/__openerp__.py +++ b/addons/stock_invoice_directly/__openerp__.py @@ -36,7 +36,6 @@ wizard if the delivery is to be invoiced. 'images': ['images/create_invoice.jpeg'], 'depends': ['delivery', 'stock'], 'data': [], - 'data': [], 'demo': [], 'test': ['test/stock_invoice_directly.yml'], 'installable': True, diff --git a/addons/stock_location/__openerp__.py b/addons/stock_location/__openerp__.py index 3dacc4713b1..4dd45fee577 100644 --- a/addons/stock_location/__openerp__.py +++ b/addons/stock_location/__openerp__.py @@ -94,7 +94,6 @@ You can use the demo data as follow: 'author': 'OpenERP SA', 'images': ['images/pulled_flow.jpeg','images/pushed_flow.jpeg'], 'depends': ['procurement','stock','sale'], - 'data': [], 'data': ['stock_location_view.xml', 'security/stock_location_security.xml', 'security/ir.model.access.csv', 'procurement_pull_workflow.xml'], 'demo': [ 'stock_location_demo_cpu1.xml', diff --git a/addons/subscription/__openerp__.py b/addons/subscription/__openerp__.py index 9925f9e5064..92133d5baa1 100644 --- a/addons/subscription/__openerp__.py +++ b/addons/subscription/__openerp__.py @@ -37,7 +37,6 @@ e.g. To have an invoice generated automatically periodically: """, 'author': 'OpenERP SA', 'depends': ['base_tools'], - 'data': [], 'data': ['security/subcription_security.xml', 'security/ir.model.access.csv', 'subscription_view.xml'], 'demo': ['subscription_demo.xml',], 'installable': True, From 8d052c96bc0ea24751d3709beee18437a969ea18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Mon, 20 Aug 2012 15:59:57 +0200 Subject: [PATCH 094/132] [FIX] point_of_sale: added contact_address to print info, empty order styling bzr revid: fva@openerp.com-20120820135957-o5exttxak611e624 --- addons/point_of_sale/static/src/css/pos.css | 4 ++++ addons/point_of_sale/static/src/js/TODO.txt | 7 ++++--- addons/point_of_sale/static/src/js/pos_models.js | 14 ++++++++------ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index ff361ab2e2d..a9baf041942 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -957,6 +957,10 @@ -moz-transition: background 50ms ease-in-out; transition: background 50ms ease-in-out; } +.point-of-sale .order .orderline.empty:hover{ + background: transparent; + cursor: default; +} .point-of-sale .order .orderline.selected{ background: rgba(140,143,183,0.2); diff --git a/addons/point_of_sale/static/src/js/TODO.txt b/addons/point_of_sale/static/src/js/TODO.txt index f0df899bf34..edadbe188ea 100644 --- a/addons/point_of_sale/static/src/js/TODO.txt +++ b/addons/point_of_sale/static/src/js/TODO.txt @@ -41,11 +41,12 @@ TODO AUG 20 * TRUNK - Connection status tooltip - - Remove receipt screen + v Remove receipt screen - Finish the receipt JSON generation - Modifie le widget de liste course - - supprimer l'écran - - bloquer sur l'impression + v supprimer l'écran + v bloquer sur l'impression + v L'impression est foireuse * CLIENT - create a new branch diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/pos_models.js index 4cc39bbb498..03e37b81342 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/pos_models.js @@ -28,8 +28,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal this.db = new module.PosLS(); // a database used to store the products and categories this.db.clear('products','categories'); - window.db = this.db; - // pos settings this.use_scale = false; this.use_proxy_printer = false; @@ -76,16 +74,19 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal 'email', 'website', 'company_registry', - //TODO contact_address 'vat', 'name', - 'phone' + 'phone', + 'partner_id', ], [['id','=',user.company_id[0]]]) }).pipe(function(companies){ var company = companies[0]; self.set('company',company); - + fetch('res.partner',['contact_address'],[['id','=',company.partner_id[0]]]) + .then(function(partner){ + company.contact_address = partner[0].contact_address; + }); return fetch('res.currency',['symbol','position'],[['id','=',company.currency_id[0]]]); }).pipe(function (currencies){ self.set('currency',currencies[0]); @@ -700,6 +701,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal change: this.getChange(), name : this.getName(), client: client ? client.name : null , + invoice_id: null, //TODO cashier: cashier ? cashier.name : null, date: { year: date.getFullYear(), @@ -713,7 +715,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal email: company.email, website: company.website, company_registry: company.company_registry, - contact_address: null, //TODO + contact_address: company.contact_address, vat: company.vat, name: company.name, phone: company.phone, From 71104d2c2055b773074404addf6437c7e2cf517b Mon Sep 17 00:00:00 2001 From: help <> Date: Tue, 21 Aug 2012 10:42:46 +0530 Subject: [PATCH 095/132] [IMP]stock_planning:improved module description for removing error bzr revid: help-20120821051246-cd4nafp5myiuhw09 --- addons/stock_planning/__openerp__.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/addons/stock_planning/__openerp__.py b/addons/stock_planning/__openerp__.py index d671e59308b..01844098364 100644 --- a/addons/stock_planning/__openerp__.py +++ b/addons/stock_planning/__openerp__.py @@ -200,9 +200,7 @@ When you are in the same period (current period is the same as calculated) Stock When you calculate period next to current: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -**Stock Simulation =** Stock of beginning of current Period - Planned Out of current Period - + Confirmed In of current Period (incl. Already In) - Planned Out of calculated Period - + Planned In of calculated Period . +**Stock Simulation =** Stock of beginning of current Period - Planned Out of current Period + Confirmed In of current Period (incl. Already In) - Planned Out of calculated Period + Planned In of calculated Period . As you see the calculated Period is taken the same way as in previous case, but the calculation in the current Period is a little bit different. First you should @@ -212,11 +210,7 @@ going to the next one. When you plan for future Periods: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -**Stock Simulation =** Stock of beginning of current Period - - Sum of Planned Out of Periods before calculated - + Sum of Confirmed In of Periods before calculated (incl. Already In) - - Planned Out of calculated Period - + Planned In of calculated Period. +**Stock Simulation =** Stock of beginning of current Period - Sum of Planned Out of Periods before calculated + Sum of Confirmed In of Periods before calculated (incl. Already In) - Planned Out of calculated Period + Planned In of calculated Period. Here "Periods before calculated" designates all periods starting with the current until the period before the one being calculated. From b3cecb21624401f7b1ca2bb6c32501a04e17a5c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 21 Aug 2012 09:54:34 +0200 Subject: [PATCH 096/132] [IMP] point_of_sale: renamed the js files bzr revid: fva@openerp.com-20120821075434-dy4oqwuok39i4eyj --- addons/point_of_sale/__openerp__.py | 18 +++++++++--------- .../static/src/js/{pos_db.js => db.js} | 0 .../src/js/{pos_devices.js => devices.js} | 0 .../static/src/js/{pos_main.js => main.js} | 0 .../static/src/js/{pos_models.js => models.js} | 0 .../src/js/{pos_screens.js => screens.js} | 0 .../js/{pos_basewidget.js => widget_base.js} | 0 ...s_keyboard_widget.js => widget_keyboard.js} | 0 ...scrollbar_widget.js => widget_scrollbar.js} | 0 .../src/js/{pos_widgets.js => widgets.js} | 0 10 files changed, 9 insertions(+), 9 deletions(-) rename addons/point_of_sale/static/src/js/{pos_db.js => db.js} (100%) rename addons/point_of_sale/static/src/js/{pos_devices.js => devices.js} (100%) rename addons/point_of_sale/static/src/js/{pos_main.js => main.js} (100%) rename addons/point_of_sale/static/src/js/{pos_models.js => models.js} (100%) rename addons/point_of_sale/static/src/js/{pos_screens.js => screens.js} (100%) rename addons/point_of_sale/static/src/js/{pos_basewidget.js => widget_base.js} (100%) rename addons/point_of_sale/static/src/js/{pos_keyboard_widget.js => widget_keyboard.js} (100%) rename addons/point_of_sale/static/src/js/{pos_scrollbar_widget.js => widget_scrollbar.js} (100%) rename addons/point_of_sale/static/src/js/{pos_widgets.js => widgets.js} (100%) diff --git a/addons/point_of_sale/__openerp__.py b/addons/point_of_sale/__openerp__.py index 1b6a6f1390f..e0722f12395 100644 --- a/addons/point_of_sale/__openerp__.py +++ b/addons/point_of_sale/__openerp__.py @@ -84,15 +84,15 @@ Main features: # Web client 'js': [ 'static/lib/mousewheel/jquery.mousewheel-3.0.6.js', - 'static/src/js/pos_db.js', - 'static/src/js/pos_models.js', - 'static/src/js/pos_basewidget.js', - 'static/src/js/pos_keyboard_widget.js', - 'static/src/js/pos_scrollbar_widget.js', - 'static/src/js/pos_widgets.js', - 'static/src/js/pos_devices.js', - 'static/src/js/pos_screens.js', - 'static/src/js/pos_main.js' + 'static/src/js/db.js', + 'static/src/js/models.js', + 'static/src/js/widget_base.js', + 'static/src/js/widget_keyboard.js', + 'static/src/js/widget_scrollbar.js', + 'static/src/js/widgets.js', + 'static/src/js/devices.js', + 'static/src/js/screens.js', + 'static/src/js/main.js' ], 'css': [ 'static/src/css/pos.css', diff --git a/addons/point_of_sale/static/src/js/pos_db.js b/addons/point_of_sale/static/src/js/db.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_db.js rename to addons/point_of_sale/static/src/js/db.js diff --git a/addons/point_of_sale/static/src/js/pos_devices.js b/addons/point_of_sale/static/src/js/devices.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_devices.js rename to addons/point_of_sale/static/src/js/devices.js diff --git a/addons/point_of_sale/static/src/js/pos_main.js b/addons/point_of_sale/static/src/js/main.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_main.js rename to addons/point_of_sale/static/src/js/main.js diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/models.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_models.js rename to addons/point_of_sale/static/src/js/models.js diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/screens.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_screens.js rename to addons/point_of_sale/static/src/js/screens.js diff --git a/addons/point_of_sale/static/src/js/pos_basewidget.js b/addons/point_of_sale/static/src/js/widget_base.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_basewidget.js rename to addons/point_of_sale/static/src/js/widget_base.js diff --git a/addons/point_of_sale/static/src/js/pos_keyboard_widget.js b/addons/point_of_sale/static/src/js/widget_keyboard.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_keyboard_widget.js rename to addons/point_of_sale/static/src/js/widget_keyboard.js diff --git a/addons/point_of_sale/static/src/js/pos_scrollbar_widget.js b/addons/point_of_sale/static/src/js/widget_scrollbar.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_scrollbar_widget.js rename to addons/point_of_sale/static/src/js/widget_scrollbar.js diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/widgets.js similarity index 100% rename from addons/point_of_sale/static/src/js/pos_widgets.js rename to addons/point_of_sale/static/src/js/widgets.js From ca93a52e6468a926737bdbe41e6872cf48c43c04 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 21 Aug 2012 10:23:43 +0200 Subject: [PATCH 097/132] [FIX] point_of_sale: fix a report bzr revid: stw@openerp.com-20120821082343-mu1p8231c4wa0kjm --- addons/point_of_sale/report/pos_sales_user.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/point_of_sale/report/pos_sales_user.py b/addons/point_of_sale/report/pos_sales_user.py index e49528441b9..6ac2e1892c1 100644 --- a/addons/point_of_sale/report/pos_sales_user.py +++ b/addons/point_of_sale/report/pos_sales_user.py @@ -37,14 +37,14 @@ class pos_sales_user(report_sxw.rml_parse): dt1 = form['date_start'] + ' 00:00:00' dt2 = form['date_end'] + ' 23:59:59' data={} - self.cr.execute("select po.name as pos,po.date_order,ru.name as user,po.state,rc.name " \ - "from pos_order as po,res_users as ru,res_company as rc " \ + self.cr.execute("select po.name as pos,po.date_order,rp.name as user,po.state,rc.name " \ + "from pos_order as po,res_users as ru,res_company as rc, res_partner as rp " \ "where po.date_order >= %s and po.date_order <= %s " \ - "and po.company_id=rc.id and po.user_id=ru.id and po.user_id IN %s " \ + "and po.company_id=rc.id and po.user_id=ru.id and po.user_id IN %s and ru.partner_id = rp.id" \ ,(dt1,dt2,tuple(form['user_id']))) return self.cr.dictfetchall() report_sxw.report_sxw('report.pos.sales.user', 'pos.order', 'addons/point_of_sale/report/pos_sales_user.rml', parser=pos_sales_user,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From c803243a38285e1418954968e6857013e5005fc2 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 21 Aug 2012 10:23:56 +0200 Subject: [PATCH 098/132] [FIX] point_of_sale: remove an useless test bzr revid: stw@openerp.com-20120821082356-dr4vdka5u796ho9w --- addons/point_of_sale/test/00_register_open.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/addons/point_of_sale/test/00_register_open.yml b/addons/point_of_sale/test/00_register_open.yml index 7d5aabbcdc3..ce13f3c0f26 100644 --- a/addons/point_of_sale/test/00_register_open.yml +++ b/addons/point_of_sale/test/00_register_open.yml @@ -9,9 +9,3 @@ - !python {model: pos.open.statement}: | self.open_statement(cr, uid, [ref('new_statement_open')], context={}) -- - I check that I have some bank statements open for the admin user -- - !python {model: account.bank.statement}: | - ids = self.search(cr, uid, [('state', 'in', ('open','new')), ('user_id', '=', 1)]) - assert (len(ids)>0), 'No statement open for the admin user!' From 28c036aef0bafe0921a5d135f273fba43d193875 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 21 Aug 2012 10:38:28 +0200 Subject: [PATCH 099/132] [FIX] point_of_sale: A manager can create a ir.sequence for the pos.config bzr revid: stw@openerp.com-20120821083828-as5sqvatvvseaj9d --- addons/point_of_sale/security/ir.model.access.csv | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/point_of_sale/security/ir.model.access.csv b/addons/point_of_sale/security/ir.model.access.csv index 06673fc3da8..74b4bbf5753 100644 --- a/addons/point_of_sale/security/ir.model.access.csv +++ b/addons/point_of_sale/security/ir.model.access.csv @@ -60,7 +60,8 @@ access_product_uom_manager,product.uom manager,product.model_product_uom,group_p access_res_partner_manager,res.partner manager,base.model_res_partner,group_pos_manager,1,0,0,0 access_product_category_manager,product.category manager,product.model_product_category,group_pos_manager,1,1,1,1 access_product_pricelist_manager,product.pricelist manager,product.model_product_pricelist,group_pos_manager,1,0,0,0 -access_product_category_pos_manager,pos.category manager,model_pos_category,group_pos_manager,1,1,1,"1""" -access_product_category_pos_user,pos.category user,model_pos_category,group_pos_user,1,0,0,"0""" +access_product_category_pos_manager,pos.category manager,model_pos_category,group_pos_manager,1,1,1,1 +access_product_category_pos_user,pos.category user,model_pos_category,group_pos_user,1,0,0,0 access_pos_session_user,pos.session user,model_pos_session,group_pos_user,1,1,1,0 access_pos_config_user,pos.config user,model_pos_config,group_pos_user,1,1,1,0 +access_ir_sequence_manager,ir.sequence manager,base.model_ir_sequence,group_pos_manager,1,1,1,1 From bc1f8e6d4be5b5905712b0c2359390049e99cc7a Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 21 Aug 2012 10:48:57 +0200 Subject: [PATCH 100/132] [IMP] point_of_sale: improve the layout of the pos.order bzr revid: stw@openerp.com-20120821084857-4ieoknwcsivdooa1 --- addons/point_of_sale/point_of_sale_view.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index e40cbc756b8..c45cedbfbc6 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -55,10 +55,14 @@ - + - -
    + From 219aff63af41fdc2f45222ac0d923890bb5d0317 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 21 Aug 2012 11:01:45 +0200 Subject: [PATCH 101/132] [FIX] product: avoid a traceback in the product_category#name_get method if the ids is an integer bzr revid: stw@openerp.com-20120821090145-pp2jm318g0kyn9wi --- addons/product/product.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/product/product.py b/addons/product/product.py index 142a4e0d393..58f47f9adc3 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -208,8 +208,10 @@ product_ul() class product_category(osv.osv): def name_get(self, cr, uid, ids, context=None): - if not len(ids): + if isinstance(ids, (list, tuple)) and not len(ids): return [] + if isinstance(ids, (long, int)): + ids = [ids] reads = self.read(cr, uid, ids, ['name','parent_id'], context=context) res = [] for record in reads: From 8d1836bd30f8d06b2da6e36c8b34d250b73847b0 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Aug 2012 11:30:00 +0200 Subject: [PATCH 102/132] [IMP] improved loading messages bzr revid: nicolas.vanhoren@openerp.com-20120821093000-4jf6lh7a8o124hsd --- addons/web/static/src/js/coresetup.js | 25 +++++++++++++++++++++++++ addons/web/static/src/xml/base.xml | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/coresetup.js b/addons/web/static/src/js/coresetup.js index 229a82a1784..a34a7dadd30 100644 --- a/addons/web/static/src/js/coresetup.js +++ b/addons/web/static/src/js/coresetup.js @@ -528,6 +528,14 @@ if ($.blockUI) { $.blockUI.defaults.css["background-color"] = ''; } +var messages_by_seconds = [ + [0, "Loading..."], + [30, "Still Loading..."], + [60, "Still Loading...
    Please be patient."], + [120, "Hey, guess what?
    It's still loading."], + [300, "You may not believe it,
    but the application is actually loading..."], +]; + instance.web.Throbber = instance.web.Widget.extend({ template: "Throbber", start: function() { @@ -548,6 +556,23 @@ instance.web.Throbber = instance.web.Widget.extend({ left: 'auto' // Left position relative to parent in px }; this.spin = new Spinner(opts).spin(this.$element[0]); + this.start_time = new Date().getTime(); + this.act_message(); + }, + act_message: function() { + var self = this; + setTimeout(function() { + if (self.isDestroyed()) + return; + var seconds = (new Date().getTime() - self.start_time) / 1000; + var mes; + _.each(messages_by_seconds, function(el) { + if (seconds >= el[0]) + mes = el[1]; + }); + self.$(".oe_throbber_message").html(mes); + self.act_message(); + }, 1000); }, destroy: function() { if (this.spin) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index c91c156a2c4..330a5b3928f 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1736,7 +1736,7 @@

    -
    Loading...
    +
    From 23de15d82b777af2ae9aa4c05af39c1d67bcbb81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 21 Aug 2012 12:04:52 +0200 Subject: [PATCH 103/132] [IMP] point_of_sale: simpler way to load models bzr revid: fva@openerp.com-20120821100452-zop43cmqyxq0del0 --- addons/point_of_sale/static/src/js/models.js | 212 ++++++++----------- 1 file changed, 88 insertions(+), 124 deletions(-) diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 03e37b81342..d824d0a043f 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -54,6 +54,8 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal 'taxes': null, 'pos_session': null, 'pos_config': null, + 'units': null, + 'units_by_id': null, 'selectedOrder': undefined, }); @@ -63,10 +65,9 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal // We fetch the backend data on the server asynchronously. this is done only when the pos user interface is launched, // Any change on this data made on the server is thus not reflected on the point of sale until it is relaunched. - var user_def = fetch('res.users',['name','company_id'],[['id','=',this.session.uid]]) + var loaded = fetch('res.users',['name','company_id'],[['id','=',this.session.uid]]) .pipe(function(users){ - var user = users[0]; - self.set('user',user); + self.set('user',users[0]); return fetch('res.company', [ @@ -79,147 +80,110 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal 'phone', 'partner_id', ], - [['id','=',user.company_id[0]]]) + [['id','=',users[0].company_id[0]]]); }).pipe(function(companies){ - var company = companies[0]; - self.set('company',company); - fetch('res.partner',['contact_address'],[['id','=',company.partner_id[0]]]) - .then(function(partner){ - company.contact_address = partner[0].contact_address; - }); - return fetch('res.currency',['symbol','position'],[['id','=',company.currency_id[0]]]); - }).pipe(function (currencies){ + self.set('company',companies[0]); + + return fetch('res.partner',['contact_address'],[['id','=',companies[0].partner_id[0]]]); + }).pipe(function(company_partners){ + self.get('company').contact_address = company_partners[0].contact_address; + + return fetch('res.currency',['symbol','position'],[['id','=',self.get('company').currency_id[0]]]); + }).pipe(function(currencies){ self.set('currency',currencies[0]); - }); - - var uom_def = fetch( //unit of measure - 'product.uom', - null, - null - ).then(function(result){ - self.set({'units': result}); + return fetch('product.uom', null, null); + }).pipe(function(units){ + self.set('units',units); var units_by_id = {}; - for(var i = 0, len = result.length; i < len; i++){ - units_by_id[result[i].id] = result[i]; + for(var i = 0, len = units.length; i < len; i++){ + units_by_id[units[i].id] = units[i]; } - self.set({'units_by_id':units_by_id}); - }); - - var pack_def = fetch( - 'product.packaging', - null, - null - ).then(function(packaging){ - self.set('product.packaging',packaging); - }); - - var users_def = fetch( - 'res.users', - ['name','ean13'], - [['ean13', '!=', false]] - ).then(function(result){ - self.set({'user_list':result}); - }); - - var tax_def = fetch('account.tax', ['amount','price_include','type']) - .then(function(result){ - self.set({'taxes': result}); - }); - - var session_def = fetch( // loading the PoS Session. - 'pos.session', - ['id', 'journal_ids','name','user_id','config_id','start_at','stop_at'], - [['state', '=', 'opened'], ['user_id', '=', this.session.uid]] - ).pipe(function(result) { - - // some data are associated with the pos session, like the pos config and bank statements. - // we must have a valid session before we can read those. + self.set('units_by_id',units_by_id); - var session_data_def = new $.Deferred(); + return fetch('product.packaging', null, null); + }).pipe(function(packagings){ + self.set('product.packaging',packagings); - if( result.length !== 0 ) { - var pos_session = result[0]; + return fetch('res.users', ['name','ean13'], [['ean13', '!=', false]]); + }).pipe(function(users){ + self.set('user_list',users); - self.set({'pos_session': pos_session}); + return fetch('account.tax', ['amount', 'price_include', 'type']); + }).pipe(function(taxes){ + self.set('taxes', taxes); - var pos_config_def = fetch( - 'pos.config', - ['name','journal_ids','shop_id','journal_id', - 'iface_self_checkout', 'iface_led', 'iface_cashdrawer', - 'iface_payment_terminal', 'iface_electronic_scale', 'iface_barscan', 'iface_vkeyboard', - 'iface_print_via_proxy','iface_cashdrawer','state','sequence_id','session_ids'], - [['id','=', pos_session.config_id[0]]] - ).pipe(function(result){ - var pos_config = result[0] - - self.set({'pos_config': pos_config}); - self.use_scale = pos_config.iface_electronic_scale || false; - self.use_proxy_printer = pos_config.iface_print_via_proxy || false; - self.use_virtual_keyboard = pos_config.iface_vkeyboard || false; - self.use_barcode_scanner = pos_config.iface_barscan || false; - self.use_selfcheckout = pos_config.iface_self_checkout || false; - self.use_cashbox = pos_config.iface_cashdrawer || false; + return fetch( + 'pos.session', + ['id', 'journal_ids','name','user_id','config_id','start_at','stop_at'], + [['state', '=', 'opened'], ['user_id', '=', self.session.uid]] + ); + }).pipe(function(sessions){ + self.set('pos_session', sessions[0]); - return fetch('sale.shop',[], [['id','=',pos_config.shop_id[0]]]) - }).pipe(function(shops){ - self.set('shop',shops[0]); - return fetch('pos.category', ['id','name', 'parent_id', 'child_id', 'image']) - }).pipe( function(categories){ - self.db.add_categories(categories); - return fetch( - 'product.product', - ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type'], - [['pos_categ_id','!=', false]], - {pricelist: self.get('shop').pricelist_id[0]} // context for price - ); - }).pipe( function(products){ - self.db.add_products(products); - }); + return fetch( + 'pos.config', + ['name','journal_ids','shop_id','journal_id', + 'iface_self_checkout', 'iface_led', 'iface_cashdrawer', + 'iface_payment_terminal', 'iface_electronic_scale', 'iface_barscan', 'iface_vkeyboard', + 'iface_print_via_proxy','iface_cashdrawer','state','sequence_id','session_ids'], + [['id','=', self.get('pos_session').config_id[0]]] + ); + }).pipe(function(configs){ + var pos_config = configs[0]; + self.set('pos_config', pos_config); + self.use_scale = !!pos_config.iface_electronic_scale; + self.use_proxy_printer = !!pos_config.iface_print_via_proxy; + self.use_virtual_keyboard = !!pos_config.iface_vkeyboard; + self.use_barcode_scanner = !!pos_config.iface_barscan; + self.use_selfcheckout = !!pos_config.iface_self_checkout; + self.use_cashbox = !!pos_config.iface_cashdrawer; - var bank_def = fetch( - 'account.bank.statement', - ['account_id','currency','journal_id','state','name','user_id','pos_session_id'], - [['state','=','open'],['pos_session_id', '=', pos_session.id]] - ).then(function(result){ - self.set({'bank_statements':result}); - }); + return fetch('sale.shop',[],[['id','=',pos_config.shop_id[0]]]); + }).pipe(function(shops){ + self.set('shop',shops[0]); - var journal_def = fetch( - 'account.journal', - undefined, - [['user_id','=',pos_session.user_id[0]]] - ).then(function(result){ - self.set({'journals':result}); - }); + return fetch('pos.category', ['id','name','parent_id','child_id','image']) + }).pipe(function(categories){ + self.db.add_categories(categories); - // associate the bank statements with their journals. - var bank_process_def = $.when(bank_def, journal_def) - .then(function(){ - var bank_statements = self.get('bank_statements'); - var journals = self.get('journals'); - for(var i = 0, ilen = bank_statements.length; i < ilen; i++){ - for(var j = 0, jlen = journals.length; j < jlen; j++){ - if(bank_statements[i].journal_id[0] === journals[j].id){ - bank_statements[i].journal = journals[j]; - bank_statements[i].self_checkout_payment_method = journals[j].self_checkout_payment_method; - } - } - } - }); + return fetch( + 'product.product', + ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type'], + [['pos_categ_id','!=', false]], + {pricelist: self.get('shop').pricelist_id[0]} // context for price + ); + }).pipe(function(products){ + self.db.add_products(products); - session_data_def = $.when(pos_config_def,bank_def,journal_def,bank_process_def); + return fetch( + 'account.bank.statement', + ['account_id','currency','journal_id','state','name','user_id','pos_session_id'], + [['state','=','open'],['pos_session_id', '=', self.get('pos_session').id]] + ); + }).pipe(function(bank_statements){ + self.set('bank_statements', bank_statements); - }else{ - session_data_def.reject(); + return fetch('account.journal', undefined, [['user_id','=', self.get('pos_session').user_id[0]]]); + }).pipe(function(journals){ + self.set('journals',journals); + + // associate the bank statements with their journals. + var bank_statements = self.get('bank_statements'); + for(var i = 0, ilen = bank_statements.length; i < ilen; i++){ + for(var j = 0, jlen = journals.length; j < jlen; j++){ + if(bank_statements[i].journal_id[0] === journals[j].id){ + bank_statements[i].journal = journals[j]; + bank_statements[i].self_checkout_payment_method = journals[j].self_checkout_payment_method; + } + } } - return session_data_def; + self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))}); }); // when all the data has loaded, we compute some stuff, and declare the Pos ready to be used. - $.when(pack_def, user_def, users_def, uom_def, session_def, tax_def, user_def, this.flush()) + $.when(loaded) .then(function(){ - self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))}); //self.log_loaded_data(); //Uncomment if you want to log the data to the console for easier debugging self.ready.resolve(); },function(){ From 0fdded4d4e8dd77ec8ee1739bbb97f20f0a8b557 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Aug 2012 12:44:03 +0200 Subject: [PATCH 104/132] [IMP] minor improvement in linkedin module bzr revid: nicolas.vanhoren@openerp.com-20120821104403-qbmv0tjyngauwfou --- addons/web_linkedin/static/src/js/linkedin.js | 1 + addons/web_linkedin/static/src/xml/linkedin.xml | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web_linkedin/static/src/js/linkedin.js b/addons/web_linkedin/static/src/js/linkedin.js index c15b995bff9..5bcb03aab33 100644 --- a/addons/web_linkedin/static/src/js/linkedin.js +++ b/addons/web_linkedin/static/src/js/linkedin.js @@ -270,6 +270,7 @@ openerp.web_linkedin = function(instance) { template: "LinkedIn.KeyWizard", init: function(parent, text) { this._super(parent, {title:_t("LinkedIn API Key")}); + this.api_domain = window.location.origin; }, start: function() { this._super(); diff --git a/addons/web_linkedin/static/src/xml/linkedin.xml b/addons/web_linkedin/static/src/xml/linkedin.xml index 0d062e6fd8c..f114fa53803 100644 --- a/addons/web_linkedin/static/src/xml/linkedin.xml +++ b/addons/web_linkedin/static/src/xml/linkedin.xml @@ -41,8 +41,7 @@
  1. Log into LinkedIn.
  2. Add a new application and fill the form:
      -
    • JavaScript API Domain is Your domain name (e.g. https://yourcompany.my.openerp.com)
    • -
    • You can give multiple domain (e.g. yourcompany.my.openerp.com)
    • +
    • JavaScript API Domain:
    • The programming tool is Javascript
  3. From 2e4d656dcbe92ea0b51fc22e214a61e17bdad834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Tue, 21 Aug 2012 12:48:14 +0200 Subject: [PATCH 105/132] [IMP] point_of_sale: removed useless settings, Wubbit Twarks bzr revid: fva@openerp.com-20120821104814-wuxk1qptj7xqr1i9 --- addons/point_of_sale/point_of_sale.py | 2 -- addons/point_of_sale/point_of_sale_view.xml | 2 -- addons/point_of_sale/static/src/js/models.js | 17 +++++------------ addons/point_of_sale/static/src/js/screens.js | 10 +++++----- addons/point_of_sale/static/src/js/widgets.js | 2 +- 5 files changed, 11 insertions(+), 22 deletions(-) diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 414ff1c3302..f4d32985688 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -60,11 +60,9 @@ class pos_config(osv.osv): help="Accounting journal used to post sales entries."), 'iface_self_checkout' : fields.boolean('Self Checkout Mode', help="Check this if this point of sale should open by default in a self checkout mode. If unchecked, OpenERP uses the normal cashier mode by default."), - 'iface_led' : fields.boolean('Help Notification'), 'iface_cashdrawer' : fields.boolean('Cashdrawer Interface'), 'iface_payment_terminal' : fields.boolean('Payment Terminal Interface'), 'iface_electronic_scale' : fields.boolean('Electronic Scale Interface'), - 'iface_barscan' : fields.boolean('BarScan Interface'), 'iface_vkeyboard' : fields.boolean('Virtual KeyBoard Interface'), 'iface_print_via_proxy' : fields.boolean('Print via Proxy'), diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index e40cbc756b8..2079c50be78 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -794,13 +794,11 @@ - - diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index d824d0a043f..a1f6def6bf3 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -28,12 +28,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal this.db = new module.PosLS(); // a database used to store the products and categories this.db.clear('products','categories'); - // pos settings - this.use_scale = false; - this.use_proxy_printer = false; - this.use_virtual_keyboard = false; - this.use_barcode_scanner = false; - // default attributes values. If null, it will be loaded below. this.set({ 'nbr_pending_operations': 0, @@ -132,12 +126,11 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal }).pipe(function(configs){ var pos_config = configs[0]; self.set('pos_config', pos_config); - self.use_scale = !!pos_config.iface_electronic_scale; - self.use_proxy_printer = !!pos_config.iface_print_via_proxy; - self.use_virtual_keyboard = !!pos_config.iface_vkeyboard; - self.use_barcode_scanner = !!pos_config.iface_barscan; - self.use_selfcheckout = !!pos_config.iface_self_checkout; - self.use_cashbox = !!pos_config.iface_cashdrawer; + self.iface_electronic_scale = !!pos_config.iface_electronic_scale; + self.iface_print_via_proxy = !!pos_config.iface_print_via_proxy; + self.iface_vkeyboard = !!pos_config.iface_vkeyboard; + self.iface_self_checkout = !!pos_config.iface_self_checkout; + self.iface_cashdrawer = !!pos_config.iface_cashdrawer; return fetch('sale.shop',[],[['id','=',pos_config.shop_id[0]]]); }).pipe(function(shops){ diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js index d71199331f3..738eadb08c5 100644 --- a/addons/point_of_sale/static/src/js/screens.js +++ b/addons/point_of_sale/static/src/js/screens.js @@ -276,7 +276,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.pos_widget.set_left_action_bar_visible(this.show_leftpane && !cashier_mode); this.pos_widget.set_cashier_controls_visible(cashier_mode); - if(cashier_mode && this.pos.use_selfcheckout){ + if(cashier_mode && this.pos.iface_self_checkout){ this.pos_widget.client_button.show(); }else{ this.pos_widget.client_button.hide(); @@ -603,7 +603,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.product_list_widget = new module.ProductListWidget(this,{ click_product_action: function(product){ - if(product.get('to_weight') && self.pos.use_scale){ + if(product.get('to_weight') && self.pos.iface_electronic_scale){ self.pos_widget.screen_selector.set_current_screen(self.scale_screen, {product: product}); }else{ self.pos.get('selectedOrder').addProduct(product); @@ -620,7 +620,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.product_categories_widget.reset_category(); this.pos_widget.order_widget.set_numpad_state(this.pos_widget.numpad.state); - if(this.pos.use_virtual_keyboard){ + if(this.pos.iface_vkeyboard){ this.pos_widget.onscreen_keyboard.connect(); } @@ -719,7 +719,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this._super(); var self = this; - if(this.pos.use_cashbox){ + if(this.pos.iface_cashdrawer){ this.pos.proxy.open_cashbox(); } @@ -753,7 +753,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa var currentOrder = this.pos.get('selectedOrder'); this.pos.push_order(currentOrder.exportAsJSON()) - if(this.pos.use_proxy_printer){ + if(this.pos.iface_print_via_proxy){ this.pos.proxy.print_receipt(currentOrder.export_for_printing()); this.pos.get('selectedOrder').destroy(); //finish order and go back to scan screen }else{ diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js index f6840e402de..c3bd73ca35a 100644 --- a/addons/point_of_sale/static/src/js/widgets.js +++ b/addons/point_of_sale/static/src/js/widgets.js @@ -875,7 +875,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }, default_client_screen: 'welcome', default_cashier_screen: 'products', - default_mode: this.pos.use_selfcheckout ? 'client' : 'cashier', + default_mode: this.pos.iface_self_checkout ? 'client' : 'cashier', }); }, From 552f5f8ef4b97bdd030f59f96763c821a36f5287 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 21 Aug 2012 12:51:13 +0200 Subject: [PATCH 106/132] [FIX] add a missing dependence bzr revid: abo@openerp.com-20120821105113-u7bty92d2lfea8q5 --- addons/portal/__openerp__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/portal/__openerp__.py b/addons/portal/__openerp__.py index 84a3b562133..84091a54347 100644 --- a/addons/portal/__openerp__.py +++ b/addons/portal/__openerp__.py @@ -25,6 +25,7 @@ 'depends' : [ 'base', 'share', + 'auth_anonymous', 'auth_signup', ], 'author' : 'OpenERP SA', @@ -45,8 +46,8 @@ very handy when used in combination with the module 'share'. 'data': [ 'security/portal_security.xml', 'security/ir.model.access.csv', - 'portal_view.xml', 'portal_data.xml', + 'portal_view.xml', 'wizard/portal_wizard_view.xml', 'wizard/share_wizard_view.xml', ], From c06c6930718807781bc45052d2bea6cd0765abbb Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 21 Aug 2012 13:01:35 +0200 Subject: [PATCH 107/132] [IMP] organization of views and data bzr revid: abo@openerp.com-20120821110135-12mud78ddjwhmd8c --- addons/portal/portal_data.xml | 23 ++--------------------- addons/portal/portal_view.xml | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/addons/portal/portal_data.xml b/addons/portal/portal_data.xml index 58f2fc3e9d4..ddfb4cc6729 100644 --- a/addons/portal/portal_data.xml +++ b/addons/portal/portal_data.xml @@ -1,6 +1,6 @@ - + Portal @@ -10,7 +10,7 @@ - Company's news feed + Company's news @@ -32,24 +32,5 @@ form - - - - - - - - - - - - - diff --git a/addons/portal/portal_view.xml b/addons/portal/portal_view.xml index 831db25e26a..dd720d448ef 100644 --- a/addons/portal/portal_view.xml +++ b/addons/portal/portal_view.xml @@ -2,6 +2,25 @@ + + + + + + + + + + + + + Portal List From 197e6731005960058ae8ca5f5d9ad839ed056516 Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Tue, 21 Aug 2012 17:06:12 +0200 Subject: [PATCH 108/132] [IMP] point_of_sale: improve the layout of 'your session' bzr revid: stw@openerp.com-20120821150612-4ikdil8vzmkc0wwz --- .../wizard/pos_session_opening.py | 22 ++++++++++--------- .../wizard/pos_session_opening.xml | 5 +++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/addons/point_of_sale/wizard/pos_session_opening.py b/addons/point_of_sale/wizard/pos_session_opening.py index 056856d8365..d3b6ea28b17 100644 --- a/addons/point_of_sale/wizard/pos_session_opening.py +++ b/addons/point_of_sale/wizard/pos_session_opening.py @@ -4,13 +4,17 @@ from osv import osv, fields from tools.translate import _ import netsvc +from openerp.addons.point_of_sale.point_of_sale import pos_session + class pos_session_opening(osv.osv_memory): _name = 'pos.session.opening' _columns = { 'pos_config_id' : fields.many2one('pos.config', 'Point of Sale', required=True), 'pos_session_id' : fields.many2one('pos.session', 'PoS Session'), - 'pos_state' : fields.char('Session State', readonly=True), + 'pos_state' : fields.selection(pos_session.POS_SESSION_STATE, + 'Session State', readonly=True), + 'show_config' : fields.boolean('Show Config', readonly=True), } def open_ui(self, cr, uid, ids, context=None): @@ -19,7 +23,7 @@ class pos_session_opening(osv.osv_memory): context['active_id'] = data.pos_session_id.id return { 'type' : 'ir.actions.client', - 'name' : 'Start Point Of Sale', + 'name' : _('Start Point Of Sale'), 'tag' : 'pos.ui', 'context' : context } @@ -60,12 +64,6 @@ class pos_session_opening(osv.osv_memory): } def on_change_config(self, cr, uid, ids, config_id, context=None): - states = { - 'opening_control': _('Opening Control'), - 'opened': _('In Progress'), - 'closing_control': _('Closing Control'), - 'closed': _('Closed & Posted'), - } result = { 'pos_session_id': False, 'pos_state': False @@ -78,7 +76,7 @@ class pos_session_opening(osv.osv_memory): ('config_id', '=', config_id), ], context=context) if session_ids: - result['pos_state'] = states.get(proxy.browse(cr, uid, session_ids[0], context=context).state, False) + result['pos_state'] = proxy.browse(cr, uid, session_ids[0], context=context).state result['pos_session_id'] = session_ids[0] return {'value' : result} @@ -93,7 +91,11 @@ class pos_session_opening(osv.osv_memory): if not result: r = self.pool.get('pos.config').search(cr, uid, [], context=context) result = r and r[0] or False + + count = self.pool.get('pos.config').search_count(cr, uid, [('state', '=', 'active')], context=context) + show_config = bool(count > 1) return { - 'pos_config_id' : result + 'pos_config_id' : result, + 'show_config' : show_config, } pos_session_opening() diff --git a/addons/point_of_sale/wizard/pos_session_opening.xml b/addons/point_of_sale/wizard/pos_session_opening.xml index 8711aa5e5fb..948f1db8c61 100644 --- a/addons/point_of_sale/wizard/pos_session_opening.xml +++ b/addons/point_of_sale/wizard/pos_session_opening.xml @@ -6,8 +6,9 @@ pos.session.opening
    - - + + + From 47175ac608ff67d70a72a68bb817caf4e7326735 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Aug 2012 17:43:43 +0200 Subject: [PATCH 109/132] [IMP] changed partners view to work correctly with linkedin module (still need improvements in the web client to support preview_image) bzr revid: nicolas.vanhoren@openerp.com-20120821154343-iv42z1ztvjkowp2e --- openerp/addons/base/res/res_partner_view.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/openerp/addons/base/res/res_partner_view.xml b/openerp/addons/base/res/res_partner_view.xml index 43a37d1a79c..e3614ad9b97 100644 --- a/openerp/addons/base/res/res_partner_view.xml +++ b/openerp/addons/base/res/res_partner_view.xml @@ -95,7 +95,7 @@ - +